共计 2848 个字符,预计需要花费 8 分钟才能阅读完成。
大家好,我是散步 coding, 最近在整顿 2022 年 Redis 最新面试题, 大家也能够通过我上面的博客地址在线浏览, 明天讲讲第 6 篇 – Redis 淘汰策略。本文首发于公众号: 散步 coding
2022 年 Redis 最新面试题目录
- Redis 基础知识
- Redis 数据结构
- Redis 事务
- Redis 数据长久化
- Redis 集群
- Redis 淘汰策略
- Redis 分布式锁
- Redis 缓存问题
- 运维和部署
概要
- Redis 过期键的删除策略?
- 你能够简略聊聊 Redis 内存淘汰机制(回收策略)
Redis 过期键的删除策略?
呈现概率: ★★★★
Redis 过期键的删除策略是:定期删除 + 惰性删除。
1)、对于定期删除, Redis 默认会每隔 100ms 就随机选取一些曾经过期了的 key,查看其是否过期,如果曾经过期就删除。
不过假如 Redis 里放了 100w 个 key,而且都设置了过期工夫,你每隔几百毫秒,就查看 100w 个 key,那 Redis 基本上就卡死了,cpu 负载也会很高的,根本都耗费在查看过期 key 上了。
留神,这里可不是每隔 100ms 就遍历所有的设置过期工夫的 key,那样就是一场性能上的劫难。理论状况是每次随机选取一些 key 进行检查和删除的。
但因为随机会带来不确定性,可能会导致很多过期 key 到了工夫并没有被删除掉,那应该怎么办呢?所以就 须要惰性删除了。
对于定期删除源码解析:每当 Redis 服务器的周期性操作 redis.c/serverCron 函数执行时,redis.c/activeExpireCycle 会被调用。
activeExpireCycle 函数在规定的工夫内,分屡次遍历服务器中的各个数据库,从数据库的 expires 字典中随机查看一部分键的过期工夫,并删除其中的过期键。
current\_db 记录以后查看的数据库,如果函数 activeExpireCycle 以后正在解决 2 号数据库,工夫超限,返回后,下次查看时,会从 3 号数据库开始查看。所有数据库查看一遍后,current\_db 重置为 0,而后再次开始一轮的查看工作。
2)、对于惰性删除,当用户获取某个 key 的时候,Redis 会检查一下这个 key 是不是设置了过期工夫,并且是否过期了?如果过期了此时就会删除,不会给用户返回任何货色。
惰性删除有一个问题,依赖用户的被动调用,那如果一些用户就长时间没有拜访怎么办,会导致大量过期 key 沉积在内存里,进而导致 Redis 内存块耗尽了,咋整?
答案就是:触发 Redis 内存淘汰机制。(上面会讲到)
你能够简略聊聊 Redis 内存淘汰机制(回收策略)
呈现概率: ★★★★
1)、Redis 内存淘汰机制有以下几个:
- noeviction: 当内存不足以包容新写入数据时,新写入操作会报错。(这个有点过于暴力, 不举荐)
- allkeys-lru:当内存不足以包容新写入数据时,在键空间中,移除最近起码应用的 key(这个是最罕用的)。
- allkeys-random:当内存不足以包容新写入数据时,在键空间中,随机移除某个 key。
- volatile-lru:当内存不足以包容新写入数据时,在设置了过期工夫的键空间中,移除最近起码应用的 key(这个个别不太适合)。
- volatile-random:当内存不足以包容新写入数据时,在设置了过期工夫的键空间中,随机移除某个 key。
- volatile-ttl:当内存不足以包容新写入数据时,在设置了过期工夫的键空间中,有更早过期工夫的 key 优先移除。
2)、Redis 默认的过期策略是 noeviction, 最暴力那个, 如果内存满了那就是一场“富丽”的故事了。😂
127.0.0.1:6379> config get maxmemory-policy
1) "maxmemory-policy"
2) "noeviction"
127.0.0.1:6379>
3)、redis.conf 中的过期淘汰配置如下:
# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory
# is reached. You can select among five behaviors:
#最大内存策略:当达到最大应用内存时,你能够在上面 5 种行为中抉择,Redis 如何抉择淘汰数据库键
#当内存不足以包容新写入数据时
# volatile-lru -> remove the key with an expire set using an LRU algorithm
# volatile-lru:在设置了过期工夫的键空间中,移除最近起码应用的 key。这种状况个别是把 redis 既当缓存,又做长久化存储的时候才用。# allkeys-lru -> remove any key according to the LRU algorithm
# allkeys-lru:移除最近起码应用的 key(举荐)# volatile-random -> remove a random key with an expire set
# volatile-random:在设置了过期工夫的键空间中,随机移除一个键,不举荐
# allkeys-random -> remove a random key, any key
# allkeys-random:间接在键空间中随机移除一个键,弄啥叻
# volatile-ttl -> remove the key with the nearest expire time (minor TTL)
# volatile-ttl:在设置了过期工夫的键空间中,有更早过期工夫的 key 优先移除 不举荐
# noeviction -> don't expire at all, just return an error on write operations
# noeviction:不做过键解决,只返回一个写操作谬误。不举荐
# Note: with any of the above policies, Redis will return an error on write
# operations, when there are no suitable keys for eviction.
# 下面所有的策略下,在没有适合的淘汰删除的键时,执行写操作时,Redis 会返回一个谬误。上面是写入命令:# At the date of writing these commands are: set setnx setex append
# incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd
# sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby
# zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby
# getset mset msetnx exec sort
# 过期策略默认是:# The default is:
# maxmemory-policy noeviction
也欢送关注我的公众号: 散步 coding
。一起交换, 在 coding 的世界里散步, 回复: redis
, 收费获取最新 Redis 面试题(含答案)。