首页 > 数据库 >redis缓存过期策略学习

redis缓存过期策略学习

时间:2023-03-05 21:34:57浏览次数:54  
标签:缓存 策略 删除 过期 redis CPU 字典

转自:http://jinguoxing.github.io/redis/2018/10/10/redis-EXPIRE/

https://juejin.cn/post/7058918503255900167

1.过期字典

在redis中维护了一个expires字典,里面保存了数据库中所有设置了过期时间的键的过期时间,称为过期字典。 

判断key是否过期,也是通过过期字典来完成的:

    ①首先检查给定键是否存在于过期字典中,若存在则取得键的过期时间

    ②检查当前UNIX时间戳是否大于键的过期时间,如果是的话则键已过期,若否则未过期

过期键存储在 redisDb 结构中:https://cloud.tencent.com/developer/article/1684105

typedef struct redisDb {
    dict *dict;                 /* The keyspace for this DB */
    dict *expires;              /* Timeout of keys with a timeout set */
    ...
}

 过期字典的键是一个指向键空间中的某个键对象的指针,值保存了键所指向的过期时间。

2.删除策略

2.1 定时删除

在设置键的过期时间的同时,创建一个定时器,定时定时器在键的过期时间来临时,立即执行对键的删除操作。(主动删除策略)

  • 优点:定时删除策略对内存是友好的;通过使用定时器,定时删除策略可以保证过期键会尽快地被删除,并释放过期键所占用的内存 。

  • 缺点:它对CPU时间是最不友好的;在过期键比较多的情况下,删除过期键这一行为会占用相当一部分CPU时间,对服务器的响应时间和吞吐量造成影响。

2.2 惰性删除

放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除改键;如果没有过期,就返回该键。 (被动删除策略)

  • 优点: 惰性删除策略对CPU 时间来说是最友好的:程序只会在取出键时才对键进行过期检查,这可以保证删除过期键的操作只会在非做不可的情况下进行, 并且删除的目标仅限于当前处理的键,这个策略不会在删除其他无关的过期键上花费任何CPU时间。

  • 缺点:它对内存是最不友好的: 如果一个键已经过期,而这个键又仍然保留在数据库中,那么只要这个过期键不被删除,它所占用的内存就不会释放。有内存泄漏的危险。

2.3定期删除

每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。至于要删除多少过期键,以及要检查多少个数据库,则由算法决定。 (主动删除策略)是定时和惰性的折中。

  1. 从过期字典中随机取出 20 个键。
  2. 删除这 20 个键中过期的键。
  3. 如果过期 key 的比例超过 25%,重复步骤 1。

同时为了保证过期扫描不会出现循环过度,导致线程卡死现象,算法还增加了扫描时间的上限,默认不会超过 25ms。

redis服务器实际使用的是惰性删除和定期删除两种策略:通过配合使用这两种删除策略,服务器可很好的使用CPU的时间和避免浪费内存空间之间取得平衡。

 还有缓存淘汰策略,这次先不看了。有机会再看。

 

标签:缓存,策略,删除,过期,redis,CPU,字典
From: https://www.cnblogs.com/BlueBlueSea/p/17181722.html

相关文章

  • spring的循环依赖和三级缓存
    一、spring中bean的生命周期回顾要理解spring中的循环依赖问题需要先了解spring中bean的生命周期,spring中创建bean的过程中主要有这几个阶段:实例化前$\rightarrow$实......
  • 08-Redis系列之-Redis布隆过滤器,MySQL主从,Django读写分离
    Redis实现布隆过滤器前言布隆过滤器使用场景比如有如下几个需求:原本有10亿个号码,现在又来了10万个号码,要快速准确判断这10万个号码是否在10亿个号码库中?解决办......
  • 07-Redis系列之-双写一致性,缓存详解和优化点
    双写一致性redis和mysql数据同步方案先更新数据库,再更新缓存(一般不用)先删缓存,再更新数据库(在存数据的时候,请求来了,缓存不是最新的,一般也不用)先更新数据库,再删缓存(请求......
  • 05-Redis系列之-主从复制配置和优化,fork和aof两大阻塞
    主从复制原理一台主服务器配多台从服务器,主服务器宕机后,从服务器挑选一台顶上去。从服务器同步主服务器的数据,这个同步是单向的,并且从服务器不能设置值,否则会造成数据的......
  • 01-Redis系列之-Redis介绍安装配置
    Redis初识Redis主要内容1redis介绍,特性,安装和配置,典型应用场景2单线程架构,5大数据类型操作,通用指令和高级API的使用3高级用法(慢查询,管道,shu发布订阅,bitmap位图,Hype......
  • 04-Redis系列之-持久化(RDB,AOF)
    持久化的作用什么是持久化redis的所有数据保存在内存中,对数据的更新将异步的保存到硬盘上持久化的实现方式快照:某时某刻数据的一个完整备份(mysql的Dump,redis的RDB)......
  • 03-Redis系列之-高级用法详解
    慢查询生命周期我们配置一个时间,如果查询时间超过了我们设置的时间,我们就认为这是一个慢查询.慢查询发生在第三阶段客户端超时不一定慢查询,但慢查询是客户端超时的一个......
  • 02-Redis系列之-架构和高级API的使用
    通用部分通用命令#1-keys#打印出所有keykeys*#打印出所有以n开头的keykeysn*#打印出所有以nam开头,第四个字母是a到z的范围keysnam[a-z]#四位长度,以n开......
  • Redis基础篇
    1、简单介绍一下Redis优点和缺点?优点:1、本质上是一个Key-Value类型的内存数据库,很像memcached2、整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据......
  • springboot中redis的基本数据类型测试
    在springboot中依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artif......