Redis的线程模型和常用数据结构

一 Redis是个啥?

  • 要知道Redis的线程模型,首先要知道Redis是什么?其实很简单,Redis就是数据库。
  • 那Redis和MySQL有什么不一样呢?Redis是存在内存上的,MySQL是存在磁盘上的,因此Redis的读写速度很快。
  • Redis常被用做缓存,为了适应不同的业务场景,还提供了多种数据类型:String,Set,ZSet,List,Map。
  • 除此之外,Redis还常被用做分布式锁。
  • Redis还支持事务,持久化,LUA脚本,LRU驱动事件,多种集群方案。

二 为什么要用Redis?

从Redis的存储位置来看,他毕竟是存储在内存上的,读写速度非常快,因此我们使用它做缓存就有两个方面的好处:

高性能

我们通常从数据库读出数据,是要经过磁盘的。从磁盘里拿的时候很慢,虽然磁盘很慢,但是内存快啊。很多业务中,我们常读取的数据可能一直都是某一部分。为了避免每次重拿,我们将他们放进Redis中做缓存,下次再取的时候直接从Redis中取,这个速度是不是一下子就快起来了,也就是说性能高了

高并发

直接操作缓存能够承受的并发量远远高于直接访问数据库,所以我们就可以想到把一部分常用的热点数据放到缓存里,这样大部分时候我们都不需要操作数据库,而是直接操作缓存,能够承受的并发量肯定更大了。

三 线程模型

Redis内部使用文件事件处理器,该处理器是单线程的,因此Redis模型是单线程的。它使用了IO多路复用技术来监听多个socket,根据socket上的事件来选择不同的事件处理器来处理。
文件事件处理器包含四个部分:

  • 多个Socket
  • IO多路复用程序
  • 文件事件分派器
  • 文件事件处理器
    有多个socket,每个socket都可能产生事件,但是我们的处理器明明是单线程的,怎么实现并发的?其实每个socket产生事件后,都会被放进事件队列,事件分派器每次只选择一个事件,交给对应的事件处理器处理。

四 常用数据结构

Redis支持多种数据类型,可以适用于不同业务场景,不同数据结构和对应场景如下:

  • String

    • Redis中的String是简单的key-value结构,value可以是String也可以数字
    • 常用在常规计数
  • List

    • 链表,Redis中的list结构实际上就是一个双向链表,支持反向查找和遍历,提供了lrange等功能可以实现分页
    • 常用于微博下拉分页,关注列表,粉丝列表,消息队列等功能
  • Set

    • 提供了和list差不多的列表功能,但是和list不同的是Set不允许存储相同的值,且提供了判断值是否存在的接口
    • 由于以上特性,常用在共同粉丝数等求交集的业务
  • Map

    • 是一个string类型的field-value的数据类型,特别适合存储对象,可以仅仅修改对象中某个对象的值
    • 常用于存储用户信息

猜你喜欢

转载自blog.csdn.net/weixin_44062399/article/details/123762567