Redis-单线程+IO多路复用+SCAN


单线程

Redis 的单线程主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,这也是 Redis 对外提供键值存储服务的主要流程。但 Redis 的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。

因为它所有的数据都在内存中,所有的运算都是内存级别的运算,而且单线程避免了多线程的切换性能损耗问题。正因为 Redis 是单线程,所以要小心使用耗时的指令(比如keys),一不小心就可能会导致 Redis 卡顿。

IO多路复用

Redis的IO多路复用:redis利用epoll来实现IO多路复用,将连接信息和事件放到队列中,依次放到文件事件分派器,事件分派器将事件分发给事件处理器。
查看redis支持的最大连接数,在redis.conf文件中可修改:CONFIG GET maxclients
IO多路复用

SCAN

KEYS是全量遍历,当数据量大时,性能很差,应用SCAN取代(手动分段遍历,直到游标为0停止遍历)
SCAN 0 match jxch** count 100
以0为游标,分段扫描以jxch开头的key,每次返回100个,然后以返回值为游标,继续扫描,直到返回的游标为0
注意,100是个参考值,实际返回的是接近100的数目,可能多也可能少(取决于HASH桶中有几个值,因为Redis的存储结构是哈希表)

如果在scan的过程中如果有键的变化(增加、 删除、 修改) ,那么遍历效果可能会碰到如下问题: 新增的键可能没有遍历到(不会扫描已经遍历过的HASH桶), 遍历出了重复的键(发生了RE-HASH)等情况, 也就是说SCAN并不能保证完整的遍历出来所有的键,这些是我们在开发时需要考虑的,但在追求性能的情况下,往往并不要求一致性。


文章作者: 钱不寒
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 钱不寒 !
  目录