单线程
Redis是单线程吗?
Redis的单线程主要是指Redis的网络IO和键值对读写是由一个线程来完成的,这也是
Redis对外提供键值存储的主要流程。但Redis的其他功能,比如持久化、异步删除、
集群数据同步等,其实是由额外的线程执行的
Redis单线程为什么还能这么块?
因为它所有的数据都在内存中,所有的运算都是内存级别的运算,而且单线程避免了
多线程的切换性能损耗问题。正因为Redis是单线程,所以要小心使用Redis指令,对于
那些耗时的指令(比如keys *)一定要谨慎使用,一不小心就可能会导致Redis卡顿
Redis单线程如何处理那么多的并发客户端连接?
Redis的IO多路复用:redis利用epoll来实现IO多路复用,将连接信息和事件放到队列中,
依次放到文件事件分派器,事件分派器将事件分发给事件处理器
#查看Redis支持最大连接数,在redis.conf文件中可修改 # maxclients 100000
CONFIG GET maxclients
keys:全量遍历。
用来列出所有满足特定正则字符串规则的key,当redis数量比较大时,性能比较查,要避免使用
scan:渐进式遍历键
SCAN cursor [MATCH pattern] [COUNT count]
参数解析
scan参数提供了三个参数,
第一个是cursor整数值(hash桶的索引值),
第二个是key的正则模式,
第三个是一次遍历的key的数量(参考值,底层遍历的数量不一定),并不是符合条件的结果数量。第一次遍历时,cursor值为0,然后将返回结果中第一个整数值作为下一次遍历的cursor.一直遍历到返回的cursor值为0时结束。
注意事项
注意:但是scan并非完美无瑕,如果在scan的过程中如果有键的变化(增加、删除、修改),那么遍历效果可能会碰到如下问题:新增的键可能没有遍历到,遍历出了重复的键等情况,也就是说scan并不能保证完整地遍历出来所有的键。
info:查看redis服务运行信息,分为9大块,每个块都有非常多的参数。
Server服务器运行的环境参数
Clients客户端相关信息
Memory服务器运行内存统计数据
Persistence持久化信息
Stats通用统计数据
Replication主从复制相关信息
CPU CPU使用情况
Cluster集群信息
KeySpace键值对统计数量信息
常用参数
connected_clients #正在连接的客户端数量
instantaneous_ops_per_sec #每秒执行多少指令
used_memory
- 含义:Redis分配的内存总量(byte),包含redis进程内部的开销和数据占用的内存
- 衡量标准:此指标包括Redis分配的所有内存,但不考虑该内存是否被操作系统回收,因此它表示Redis分配的总内存大小,而不一定是实际占用的内存
used_memory_human #Redis分配的内存总量(Kb,human会展示出单位)
used_memory_rss_human
- 含义:表示Redis进程实际使用的物理内存(Resident Set Size)包括了被分配但未使用的内存和共享的库和数据
- 衡量标准:该指标考虑了Redis进程实际占用的内存,包括了数据、缓存、连接等,以及被操作系统回收但仍保留在内存中的部分,这提供了一个更准确的关于Redis实际内存占用的视图
- 区别:在一些情况下,used_memory_rss可能会比used_memory大,因为它包含了未使用的内存和被操作系统回收但仍然在内存中的部分,其他情况下,它们可能非常接近,具体取决于Redis实例的工作负载和操作系统的内存管理。这两个指标都可以用于监控Redis的内存使用情况,但used_memory_rss提供了更接近实际占用的内存的信息