Redis面试常见问题

1.key过期删除策略

定时删除

它会在设置键的过期时间的同时,创建一个定时器, 当键到了过期时间,定时器会立即对键进行删除。 这个策略能够保证过期键的尽快删除,快速释放内存空间。

但是有得必有失。 Redis的操作频率是非常高的。绝大多数的键都是携带过期时间的,这样就会造成出现大量定时器执行,严重降低系统性能。

​ 总的来说:该策略对内存空间足够友好, 但对CPU非常不友好,会拉低系统性能,因此不建议使用

惰性删除

为了解决定时删除会占用大量CPU资源的问题, 因此产生了惰性删除。

它不持续关注key的过期时间, 而是在获取key时,才会检查key是否过期,如果过期则删除该key。

定期删除

Redis为了平衡定时删除和惰性删除,采用了定期删除。

  • 默认每秒运行10次会对具有过期时间的key进行一次扫描,但是并不会扫描全部的key,因为这样会大大延长扫描时间。
  • 每次默认只会随机扫描20个key,同时删除这20个key中,已经过期的key。
  • 如果这20个key中过期key的比例达超过25%,则继续扫描

通过在配置文件中配置 hz 10,来设置每秒的扫描次数。


2.内存淘汰策略

为什么需要内存淘汰策略:有一些已经过期的key,定期扫描一直都没有扫描到它,而且这些key也一直没有被使用。 那么它们就会一直在内存中存在。同时继续向Redis不断插入新数据,最终会造成内存空间不足的问题。

最大内存参数配置:通过修改配置文件maxmemory 参数,在64位操作系统中,如果未设置或设置0,代表无限制。而在32位系统中,默认内存大小为3GB。但是实际生产环境下,一般会设置物理内存的四分之三左右。

2.1 策略详解

当客户端执行命令,添加数据时,Redis会检查内存空间大小,如超过最大内存,则触发内存淘汰策略

在Redis中默认提供了三类八种淘汰策略。

​ 对于这些策略各自的含义,我们还需要一点前置知识的铺垫,这里我们可以看到两个名称:lrulfu,他俩是什么意思呢?

他们的学名叫做:数据驱逐策略。 其实所谓的驱逐就是将数据从内存中删除掉。

  • lru:Least Recently Used,它是以时间为基准,删除最近最久未被使用的key。
  • lfu:Least Frequently Used,它是以频次为基准,删除最近最少未被使用的key。

那理解了lru和lfu之后,我们再回来看这三类八种内存淘汰策略各自的机制。

 对于LRUTTL相关策略,每次触发时,redis会默认从5个key中一个key符合条件的key进行删除。如果要修改的话,可以修改redis.confmaxmemory-samples属性值

 2.2 策略设置

redis默认使用noeviction,我们可以通过修改redis.confmaxmemory-policy属性值设置不同的内存淘汰策略。

2.3 不同策略的使用场景

1、Redis只做缓存,不做DB持久化,使用allkeys。如状态性信息,经常被访问,但数据库不会修改。

2、同时用于缓存和DB持久化,使用volatile。如商品详情页。

3、存在冷热数据区分,则选择LRU或LFU。如热点新闻,热搜话题等。

4、每个key被访问概率基本相同,选择使用random。如企业内部系统,访问量不大,删除谁对数据库也不造成太大压力。

5、根据超时时间长久淘汰数据,选择选用ttl。如微信过期好友请求。


3.Redis 的全称

Remote Dictionary Server。


4.Redis中一个字符串类型的值能存储最大容量是多少

Redis 中的字符串类型可以存储的最大字节数为 512 MB.


5.Redis 集群方案什么情况下会导致整个集群不可用

有 A,B,C 三个节点的集群,在没有复制模型的情况下,如果节点 B 失败了,那么整个集群就
会以为缺少 5501-11000 这个范围的槽而不可用。


6.MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证 redis 中的数据都是热点数据?

1. 热点数据识别

  • 访问频率分析:通过分析 MySQL 中的数据访问频率,识别出最常被访问的数据。可以使用日志分析工具或数据库查询来统计每个数据的访问次数。
  • 使用缓存统计:在应用层面,记录每个数据的访问次数,定期将访问频率高的数据存入 Redis。

2. 数据预热

  • 预加载热点数据:在应用启动时,预先将识别出的热点数据加载到 Redis 中。可以通过定时任务或在用户访问时动态加载。
  • 使用 LRU 策略:Redis 支持 LRU(Least Recently Used)缓存淘汰策略,可以配置 Redis 以自动淘汰不常用的数据,确保热点数据在内存中。

7.Redis key 的过期时间和永久有效分别怎么设置

  • 使用 EXPIRE、SET ... EX 或 PEXPIRE 命令可以设置键的过期时间。

SET mykey "Hello, Redis!"

EXPIRE mykey 60  # 设置 mykey 在 60 秒后过期

SET mykey "Hello, Redis!" EX 60  # 设置 mykey 的值为 "Hello, Redis!",并在 60 秒后过期

SET mykey "Hello, Redis!"

PEXPIRE mykey 1500  # 设置 mykey 在 1500 毫秒后过期

  • 使用 PERSIST 命令可以取消键的过期时间,使其永久有效。

SET mykey "Hello, Redis!" EX 60  # 设置 mykey 在 60 秒后过期

PERSIST mykey  # 取消 mykey 的过期时间,使其永久有效

  • 如果在设置键时不指定过期时间,键将默认是永久有效的。

8.Redis 如何做内存优化?

尽可能使用散列表(hash),散列表(是说散列表里面存储的数少)使用的内存非常小,
所以你应该尽可能的将你的数据模型抽象到一个散列表里面。比如你的 web 系统中有一个
用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的 key,而是应该把这个用户
的所有信息存储到一张散列表里面.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值