建设展示型网站公司哪家好,社交网站怎么制作,虾想网络定制,秦皇岛营销式网站制作Redis缓存读写策略#xff08;三种#xff09;
Cache Aside Pattern#xff08;旁路缓存模式#xff09;
Cache Aside Pattern 是我们平时使用比较多的一个缓存读写模式#xff0c;比较适合读请求比较多的场景。 写#xff1a;
先更新 db然后直接删除 cache 。
读 : …Redis缓存读写策略三种
Cache Aside Pattern旁路缓存模式
Cache Aside Pattern 是我们平时使用比较多的一个缓存读写模式比较适合读请求比较多的场景。 写
先更新 db然后直接删除 cache 。
读 :
从 cache 中读取数据读取到就直接返回cache 中读取不到的话就从 db 中读取数据返回再把数据放到 cache 中。
在写数据的过程中可以先删除 cache 后更新 db 么”
答案 那肯定是不行的因为这样可能会造成 数据库db和缓存Cache数据不一致的问题。
举例请求 1 先写数据 A请求 2 随后读数据 A 的话就很有可能产生数据不一致性的问题。
当你这样回答之后面试官可能会紧接着就追问“在写数据的过程中先更新 db后删除 cache 就没有问题了么”
答案 理论上来说还是可能会出现数据不一致性的问题不过概率非常小因为缓存的写入速度是比数据库的写入速度快很多。
举例请求 1 先读数据 A请求 2 随后写数据 A并且数据 A 在请求 1 请求之前不在缓存中的话也有可能产生数据不一致性的问题。
Cache Aside Pattern 的缺陷。
缺陷 1首次请求数据一定不在 cache 的问题
解决办法可以将热点数据可以提前放入 cache 中。
缺陷 2写操作比较频繁的话导致 cache 中的数据会被频繁被删除这样会影响缓存命中率 。
Read/Write Through Pattern读写穿透
写Write Through
先查 cachecache 中不存在直接更新 db。cache 中存在则先更新 cache然后 cache 服务自己更新 db同步更新 cache 和 db。
读(Read Through)
从 cache 中读取数据读取到就直接返回 。读取不到的话先从 db 加载写入到 cache 后返回响应。
Write Behind Pattern异步缓存写入
Write Behind Pattern 和 Read/Write Through Pattern 很相似两者都是由 cache 服务来负责 cache 和 db 的读写。
但是两个又有很大的不同Read/Write Through 是同步更新 cache 和 db而 Write Behind 则是只更新缓存不直接更新 db而是改为异步批量的方式来更新 db。
很明显这种方式对数据一致性带来了更大的挑战比如 cache 数据可能还没异步更新 db 的话cache 服务可能就就挂掉了。
这种策略在我们平时开发过程中也非常非常少见但是不代表它的应用场景少比如消息队列中消息的异步写入磁盘、MySQL 的 Innodb Buffer Pool 机制都用到了这种策略。
Write Behind Pattern 下 db 的写性能非常高非常适合一些数据经常变化又对数据一致性要求没那么高的场景比如浏览量、点赞量。
Redis数据结构53
5种基本数据结构
String
String 是 Redis 中最简单同时也是最常用的一个数据结构。String 是一种二进制安全的数据结构可以用来存储任何类型的数据比如字符串、整数、浮点数、图片图片的 base64 编码或者解码或者图片的路径、序列化后的对象。
应用场景
需要存储常规数据的场景
举例缓存 session、token、图片地址、序列化后的对象(相比较于 Hash 存储更节省内存)。相关命令SET、GET。
需要计数的场景
举例用户单位时间的请求数简单限流可以用到、页面单位时间的访问数。相关命令SET、GET、 INCR、DECR 。
分布式锁
利用 SETNX key value 命令可以实现一个最简易的分布式锁存在一些缺陷通常不建议这样实现分布式锁。
List列表
Redis 的 List 的实现为一个 双向链表即可以支持反向查找和遍历更方便操作不过带来了部分额外的内存开销。
应用场景
信息流展示
举例最新文章、最新动态。相关命令LPUSH、LRANGE。
消息队列
Redis List 数据结构可以用来做消息队列只是功能过于简单且存在很多缺陷不建议这样做。
相对来说Redis 5.0 新增加的一个数据结构 Stream 更适合做消息队列一些只是功能依然非常简陋。和专业的消息队列相比还是有很多欠缺的地方比如消息丢失和堆积问题不好解决。
Hash哈希
应用场景
对象数据存储场景
举例用户信息、商品信息、文章信息、购物车信息。相关命令HSET 设置单个字段的值、HMSET设置多个字段的值、HGET获取单个字段的值、HMGET获取多个字段的值。
Set集合
Redis 中的 Set 类型是一种无序集合集合中的元素没有先后顺序但都唯一有点类似于 Java 中的 HashSet
应用场景
需要存放的数据不能重复的场景 举例网站 UV 统计数据量巨大的场景还是 HyperLogLog更适合一些、文章点赞、动态点赞等场景。相关命令SCARD获取集合数量 。举例共同好友(交集)、共同粉丝(交集)、共同关注(交集)、好友推荐差集、音乐推荐差集、订阅号推荐差集交集 等场景。相关命令SINTER交集、SINTERSTORE 交集、SUNION 并集、SUNIONSTORE并集、SDIFF差集、SDIFFSTORE 差集。 需要随机获取数据源中的元素的场景 举例抽奖系统、随机点名等场景。相关命令SPOP随机获取集合中的元素并移除适合不允许重复中奖的场景、SRANDMEMBER随机获取集合中的元素适合允许重复中奖的场景。
Sorted Set有序集合
Sorted Set 类似于 Set但和 Set 相比Sorted Set 增加了一个权重参数 score使得集合中的元素能够按 score 进行有序排列还可以通过 score 的范围来获取元素的列表。有点像是 Java 中 HashMap 和 TreeSet 的结合体。
应用场景
需要随机获取数据源中的元素根据某个权重进行排序的场景
举例各种排行榜比如直播间送礼物的排行榜、朋友圈的微信步数排行榜、王者荣耀中的段位排行榜、话题热度排行榜等等。相关命令ZRANGE (从小到大排序)、 ZREVRANGE 从大到小排序、ZREVRANK (指定元素排名)。
3种特殊数据结构