理论修炼之Redis,分布式缓存的中流砥柱

这是我参与8月更文挑战的第13天,活动详情查看:8月更文挑战web

  • 📢欢迎点赞 :👍 收藏 ⭐留言 📝 若有错误敬请指正,赐人玫瑰,手留余香!
  • 📢本文做者:由webmote 原创,首发于 【掘金】
  • 📢做者格言: 生活在于折腾,当你不折腾生活时,生活就开始折腾你,让咱们一块儿加油!💪💪💪

🎏 序言

日更这个活动,初看是一种逼迫,时间久了,真的就把本身锤炼成受虐狂了,到了时间点,总以为要写点啥。数据库

天天写写文章,仍是蛮好玩的,梳理梳理知识体系,写完后偶有所得的样子,比刷抖音,刷完后索然无味的感受强多了。缓存

此次写写Redis,之前的系统都是很天然的上Redis,而后后续的不少功能也是借助Redis实现,好比分布式锁。服务器

🎏 01.缓存是什么?

这个问题来的很忽然,一时之间居然不知道怎么回答。 其实缓存很是常见,好比咱们电脑里的RAM,其内容断电即丢,但少了它,即便你电脑能跑起来,那也必然是爬行的蜗牛。markdown

固然除了RAM,还有CPU的L1和L2高速缓存,显卡的显存,看,缓存是多么常见啊。网络

定义: 缓存就是用来加快数据请求的存储组件,又称做Cache。当某一对象/设备要读取数据时,会首先从缓存中查找须要的数据,找到了则直接执行,找不到的话则从其余慢速设备中查找。dom

实际上凡是位于速度相差较大的两种设备之间,用于协调二者数据传输速度差的结构,都可以成为广义的缓存。异步

缓存并不仅是放在内存,好比SSD硬盘的在某些场景下也能够做为缓存的存储介质。分布式

🎏 01.1 经常使用硬件读写量级

那么问题来了,咱们经常使用的硬件,它们的读写速度都是什么量级的呢?ide

借用专家的图,来看看,务必在脑海中有这个印象哦。

image.png

🎏 01.2 与缓冲区的区别

如下观点属于程老大,无节操默写。

易混淆概念,缓冲区(buffer):系统两端处理速度平衡(从长时间尺度上看)时使用的。它的引入是为了减少短时间内突发I/O的影响,起到流量整形的做用。好比生产者——消费者问题,他们产生和消耗资源的速度大致接近,加一个buffer能够抵消掉资源刚产生/消耗时的忽然变化峰值。

Cache(缓存): 则是系统两端处理速度不匹配时的一种折衷策略。由于CPU和memory之间的速度差别愈来愈大,因此人们充分利用数据的局部性(locality)特征,经过使用存储系统分级(memory hierarchy)的策略来减少这种差别带来的影响。

🎏 01.3 常见分类

缓存的常见分类有静态缓存、分布式缓存和本地缓存。

  • 静态缓存,好比动态页面静态化,能够很容易进行CDN化顶住大流量;
  • 分布式缓存:处于网络远端,经过分布式集群能够扩展缓存性能的组件。
  • 本地缓存:通常是本地的内存,其速度优于分布式缓存,不须要跨越网络,通常用于短时热点缓存。

🎏 01.4 应用场景

缓存这么好,能解决全部问题吗?

想啥呢?缓存不能解决全部问题。

  • 缓存最适合读多写少,带热点的场景;
  • 缓存带来了复杂度,而且有数据不一致的风险;
  • 缓存通常使用内存,其容量相比硬盘差了好几个量级;

引入缓存需谨慎设计读写方案,以免这些问题。

🎏 02 经常使用缓存读写机制以及数据一致性问题

  • Cache Aside
  • Read Through/Write Through
  • Write Behind Caching

🎏 02.1 Cache Aside

读数据:先读缓存,若是没有命中缓存,则读取数据库,若是命中,则直接返回缓存

写数据:先更新数据库,再删除缓存

该模式在开发中最经常使用,须要咱们熟练掌握。 固然其并不完美,咱们知道在分布式系统中,想彻底保证数据一致性是极为困难的事情。 极端状况以下:

image.png

🎏 02.2 Read Through/Write Through

引入了缓存组件。

读数据:先读缓存,若是没有命中缓存,则有缓存组件读取数据库并加载缓存,若是命中,则直接返回缓存

写数据:查询缓存是否命中,若是命中,则更新缓存,并由缓存组件同步到数据库,不然,由缓存组件直接写数据库

因为写数据时,同步写数据库,所以,速度上会有影响,这种模式并不常见,由于引入了缓存组件,增长了复杂度。

🎏 02.3 Write Behind Caching

这种模式一般是先将数据写入缓存,再异步写入数据库。其优点是增长了吞吐量,劣势也很明显,若是发生宕机,则由丢失数据风险。

03. Redis 支持的类型

这里只作罗列,并不细讲,相关文章太多了,本身搜搜参考吧。

Redis支持多种数据类型:string,hash,list,set、zset、Bitmap、HyperLogLogs、Streams。

Redis具备发布订阅消息功能,利用最新的数据类型Streams,听说能够作到很是强大的消息队列功能,以前看过一篇文章,有兴趣的能够搜搜。

04. Redis 过时时间和策略

Redis支持不少方式设置一个key的过时时间,过时的Key咱们是读取不到数据的,然而这个Key在服务器上还占空间吗?

默认状况下,是不清理内存占用的。

Redis有不少种内存淘汰机制,默认采用的是 noeviction。

  • noeviction:默认策略,不淘汰,若是内存已满,添加数据就报错;
  • allkeys-lru:在全部键范围,选取最近使用频率最低的数据抛弃;
  • allkeys-random: 在全部键范围,随机抛弃;
  • volatile-lru:在设置了过时时间的全部键中,选取最近使用频率最低的数据抛弃;
  • volatile-ttl:在设置了过时时间的全部键,存活时间最短的数据抛弃;
  • volatile-random: 在设置了过时时间的全部键,随机抛弃;

删除键不是一个小活,所以能够搭配定时删除和惰性删除相结合的方式进行。

05. Redis 高可用

Redis Sentinel 为Redis提供高可用。这意味着使用 Sentinel,您能够建立一个 Redis 部署,无需人工干预便可抵抗某些故障。

Sentinel 功能:

  • 监控,Sentinel 会不断检查您的主节点和副本节点是否按预期工做。
  • 通知,Sentinel 能够经过 API 通知系统管理员或其余计算机程序,其中一个受监控的 Redis 实例出现问题。
  • 自动故障转移,若是 master 没有按预期工做,Sentinel 能够启动一个故障转移过程,其中一个副本被提高为 master,其余额外的副本被从新配置为使用新的 master,而且使用 Redis 服务器的应用程序会被告知要使用的新地址链接。
  • 配置提供程序,Sentinel 充当客户端服务发现的权威来源:客户端链接到 Sentinel 以请求负责给定服务的当前 Redis 主节点的地址。若是发生故障转移,Sentinels 将报告新地址。

🎏 06. 小结

其实还有不少内容,我想写的更多,但是实力和时间不容许,暂时到这吧,后续有什么不妥的还能够修改追加,感谢你看到这里!

例行小结,理性看待!

结的是啥啊,结的是我想你点赞而不可得的寂寞。😳😳😳

👓都看到这了,还在意点个赞吗?

👓都点赞了,还在意一个收藏吗?

👓都收藏了,还在意一个评论吗?

相关文章
相关标签/搜索