categories: Redis


Redis 相关常识

1 Redis简介

主讲过程
mysql 的数据是存在磁盘中的,虽然在数据库层也做了对应的缓存,但这种数据库的缓存,一般针对的是查询的内容,而且密度也比较小,一般只有表中数据没有变更的时候,数据库当中的cache才会起作用,但是这并不能减少业务系统对数据库产生的增删改查的 io 压力,因此缓存数据库应运而生。该技术实现了对热点数据的高速缓存,提高业务的相应速度,极大缓解后端数据库的压力。

主流应用架构

一般为了提升性能,都会在客户端和存储层之间添加一个缓存层。当客户端向后端发送请求的时候,会先去缓存层查,看看有没有相关的数据,如果有则直接返回。如果缓存层没有相关的数据,才会去存储层查询,这就是所谓的穿透。 穿透这个词,其实就是缓存里面没有,穿透缓存去存储层查询数据,如果找到数据,就会将该数据回写回缓存层,以便下次客户端再次请求同样的数据的时候,可以直接快速地从缓存层返回,那回写的过程就是所谓的回种。回种完成后,就将结果返回至客户端。熔断:当我们发现存储层挂掉或者没办法提供服务的时候,可以让客户端的请求直接打在缓存层上,不管有没有获取到数据,都直接返回。这样能在有损的情况下,对外提供服务,因此缓存技术对我们架构很有
image.png

Memcache 和 redis 的区别

Memcache :代码层次类似 Hash

  • 支持简单数据类型
  • 不支持数据持久化存储(宕机数据可能就会消失)
  • 不支持mysql那样的主从同步
  • 不支持分片

Redis

  • 数据类型丰富(set、list等)
  • 支持数据磁盘持久化存储
  • 支持主从
  • 支持分片(redis 3.0之后就开始支持了)

其实较为高级的缓存形式用 redis,简单的键值缓存用 memcache 就足够了。

为什么 Redis 那么快?

100000+QPS(query per second, 每秒内查询次数)

  • 完全基于内存的,绝大部分请求是纯粹的内存操作,执行效率高
  • 数据结构简单,对数据操作也简单
  • 采用单线程,单线程也能处理高并发请求,想多核也可启动多实例
  • 使用多路 I/O 复用模型,非阻塞IO

    多路 I/O 复用模型

    FD:File Descriptor , 文件描述符
    一个打开的文件通过唯一的描述符进行引用,该描述符是打开文件的元数据到文件本身的映射
    传统的阻塞 I/O 模型
    image.png
    可以了解一下:https://draveness.me/redis-io-multiplexing

    select 系统调用

    selector 是负责监听我们这些文件是否可读或者可写的,监听的任务交给selector之后,程序就可以去做其他事而不被阻塞
    image.png

    Redis 采用的 I/O 多路复用函数:epoll/kqueue/evport/select ?

  • 因地制宜

  • 优先选择时间复杂度为 O(1) 的 I/O 多路复用函数作为底层实现
  • 以时间复杂度为 O(n) 的 select 为底
  • 基于 react 设计模式监听 I/O 事件**