一.熟练安装Redis
[ root@redis-1 ~]
[ Redis]
name = Redis
baseurl = http://packages.redis.io/rpm/rhel7
enabled = 1
gpgcheck = 0
[ root@redis-1 ~]
[ root@redis-1 ~]
[ root@redis-1 ~]
[ root@redis-1 ~]
[ root@redis-1 ~]
[ root@redis-2 ~]
[ root@redis-2 src]
[ root@redis-2 src]
[ root@redis-2 src]
[ root@redis-2 redis-7.2.0]
[ root@redis-2 redis-7.2.0]
总用量 12012
-rwxr-xr-x 1 root root 1072656 9 月 5 07:08 redis-benchmark
lrwxrwxrwx 1 root root 12 9 月 5 07:08 redis-check-aof -> redis-server
lrwxrwxrwx 1 root root 12 9 月 5 07:08 redis-check-rdb -> redis-server
-rwxr-xr-x 1 root root 1790704 9 月 5 07:08 redis-cli
lrwxrwxrwx 1 root root 12 9 月 5 07:08 redis-sentinel -> redis-server
-rwxr-xr-x 1 root root 9429048 9 月 5 07:08 redis-server
[ root@redis-2 redis-7.2.0]
[ root@redis-2 redis]
[ root@redis-2 redis]
[ root@redis-2 redis]
二.掌握Redis的常见数据类型的使用
字符串string
172.18 .10.136:6379 > set k1 v1
OK
172.18 .10.136:6379 > get k1
"v1"
172.18 .10.136:6379 > TYPE k1
string
172.18 .10.136:6379 > set name1 zxw1 ex 10
OK
172.18 .10.136:6379 > get name1
"zxw1"
172.18 .10.136:6379 > ttl name1
( integer) 5
172.18 .10.136:6379 > keys *
1 ) "k1"
172.18 .10.136:6379 > del k1
172.18 .10.136:6379 > mset k1 v1 k2 v2 k3 v3
OK
172.18 .10.136:6379 > mget k1 k2 k3
1 ) "v1"
2 ) "v2"
3 ) "v3"
172.18 .10.136:6379 > del k1 k2 k3
172.18 .10.136:6379 > set k1 v1
OK
172.18 .10.136:6379 > append k1 vvvvvvvvv
( integer) 11
172.18 .10.136:6379 > get k1
"v1vvvvvvvvv"
172.18 .10.136:6379 > set n1 10
OK
172.18 .10.136:6379 > incr n1
( integer) 11
172.18 .10.136:6379 > get n1
172.18 .10.136:6379 > DECR n1
( integer) 10
172.18 .10.136:6379 > get n1
"10"
172.18 .10.136:6379 > strlen k1
( integer) 11
172.18 .10.136:6379 > get k1
"v1vvvvvvvvv"
172.18 .10.136:6379 > exists k1
( integer) 1
172.18 .10.136:6379 > exists k2
( integer) 0
172.18 .10.136:6379 > ttl k1
( integer) -1
172.18 .10.136:6379 > set mykey myvalue ex 100
OK
172.18 .10.136:6379 > ttl mykey
( integer) 95
172.18 .10.136:6379 > PERSIST mykey
( integer) 1
172.18 .10.136:6379 > ttl mykey
( integer) -1
172.18 .10.136:6379 >
172.18 .10.136:6379 > EXPIRE mykey 6666
( integer) 1
172.18 .10.136:6379 > ttl mykey
( integer) 6663
列表list
172.18 .10.136:6379[ 1 ] > lpush list1 aaa bbb ccc ddd
( integer) 4
172.18 .10.136:6379[ 1 ] > type list1
list
172.18 .10.136:6379[ 1 ] > lpush list1 eee
( integer) 5
172.18 .10.136:6379[ 1 ] > lpush list1 fff
( integer) 6
172.18 .10.136:6379[ 1 ] > rpop list1
"aaa"
172.18 .10.136:6379[ 1 ] > lpop list1
172.18 .10.136:6379[ 1 ] > lrange list1 1 2
1 ) "ccc"
2 ) "bbb"
172.18 .10.136:6379[ 1 ] > lrange list1 0 2
1 ) "ddd"
2 ) "ccc"
3 ) "bbb"
172.18 .10.136:6379[ 1 ] > lrange list1 1 1
1 ) "ccc"
set string类型无序集合
172.18 .10.136:6379 > sadd set1 v1
( integer) 1
172.18 .10.136:6379 > sadd set1 v1 v4
( integer) 1
172.18 .10.136:6379 > type set1
set
172.18 .10.136:6379 > sadd set2 v1 v4
( integer) 2
172.18 .10.136:6379 > type set2
set
172.18 .10.136:6379 > smembers set1
1 ) "v1"
2 ) "v4"
172.18 .10.136:6379 > sadd set1 v2 v3
( integer) 2
172.18 .10.136:6379 > sdiff set1 set2
1 ) "v2"
2 ) "v3"
172.18 .10.136:6379 > sinter set1 set2
1 ) "v1"
2 ) "v4"
172.18 .10.136:6379 > sunion set1 set2
1 ) "v1"
2 ) "v4"
3 ) "v2"
4 ) "v3"
sorted set(有序集合)
172.18 .10.136:6379 > zadd zset1 1 v1
( integer) 1
172.18 .10.136:6379 > zadd zset1 2 v2
( integer) 1
172.18 .10.136:6379 > zadd zset1 2 v3
( integer) 1
172.18 .10.136:6379 > zadd zset1 3 v4
( integer) 1
172.18 .10.136:6379 > type zset1
zset
172.18 .10.136:6379 > zadd zset2 1 v1 2 v2 3 v3 4 v4 5 v5
( integer) 5
172.18 .10.136:6379 > zcard zset1
( integer) 4
172.18 .10.136:6379 > zcard zset2
( integer) 5
172.18 .10.136:6379 > zrange zset1 1 3
1 ) "v2"
2 ) "v3"
3 ) "v4"
172.18 .10.136:6379 > zrange zset1 0 1
1 ) "v1"
2 ) "v2"
172.18 .10.136:6379 > zrank zset1 v1
( integer) 0
172.18 .10.136:6379 > zrank zset1 v3
( integer) 2
172.18 .10.136:6379 > ZADD paihangbang 90 nezha 199 zhanlang 60 zhuluoji 30 gangtiexia 99 fengshenbang
( integer) 5
172.18 .10.136:6379 > zrange paihangbang 0 -1
1 ) "gangtiexia"
2 ) "zhuluoji"
3 ) "nezha"
4 ) "fengshenbang"
5 ) "zhanlang"
172.18 .10.136:6379 > zrevrange paihangbang 0 -1 withscores
1 ) "zhanlang"
2 ) "199"
3 ) "fengshenbang"
4 ) "99"
5 ) "nezha"
6 ) "90"
7 ) "zhuluoji"
8 ) "60"
9 ) "gangtiexia"
10 ) "30"
哈希(hash)
172.18 .10.136:6379 > hset hash1 name zxw age 20 sex nan
( integer) 3
172.18 .10.136:6379 > type hash1
hash
172.18 .10.136:6379 > hget hash1 name
"zxw"
172.18 .10.136:6379 > hget hash1 age
"20"
172.18 .10.136:6379 > hdel hash1 sex
( integer) 1
172.18 .10.136:6379 > hmset hash1 name age
OK
172.18 .10.136:6379 > hmset hash1 name tom age 20
OK
172.18 .10.136:6379 > hkeys hash1
1 ) "name"
2 ) "age"
172.18 .10.136:6379 > hmget hash1 name age
1 ) "tom"
2 ) "20"
172.18 .10.136:6379 > hgetall hash1
1 ) "name"
2 ) "tom"
3 ) "age"
4 ) "20"
三.掌握redis.conf的基本配置
redis-7.2.0.conf
四.了解Redis的RDB快照及AOF机制
save 3600 1
save 300 100
save 60 10000
save 5 1
stop-writes-on-bgsave-error no
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
rdb-del-sync-files no
dir /apps/redis/data/
[ root@redis-2 redis]
172.18 .10.136:6379 > bgsave
Background saving started
172.18 .10.136:6379 > lastsave
( integer) 1694084007
[ root@redis-2 redis]
总用量 0
[ root@redis-2 ~]
NUM = ` seq 1 1000 `
for i in ${NUM} ; do
redis-cli -h 127.0 .0.1 -a 123 set key-${i} value-${i}
echo "key-${i} value-${i} 写入完成"
done
echo "十万个key写入到Redis完成"
[ root@redis-2 ~]
[ root@redis-2 ~]
172.18 .10.136:6379 > keys *
[ root@redis-2 ~]
总用量 20
-rw-r--r-- 1 root root 18917 9 月 8 05:05 dump.rdb
[ root@redis-2 ~]
[ root@redis-2 ~]
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
172.18 .10.136:6379 > flushdb
OK
172.18 .10.136:6379 > keys *
( empty array)
[ root@redis-2 ~]
[ root@redis-2 ~]
dir /apps/redis/data/
appendonly yes
appendfilename "appendonly.aof"
appenddirname "appendonlydir"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble no
aof-timestamp-enabled no
[ root@redis-2 ~]
NUM = ` seq 1 5000 `
for i in ${NUM} ; do
redis-cli -h 127.0 .0.1 -a 123 set key-${i} value-${i}
echo "key-${i} value-${i} 写入完成"
done
echo "十万个key写入到Redis完成"
[ root@redis-2 ~]
127.0 .0.1:6379 > keys *
[ root@redis-2 data]
[ root@redis-2 data]
[ root@redis-2 data]
127.0 .0.1:6379 > FLUSHALL
[ root@redis-2 data]
[ root@redis-2 data]
[ root@redis-2 data]
[ root@redis-2 data]
aof-use-rdb-preamble no
总结
1、RDB持久化
优点:
RDB快照保存了某个时间点的数据,可以通过脚本执行bgsave(非阻塞)或者save(阻塞)命令自定义时间点备份,可以保留多个备份,当出现问题可以恢复到不同时间点的版本。
可以最大化IO 的性能,因为父进程在保存RDB 文件的时候唯一要做的是fork出一个子进程,然后的-操作都会有这个子进程操作,父进程无需任何的IO操作
RDB在大量数据比如几个G的数据,恢复的速度比AOF的快
缺点:
不能时时的保存数据,会丢失自上一次执行RDB备份到当前的内存数据
数据量非常大的时候,从父进程fork的时候需要一点时间,可能是毫秒或者秒或者分钟,取决于磁盘IO性能
2、aof持久化
AOF:按照操作顺序依次将操作添加到指定的日志文件当中,特点是数据安全性相对较高,缺点是即使有些操作是重复的也会全部记录。
AOF和RDB一样使用了写时复制机制,AOF默认为每秒钟fsync一次,即将执行的命令保存到AOF文件当中,这样即使redis服务器发生故障的话顶多也就丢失1秒钟之内的数据,也可以设置不同的fsync策略,或者设置每次执行命令的时候执行fsync,fsync会在后台执行线程,所以主线程可以继续处理用户的正常请求而不受到写入AOF文件的IO影响。
AOF模式优缺点:
AOF的文件大小要大于RDB格式的文件
根据所使用的fsync策略(fsync是同步内存中redis所有已经修改的文件到存储设备),默认是appendfsync everysec即每秒执行一次fsync。
3、混合持久化
混合模式的执行过程:
RDB-AOF混合持久化体现在aofrewrite时,先以RDB格式来保存全量数据,即Redis 会先把当前的内存数据以RDB方式写入到AOF文件,同时把当前的命令记录到重写缓冲区中,最后RDB完成后再把缓冲区中的命令以追加AOF的形式存在AOF文件中。
混合模式的优缺点:
优点:集成了AOF与RDB的优点,开头为 RDB 的格式,使得 Redis 可以更快的启动,同时结合 AOF的优点,有减低了大量数据丢失的风险。
缺点:文件可读性不直观,兼容性差,不能用在4.0之前的版本
五.掌握Redis ACL的基本使用
127.0 .0.1:6379 > ACL help
1 ) ACL < subcommand> arg arg .. . arg. Subcommands are:
2 ) LOAD
3 ) SAVE
4 ) LIST
5 ) USERS
6 ) SETUSER < username> [ attribs .. .]
7 ) GETUSER < username>
8 ) DELUSER < username> [ .. .]
9 ) CAT
10 ) CAT < category>
11 ) GENPASS [ < bits> ]
12 ) WHOAMI
ACL规则简介:
启用和禁用用户:
on:启用用户
off:禁用用户,已经创建好的TCP链接不会强制中断
允许或禁止访问某些Key:
~< pattern> :基于正则表达式匹配可以访问的key,例如~*和* allkeys 允许访问所有,~mykey和~Mykey是两个( key的名字区分大小写) 。
resetkeys:基于resetkeys指定只能访问的key,如: ~foo:* ~bar:* resetkeys ~objects:* ,则客户端只能访问匹配 object:* 模式的 KEY。
允许和禁止调用命令:
+< command> :将命令添加到用户可以调用的命令列表中,多个命令用空格隔开
-< command> :将命令从用户可以调用的命令列表中移除
+@< category> :允许用户调用 < category> 类别中的所有命令,有效类别为@admin,@set,@sortedset等( 使用命令acl cat查看) ,可通过调用ACL CAT命令查看完整列表,特殊类别@all表示所有命令,包括当前和未来版本中存在的所有命令
-@< category> :禁止用户调用< category> 类别中的所有命令
+< command>| subcommand:允许使用已禁用命令的特定子命令
allcommands等于+@al:包括当前存在的命令以及将来通过模块加载的所有命令
nocommands等于-@all:禁止调用所有命令
acl命令使用:
127.0 .0.1:6379 > ACL LIST
1 ) "user default on sanitize-payload #a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3 ~* &* +@all"
127.0 .0.1:6379 > acl setuser jack on ~* & * +@all > 123456
OK
127.0 .0.1:6379 > acl list
1 ) "user default on sanitize-payload #a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3 ~* &* +@all"
2 ) "user jack on sanitize-payload #8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 ~* &* +@all"
[ root@redis-2 redis]
127.0 .0.1:6379 > auth jack 123456
127.0 .0.1:6379 > acl setuser tom on ~* & * +get +set > 1234
OK
[ root@redis-2 redis]
127.0 .0.1:6379 > auth tom 1234
OK
127.0 .0.1:6379 > set tomk1 vvv1
OK
127.0 .0.1:6379 > get tomk1
"vvv1"
127.0 .0.1:6379 > del tomk1
( error) NOPERM User tom has no permissions to run the 'del' command
[ root@redis-2 redis]
user jack on ~* & * +@all > 123456
user tom on ~* & * +get +set > 123456
[ root@redis-2 redis]
user jack on ~* & * +@all > 123456
user tom on ~* & * +get +set > 123456
user tangtang on ~* & * +get +set > 123456
[ root@redis-2 redis]
aclfile /apps/redis/etc/users.acl
六.掌握基于redis-dump实现redis单机数据的迁移
gpg2 --keyserver keyserver.ubuntu.com --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
curl -sSL http://rvm.io/mpapis.asc | gpg2 --import -
curl -sSL http://rvm.io/pkuczynski.asc | gpg2 --import -
curl -L get.rvm.io | bash -s stable
source /etc/profile.d/rvm.sh
rvm requirements
rvm install 2.7 .6
rvm use 2.7 .6
rvm use 2.7 .6 --default
ruby -v
gem sources --add http://mirrors.tuna.tsinghua.edu.cn/rubygems/ --remove https://rubygems.org/
gem sources -l
bundle config mirror.https://rubygems.org http://mirrors.tuna.tsinghua.edu.cn/rubygems
gem update --system
gem update bundler
gem install redis-dump
redis-dump --help
[ root@redis-2 ~]
[ root@redis-2 ~]