一、redis性能管理
(1) redis-cli
127.0.0.1:6379> info memory
(2) redis-cli info memory
- used_memory_rss:是Redis向操作系统申请的内存。
- used_memory:是Redis中的数据占用的内存。
- used_memory_peak:redis内存使用的峰值。
1.2内存碎片
内存碎片率=Redis向操作系统申请的内存 / Redis中的数据占用的内存
mem_fragmentation_ratio = used_memory_rss / used_memory
mem_fragmentation_ratio:内存碎片率。
redis-cli info memory |grep ratio
内存碎片产生的原因
- Redis内部有自已的内存管理器,为了提高内存使用的效率,来对内存的申请和释放进行管理。
- Redis中的值删除的时候,并没有把内存直接释放、交还给操作系统,而是交给了Redis内部有内存管理器。
- Redis中申请内存的时候,也是先看自己的内存管理器中是否有足够的内存可用。
- Redis的这种机制,提高了内存的使用率,但是会使Redis中有部分自己没在用,却不释放的内存,导致了内存碎片的发生。
内存碎片率对redis的影响
- 内存碎片率在1到1.5之间是正常的,这个值表示内存碎片率比较低,也说明Redis 没有发生内存交换。
- 内存碎片率超过1.5,说明Redis消耗了实际需要的物理内存的150%,其中50%是内存碎片率。
- 内存碎片率低于1的,说明Redis内存分配超出了物理内存,操作系统正在进行内存交换(使用虚拟内存,会降低性能)。需要增加可用物理内存或减少Redis内存占用。
解决碎片率过大的方法
- 如果你的Redis版本是4.0以下的,需要在redis-cli 工具上输入shutdown save命令,让Redis数据库执行保存操作并关闭Redis服务,再重启服务器。Redis服务器重启后,Redis 会将没用的内存归还给操作系统,碎片率会降下来。
- Redis4.0版本开始,可以在不重启的情况下,线上整理内存碎片,将未使用的内存归还给操作系统。
config set activedefrag yes #自动碎片清理
memory purge #手动碎片清理
1.3内存使用率
redis实例的内存使用率超过可用最大内存,操作系统将开始进行内存与swap空间交换。
避免内存交换发生的方法:
- 针对缓存数据大小选择安装Redis 实例
- 尽可能的使用Hash数据结构存储
- 设置key的过期时间
1.4内回收key
内存清理策略,保证合理分配redis有限的内存资源。
当内存使用达到设置的最大阈值时,需选择一种key的回收策略,默认情况下回收策略是禁止删除(noenviction)。配置文件中修改 maxmemory-policy 属性值:
im /etc/redis/6379.conf
---598行----
maxmemory-policy noenviction #修改max-memory-policy属性值
##回收策略有以下几种:##
●volatile-lru
#使用LRU算法从已设置过期时间的数据集合中淘汰数据
(移除最近最少使用的key,针对设置了TTL的key)
●volatile-ttl
#从已设置过期时间的数据集合中挑选即将过期的数据淘汰
(移除最近过期的key)
●volatile-random
#从已设置过期时间的数据集合中随机挑选数据淘汰
(在设置了TTL的key里随机移除)
●allkeys-lru
#使用LRU算法 从所有数据集合中淘汰数据
(移除最少使用的key,针对所有的key)
●allkeys-random
#从数据集合中任意选择数据淘汰(随机移除key)
●noenviction
#禁止淘汰数据(不删除直到写满时报错)
二、redis的优化策略
2.1设置Redis客户端连接的超时时间
vim /etc/redis/6379.conf
-----114行------
114 timeout 0
#单位为秒(s),取值范围为0~100000。默认值为0,表示无限制,即Redis不会主动断开连接,即使这个客户端已经空闲了很长时间。
#例如可设置为600,则客户端空闲10分钟后,Redis会主动断开连接。
#注意:在实际运行中,为了提高性能,Redis不一定会精确地按照timeout的值规定的时间来断开符合条件的空闲连接,例如设置timeout为10s,但空闲连接可能在12s后,服务器中新增很多连接时才会被断开。
2.2 设置redis自动碎片清理
config set activedefrag yes #自动碎片清理
memory purge #手动碎片清理
2.3设置redis最大内存阈值
内存阈值如果不设置,则没有限制,直到把服务器的内存干满、之后会使用交换分区。
设置内存阈值后,不会使用swap交换分区。且如果设置了key回收策略,当内存使用达到设置的最大阈值时,系统会进行key回收。
vim /etc/redis/6379.conf
-----567行------
567 # maxmemory <bytes>
568 maxmemory 1gb #例如设置最大内存阈值为1gb
三、redis雪崩、穿透、击穿的原因和解决方案
(1) redis雪崩
定义:缓存雪崩是指大量的应用请求无法在 Redis 缓存中进行处理,紧接着,应用将大量请求发送到数据库层,导致数据库层的压力激增。
一个简单的雪崩过程:
-
Redis 集群产生了大面积故障;
-
缓存失败,此时仍有大量请求去访问 Redis 缓存服务器;
-
在大量 Redis 请求失败后,这些请求将会去访问数据库;
-
由于应用的设计依赖于数据库和 Redis 服务,很快就会造成服务器集群的雪崩,最终导致整个系统的瘫痪。
产生的原因:
1)缓存中有大量数据同时过期,导致大量请求无法得到处理。
2)Redis 缓存实例发生故障宕机了
解决方案:
-
【事前】高可用缓存:高可用缓存是防止出