#5 Redis 真是单线程的?

2021-01-20

Redis 核心模块是单线程架构,其高效利用 epoll I/O 多路复用机制实现了单线程高并发。
但是 Redis 服务有很多模块,整体上来说是多线程的。

#4 Redis 客户端缓存

2021-01-17

对于一些热点数据,我们从 Redis 获取之后,常常会在本地线程中也存一份(或者根据语言不同,有些别的第三方组件来专门做这个),也可以有效减小网络消耗。
不过这也算是增加了一级缓存,不可避免的需要涉及数据的同步问题。如果需要比较强的实时性保障,我们就只能放弃采用这个缓存。
可现如今,Redis 能在数据过期数据更新(包括重新设置导致 TTL 变化)之后通知客户端了,这也太贴心了吧。

#2 Python Redis Debug

2018-05-06

如果可以的话,使用 redis-cli monitor 命令来输出所有 Redis 命令也很方便。

有时,条件不允许,或者 Redis 需要处理其他的连接,我希望将自己代码调用的 Redis 命令输出到日志中,方便调试。

#1 Redis 获取所有 key

2018-01-10

测试环境

keys *

删除指定模式的 key:

redis-cli keys 'a.b.*' > /tmp/deleted_keys
cat /tmp/deleted_keys
cat /tmp/deleted_keys | xargs redis-cli del

线上环境

线上 keys 可能会导致严重的性能问题。

2.8 开始,Redis 增加了 4 个 SCAN 命令:

  • SCAN cursor [MATCH pattern] [COUNT count] [TYPE type] 遍历当前 db 中的所有键, 返回 keys ...
  • SSCAN key cursor [MATCH pattern] [COUNT count] 遍历 set 类型,返回 value ...
  • HSCAN key cursor [MATCH pattern] [COUNT count] 遍历 hash 类型,返回 (key, value)
  • ZSCAN key cursor [MATCH pattern] [COUNT count] 遍历 sorted set 类型,返回 (score, member)
scan 0 count 100

每次会返回一个新的游标,用于下一次 scan 请求。

import redis
r = redis.StrictRedis(host='localhost', port=6379, db=0)
for key in r.scan_iter():
    print(key)