redis面试总结

redis的数据类型?

string字符串:类似于java中Map<String,String>。存储字符串、JSON数据、验证码等。

Hash字典:类似java中Map<String, Map<Spring,String>>。比较适合存储对象数据。

List列表:类似java中Map<String, List<String>>。有序、可重复集合。

Set集合:类似java中Map<String, Set<String>>。无序,不可重复。redis提供了交集、并集等操作。

ZSet有序集合:类似java中Map<String, Sort Set<String>>。redis中在zset中提供了score属性,可以根据score进行排序。常用于排行榜等。

什么是缓存击穿、穿透、雪崩?

缓存击穿:redis中某一个key到了过期时间,但这个key还承接着大量的并发请求,导致并发到达数据库,导致数据库压力剧增(压垮、断掉)。

解决:给key设置合理有效时间(对应热点key设置永不过期)。互斥锁(当缓存失效时,通过互斥锁来保护数据库的访问过程。当一个热点key失效时,用互斥锁方式,只让一个请求到数据库查询数据并加载到缓存)。逻辑过期(当查询缓存发现逻辑时间已过期时,会成功获取一个互斥锁,并开启一个新线程进行查询数据库重建缓存数据的操作,然后写入缓存并重置逻辑过期时间,最后释放锁。这种方法可以在缓存击穿问题发生时,避免大量请求直接访问数据库,减轻数据库压力)。

缓存穿透:查询了一个redis中不存在,并且数据库中也不存在的数据。(每次请求直达数据库)

解决:缓存空数据(key,null)。布隆过滤器(先在布隆过滤器中判断是否存在,不存在直接返回)。

缓存雪崩:在同一时间内,redis中大量的key都过期了,导致大量请求到达数据库。

解决:给不同的可以设置不同的过期时间(给过期时间添加随机姓)。利用redis集群,提高可用性。

redis的数据过期策略和数据淘汰策略?

惰性过期策略:查询一个key,判断是否过期,过期直接删除。

定期过期策略:在redis中每过一段时间,查询key是否过期,过期直接删除。

redis的过期策略是惰性过期策略加定期过期策略。查询一个key,若过期就直接删除。每隔一段时间,随机抽取一定数量的key,查询是否过期,过期直接删除。

当redis的内存满了,会触发数据淘汰策略。

redis内存不够,不删除任何数据,直接报错。(redis的默认方式)

LRU:最近最少使用。用当前时间减去最后一次访问时间,值越大被删除的优先级越高。

LFU:最少频率使用。redis中会统计每个key的访问频率,值越小被删除的优先级越高。

redis是单线程,为什么还那么快?

因为redis是纯内存操作的,redis是单线程。

每来一个请求,IO多路复用就会创建一个socket,这样redis就可以同时处理多个请求了。然后redis会把socket压到一个队列中,一个一个执行。单线程处理,并返回结果。

redis的持久化?

RDB:是基于内存快照的方式进行数据的全量备份。redis的主进程根据配置自动触发,fork一个子进程进行全量备份(二进制文件)。但redis宕机,会丢失距下一次快照时间内的数据。重启后,恢复数据快。(redis默认开启)

AOF:是基于日志文件进行数据备份。每一次Redis写操作,都记录在AOF日志中。当AOF体积大到配置值,会触发AOF重写操作,生成一个新的AOF文件。AOF比RDB文件大,重启后,恢复数据较慢。

redis分布式锁?

Redis分布式锁是由Redisson实现的。原理为setnx和lua脚本,setnx是判断key是否存在,若存在才添加,这个行为可以视为上锁。Del删除key,可以视为释放锁。

redisson有个watchDog的线程,一个线程获取锁后,watchDog会给持锁线程续期。

Redisson是可重入锁,内部有hash存储线程与重入次数,同一个线程每次获取锁会对应加1,释放锁会减1

Redisson不能解决主从数据一致的问题,但可以用redisson提供的红锁解决,但性能很低,可以用zookeeper。

主从数据同步?

一个redis的并发能力是有上限的,进一步提高并发能力就需要搭建主从集群。redis集群分为主节点,只有一个,提供读和写操作。从节点,多个,提供读操作。从节点需要与主节点进行数据同步。从节点请求同步发送自己的版本id和偏移量信息,主节点判断是否是第一次同步数据,若为第一次,(bgsave)则会fork一个子进程生成rdb文件发给子节点,子节点根据rdb进行数据同步。若不为第一次,主节点每次操作会记录到一个relp的文件,根据从节点发来的偏移量,发送记录操作。子进程根据写操作同步数据。

哨兵机制?

场景:redis是集群部署,并且还有哨兵集群。哨兵会实时监控主节点redis的情况,当一个哨兵检测主节点redis宕机,并不会主从替换,因为一个哨兵检测异常,可能因为网络的问题导致。当大部分哨兵发现主节点redis异常,会进行哨兵选举,让一个哨兵进行主从切换。(自动切换)

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
关于Java和Redis面试题,你可以参考以下资源: 1. "Java基础教程(入门篇)"这本书中可能包含与Java和Redis相关的基础知识点,例如如何连接和操作Redis以及在Java中使用Redis的常见场景。 2. "java面试大集合"这本书中可能包含Java和Redis面试题,涵盖了Java技术栈以及与Redis相关的问题。你可以浏览这本书中的相关章节以寻找你感兴趣的Java和Redis面试题。 3. "Java基础教程(进阶篇)"这本书可能包含更深入的Java和Redis面试题,例如Java高并发和如何在Java中使用Redis进行缓存。 这些资源可能会给你提供一些有关Java和Redis面试题的参考。你可以根据自己的需求和兴趣选择适合的资源进行学习。希望这些资源能帮助到你。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [redis面试总结(附答案)](https://blog.csdn.net/guorui_java/article/details/117194603)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [java面试大集合一共485页](https://download.csdn.net/download/wm9028/88268176)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值