Java面试 Redis

目录

 

七、Redis

1、redis是什么,有哪些使用场景?

2、redis有哪些功能?

3、redis和memecache有什么区别

4、redis为什么是单线程的

5、什么是缓存穿透,怎么解决

6、redis支持的数据类型有哪些

7、redis支持的Java客户端都有哪些

8、jedis和Redisson有哪些区别

9、redis持久化有几种方式

10、怎么保证缓存和数据库数据的一致性

11、redis怎么实现分布式锁

12、redis分布式锁有什么缺陷

13、Redis如何做内存优化

14、redis淘汰策略有哪些

15、redis常见的性能问题有哪些?该如何解决

16、为什么redis需要把所有数据放到内存中

17、Redis最适合的场景有哪些

18、Redis优缺点

19、一个字符串类型的值能存储的最大容量是多少?

20、redis的持久化机制是什么,各自的优缺点

21、Redis过期键的删除策略

22、怎么设置缓存值的过期时间

23、使用过Redis异步队列吗,你是怎么用的

24、如果有大量的key需要设置同一时间过期,一般需要注意什么

25、假如redis里面有一亿个key,其中有10W个key是以某个固定的已知的前缀开头的,如何将他们全部找出来

26、MySQL里有2000W数据,redis中只存20w数据,如何保证redis中的数据都是热点数据

27、一个redis实例中最多能存放多少的keys?List、set、StoredSet他们最多能存放多少元素

28、Redis的内存用完了会发生什么

29、Redis回收进程如何工作的

30、都有哪些办法可以降低Redis的内存使用情况呢

31、Redis key 的过期时间和永久有效分别怎么设置

32、Redis如何做内存优化

33、怎么测试Redis的连通性

34、Redis集群最大节点个数是多少?Redis集群如何选择数据库

35、Redis集群的主从复制模型是怎样的

36、Redis集群会有写操作丢失吗?为什么

37、Redis集群之间是如何复制的

38、说说Redis哈希槽的概念

39、Redis的同步机制了解吗

40、是否使用过Redis集群,集群的原理是什么?

41.Redis集群方案什么情况下会导致整个集群不可用

42、Pipeline有什么好处,为什么使用它

43、redis6.0之后为什么引入了多线程

44、如何判断数据是否过期

45、缓存雪崩

46、面对缓存雪崩,应该怎么解决


七、Redis

1、redis是什么,有哪些使用场景?

       redis是一个开源的使用ANSIC语言编写,支持网络,可基于内存亦可持久化的日志型,key-value数据库,并提供多种语言的API

       使用场景:数据高并发的读写、海量数据的读写、对扩展性要求高的数据

2、redis有哪些功能?

       数据缓存功能、分布式锁的功能、支持数据持久化、支持事务、支持消息队列

3、redis和memecache有什么区别

       memecache所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型

       redis的速度比memecache快很多

       redie可以持久化其数据

4、redis为什么是单线程的

       因为CPU不是redis的瓶颈,redis的瓶颈最有可能是机器内存或者网络宽带,既然单线程容易实现,而且CPU又不会成为瓶颈,那么顺理成章的采用单线程的方案了

       关于redis的性能,官网上也有,普通笔记本轻松处理每秒几十万的请求

       而且单线程并不代表就慢,nginx和nodejs也都是高性能单线程的代表

5、什么是缓存穿透,怎么解决

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

       解决方案:如果一个查询返回的数据为空(不管数据存不存在)我们就把这个空结果进行缓存,但是他的过期时间会很短,最长不超过五分钟

6、redis支持的数据类型有哪些

       String,list,hash,set,zset

7、redis支持的Java客户端都有哪些

       Redission,Jedis,Lettuce等,官方推荐Redisson

8、jedis和Redisson有哪些区别

       Jedis是redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持

       Redisson实现了分布式和可扩展的Java数据结构,和Jedis相比,功能较为简单,不支持字符串操作,不支持排序,事务,管道,分区等Redis特性,Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上

9、redis持久化有几种方式

       RDB:指定的时间间隔能对你的数据进行快照存储

       AOF:每一个收到的写命令都通过write函数追加到文件中

10、怎么保证缓存和数据库数据的一致性

       合理设置缓存的过期时间

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

11、redis怎么实现分布式锁

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

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

12、redis分布式锁有什么缺陷

       Redis分布式锁不能解决超时的问题,分布式锁有一个超时时间,程序的执行如果超过了锁的超时时间就会出现问题

13、Redis如何做内存优化

       尽可能使用散列表,散列表使用的内存非常小,所以应该尽可能的将你的数据模型抽象到一个散列表里面

14、redis淘汰策略有哪些

       volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据进行淘汰

       volatile-ttl:从一设置过期时间的数据集中挑选将要国企的数据进行淘汰

       volatile-random:从已设置过期时间的数据集中任意选择数据淘汰

       allkeys-lru:从数据集中太偶先最近最少使用的数据淘汰

       allkeys-random:从数据集中任意选择数据淘汰

       no-enviction:禁止驱逐数据

15、redis常见的性能问题有哪些?该如何解决

       主服务器写内存快照,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以主服务器最好不要写内存快照

       redis主从复制的性能问题,为了主从复制的速度和连接的稳定性,主从库最好在同一个局域网内

16、为什么redis需要把所有数据放到内存中

       redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘,所以redis具有快速和数据持久化的特征,如果不将数据放在内存中,磁盘I/O速度为严重影响redis的性能,在内存越来越便宜的今天,redis将会越来越受欢迎,如果设置了最大使用内存,则数据已有记录数达到内存限值后不能继续插入新值

17、Redis最适合的场景有哪些

       会话缓存

       全页缓存

       队列

       排行榜、计数器

       发布、订阅

18、Redis优缺点

       优点:性能极高       ——redis能支持超过100K++每秒的读写频率

                     丰富的数据类型       ——Redis支持二进制案例的String,Lists,Hashes,Sets及 OrderedSet数据类型操作

                     原子性       ——Redis的所有操作都是原子性的,同时,Redis还支持对几个操作合并后的原子性执行

                     丰富的特性       ——Redis支持publish、subscribe,通知,key过期等

       缺点:由于是内存数据库,所以,单台机器,存储的数据量跟机器本身的内存大小有关,虽然redis本身有key策略,但是还是需要提前预估和节约内存。如果内存增长过快,需要定期删除数据

                     如果进行完整重同步,由于需要生成rdb文件,并进行传输,会占用主机的CPU,并会消耗现网的宽带

                     修改配置文件,进行重启,将硬盘中的数据加载进内存,时间比较久,在这个过程中,redis不能提供服务

19、一个字符串类型的值能存储的最大容量是多少?

       512M

20、redis的持久化机制是什么,各自的优缺点

       Redis提供了RDB和AOF两种持久化机制

       RDB:用数据集快照的方式记录redis数据库的所有键值对,在某个时间点将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复

              优点:只有一个文件dump.rdb,方便持久化

                            容灾性好,一个文件可以保存到安全的磁盘

                            性能最大化,fork子进程来完成完成写操作,让主进程继续处理命令,所以是IO最大化

                            相对于数据集大时,比AOF启动效率更高

              缺点:数据安全性低

       AOF:所有的命令行记录以redis命令请求协议的格式存为aof文件

              优点:数据安全,每进行一次命令操作就记录到aof文件中一次

                            通过append模式写文件,即使中途服务器宕机,可以通过redis-check-aof工具解决数据一致性问题

                            AOF机制rewrite模式

              缺点:AOF文件比RDB文件大,且回复速度慢

                            数据集大时,比RDB启动效率低

21、Redis过期键的删除策略

       定时删除:在设置键的过期时间的同时,创建一个定时器,让定时器在键的国企时间来临时,立即执行对键的删除操作

       惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键,如果没有过期,就返回该键

       定期删除:每隔一段时间程序就对数据库进行一次检查,删除里面的过期键,至于要删除多少过期键,以及检查多少个数据库,则由算法决定

       redis采用的是定期删除+惰性删除

22、怎么设置缓存值的过期时间

       常用的方式:expire key time(以秒为单位)

       字符串独有的方式:setex

       如果没有设置时间,那缓存就是永不过期

23、使用过Redis异步队列吗,你是怎么用的

       一般使用list结构作为队列,rpush生产消息,lpop消费消息,当lpop没有消息的时候,要适当sleep一会在重试

       如果对方追问可不可以使用sleep呢

              list还有个指令叫做blpop,在没有消息的时候,他会阻塞住知道消息到来

       如果对方追问能不能生产一次消费多次

              使用pub/sub主体订阅者模式,可以实现,1 :N消息队列

       如果对方追问redids如何实现延时队列

              使用sortedset,拿时间戳作为score,消息内容作为key调用zadd来生产消息,消费者用zrangebyscore指令获取N秒之前的数据轮询进行处理

24、如果有大量的key需要设置同一时间过期,一般需要注意什么

       如果大量的key过期时间设置的过于集中,到过期的那个时间点,redis可能会出现短暂的卡顿现象。一般需要在时间上加一个随机值,使得过期时间分散一些

25、假如redis里面有一亿个key,其中有10W个key是以某个固定的已知的前缀开头的,如何将他们全部找出来

       使用keys指令可以扫出指定模式的key列表

       如果对方接着问:如果给这个redis正在给线上的业务提供服务,那使用keys指令会有什么问题

              redis是单线程的,keys指令会导致线程阻塞一段时间,线上服务会停顿,直到指令执行完毕,服务才能恢复,这个时候可以使用scan指令,scan指令可以物阻塞的提取指定模式的key列表,但是会有一定的重复概率,在客户端做一次去重就可以了,但是整体话费的时间会比直接用keys指令长

26、MySQL里有2000W数据,redis中只存20w数据,如何保证redis中的数据都是热点数据

       redis内存数据及大小上升到一定大小的时候,就会施行数据淘汰策略

       数据淘汰策略:已设置过期时间的数据集挑选最少使用数据,已设置过期时间的数据集挑选将要过期的数据,已设置过期时间的数据挑选任意数据,从数据集中挑选最少使用的数据,从数据集中任意挑选数据,禁止驱逐数据

27、一个redis实例中最多能存放多少的keys?List、set、StoredSet他们最多能存放多少元素

       理论上Redis可以处理多大232的keys,并且在实际中进行了测试,每个实例至少存放了两亿五千万的keys

       任何list、set和sorted set都可以存放232个元素

       Redis的存储极限是系统中的可用内存值

28、Redis的内存用完了会发生什么

       如果达到设置的上限,redis的写命令会返回错误信息(但是读命令还是正常返回)或者你可以将redis当缓存来实用配置淘汰机制,当redis达到内存上限时会冲刷掉旧的内容

29、Redis回收进程如何工作的

       一个客户端运行了新的命令,添加了新的数据,redis检查内存使用情况,如果大于maxmemory的限制,则根据设定好的策略进行回收,一个新的命令被执行,等等,所以我们不断低穿越内存限制的边界,通过不断达到边界然后不断回收到边界以下,如果一个命令的结果导致大量内存被使用,不用多久内存限制就会被这个内存使用量超越

30、都有哪些办法可以降低Redis的内存使用情况呢

       如果你使用的是32位的Redis实例,可以好好利用Hash,list,sorted set ,set等集合类型数据,因为通常情况下很多小的key-value可以用更紧凑的方式存放到一起

31、Redis key 的过期时间和永久有效分别怎么设置

       EXPIRE和PERSIST命令

32、Redis如何做内存优化

       尽可能使用散列表,散列表使用的内存非常小,所以应该尽可能的江北数据模型抽象到一个散列表中

33、怎么测试Redis的连通性

       使用ping命令

34、Redis集群最大节点个数是多少?Redis集群如何选择数据库

       Redis集群的最大节点个数为:16384个

       Redis集群目前无法做数据库选择,默认在0数据库

35、Redis集群的主从复制模型是怎样的

       为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有N-1个复制品

36、Redis集群会有写操作丢失吗?为什么

       Redis并不能保证数据的强一致性,这意味着在实际中集群在特定的条件下可能会丢失写操作

37、Redis集群之间是如何复制的

       异步复制

38、说说Redis哈希槽的概念

       Redis集群没有使用一致性hash,而是引入了哈希槽的概念,Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽,集群的每个节点负责一部分hash槽

39、Redis的同步机制了解吗

       Redis可以使用主从同步,从从同步,第一次同步时,主节点做一次bgsave,并同时将后续修改操作记录到内存Buffer,待完成后将rdb文件全量同步到复制节点,复制节点接受完成后将rdb镜像加载到内存,加载完成后,再通知主节点将期间修改的操作记录同步到复制节点进行重放就完成了同步过程

40、是否使用过Redis集群,集群的原理是什么?

       Redis Sentinal着眼于高可用,在master宕机时会自动将slave提升为master,继续提供服务

       Redis Cluster着眼于扩展性,在单个redis 内存不足时,使用Cluster进行分片存储

41.Redis集群方案什么情况下会导致整个集群不可用

       有A、B、C是哪个节点的集群,在没有复制模型的情况下,如果B节点失败了,那么整个集群就会以为缺少5501-11000这个范围的槽而不可用

42、Pipeline有什么好处,为什么使用它

       可以将多次IO往返的时间缩减为一次,前提是pipeline执行的指令之间没有因果相关性,使用redis-benchmark进行压测的时候可以发现影响redis的QPS峰值的一个重要因素是pipeline批次指令的数目

43、redis6.0之后为什么引入了多线程

       主要是为了提高网络的IO读写能力

44、如何判断数据是否过期

       redis通过一个叫做过期字典来保存数据过期的时间,过期字典的键指向redis数据库中的某个key(键),过期字典的值是一个long 类型的整数,这个整数保存了key所指向的数据库键的过期时间

45、缓存雪崩

       1.redis服务器不可用:缓存在同一时间大面积的失效,后面的请求都直接落到了数据库上,造成数据库短时间内承受大量请求

       2.热点缓存失效:有一些被大量访问数据(热点缓存)在某一时刻大面积失效,导致对应的请求直接落到了数据库上

46、面对缓存雪崩,应该怎么解决

       1.redis服务器不可用:采用redis集群,避免单机出现问题整个缓存服务都没办法使用

                                          限流,避免同时处理大量的请求

       2.热点缓存失效:设置不同的失效时间比如随机设置缓存的失效时间                     

                                   缓存永不失效

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值