1. Redis有哪些数据类型
- Redis主要有5种数据类型,包括String,List,Set,Zset,Hash
2. Redis有哪些优缺点?
- 优点:
- 读写性能高, Redis能读的速度是110000次/s,写的速度是81000次/s。
- 支持数据持久化,支持AOF和RDB两种持久化方式。
- 支持事务,Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。
- 数据结构丰富,除了支持string类型的value外还支持hash、set、zset、list等数据结构。
- 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。
- 缺点
- 数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
- Redis 不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。
- 主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。
- Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。
3. 什么是缓存雪崩?如何避免该情况?
- 缓存雪崩,就是存储在缓存里面的大量数据,在同一个时刻全部过期,原本缓存组件抗住的大部分流量全部请求到了数据库。导致数据库压力增加造成数据库服务器崩溃的现象。
- 避免方式:
- 为缓存中的Key,设置一个随机值,从而避免这些Key在相同的时间内同时过期
4. 什么是缓存穿透?如何避免该情况?
- 缓存穿透,是短时间内有大量不存在的 key 请求到应用里面,而这些不存在的 key 在redis缓存里面又找不到,从而全部穿透到了数据库,造成数据库压力。
- 避免方式:
- 把无效的 key 也保存到 Redis 里面,并且设置一个特殊的值,比如“null”,这样的话下次再来访问,就不会去查数据库了。
- 使用布隆过滤器,即系统启动的时候把目标数据全部缓存到布隆过滤器里面,当攻击者用不存在的 key 来请求的时候,先到布隆过滤器里面查询,如果不存在,那意味着这个 key 在数据库里面也不存在。
5. redis缓存有几种过期策略?请说一说
- redis缓存过期策略共有8种
- volatile-lru:从己设置过期时间的数据集 (server.dbij.expires)中挑选最近最少使用的数据淘汰
- volatile-ttl:从己设置过期时间的数据集 (server.dbtij.expires) 中挑选将要过期的数据淘汰
- volatile-random:从己设置过期时间的数据集 (server.db门.expires)中任意选择数据淘汰
- volatile-lfu:从己设置过期时间的数据集(server.db0J.expires)中挑选最不经常使用的数据淘汰
- allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(这个是最常用的)
- allkeys-random:从数据集 (server.dbi.dict) 中任意选择数据淘汰
- allkeys-lfu:当内存不足以容纳新写入数据时,在键空间中,移除最不经常使用的key
- noveiction:永不过期
6. redis为什么有如此高的性能?
- 完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap 的优势就是查找和操作的时间复杂度都是O(1);
- 数据结构简单,对数据操作也简单,Redis 中的数据结构是专门进行设计的;
- 采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
- 使用多路 I/O 复用模型,非阻塞 IO;
- 使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了 VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求
7. Redis 的持久化机制是什么?说一说它们各自的优缺点?
-
RDB是Redis默认的持久化方式。按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应
产生的数据文件为dump.rdb。通过配置文件中的save参数来定义快照的周期。 -
RDB优点
-
只有一个文件 dump.rdb,方便持久化。
-
容灾性好,一个文件可以保存到安全的磁盘。
-
性能最大化,fork 子进程来完成写操作,让主进程继续处理命令,所以是 IO 最大化。使用单独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了 redis 的高性能。
-
相对于数据集大时,比 AOF 的启动效率更高。
-
RDB缺点
-
数据安全性低。RDB 是间隔一段时间进行持久化,如果持久化之间 redis 发生故障,会发生数
据丢失。所以这种方式更适合数据要求不严谨的业务场景。 -
AOF持久化(即Append Only File持久化),则指将Redis执行的每次写命令记录到单独的日志文件
中,当重启Redis会重新将持久化的日志中文件恢复数据 -
AOF持久化优点
-
数据安全,aof 持久化可以配置 appendfsync 属性,有 always,每进行一次 命令操作就记录
到 aof 文件中一次。 -
通过 append 模式写文件,即使中途服务器宕机,可以通过 redis-check-aof 工具解决数据一
致性问题。 -
AOF 机制的 rewrite 模式。AOF 文件没被 rewrite 之前(文件过大时会对命令 进行合并重
写),可以删除其中的某些命令(比如误操作的 flushall)) -
AOF持久化缺点:
-
AOF 文件比 RDB 文件大,且恢复速度慢。
-
数据集大的时候,比 rdb 启动效率低。**
8. 说一说redis的线程模型?
- Redis基于Reactor模式开发了网络事件处理器,这个处理器被称为文件事件处理器(file eventhandler)。它的组成结构为4部分:多个套接字、IO多路复用程序、文件事件分派器、事件处理器。因为文件事件分派器队列的消费是单线程的,所以Redis才叫单线程模型。
- 文件事件处理器使用 I/O 多路复用(multiplexing)程序来同时监听多个套接字, 并根据套接字目
前执行的任务来为套接字关联不同的事件处理器。 - 当被监听的套接字准备好执行连接应答(accept)、读取(read)、写入(write)、关闭(close)等操作时, 与操作相对应的文件事件就会产生, 这时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件。
- 文件事件处理器使用 I/O 多路复用(multiplexing)程序来同时监听多个套接字, 并根据套接字目
- 虽然文件事件处理器以单线程方式运行, 但通过使用 I/O 多路复用程序来监听多个套接字, 文件事件
处理器既实现了高性能的网络通信模型, 又可以很好地与 redis 服务器中其他同样以单线程方式运行的
模块进行对接, 这保持了 Redis 内部单线程设计的简单性。
9. 说一说Redis事务的三个阶段?
- 事务开始 MULTI
- 命令入队
- 事务执行 EXEC
10. Redis支持的Java客户端都有哪些?官方推荐用哪个?
- Redisson、Jedis、lettuce等等,官方推荐使用Redisson。
11. Redis和Redisson有什么关系?
- redisson就是基于分布式环境下具有分布式锁的redis客户端,它提供了许多分布式相关的服务如支持redis集群连接等等
12. redis一个字符串类型的值能存储最大容量是多少?
- 512M
13. Redis 集群方案什么情况下会导致整个集群不可用?
- 有 A,B,C 三个节点的集群,在没有复制模型的情况下,如果节点 B 失败了,那么整个集群就
会以为缺少 5501-11000 这个范围的槽而不可用。
14. 谈一谈你对 Redis 哈希槽的理解 ?
- Redis 集群没有使用一致性 hash,而是引入了哈希槽的概念,Redis 集群有 16384 个哈希槽,
每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽,集群的每个节点负责一部分
hash 槽。
15. Redis 是单线程的,那如何提高多核 CPU 的利用率呢?
- 可以在同一个服务器部署多个 Redis 的实例,并把他们当作不同的服务器来使用,在某些时候,无论如何一个服务器是不够的,所以,如果你想使用多个 CPU,你可以考虑一下分片(shard)
16. Redis 的内存用完了会发生什么?
- 如果达到设置的上限,Redis的写命令会返回错误信息(但是读命令还可以正常返回。)
17. 谈一谈 Redis 主从复制的原理?
- Redis 主从复制包括全量复制和增量复制。
- 全量复制是发生在初始化阶段,从节点会主动向主节点发起一个同步请求,主节点收到请求后会生成一份当前数据的快照发送给从节点,从节点收到数据进行加载后完成全量复制。
- 增量复制是发生在每次 Master 数据发生变化的过程中,会把变化的数据同步给所有的从节点。增量复制是通过维护 Offset 这个复制偏移量来实现的。
18. 谈一谈redis的最佳实践?
- Master 最好不要做任何持久化工作,如 RDB 内存快照和 AOF 日志文件
- 如果数据比较重要,某个 Slave 开启 AOF 备份数据,策略设置为每秒同步一次
- 为了主从复制的速度和连接的稳定性,Master 和 Slave 最好在同一个局域网内
- 尽量避免在压力很大的主库上增加从库
- 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3…
写在最后:
自我介绍一下,小编13年毕业于厦门大学,14年在外包公司中软干过,后来去过微软、华为等大厂,20年进入鹅厂担任架构师,直到现在。这一路走来,深知大多数初中级java工程师,想要提升技能,往往需要自己长时间的摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率不仅低效而且还很漫长,很容易就碰到天花板致技术停止不前。 因此我收集整理了一份《java开发全套学习资料》送给大家,里面包含了Spring全家桶,MySQL,中间件Redis、kafka,MQ消息,Zookeeper等java全系列资料,非常适合初中高级各个阶段学习,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料。后面抽时间定期更新一些干货文章,如果你喜欢,也可添加下方名片学习交流 (๑◡๑)