#5 Redis 真是单线程的?
Redis 多线程 2021-01-20Redis 核心模块是单线程架构,其高效利用 epoll I/O 多路复用机制实现了单线程高并发。
但是 Redis 服务有很多模块,整体上来说是多线程的。
coding in a complicated world
Redis 核心模块是单线程架构,其高效利用 epoll I/O 多路复用机制实现了单线程高并发。
但是 Redis 服务有很多模块,整体上来说是多线程的。
对于一些热点数据,我们从 Redis 获取之后,常常会在本地线程中也存一份(或者根据语言不同,有些别的第三方组件来专门做这个),也可以有效减小网络消耗。
不过这也算是增加了一级缓存,不可避免的需要涉及数据的同步问题。如果需要比较强的实时性保障,我们就只能放弃采用这个缓存。
可现如今,Redis 能在数据过期
或数据更新
(包括重新设置导致 TTL 变化)之后通知客户端了,这也太贴心了吧。
如果可以的话,使用 redis-cli monitor
命令来输出所有 Redis 命令也很方便。
有时,条件不允许,或者 Redis 需要处理其他的连接,我希望将自己代码调用的 Redis 命令输出到日志中,方便调试。
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)