怎么通过贷款网站找做贷款客户,网站错误列表,如何提升网站百度权重,企业网站公众号Redis 在面试中出现的概率非常大#xff0c;毕竟后端项目如果用到分布式缓存的话#xff0c;一般用的都是 Redis。目前#xff0c;还没有出现一个能够取代 Redis 的分布式缓存解决方案。
这篇文章中#xff0c;我会分享几道 Redis 内存管理相关的问题#xff0c;都很常见…Redis 在面试中出现的概率非常大毕竟后端项目如果用到分布式缓存的话一般用的都是 Redis。目前还没有出现一个能够取代 Redis 的分布式缓存解决方案。
这篇文章中我会分享几道 Redis 内存管理相关的问题都很常见。不论是面试还是项目中用到 Redis都能有帮助。
下面几篇是之前分享的 Redis 相关的文章没看过的朋友可以抽空看看 这 7 道 Redis 基础问题很常见 如何发现 Redis 热 Key有哪些解决方案 Redis 大 key 有什么危害如何排查和处理 Redis 除了缓存还能做什么可以做消息队列吗 本地缓存和分布式缓存有什么区别如何选择 宕机了Redis 如何避免数据丢失 Redis 如何使用批量操作提高效率
Redis 给缓存数据设置过期时间有啥用
一般情况下我们设置保存的缓存数据的时候都会设置一个过期时间。为什么呢
因为内存是有限的如果缓存中的所有数据都是一直保存的话分分钟直接 Out of memory。
Redis 自带了给缓存数据设置过期时间的功能比如
127.0.0.1:6379 expire key 60 # 数据在 60s 后过期
(integer) 1
127.0.0.1:6379 setex key 60 value # 数据在 60s 后过期 (setex:[set] [ex]pire)
OK
127.0.0.1:6379 ttl key # 查看数据还有多久过期
(integer) 56注意Redis 中除了字符串类型有自己独有设置过期时间的命令 setex 外其他方法都需要依靠 expire 命令来设置过期时间 。另外 persist 命令可以移除一个键的过期时间。
过期时间除了有助于缓解内存的消耗还有什么其他用么
很多时候我们的业务场景就是需要某个数据只在某一时间段内存在比如我们的短信验证码可能只在 1 分钟内有效用户登录的 Token 可能只在 1 天内有效。
如果使用传统的数据库来处理的话一般都是自己判断过期这样更麻烦并且性能要差很多。
Redis 是如何判断数据是否过期的呢
Redis 通过一个叫做过期字典可以看作是 hash 表来保存数据过期的时间。过期字典的键指向 Redis 数据库中的某个 key(键)过期字典的值是一个 long long 类型的整数这个整数保存了 key 所指向的数据库键的过期时间毫秒精度的 UNIX 时间戳。 redis过期字典
过期字典是存储在 redisDb 这个结构里的
typedef struct redisDb {...dict *dict; //数据库键空间,保存着数据库中所有键值对dict *expires // 过期字典,保存着键的过期时间...
} redisDb;过期的数据的删除策略了解么
如果假设你设置了一批 key 只能存活 1 分钟那么 1 分钟后Redis 是怎么对这批 key 进行删除的呢
常用的过期数据的删除策略就两个重要自己造缓存轮子的时候需要格外考虑的东西 惰性删除只会在取出 key 的时候才对数据进行过期检查。这样对 CPU 最友好但是可能会造成太多过期 key 没有被删除。 定期删除每隔一段时间抽取一批 key 执行删除过期 key 操作。并且Redis 底层会通过限制删除操作执行的时长和频率来减少删除操作对 CPU 时间的影响。
定期删除对内存更加友好惰性删除对 CPU 更加友好。两者各有千秋所以 Redis 采用的是 定期删除惰性/懒汉式删除 。
但是仅仅通过给 key 设置过期时间还是有问题的。因为还是可能存在定期删除和惰性删除漏掉了很多过期 key 的情况。这样就导致大量过期 key 堆积在内存里然后就 Out of memory 了。
怎么解决这个问题呢答案就是Redis 内存淘汰机制。 Redis 内存淘汰机制了解么 相关问题MySQL 里有 2000w 数据Redis 中只存 20w 的数据如何保证 Redis 中的数据都是热点数据? Redis 提供 6 种数据淘汰策略 volatile-lruleast recently used从已设置过期时间的数据集server.db[i].expires中挑选最近最少使用的数据淘汰。 volatile-ttl从已设置过期时间的数据集server.db[i].expires中挑选将要过期的数据淘汰。 volatile-random从已设置过期时间的数据集server.db[i].expires中任意选择数据淘汰。 allkeys-lruleast recently used当内存不足以容纳新写入数据时在键空间中移除最近最少使用的 key这个是最常用的。 allkeys-random从数据集server.db[i].dict中任意选择数据淘汰。 no-eviction禁止驱逐数据也就是说当内存不足以容纳新写入数据时新写入操作会报错。这个应该没人使用吧
4.0 版本后增加以下两种 volatile-lfuleast frequently used从已设置过期时间的数据集server.db[i].expires中挑选最不经常使用的数据淘汰。 allkeys-lfuleast frequently used当内存不足以容纳新写入数据时在键空间中移除最不经常使用的 key。