欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > Redis篇

Redis篇

2025/2/7 5:23:25 来源:https://blog.csdn.net/ksn5461378/article/details/145480307  浏览:    关键词:Redis篇

1、为什么要用缓存

使用缓存的目的就是提升读写性能。而实际业务场景下,更多的是为了提升读性能,带来更好的性 能,带来更高的并发量。 Redis 的读写性能比 Mysql 好得多,我们就可以把 Mysql 中的热点数据 缓 存到 Redis 中,提升读取性能,同时也减轻了 Mysql 的读取压力。

2、使用 Redis有哪些好处?

具有以下好处:

  • 读取速度快,因为数据存在内存中,所以数据获取快;
  • 支持多种数据结构,包括字符串、列表、集合、有序集合、哈希等;
  • 支持事务,且操作遵守原子性,即对数据的操作要么都执行,要么都不支持;
  • 还拥有其他丰富的功能,队列、主从复制、集群、数据持久化等功能。

3,什么是 Redis?

Redis 是一个开源(BSD 许可)、基于内存、支持多种数据结构的存储系统,可以作为数据库、 缓 存和消息中间件。它支持的数据结构有字符串(strings)、哈希(hashes)、列表(lists)、 集合 ( sets)、有序集合(sorted sets)等,除此之外还支持 bitmaps、hyperloglogs 和地理 空间( geospatial )索引半径查询等功能。

它内置了复制(Replication)、 LUA 脚本(Lua scripting)、 LRU 驱动事件(LRU eviction)、 事 务(Transactions)和不同级别的磁盘持久化(persistence)功能,并通过 Redis 哨兵(哨 兵)和 集群(Cluster)保证缓存的高可用性(High availability)。

4、为什么使用Redis而不是用 Memcache呢?

这时候肯定想到的就是做一个Memcache与Redis区别。

  • Redis和Memcache都是将数据存放在你内存中,都是内存数据库,不过Memcache还可用于缓存其他东西,例如图片,视频等等。
  • Memcache 仅支持 key-value 结构的数据类型,Redis 不仅仅支持简单的 key-value 类型的数 据, 同时还提供 list ,set ,hash 等数据结构的存储。
  • 虚拟内存 Redis 当物理内存用完时,可以将一些很久没用到的,value 交换到磁盘分布式-设定 Memcache集群,利用 magent 做一主多从;Redis可以做一主多从,都可以一主一从。
  • 存储数据安全 Memcache 挂掉后,数据没了;Redis 可以定期保存到磁盘(持久化)
  • Memcache 的单个value最大1m,Redis的单个value最大512m。
  • 灾难恢复 Memcache挂掉后,数据不可恢复,Redis数据丢失后可以通过AOF恢复,Redis原生就支持集群模式,Redis3.0版本中,官方便能支持Cluster 模式了,Memcache 没有原生的集群模式,需要依赖客户端来实现,然后往集群中分片写入数据。
  • Memcache网络IO 模型是多线程,非阻塞IO复用的网络模式,原型上接近于nignx。而于是Redis使用单线程的IO复用模型,自己封装了一个简单的AeEvent事件处理框架,主要实现类epoll,kqueue和select,更接近于Apache 早期的模式。

5、为什么Redis单线程模型效率也能那么高?

  1.  C语言实现,效率高
  2. 纯内存操作
  3. 基于非阻塞的IO复用模型机制
  4. 单线程的话就能避免多线程的频繁上下文切换问题
  5. 丰富的数据结构(全称采用hash结构,读取速度非常快,对数据存储进行了一些优化,比如亚索表,跳表等)

6、说说Redis的线程模型

这问题是因为前面回答问题的时候提到,Redis是基于非阻塞的IO复用模型。如果这个问题回答不上来,就相当于前面的回答是给自己挖坑,因为你答不上来,面试官对你的印象可能就要打点折扣了。

Redis内部使用文件事件处理器file event handler,这个文件事件处理器是单线程的,所以Redis才叫做单线程的模型。它采用IO多路复用机制同时监听多个socket,根据socket上的事件来选择对应的事件处理器进行处理。

文件事件处理器的结构包含4个部分

  1. 多个socket。
  2. IO多路复用程序。
  3. 文件事件分派器。
  4. 事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)

多个socket可能会并发产生不同的操作,每个操作对应不同的文件事件,但是IO多路复用程序会监听多个socket,会将socket产生的事件放入队列中排队,事件分派器每次从队列中取出一个事件,把该事件交给对应的事件处理器进行处理。

来看客户端与Redis的一次通信过程:

下面来大致说一下这个图:

  1. 客户端 Socket01向 Redis的Server Socket请求建立连接,此时Server Socket会产生一AE_READABLE事件,IO多路复用程序监听到server socket产生的事件后,将该事件压入队列中。文件事件分派器从队列中获取该事件,交给连接应答处理器。连接应答处理器会创建一个能与客户端通S信ock的et01,并将该Socket01的AE_READABLE事件与命令请求处理器关联。
  2. 假设此时客户端发送了一个set key value请求,此时Redis中的Socket01会产生AE_READABLE事件,IO多路复用程序将事件压入队列,此时事件分派器从队列中获取到该事件,由于前面cket01 AE_READABLE事件已经与命令请求处理器关联,因此事件分派器将事件交给命令请求处理器来处理。命令请求处理器读S取ocket01的set key value并在自己内存中完成set key value的设置。操作完成后,它会So将cket01的AE_WRITABLE事件与回复处理器关联。

  3. 如果此时客户端准备好接收返回结果了,那么Redis中Socket01会产生一个AE_WRITABLE事件,同样压入队列中,事件分派器找到相关联的命令回复处理器,由命令回复处理器对Socket01输入本次操作的一个结果,比如ok,之后解除Socket01的AE_WRITABLE事件与命令回复处理器的关联。

这样便完成了一次通信。

7、为什么Redis需要把所有数据放到内存中?

Redis将数据放在内存中有一个好处,那就是可以实现最快地对数据读取,如果数据存储在硬盘中,磁盘I/O会严重影响Redis的性能。而且Redis还提供了数据持久化功能,不用担心服务器重启对内存中数据的影响。其次现在硬件越来越便宜的情况下,Redis的使用也被应用得越来越多,使得它拥有很大的优势。

8、Redis的同步机制了解是什么?

Redis支持主从同步、从同步。如果是第一次进行主从同步,主节点需要使用bgsave命令,再将后续修改操作记录到内存的缓冲区,等RDB文件全部同步到复制节点,复制节点接收完成后将RDB镜像记载到内存中。等加载完成后,复制节点通知主节点将复制期间修改的操作记录同步到复制节点,即可完成同步过程。

9、pipeline 有什么好处,为什么要用pipeline?

使用pipeline(管道)的好处在于可以将多次I/O往返的时间缩短为一次,但是要求管道中执行的指令间没有因果关系。用pipeline的原因在于可以实现请求/响应服务器的功能,当客户端尚未读取旧响应时,它也可以处理新的请求。如果客户端存在多个命令发送到服务器时,那么客户端无需等待服务端的每次响应才能执行下个命令,只需最后一步从服务端读取回复即可。

10,说一下Redis有什么优点和缺点

优点

  • 速度快:因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O (1)。
  • 支持丰富的数据结构:支持String,List,Set,Sorted Set,Hash五种基础的数据结构。
  • 持久化存储:Redis提供RDB和AOF两种数据的持久化存储方案,解决内存数据库最担心的万一Redis挂掉,数据会消失掉
  • 高可用:内置Redis Sentinel,提供高可用方案,实现主从故障自动转移。内置RedisCluster,提供集群方案,实现基于槽的分片方案,从而支持更大的Redis规模。
  • 丰富的特性:Key过期、计数、分布式锁、消息队列等。

缺点

  • 由于Redis是内存数据库,所以,单台机器,存储的数据量,跟机器本身的内存大小。虽然Redis本身有Key过期策略,但是还是需要提前预估和节约内存。如果内存增长过快,需要定期删除数据。
  • 如果进行完整重同步,由于需要生成RDB文件,并进行传输,会占用主机的CPU,并会消现网的带宽。不过Redis2.8版本,已经有部分重同步的功能,但是还是有可能有完整重同的。比如,新上线的步备机。
  • 修改配置文件,进行重启,将硬盘中的数据加载进内存,时间比较久。在这个过程中,Redis不能提供服务。

11,Redis持久化方式有哪些?以及有什么区别?

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

RDB持久化方式

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

优点:

  • 只有一个文件dump.rdb,方便持久化。
  • 容灾性好,一个文件可以保存到安全的磁盘。
  • 性能最大化,fork子进程来完成写操作,让主进程继续处理命令,所以是IO最大化。使用单独子进程来进行持久化,主进程不会进行任何IO操作,保Re证di了s的高性
  • 相对于数据集大时,比AOF的启动效率更高。

缺点:

数据安全性低。

RDB是间隔一段时间进行持久化,如果持久化之间Redis发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候

AOF=Append only file持久化方式

是指所有的命令行记录Redis命令请求协议的格式完全持久化存储,保存为AOF文件。

优点:

(1)数据安全,AOF持久化可以配置appendfsync属性,有always,每进行一次命令操作就记录到AOF文件中一次。

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

(3)AOF机制的rewrite模AOF文件没被rewrite之前(文件过大时会对命令进行合并重写),可以删除其中的某些命令比如误操作的flushall)式。

缺点:

(1)AOF文件RDB文件大,且恢复速度慢。

(2)数据集大的时候,比RDB启动效率低。

12,持久化有两种,那应该怎么选择呢?

  1. 不要仅仅使RDB,因为那样会导致你丢失很多数据。
  2. 用.也不要仅仅使用AOF,因为那样有两个问题,第一,你通过AOF做冷备没有RDB做冷备的恢复速度更快;第二,RDB每次简单粗暴生成数据快照,更加健壮,可以避免AOF这种复杂的备份和恢复机制的bug。
  3. Redis支持同时开启开启两种持久化方式,我们可以综合使用AOF和RDB两种持久化机制,用AOF来保证数据不丢失,作为数据恢复的第一选择;用RDB来做不同程度的冷备,在AOF文件都丢失或损坏不可用的时候,还可以使用RDB来进行快速的数据恢复。
  4. 如果同时使用RDB和AOF两种持久化机制,那么在Redis重启的时候,会使用AOF来重新构建数据,因为AOF中的数据更加完整。

13,怎么使用Redis实现消息队列?

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

  • 面试官可能会问可不可以不用sleep呢?list还有个指令叫blpop,在没有消息的时候,它会阻塞住直到消息到来。
  • 面试官可能还问能不能生产一次消费多次呢?使用pub / sub主题订阅者模式,可以实现1:N的消息队列。
  • 面试官可能还问pub / sub有什么缺点?在消费者下线的情况下,生产的消息会丢失,得使用专业的消息队列如rabbit等m。q
  • 面试官可能还会问Redis如何实现延时队列?我估计现在你很想把面试官一棒打死如果你手上有一根棒球棍的话,怎么问得这么详细。但是你很克制,然后神态自若地回答道:使sortedset,拿时间戳作为score,消息内容作为key调用zadd来生产消息,消费者用zrangebyscore指令获取N秒之前的数据轮询进行处理。

面试扩散:很多面试官上来就直接这么问:Redis如何实现延时队列?

14,说说你对Redis事务的理解

什么是Redis事务?原理是什么?

Redis中的事务是一组命令的集合,是Redis的最小执行单位。它可以保证一次执行多个命令,每个事务是一个单独的隔离操作,事务中的所有命令都会序列化、按顺序地执行。服务端在执行事务的过程中,不会被其他客户端发送来的命令请求打断。

它的原理是先将属于一个事务的命令发送给Redis,然后依次执行这些命令。

Redis事务的注意点有哪些?

需要注意的点有:

  • Redis事务是不支持回滚的,不像MySQL的事务一样,要么都执行要么都不执行;
  • Redis服务端在执行事务的过程中,不会被其他客户端发送来的命令请求打断。直到事务命令全部执行完毕才会执行其他客户端的命令。

Redis事务为什么不支持回滚?

Redis的事务不支持回滚,但是执行的命令有语法错误,Redis会执行失败,这些问题可以从程序层面捕获并解决。但是如果出现其他问题,则依然会继续执行余下的命令。这样做的原因是回滚需要增加很多工作,而不支持回滚则可以保持简单、快速的特性。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com