Redis系列-冷知识

下面是一些看了,但觉得用处不大,不记下又可惜的东西。

Redis删除过期数据

redis通过expire/expireat(秒为单位)或者pexpire/pexpireat(毫秒为单位)来设置key的过期时间,reids是如何自动删除过期数据的呢?
当client主动访问key时,如果key已过期会立刻删除。对于没有被访问到key,redis后台每秒10次的执行如下操作:随机选取100个key校验是否过期,如果有25个以上的key过期,除对过期key删除外,立刻再额外随机选取100个key进行校验,直到过期key少于25,本次操作结束。
可见,过期数据不多每秒会有200条的数据被删除,每秒删除数量会随着过期数的增多而增多。但是一个过期的key不被client主动访问,在redis中的存活时间就不定了。

Redis的事务

redis通过multi、discard、exec和watch实现自己的事务。redis对内存的操作是单线程进行的,所以它在执行事务之间,其他客户端的命令都会被拒绝的。
其执行过程是:将多个命令排队打包,然后一次性、按顺序执行各命令。
  1. 开始事务(收到MULTI)
  2. 命令入队(客户端发过来的redis命令)
  3. 执行事务(收到EXEC)
注意:
事务开始执行后,不会处理其他客户端的其他命令,直到事务结束;
命令入队列的过程中,如果客户端发送了错误命令,如参数数量不对、命令错误,服务端会向客户端返回出错信息,并将该事务的状态置为REDIS_DIRTY_EXEC;
事务执行过程中发生错误,事务不会中断或失败,不影响已执行和后面要执行的命令
事务不可嵌套,一个客户端只能发送一次MULTI,在MULTI过程中,继续发送MULTI会被忽略,不会影响队列中的命令;
WATCH的作用:在事务开始前监视任意数量的可以(WATCH key [key ...]),当调用EXEC时,任一个被监视key发生修改,整个事务就不再执行,直接返回失败。

Redis淘汰机制

内存是有限的,当达到最大内存后redis需要淘汰一些数据(也可通过maxmemory <bytes>配置最大内存),选定要驱逐的某个键值对后,会删除数据并更新到AOF日志(如果打开)和slave。
淘汰策略有如下5种(通过maxmemory-policy配置,默认策略为 volatile-lru):

  • volatile-lru -> remove the key with an expire set using an LRU algorithm
  • allkeys-lru -> remove any key accordingly to the LRU algorithm
  • volatile-random -> remove a random key with an expire set
  • allkeys-random -> remove a random key, any key
  • volatile-ttl -> remove the key with the nearest expire time (minor TTL)
  • noeviction -> don't expire at all, just return an error on write operations
主要是LRU和Minimal TTL两个算法的应用,它们都不是严格按照LRU和Minimal TTL实现的,从候选集中随机抽取若干key,选出值最大的进行淘汰,并不是从全量数据集中进行保证。对于抽样的大小可以通过 maxmemory-samples来设置(默认为 maxmemory-samples 3)。
原文地址:https://www.cnblogs.com/whuqin/p/4981985.html