• http://www.redis.cn/commands/expire.html
  • http://www.redis.cn/topics/lru-cache.html

内存管理

当 Redis 作为缓存使用时(此时缓存仅作为热点数据提高服务的访问性能),需要考虑内存的限制,以及如何随着业务的增长,仅保留热点数据。

过期时间

Redis 所有的数据结构都可以设置过期时间,时间到了,Redis 会自动删除相应的对象。 需要注意的:

  • 过期expire是以对象为单位,比如一个 hash 结构的过期是整个 hash 对象的过期,而不是其中的某个子 key。
  • 如果一个字符串已经设置了过期时间,然后你调用了 set 方法修改了它,它的过期时间会消失。
127.0.0.1:6379> set  k1 aaa
OK
127.0.0.1:6379> expire k1 600
(integer) 1
127.0.0.1:6379> ttl k1
(integer) 597
127.0.0.1:6379> set k1  bbb
OK
127.0.0.1:6379> ttl k1
(integer) -1...

淘汰过期的 Keys

Redis keys过期有两种方式:被动和主动方式。

  • 被动

当一些客户端尝试访问它时,key会被发现并主动的过期。

  • 主动

当然,这样是不够的,因为有些过期的keys,永远不会访问他们。

无论如何,这些keys应该过期,所以定时随机测试设置keys的过期时间。所有这些过期的keys将会从密钥空间删除。

具体就是Redis每秒10次做的事情:

  • 1.测试随机的20个keys进行相关过期检测。
  • 2.删除所有已经过期的keys。
  • 3.如果有多于25%的keys过期,重复步奏1. 这是一个平凡的概率算法,基本上的假设是,我们的样本是这个密钥控件,

并且我们不断重复过期检测,直到过期的keys的百分百低于25%,这意味着,在任何给定的时刻,最多会清除1/4的过期keys。

内存淘汰

redis.conf 或 使用 CONFIG 命令配置 Redis的配置项:

maxmemory 100mb
maxmemory-policy [策略]

淘汰策略:

  • LRU - 最近很少没碰

    对最近很少使用(所有或有过期时间的)的key优先淘汰

    • allkeys-lru 尝试回收最少使用的键(LRU),使得新添加的数据有空间存放。
    • volatile-lru 尝试回收最少使用的键(LRU),但仅限于在过期集合的键,使得新添加的数据有空间存放。
  • LFU - 没碰多少次

对使用频率最少(所有或有过期时间的)的key优先淘汰

  • allkeys-lfu 尝试回收回收使用频率最少的键(LFU),使得新添加的数据有空间存放。
  • volatile-lfu 尝试回收使用频率最少的键(LFU),但仅限于在过期集合的键,使得新添加的数据有空间存放。
    • volatile-ttl 对有过期时间的key中ttl最小的部分优先淘汰
  • noeviction 返回错误

  • allkeys-random: 回收随机的键使得新添加的数据有空间存放。

  • volatile-random: 回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键。

近似LRU算法

Redis的LRU算法并非完整的实现。这意味着Redis并没办法选择最佳候选来进行回收,也就是最久未被访问的键。

相反它会尝试运行一个近似LRU的算法,通过对少量keys进行取样,然后回收其中一个最好的key(被访问时间较早的)。

Redis LRU有个很重要的点,你通过调整每次回收时检查的采样数量,以实现调整算法的精度。这个参数可以通过以下的配置指令调整:

maxmemory-samples 5

@SvenAugustus (https://my.oschina.net/langxSpirit)

c# redis 如何设置过期时间_Redis 过期时间与内存管理相关推荐

  1. redis 缓存过期默认时间_Redis 过期时间与内存管理

    http://www.redis.cn/commands/expire.html http://www.redis.cn/topics/lru-cache.html 内存管理 当 Redis 作为缓存 ...

  2. redis map 过期时间_redis 过期时间

    设置key的过期时间,超过时间后,将会自动删除该key.在Redis的术语中一个key的相关超时是不确定的. 超时后只有对key执行DEL命令或者SET命令或者GETSET时才会清除. 这意味着,从概 ...

  3. redistemplate hash 过期时间_Redis过期监听——订单超时-取消

    最近在做电商项目,涉及支付超时处理的几种方式.[记录哈使用redis监听处理] 提交订单的时候,支付-超过了有效时间则支付状态自动更新为已取消. 欢迎交流 redis过期监听的实现: 1.修改redi ...

  4. redis decr 防止超卖_Redis基础、高级特性与性能调优——一篇文章搞定

    本文将从Redis的基本特性入手,通过讲述Redis的数据结构和主要命令对Redis的基本能力进行直观介绍.之后概览Redis提供的高级能力,并在部署.维护.性能调优等多个方面进行更深入的介绍和指导. ...

  5. c# redis hashid如何设置过期时间_Redis中Key过期策略amp;淘汰机制

    1. Redis中设置Key过期时间 我们有两种方式设置过期时间 1.1 设置多久后过期 设置一个 key 10s 过期,可以这样 127.0.0.1:6379> SET key value E ...

  6. java redis设置过期时间_Redis的一些核心原理

    点关注,不迷路:持续更新Java相关技术及资讯!!! 一.Redis的单线程和高性能 Redis 单线程为什么还能这么快? 因为它所有的数据都在内存中,所有的运算都是内存级别的运算(纳秒),而且单线程 ...

  7. c# redis hashid如何设置过期时间_Redis数据库实现原理(划重点)

    Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中,db数组的每一项都是一个redis.h/redisDb结构,每个redisDb结构代表一个数据库, ...

  8. redis如何设置定时过期_redis补充6之Redis 设置过期时间

    一般情况下,我们设置保存的缓存数据的时候都会设置一个过期时间. Redis 中有个设置时间过期的功能,即对存储在 Redis 数据库中的值可以设置一个过期时间.作为一个缓存数据库,这是非常实用的.如我 ...

  9. redis如何设置定时过期_redis设置过期时间

    redis是在内存中进行缓存的,我们在设置redis缓存时,可以设置下过期时间.那么在设置时间到期后redis是如何进行数据删除的. redis清理过期数据. 定期清理 + 惰性清理 定期删除:red ...

最新文章

  1. 大数据会说话也“慧”说话
  2. LISTVIEW嵌套GRIDVIEW的一些处理(点击GRIDVIEW的条目,能够显示他在LISTVIEW中的位置)(对这篇文章的优化处理,不每次都new onItemClickListener)...
  3. 58.最全正则表达式教程,最好正则表达式教程
  4. git 挽救忘记提交到哪个分支的代码
  5. 2020年快手校招JAVA岗笔试第三题
  6. 用Django开发Web应用程序异常
  7. Scala 类型的类型(一)
  8. 什么是DQL、DML、DDL、DCL
  9. 解决minukube启动时因为未设代理导致的启动失败错误
  10. 校园导游java版,校园导游系统Word版
  11. python如何获取url中的内容_python怎么提取url中的参数
  12. 计算机网络rip工作原理,12. 小型网络 RIP 协议工作原理
  13. Linux系统下文件与目录操作
  14. VMware ESXI 5.5 注册码
  15. RX8010/RX-8025T测试说明
  16. nodejs实现微博第三方登录
  17. 秦九韶算法与霍纳规则
  18. 机器学习-sklearn第十二天——笔记
  19. 中国人霸屏奥运会乒乓球赛这事 外国人怎么看?
  20. Oracle EBS 值集获取段限定词SQL

热门文章

  1. .jdeveloper_在JDeveloper 12.1.3中为WebSocket使用Java API
  2. 测试Spring Boot有条件的合理方式
  3. Selenium脚本编写技巧和窍门
  4. 使用Prometheus发现在Kubernetes上运行的应用程序
  5. 了解为什么这个直观的工具是您团队的通用团队管理工具
  6. 您自己的MicroProfile Config来源
  7. 使用Google Cloud Storage托管您的Maven工件
  8. 了解自定义对象创建:JSON绑定概述系列
  9. lambdas for_Java 8 Lambdas –缺少脱离Java的链接
  10. java lambda使用_在Java 8 Lambda上使用Apache Commons Functor功能接口