- 仅仅了解即可
一、内存淘汰机制与算法
(一)内存淘汰机制
定义
- 当 Redis 运行内存已经超过 Redis 设置的最大内存之后,redis将触发内存淘汰机制,采用策略来删除符合条件的键值对,以此来保障 Redis 高效的运行。
Redis 最大运行内存
- 只有在 Redis 的运行内存达到了某个阀值,才会触发内存淘汰机制,这个阀值就是我们设置的最大运行内存,此值在 Redis 的配置文件中可以找到,配置顶为 maxmemkory。
# 查看设置的最大运行内存,默认0,表示是没有内存大小限制。 config get maxmemory # 查看 Redis 内存淘汰策略 config get maxmemory-policy # 内存淘汰策略种类,其中 allkeys-xxx 表示从所有的键值中淘汰数据,而 volatile-xxx 表示从设置了过期键的键值中淘汰数据。 noeviction:不淘汰任何数据,当内存不足时,新增操作会报错,Redis 默认内存淘汰策略; allkeys-lru:淘汰整个键值中最久未使用的键值; allkeys-random:随机淘汰任意键值; volatile-lru:淘汰所有设置了过期时间的键值中最久未使用的键值; volatile-random:随机淘汰设置了过期时间的任意键值; volatile-ttl:优先淘汰更早期的键值。 在 Redis 4.0 版本中又新增了 2 种淘汰策略: volatile-lfu:淘汰所有设置了过期时间的键值中,最少使用的键值; allkeys-lfu:淘汰整键值中最少使用的键值。
(二)内存淘汰算法
内存淘汰算法种类
- LRU 算法和 LFU 算法。
LRU 算法
- LRU 全称是 Least Recently Used 译为最少使用,是一种常用的页面换算法,选择最近最久使用的页面予以淘汰。
- 1.LRU 算法实现
- LRU 算法需要基于链表结构,链表中的元素按照操作顺序从前往后排列,最新操作的键会被移动到表头,当需要内存淘汰是、时,只需要删除链表尾部的元素即可。
- 2.近LRU 算法
- Redis 使用的是一种近似 LRU 算法,目的是为了更好的节约内存,它的实现方式是给现有的数据结构添加一个额外的字段,用于记录此键值得最后一次访问时间,Redis 内存淘汰时,会使用随机采样的方式来淘汰数据,它是随机取 5 个值(此值可配置),然后淘汰最久没有使用的那个。
- 3.LRU 算法缺点
- LRU 算法有一个缺点,比如说很久没有使用的一个键值,如果最近被访问了一次,那么它就不会被淘汰,即使它是使用次数最少的缓存,那它也不会被淘汰,因此在 Redis 4.0 之后引入了 LFU 算法,下面我们一起来看。
- 1.LRU 算法实现
LFU 算法
- LFU 全称是 Least Frequently Used 翻译为最不常用的,最不常用的算法是根据总访问次数来淘汰数据的,它的核心思想是 ‘如果数据过去被访问多次,那么将来被访问的频率也更高’。
二、Redis 性能测试
性能测试工具
- redis-benchmark 进行测试
- redis-benchmark 位于 Redis 的 src 目录下
性能测试方法
- 基准测试: ./redis-benchmark -h
- 不指定,默认参数
- 精简测试:./redis-benchmark -t set,get,incr -n 1000000 -q
- -q 指定输出结果为精简模式
- -t 表示指定测试指令
- -n 设置每个指令测试次数
- 管道测试:./redis-benchmark -t set,get,incr -n 1000000 -q -P 10
- -p 10 表示每次管道一次执行 10 个 Redis 命令,测试的结果有管道的是普通性能的8陪
性能测试的使用场景
- 1.技术选型,比如测试 Memcached 和 Redis;
2.对比单机 Redis 和集群 Redis 的吞吐量;
3.评估不同类型的存储性能,例如集合和有序集合;
4.对比开启持久化和关闭持久化得吞吐量;
5.对比调优和未调优的吞吐量;
6.对比不同 Redis 版本的吞吐量,作为是否升级的一个参考标准。
管道测试的影响元素
- 为什么每次执行 10 个 Redis 命令,Pipeline 的效率为什么达不到普通命令的 10 倍呢?这是因为会受到很大外部因素的影响,例如以下几个:
- 1.网络宽带和网络延迟可能是 Redis 操作最大的性能瓶颈,比如 10w q/s,平均每个请求负责传入 8 KB 的字符,那我们需要的理论宽带是 7.6 Gbits/s,如果服务器配置的是 1Gbits/s,那么一定会有很多信息在排队等候传输,因此运行效率可想而知,这也是很多 Redis 生产环境之所以效率不高的原因;
- 2.CPU 可能是 Redis 运行的另一个重要的影响因素,如果CPU 的计算机能力跟不上 Redis 要求的话,也会影响 Redis 运行效率;
- 3.如果 Redis 的运行在虚拟机设备上,性能也会受影响,因为普通操作在虚拟机设备上会有额外的消耗;
- 4.普通操作和批量操作 (Pipeline)对 Redis 的吐量也有很大的影响。
三、Redis 慢查询
引入
- Redis 慢查询作用和 MySQL 慢查询作用类时,都是为我们查询出不合理的执行命令,从而让服务器更加高效和健康的运行。对于单线程的 Redis 来说,不合理的使用更是致命的,因此掌握 Redis 慢查询技能对我们来说非常的关键。
开启慢查询
'''
配置文件修改
'''
# 用于设置慢查询的评定时间,也就是说超过配置项的命令,将会被当成慢操作记录在慢查询日志中,它在执行单位是微秒(1秒等于 1000000 微秒)
slowlog-log-slower-than
# 用来配置慢查询日志的最大记录数。
slowlog-max-len
'''
linux命令
'''
#慢日志查询
slowlog get
# 查询指定条数慢查询
slowlog get n
# 获取慢查询队列长度
slowlog len
# 清空慢查询日志
lowlog reset
作用
- 可以定期检查慢查询日志,及时发现和改进 Redis 运行中不合理的操作。
四、Redis 的可视化管理工具
- 因为 Redis 官方只提供了命令行版的 Redis 客户端 redis-cli,以至于我们在使用的时候会比较麻烦,通常要输入一堆命令,而且命令行版本的客户端看起来也不够直观。
可视化管理工具
-
RedisClient: Jave 编写的 Redis 连接客户端,功能丰富、免费的。支持平台 Windows。地址:https://github.com/caoxinyu/RedisClient
-
Redis Desktop Manager: 一款基于 Qt5 的跨平台 Redis 桌面管理软件。收费、支持平台Windows、macOS、Linux。地址:https://github.com/uglide/RedisDesktopManager
-
AnotherRedisDesktopManager: 一款基于 Node.js 开发的 Redis、免费桌面管理器,它的特点就是相对来说比较稳定,在数据量比较大的时候不会崩溃。支持平台 Windows、macOS、Linux。地址:https://github.com/qishibo/AnotherRedisDesktopManager