Redis为什么那么快?

Redis为什么那么快?

Redis是一种key-value内存数据库,在众多的业务场景中,都会使用redis。其中一个核心的原因就是redis很快,那为什么Redis这么快呢?Redis设计的核心是什么?这里来探讨一下。

1.Redis支持是的数据结构

  • string(字符串)

    • byte数组,最大上限是1G字节
    • 1.二进制序列字符串。 2.整型数据。 3.浮点数据。
  • hash(哈希)

    • key-value对组成
  • list:有序的字符串序列

    • 最大长度为2^32
  • set: 集合

    • 不允许重复的元素出现在一个Set
  • zset

  • 不允许重复的元素出现在一个Set

    • 增加了排序的功能

2. Redis之所以执行速度很快

  • Redis是纯内存的,读写速度非常快
    避免了硬盘 I/O 速度的限制

  • 单线程操作, 节省了上下文切换线程的时间

  • 采用了非阻塞I/O多路复用机制

3. Redis面试常见的十个问题

3.1 Redis与Memcached的区别
  • redis支持更丰富的数据类型,Memcached只支持string类型
  • Redis支持数据的持久化,Memecache把数据全部存在内存之中
  • Memcached是多线程,非阻塞IO复用的网络模型;Redis使用单线程的非阻塞 IO多路复用模型
3.2 Redis支持5种数据类型,速度为什么那么快?

Redis全程使用hash结构,读取速度快,数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);数据操作简单,不同场景使用不同数据类型。

3.3 Redis为什么是单线程的

Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。redis 单线程指的是网络请求模块使用了一个线程,即一个线程处理所有网络请求,其他模块仍用了多个线程。

3.4 Redis常见的使用场景
  • 限时业务的运用(限时的优惠活动信息、手机验证码,限流等业务场景)
  • 计数器
  • 排行榜
  • 分布式锁
  • 队列(秒杀活动)

3.5 Redis中“雪崩”问题

缓存在同一时间内大量键过期(失效),瞬间请求瞬间都落在了数据库中导致连接异常。
防止策略:

  • 互斥锁排队
  • 将所有可能的合理请求(请求参数),放入白名单,不合法的直接禁止访问
  • 多级缓存,缓存A、B, …缓存的过期时间不同
  • 接口限流与熔断、降级

3.6 缓存和数据库间数据一致性

使用缓存经常会出现缓存和数据库的数据不一致的问题:如果项目是强一致性,不建议缓存;使用缓存针对是经常访问,不经常改变的数据。需要考虑的问题:刷新缓存、缓存过期时间、缓存获取失败、多级缓存等。

3.7 Redis数据淘汰算法

Redis的所有数据都存储在内存中,但是内存是一种有限的资源,所以为了防止Redis无限制的使用内存,在启动Redis时可以通过配置项maxmemory来指定其最大能使用的内存容量。

volatile-lru: 最近最少使用算法,从设置了过期时间的键中选择空转时间最长的键值对清除掉

volatile-lfu: 最近最不经常使用算法,从设置了过期时间的键中选择某段时间之内使用频次最小的键值对清除掉

volatile-ttl: 从设置了过期时间的键中选择过期时间最早的键值对清除

volatile-random: 从设置了过期时间的键中,随机选择键进行清除

allkeys-lru: 最近最少使用算法,从所有的键中选择空转时间最长的键值对清除

allkeys-lfu: 最近最不经常使用算法,从所有的键中选择某段时间之内使用频次最少的键值对清除

allkeys-random: 所有的键中,随机选择键进行删除

noeviction: 不做任何的清理工作,在redis的内存超过限制之后,所有的写入操作都会返回错误;但是读操作都能正常的进行

3.8 Redis实现秒杀问题

简单思想:

实现三个队列,商品队列,用户成功购买队列,用户等待队列

  1. 往商品队列中放入指定数量的商品
  2. 异步处理订单操作,失败加库存;
3.9 Redis主从同步问题

在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制(replicate)另一个服务器,我们称呼被复制的服务器为主服务器(master),而对主服务器进行复制的服务器则被称为从服务器(slave)

从服务器对主服务器的同步操作需要通过向主服务器发送SYNC命令来完成,以下是SYNC命令的执行步骤:

  1. 从服务器向主服务器发送SYNC命令;
  2. 收到SYNC命令的主服务器执行BGSAVE命令,在后台生成一个RDB文件,并使用一个缓冲区记录从现在开始执行的所有写命令;
  3. 当主服务器的BGSAVE命令执行完毕时,主服务器会将BGSAVE命令生成的RDB文件发送给从服务器,从服务器接收并载入这个RDB文件,将自己的数据库状态更新至主服务器执行BGSAVE命令时的数据库状态
  4. 主服务器将记录在缓冲区里面的所有写命令发送给从服务器,从服务器执行这些写命令,将自己的数据库状态更新至主服务器数据库当前所处的状态。
3.10 Redis发布订阅

Redis提供了发布订阅功能,可以用于消息的传输,Redis的发布订阅机制包括三个部分,发布者,订阅者和Channel。 发布者和订阅者都是Redis客户端,Channel则为Redis服务器端,发布者将消息发送到某个的频道,订阅了这个频道的订阅者就能接收到这条消息。Redis的这种发布订阅机制与基于主题的发布订阅类似,Channel相当于主题。

4.结论

以上就是Redis所包括的所有知识点,不管在实际的项目开发中,还是面试中这些都是要必须掌握的。

shell分析nginx日志
Git format-patch用法