常用的 SQL 数据库的数据都是存在磁盘中的,虽然在数据库底层也做了对应的缓存来减少数据库的 IO 压力 。
文章插图
图片来自 Pexels
由于数据库的缓存一般是针对查询的内容,而且粒度也比较小,一般只有表中的数据没有发生变动的时候,数据库的缓存才会产生作用 。
但这并不能减少业务逻辑对数据库的增删改操作的 IO 压力,因此缓存技术应运而生,该技术实现了对热点数据的高速缓存,可以大大缓解后端数据库的压力 。
主流应用架构
文章插图
客户端在对数据库发起请求时,先到缓存层查看是否有所需的数据,如果缓存层存有客户端所需的数据,则直接从缓存层返回,否则进行穿透查询,对数据库进行查询 。
如果在数据库中查询到该数据,则将该数据回写到缓存层,以便下次客户端再次查询能够直接从缓存层获取数据 。
缓存中间件 Memcache 和 redis 的区别
Memcache 的代码层类似 Hash,特点如下:
- 支持简单数据类型
- 不支持数据持久化存储
- 不支持主从
- 不支持分片
- 数据类型丰富
- 支持数据磁盘持久化存储
- 支持主从
- 支持分片
Redis 的效率很高,官方给出的数据是 100000+QPS,这是因为:
- Redis 完全基于内存,绝大部分请求是纯粹的内存操作,执行效率高 。
- Redis 使用单进程单线程模型的(K,V)数据库,将数据存储在内存中,存取均不会受到硬盘 IO 的限制,因此其执行速度极快 。
- 数据结构简单,对数据操作也简单,Redis 不使用表,不会强制用户对各个关系进行关联,不会有复杂的关系限制,其存储结构就是键值对,类似于 HashMap,HashMap 最大的优点就是存取的时间复杂度为 O(1) 。
- Redis 使用多路 I/O 复用模型,为非阻塞 IO 。
选用策略:
- 因地制宜,优先选择时间复杂度为 O(1) 的 I/O 多路复用函数作为底层实现 。
- 由于 Select 要遍历每一个 IO,所以其时间复杂度为 O(n),通常被作为保底方案 。
- 基于 React 设计模式监听 I/O 事件 。
String
最基本的数据类型,其值最大可存储 512M,二进制安全(Redis 的 String 可以包含任何二进制数据,包含 jpg 对象等) 。
文章插图
注:如果重复写入 key 相同的键值对,后写入的会将之前写入的覆盖 。
Hash
String 元素组成的字典,适用于存储对象 。
文章插图
List
列表,按照 String 元素插入顺序排序 。其顺序为后进先出 。由于其具有栈的特性,所以可以实现如“最新消息排行榜”这类的功能 。
文章插图
Set
String 元素组成的无序集合,通过哈希表实现(增删改查时间复杂度为 O(1)),不允许重复 。
文章插图
另外,当我们使用 Smembers 遍历 Set 中的元素时,其顺序也是不确定的,是通过 Hash 运算过后的结果 。
Redis 还对集合提供了求交集、并集、差集等操作,可以实现如同共同关注,共同好友等功能 。
Sorted Set
通过分数来为集合中的成员进行从小到大的排序 。
文章插图
更高级的 Redis 类型
用于计数的 HyperLogLog、用于支持存储地理位置信息的 Geo 。
从海量 Key 里查询出某一个固定前缀的 Key
假设 Redis 中有十亿条 Key,如何从这么多 Key 中找到固定前缀的 Key?
方法 1:使用 Keys [pattern]:查找所有符合给定模式 Pattern 的 Key
使用 Keys [pattern] 指令可以找到所有符合 Pattern 条件的 Key,但是 Keys 会一次性返回所有符合条件的 Key,所以会造成 Redis 的卡顿 。
推荐阅读
- Redis实现注册、删除、编辑、分页功能
- 外墙渗水是物业还是业主维修,外墙渗水到内墙如何从内墙补救
- 茶自宋被人们视为从而终的婚姻信物
- 爱是个慢慢等待的过程 从茶苦到茶香
- 干式双离合与湿式双离合的区别,从结构区别看可靠性
- 从古至今的朝代顺序 中国古时候的朝代顺序
- 自制消脂去水肿陈皮茶
- 半小时MySQL基础入门,值得收藏
- VRRP 华为防火墙双机热备的配置实例
- 癌症最早竟从身上这物来