分布式缓存Redis常见面试题

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
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
相关文章
|
6天前
|
缓存 NoSQL 关系型数据库
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
本文详解缓存雪崩、缓存穿透、缓存并发及缓存预热等问题,提供高可用解决方案,帮助你在大厂面试和实际工作中应对这些常见并发场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
|
7天前
|
存储 缓存 NoSQL
【赵渝强老师】基于Redis的旁路缓存架构
本文介绍了引入缓存后的系统架构,通过缓存可以提升访问性能、降低网络拥堵、减轻服务负载和增强可扩展性。文中提供了相关图片和视频讲解,并讨论了数据库读写分离、分库分表等方法来减轻数据库压力。同时,文章也指出了缓存可能带来的复杂度增加、成本提高和数据一致性问题。
【赵渝强老师】基于Redis的旁路缓存架构
|
7天前
|
NoSQL Redis
Redis分布式锁如何实现 ?
Redis分布式锁通过SETNX指令实现,确保仅在键不存在时设置值。此机制用于控制多个线程对共享资源的访问,避免并发冲突。然而,实际应用中需解决死锁、锁超时、归一化、可重入及阻塞等问题,以确保系统的稳定性和可靠性。解决方案包括设置锁超时、引入Watch Dog机制、使用ThreadLocal绑定加解锁操作、实现计数器支持可重入锁以及采用自旋锁思想处理阻塞请求。
40 16
|
15天前
|
缓存 NoSQL Redis
Redis 缓存使用的实践
《Redis缓存最佳实践指南》涵盖缓存更新策略、缓存击穿防护、大key处理和性能优化。包括Cache Aside Pattern、Write Through、分布式锁、大key拆分和批量操作等技术,帮助你在项目中高效使用Redis缓存。
90 22
|
14天前
|
缓存 NoSQL 中间件
redis高并发缓存中间件总结!
本文档详细介绍了高并发缓存中间件Redis的原理、高级操作及其在电商架构中的应用。通过阿里云的角度,分析了Redis与架构的关系,并展示了无Redis和使用Redis缓存的架构图。文档还涵盖了Redis的基本特性、应用场景、安装部署步骤、配置文件详解、启动和关闭方法、systemctl管理脚本的生成以及日志警告处理等内容。适合初学者和有一定经验的技术人员参考学习。
103 7
|
19天前
|
存储 缓存 监控
利用 Redis 缓存特性避免缓存穿透的策略与方法
【10月更文挑战第23天】通过以上对利用 Redis 缓存特性避免缓存穿透的详细阐述,我们对这一策略有了更深入的理解。在实际应用中,我们需要根据具体情况灵活运用这些方法,并结合其他技术手段,共同保障系统的稳定和高效运行。同时,要不断关注 Redis 缓存特性的发展和变化,及时调整策略,以应对不断出现的新挑战。
52 10
|
18天前
|
存储 NoSQL Redis
Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList
String类型底层数据结构,List类型全面解析,ZSet底层数据结构;简单动态字符串SDS、压缩列表ZipList、哈希表、跳表SkipList、整数数组IntSet
|
1月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(一)
数据的存储--Redis缓存存储(一)
|
1月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(二)
数据的存储--Redis缓存存储(二)
数据的存储--Redis缓存存储(二)
|
1月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
74 6