安装redis
-
物料准备
-
解压并编译安装
tar -xzvf redis-7.4.0.tar.gz
cd redis-7.4.0
make
make PREFIX=/usr/local/redis install
-
编辑配置文件
mkdir /usr/local/redis/conf
cp redis.conf /usr/local/redis/conf/
vim /usr/local/redis/conf/redis.conf
将第88行 bind 127.0.0.1 -::1 改为 bind 0.0.0.0 ,允许任何IP访问
将第310行 daemonize no 改为 daemonize yes ,打开守护进程(常驻后台)
第1051行设置密码 requirepass [密码]
547行:masterauth [主服务密码]
-
将redis命令加入环境变量
vim /etc/profile
末尾追加 export PATH=$PATH:/usr/local/redis/bin
source /etc/profile
-
编辑内核参数,修改内存分配策略,这里我们设置为1。如果不设置默认为0,可能发生redis savedb失败的情况
vim /etc/sysctl.conf
# 0:表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
# 1:表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
# 2:表示内核允许分配超过所有物理内存和交换空间总和的内存。
vm.overcommit_memory = 1
sysctl -p
-
编辑启动文件,纳入系统管理
vim /etc/systemd/system/redis.service
重载配置
systemctl daemon-reload
-
启动redis服务
systemctl start redis
-
连接redis
redis-cli
auth [密码]
部分命令
-
查看状态信息
info
-
查看语法帮助
help
help set
-
判断key是否存在
exists key
-
查看key对应value的类型
type key
-
删除key
del key
-
显示所有key(不建议使用)
keys *
-
查看当前库key的数量
dbsize
-
设置过期时间(单位s)
expire key 30
-
查看剩余时间
ttl key
-
切换数据库(共16个库,所以取值范围0~15)
select 0
-
清空当前库(谨慎操作)
flushdb
-
清空所有库(谨慎操作)
flushall
-
string类型(单个value值上限是512MB)
-
list类型(常见先进先出队列)
-
设值
lpush key value # 添加到首部,左进
rpush key value # 添加到尾部,右进
-
取值
lpop key # 从首部取出一个值并删除
rpop key # 从尾部取出一个值并删除
-
范围取值
lrange key startIndex endIndex # 从首部开始,取出指定范围的值
rrange key startIndex endIndex # 从尾部开始,取出指定范围的值
-
set类型(无序、不重复的集合,最大可以包含(2的32次方-1)个元素)
-
设值
sadd key value1 value2 value3
-
取值(返回所有元素,不建议使用)
smembers key
-
取值(返回集合中count个元素)
srandmember key [count=1]
-
查询集合中元素的数量
scard key
-
移动元素,将value从key1移动到key2中
smove key1 key2 value
-
删除元素
srem key value1 value2 value3
-
随机删除一个元素
spop key
-
求交集(key1中存在key2中也存在的元素)(共同好友)
sinter key1 key2
sinterstore key key1 key2 # 将结果添加到key中
-
求并集(key1和key2所有的元素)(所有好友)
sunion key1 key2
sunionstore key key1 key2 # 将结果添加到key中
-
求差集(key1中存在key2中不存在的元素)(互相推荐好友)
sdiff key1 key2
sdiffstore key key1 key2 # 将结果添加到key中
-
集合中是否存在某元素
sismember key value
-
zset类型(有序、不重复的集合)
-
设值(score-权重,通过该值对元素进行排序)
zadd key score1 value1 score2 value2 score3 value3
-
排序
zrange key 0 9 # 升序排列并取出前10个元素
zrevrange key 0 9 # 倒序排列并取出前10个元素
-
获取某个元素的权重
zscore key value
-
更新某个元素的权重
zincrby key +1 value
-
hash类型(类似于存储一个moduleBean对象)
数据持久化
-
RDB自动备份(默认开启)
触发条件可以查看配置文件vim /usr/local/redis/conf/redis.conf
save 900 1 # 15分钟内最少有1个key改变
save 300 100 # 5分钟内最少有100个key改变
save 60 10000 # 1分钟内最少有10000个key改变
dbfilename dump.rdb # 快照文件名
dir /usr/local/redis # 默认保存路径
stop-writes-on-bgsave-error yes # 发生备份错误时停止处理写请求
rdbcompression yes # 是否进行压缩存储。如果是的话,redis会采用LZF算法进行压缩,有一定cpu消耗
rdbchecksum yes # 是否进行数据校验。如果是的话,redis会采用CRC64算法进行数据校验,有约10%性能损耗
rdb-del-sync-files no # 在没有开启持久性的情况下是否删除RDB文件
相关命令
-
AOF增量备份(append only file),以日志的形式存储每个写操作
开启AOF可以编辑配置文件vim /usr/local/redis/conf/redis.conf
第1399行 appendonly 设为yes
第1458行 appendfsync 备份频率设为everysec
dir /usr/local/redis # 默认保存路径
appenddirname aof # 保存目录名
appendfilename appendonly.aof # 保存文件名
auto-aof-rewrite-min-size 64mb # 当aof文件大小达到多少时触发重写压缩
auto-aof-rewrite-percentage 100 # 当aof文件重写后超出自身百分之多少时进行二次重写压缩
aof生成文件说明
-
BASE
表示基础的AOF,一般由子进程通过重写产生,该文件最多只有一个。
-
INCR
表示增量的AOF,一般由 AOFRW 开始执行的时候被创建,该文件可能存在多个。
-
HISTORY
表示历史的AOF,由BASE和INCR的AOF变化而来,每次 AOFRW 成功完成时,本次 AOFRW 之前对应的BASE和INCR的AOF都将变成HISTORY,HISTORY类型的AOF会被Redis自动删除。
-
为了管理这些AOF文件,引入了manifest(清单)文件类跟踪、管理这些AOF。同时,为了便于AOF备份和拷贝,我们将所有的AOF文件和manifest文件放入一个单独的文件目录中,目录名由appenddirname配置决定。
相关命令
-
RDB+AOF的混合模式
vim /usr/local/redis/conf/redis.conf
aof-use-rdb-preamble yes # 默认值就是yes
主从架构
-
(主服务)编辑配置
vim /usr/local/redis/conf/redis.conf
protected-mode no # 关闭安全保护机制,允许主从、哨兵、集群中各节点之间的相互访问
-
(主服务)重启redis服务
systemctl restart redis
-
(从服务)编辑配置
vim /usr/local/redis/conf/redis.conf
replicaof [主服务IP] 6379
547行:masterauth [主服务密码]
第1051行设置密码 requirepass [密码]
-
(从服务)重启redis服务
systemctl restart redis
主从切换-Sentinel哨兵
-
(每个服务,奇数个,最少3个)编辑配置
vim /usr/local/redis/conf/sentinel.conf
protected-mode no # 关闭安全保护机制,允许主从、哨兵、集群中各节点之间的相互访问
port 26379
daemonize yes
sentinel monitor mymaster [主服务IP] 6379 [阈值,需要几个哨兵标记主观下线后才判定为客观下线,一般设置为哨兵数量的一半向上取整]
sentinel auth-pass mymaster [主服务密码]
-
(每个服务)启动哨兵
redis-sentinel /usr/local/redis/conf/sentinel.conf
redis集群
-
创建集群要求redis没有任何数据,包括appendonlydir、dump.rdb、nodes_700X.conf
创建集群要求至少3个主节点
集群拆分出16384个哈希槽用来方便数据存储,分给集群中的主节点
本示例为三台服务器,每台服务器部署两个redis节点,规划如下:
| server1 |
server2 |
server3 |
| 主1 |
从1 |
|
|
主2 |
从2 |
| 从3 |
|
主3 |
-
(每个服务)编辑配置文件(六个节点的端口分别使用7001~7006)
vim /usr/local/redis/conf/redis[端口].conf
port [端口]
cluster-enabled yes # 启用集群模式
cluster-config-file nodes_[端口].conf
cluster-node-timeout 5000 # 超时时间
appendonly yes
pidfile /var/run/redis_[端口].pid
-
(每个服务)启动服务
redis-server /usr/local/redis/conf/redis[端口].conf
-
创建集群(三个主节点写在前面,对应从节点写在后面,--cluster-replicas 1表示每个主节点有1个从节点)
redis-cli --cluster create server1:7001 server2:7003 server3:7005 server1:7002 server2:7004 server3:7006 --cluster-replicas 1
-
连接集群
redis-cli -c -h [主节点IP] -p 7001
-
关闭集群
redis-cli -c -h [serverIP] -p [端口] shutdown
重启集群
redis-server /usr/local/redis/conf/redis[端口].conf
-
添加主节点到集群
redis-cli --cluster add-node server4:7007 server1:7001
可能遇到某几个槽未迁移的问题,解决步骤:
-
修复槽,多个槽则执行多次
redis-cli -h [服务器IP] -p [端口] cluster setslot [槽索引] stable
-
自动平衡
redis-cli --cluster rebalance server1:7001 --cluster-threshold 1
-
添加从节点到集群
-
获取新主节点 ID
NODE_ID_7007=$(redis-cli -h server4 -p 7007 cluster nodes | grep myself | awk '{print $1}')
-
添加从节点并绑定到主节点
redis-cli --cluster add-node server5:7008 server1:7001 --cluster-slave --cluster-master-id $NODE_ID_7007
-
验证集群状态
redis-cli --cluster check server1:7001