关注公众号 【离心计划】呀,一起逃离地球表面

专栏链接:Redis专栏https://link.juejin.cn/?target=https%3A%2F%2Fmp.weixin.qq.com%2Fmp%2Fappmsgalbum%3F__biz%3DMzkzOTM4MzYwNQ%3D%3D%26action%3Dgetalbum%26album_id%3D2642660048770744323%26scene%3D173%26from_msgid%3D2247483787%26from_itemidx%3D1%26count%3D3%26nolastread%3D1%23wechat_redirect

前言

这一章我们进入Redis的正式篇,问起Redis的作用是什么,相信很多人会回答:缓存。确实Redis最主要的功能就是为服务提供数据缓存,很经典的案例就是在DB前加上Redis,应对大流量的DB请求,缓解DB压力。而Redis的缓存也叫做旁路缓存,或者说第三方缓存,因为Redis本身是一个数据服务,部署在和我们应用不同的进程环境下,而缓存其实在我们的计算机中也非常常见,所以在说Redis之前我们可以先看看计算机中有哪些缓存机制。

计算机中的缓存

CPU缓存是计算机中非常重要的缓存机制,提供了CPU工作时指令级别的缓存,这个缓存是按块来的,叫做Cache-Line,也叫做缓存行,避免CPU频繁去内存中获取执行指令,对于CPU来说从缓存和内存去拿数据,是两个不同量级的耗时,在成千上万次的操作面前,细微的问题会被放大。普遍的计算机有三级缓存(L1、L2、L3):

L1和L2是核内私有的,L3是核间共享的。一个经典的Java面试题:Volatile的作用是什么?而由于CPU缓存和线程内存空间之间的数据不一致导致的可见性问题便是Volatile解决的问题之一。

文件系统缓存则是计算机处理磁盘IO下的优化,由于频繁的随机访问磁盘会有大量的寻道、旋转以及数据传输时间,因此在read/write文件时在操作系统和磁盘之间的缓冲区就十分重要。Linux下文件系统Cache分为Page Cache和Buffer Cache两个层面,其中一个Page Cache包含多个Buffer Cache,Buffer Cache主要设计为对块设备io进行数据缓存。磁盘Cache分为预读回写两个功能,预读就是在对一个文件进行读取的时候,提前预读顺序的后几个Page到Page Cache;回写就是在写文件时将数据暂存在Cache中一并刷到磁盘。

http缓存也是很常见的缓存,常见到大家容易忽视它。如果没有缓存机制,那么每次比较大的静态资源都要重新去服务端拿,这会很冗余。http在返回响应时通过cache-control控制返回的资源浏览器可以缓存的模式,比如:

设置为max-age就是允许缓存7200秒,除了这个还会返回一个etag唯一标识这个资源

这样下次去请求时就会携带这个etag信息通过If-None-Match和If-Modify-Since条件判断资源是否过期:

如果没有过期就会返回304告诉浏览器可以直接用上次缓存的资源

旁路缓存的意义

上面列举了常见计算机中的缓存,他们都有一个特点,就是局限在一个体系内,更直接地说就是计算机A上的文件缓存是无法直接被计算机B使用的,而如果把缓存作为一个服务、一个系统以接口的形式提供给其他服务,那么就能实现大家共用,而共用一份数据可以解决很多问题,像分布式锁其实就是不同机器间不同进程的同步。

Redis就是这样一个旁路缓存系统,我们完全可以把它理解为一个数据服务,仅仅提供读写数据而已,如果你搭建一个web项目,只提供一个接口,传递key,value,接口功能就是把key放进hashmap,或者把key从hashmap中拿出来,这就是一个很简易的数据服务,只不过Redis更加强大与完善。

旁路缓存的工作模式

只读缓存

只读缓存故名思意就是只提供读操作,它的基本工作模式是当缓存中数据缺失时就去后端DB中查库并刷新缓存;当DB数据有变更时就先更新数据库然后删除对应的缓存,这样下次请求就会触发缓存缺失主动读取最新数据。只读缓存将最新的数据维护在DB中,缓存不用关心数据的可靠性

读写缓存

读写缓存则是提供读写两种模式,当我们要修改数据时同时修改缓存和DB的值,这样的好处在于最新的数据一直在缓存中,提升了部分读性能;而写操作则其实可以同步写DB和异步写DB,同步表示写缓存和写DB同步进行,都成功后返回给客户端,异步则是为了提高写性能,将写DB的耗时操作放到异步线程。

只读缓存保证了缓存与DB的数据最终一致性,存在下面两种场景:

  1. 刚写完DB还没删除缓存的一小段gap的不一致

  2. 写DB成功,删缓存失败导致的不一致

为了保证最终的一致性,mysql可以通过订阅binlog,其他DB相同思路直接借助消息队列发送一个更新数据的消息出来,消费者去实时更新缓存

而读写缓存相对问题就会更多,因为写缓存和写DB无论哪一步先执行,任何一步失败都会出现严重的数据不一致,因此适合对数据一致性要求不高的场景,个人认为就没必要借助其他方式强行原子化两个步骤,反而与提升效率的初衷背道而驰了。

小结

这一小节我们了解了旁路缓存以及旁路缓存的工作模式,Redis作为一款旁路缓存系统,本质是数据服务,我们上面举了一个hashmap的例子粗糙地形容了一下基本读写功能,而Redis作为最受欢迎的旁路缓存,它丰富的数据结构是其地位不倒的重要原因之一,除了字符类型我们有各种奇奇怪怪的存储需求比如队列、集合或者是map甚至是定制的数据结构,本质是服务于业务,因此我们下一节会介绍Redis的基本数据结构,看看Redis是如何高效地利用珍贵地内存资源的。

【专栏】基础篇02| Redis 旁路缓存的价值相关推荐

  1. python深浅拷贝 面试_Python面试宝典之基础篇-02

    原标题:Python面试宝典之基础篇-02 我觉得你如果正在找工作,我的Python面试宝典几期教程,你一定得花时间看完了! 题目006:说说Python中的浅拷贝和深拷贝. 点评:这个题目本身出现的 ...

  2. 【基础篇】Redis深入理解与实践指南(一)之Redis的前世今生

    基础篇 技术是一条很长的路,走到最后除了热爱还需要坚持! 一.Redis诞生背景 时代背景 基于冯诺依曼体系所述,计算机系统由运算器,控制器,存储器,输入设备,输出设备五个部分组成(考研真题).但有的 ...

  3. MySQL基础篇(02):从五个维度出发,审视表结构设计

    本文源码:GitHub·点这里 || GitEE·点这里 一.数据场景 1.表结构简介 任何工具类的东西都是为了解决某个场景下的问题,比如Redis缓存系统热点数据,ClickHouse解决海量数据的 ...

  4. Java基础篇(02):特殊的String类,和相关扩展API

    本文源码:GitHub·点这里 || GitEE·点这里 一.String类简介 1.基础简介 字符串是一个特殊的数据类型,属于引用类型.String类在Java中使用关键字final修饰,所以这个类 ...

  5. C语言基础篇02:单链表实现学生成绩管理系统

    单链表实现学生成绩管理系统 前言 需求分析 详细设计 增加成绩信息 删除成绩信息 修改成绩信息 查询学生信息和浏览学生信息 总结 前言 上篇已经讲过单链表的基本实现,这篇将以一个简单的管理系统入手. ...

  6. 《跟我学java》_《跟我学Java——基础篇02》

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 2. Java中的注释: a) 什么是注释: i. 我们的Java代码都是用英文编写的,一旦功能比较复杂,那么就没那么容易看懂,所以有的时候我们需要写一些 ...

  7. stm32呼吸灯程序_STM32裸机开发基础篇02点亮LED

    前言 上一节,我们完成了STM32单片机开发环境的搭建,本节我们正式学习STM32单片机,编程语言的学习,通常是从第一个"hello world"开始,而点灯实验便是单片机学习的开 ...

  8. Cesium开发基础篇 | 02加载地形数据

    Cesium中的地形图层类 前面我们主要学习了cesium内置接口如何操作影像数据,但是在一些应用场景中我们需要操作地形数据,例如模拟逼真的三维场景.与高程相关的一些空间分析和计算等.Cesium提供 ...

  9. python面试笔试宝典pdf_Python面试宝典之基础篇-02

    题目006:说说Python中的浅拷贝和深拷贝.点评:这个题目本身出现的频率非常高,但是就题论题而言没有什么技术含量.对于这种面试题,在回答的时候一定要让你的答案能够超出面试官的预期,这样才能获得更好 ...

最新文章

  1. 超越PVT、Swin,南大开源高效Transformer:ResT​
  2. 无限级分类实现思路 (组织树的分级管理)
  3. TorchFusion 是一个深度学习框架,主要用于 AI 系统加速研究和开发
  4. Python十段经典代码
  5. JavaBean的详细及引用
  6. 在python中是否可以使用if作为变量名_在Python中可以使用if 作为变量名_python使用符号 标示注释...
  7. html label修改字体颜色,Swift label文字显示不同颜色(字体)
  8. lammps计算聚合物例子_LAMMPS模拟聚合物结构,非晶态聚合物变形行为的模拟,纳米线变形模拟,单轴张力模拟,晶格参数计算...
  9. 数据库支持的数据类型
  10. 《大话数据结构》读后总结(八)
  11. UCINET(64 bits)使用中 Access violation at address问题
  12. 超好的 MARKINGCODE查询网 电子元件丝印
  13. python的十句名言_让人恍然大悟的十句名言(双语版)
  14. [extjs5学习笔记]第三十七节 Extjs6预览版都有神马新东西
  15. C语言:在屏幕输出如下图案(*/ )
  16. 被微软收购两年后,GitHub 怎么样了?
  17. CAD LISP 施工、规划设计点位的编号注记
  18. 净误差与遗漏为负值的含义_为什么遗漏与误差项为负反映了去向不明的资本外逃?...
  19. wow修改默认服务器地址,wow如何修改登录服务器地址
  20. 以太坊开发者证实 Eth2.0 不会在7月上线

热门文章

  1. Selenium中implicitly_wait等待失效
  2. Window10 106日文键盘和101英文键盘的追加方法
  3. 获取地址栏参数的几种办法
  4. SpringBoot整合RestHighLevelClient实现查询操作
  5. 如何管理分布式团队?
  6. 打开Xterm加中文新宋体 。
  7. arduino教程——SD模块简单操作
  8. 总结20220414
  9. 腾讯线上培训PPT资料 web安全
  10. SQL中字符串截取函数(left、SUBSTRING)