Top

NSD NOSQL DAY03

  1. 案例1:redis主从复制
  2. 案例2:配置带验证的主从复制
  3. 案例3:哨兵服务
  4. 案例2 :使用RDB文件恢复数据
  5. 案例5 :使用AOF文件恢复数据
  6. 案例6:string 字符串
  7. 案例7:list 列表
  8. 案例8:hash表

1 案例1:redis主从复制

1.1 问题

具体要求如下:

1.2 方案

部署redis一主一从复制结构,主机角色,如图-1所示:

图-1

1.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:将主机192.168.4.51配置为主服务器

1) 每台redis服务器,默认都是主服务器;所以主服务器不需要配置。

  1. [root@redisA ~]# redis-cli -h 192.168.4.51 –p 6351
  2. 192.168.4.51:6351> info replication        //查看复制信息
  3. # Replication
  4. role:master            //是master 服务器
  5. connected_slaves:0 //从服务器个数零台
  6. master_replid:eaa14478158a71c41f947eaea036658c2087e8f2
  7. master_replid2:0000000000000000000000000000000000000000
  8. master_repl_offset:0
  9. second_repl_offset:-1
  10. repl_backlog_active:0
  11. repl_backlog_size:1048576
  12. repl_backlog_first_byte_offset:0
  13. repl_backlog_histlen:0
  14. 192.168.4.51:6351>

步骤二:将主机192.168.4.52配置为192.168.4.51的从服务器

1)命令行配置(马上生效)

  1. [root@redisB ~]# redis-cli -h 192.168.4.52 –p 6352    
  2. 192.168.4.52:6352> slaveof 192.168.4.51 6351 //指定主服务器ip地址与端口
  3. OK
  4. 192.168.4.52:6352> info replication //查看复制信息
  5. # Replication
  6. role:slave //从服务器
  7. master_host:192.168.4.51        //主服务器ip地址
  8. master_port:6351 //主服务器端口
  9. master_link_status:up //连接状态开启
  10. master_last_io_seconds_ago:3
  11. master_sync_in_progress:0

2)永久配置(重新redis服务后,依然有效)

  1. [root@redisB ~]# vim /etc/redis/6379.conf    
  2. slaveof 192.168.4.51 6351 //在文件末尾添加或在原有配置项上修改都可以
  3. :wq

3)在主服务器查看复制信息

  1. [root@redisA ~]# redis-cli -h 192.168.4.51 –p 6351
  2. 192.168.4.51:6351> info replication //查看复制信息
  3. # Replication
  4. role:master
  5. connected_slaves:1 //从服务器个数 1台
  6. slave0:ip=192.168.4.52,port=6352,state=online,offset=14,lag=1    //从服务器信息
  7. master_replid:db7932eb0ea4302bddbebd395efa174fb079319f
  8. master_replid2:0000000000000000000000000000000000000000
  9. master_repl_offset:14
  10. second_repl_offset:-1
  11. repl_backlog_active:1
  12. repl_backlog_size:1048576
  13. repl_backlog_first_byte_offset:1
  14. repl_backlog_histlen:14
  15. 192.168.4.51:6351>

步骤三:测试配置

1)客户端连接主服务器存储数据

  1. [root@client50 ~]# redis-cli -h 192.168.4.51 –p 6351    
  2. 192.168.4.51:6351> set x 9
  3. OK
  4. 192.168.4.51:6351> set y 8
  5. OK
  6. 192.168.4.51:6351> set z 7
  7. OK
  8. 192.168.4.51:6351>

2)在从服务器本机登录,查看数据(与主服务器数据一致)

  1. [root@redisB ~]#     redis-cli -h 192.168.4.52 –p 6352
  2. 192.168.4.52:6352> keys *
  3. 1)“x”
  4. 2)“y”
  5. 3)“z”
  6. 192.168.4.52:6352>

2 案例2:配置带验证的主从复制

2.1 问题

2.2 步骤

实现此案例需要按照如下步骤进行。

步骤一:设置主服务器192.168.4.51 设置连接密码123456

1) 修改主服务器的配置文件,设置密码。

  1. [root@redisA ~]# vim +501 /etc/redis/6379.conf
  2. requirepass 123456 //设置密码
  3. :wq
  4.  
  5. [root@redisA ~]# vim +43 /etc/init.d/redis_6379 //修改脚本
  6. $CLIEXEC -h 192.168.4.51 -p 6351 -a 123456 shutdown //添加密码
  7. :wq
  8. [root@redisA ~]# /etc/init.d/redis_6379 stop //停止服务
  9.  
  10. [root@redisA ~]# /etc/init.d/redis_6379 start //启动服务
  11. Starting Redis server...
  12. [root@redisA ~]#
  13. [root@redisA ~]# netstat -utnlp | grep :6351 //查看端口
  14. tcp 0 0 192.168.4.51:6351 0.0.0.0:* LISTEN 11523/redis-server

步骤二:配置从服务器192.168.4.52

1) 修改配置文件,设置主服务器连接密码。

  1. [root@redisB ~]# /etc/init.d/redis_6379 stop //停止服务
  2.  
  3. [root@redisB ~]# vim +289 /etc/redis/6379.conf
  4. masterauth 123456 //设置密码
  5. :wq
  6.  
  7. [root@redisA ~]# /etc/init.d/redis_6379 start //启动服务
  8. Starting Redis server...
  9. [root@redisA ~]#
  10. [root@redisA ~]# netstat -utnlp | grep :6351 //查看端口
  11. tcp 0 0 192.168.4.51:6351 0.0.0.0:* LISTEN 11523/redis-server

2) 在从服务器本机连接服务,查看复制信息

  1. [root@redisB ~]# redis-cli -h 192.168.4.52 –p 6352    
  2. 192.168.4.52:6352> info replication //查看复制信息
  3. # Replication
  4. role:slave //从服务器
  5. master_host:192.168.4.51        //主服务器ip地址
  6. master_port:6351 //主服务器端口
  7. master_link_status:up //连接状态开启
  8. master_last_io_seconds_ago:3
  9. master_sync_in_progress:0
  10. ……
  11. ……
  12. 192.168.4.52:6352>

3 案例3:哨兵服务

3.1 问题

3.2 方案

角色规划如图-1所示:

图-1

3.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:配置哨兵服务(192.168.4.57)

1) 安装源码软件redis ,无需做初始化配置。

  1. [root@redis57 redis]# yum -y install gcc
  2. [root@redis57 redis]# tar -zxf redis-4.0.8.tar.gz
  3. [root@redis57 redis]# cd redis-4.0.8/
  4. [root@redis1 redis-4.0.8]# make
  5. [root@redis1 redis-4.0.8]# make install

2)编辑主配置文件

  1. [root@redis57 redis]# vim /etc/sentinel.conf //创建主配置文件
  2. sentinel monitor server51 192.168.4.51 6351 1 //监视主服务器
  3. bind 0.0.0.0 //哨兵服务地址(表示本机所有网络接口)
  4. sentinel auth-pass server51 123456 //主服务器密码
  5. :wq

3)启动哨兵服务

  1. [root@redis57 redis]# redis-sentinel /etc/sentinel.conf    //启动哨兵服务
  2. 25371:X 28 Sep 11:16:54.993 # +sdown master redis51 192.168.4.51 6351
  3. 25371:X 28 Sep 11:16:54.993 # +odown master redis51 192.168.4.51 6351 #quorum 1/1
  4. 25371:X 28 Sep 11:16:54.993 # +new-epoch 3
  5. 25371:X 28 Sep 11:16:54.993 # +try-failover master redis51 192.168.4.51 6351
  6. 25371:X 28 Sep 11:16:54.994 # +vote-for-leader be035801d4d48eb63d8420a72796f52fc5cec047 3
  7. ...
  8. 25371:X 28 Sep 11:16:55.287 * +slave slave 192.168.4.51:6351 192.168.4.51 6351 @ redis51 192.168.4.52 6351
  9. 25371:X 28 Sep 11:17:25.316 # +sdown slave 192.168.4.51:6379 192.168.4.51 6379 @ redis51 192.168.4.52 6352

步骤二:测试配置

1)停止主服务器51的redis服务

  1. [root@redisA ~]#     /etc/init.d/redis_6379 stop
  2. Stopping ...
  3. Waiting for Redis to shutdown ...
  4. Redis stopped
  5. [root@redisA ~]#

2)在服务器52主机,查看复制信息

  1. [root@redisB ~]# redis-cli -h 192.168.4.52 -p 6352
  2. 192.168.4.52:6352> info replication
  3. # Replication
  4. role:master //角色是master
  5. connected_slaves:0
  6. ……
  7. ……

4 案例2 :使用RDB文件恢复数据

4.1 问题

4.2 步骤

实现此案例需要按照如下步骤进行。

步骤一:使用RDB文件恢复数据

RDB介绍:

Redis数据库文件,全称Reids DataBase

数据持久化方式之一

在指定时间间隔内,将内存中的数据集快照写入硬盘

术语叫Snapshot快照

恢复时,将快照文件直接读到内存里

相关配置参数

文件名

dbfilename “dump.rdb” 文件名

数据从内存保存到硬盘的频率

save 900 1 900秒内且有1个key改变

save 300 10 300秒内且有10个key改变

save 60 10000 60秒内且有10000个key改变

  1. [root@redisA ~]# vim /etc/redis/6379.conf
  2. dbfilename dump.rdb
  3. save 900 1        
  4. #save 300 10 //注释原有设置
  5. save 120 10 //时间修改为 120秒
  6. save 60 10000
  7. :wq
  8.  
  9. [root@redisA ~]#     /etc/init.d/redis_6379 stop //停止服务
  10. Stopping ...
  11. Waiting for Redis to shutdown ...
  12. Redis stopped
  13. [root@redisA ~]#
  14.  
  15. [root@redisA ~]# rm –rf /var/lib/redis/6379/* //清空数据库目录
  16. [root@redisA ~]# /etc/init.d/redis_6379 start //启动服务
  17. Starting Redis server...
  18. [root@redisA ~]#
  19.  
  20. [root@redisA ~]# ls /var/lib/redis/6379 //此时,查看数据库目录下没有dump.rdb文件
  21. [root@redisA ~]#
  22.  
  23.  
  24. [root@redisA ~]# redis-cli -h 192.168.4.51 -p 6351 -a 123456 //连接服务,在200秒内存储10个变量,就会自动在数据库目录下创建dump.rdb 文件
  25. 192.168.4.51:6351> set v1 k1
  26. OK
  27. 192.168.4.51:6351> set v2 k1
  28. OK
  29. 192.168.4.51:6351> set v3 k1
  30. OK
  31. 192.168.4.51:6351> set v4 k1
  32. OK
  33. 192.168.4.51:6351> set v45 k1
  34. OK
  35. 192.168.4.51:6351> set v46 k1
  36. OK
  37. 192.168.4.51:6351> set v7 k1
  38. OK
  39. 192.168.4.51:6351> set v8 k1
  40. OK
  41. 192.168.4.51:6351> set v9 k1
  42. OK
  43. 192.168.4.51:6351> set v10 k1
  44. OK
  45. 192.168.4.51:6351> keys *
  46. 1) "v2"
  47. 2) "v9"
  48. 3) "v10"
  49. 4) "v45"
  50. 5) "v4"
  51. 6) "v1"
  52. 7) "v46"
  53. 8) "v8"
  54. 9) "v7"
  55. 10) "v3"
  56. 192.168.4.51:6351>exit
  57.  
  58. [root@redisA ~]# ls /var/lib/redis/6379 //此时,查看数据库目录下有dump.rdb文件
  59. dump.rdb
  60. [root@redisA ~]#

备份数据

  1. [root@redisA ~]# cd /var/lib/redis/6379/
  2. [root@redisA 6379]# ls
  3. dump.rdb
  4. [root@redisA 6379]# cp dump.rdb /tmp/dump.rdb    //备份dump.rdb文件
  5. [root@redisA 6379]# scp /tmp/dump.rdb root@192.168.4.56:/root/ //传递备份文件给目标主机

删除数据 (56主机模拟误删除数据)

  1. [root@redis56 ~]# redis-cli -h 192.168.4.56 –p 6356        //连接服务
  2. 192.168.4.56:6356> flushall
  3. OK
  4. 192.168.4.51:6379> keys *        //已经没有数据
  5. (empty list or set)
  6. 192.168.4.56:6356> exit
  7. [root@redis56 ~]#

恢复数据(56主机使用备份文件恢复数据)

  1. [root@redis56 ~]# /etc/init.d/redis_6379 stop //停止服务
  2. Stopping ...
  3. Waiting for Redis to shutdown ...
  4. Redis stopped
  5. [root@redis56 ~]#
  6. [root@redis56 ~]# rm -rf /var/lib/redis/6379/* //清空数据库目录
  7. [root@redis56 ~]# cp /tmp/dump.rdb /var/lib/redis/6379/ //拷贝备份文件到数据库目录下
  8. [root@redis56 ~]# /etc/init.d/redis_6379 start //    启动服务
  9. Starting Redis server...
  10.  
  11. [root@redis56 ~]# redis-cli -h 192.168.4.56 –p 6356 //访问服务
  12. 192.168.4.56:6356> keys * //查看数据
  13. 1) "v7"
  14. 2) "v46"
  15. 3) "v45"
  16. 4) "v8"
  17. 5) "v4"
  18. 6) "v2"
  19. 7) "v1"
  20. 8) "v3"
  21. 9) "v9"
  22. 10) "v10"
  23. 192.168.4.56:6356>

5 案例5 :使用AOF文件恢复数据

5.1 问题

5.2 步骤

实现此案例需要按照如下步骤进行。

步骤一:使用AOF文件恢复数据

1)修改配置文件

  1. [root@redisA ~]# redis-cli -h 192.168.4.51 –p 6351 -a 123456 //连接服务
  2. 192.168.4.51:6351>config set appendonly yes     //启用aof,默认no
  3. 192.168.4.51:6351> config rewrite //写进配置文件
  4. 192.168.4.51:6351> save
  5. 192.168.4.51:6351> exit
  6.  
  7. [root@redisA ~]# ls /var/lib/redis/6379/ //会出现appendonly.aof文件
  8. appendonly.aof dump.rdb
  9. [root@redisA ~ ]#

2)备份AOF文件

  1. [root@redisA ~]# cd /var/lib/redis/6379/
  2. [root@redisA 6379]# cp appendonly.aof /tmp/appendonly.aof
  3. [root@redisA 6379]# scp /tmp/appendonly.aof root@192.168.4.57:/root/ //传递备份文件给目标主机

3)删除数据(在57主机 默认数据误删除)

  1. [root@redis57 ~]# redis-cli -h 192.168.4.57 -p 6357 //连接服务
  2. 192.168.4.57:6357> flushall //清除数据
  3. OK
  4. 192.168.4.57:6357> keys * //查看数据
  5. (empty list or set)
  6. 192.168.4.57:6357> exit
  7. [root@redis57 ~ ]#

4) 使用AOF文件恢复数据

  1. [root@redis57 ~]# vim +673 /etc/redis/6379.conf
  2. appendonly yes //启用AOF
  3. :wq
  4. [root@redis57 ~]#
  5. [root@redis57 ~]# /etc/init.d/redis_6379 stop //停止服务
  6. Stopping ...
  7. Waiting for Redis to shutdown ...
  8. Redis stopped
  9. [root@redis57 ~]#
  10. [root@redis57 ~]# /etc/init.d/redis_6379 start //启动服务
  11. Starting Redis server...
  12. [root@redis57 ~]#
  13. [root@redis57 ~]# rm -rf /var/lib/redis/6379/* //删除没有数据的文件
  14. [root@redis57 ~]# cp /root/appendolny.aof /var/lib/redis/6379/ //拷贝文件
  15. [root@redis57 ~]# /etc/init.d/redis_6379 start //启动服务
  16. Starting Redis server...
  17. [root@redis57 ~]# redis-cli -h 192.168.4.57 -p 6357 //连接服务
  18. 192.168.4.57:6357> keys * //查看数据
  19. 1) "v9"
  20. 2) "v5"
  21. 3) "v8"
  22. 4) "v2"
  23. 5) "v1"
  24. 6) "v4"
  25. 7) "v10"
  26. 8) "v6"
  27. 9) "v7"
  28. 10) "v3"
  29. 192.168.4.57:6357>

6 案例6:string 字符串

6.1 问题

6.2 步骤

实现此案例需要按照如下步骤进行。

步骤一:string 字符串

设置key及值,过期时间可以使用秒或毫秒为单位

setrange key offset value

  1. 192.168.4.56:6356> set x 9 ex 10 //单位秒
  2. OK
  3. 192.168.4.56:6356>
  4. 192.168.4.56:6356> set y 29 px 10 //单位毫秒
  5. OK
  6. 192.168.4.56:6356>
  7. 192.168.4.56:6356> set y 39 NX //不存在赋值
  8. OK
  9. 192.168.4.56:6356> get y //变量值没变
  10. "39"
  11. 192.168.4.56:6356>
  12. 192.168.4.56:6356> set y 49 xx //变量存在赋值
  13. OK
  14. 192.168.4.56:6356> get y //变量变了
  15. "49"
  16. 192.168.4.56:6356>

2) 从偏移量开始复写key的特定位的值

  1. 192.168.4.51:6351> set first "hello world"
  2. OK
  3. 192.168.4.51:6351> setrange first 6 "Redis"     //改写为hello Redis
  4. (integer) 11
  5. 192.168.4.51:6351> get first
  6. "hello Redis"

3) strlen key,统计字串长度

  1. 192.168.4.51:6379> strlen first
  2. (integer) 11

4) append key value 存在则追加,不存在则创建key及value,返回key长度

  1. 192.168.4.51:6379> append myname jacob
  2. (integer) 5

5) setbit key offset value 对key所存储字串,设置或清除特定偏移量上的位(bit),value值可以为1或0,offset为0~2^32之间,key不存在,则创建新key

  1. 192.168.4.51:6379> setbit bit 0 1         //设置bit第0位为1
  2. (integer) 0
  3. 192.168.4.51:6379> setbit bit 1 0         //设置bit第1位为0
  4. (integer) 0

6) bitcount key 统计字串中被设置为1的比特位数量

  1. 192.168.4.51:6379> setbit bits 0 1        //0001
  2. (integer) 0
  3. 192.168.4.51:6379> setbit bits 3 1        //1001
  4. (integer) 0
  5. 192.168.4.51:6379> bitcount bits            //结果为2
  6. (integer) 2

记录网站用户上线频率,如用户A上线了多少天等类似的数据,如用户在某天上线,则使用setbit,以用户名为key,将网站上线日为offset,并在该offset上设置1,最后计算用户总上线次数时,使用bitcount用户名即可,这样即使网站运行10年,每个用户仅占用10*365比特位即456字节

  1. 192.168.4.51:6379> setbit peter 100 1        //网站上线100天用户登录了一次
  2. (integer) 0
  3. 192.168.4.51:6379> setbit peter 105 1        //网站上线105天用户登录了一次
  4. (integer) 0
  5. 192.168.4.51:6379> bitcount peter
  6. (integer) 2

7) decr key 将key中的值减1,key不存在则先初始化为0,再减1

  1. 192.168.4.51:6379> set z 10
  2. OK
  3. 192.168.4.51:6379> decr z
  4. (integer) 9
  5. 192.168.4.51:6379> decr z
  6. (integer) 8
  7.  
  8.  
  9. 192.168.4.51:6379> decr bb
  10. (integer) -1
  11. 192.168.4.51:6379> decr bb
  12. (integer) -2

8) decrby key decrement 将key中的值,减去decrement

  1. 192.168.4.51:6379> set count 100
  2. OK
  3. 192.168.4.51:6379> DECRBY cc 20    //定义每次减少20(步长)
  4. (integer) -20
  5. 192.168.4.51:6379> DECRBY cc 20
  6. (integer) -40

9) getrange key start end 返回字串值中的子字串,截取范围为start和end,负数偏移量表示从末尾开始计数,-1表示最后一个字符,-2表示倒数第二个字符

  1. 192.168.4.51:6379> set x 123456789
  2. OK
  3. 192.168.4.51:6379> getrange x -5 -1
  4. "56789"
  5. 192.168.4.51:6379> getrange x 0 4
  6. "12345"

10) incr key 将key的值加1,如果key不存在,则初始为0后再加1,主要应用为计数器

  1. 192.168.4.51:6379> set page 20
  2. OK
  3. 192.168.4.51:6379> incr page
  4. (integer) 21

11) incrby key increment 将key的值增加increment

  1. 192.168.4.51:6379> set x 10
  2. OK
  3. 192.168.4.51:6379> incr x
  4. (integer) 11
  5. 192.168.4.51:6379> incr x
  6. (integer) 12

12) incrbyfloat key increment 为key中所储存的值加上浮点数增量 increment

  1. 192.168.4.51:6379> set num 16.1
  2. OK
  3. 192.168.4.51:6379> incrbyfloat num 1.1
  4. "17.2"

7 案例7:list 列表

7.1 问题

7.2 步骤

实现此案例需要按照如下步骤进行。

步骤一:list 列表

1) lpush key value [value…] 将一个或多个值value插入到列表key的表头,Key不存在,则创建key

  1. 192.168.4.51:6379> lpush list a b c        //list值依次为c b a
  2. (integer) 3

2) lrange key start stop 从开始位置读取key的值到stop结束

  1. 192.168.4.51:6379> lrange list 0 2        //从0位开始,读到2位为止
  2. 1) "c"
  3. 2) "b"
  4. 3) "a"
  5. 192.168.4.51:6379> lrange list 0 -1    //从开始读到结束为止
  6. 1) "c"
  7. 2) "b"
  8. 3) "a"
  9. 192.168.4.51:6379> lrange list 0 -2        //从开始读到倒数第2位值
  10. 1) "c"
  11. 2) "b"

3) lpop key 移除并返回列表头元素数据,key不存在则返回nil

  1. 192.168.4.51:6379> lpop list        //删除表头元素,可以多次执行
  2. "c"
  3. 192.168.4.51:6379> LPOP list
  4. "b"

4) llen key 返回列表key的长度

  1. 192.168.4.51:6379> llen list
  2. (integer) 1

5) lindex key index 返回列表中第index个值

  1. 192.168.4.51:6379> lindex list 1
  2. "c"

6) lset key index value 将key中index位置的值修改为value

  1. 192.168.4.51:6379> lpush list a b c d
  2. (integer) 5
  3. 192.168.4.51:6379> lset list 3 test        //将list中第3个值修改为test
  4. OK

7) rpush key value [value…] 将value插入到key的末尾

  1. 192.168.4.51:6379> rpush list3 a b c    //list3值为a b c
  2. (integer) 3
  3. 192.168.4.51:6379> rpush list3 d    //末尾插入d
  4. (integer) 4

8) rpop key 删除并返回key末尾的值

  1. 192.168.4.51:6379> RPOP list3
  2. "d"

8 案例8:hash表

8.1 问题

8.2 步骤

实现此案例需要按照如下步骤进行。

步骤一:hash表

1)hset key field value 将hash表中field值设置为value

  1. 192.168.4.51:6379> hset site google 'www.g.cn'
  2. (integer) 1
  3. 192.168.4.51:6379> hset site baidu 'www.baidu.com'
  4. (integer) 1

2) hget key filed 获取hash表中field的值

  1. 192.168.4.51:6379> hget site google
  2. "www.g.cn"

3) hmset key field value [field value…] 同时给hash表中的多个field赋值

  1. 192.168.4.51:6379> hmset site google www.g.cn baidu www.baidu.com
  2. OK

4) hmget key field [field…] 返回hash表中多个field的值

  1. 192.168.4.51:6379> hmget site google baidu
  2. 1) "www.g.cn"
  3. 2) "www.baidu.com"

5) hkeys key 返回hash表中所有field名称

  1. 192.168.4.51:6379> hmset site google www.g.cn baidu www.baidu.com
  2. OK
  3. 192.168.4.51:6379> hkeys site
  4. 1) "google"
  5. 2) "baidu"

6) hgetall key 返回hash表中所有key名和对应的值列表

  1. 192.168.4.51:6379> hgetall site
  2. 1) "google"
  3. 2) "www.g.cn"
  4. 3) "baidu"
  5. 4) "www.baidu.com"

7) hvals key 返回hash表中所有key的值

  1. 192.168.4.51:6379> hvals site
  2. 1) "www.g.cn"
  3. 2) "www.baidu.com"

8) hdel key field [field…] 删除hash表中多个field的值,不存在则忽略

  1. 192.168.4.51:6379> hdel site google baidu
  2. (integer) 2