文章插图
一、redis为什么那么快
- QPS达到10万/秒
- 用C语言实现
- 基于内存
- 单线程,不用线程上下文切换及加锁
- String,常见的缓存,存储登录session等
- hash,存储对象,单独修改对象属性
- List,有序列表,可实现简单的消息队列,阻塞队列
- Set,分布式去重
- Zset,也叫做sorted set,有序集合,关联一个double类型的分数,根据分数排序,可实现排行榜、延时队列
- Stream,redis 5.0后的新数据类型,消费者可分组,一条消息只能被同组的一个消费者消费,但可以被不同组的多个消费者重复消费,借此实现可持久化的发布&订阅功能
- Cache Aside Pattern
- 应用程序同时对接缓存、数据库
- 查询时先查询缓存,缓存未命中则查询数据库,同时更新数据库
- 更新时先更新数据库,在删除缓存缓存
- 最常用的模式
- 会有数据不一致性问题
- 适用读多写少的场景
- 两种加载缓存的方式,读到再加载,或者启动时就加载
- 为什么是先更新数据库再删除缓存,而不是先删除缓存再更新数据库?
- 为什么是更新数据库后删除缓存,而不是更新缓存?
- Read/Write Through Pattern
- 应用程序只对接缓存,由缓存对接数据库,相当于Cache Provider中封装了数据库
- 查询时若缓存未命中则,则Cache Provider去查询数据库,设置到缓存后再返回
- 更新时,由Cache Provider同时更新缓存和数据库,这里有事务保证
- 此模式很耗时,但能保证数据一致性
- 少见的模式
- Write Behind
- 应用程序只更新缓存,不直接更新数据库
- 在一定时间触发异步的方式写入数据库
- 类似于MySQL InnoDB 缓冲池的模式
- 在写入数据库前断电挂机会有丢失数据可能
- 放大了数据不一致性,但速度很快
- 适用于高并发写,但对数据一致性要求不高且允许丢失的场景
电商首页热点数据会做缓存,定时任务刷新,所有key失效时间一样 。
热点key大面积集中失效,大量请求一下子打到数据库,导致数据库挂掉 。
- 失效时间加随机值,不让它们集中失效
- 设置热点key永不过期,有更新时就更新缓存
- 如果Redis是集群部署,可让热点key分布在不同的Redis库中
缓存和数据库中都不存在的数据,被攻击者利用,如id = -1,发起攻击的时候会绕过换过,不断查询数据库 。
- 对参数合法性进行检验
- 使用布隆过滤器,会有一定误判
- 数据库查询为null时,可以缓存约定的数据,如“请稍后重试”,缓存时间设置短点,如30秒(防止正常了这个id下有数据了也无法正常使用)
- 限流
一个热点key,在失效的瞬间,遭遇高并发,大量请求在缓存中查不到,会直接去查数据库
- 设置热点key永不过期
- 使用分布式互斥锁,保证在缓存失效时,只有一个请求能查到数据库
数据一致性就是指数据库和缓存的数据一致的问题 。
根据三种缓存模式可知,在数据一致性和效率是两个极端,只能取一个中间平衡点 。
一般是采用旁路缓存模式,且采用先更新数据库,后删除缓存的方式 。
但就这时候还是会有少量请求因为删除缓存不及时而读到旧数据,不过一般都能顺利删除缓存,这已经是对业务影响最轻的做法 。
推荐阅读
- 笔记本触摸板你玩明白了吗?
- 惠普笔记本开机无法充电但是关机可以充电-为什么惠普电脑不充电会自动关机-
- 笔记本可以连接电视做显示屏吗 笔记本如何连接电视机当显示器
- 全国前十名笔记本价格 全国前十名笔记本品牌
- 笔记本|领导最爱说的话是什么?
- 唐晶|《我的前半生》:老卓那句“可惜了”,道出贺涵放弃唐晶的真相
- 翡翠|高贵典雅的翡翠观音,带大家脱离苦海,翡翠观音还有什么内涵?
- 惠普台式电脑进入bios方法,惠普笔记本进入bios的方法-_1
- 肖战|王建国有一次去录汪涵的节目,在现场,突然就走神了。
- 郭艾伦|睡完不给钱,名记内涵郭艾伦,艾伦现身回应,谁注意他的反击