分布式缓存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数据库实现在线游戏中的游戏玩家积分排行榜功能。
相关文章
|
11天前
|
存储 负载均衡 NoSQL
【赵渝强老师】Redis Cluster分布式集群
Redis Cluster是Redis的分布式存储解决方案,通过哈希槽(slot)实现数据分片,支持水平扩展,具备高可用性和负载均衡能力,适用于大规模数据场景。
|
2月前
|
存储 缓存 NoSQL
Redis核心数据结构与分布式锁实现详解
Redis 是高性能键值数据库,支持多种数据结构,如字符串、列表、集合、哈希、有序集合等,广泛用于缓存、消息队列和实时数据处理。本文详解其核心数据结构及分布式锁实现,帮助开发者提升系统性能与并发控制能力。
|
4月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
2月前
|
NoSQL Redis
Lua脚本协助Redis分布式锁实现命令的原子性
利用Lua脚本确保Redis操作的原子性是分布式锁安全性的关键所在,可以大幅减少由于网络分区、客户端故障等导致的锁无法正确释放的情况,从而在分布式系统中保证数据操作的安全性和一致性。在将这些概念应用于生产环境前,建议深入理解Redis事务与Lua脚本的工作原理以及分布式锁的可能问题和解决方案。
97 8
|
2月前
|
存储 NoSQL 定位技术
Redis数据类型面试给分情况
Redis常见数据类型包括:string、hash、list、set、zset(有序集合)。此外还包含高级结构如bitmap、hyperloglog、geo。不同场景可选用合适类型,如库存用string,对象存hash,列表用list,去重场景用set,排行用zset,签到用bitmap,统计访问量用hyperloglog,地理位置用geo。
66 5
|
3月前
|
缓存 NoSQL 算法
高并发秒杀系统实战(Redis+Lua分布式锁防超卖与库存扣减优化)
秒杀系统面临瞬时高并发、资源竞争和数据一致性挑战。传统方案如数据库锁或应用层锁存在性能瓶颈或分布式问题,而基于Redis的分布式锁与Lua脚本原子操作成为高效解决方案。通过Redis的`SETNX`实现分布式锁,结合Lua脚本完成库存扣减,确保操作原子性并大幅提升性能(QPS从120提升至8,200)。此外,分段库存策略、多级限流及服务降级机制进一步优化系统稳定性。最佳实践包括分层防控、黄金扣减法则与容灾设计,强调根据业务特性灵活组合技术手段以应对高并发场景。
808 7
|
3月前
|
缓存 NoSQL Java
Java Redis 面试题集锦 常见高频面试题目及解析
本文总结了Redis在Java中的核心面试题,包括数据类型操作、单线程高性能原理、键过期策略及分布式锁实现等关键内容。通过Jedis代码示例展示了String、List等数据类型的操作方法,讲解了惰性删除和定期删除相结合的过期策略,并提供了Spring Boot配置Redis过期时间的方案。文章还探讨了缓存穿透、雪崩等问题解决方案,以及基于Redis的分布式锁实现,帮助开发者全面掌握Redis在Java应用中的实践要点。
138 6
|
4月前
|
NoSQL 算法 安全
redis分布式锁在高并发场景下的方案设计与性能提升
本文探讨了Redis分布式锁在主从架构下失效的问题及其解决方案。首先通过CAP理论分析,Redis遵循AP原则,导致锁可能失效。针对此问题,提出两种解决方案:Zookeeper分布式锁(追求CP一致性)和Redlock算法(基于多个Redis实例提升可靠性)。文章还讨论了可能遇到的“坑”,如加从节点引发超卖问题、建议Redis节点数为奇数以及持久化策略对锁的影响。最后,从性能优化角度出发,介绍了减少锁粒度和分段锁的策略,并结合实际场景(如下单重复提交、支付与取消订单冲突)展示了分布式锁的应用方法。
283 3
|
6月前
|
数据采集 存储 数据可视化
分布式爬虫框架Scrapy-Redis实战指南
本文介绍如何使用Scrapy-Redis构建分布式爬虫系统,采集携程平台上热门城市的酒店价格与评价信息。通过代理IP、Cookie和User-Agent设置规避反爬策略,实现高效数据抓取。结合价格动态趋势分析,助力酒店业优化市场策略、提升服务质量。技术架构涵盖Scrapy-Redis核心调度、代理中间件及数据解析存储,提供完整的技术路线图与代码示例。
544 0
分布式爬虫框架Scrapy-Redis实战指南
|
4月前
|
数据采集 存储 NoSQL
基于Scrapy-Redis的分布式景点数据爬取与热力图生成
基于Scrapy-Redis的分布式景点数据爬取与热力图生成
272 67