redis
一、什么是redis
redis是开源,BSD许可,高级的key-value存储系统。可以用来存储字符串,哈希结构,链表,集合,因此常用来提供数据结构服务。
1.1 redis和memcache区别
- redis可以用来做存储,而memcache是用来做缓存(redis的持久化)
- 存储的数据有结构,对于memcache来说,存储的数据只有字符串,而redis则可以存储字符串,链表,哈希结构,集合,有序集合
二、安装
2.1 官网下载
建议下载stable版本
官网地址:http://redis.io
wget https://download.redis.io/releases/redis-6.2.6.tar.gz
2.2 解压安装
[root@vms27 ~]# tar xf redis-6.2.6.tar.gz [root@vms27 ~]# cd redis-6.2.6/ [root@vms27 ~]# make [root@vms27 redis-6.2.6]# make test cd src && make test make[1]: 进入目录“/root/redis-6.2.6/src” CC Makefile.dep make[1]: 离开目录“/root/redis-6.2.6/src” make[1]: 进入目录“/root/redis-6.2.6/src” You need tcl 8.5 or newer in order to run the Redis test make[1]: *** [test] 错误 1 make[1]: 离开目录“/root/redis-6.2.6/src” make: *** [test] 错误 2 [root@vms27 redis-6.2.6]# yum install -y tcl [root@vms27 redis-6.2.6]# make test [root@vms27 redis-6.2.6]# make prefix=/usr/local/redis install
2.3 安装后的执行命令在src目录下
src/redis-benchmark 性能测试 src/redis-check-aof 检查aof日志 src/redis-check-rdb 检查rdb日志 src/redis-cli 连接用的客户端 src/redis-server redis服务进程 redis.conf 配置文件 启动程序 [root@vms27 redis-6.2.6]# src/redis-server redis.conf 端口:6379
2.4 修改redis.conf
让redis以守护进程方式运行 [root@vms27 redis-6.2.6]# sed -i '/daemonize no/c daemonize yes' redis.conf [root@vms27 redis-6.2.6]# src/redis-server redis.conf
三、redis的常用命令及数据结构的操作
3.1 通过key操作
// 设置key 127.0.0.1:6379> set age 34 // 查看指定key值 127.0.0.1:6379> get age // 查看有多少key 支持正则匹配 127.0.0.1:6379> keys a* 127.0.0.1:6379> keys * // 随机获取key 127.0.0.1:6379> randomkey // 查看key类型 127.0.0.1:6379> type age // 判断key是否存在 127.0.0.1:6379> exists age 1表示存在,0表示不存在 // 删除指定key 127.0.0.1:6379> del age // 修改key名称 127.0.0.1:6379> rename key newkey 如果newkey存在则会覆盖newkey的值 // 修改key名称:如果newkey存在则执行不成功 127.0.0.1:6379> renamenx key newkey // 切换库 127.0.0.1:6379> select 1 redis默认为0号库,默认启动开启16个库为0~15在redis.conf的databases 16配置参数 // 移动key到指定库 127.0.0.1:6379> move key db // 设置key的有效期 127.0.0.1:6379[1]> expire key seconds // 查看指定key生命周期 127.0.0.1:6379[1]> ttl user n:剩余多少秒 -1:为永久 -2:不存在 // 修改指定key永久有效 127.0.0.1:6379[1]> persist key
3.2 字符串类型的操作
// 设置key 127.0.0.1:6379[1]> set name tome [EX seconds|PX milliseconds][NX|XX] EX seconds: 生命周期秒 PX milliseconds:生命周期 127.0.0.1:6379[1]> set name tom px 8000 NX key不存在才可以设置 XX key必须存在才可以进行操作 127.0.0.1:6379[1]> set name tom xx // 批量设置key 127.0.0.1:6379[1]> mset name tom age 24 sex boy // 设置字符串的偏移值 127.0.0.1:6379[1]> setrange name 2 i 原数据:tom 修改后toi 如果原位置没有数据则新增 // 追加内容 127.0.0.1:6379[1]> append name o // 根据偏移量获取指定范围数据 127.0.0.1:6379[1]> getrange name 0 2 // 获取之间的值指定新的值 127.0.0.1:6379[1]> getset name tom
四、位图法统计活跃用户
// 初始设置 127.0.0.1:6379[1]> setbit mon 10000 0 // 谁登录设置谁为1,如第4个人 127.0.0.1:6379[1]> SETBIT thu 3 1 // 判断这个人登录统计 127.0.0.1:6379[1]> bitop and res mon thu // 获取 127.0.0.1:6379[1]> getbit res
五、set结构及命令详解
六、事务及锁的应用
七、消息发布与订阅
八、持久化
主从:通过从服务器保持和持久化,如mongoDB的replication sets配置 日志:操作生成相关日志,并通过日志来恢复数据 couchDB对于数据内容,不修改,只追加,则文件本身就是日志,不会丢失数据
8.1 rdb快照
rdb工作原理: 每隔`N分钟或N次`写操作后, 从内存ducp数据形成rdb文件, `压缩`放在备份`目录` 注``内的部分可通过参数来配置 // 3600秒发生一次change则保存至硬盘 save 3600 1 // 300秒内发生100次change则保存至硬盘 save 300 100 // 60秒内发生10000次change则保存至硬盘 save 60 10000 // 以上选项注释后则不进行数据存储至硬盘 // rdb如果导出错误暂停写入 stop-writes-on-bgsave-error yes // 是否进行数据压缩 rdbcompression yes // 存储和加载rdb文件时校验 rdbchecksum yes // 设置rdb文件名 dbfilename dump.rdb // 设置工作目录 dir ./ rdb的缺陷 在2个保存点之间,断电,将会丢失1-N分钟的数据。 rdb工作原理 redis-server进程监控,如果达到自定义的触发条件则调用rdbdump持久化保存到硬盘
8.2 aof日志(append of file)
vim redis.conf // 是否打开aof日志功能 appendonly no // 每1个命令,都立即同步到aof安全,速度慢 appendfsync always // 折衷方案,每秒写1次 appendfsync everysec // 写入工作交给操作系统,由操作系统判断缓冲区大小统一写入aof同步频率低,速度快 appendfsync no // 正在导出rdb快照的过程中要不要停止同步aof no-appendfsync-on-rewrit yes // aof文件大小比旧城改造上次重写时的大小,增长率100%时,重写 即同一个Key反复修改则执行 auto-aof-rewrite-percentage 100 // aof文件至少超过64M时重写 auto0aof-rewrite-min-size 64mb // aof文件存储位置 appendfilename appendonly.aof 注:在dump rdb过程中,aof如果停止同步,会不会丢失? 答:不会,所有的操作缓存在内存的队列里,dump完成后,统一操作 注:aof重写指的是什么? 答: aof重写是指把内存中的数据,逆化成命令,写入到.aof日志里. 以解决 aof日志过大的问题 问: 如果rdb文件,和aof文件都存在,优先用谁来恢复数据? 答: aof 问: 2种是否可以同时用? 答: 可以,而且推荐这么做 问: 恢复时rdb和aof哪个恢复的快 答: rdb快,因为其是数据的内存映射,直接载入到内存,而aof是命令,需要逐条执行
九、主从复制
9.1 集群的作用
1、主从备份 防止主机宕机 2、读写分离,分担master的任务 3、任务分离,如从服务器分别分担备份工作与计算工作
9.2 集群架构
master->slave1 master->slave2 //动作slave1修改成master //slave2修改master为slave1 master->slave1->slave2 // 一步完成 // 同步原理 // 初始化 slave -->自动同步-->master master-->dump rdb -->slave master-->缓冲的aof-->slave // 通知slave进行同步 master -->replicationFeedSlaves-->slave
9.3 主从配置
主机名 | 地址 | 备注 |
vms25 | 192.168.26.25 | master |
vms26 | 192.168.26.26 | slave1 |
vms27 | 192.168.26.27 | slave2 |
# redis增加密码
// 配置密码在master vim redis.conf requirepass passwd // 从节点配置 添加如下 masterauth passwd
均修改redis.conf文件 // master 配置 // 设置一台从节点产生aof,rdb [root@vms25 redis-6.2.6]# sed -i '$a bind 192.168.26.25' redis.conf [root@vms25 redis-6.2.6]# sed -i '/daemonize no/c daemonize yes' redis.conf // 配置aof [root@vms25 redis-6.2.6]# sed -i '/appendonly no/c appendonly yes' redis.conf src/redis-server redis.conf // slave1 配置 [root@vms26 redis-6.2.6]# sed -i '$a bind 192.168.26.26' redis.conf // 配置rdb [root@vms26 redis-6.2.6]# sed -i '$a save 3600 1' redis.conf [root@vms26 redis-6.2.6]# sed -i '$a save 300 100' redis.conf [root@vms26 redis-6.2.6]# sed -i '$a save 60 10000' redis.conf [root@vms26 redis-6.2.6]# sed -i '$a slaveof 192.168.26.25 6379' redis.conf [root@vms26 redis-6.2.6]# sed -i '/daemonize no/c daemonize yes' redis.conf src/redis-server redis.conf // slave2 配置 [root@vms27 redis-6.2.6]# sed -i '$a bind 192.168.26.27' redis.conf [root@vms27 redis-6.2.6]# sed -i '$a slaveof 192.168.26.25 6379' redis.conf [root@vms27 redis-6.2.6]# sed -i '/daemonize no/c daemonize yes' redis.conf src/redis-server redis.conf //连接测试在vms25 /src/redis-cli -h 192.168.26.25 set user tom //在vms26测试 /src/redis-cli -h 192.168.26.26 get user
redis集群配置简要 Master配置 1、关闭rdb快照 2、可以开启aof日志 Slave配置 1、声明slave-of 2、配置密码【如果master有密码】 3、【某1个】slave打开rdb快照功能 4、配置是否只读【slave-read-only】
// redis 主从复制缺陷
每次slave断开后(无论是主动断开,还是网络故障)再连接master
都要master全部dump出来rdb,再aof,即同步的过程都要重新执行1遍
所以要记住--多台slave不要一下都启动起来,否则master的I/O剧增
十、redis常用运维命令
TIME 查看时间戳与微秒数 DBSIZE 查看当前库中的key数量 BGREWRITEAOF 后台进程重写AOF BGSAVE 后台保存rdb快照 SAVE 保存rdb快照 LASTSAVE 上次保存时间 SLAVEOF 设为slave服务器 FLUSHALL 清空所有db FLUSHDB 清空当前db SHUTDOWN[""|save|nosave] 断开连接,关闭服务器 SLOWLOG 显示慢查询 INFO 显示服务器信息 CONFIG GET 获取配置信息 CONFIG SET 设置配置信息 MONITOR 打开控制台 SYNC 主从同步 CLIENT LIST 客户端列表 CLIENT KILL 关闭某个客户端 CLIENT SETNAME 为客户端设置名字 CLIENT GETNAME 获取客户端名字
// 慢日志查询
config set/get 也可以在redis.conf配置
// 执行命令时间超过10000微秒则记录
slowlog-log-slower-than 10000
// 查看慢日志记录的命令
slowlog-get
// 设置慢日志大小范围
slow-log-max-len
十一、aof恢复与rdb服务器间迁移
// master step 1 当flushall后操作 shutdown nosave step 2 // 编辑aof文件删除aof中关联flushall的相关三行命令 [root@vms25 redis-6.2.6]# vim appendonly.aof *1 $8 flushall step 3 启动redis src/redis-server redis.conf
// 检查rdb文件 src/redis-check-dump dump6380.rdb // 在redis进程运行时rdb处于开启的状态是会被占用 // 需要关闭redis,然后复制rdb文件 kill redis // 复制rdb文件到指定目录 cp dump.rdb dest // 启动redis 恢复数据
十二、监控工具sentinel
// salve1配置 // 设置salve1为master slaveof no one // 配置可写入 confgi set slave-read-only yes // 其它slave再指定slave1为master slaveof 192.168.26.26:6379
默认端口 26379 port 26379 daemonize no pidfile /var/run/redis-sentinel.pid logfile "" dir /tmp // 几个slave发现无法连接则确认它为宕机 sentinel monitor mymaster 127.0.0.1 6379 2 ##master被当前sentinel实例认定为“失效”的间隔时间 ##如果当前sentinel与master直接的通讯中,在指定时间内没有响应或者响应错误代码,那么 ##当前sentinel就认为master失效(SDOWN,“主观”失效) ##<mastername> <millseconds> ##默认为30秒 sentinel down-after-milliseconds mymaster 30000 acllog-max-len 128 // 平行同步 sentinel parallel-syncs mymaster 1 // 超时未完成发送信息 sentinel failover-timeout mymaster 180000 sentinel deny-scripts-reconfig yes SENTINEL resolve-hostnames no SENTINEL announce-hostnames no
// 所有设备修改sentinel.conf文件 // 地址均为master地址 2为监测sentinel的节点如果2个未发现则执行 sentinel monitor mymaster 192.168.26.26 6379 2 // 所有启动redis和sentinel src/redis-server redis.conf src/redis-server sentinel.conf --sentinel // 当master断开时会自动切换master // 如果指定slave优先为master,则在redis.conf配置优先级 slave-priority 100 数值越小越靠前