redis面试题

本文详细介绍了Redis中的五大数据类型,包括String、List、Set、ZSet和Hash,并探讨了其两种持久化机制:RDB快照和AOF日志。针对缓存穿透和雪崩问题,提出了相应的解决方案,如使用布隆过滤器防止穿透,以及通过设置二级缓存和调整过期时间避免雪崩。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.  redis数据类型有哪几种:

       答:有五种, String  List  Set   ZSet    Hash

2. redis的持久化机制:

       答:Redis 的持久化机制有两种。

             第一种是RDB快照:RDB快照是某个时间点的一次全量数据备份,是二进制文件,在存储上非常紧凑。RDB持久化触发机制分为:手动触发自动触发。自动触发:配置redis.conf,触发规则,自动执行

             第二种是 AOF 日志:AOF日志是持续增量的备份,是基于写命令存储的可读的文本文件,AOF默认是关闭的,通过redis.conf配置文件进行开启

3. Redis的穿透和雪崩:

       答:

              缓存穿透:一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB)。一些恶意的请求会故意查询不存在的key,请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透。

              解决方案:

                               1:对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存。

                                2:布隆过滤器,对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤。

              缓存雪崩:当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,会给后端系统带来很大压力。导致系统崩溃。

              解决方案:(待优化)

                                1:在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。

                                2:做二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期

                                3:不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。

### 常见的 Redis 面试题及其解答 #### 1. Redis 的核心特性是什么? Redis 是一种高性能的键值存储系统,支持多种数据结构,如字符串、哈希、列表、集合和有序集合。其核心特性包括内存中的数据存储能力以及持久化选项的支持[^2]。此外,Redis 使用 I/O 多路复用机制来实现高效的并发处理,从而能够同时响应大量的客户端请求[^1]。 #### 2. Redis 支持哪些数据结构?每种数据结构适用场景如何? Redis 提供了五种主要的数据结构: - **字符串 (String)**:适用于简单的键值对存储,也可以用于计数器功能。 - **哈希 (Hash)**:适合存储对象属性,例如用户的个人信息。 - **列表 (List)**:常用于消息队列或者最近浏览记录等功能。 - **集合 (Set)**:可以用来去重,比如统计唯一访客数量。 - **有序集合 (Sorted Set)**:除了具备集合的功能外,还提供了按分数排序的能力,可用于排行榜等应用。 #### 3. 如何解决 Redis 缓存穿透问题? 缓存穿透是指查询一个既不存在于数据库也不存在于缓存中的 key。为了防止这种情况的发生,可以通过以下方法解决: - 设置空结果的缓存,默认过期时间为较短的时间间隔。 - 对热点 key 进行布隆过滤器预判是否存在再尝试访问缓存或数据库。 #### 4. Redis 中的 AOF 和 RDB 各有什么优缺点? RDB(快照方式)通过定期保存整个数据集到磁盘上完成持久化;而 AOF 则是以日志的形式记录服务器执行的所有写操作指令并追加至文件末尾。两者各有特点: - **RDB**优点在于恢复速度较快,但可能丢失最后一次备份之后的数据变化; - **AOF**则能提供更高的数据安全性,但由于不断增长的日志体积可能导致性能下降。 #### 5. Redis Cluster 工作原理是什么样的? Redis Cluster 实现了一个分布式的解决方案,其中每个节点只负责一部分 keyspace 而不是全部。当 client 发送 request 给任意 node 时,如果该 node 不属于目标 slot,则会返回 MOVED redirect 把 connection 引导到正确的 place。 ```python import rediscluster rc = rediscluster.RedisCluster(startup_nodes=[{"host": "192.168.0.1", "port": "7000"}]) print(rc.get('foo')) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值