摘要
redis安装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 mkdir -p /usr/local/softwget https://download.redis.io/releases/redis-7.4.7.tar.gz -P /usr/local/soft cd /usr/local/softtar -zxvf redis-7.4.7.tar.gz sudo yum install gcc gcc-c++ -ycd redis-7.4.7make mkdir build_dirmake install PREFIX=$(pwd )/build_dir cp redis.conf redis-6379.confvim redis-6379.conf echo 'export PATH=$PATH:/usr/local/soft/redis-7.4.7/build_dir/bin' >> /etc/bashrcsource /etc/bashrcredis-cli --version redis-cli 7.4.7
单节点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 port 6379 daemonize yes protected-mode yes save "" dir /usr/local/soft/dir-redis7/6379appendonly yes appendfilename "appendonly.aof" appenddirname "appendonlydir" appendfsync everysec auto-aof-rewrite-min-size 64mb auto-aof-rewrite-percentage 100 aof-use-rdb-preamble yes aof-load-truncated yes pidfile "redis_6379.pid" logfile "6379.log" maxmemory 4294967296 maxmemory-policy allkeys-lru slowlog-log-slower-than 10000 slowlog-max-len 1024 io-threads 4 io-threads-do-reads yes tcp-keepalive 60 timeout 0maxclients 10000 rename-command FLUSHALL "" rename-command FLUSHDB "" lazyfree-lazy-eviction yes lazyfree-lazy-expire yes lazyfree-lazy-server-del yes replica-lazy-flush yes lazyfree-lazy-user-del no lazyfree-lazy-user-flush no aclfile /usr/local/soft/redis-7.4.7/users.acl
策略
是否只淘汰带 TTL 的 key
淘汰规则
说明
noeviction
❌ 不淘汰
不删任何 key
内存满了直接返回错误(默认)
allkeys-lru
❌ 所有 key
最近最久未使用
✅ 最常用
allkeys-lfu
❌ 所有 key
访问频率最少
✅ 热点场景最好
allkeys-random
❌ 所有 key
随机删除
❌ 很少用
volatile-lru
✅ 只淘汰有 TTL 的
最近最久未使用
你之前用的
volatile-lfu
✅ 只淘汰有 TTL 的
访问频率最少
较少使用
volatile-random
✅ 只淘汰有 TTL 的
随机删除
很少用
volatile-ttl
✅ 只淘汰有 TTL 的
TTL 最小(马上过期的)
特殊场景用
1 2 3 4 user default off user admin on ~* &* +@all >123456
1 2 3 4 5 6 7 8 9 10 11 12 redis-server redis-6379.conf redis-cli -h 127.0.0.1 -p 6379 --user admin --pass 123456 redis-cli -u redis://admin:123456@127.0.0.1:6379 redis-cli -u redis://admin:123456@127.0.0.1:6379 shutdown redis-cli -u redis://admin:123456@127.0.0.1:6379 shutdown nosave
场景
推荐命令
正常下线(生产)
shutdown nosave
已开 AOF
shutdown nosave
数据很大
shutdown nosave
单机调试
shutdown
确定要生成快照
shutdown save
强制杀死(redis卡死)
kill -9(极端情况)
单节点优点
单节点缺点
不保证数据的可靠性,不适用于数据可靠性要求高的场景
单点故障导致无法提供服务,或者硬盘损坏导致数据丢失
redis单节点最大qps为10w(取决于单核cpu的处理能力),超过这个qps就需要做前端限流
主从
1 2 3 master 10.250.0.235 slave1 10.250.0.58 slave2 10.250.0.36
1 2 3 4 5 6 7 8 9 replicaof 10.250.0.235 6379 replica-read-only yes masteruser admin masterauth 123456
此时启动从节点redis-server redis-6379.conf,会自动从主节点同步数据,同步前如果从节点已经有数据,则会先清除原有数据再进行同步
主节点接收到从节点的同步请求后,会通过bgsave将内存数据dump到rdb文件中并传递给从节点
主节点生成rdb文件并传递给从节点期间会继续处理客户端的请求,并将这部分数据缓存到内存中,待从节点接收到主节点发过来的rdb文件并完成内存加载后,主节点会将这部分缓存在内存中的数据发送给从节点
从节点相当于主节点的备份,主节点挂了,从节点不能自动切换为主节点,如果需要自动切换,可以使用哨兵或者集群部署方式
此时登录master的redis并执行info replication命令
1 2 3 4 5 6 7 8 9 10 11 12 13 role:master connected_slaves:1 slave0:ip=10.250.0.36,port=6379,state=online,offset=56,lag=1 master_failover_state:no-failover master_replid:93e564c18d27418e52fc40254c764d76c1dc3f67 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:56 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:56
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 role:slave master_host:10.250.0.235 master_port:6379 master_link_status:up master_last_io_seconds_ago:6 master_sync_in_progress:0 slave_read_repl_offset:112 slave_repl_offset:112 slave_priority:100 slave_read_only:1 replica_announced:1 connected_slaves:0 master_failover_state:no-failover master_replid:93e564c18d27418e52fc40254c764d76c1dc3f67 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:112 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:15 repl_backlog_histlen:98
字段
正常值
说明
role
slave
表示当前是从节点
master_link_status
up
表示已经连上主库
master_sync_in_progress
0
同步不在进行中 = 已完成
slave_read_repl_offset ≈ master_repl_offset
接近
说明数据已追上
1 2 3 4 5 6 7 8 9 10 11 12 13 14 role:master connected_slaves:2 slave0:ip=10.250.0.36,port=6379,state=online,offset=4313,lag=0 slave1:ip=10.250.0.58,port=6379,state=online,offset=4313,lag=0 master_failover_state:no-failover master_replid:93e564c18d27418e52fc40254c764d76c1dc3f67 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:4313 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:4313
主从优点
对请求进行读写分离,提高处理效率
可以提供多个副本,提高数据安全性
主从缺点
哨兵
1 2 3 4 5 6 master 10.250.0.235 slave1 10.250.0.58 slave2 10.250.0.36 sentinel1 10.250.0.71 sentinel2 10.250.0.131 sentinel3 10.250.0.63
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 port 26379 daemonize yes dir /usr/local/soft/dir-redis7/sentinelpidfile redis-sentinel.pid logfile "sentinel.log" sentinel monitor mymaster 10.250.0.235 6379 2 sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 60000 sentinel parallel-syncs mymaster 1 sentinel auth-user mymaster admin sentinel auth-pass mymaster 123456
1 2 3 4 5 6 7 8 sentinel_masters:1 sentinel_tilt:0 sentinel_tilt_since_seconds:-1 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=mymaster,status=ok,address=10.250.0.235:6379,slaves=2,sentinels=3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 latency-tracking-info-percentiles 50 99 99.9 user default on nopass sanitize-payload ~* &* +@all sentinel myid 8b9d55a581f2e41b4f8d92f4a9434d9b8a78b3e6 sentinel config-epoch mymaster 0 sentinel leader-epoch mymaster 0 sentinel current-epoch 0 sentinel known-replica mymaster 10.250.0.58 6379 sentinel known-replica mymaster 10.250.0.36 6379 sentinel known-sentinel mymaster 10.250.0.71 26379 b230f6a6076c23eed1923b29027d9ba7b24bee5a sentinel known-sentinel mymaster 10.250.0.63 26379 74ef58ef3616a27cc63d83bcfe422f15e11731b8
1 2 3 4 5 6 latency-tracking-info-percentiles 50 99 99.9 replicaof 10.250.0.36 6379 save 3600 1 save 300 100 save 60 10000
1 2 3 masteruser admin masterauth 123456
1 redis-cli -p 26379 shutdown
哨兵优点
哨兵缺点
哨兵单点故障,则集群无法完整自主选举主节点,所以需要对哨兵集群部署,增加服务器成本,但是并没有提升负载
另外,主节点故障时,哨兵介入有时间差,会导致响应延迟
从节点仅作为备份不提供对外服务,只有当master出现故障时其晋升为master后才能提供服务,所以不支持读写分离
集群
1 2 3 4 5 6 redis1 10.250.0.235 redis2 10.250.0.58 redis3 10.250.0.36 redis4 10.250.0.71 redis5 10.250.0.131 redis6 10.250.0.63
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 masteruser "admin" masterauth "123456" cluster-enabled yes cluster-config-file nodes-6379.conf cluster-node-timeout 15000 min-replicas-to-write 1 cluster-require-full-coverage yes
1 redis-server redis-6379.conf
1 2 3 4 5 redis-cli --user admin --pass 123456 --cluster create --cluster-replicas 1 10.250.0.235:6379 10.250.0.58:6379 10.250.0.36:6379 10.250.0.71:6379 10.250.0.131:6379 10.250.0.63:6379
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. >>> Performing hash slots allocation on 6 nodes... Master[0] -> Slots 0 - 5460 Master[1] -> Slots 5461 - 10922 Master[2] -> Slots 10923 - 16383 Adding replica 10.250.0.131:6379 to 10.250.0.235:6379 Adding replica 10.250.0.63:6379 to 10.250.0.58:6379 Adding replica 10.250.0.71:6379 to 10.250.0.36:6379 M: afcb754ce8cc79122fe9bcd8c1567bbf13258fce 10.250.0.235:6379 slots:[0-5460] (5461 slots) master M: 2527142b7cffaf6bb92608550c919a0db0607c39 10.250.0.58:6379 slots:[5461-10922] (5462 slots) master M: 88762f7d0bbb99bbaf68556ef5fd113cba46d295 10.250.0.36:6379 slots:[10923-16383] (5461 slots) master S: 547fbd934293ddb5eb770e111b65910f4e604023 10.250.0.71:6379 replicates 88762f7d0bbb99bbaf68556ef5fd113cba46d295 S: 17b33861e6b086b86902fe75f79e5b878bd26f94 10.250.0.131:6379 replicates afcb754ce8cc79122fe9bcd8c1567bbf13258fce S: 119e5823cccafef506b9b256aad206678eab7d41 10.250.0.63:6379 replicates 2527142b7cffaf6bb92608550c919a0db0607c39 Can I set the above configuration? (type 'yes' to accept): yes >>> Nodes configuration updated >>> Assign a different config epoch to each node >>> Sending CLUSTER MEET messages to join the cluster Waiting for the cluster to join . >>> Performing Cluster Check (using node 10.250.0.235:6379) M: afcb754ce8cc79122fe9bcd8c1567bbf13258fce 10.250.0.235:6379 slots:[0-5460] (5461 slots) master 1 additional replica(s) S: 547fbd934293ddb5eb770e111b65910f4e604023 10.250.0.71:6379 slots: (0 slots) slave replicates 88762f7d0bbb99bbaf68556ef5fd113cba46d295 S: 119e5823cccafef506b9b256aad206678eab7d41 10.250.0.63:6379 slots: (0 slots) slave replicates 2527142b7cffaf6bb92608550c919a0db0607c39 S: 17b33861e6b086b86902fe75f79e5b878bd26f94 10.250.0.131:6379 slots: (0 slots) slave replicates afcb754ce8cc79122fe9bcd8c1567bbf13258fce M: 88762f7d0bbb99bbaf68556ef5fd113cba46d295 10.250.0.36:6379 slots:[10923-16383] (5461 slots) master 1 additional replica(s) M: 2527142b7cffaf6bb92608550c919a0db0607c39 10.250.0.58:6379 slots:[5461-10922] (5462 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
1 2 redis-cli --user admin --pass 123456 -c -h 10.250.0.235
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 10.250.0.235:6379> cluster info cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:6 cluster_size:3 cluster_current_epoch:6 cluster_my_epoch:1 cluster_stats_messages_ping_sent:159 cluster_stats_messages_pong_sent:156 cluster_stats_messages_sent:315 cluster_stats_messages_ping_received:151 cluster_stats_messages_pong_received:159 cluster_stats_messages_meet_received:5 cluster_stats_messages_received:315 total_cluster_links_buffer_limit_exceeded:0
1 2 3 4 5 6 7 8 9 10 11 12 13 10.250.0.235:6379> cluster nodes afcb754ce8cc79122fe9bcd8c1567bbf13258fce 10.250.0.235:6379@16379 myself,master - 0 0 1 connected 0-5460 547fbd934293ddb5eb770e111b65910f4e604023 10.250.0.71:6379@16379 slave 88762f7d0bbb99bbaf68556ef5fd113cba46d295 0 1765033120132 3 connected 119e5823cccafef506b9b256aad206678eab7d41 10.250.0.63:6379@16379 slave 2527142b7cffaf6bb92608550c919a0db0607c39 0 1765033118000 2 connected 17b33861e6b086b86902fe75f79e5b878bd26f94 10.250.0.131:6379@16379 slave afcb754ce8cc79122fe9bcd8c1567bbf13258fce 0 1765033119000 1 connected 88762f7d0bbb99bbaf68556ef5fd113cba46d295 10.250.0.36:6379@16379 master - 0 1765033117000 3 connected 10923-16383 2527142b7cffaf6bb92608550c919a0db0607c39 10.250.0.58:6379@16379 master - 0 1765033119126 2 connected 5461-10922
1 2 3 4 5 6 7 8 10.250.0.235:6379> cluster nodes afcb754ce8cc79122fe9bcd8c1567bbf13258fce 10.250.0.235:6379@16379 myself,master - 0 0 1 connected 0-5460 547fbd934293ddb5eb770e111b65910f4e604023 10.250.0.71:6379@16379 master - 0 1765033733534 7 connected 10923-16383 119e5823cccafef506b9b256aad206678eab7d41 10.250.0.63:6379@16379 slave 2527142b7cffaf6bb92608550c919a0db0607c39 0 1765033734542 2 connected 17b33861e6b086b86902fe75f79e5b878bd26f94 10.250.0.131:6379@16379 slave afcb754ce8cc79122fe9bcd8c1567bbf13258fce 0 1765033732526 1 connected 88762f7d0bbb99bbaf68556ef5fd113cba46d295 10.250.0.36:6379@16379 master,fail - 1765033690200 1765033686170 3 connected 2527142b7cffaf6bb92608550c919a0db0607c39 10.250.0.58:6379@16379 master - 0 1765033735550 2 connected 5461-10922
1 2 3 4 5 6 7 8 10.250.0.235:6379> cluster nodes afcb754ce8cc79122fe9bcd8c1567bbf13258fce 10.250.0.235:6379@16379 myself,master - 0 0 1 connected 0-5460 547fbd934293ddb5eb770e111b65910f4e604023 10.250.0.71:6379@16379 master - 0 1765033859000 7 connected 10923-16383 119e5823cccafef506b9b256aad206678eab7d41 10.250.0.63:6379@16379 slave 2527142b7cffaf6bb92608550c919a0db0607c39 0 1765033860493 2 connected 17b33861e6b086b86902fe75f79e5b878bd26f94 10.250.0.131:6379@16379 slave afcb754ce8cc79122fe9bcd8c1567bbf13258fce 0 1765033858000 1 connected 88762f7d0bbb99bbaf68556ef5fd113cba46d295 10.250.0.36:6379@16379 slave 547fbd934293ddb5eb770e111b65910f4e604023 0 1765033859488 7 connected 2527142b7cffaf6bb92608550c919a0db0607c39 10.250.0.58:6379@16379 master - 0 1765033859000 2 connected 5461-10922
1 2 3 4 5 redis-cli -c --user admin --pass 123456 -h 10.250.0.36 10.250.0.36:6379> cluster failover 10.250.0.36:6379> CLUSTER FAILOVER TAKEOVER
1 2 3 4 5 6 7 HASH_SLOT=CRC16(key) mod 16384 10.250.0.235:6379> set name zhangsan -> Redirected to slot [5798] located at 10.250.0.58:6379 OK
1 redis-cli -c -h 10.250.0.235 -p 6379 --user admin --pass 123456 shutdown
1 redis-server redis-6379.conf
1 2 3 4 5 6 7 8 9 10 10.250.0.235:6379> mset name1 lisi name2 wangwu (error) CROSSSLOT Keys in request don't hash to the same slot 10.250.0.235:6379> mset {user}:name1 lisi {user}:name2 wangwu OK 10.250.0.235:6379> mget {user}:name1 {user}:name2 -> Redirected to slot [5474] located at 10.250.0.58:6379 1) "lisi" 2) "wangwu"
注意:
{…} 让多个 key 落在同一个 slot,支持跨 key 原子操作
只有 第一个匹配的 {…} 会被当做 tag
{} 不能嵌套
空标签 {} 是非法的
{abc} 和 {def} 就落不同 slot
1 2 3 10.250.0.235:6379> cluster keyslot name1 (integer ) 5461
1 2 3 10.250.0.235:6379> cluster countkeysinslot 5461 (integer ) 1
集群推举新的master时要求至少一半的master同意,所以一个集群至少需要3个master,官方推荐master节点数为奇数,比如3个和4个master节点,都至多允许一个master节点挂掉时进行选主,但是3个master可以节省资源
集群通过10000+port这个端口号进行集群间通信,所以除了要开放prot这个端口,还要开放10000+port这个端口
有关redis集群及其水平扩展的进一步说明,可以参看Redis集群
集群优点
集群缺点
数据通过异步复制,不保证数据的强一致性
不支持多数据库空间,单机下的redis可以支持到16个数据库,集群模式下只能使用1个数据库空间,即db 0
不支持跨slot操作,如使用mset、mget目前只支持具有相同slot值的Key执行批量操作
Key作为数据分区的最小粒度,不能将一个很大的键值对象如hash、list等映射到不同的节点
Key事务操作支持有限,只支持多key在同一节点上的事务操作,当多个Key分布于不同的节点上时无法使用事务功能
不建议使用pipeline和multi-keys操作
另外,如果集群内节点时间不同步,可能存在脏写
redis-cli 的 Cluster 管理命令(用于管理/创建/调整集群)
命令
作用
示例
redis-cli --cluster create host1:port host2:port ...
创建 Redis Cluster 集群(自动分配 slots)
redis-cli --cluster create 10.0.0.1:7000 10.0.0.2:7000 --cluster-replicas 1
redis-cli --cluster check host:port
检查集群状态、健壮性
redis-cli --cluster check 10.0.0.1:7000
redis-cli --cluster info host:port
显示集群结构、节点、slots 分布
redis-cli --cluster info 10.0.0.1:7000
redis-cli --cluster fix host:port
修复 slots 移动、节点中断等异常状态
redis-cli --cluster fix 10.0.0.1:7000
redis-cli --cluster rebalance host:port
重新分布 slots(自动均衡负载)
redis-cli --cluster rebalance 10.0.0.1:7000
redis-cli --cluster rebalance --cluster-threshold <percent> host:port
手动设置 rebalance 阈值;低于此阈值才会调整(百分比)
redis-cli --cluster rebalance --cluster-threshold 1 10.0.0.1:7000
redis-cli --cluster add-node newHost:newPort existingHost:existingPort
将新节点加入集群
redis-cli --cluster add-node 10.0.0.3:7000 10.0.0.1:7000
redis-cli --cluster add-node --cluster-slave newHost:newPort existingMaster:port
将新节点作为某主节点的 slave 加入
redis-cli --cluster add-node --cluster-slave 10.0.0.4:7000 10.0.0.1:7000
redis-cli --cluster del-node host:port node_id
从集群删除某节点(必须无 slots)
redis-cli --cluster del-node 10.0.0.1:7000 <node-id>
redis-cli --cluster call host:port command ...
在所有节点上批量执行命令
redis-cli --cluster call 10.0.0.1:7000 PING
redis-cli --cluster help
显示 cluster 子命令帮助
redis-cli --cluster help
Redis 内置的 Cluster 操作命令
命令
作用
示例
CLUSTER INFO
查看集群状态、failover 状态、slot 分布统计
CLUSTER INFO
CLUSTER NODES
显示所有节点和角色(master/slave)
CLUSTER NODES
CLUSTER MYID
输出本节点 ID
CLUSTER MYID
CLUSTER REPLICATE <node-id>
将当前节点设置为某个 master 的 slave
CLUSTER REPLICATE <node-id>
CLUSTER FAILOVER
主动 failover(slave 升级为 master)
从节点执行:CLUSTER FAILOVER
CLUSTER FAILOVER FORCE
不等待复制同步,立刻切主
CLUSTER FAILOVER FORCE
CLUSTER FAILOVER TAKEOVER
强制接管 slot(完全覆盖 master)(危险)
CLUSTER FAILOVER TAKEOVER
CLUSTER ADDSLOTS <slot...>
将 slots 分配给当前 master
CLUSTER ADDSLOTS 0 1 2
CLUSTER DELSLOTS <slot...>
从当前节点移除 slots
CLUSTER DELSLOTS 0 1 2
CLUSTER SETSLOT <slot> NODE <node-id>
直接指定某个 slot 属于某个节点
CLUSTER SETSLOT 0 NODE <id>
CLUSTER SETSLOT <slot> IMPORTING <node-id>
设定迁移 key 的源节点(用于 slot 迁移)
-
CLUSTER SETSLOT <slot> MIGRATING <node-id>
设定迁移 key 的目标节点(用于 slot 迁移)
-
CLUSTER KEYSLOT key
返回 key 所属 slot
CLUSTER KEYSLOT mykey
CLUSTER COUNT-FAILURE-REPORTS <node-id>
查看某节点的 fail 票数
-
CLUSTER RESET
删除节点全部集群信息(用来重置为 standalone)
CLUSTER RESET HARD