redis 作为缓存和数据库的区别

 

redis缓存 数据不重要,不是全量数据。

redis缓存要随业务变化而变化,redis只保留热数据。

1. 使用

1. 设置值

set k1 hello。

也可以在set的时候直接设置过期时间 ,set k1 hello ex 10.

2. 设置有效期

expire k1 10  或者  expireat k1 timestamps

3. 查看有效期时间

ttl k1 

总结:

  • key的有效期,不会随着访问而延长
  • key的有效期,在修改的时候,会直接剔除过期时间,从概念上讲所有改变key的值的操作都会使他清除

2. 为key设置超时时间应该注意

1. DEL/SET/GETSET等命令会清除过期时间

在使用DEL、SET、GETSET等会覆盖key对应value的命令操作一个设置了过期时间的key的时候,会导致对应的key的过期时间被清除

2. INCR/LPUSH/HSET等命令则不会清除过期时间

而在使用INCR/LPUSH/HSET这种只是修改一个key的value,而不是覆盖整个value的命令,则不会清除key的过期时间。

3. PERSIST命令会清除过期时间,并将这个key修改为永久key

4. 使用RENAME命令修改key的名称,老key的过期时间将会转到新key上

rename key newkey ,此时key的过期时间或转移到newkey上

5. 使用RENAME命令修改key的名称,当时如果newkey本来就存在。

rename key newkey,newkey本来存在,此时也会直接把key的值覆盖到newkey上

3. 设置过期时间策略

我们知道,当我们对key设置了过期时间,当过期时间一到,这个key就会被删除。那么redis是如何进行删除的呢

方式有两种: 主动+ 被动

主动,就是客户端调用这个key时,key会被发现过期,主动删除

但是光靠这种方式是远远不够的。还需要被动的删除

被动:

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

  1. 测试随机的20个keys进行相关过期检测。
  2. 删除所有已经过期的keys。
  3. 如果有多于25%的keys过期,重复步奏1.

这是一个平凡的概率算法,基本上的假设是,我们的样本是这个密钥控件,并且我们不断重复过期检测,直到过期的keys的百分百低于25%,这意味着,在任何给定的时刻,最多会清除1/4的过期keys。

稍微牺牲内存,保证redis速度快。

4. redis 回收策略

 内存是有限的,随着数据的访问,应该淘汰掉冷数据。

redis配置中,有个配置为Maxmemory,Redis存储数据时指定限制的内存大小。当redis中数据达到Maxmemory最大限制的时候,就需要淘汰一些数据,需要回收策略

当maxmemory限制达到的时候Redis会使用的行为由 Redis的maxmemory-policy配置指令来进行配置。

redis判断key是否过期 redis如何判断key是否过期_redis

回收策略:

  • noeviction:返回错误,当内存限制达到,并且客户端尝试执行会让更多内存被使用的命令(大部分的写入指令,但DEL和几个例外)
  • allkeys-lru: 最近最少使用。判断最近被使用的时间,目前最远的数据优先被淘汰。,使得新添加的数据有空间存放。
  • volatile-lru: 最近最少使用。判断最近被使用的时间,目前最远的数据优先被淘汰。,但仅限于在过期集合的键,使得新添加的数据有空间存放。
  • allkeys-random: 回收随机的键使得新添加的数据有空间存放。
  • volatile-random: 回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键。
  • volatile-ttl: 回收在过期集合的键,并且优先回收存活时间(TTL)较短的键,使得新添加的数据有空间存放。

那么该如何选择这些回收策略呢

1. 如果没有键满足回收的前提条件的话,策略volatile-lruvolatile-random以及volatile-ttl就和noeviction 差不多了。

2. 使用allkeys-lru策略:当你希望你的请求符合一个幂定律分布,也就是说,你希望部分的子集元素将比其它其它元素被访问的更多。如果你不确定选择什么,这是个很好的选择。.

3. 使用allkeys-random:如果你是循环访问,所有的键被连续的扫描,或者你希望请求分布正常(所有元素被访问的概率都差不多)。

4.了使用volatile-ttl:如果你想要通过创建缓存对象时设置TTL值,来决定哪些对象应该被过期。

5. allkeys-lru 和 volatile-random策略对于当你想要单一的实例实现缓存及持久化一些键时很有用。不过一般运行两个实例是解决这个问题的更好方法。

6. 为了键设置过期时间也是需要消耗内存的,所以使用allkeys-lru这种策略更加高效,因为没有必要为键取设置过期时间当内存有压力时。

redis内存是有限的,如果存储的数据超过了内存,就需要清理数据

noeviction:报错处理,当内存不足以容纳新写入数据时,新写入操作会报错

allkey-lru:通过lru算法,删除所有key中使用最少的key

volatile-lru:通过lru算法,失效时间超时的key里使用最少

allkey-lfu:通过lfu算法,删除所有key中使用最少的key

volatile-lfu:通过lfu算法,失效时间超时的key里使用最少

allkey-random:所以key随机选择

vlatile-random:实现时间里随机选择

volatile-ttl:回收失效时间超时的key,有限回收存活时间短的。

除了lru算法外,还有lfu算法

  • volatile-lfu:从所有配置了过期时间的键中驱逐使用频率最少的键
  • allkeys-lfu:从所有键中驱逐使用频率最少的键

这两个的方式

lru,尝试回收未使用时间最长的key。就是最后一次使用到现在时间最长

lfu, 尝试回收最少使用的key。就是使用次数最少