Redis
- redis快的原因:完全基于内存操作,请求都在内存中所以快;它是单线程,省去了线程切换的时间和锁竞争的开销。采用io多路复用,多路指多个网络,对单个线程进行复用,避免了大量无用的操作。
- 为什么使用redis:速度快,支持丰富的数据类型,redis集群不支持事务,内部单节点支持事务,操作都是原子性的,还可以用来缓存,按key设置过期时间,过期后自动删除。
- Redis常用的数据结构:String:动态变长字符串,计数功能
List:前后插入和删除都很快,随即定位慢,用来秒杀场景。
Hash:相当于hashmap,用于保存结构体信息。
Set:相当于HashSet,无序集合,不能出现重复数据,用于去重场景。
Zset:用于热门排序场景。
Redis过期删除策略:惰性删除:只会在取出key的时候才对数据进行过期检 查,这样对cpu也是很好的。
定期删除:每隔一段时间抽取一批key执行删除过期的 key操作;redis底层会限制删除操作的时长 和频率,减少对cpu的影响。redis的内存淘汰策略:1,从已设置过期时间的数除。 5挑选移除最近最少使用的key 。6.禁止驱逐数据,内存满了之后再添加数据就会报错。
Redis持久化机制RDB和AOF的区别:
RDB:其实就是把数据以快照的形式保据集中挑选将要过期的数据淘汰。2从过期数据集中任意挑选数据进行淘汰。 3.从数据集里面挑选最近最少使用的数据淘汰。4从数据集里任意挑选数据删存到磁盘中。它很适合用于灾难恢复,因为它只有一个文件,并且内容十分紧凑。AOF:通过写操作日志的方式,记录数据。
RDB:占用存储空间小,存储速度慢,恢复速度快,会丢数据,消耗的资源比较高。
AOF:占用存储空间大,存储速度快,根据策略决定数据的丢失,消耗的资源比较小。
如何选择RDB与AOF:1 数据不敏感,并且可以从其他部分重新生成补回,那就不适用持久化。2 数据比较重要,不想从其他地方获取,可以承担数分钟的数据丢失,可以使用去RDB。3 使用做内存数据库,RDB与AOF都开启,rdb进行数据备份,aof保证数据不丢失。
- 如何保证redis与DB数据一致:1 使用同步双写,更新完数据库就立即同步更新redis。2 使用MQ异步,更新完DB后生产消息到MQ,mq消费者更新数据到redis。
- Redis的缓存预热:系统上线后,提前将缓存数据加载到缓存系统。如果不进行预热,系统上线初期,对高并发的流量,都会访问到数据库,会造成数据库的压力。
- 什么是缓存降级:在缓存失效或缓存服务器挂掉,不去访问数据库,而是访问默认数据或服务器内存数据。
- redis缓存击穿,缓存穿透,雪崩?
穿透:缓存和数据库都没有数据,一直访问使数据库崩掉。解决:加过滤器
击穿:redis没有数据但数据库有数据,大量访问同时请求,数据会崩掉。解决:加分布式锁,一条数据访问数据库。
雪崩:大面积数据失效,或者服务器宕机,请求穿过缓存来访问数据库。解决:缓存备份,设置随机缓存中数据过期时间。
- 分布式锁:分布式系统中的锁,解决分布式系统中控制共享资源的访问,于单体应用比,竞争资源的最小粒度从线程变成进程。
- Redis的实现分布式锁特点:1在分布式环境下,一个方法只能在同一时间被一个线程执行。2 高可用,高性能获取锁,释放锁。3具备锁失效机制,自动解锁,防止死锁。4具备非阻塞特性,没有获取到锁直接返回获取锁失败。
- Redis锁的实现:使用setnx进行加锁,指令返回1,说明加锁成功,当得到锁的线程执行完任务,使用del命令释放锁,要给锁设置超时时间,防止获取到锁的线程在执行过程中挂掉,来不及释放锁。
- 延迟双删:在更新数据库时,需要同步redis中缓存的数据。一:先执行请求1update再执行缓存清除,弊端是在更新数据时,请求2读的是旧数据。
二:请求1清除缓存,还没有进行update,请求2进行查询到数据库的旧数据再写入redis。
双删:先进行缓存清除,再执行update,最后延迟N秒,再进行缓存清除(两次缓存删除)。
19.遍历key:1.遍历所有的key,使用keys pattern,一次返回符合的全部数据 。 2.渐进式遍历:使用scan命令,会返回少量数据。
标签:面试题,缓存,redis,数据库,Redis,----,key,数据 From: https://www.cnblogs.com/ybex/p/17557432.html