2020 Redis实战【6】 缓存数据的选型与数据的清除(配置,key的过期)

数据选型

适用于缓存数据库的数据
之所用缓存,需要注意以下几点:

  1. 数据时不会被持久化的。不持久化就意味着数据的重要性并不是“很高”或者说没有那么的“重要”。
  2. 一部分数据,不是全量的全部的。全量的数据那么直接就是数据库了。数据库作为持久化才会保存全部的数据。
  3. 热数据,会被频繁使用的数据。 反之不被使用的数据或者说不被频繁使用的数据不需要进行缓存处理。
  4. 随着业务而改变的动态的数据。数据存在于缓存,热度可能基于访问量或者时间变化,那么业务导致的热数据就应该被缓存也印证了上一点。

数据的清除

通常对于redis来说不会调用FLUSHALL 来进行数据清除,那么在日常业务操作中通过选型后的数据如何删除呢,通过两个方面,

  1. 业务逻辑删除 这里指的就是key的有效期设置。通过过期来移除冷数据
  2. 程序运转删除 配置配置文件。通过配置文件设置删除冷数据

key的有效期

根据业务逻辑一般都会对key进行有效期的设置。通过设置key的有效期可以对缓存数据进行剔除。

TTL 命令

TTL key
以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。
返回值:

  • 当 key 不存在时,返回 -2 。
  • 当 key 存在但没有设置剩余生存时间时,返回 -1 ,永不过期
  • 否则,以秒为单位,返回 key 的剩余生存时间。

EXPIRE

EXPIRE key seconds
为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除.
通过TTL key 可以查询剩余的存活时间
需要注意一下很多点:

  1. 当一个key被设置超时时间后,它在redis中就变为了volatile类型。
  2. 当设置超时时间后 ,这个key可以依旧被删除【被执行DEL命令】
  3. 这个key被执行SET或者GETSET操作后 超时将被清除,或者说超时时间失效。通过TTL命令查询存活时间返回值为-1
  4. 可以通过命令PERSIST 来移除过期时间,

总结:当一个key 执行expire 后只有 SET GETSET PERSIST 三个名执行完后对key进行TTL 超时检查会返回-1 即永久状态,其余的任何操作都不会改变这个KEY的过期时间。或者说是不会改变这个key为volatile类型的。

EXPIREAT

EXPIREAT key timestamp

作用和 EXPIRE 类似,都用于为 key 设置生存时间。
但是这后面的参数是timestamp 。具体的UNIX格式的日期秒数。
unix时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的数。注意这里单位事数不是毫秒。再redis中可以通过TIME来查看当前UNIX时间格式。

Redis如何淘汰过期的keys

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

主动

当一些客户端尝试访问它时,key会被发现并主动的过期。
如:k1过期以后 并不会被删除,再当用户访问这个k1的时候,redis会去比对一下这个过期时间发现过期了,删除这个key,并返回用户key不存在。通过用户访问这个key来进行过期删除的操作叫主动模式。

被动

这样是不够的,因为有些过期的keys,永远不会访问他们。 但是这些key还是应该被删除的,通常的办法都是进行对key进行轮询判断一下是否过期,但是redis是单线程执行,那么这样全量轮询势必会造成阻塞,一旦阻塞就会大大的影响redis的性能。
所以redis是这么做的:
每秒10次的频率做这样的事情。

  1. 随机取20个key 进行过期判断
  2. 将已经过期的key删除
  3. 如果有多于25%的key过期,重复执行步骤1.

这么做的主要目的是稍微牺牲了内存,但是保证了性能。

缓存大小配置

内存大小是有限的,随着访问的变化,应该逐步淘汰掉冷数据。

Redis是通过LRU 策略来进行数据移除的。
这个先要通过配置文件来实现。通过两个配置实现

内存使用配置

maxmemory bytes 设置redis的最大存储 单位字节

溢出策略配置

还有就是要先了解一下两个缩写:

  • LRU means Least Recently Used 最近最少使用
  • LFU means Least Frequently Used 最近不常用

maxmemory-policy 最大存储溢出策略 默认 noeviction

关于policy 的选择 配置文件中列了很多:

  • volatile-lru -> Evict using approximated LRU among the keys with an expire set. volatile类型中最近最少使用的,这里指的是优先清除有过期时间的volatile类型的key
  • allkeys-lru -> Evict any key using approximated LRU. 所有key中最近最少使用的,这里不区分任何类型,只要是符合最近最少使用的就删除
  • volatile-lfu -> Evict using approximated LFU among the keys with an expire set. 参考volatile-lru
  • allkeys-lfu -> Evict any key using approximated LFU.参考allkeys-lru
  • volatile-random -> Remove a random key among the ones with an expire set. 随机删除volatile类型的key
  • allkeys-random -> Remove a random key, any key. 随机删除全部key
  • volatile-ttl -> Remove the key with the nearest expire time (minor TTL) 删除volatile类型的但是优先是ttl结果时间最短的
  • noeviction -> Don’t evict anything, just return an error on write operations. 什么都不干,直接返回一个错误。

可以看出来这些策略都不难都很好理解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值