redis

一、什么是redis

redis是开源,BSD许可,高级的key-value存储系统。可以用来存储字符串,哈希结构,链表,集合,因此常用来提供数据结构服务。

1.1 redis和memcache区别

  1. redis可以用来做存储,而memcache是用来做缓存(redis的持久化)
  2. 存储的数据有结构,对于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操作

redis
// 设置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
通用key操作命令

3.2 字符串类型的操作

redis
// 设置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
均修改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主从配置之星型结构
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服务器间迁移

redis
// 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
aof&rdb备份恢复 redis
// 检查rdb文件
src/redis-check-dump dump6380.rdb
// 在redis进程运行时rdb处于开启的状态是会被占用
// 需要关闭redis,然后复制rdb文件
kill redis
// 复制rdb文件到指定目录
cp dump.rdb dest
// 启动redis
恢复数据
rdb导入

十二、监控工具sentinel

redis
// salve1配置
// 设置salve1为master
slaveof no one
// 配置可写入
confgi set slave-read-only yes

// 其它slave再指定slave1为master
slaveof 192.168.26.26:6379
手动配置slave升级成master
默认端口 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
redis
// 所有设备修改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  数值越小越靠前
redis集群配置sentinel

 

上一篇:05-Redis系列之-使用常见问题


下一篇:Redis 持久化方案