1. Redis删除策略
1.1 过期数据
- redis中数据的特征
- 具有时效性的数据(setex expire key )
- 永久有效的数据
- 已经过期的数据或被删除的数据或未定义的数据
1.2 删除策略
- 目标:在内存占用和cpu占用直接找到一个平衡,不会使redis性能下降,也不会导致内存泄露。
- 定时删除
- 方式:创建一个定时器,当key设置有过期时间,并且过期时间已经到了,由定时器任务立即执行key的删除命令。
- 优点:节约内存,时间到就删除,不会占用多余的内存。
- 缺点:CPU压力大,当执行定时器时,无论CPU负载如何,都会执行。在高负载情况下会影响redis服务器响应时间和指令吞吐量。
- 总结:用处理器性能换取内存空间(时间换空间)
- 惰性删除
- 方式:当数据达到过期时间,不做处理,等下次再访问该数据时,如果未过期,则返回数据;如果已过期就删除key,返回不存在。
- 优点:节约CPU性能,发现必须删除的时候才删除。
- 缺点:内存压力较大,会出现长期占用内存的数据。
- 总结:用存储空间换取CPU性能(空间换时间)
- 定期删除
- 方式:周期性轮询redis库中的时效性数据,采用随机抽取策略,利用过期数据占比来控制删除频率。
- 特点1:CPU性能占用设置峰值,检测频率可以自定义设置。
- 特点2:内存定期随机清理,每秒话费固定CPU资源维护内存。
- 总结:周期性抽查存储空间(随机抽取,重点抽取)
1.3 逐出算法
-
问题:当新数据进来发现内存不足怎么处理?
-
Redis使用内存存储数据,在执行每一个命令前都会调用
freememoryIfNeeded()
检测内存是否充足。如果内存不满足新加入数据的最低存储要求,redis要临时删除一些数据为当前指令清理内存空间,清理数据的策略称为逐出算法。 -
逐出数据的过程不是100%能够清理出足够可使用的内存空间,如果不成功则反复执行。当对所有数据尝试完毕后,如果不能达到内存清理的要求,将出现错误信息。
(error)OOM command not allowed when used memory > 'maxmemory'
-
-
相关配置
- 最大可使用内存:maxmemory(占用物理内存的比例,默认值为0,表示不限制,通常设置50%以上)
- 每次选取待删除数据的个数:maxmemory-samples(选取数据时并不会全库扫描,导致严重的性能消耗,降低读写性能,而是随机获取数据的方式作为待检测删除数据)
- 删除策略:maxmemory-policy(达到最大内存之后,对被挑选出来的数据进行删除的策略)
-
算法
- 检测易失数据(可能会过期的数据集server.db[i].expires)
- volatile-lru:挑选最近最少使用的数据淘汰
- volatile-lfu:挑选最近使用次数最少的数据淘汰
- volatile-ttl:挑选将要过期的数据淘汰
- volatile-random:任意选择数据淘汰
- 检测全库数据(所有数据集server.db[i].dict)
- allkeys-lru:挑选最近最少使用的数据淘汰
- allkeys-lfu:挑选最近使用次数最少的数据淘汰
- allkeys-random:任意选择数据淘汰
- 放弃数据驱逐
- no-enviction(驱逐):禁止驱逐数据(redis-4.0默认策略),会引发OOM
- 检测易失数据(可能会过期的数据集server.db[i].expires)
-
依据
- 使用INFO命令输出监控信息,查询缓存hit和miss的次数,根据业务需求调优redis配置
2. Redis核心配置
2.1 服务端配置
- 设置服务器以守护进程的方式运行:daemonize yes|no
- 绑定主机地址:bind 127.0.0.1
- 设置服务器端口:port 6379
- 设置数据库数量:databases 16
2.2 日志配置
-
设置服务器指定日志记录级别:loglevel debug|verbose|notice|warning
-
日志记录文件名:logfile 端口号.log
注意:日志级别开发期设置为verbose即可,生产环境中配置为notice,简化日志输出量,降低写IO的频率
2.3 客户端配置
- 设置同一时间最大客户端连接数,默认无限制。当客户端连接到达上限,Redis会关闭新的连接
- maxclients 0
- 客户端闲置等待最大时长,达到最大值后关闭连接。如需关闭该功能,设置为0
- timeout 300 (单位:s)
2.4 多服务器快捷配置
- 导入并加载指定配置文件信息,用于快速创建公共配置较多的redis实例,将公共的配置抽取出来,便于维护。
- include /path/server-端口号.conf
评论区