分布式缓存Redis常见面试题

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 分布式缓存Redis常见面试题

1947ae02c80b49c5a75b651207872fbb.jpg

1.简单说一下Redis Cluster集群模式?

Cluster是redis 3.0推出,采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。Cluster数据分片的算法有哈希取模、范围分片、一致性Hash分区,Redis集群预分好16384个槽,当需要在Redis集群中放置一个key-value时,根据key的检验算法跟槽位取模,然后确定放置在哪个槽位。官方推荐6个节点,三主三从,主节点会自动分配,不是人工指定,主节点故障后,从节点会替换主节点。

2.说下Redis key的八种淘汰策略?

  • volatile-lru:最近最少使用算法,从设置了过期时间的key中选出空转时间最长的键对其进行清除。
  • volatile-lfu:最近不常用算法,从设置了过期时间的键中选择某段时间之内使用频次最小的键清除。

volatile-ttl:从设置了过期时间的键中选择过期时间最早的键对其清除。

volatile-random:从设置了过期时间的key中,随机进行清除

allkeys-lru:最近最少使用算法,从所有的key中选出空转时间最长的键对其清除。

allkeys-lfu:最近不经常使用算法,从所有的key中选出某段时间内使用频次最少的键值对其清除。

allkeys-random:所有键中,随机选择键进行删除。

noeviction:不做任何处理。

3.Redis key的过期策略?

定期删除:隔一段时间就会随机抽取一些设置了过期时间的key,检查是否已经过期,如果过期了就会删除,但是定期删除可能会导致很多过期的key到了时间但是还没有被删除。

惰性删除:当用户尝试的去访问它时,key会被发现并发现过期,惰性删除算法就会删除key。

定时删除:创建一个定时器,当key设置有过期时间,且过期时间到达时,由定时器任务立即执行对键的删除操作, 但是对CPU的消耗会特别大。

4.说一说Redis的持久化方式?

Redis的持久化方式,分为两种RDB和AOF方式。

RDB:在指定的时间间隔内将内存中的数据集快照写入磁盘,默认的文件名为dump.rdb。save 900 5表示在900s内持久化5个key。文件紧凑,全量备份,适用于备份和灾难恢复。

AOF:追加文件的方式,以独立日志的方式记录每次写的命令,重启时重新执行AOF中的命令达到恢复。appendonly yes 开启aof持久化方式,默认是不开启的。默认文件名appendonly.aof,aof一共三种同步方式:appendfsync always(每次修改数据都会写入aof文件),appendfsync everysec(每秒同步一次),appendfsync no(从不同步),当AOF文件越来越大的时候会重写和压缩。

Redis4.0开启rdb和aof一起使用,直接将rdb持久化的方式来操作,将二进制的内容覆盖到aof文件中,写的话还是继续append追加到文件原始命令,等下次文件过大的时候再次rewrite。

5.Redis常见的数据结构有哪些?它们都有哪些作用?

String类型可以用作图形验证码,设置过期时间,可以做一些热点数据的使用,还可以实现分布式锁。

List类型可以做昨日热销榜单,不是实时的,由后台定时计算,0点更新榜单。

Set类型可以作为大数据下用户标签的去重,关注、共同好友等,用Set的交集、并集、差集处理。

Hash类型可以用作购物车实现,大Map->BoundHashOperations。

SortedSet类型可以用作电商热销实时榜单,用户游戏积分排名,IT视频热销榜单等。

6.Redis怎末实现分布式锁?

Redis实现分布式锁用String类型来做分布式锁的设置。

分布式锁的核心是保证同一时间,只能有一个client对共享资源进行操作。

背景就是优惠券领取次数限制、商品库存超卖。

设计分布式锁的时候主要要注意两点,第一就是在加锁的时候,保证加锁的原子性,也就是说在Redis中设置一个Key并且带有过期时间,这一步的操作是原子性的,第二就是在释放锁的时候,保证线程释放的是自己的锁。所以在加锁的时候采用redisTemplate中的opsFosValue().setIfAbsent()方法,加锁设置过期时间。那么保证了加锁的原子性,还要保证在释放锁的时候不会因为业务逻辑的执行慢,A线程的锁过期了,而删掉了B线程的锁。所以在释放锁所资源的时候判断一下是不是自己加的锁,value存储当前线程的唯一标识。删除的时候也是采用Lua脚本+redis保证删除的原子性。

7.说一说Redis主从复制的原理?

刚连接时,从节点回向主节点发送一个sync指令,master服务器会开启一个后台进程开始给从服务器同步数据,同步的是rdb文件,从服务器将rdb文件保存在磁盘并通过取该文件将数据读到内存,在此之后,master会将同步期间缓存的命令通过AOF的方式给slave服务器,然后slave将这些命令依次作用在自己的服务器上,和主服务器保持一致。

8.什么是缓存击穿、缓存穿透和缓存雪崩?

缓存击穿:某个热点key失效,缓存中没有但是数据库中有数据,假如某个key是热点数据,那个key在缓存过期的那一刻,同时有大量的请求,这些请求都会击穿到DB上,造成DB请求量增大。

解决办法:设置热点key不过期,定时任务更新缓存或者设置互斥锁,当请求过来时,发现缓存不存在数据时,就给当前请求加锁,后面的请求等待或者返回,当从数据库中拿出来放到缓存中时,就可以释放锁资源。

缓存雪崩:多个热点key缓存失效,大量的key设置了相同的过期时间、导致缓存在同一时间全部失效,造成瞬时DB请求量大、压力剧增。

解决办法:存数据的过期时间设置随机,防止同一时间大量数据过期现象发生或者设置热点数据永不过期。

缓存穿透:查询不存在的数据,由于缓存没有命中,DB也没有命中,给DB造成压力。

解决办法:增加接口层校验或者缓存和数据库都没有找到将一个-1缓存到redis中,防止这个key一直被攻击。




















相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
21天前
|
canal 缓存 NoSQL
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
根据对一致性的要求程度,提出多种解决方案:同步删除、同步删除+可靠消息、延时双删、异步监听+可靠消息、多重保障方案
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
|
21天前
|
存储 缓存 NoSQL
【Java面试题汇总】Redis篇(2023版)
Redis的数据类型、zset底层实现、持久化策略、分布式锁、缓存穿透、击穿、雪崩的区别、双写一致性、主从同步机制、单线程架构、高可用、缓存淘汰策略、Redis事务是否满足ACID、如何排查Redis中的慢查询
【Java面试题汇总】Redis篇(2023版)
|
22天前
|
存储 NoSQL Redis
SpringCloud基础7——Redis分布式缓存,RDB,AOF持久化+主从+哨兵+分片集群
Redis持久化、RDB和AOF方案、Redis主从集群、哨兵、分片集群、散列插槽、自动手动故障转移
SpringCloud基础7——Redis分布式缓存,RDB,AOF持久化+主从+哨兵+分片集群
|
5天前
|
存储 缓存 NoSQL
解决Redis缓存击穿问题的技术方法
解决Redis缓存击穿问题的技术方法
19 2
|
5天前
|
缓存 NoSQL Redis
解决 Redis 缓存穿透问题的有效方法
解决 Redis 缓存穿透问题的有效方法
17 2
|
12天前
|
缓存 监控 NoSQL
阿里面试让聊一聊Redis 的内存淘汰(驱逐)策略
大家好,我是 V 哥。粉丝小 A 面试阿里时被问到 Redis 的内存淘汰策略问题,特此整理了一份详细笔记供参考。Redis 的内存淘汰策略决定了在内存达到上限时如何移除数据。希望这份笔记对你有所帮助!欢迎关注“威哥爱编程”,一起学习与成长。
|
15天前
|
存储 缓存 Android开发
Android RecyclerView 缓存机制深度解析与面试题
本文首发于公众号“AntDream”,详细解析了 `RecyclerView` 的缓存机制,包括多级缓存的原理与流程,并提供了常见面试题及答案。通过本文,你将深入了解 `RecyclerView` 的高性能秘诀,提升列表和网格的开发技能。
39 8
|
5天前
|
NoSQL 安全 关系型数据库
20)用 Redis 实现分布式锁
20)用 Redis 实现分布式锁
15 0
|
1月前
|
缓存 NoSQL 关系型数据库
MySQL与Redis缓存一致性的实现与挑战
在现代软件开发中,MySQL作为关系型数据库管理系统,广泛应用于数据存储;而Redis则以其高性能的内存数据结构存储特性,常被用作缓存层来提升数据访问速度。然而,当MySQL与Redis结合使用时,确保两者之间的数据一致性成为了一个重要且复杂的挑战。本文将从技术角度分享MySQL与Redis缓存一致性的实现方法及其面临的挑战。
64 2
|
2月前
|
缓存 NoSQL Redis
【Azure Redis 缓存】Redission客户端连接Azure:客户端出现 Unable to send PING command over channel
【Azure Redis 缓存】Redission客户端连接Azure:客户端出现 Unable to send PING command over channel
下一篇
无影云桌面