Redis笔记
Redis 单线程
Redis 是单线程吗?
Redis的单线程主要是指 Redis的网络IO和键值读写是由一个线程完成的,但Redis功能:持久化、异步删除、集群数据同步等,都是由额外的线程来实现的。
Redis 为什么能这么快?
- 数据是存储在 内存 中,运算都是在内存中进行
- 单线程 避免线程切换带来的性能损耗问题
- 避免耗时指令的执行!会导致 Redis卡顿
Redis单线程如何处理那么多并发客户端连接?
靠的是Redis的 IO多路复用,redis利用 epoll 来实现IO多路复用
- 将连接信息和事件放到队列中
- 依次放到文件事件分派器
- 事件分派器将事件分发给事件处理器
Redis处理事件和连接流程
# 查看redis支持的最大连接数,在redis.conf文件中可修改,# maxclients 10000
127.0.0.1:6379> CONFIG GET maxclients
##1) "maxclients"
##2) "10000"
高级命令
keys
定义:
全量遍历键,用来列出所有满足特定正则字符串规则的key,当 redis数据量比较大时,要避免使用
例子:
scan
定义:
渐进式遍历键 scan cursor [匹配模板] [遍历key的数量]
- cursor —— hash桶的索引值
- 遍历key的数量 —— 一次遍历多少个key,是一个大概的值,不一定准确
注意:
scan不保证能完整的遍历出所有的键,scan过程中如果有键的变化,则
- 新增的键可能没有遍历到
- 遍历到重复的键
例子:
Info
定义:
查看 redis 服务运行信息,分为
-
Server —— 服务器运行的环境参数
connected_clients:2 # 正在连接的客户端数量 instantaneous_ops_per_sec:789 # 每秒执行多少次指令 used_memory:929864 # Redis分配的内存总量(byte),包含redis进程内部的开销和数据占用的内存 used_memory_human:908.07K # Redis分配的内存总量(Kb,human会展示出单位) used_memory_rss_human:2.28M # 向操作系统申请的内存大小(Mb)(这个值一般是大于used_memory的,因为Redis的内存分配策略会产生内存碎片) used_memory_peak:929864 # redis的内存消耗峰值(byte) used_memory_peak_human:908.07K # redis的内存消耗峰值(KB) maxmemory:0 # 配置中设置的最大可使用内存值(byte),默认0,不限制 maxmemory_human:0B # 配置中设置的最大可使用内存值 maxmemory_policy:noeviction # 当达到maxmemory时的淘汰策略
-
Clients —— 客户端相关信息
-
Memory —— 服务器运行内存统计数据
-
Persistence —— 持久化信息
-
Stats —— 通用统计数据
-
Replication —— 主从复制相关信息
-
CPU —— CPU 使用情况
-
Cluster —— 集群信息
-
KeySpace —— 键值对统计数量信息