如何删除Redis中的Key

1,198 阅读3分钟

为什么要删除Redis中的Key

这个问题很简单,redis数据是存放在服务器的内存的,会非常耗内存,因此redis不能用于报错大量数据,而且必须删除一些key,否则占用内存会越来越多。

Redis清理Key的三种测量

被动删除

当操作(读/写)某个key的时候,先判断这个key是否过期,如果已过期则删除,被动删除也叫做惰性删除策略。

  • 优点:对cpu友好,del操作会非常快,不会占用cpu,因为并没有将对应的key真正从内存中删除,操作比较快。
  • 缺点:对内存不友好,因为它并没有真正从内存中删除这个key。其实这是一种内存泄漏。

主动删除

惰性删除无法保证过期的数据立马删除,有的过期数据永远用不到了则永远也不会被删除,白白浪费了内存,这就是为什么有时候设置了过期时间但是内存并没有主动降下来的原因,主动删除频率太低。

主动删除是指服务器会定期清理掉一批已过期的key。注意这里说的是一批,具体是哪一批,是不是全部过期的key,取决于删除策略。因此如果策略配置不当,会导致一些过期的key长时间删不掉,导致redis内存占用过高。

  • 具体操作

redis服务器会维护一个定时任务,定期运行。每秒运行次数可通过配置文件中的hz参数控制,默认为10,即每秒运行10次。每次随机出扫描100个key,如果过期则删除。如果某次删除的key数量超过25个则立马又执行一次定时任务,而不是等到下一次再执行。

当redis运行再分布式集群上时,只有master节点才会执行执行上述三种清除key的操作,然后通过同步机制将"del key"同步到slave节点。

超过maxmemory时主动触发删除

当被动删除和主动删除还没有让内存降下来而导致内存超过maxmemory时,就会触发主动清除过期key的操作。具体清除哪些key也是可通过策略配置的。
有如下策略:

  • volatile-lru:只对设置了过期时间的key进行lru
  • allkeys-lru:对所有的key进行lru
  • volatile-random:随机删除设置了过期时间的key
  • allkeys-random:随机删除所有的key
  • volatile-ttl:删除即将过期的key
  • noeviction:永不过期,返回错误 策略可在配置文件中配置。

当redis占用的内存超过maxmemory时,任何操作(读/写)都会触发清除key操作。而且这个清理过程是阻塞的,即这个时候可能会导致卡顿现象。

清理操作会根据用户配置的上述策略来清理maxmemory-samples个key,这个maxmemory-samples也是可以通过配置文件配置的,默认是5。

Redis只会清理过期的Key吗

并不一定。当redis占用内存超过maxmemory时,会按配置的策略删除一些还没过期的key。这样会导致数据不准确,因此redis一般用于做缓存,不用于精确存储。而且尽量不要让内存达到maxmemory,可通过调大内存和设置主动删除的频率来降低maxmemory的可能性。

参考

【1】Redis中删除过期Key的三种策略
【2】Redis的删除机制、持久化 主从
【3】redis删除过期key的算法_深入理解Redis的内存回收机制