Redis FAQ
AOF base file appendonly.aof.1.base.rdb
AOF incr file appendonly.aof.1.incr.aof
# delete by pattern
redis-cli -p 6379 --scan --pattern 'city:*' -i 0.01 | xargs -L 100 redis-cli -p 6379 unlink
Replica vs Slave
- 含义完全相同
- slaveof = replicaof
- 是因为调整了名词 redis#5335
Queue: List vs PubSub vs Stream vs ZSet
都能实现消息队列能力,但场景不同
- List
- 存储数据
- 不能重复消费 - POP 后就不存在了
- Pub/Sub
- 不存储数据 - 用于传递信息 - 实现异步/同步通讯
- at-most-once, fire & forget, fan-out
- 没有 Sub 时 Pub 是无意义的
- 可用于订阅系统事件 - keyspace, keyevent - 需要调整配置 键变化通知
- 支持 pattern - 例如
system.events.*
- 不存储数据 - 用于传递信息 - 实现异步/同步通讯
- Stream
- 存储数据 - 有消费者、消费组概念
- 能重复消费 - at-most-once 或 at-least-once
- 有更多消息队列的概念 - 例如: 消息 ID、时间戳、 ACK
- 能实现 List 和 Pub/Sub 的所有语义
- 可以不阻塞
- ZSet
- 有序集合
- score 为 double
- key 会去重
- 可作为消息队列,基于 key/offset 消费
MISCONF Redis is configured to save RDB snapshots
MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled.
redis-cli
# config set stop-writes-on-bgsave-error no
RESP3
- 目前的 RESP 是 QA 模式,性能和处理能力上有限
- 发送 HELLO 判断是否支持 RESP3
ERR max number of clients reached
- client 默认 timeout 为 0,可尝试添加 timeout 在服务端关闭链接
- maxclients 默认 10,000
# 如果增加了 maxclients 也要增加系统限制
ulimit -Sn 100000
sysctl -w fs.file-max=100000
LOCK
- key 为 lock name
- value 为 holder
acquire
SET key uuid PX timeout NX
release
if redis.call('GET', KEYS[1]) == ARGV[1] then
return redis.call('DEL', KEYS[1])
end
return 0
extend
if redis.call('GET', KEYS[1]) == ARGV[1] then
return redis.call('PEXPIRE', KEYS[1], ARGV[2])
end
return 0
- 其他方案
WATCH key # Begin watching the key for changes
GET key # Retrieve its value, return an error if not equal to the lock's UUID
MULTI # Start transaction
DEL key # Delete the key
EXEC # Execute the transaction, which will fail if the key had expired