Redis简介
MySQL中的数据都是存储在缓存中的,虽然在数据库中做了对应的缓存,一般针对的是查询的内容,而且粒度比较小,并且当数据库内容不发生变更的时候,缓存才有作用。不能减轻业务系统对数据库的增删改查IO压力。因此缓存数据库应运而生,实现对热点数据的缓存,提高了响应速度,缓解后端数据库的压力。
- 穿透:穿透缓存层,访问数据库层
- 熔断:不管有没有获得数据都返回,在有损的情况下,对外提供服务
缓存中间件
Memcache和Redis的区别
Memcache:代码层次类似Hash
- 支持简单数据类型
- 不支持数据持久化存储
- 不支持主从
- 不支持分片
Redis
- 数据类型丰富
- 支持数据磁盘持久化存储
- 支持主从
- 支持分片
为什么Redis能这么快
100000+QPS
- 完全基于内存,绝大部分的请求是纯粹的内存操作,执行效率高
- 数据结构简单(键值对),对数据的操作也简单
- 采用了单线程,单线程也能处理高并发请求,想多核也可以启动多实例
- 使用多路I/O复用模型,非阻塞IO
I/O多路复用模型
- FD:文件描述符。一个打开的文件通过唯一的描述符进行应用,该描述符是打开文件的源数据到文件本身的映射。
- Select系统调用:Selector负责监听这些文件是否可读或者可写
- Redis采用的I/O多路复用函数:epoll/kqueue/evport/select?
- 因地制宜:编译平台不同
- 优先选择时间复杂度为O(1)
- 以时间复杂度为O(n)的select为保底:扫描全部监听的文件
- 基于react设计模式监听I/O事件:实现文件事件处理器
Redis简介
供用户使用的数据类型
- String:最基本的数据类型,可以存储序列化对象,二进制图
- Hash:String元素组成的字典,适合用于存储对象
- List:列表,按照String元素插入顺序排列(类似栈)
- Set:String元素组成的无需集合,通过hash表实现,不允许重复
- Sorted Set:通过分数来为集合中的成员从小到大排序(增加权重)
- 用于计数的HyperLogLog,用于支持存储地理位置信息的Geo