提供网站建设教程的网站,什么网站流量高,建设银行校招网站入口,网站的点击率怎么查目录 Redis 给缓存数据设置过期时间
Redis是如何判断数据是否过期的呢#xff1f;
过期的数据的删除策略
Redis 内存淘汰机制 Redis 给缓存数据设置过期时间
一般情况下#xff0c;我们设置保存的缓存数据的时候都会设置一个过期时间。为什么呢#xff1f;
因为内存是有…目录 Redis 给缓存数据设置过期时间
Redis是如何判断数据是否过期的呢
过期的数据的删除策略
Redis 内存淘汰机制 Redis 给缓存数据设置过期时间
一般情况下我们设置保存的缓存数据的时候都会设置一个过期时间。为什么呢
因为内存是有限的如果缓存中的所有数据都是一直保存的话分分钟直接Out of memory。
Redis 自带了给缓存数据设置过期时间的功能比如
127.0.0.1:6379 exp key 60 # 数据在 60s 后过期
(integer) 1
127.0.0.1:6379 setex key 60 value # 数据在 60s 后过期 (setex:[set] [ex]pire)
OK
127.0.0.1:6379 ttl key # 查看数据还有多久过期
(integer) 56
注意Redis中除了字符串类型有自己独有设置过期时间的命令 setex 外其他方法都需要依靠 expire 命令来设置过期时间 。另外 persist 命令可以移除一个键的过期时间
过期时间除了有助于缓解内存的消耗还有什么其他用么
很多时候我们的业务场景就是需要某个数据只在某一时间段内存在比如我们的短信验证码可能只在1分钟内有效用户登录的 token 可能只在 1 天内有效。
如果使用传统的数据库来处理的话一般都是自己判断过期这样更麻烦并且性能要差很多。
Redis是如何判断数据是否过期的呢
Redis 通过一个叫做过期字典可以看作是hash表来保存数据过期的时间。过期字典的键指向Redis数据库中的某个key(键)过期字典的值是一个long long类型的整数这个整数保存了key所指向的数据库键的过期时间毫秒精度的UNIX时间戳。 过期字典是存储在redisDb这个结构里的
typedef struct redisDb {...dict *dict; //数据库键空间,保存着数据库中所有键值对dict *expires // 过期字典,保存着键的过期时间...
} redisDb;
过期的数据的删除策略
如果假设你设置了一批 key 只能存活 1 分钟那么 1 分钟后Redis 是怎么对这批 key 进行删除的呢
常用的过期数据的删除策略就两个 惰性删除 只会在取出key的时候才对数据进行过期检查。这样对CPU最友好但是可能会造成太多过期 key 没有被删除。 定期删除 每隔一段时间抽取一批 key 执行删除过期key操作。并且Redis 底层会通过限制删除操作执行的时长和频率来减少删除操作对CPU时间的影响。
定期删除对内存更加友好惰性删除对CPU更加友好。两者各有千秋所以Redis 采用的是 定期删除惰性/懒汉式删除 。
但是仅仅通过给 key 设置过期时间还是有问题的。因为还是可能存在定期删除和惰性删除漏掉了很多过期 key 的情况。这样就导致大量过期 key 堆积在内存里然后就Out of memory了。
怎么解决这个问题呢答案就是 Redis 内存淘汰机制。
Redis 内存淘汰机制
Redis 提供 6 种数据淘汰策略 volatile-lruleast recently used从已设置过期时间的数据集server.db[i].expires中挑选最近最少使用的数据淘汰 volatile-ttl从已设置过期时间的数据集server.db[i].expires中挑选将要过期的数据淘汰 volatile-random从已设置过期时间的数据集server.db[i].expires中任意选择数据淘汰 allkeys-lruleast recently used当内存不足以容纳新写入数据时在键空间中移除最近最少使用的 key这个是最常用的 allkeys-random从数据集server.db[i].dict中任意选择数据淘汰 no-eviction禁止驱逐数据也就是说当内存不足以容纳新写入数据时新写入操作会报错。这个应该没人使用吧
4.0 版本后增加以下两种 volatile-lfuleast frequently used从已设置过期时间的数据集(server.db[i].expires)中挑选最不经常使用的数据淘汰 allkeys-lfuleast frequently used当内存不足以容纳新写入数据时在键空间中移除最不经常使用的 key