个人技能总结-redis部分
Redis部分技能总结
架构总结
Redis 目前在用分为主从模式,sentinel 主从模式集群Redis-cluster 集群模式3种模式。
redis-cluster 是多master模式 由多个maste 共同维护16384个slot
redis-sentinel 是单master模式主从模式 由sentinel 控制主从切换和健康检查。
种方式的优缺点
Sentinel 优点
Sentinel 模式提供了访问代理和故障转移 适合数据量在10G以内的缓存架构
Sentinel 缺点:
可能存在脑裂(split-brain)的问题,即当网络分区导致哨兵集群被划分为两个子集时,每个子集都可能认为自己是多数派,并试图执行故障转移。这样就会导致多个主服务器同时存在,造成数据冲突。
不支持分片,所有的写操作都只能在一个主服务器上进行,这限制了系统的扩展性。
可能存在数据不一致的问题,因为主从复制是异步进行的,如果主服务器在同步过程中出现故障,或者网络延迟导致部分数据未能及时同步到从服务器,就会造成数据丢失或不一致。
Redis cluster
集群模式的优点是:
实现了分片存储,突破了单个Redis节点内存大小的限制,提高了系统的扩展性。
实现了负载均衡,分摊了各个节点的读写压力,提高了系统的性能和吞吐量。
实现了高可用性,当某个节点出现故障时,集群会自动进行数据迁移和故障转移,无需人工干预
集群模式的缺点是:
- 不支持多键操作,因为数据可能分布在不同的节点上,无法保证原子性和一致性。
- 不支持事务操作,因为事务需要保证多个命令在同一个连接上执行,而集群模式可能会导致连接重定向到不同的节点。
- 不支持数据库切换操作,因为集群模式只使用数据库0。
- 需要客户端支持集群协议,因为客户端需要根据集群提供的槽位信息来定位数据所在的节点,并处理节点重定向和数据迁移等情况
Redis6配置文件详解
以下配置针对redis 6.0以上版本
loadmodule /path/to/my_module.so
loadmodule /path/to/other_module.so
不加载布隆模块等 不用开启
bind 10.10.192.112
绑定物理IP
protected-mode no
port 16389
不建议使用默认6379端口
tcp-backlog 511
timeout 0
空闲连接释放实现不建议修改
tcp-keepalive 300
会话保持不建议修改
ACL 用户权限认证根据需求决定是否开启
daemonize yes
pidfile /redis/pid/redis_16389.pid
指定进程PID
loglevel verbose
生产建议开启 verbose
Specify the log file name. Also the empty string can be used to force
Redis to log on the standard output. Note that if you use standard
output for logging but daemonize, logs will be sent to /dev/null
logfile "/redis/logs/redis_16389.log"
redis 日志
syslog-enabled no
syslog-ident redis
syslog-facility local0
是否开启syslog日志收集
databases 16
默认开启0-15DB 建议只使用DB0
always-show-logo no
set-proc-title yes
proc-title-template "{title} {listen-addr} {server-mode}"
Redis进程标题修改
save 3600 1
save 300 100
save 60 10000
save 1800 1
RDB 持久化策略 建议只保留一条 如果做缓存提升性能建议值为 save 1800 1
RDB 持久化策略 建议只保留一条 如果做内存数据库建议值为 save 300 1
stop-writes-on-bgsave-error yes
rdbcompression yes
rdb 压缩建议开启
rdbchecksum yes
dbfilename /redis/data/dump_16389.rdb
rdb-del-sync-files no
dir /redis
replicaof
主从配置非集群配置 根据需要调整
masterauth
masteruser
主从认证用户和密码
replica-serve-stale-data yes
replica-read-only yes
works better.
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-diskless-load disabled
不建议使用交换分区 建议采用默认配置
repl-ping-replica-period 10
心跳检测默认10秒 根据网络性能微调
repl-timeout 60
心跳检测超时时间 默认60s
repl-disable-tcp-nodelay no
repl-backlog-size 10mb
增加大小:如果你的写入负载非常高,并且希望确保不会丢失数据,可以增加 repl-backlog-size 的大小。
减少大小:如果你的写入负载不高,或者希望节省内存,可以减少 repl-backlog-size 的大小
repl-backlog-ttl 3600
repl-backlog-tt 根据你的数据更新频率和系统负载进行调整
replica-priority 100
tracking-table-max-keys 1000000
Redis BGSAVE快照 设置记录修改键的数量上限,建议采用默认值
masterauth '!qazxsW1'
requirepass '!qazxsW1'
rename-command CONFIG "dba_config"
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command SHUTDOWN "dba_shutdown"
rename-command KEYS ""
安全合规redis管理命令重命名或者高危命令禁用以及可能导致慢查询的命令
maxclients 20000
最大连接数建议调整在20000-50000
maxmemory 8G
单个实例内存不建议超过10G
maxmemory-policy volatile-lru
根据你的数据访问模式选择合适的策略。如果你的应用程序往往会访问一些热点键,可能更倾向于使用LRU(最近最少使用)策略volatile-lru。
如果你的应用程序有一些固定不变的数据,如缓存系统中的静态内容,可以使用allkeys-lru策略,但如果这部分数据被频繁访问,可能需要调整策略。
如果你的应用程序对写入操作要求高于读取操作,可以考虑使用volatile-ttl策略,优先清除更近期内不再需要的键
volatile-lru :使用LRU算法从已设置过期时间的数据集合中淘汰数据
volatile-ttl :从已设置过期时间的数据集合中挑选即将过期的数据淘汰
volatile-random :从已设置过期时间的数据集合中随机挑选数据淘汰
allkeys-lru :使用LRU算法从所有数据集合中淘汰数据
allkeys-random :从数据集合中任意选择数据淘汰
maxmemory-samples 5
redis 内存淘汰策略样本数量 不建议设置过高值 影响redis性能
maxmemory-eviction-tenacity 10
redis 尝试内存回收次数
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
lazyfree-lazy-user-del no
lazyfree-lazy-user-flush no
用于控制内存回收策略。当 Redis 达到内存上限时,它会尝试释放一些不再使用的键。
如果启用了 lazyfree-lazy-eviction 选项,Redis 会延迟清理被淘汰键的内存,
直到有需要内存的命令执行时。这样做可以减少内存碎片并提高性能,但可能会增加内存使用的峰值
建议默认或者谨慎调整
io-threads 4
redis6IO多线程配置 建议CPUnum-3
io-threads-do-reads yes
根据实际业务情况决定是否开启
oom-score-adj no
用来调整在内存不足时 redis 进程被操作系统终止的可能性的 不建议调整 采取默认
oom-score-adj-values 0 200 800
disable-thp yes
"Transparent Huge Pages (THP)" 禁用
appendonly no
缓存数据库不建议开启aof
appendfilename "/redis/data/appendonly_16389.aof"
appendfsync always
appendfsync everysec
appendfsync no
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
LUA 执行时间限制
redis 集群配置
cluster-enabled yes
开启集群模式
cluster-config-file /redis/conf/nodes-16389.conf
cluster-node-timeout 15000
节点超时时间,建议可以调整大一些,或者采用默认配置
cluster-replica-validity-factor 10
用于确定主节点在没有收到来自副本的回复时,能够执行写操作的时间比例 通过优化配置可以提高主从数据一致性
cluster-migration-barrier 1
代表含义是1个master至少得有1个slave 才会吧多余的slave分配给孤立的master,这也说明cluster模式主从关系不是一直不变的状态
cluster-allow-replica-migration yes
用于控制在 Redis 集群的主节点发生故障时,是否允许副本迁移 建议默认开启
cluster-require-full-coverage yes
只要有结点宕机导致16384个槽没全被覆盖,整个集群就全部停止服务 建议开启
cluster-replica-no-failover no
用于指示在集群的一个主节点失效时,不应该将其副本晋升为新的主节点,建议关闭,特殊情况可以开启
cluster-allow-reads-when-down no
用于控制在集群中某个节点标记为“下线”时,是否允许对该节点执行读操作
slowlog-log-slower-than 10000
慢查询时间控制
slowlog-max-len 1280
慢查询记录建议调整
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
建议启动大hash自动平衡
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 128mb 60
万兆带宽可以适当调整配置。让主从同步更高效
client-output-buffer-limit pubsub 32mb 8mb 60
使用订阅发布功能需要调整该配置
client-query-buffer-limit 1gb
proto-max-bulk-len 512mb
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
activedefrag yes
碎片整理建议开启
active-defrag-ignore-bytes 10mb
active-defrag-threshold-lower 5
触发内存碎片整理的策略 超过10m 5% 才会触发清理
active-defrag-threshold-upper 100
active-defrag-cycle-min 1
active-defrag-cycle-max 25
清理内存碎片活动碎片整理所占用的CPU百分比
active-defrag-max-scan-fields 1000
限制了在进行内存碎片整理时,单次扫描的键的最大数量 根据实际情况调整
jemalloc-bg-thread yes
启用jemalloc的后台线程 建议采取默认配置
server_cpulist 0-7:2
bio_cpulist 1,3
aof_rewrite_cpulist 8-11
bgsave_cpulist 1,10-11
多CPU 根据实际情况调整
Redis常用命令总结
管理命令总结
redis-cluster 常用命令
redis-cluster相关的集群命令
cluster info :打印集群的信息
cluster nodes :列出集群当前已知的所有节点( node),以及这些节点的相关信息。
cluster meet :将 ip 和 port 所指定的节点添加到集群当中。
cluster forget <node_id> :从集群中移除 node_id 指定的节点。
cluster replicate <master_node_id> :将当前从节点设置为 node_id 指定的master节点的slave节点。只能针对slave节点操作。
cluster saveconfig :将节点的配置文件保存到硬盘里面。
cluster addslots [slot ...] :将一个或多个槽( slot)指派( assign)给当前节点。
cluster delslots [slot ...] :移除一个或多个槽对当前节点的指派。
cluster flushslots :移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
cluster setslot node <node_id> :将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给
cluster setslot migrating <node_id> :将本节点的槽 slot 迁移到 node_id 指定的节点中。
cluster setslot importing <node_id> :从 node_id 指定的节点中导入槽 slot 到本节点。
cluster setslot stable :取消对槽 slot 的导入( import)或者迁移( migrate)。
cluster keyslot :计算键 key 应该被放置在哪个槽上。
cluster countkeysinslot :返回槽 slot 目前包含的键值对数量。
cluster getkeysinslot :返回 count 个 slot 槽中的键 。
创建集群
redis-cli --cluster create 192.168.163.132:6379 192.168.163.132:6380 192.168.163.132:6381
redis-cli --cluster create 192.168.163.132:6379 192.168.163.132:6380 192.168.163.132:6381 192.168.163.132:6382 192.168.163.132:6383 192.168.163.132:6384 --cluster-replicas 1
添加集群主节点
redis-cli --cluster add-node 192.168.163.132:6382 192.168.163.132:6379
添加集群从节点
redis-cli --cluster add-node 192.168.163.132:6382 192.168.163.132:6379 --cluster-slave --cluster-master-id 117457eab5071954faab5e81c3170600d5192270
删除节点
redis-cli --cluster del-node 192.168.163.132:6384 f6a6957421b80409106cb36be3c7ba41f3b603ff
检查集群说明:任意连接一个集群节点,进行集群状态检查
redis-cli --cluster check 192.168.163.132:6384 --cluster-search-multiple-owners
集群信息查看
redis-cli --cluster info 192.168.163.132:6384
修复集群
redis-cli --cluster fix 192.168.163.132:6384 --cluster-search-multiple-owners
设置集群的超时时间
redis-cli --cluster set-timeout 192.168.163.132:6382 10000
集群中执行相关命令
说明:连接到集群的任意一节点来对整个集群的所有节点进行设置。
redis-cli --cluster call 192.168.163.132:6381 config set requirepass cc
redis-cli -a cc --cluster call 192.168.163.132:6381 config set masterauth cc
redis-cli -a cc --cluster call 192.168.163.132:6381 config rewrite
redis在线迁移集群内部扩容缩容:
redis-cli -a cc --cluster reshard 192.168.163.132:6379 --cluster-from 117457eab5071954faab5e81c3170600d5192270 --cluster-to 815da8448f5d5a304df0353ca10d8f9b77016b28 --cluster-slots 10 --cluster-yes --cluster-timeout 5000 --cluster-pipeline 10 --cluster-replace
平衡集群中各个节点的slot数量
redis-cli -a cc --cluster rebalance 192.168.163.132:6379
导入集群
redis-cli --cluster import 192.168.163.132:6379 --cluster-from 192.168.163.132:9021 --cluster-replace
操作命令总结
hash 类型操作
hlen hbb 统计filed个数
hkeys hbb显示所有filed
hvals hbb显示所有filed的值
hset hmset hbb 都可以设置hash类型的key 也可以新增filed
hdel hbb cc aa 删除一个或者多个filed
hgetall hbb 获取所有filed对应的值
hget hbb oo 获取指定filed对应的值只能获取一个
hmget hbb oo 获取指定filed对应的值只能获取一个
hdel hbb filed 可以删除多个filed
HSETNX key field value 没有指定filed才能设置成功。
HSCAN hbb 0 match nn* count 10 hash数据模糊匹配filed 返回filed和file的对应的value
HRANDFIELD hbb 2 WITHVALUES 默认随机返回2个filed 带上WITHVALUES 返回 field对应的value
HSTRLEN hbb nn1 返回指定filed的对应value的长度
string 类型操作
APPEND mykey "Hello" 字符串后面追加
DECR mykey 数字类型key -1
DECRBY mykey 2 数字类型key -2或者指定数字
get mykey 获取指定key的value
getdel mykey 获取指定key的value然后删除 只能被访问一次
getex mykey ex 100 获取key并更新或者设置过期时间
GETRANGE mykey 0 2 返回value为字符串key的指定长度,对数字无效
getset mykey 22 获取指定key的value 并设置新的value
INCR mykey 指定key的value+1
INCRby mykey 2 指定key的value+2
INCRBYFLOAT mykey 0.4 指定key的value+0.4
mget key1 key2 获取多个值 跨solt不建议使用
MSET key1 "Hello" key2 "World" (error) CROSSSLOT Keys in request don't hash to the same slot 跨solt不建议使用
SETEX key1 10 'dsad' 设置或者更新指定key的过期时间和 set key1 'dsad' ex 10 效果一样
SETNX key value 没有key的时候可以设置成功 一般用于分布式锁
SETRANGE key1 6 "Redis" 从key1的第六位开始替换为redis
strlen key1 返回字符串的长度
SUBSTR key1 1 10 截取key1 自动长度的字符串
list类型操作
BLMOVE 是Redis中的一个阻塞命令 用于在不同的阻塞列表之间移动元素 不建议生产环境使用。
BLMPOP 是Redis中的一个阻塞命令和blop不同的情况他可以阻塞多个list
BLPOP list1 10 在list1没有数据的情况下阻塞连接10秒 ,有数据库会立刻从list1 最前面弹出一个 一般用作消息队列
BRPOP list1 10 在list1没有数据的情况下阻塞连接10秒 ,有数据库会立刻从list1 最后弹出一个 一般用作消息队列
BRPOPLPUSH {list}1 {list}2 10 从{list}1最后数据弹出 放在{list}2最前面 {list}1没有数据会阻塞当前连接10秒
lrange {list}1 0 -1 取 {list}1全量
lpush {list}1 11 前面插入 11 列表不存在时操作有效
RPUSH {list}1 11 后面插入 11 列表不存在时操作有效
LPUSHX {list}1 211 将一个值插入到已存在的列表头部,列表不存在时操作无效
RPUSHX {list}1 211 将一个值插入到已存在的列表尾部,列表不存在时操作无效
LSET {list}1 -1 dasd 更新列表最后一个成员为dasd
llen {list}1 返回 {list}1长度
LPOS {list}1 11 count 2 返回11的index 有返回前2个11的index
lpop {list}1 1 从前面弹出一个成员
rpop {list}1 1 从后面弹出一个成员
lrem {list}1 1 211 从{list}1 删除211一次
LTRIM {list}1 1 3 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除只保留index 1,2,3
RPOPLPUSH {list}1 {list}2 从{list}1尾部取出一个元素插入到{list}2的头部
集合类型操作
sadd {sa}2 555 11 集合{sa}2 增加555 11成员 不能重复
scard {sa}2 显示集合{sa}2成员数量
SDIFF {sa}2 {sa}1 显示{sa}2 {sa}1 的差集
SDIFFSTORE {sa}3 {sa}2 {sa}1 显示{sa}2 {sa}1 的差集结果放在 {sa}3
SINTER {sa}2 {sa}1 显示{sa}2 {sa}1 的交集
SISMEMBER {sa}2 11 判断11是否是{sa}2的成员 是返回1 不是返回0
SMEMBERS {sa}2 显示所有成员
SMISMEMBER {sa}2 77 11 分别判断77 11是否是{sa}2的成员 是返回1 不是返回0
SMOVE {sa}2 {sa}1 11 把{sa}2的成员11移动到 {sa}1
SPOP {sa}2 1 从集合 {sa}2弹出一个成员
SRANDMEMBER {sa}2 2 从{sa}2随机返回2个成员
srem {sa}2 11 从{sa}2删除11成员
SSCAN {sa}2 0 match 'd' count 10 从{sa}2匹配含有d的成员 一次返回10个
scan 0 match 's' count 10 返回key名字带有s的key 一次轮询10个
SUNION {sa}2 {sa}1 取{sa}2 {sa}1的并集
SUNIONSTORE {sa}5 {sa}2 {sa}1 取{sa}2 {sa}1的并集 放在{sa}5里面
有序集合类型操作
zadd {zhh}1 20 bb 有序集合{zhh}1新增一个成员
zcard {zhh}1 显示 有序集合{zhh}1 成员数量
ZCOUNT {zhh}1 10 20 统计有序集合{zhh}1指定分值scores范围内 成员数量
Zdiff 2 {zset}2 {zset}1 两个有序集合{zset}1 {zset}2的差集 2代表2个key
ZDIFFSTORE {zset}4 2 {zset}2 {zset}1 两个有序集合{zset}1 {zset}2的差集 2代表2个key 结果放在{zset}4
ZINCRBY {zset}1 2 one 给有序集合{zset}1的one +2分数
ZINTER 2 {zset}1 {zset}2 给有序集合{zset}1 {zset}2的交集 2代表2个key
ZINTERstore {zset}7 2 {zset}1 {zset}2 给有序集合{zset}1 {zset}2的交集 2代表2个key 结果放在{zset}7
ZLEXCOUNT myzset [b [f 命令在计算有序集合中指定字典区间内成员数量
ZLEXCOUNT myzset (b (f 命令在计算有序集合中不在指定字典区间内成员数量
ZLEXCOUNT myzset - + 命令在计算有序集合中成员数量
ZMSCORE myzset a b c 返回有序集合myzset a b c成员的分数
ZPOPMAX myzset 2 弹出有序集合myzset 分数最大2个成员
ZPOPMIN myzset 2 弹出有序集合myzset 分数最小2个成员
ZRANDMEMBER myzset 2 从有序集合myzset随机弹出2个成员
zrange myzset 10 20 byscore withscores 返回指定分数在10-20区间的成员
zrange myzset [a [g BYLEX 返回 命令在计算有序集合中指定字典区间 [a [g内成员
ZRANGEBYLEX 和zrange myzset [a [g BYLEX 一样
ZRANGEBYSCORE myzset 10 20 返回有序集合myzset 10-20区间的成员
ZRANGESTORE {myzset}2 myzset 10 20 byscore 返回有序集合myzset 10-20区间的成员 放在有序集合 {myzset}2
zrank myzset ff1 命令返回有序集myzset中成员ff1的排名
ZREM myzset ff1 删除有序集myzset中成员ff1
ZREMRANGEBYLEX myzset [d [f 删除有序集合myzset在指定字典区间内成员
ZREMRANGEBYRANK myzset 0 1 删除有序集合myzset在指定0 1排名的成员 默认是asc正序排列
ZREMRANGEBYSCORE myzset 0 10 删除有序集合myzset 分数在0-10的所有成员
ZSCORE myzset vv 返回有序集合myzset 成员vv的分数
ZREVRANGE myzset 0 -1 返回有序集合myzset成员分数倒序排列
ZREVRANGEBYLEX myzset [ee [dd 指定范围内的成员列表
ZREVRANGEBYSCORE 和ZREVRANGE myzset 0 -1 WITHSCORE
ZREVRANK myzset ff 倒序显示ff 的index
ZSCAN myzset 0 match 'd' count 10
ZUNION 2 {myzset}2 {myzset}1 返回{myzset}2 {myzset}1的并集
geo地址位置数据类型操作
geoadd:添加地理位置的坐标。
geoadd:添加地理位置的坐标。
geopos:获取地理位置的坐标。
GEODIST Sicily Palermo Catania km:计算两个位置之间的距离。
GEORADIUS Sicily 15 37 200 km WITHDIST:根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。
GEORADIUS_RO 是 Redis 的一个扩展命令,通常用于在进行只读的地理位置查询时使用。与标准的 GEORADIUS 命令相比,GEORADIUS_RO 具有以下特点:只读操作:GEORADIUS_RO 是只读操作,不会对 Redis 的数据集产生写入影响。无锁操作:由于只执行只读操作,GEORADIUS_RO 不需要获取锁来访问地理位置数据,因此不会阻塞其他写入操作。
降低延迟:由于不需要执行写入操作,GEORADIUS_RO 在一些情况下可能具有更低的延迟
georadiusbymember: Redis 中用于地理位置(Geo)操作的命令之一,用于按照指定的地理位置成员查询附近的其他成员。
georadiusbymember_ro: 只读操作
gGeoHash功能是通过将二维的经纬度信息转换为一维的字符串来实现的,这种字符串被称为GeoHash。该算法将二维坐标映射到一个52位的整数上,并以Base32编码形式存储
GEOSEARCH Sicily FROMLONLAT 15 37 BYBOX 400 400 km ASC WITHCOORD WITHDIST 命令用于在地理空间索引中查询成员,通常用于基于用户位置查找附近的商店、服务或兴趣点。该命令允许用户根据中心点的给定半径或矩形区域进行搜索
Redis通用命令
migrate 127.0.0.1 6380 hello 0 1000 表示从当前Redis迁移hello键到 127.0.0.1 6380 的db0 超时时间是1000毫秒
migrate 127.0.0.1 6380 "" 0 5000 keys key1 key2 key3 [COPY] [REPLACE] [AUTH password] [AUTH2 username passw] 默认是move 迁移多个key
OBJECT ENCODING dolly 对象的内部编码(encoding)是存储和管理数据的关键因素之一。每种数据类型可以采用多种不同的编码方式,以优化内存使用和提高性能
PERSIST 命令用于移除给定键的过期时间,使得该键永不过期
PEXPIRE key milliseconds 设置过期时间 单位毫秒
RANDOMKEY 返回随机一个key
RENAME key newkey 重命名
RENAMENX key newkey 当newkey不存在才会成功。
SCAN 0 MATCH 'ds' COUNT 100 显示匹配ds*的key
TOUCH命令,该命令用于修改键的最后访问时间
WAIT命令是一个非常重要的功能,它用于确保数据的一致性和高可用性。该命令通过阻塞当前客户端,直到所有先前的写入命令成功传输并被指定数量的从节点确认为止
PFADD命令用于将所有元素参数添加到指定的HyperLogLog数据结构中
PUB/SUB 消息发布订阅
Redis的发布订阅(Publish/Subscribe,简称Pub/Sub)是一种消息通信模式,允许生产者(发布者)向多个消费者(订阅者)广播消息,而无需直接知道对方的存在。这种模式对于实现松耦合的应用程序非常有用。
PSUBSCRIBE [pattern [pattern ...]]命令用于订阅一个或多个符合给定模式的频道,以便接收所有匹配这些模式的频道上发布的消息
PUBLISH命令可以实现消息的发布功能。具体来说,当一个客户端发送PUBLISH命令时,它会将消息发送到指定的频道(Channel)
PUBSUB CHANNELS命令可以列出当前Redis服务器上所有活跃的频道
PUBSUB NUMPAT命令用于获取当前所有客户端订阅的模式数量。这个命令返回的是客户端订阅的所有模式的数量总和,而不是订阅模式的客户端数量
PUBSUB NUMSUB命令用于获取指定频道的订阅者数量,但不包括那些订阅了模式(pattern)的客户端。这个命令可以用来监控和统计特定频道的订阅情况,从而帮助了解Redis发布/订阅系统的使用情况和负载。
PUNSUBSCRIBE [pattern [pattern ...]] 命令用于指示客户端退订所有给定模式的频道。如果未指定任何模式,即执行一个无参数的PUNSUBSCRIBE调用,那么客户端将退订使用PSUBSCRIBE命令订阅的所有模式,并且命令会返回一个信息,告知客户端所有被退订的模式
SUBSCRIBE channel命令用于让客户端订阅一个或多个频道(channel)。当有新消息通过PUBLISH命令发送到被订阅的频道时,这些消息会自动推送到所有订阅该频道的客户端
Unsubscribe 命令用于退订给定的一个或多个频道的信息
Config Resetstat 命令用于重置 INFO 命令中的某些统计数据,包括:
Keyspace hits (键空间命中次数)
Keyspace misses (键空间不命中次数)
Number of commands processed (执行命令的次数)
Number of connections received (连接服务器的次数)
Number of expired keys (过期key的数量)
Number of rejected connections (被拒绝的连接数量)
Latest fork(2) time(最后执行 fork(2) 的时间)
The aof_delayed_fsync counter(aof_delayed_fsync 计数器的值)
LATENCY DOCTOR 回复人类可读的延迟分析报告
LATENCY GRAPH event 以文本图表方式展示
LATENCY RESET event 重置一个或多个 events 的延迟时间序列数据为零,如果不指定参数 event,则表示重置所有的 events。
LATENCY HISTORY event 返回最多160条的给定 event 的延迟时间序列(延迟发生时的时间戳和延迟毫秒数)
LATENCY LATEST 返回所有事件的最新延迟样本
PSYNC replicationid offset用于复制功能(replication)的内部命令。用于在 slave 节点上执行这个命令向 master 节点请求复制流。{replicationid} 为master的运行id;{offset}为slave自己的复制偏移量
REPLCONF ACK 主从服务器可以通过发送和接收REPLCONF ACK命令来检查两者之间的网络连接是否正常:如果主服务器超过一秒钟没有收到从服务器发来的REPLCONF ACK命令,那么主服务器就知道主从服务器之间的连接出现问题了
REPLICAOF 命令可以在线修改当前服务器的复制设置。如果当前服务器已经是副本服务器,命令REPLIACOF NO ONE 会关闭当前服务器的复制并转变为主服务器。执行 REPLIACOF hostname port 会将当前服务器转变为 hostname 服务器的副本服务器。
Redis Slaveof 命令可以将当前服务器转变为指定服务器的从属服务器(slave server)。
如果当前服务器已经是某个主服务器(master server)的从属服务器,那么执行 SLAVEOF host port 将使当前服务器停止对旧主服务器的同步,丢弃旧数据集,转而开始对新主服务器进行同步。另外,对一个从属服务器执行命令 SLAVEOF NO ONE 将使得这个从属服务器关闭复制功能,并从从属服务器转变回主服务器,原来同步所得的数据集不会被丢弃。
流stream数据类型
XADD mystream * aa bb 新增一个mystream留数据类型 * 代表自动指定id
xlen mystream 返回mystream长度
XACK 这个命令用于删除消费者组的pending entries list中的元素
XCLAIM
这个命令用于改变pending消息的所有权,新的owner是命令参数中的consumer。
命令的使用场景是:
一个消费者关联了一个stream
消费者A通过XREADGROUP读取一条消息
这个消息被加入到PEL中,并发送给指定的消费者,但是没有调用XACK命令来确认
这时消费者突然挂掉
其他的消费者就会使用XPENDING命令检查待处理消息列表,为了继续处理这些命令,它们使用XCLAIM命令改变这些消息的所有者。
接下来解释一下命令的各个选项:
IDLE
:设置消息空闲时间,默认是0。消息只有在空闲时间大于IDLE时才会被认领。
TIME
:和IDLE相同,不过它是绝对时间
RETRYCOUNT
:设置重试次数,通常XCLAIM不会改变这个值,它通常用于XPENDING命令,用来发现一些长时间未被处理的消息。
FORCE:在PEL中创建待处理消息,即使指定的ID尚未分配给客户端的PEL。
JUSTID:只返回认领的消息ID数组,不返回实际消息
XDEL mystream 1721290192670-0 删除stream中的entry并返回删除的数量。
XGROUP
该命令用于管理stream相关的消费者组。使用XGROUP命令你可以:
创建与一个stream相关联的消费者组
销毁一个消费者组
从消费者组中删除指定的消费者
设置消费者组的last delivered ID
XGROUP CREATE mystream consumer-group-name $ 创建新的消费者组的命令
XGROUP DESTROY mystream some-consumer-group 销毁消费者组的命令即使消费者组存在活跃的消费者和等待消息,它仍然会被删除,所以执行这个命令需要格外谨慎
XGROUP DELCONSUMER mystream consumer-group-name myconsumer123 当一个新的consumer的名字被提到时,就会自动创建消费者。当消费者不再使用时,我们可以将它删除,上面的命令返回消费者在被删除之前所拥有的待处理消息。
XGROUP SETID mystream consumer-group-name 0 设置last delivered ID的命令是:
XINFO GROUPS mystream 这个命令用于获得stream相关的消费者组的信息
XINFO STREAM mystream 这个命令返回stream的通用信息
XPENDING 通过消费者组捕获数据,但不是确认这些数据。
XRANGE mystream - + 该命令用于返回stream中指定ID范围的数据,可以使用-和+表示最小和最大ID。ID也可以指定为不完全ID,即只指定Unix时间戳,就可以获取指定时间范围内的数据。
XREAD
用法:XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key …] ID [ID …]
从一个或多个stream中读取数据,仅返回ID大于调用者报告的最后接收ID的条目。
BLOCK项用于指定阻塞时长。STREAMS项必须在最后,用于指定stream和ID。
XREVRANGE 此命令与XRANGE唯一的区别是顺序相反。
Redis面试问题总结(你不知道的事情)
Redis-sentinel 模式的选举算法
Redis-sentinel模式选举master需要下面2步
Sentinel集群选举Leader
- 如果需要从redis集群选举一个节点为主节点,首先需要从Sentinel集群中选一个Sentinel节点作为Leader。
- 每一个Sentinel节点都可以成为Leader,当一个Sentinel节点确认redis集群的主节点主观下线后,会请求其他Sentinel节点要求将自己选举为Leader。被请求的Sentinel节点如果没有同意过其他Sentinel节点的选举请求,则同意该请求(选举票数+1),否则不同意。
- 如果一个Sentinel节点获得的选举票数达到Leader最低票数(quorum和Sentinel节点数/2+1的最大值),则该Sentinel节点选举为Leader;否则重新进行选举
Sentinel Leader决定新主节点 - 过滤故障的节点
- 选择优先级slave-priority最大的从节点作为主节点,如不存在则继续
- 选择复制偏移量(数据写入量的字节,记录写了多少数据。主服务器会把偏移量同步给从服务器,当主从的偏移量一致,则数据是完全同步)最大的从节点作为主节点,如不存在则继续
- 选择runid(redis每次启动的时候生成随机的runid作为redis的标识)最小的从节点作为主节点
Redis-cluster 模式只有master才有资格进行选举 - Cluster模式下面只有master才能资格进行选举投票
- Cluster模式下面内部节点通信是10000+6379来维护和投票的也叫总线接口
- 谁能成为主节点也是根据slave-priority,offset,runid
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)