面试题--13

Redis是一个高速缓存数据库,常用于存储热点数据、用户会话等。文章介绍了缓存穿透、击穿、雪崩问题及其解决方案,如布隆过滤器、互斥锁等。此外,讨论了Redis的数据类型、持久化方法、分布式锁实现及淘汰策略。
摘要由CSDN通过智能技术生成

1.Redis 是什么?都有哪些使用场景?
2. Redis 有哪些功能?
3.什么是缓存穿透?怎么解决?
4.什么是缓存击穿?如何解决?
5. 什么是缓存雪崩?如何解决?
6.Redis 支持的数据类型有哪些?
7.怎么保证缓存和数据库数据的一致性?
8.Redis 持久化有几种方式?
9.Redis 怎么实现分布式锁?
10.Redis 淘汰策略有哪些?

1.Redis 是什么?都有哪些使用场景?

Redis是一个使用C语言开发的高速缓存数据库。

Redis使用场景

  • 记录帖子点赞数、点击数、评论数;
  • 缓存近期热点数据;
  • 记录用户会话信息。

2. Redis 有哪些功能?

数据缓存功能
分布式锁的功能
支持数据持久化
解决分布式会话

3.什么是缓存穿透?怎么解决?

缓存穿透:指查询一个一定不存在的数据,由于缓存是不命中时需要从数据 库查询,查 不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓 存穿透

解决:

1.最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大 的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免 了对底层存储系统的查询压力。

2.另外也有一个更为简单粗暴的方法(我们采用的就是这种),如果一个查 询返回的数据为空(不管是数据不存在,还是系统故障),我们仍然把这个 空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。

4.什么是缓存击穿?如何解决?

缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。

缓存击穿解决方案:
1.设置永久不过期。【这种只适合】
2.使用互斥锁(mutex key)业界比较常用的做法,是使用mutex。简单地来说,就是在缓存失效的时候(判断拿出来的值为空),不是立即去load db,而是先使用缓存工具的某些带成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去set一个mutex key,当操作返回成功时,再进行load db的操作并回设缓存;否则,就重试整个get缓存的方法。代码如下:

 public String get(key) {
 	String value = redis.get(key);
 	if (value == null) { //代表缓存值过期
 	//设置3min的超时,防止del操作失败的时候,下次缓存过期一直不能load db
 	if (redis.setnx(key_mutex, 1, 3 * 60) == 1) {
		//代表设置成功
 		value = db.get(key);
 			redis.set(key, value, expire_secs);
 			redis.del(key_mutex);
 	} else { //这个时候代表同时候的其他线程已经load db并回设到缓存了,这时候重试获取缓存值即可
 			sleep(50);
 			get(key); //重试
 	  }
 	} else {
 		return value;
 	}
 }

5. 什么是缓存雪崩?如何解决?

缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是, 缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

解决方案:
1.缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
2.如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。
3.设置热点数据永远不过期。

6.Redis 支持的数据类型有哪些?

Redis 支持的数据类型:string(字符串)、list(列表)、hash(字典)、set(集 合)、zset(有序集合)。

7.怎么保证缓存和数据库数据的一致性?

合理设置缓存的过期时间。

新增、更改、删除数据库操作时同步更新 Redis,可以使用事物机制来保证 数据的一致性。

8.Redis 持久化有几种方式?

Redis 的持久化有两种方式,或者说有两种策略:

RDB(Redis Database):指定的时间间隔能对你的数据进行快照存 储。

AOF(Append Only File):每一个收到的写命令都通过 write 函 数追加到文 件中。

9.Redis 怎么实现分布式锁?

Redis 分布式锁其实就是在系统里面占一个“坑”,其他程序也要占“坑”的 时候,占 用成功了就可以继续执行,失败了就只能放弃或稍后重试。

占坑一般使用 setnx(set if not exists)指令,只允许被一个程序占 有,使用完调用 del 释放锁。

10.Redis 淘汰策略有哪些?

Redis 分布式锁其实就是在系统里面占一个“坑”,其他程序也要占“坑”的
时候,占 用成功了就可以继续执行,失败了就只能放弃或稍后重试。
占坑一般使用 setnx(set if not exists)指令,只允许被一个程序占
有,使用完调用 del 释放锁

volatile-lru:从已设置过期时间的数据集(server. db[i]. expires)中挑 选最近最少使用的数据淘汰。

volatile-ttl:从已设置过期时间的数据集(server. db[i]. expires)中挑 选将要过期的数据淘汰。

volatile-random:从已设置过期时间的数据集(server. db[i]. expires)中 任意选择数据淘汰。

allkeys-lru:从数据集(server. db[i]. dict)中挑选最近最少使 用的数据 淘汰。

allkeys-random:从数据集(server. db[i]. dict)中任意选择数 据淘汰。

no-enviction(驱逐):禁止驱逐数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值