[TOC]

0x00 Redis 命令

复习Redis的五种数据类型:String 、List、Hash、Set、Sorted-set

redis-cli 命令

Syntax & Argument:

1
2
3
4
5
6
7
8
9
-h ip : Redis-server 主机地址
-p Port : Redis-server 服务端口
-a Auth : 认证密码
-n [0-15] : Redis 数据库 db0~db15
-x : 读取STDIN的最后一个参数。
--raw : 对应答使用原始格式(当STDOUT不是tty时默认)。

# Command
keys # 指定key或者所有"*"key

1
2
3
4
5
6
7
8
9
10
11
12
13
# 1.查看指定db0序号的库中的所有key 
$ redis-cli -h 192.168.10.199 -a weiyigeek.top -n 0 keys "*"
# 1) "SEARCH:PROJECTSINFO_BY_PARENTID_LIST:95"
# 2) "ALLOW:SEARCH_BY_SFZH:test"
# 3) "SEARCH:PROJECTS_BY_ID:100"

Examples:
cat /etc/passwd | redis-cli -x set mypasswd
redis-cli get mypasswd
redis-cli -r 100 lpush mylist x
redis-cli -r 100 -i 1 info | grep used_memory_human:
redis-cli --eval myscript.lua key1 key2 , arg1 arg2 arg3
redis-cli --scan --pattern '*:12345*'


脚本示例

  • 1.Redis 数据库 db 迁移到其它Redis数据库指定 db 中
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $ redis-cli -h 192.168.10.199 -a weiyigeek.top -n 0 keys "*" | while read key
    do
    redis-cli -h 192.168.10.199 -a weiyigeek.top -n 0 --raw dump $key | perl -pe 'chomp if eof' | redis-cli -h 192.168.10.199 -a weiyigeek.top -n 12 -x restore $key 0
    done

    # - perl -pe 'chomp if eof' : 删除文件中最后一个换行符

    # 执行效果:
    $ redis-cli -h 192.168.10.199
    192.168.10.199:6379> AUTH weiyigeek.top
    OK
    192.168.10.199:6379> select 12
    OK
    192.168.10.199:6379[12]> DBSIZE
    (integer) 65
1) 内置命令
1
2
3
4
# [保存数据到磁盘]
save #RDB会阻塞redis服务器,直到完成持久化
bgsave #RDB会fork一个子进程,由子进程进行持久化。
bgrewriteaof #AOF手动重写

0x01 使用场景

描述:前面我们简单的了解了一下redis使用操作,这一部分我们主要来说说Redis的应用场景;

(1) 取最新N个数据操作
描述:比如一篇文章的评论只显示最新的5000千条评论的ID放在Redis的List集合之中,并将超出集合部分从数据库中获取;

1
2
3
4
#向List集合中插入值
LPUSH latest.comments ID
#保存最近5000千个ID值
LTRIM latest.comments 0 5000


(2) 排行榜应用TOP N操作
描述:此处需要按照次数进行排序,所以此时我们需要采用sorted set命令,将您需要排序的key名称以及其具体数据设置成相应的value,每次只需要执行ZADD命令即可;

(3) 需要精准设定过期时间应用
描述:可以将上面说到的sorted set的score值设置成为过期时间的时间戳,就可以通过过期时间排序以及定时清除过期数据;

(4) 计算器应用
描述:可以统计在线人数由于Redis命令是原子性的,您可以轻松利用INCR与DECR命令来构建计算器系统

(5) Uniq操作获取某段时间所有数据排重置
描述:将输入放入set集合即可,所有的数据将会自动排重;

(6) 实时系统,反垃圾系统

(7) Pub/Sub构建实时消息系统

(8) 构建队列系统
描述:可以使用list可以构建队列,使用sorted set 甚至可以构建有优先级的队列系统;


0x02 数据持久化

描述:Redis是将数据存储在内存之中所以其读写效率非常高,但是往往事物都不是那么美好,当由于某些不可抗力导致机器宕机、redis服务停止此时您在内存中的数据将完全丢失;
为了使Redis在重启后仍能保证数据不丢失我们就需要对其进行设置持久化存储,使其将内存的数据通过某种方式存入磁盘中,当Redis服务端重启后便会从该磁盘中进行读取数据进而恢复Redis中的数据;

Redis支持两种持久化方式:

  • (1) RDB 持久化(默认支持):该机制是指在指定的时间间隔内将内存中数据集写入到磁盘;
  • (2) AOF 持久化:该机制将以日志的形式记录服务器所处理的每一个写操作,同时在Redis服务器启动之初会读取该文件来重新构建数据库,以保证启动后数据库中的数据完整;
  • (3) 无持久化: 将Redis作为一个临时缓存,并将数据存放到memcached之中;

TIPS:

  • Redis可以同时使用RDB和AOF方式来保证,重启后Redis服务器中的数据完整;
1.RDB 方式

优势

  • 1) 该方式会将内存中的数据保存一个文件中默认dump.rdb,这对于文件备份而言是非常完美的,通过备份策略来保证数据的完整性,同时可以通过定时任务打包该数据文件就可以转移到其它存储介质;
  • 2) 性能最大化,Redis的服务进程在做持久化的时候,它将fork出子线程然后由它完成持久化工作,它可以极大的避免服务进程执行IO操作了;
  • 3) 相比较于AOF机制下如果数据集很大,RDB的启动效率就会更高

劣势

  • 1) 它保证了数据的持久化但是没法一定保证数据的高可用性(即最大限度的避免数据丢失),比如当在持久化数据之前出现宕机,那么此时没有来得及写入的数据将会被丢失;
  • 2) 由于RDB是通过Fork子进程来协助完成数据持久化工作的,因此当数据集较大的时候会导致整个服务器停止服务几百毫秒到1秒钟之间(可通过集群方式解决);

配置说明:
$vim redis.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
cat > redis.conf <<'EOF'
#密码认证
requirepass WeiyiGeek.top

#默认开启如果需要关闭把save ""取消注释即可
#save ""
#save 3600 1 #每3600秒至少有一个Key发生变化时候则dump内存快照
save 900 1 #900秒(15分钟)至少有1条key变化,其他同理
save 300 10
save 60 10000 #每60描述至少有1000个key发生变化时候则dump内存快照

#RDB 生成的文件名称
dbfilename dump.rdb
#保存存放路径
dir ./

#备份进程出错时,主进程停止接受写入操作,默认yes
stop-writes-on-bgsave-error yes
#是否压缩,会占用部分cpu资源,默认yes
rdbcompression yes
#RDB自动触发策略是否启用,默认为yes
rdb-save-incremental-fsync yes
EOF

实际案例:

1
2
3
4
5
6
7
8
9
10
#1.如上面配置所示,按配置情况触发
比如在Redis服务终止的时候执行

#2.手动保存数据连接redis后使用命令save、bgsave触发
127.0.0.1:6379> SAVE #save:会阻塞redis服务器,直到完成持久化
OK
127.0.0.1:6379> quit
[email protected]:/data# ls
dump.rdb
bgsave:会fork一个子进程,由子进程进行持久化。


2.AOF 方式

优势

  • 1) 该机制可以带来更高的数据安全性,即数据持久化; 常规三种同步策略即每秒同步(异步完成效率高)、每修改同步(同步插入修改删除操作效率最低)和不同步;
  • 2) 由于该机制对日志文件的写入操作采用的是append模式,即使过程中出现宕机也不会破坏日志文件中已经存在的内容,如果数据不完整在Redis下次启动之前可以通过redis-check-aof解决数据一致性问题;
  • 3) 如果日志文件体积过大可以启动rewrite机制,即redis以append模式不断的将修改数据写到老的磁盘文件中,同时创建新文件记录期间有哪些修改命令执行,此项极大的保证数据的安全性;
  • 4) AOF包含一个格式清晰、易于理解的日志文件用于记录所有的修改操作(可通过此文件完成数据的重构

劣势

  • 1) 对于相同数量的数据集而言AOF文件大于RDB文件;
  • 2) 根据同步策略的不同,AOF在运行效率上往往会慢于RDB,总的来说每秒同步策略的效率还是比较高的

配置说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
cat > redis.conf <<'EOF'
#是否开启AOF,默认为否
appendonly no

#AOF文件名字及路径,若RDB路径已设置这里可不设置
appendfilename "appendonly.aof"
dir ./

#AOF的3种模式,no(使用系统缓存处理,快)、always(记录全部操作,慢但比较安全)、everysec(每秒同步,折中方案,默认使用)
appendfsync everysec

#重写期间是否同步数据,默认为no
no-appendfsync-on-rewrite no

#自动触发重写的配置
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

#AOF重写策略是否启用,默认为yes
aof-rewrite-incremental-fsync yes

#加载AOF时如果报错则会继续但写入log,如果为no则不会继续
aof-load-truncated yes

#Redis5.0有的功能AOF重写及恢复可以使用RDB文件及AOF文件,速度更快,默认yes
aof-use-rdb-preamble yes
EOF

实际案例AOF重写:
因为AOF为记录每次的操作,会导致实际记录不多但文件过大,所以需要做重写操作

  • 1)AOF自动重写:按配置文件条件自动触发重写
  • 2)AOF手动重写:连接redis使用命令bgrewriteaof,进行手动重写
    1
    2
    127.0.0.1:6379> BGREWRITEAOF
    Background append only file rewriting started

0x03 功能使用配置

描述:小小功能,单个配置描述

密码认证

描述:Redis配置密码认证的几种方式总结:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#1.通过配置文件进行配置yum方式安装的redis配置文件通常在,修改后需要重启Redis
vim /etc/redis.conf
requirepass myRedis # myRedis 即认证密码

#2.通过命令行进行配置,此种方式的优点无需重启Redis
redis 127.0.0.1:6379[1]> config set requirepass my_redis
OK
redis 127.0.0.1:6379[1]> config get requirepass
1) "requirepass"
2) "my_redis"

#3.若master配置了密码则slave也要配置相应的密码参数否则无法进行正常复制的。
#slave中配置文件内找到如下行,移除注释,修改密码即可
masterauth masterpw

使用密码验证登陆Redis服务器:

1
2
3
4
5
6
7
#方式1:极其不推荐密码明文记录到系统命令执行历史中
redis-cli -h 127.0.0.1 -p 6379 -a myRedis

#方式2:交互式进行配置
redis-cli -h 127.0.0.1 -p 6379
redis 127.0.0.1:6379> auth myRedis
OK