Redis系列之缓存原理&设计 redis缓存原理与实现
wptr33 2024-12-22 21:13 35 浏览
Redis系列之缓存原理&设计
缓存基本思想
缓存的使用场景
DB缓存,减轻服务器压力
一般情况下数据存在数据库中,应用程序直接操作数据库。当应用程序访问量上万,数据库压力突然增大,如果需要减轻数据库服务器的压力,有以下方法:
- 数据库读写分离
- 数据库分库分表
- 使用缓存,并实现换粗你的读写分离 缓存的作用:将应用程序已经访问过的内容或数据存储起来,当应用程序再次访问时先找缓存,缓存命中返回数据。不命中再查询数据库,并保存到缓存。
提高系统响应
数据库的数据是存在文件里,也就是硬盘。 与内存做交换(swap) 在大量瞬间访问时(高并发)MySQL单机会因为频繁IO而造成无法响应。
MySQL的InnoDB是有行锁,
将数据缓存在Redis中,也就是存在了内存中。内存天然支持高并发访问。可以瞬间处理大量请求。qps到达10万读请求
Session分离
传统的session是由tomcat自己进行维护和管理。集群或分布式环境,不同的tomcat管理各自的session。 只能在各个tomcat之间,通过网络和Io进行session的复制,极大的影响了系统的性能。
将登录成功后的Session信息,存放在Redis中,这样多个服务器(Tomcat)可以共享Session信息。
分布式锁和乐观锁(Redis)
- 分布式锁
一般讲锁是多线程的锁,是在一个进程中的多个进程(JVM)在并发时也会产生问题,也要控制时序性 可以采用分布式锁。使用Redis实现sexNX
- 乐观锁
同步锁和数据库中的行锁、表锁都是悲观锁 悲观锁的性能是比较低的,响应性比较差 高性能、高响应(秒杀)采用乐观锁 Redis可以实现乐观锁 watch + incr
常见缓存的分类
客户端缓存
- 页面缓存 页面缓存:页面自身对某些元素或全部元素进行存储,并保存成文件。 html5:Cookie、WebStorage(SessionStorage和LocalStorage)、WebSql、indexDB、ApplicationCache等
- 浏览器缓存
当客户端向服务器请求资源时,会先抵达浏览器缓存,如果浏览器有“要请求资源”的副本,就可以直接从浏览器缓存中提取而不是从原始服务器中提取这个资源。
浏览器缓存可分为强制缓存和协商缓存。
- 强制缓存:直接使用浏览器的缓存数据
- 协商缓存:服务器资源未修改,使用浏览器的缓存(304);反之,使用服务器资源(200)
- APP缓存
原生APP中把数据缓存在内存、文件或本地数据库(SQLite)中。比如图片文件。
网络端缓存
通过代理的方式响应客户端请求,对重复的请求返回缓存中的数据资源。
- Web代理缓存
可以缓存原生服务器的静态资源,比如样式、图片等。比如nginx反向代理
- 边缘缓存
边缘缓存中典型的商业化服务就是CDN了。
CDN的全称是Content Delivery Network,即内容分发网络。
CDN通过部署在各地的边缘服务器,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度 和命中率。
CDN的关键技术主要有内容存储和分发技术。现在一般的公有云服务商都提供CDN服务。
服务端缓存
服务器端缓存是整个缓存体系的核心。包括数据库级缓存、平台级缓存和应用级缓存。
- 数据库级缓存 数据库是用来存储和管理数据的。 MySQL在Server层使用查询缓存机制。将查询后的数据缓存起来。 K-V结构,Key:select语句的hash值,Value:查询结果 InnoDB存储引擎中的buffer-pool用于缓存InnoDB索引及数据块
- 平台级缓存
平台级缓存指的是带有缓存特性的应用框架。 比如:GuavaCache 、EhCache、OSCache等。 部署在应用服务器上,也称为服务器本地缓存。
- 应用级缓存
具有缓存功能的中间件:Redis、Memcached、EVCache、Tair等。 采用K-V形式存储。
利用集群支持高可用、高性能、高并发、高扩展。
缓存的优势、代价
优势
提升用户体验
- 用户在使用产品过程中建立起来的一种纯主观感受。
- 缓存的使用可以提升系统的响应能力,大大提升了用户体验。
减轻服务器压力
- 客户端缓存、网络端缓存减轻应用服务器压力。
- 服务端缓存减轻数据库服务器的压力。
提升系统性能
- 缩短系统的响应时间
- 减少网络传输时间和应用延迟时间
- 提高系统的吞吐量
- 增加系统的并发用户数
- 提高了数据库资源的利用率
缺点和代价
额外的硬件支出
- 缓存是一种软件系统中以空间换时间的技术
- 需要额外的磁盘空间和内存空间来存储数据
- 搭建缓存服务器集群需要额外的服务器
- 采用云服务器的缓存服务就不用额外的服务器了
- 阿里云,百度云,提供缓存服务
高并发缓存失效
- 在高并发场景下会出现缓存失效(缓存穿透、缓存雪崩、缓存击穿)
- 造成瞬间数据库访问量增大,甚至崩溃
缓存与数据库数据同步
- 缓存与数据库无法做到数据的时时同步
- Redis无法做到主从时时数据同步
缓存并发竞争
- 多个redis的客户端同时对一个key进行set值得时候由于执行顺序引起的并发问题
缓存的读写模式
缓存一般有三种读写模式
Cache Aside Pattern(常用,旁路缓存)
Cache Aside Pattern,是最经典的缓存+数据库读写模式。
- 读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。
- 更新的时候,先更新数据库,然后再删除缓存。
高并发脏读的三种情况
- 1、先更新数据库,再更新缓存
update和commit之间,更新缓存,commit失败,则数据库数据与缓存数据不一致
- 2、先删除缓存,再更新数据库
update和commit之间,有新的读,缓存为空,读数据库数据到缓存是旧的数据,commit后数据库数据为新的数据,则数据库数据与缓存数据不一致
- 3、先更新数据库,再删除缓存(推荐)
Read/Write Through Pattern(直读直写穿透模式)
应用程序只操作缓存,缓存操作数据库。
Read-Through(穿透读模式/直读模式):应用程序读缓存,缓存没有,由缓存回源到数据库,并写入 缓存。
Write-Through(穿透写模式/直写模式):应用程序写缓存,缓存写数据库。
该种模式需要提供数据库的handler,开发较为复杂。
Write Behind Caching Pattern(异步缓存写入模式)
应用程序只更新缓存。
缓存通过异步的方式将数据批量或合并后更新到DB中不能时时同步,甚至会丢数据。
缓存架构的设计思路
多层次
数据类型
根据数据的不同,采用不同的数据类型
集群
- 哨兵+主从
- RedisCluste
缓存的数据结构设计
- 1、与数据库表一致 数据库表和缓存是一一对应的 缓存的字段会比数据库表少一些 缓存的数据是经常访问的
- 2、与数据库表不一致 需要存储关系,聚合,计算等
作者:努力的IT小胖子
链接:https://juejin.cn/post/7044366350654898207
相关推荐
- 开发者必看的八大Material Design开源项目
-
MaterialDesign是介于拟物和扁平之间的一种设计风格,自从它发布以来,便引起了很多开发者的关注,在这里小编介绍在Android开发者当中里最受青睐的八个MaterialDesign开源项...
- 另类插这么可爱,一定是…(另类t恤)
-
IT之家(www.ithome.com):另类插图:这么可爱,一定是…OSXMavericks和Yosemite打破了苹果对Mac操作系统传统的命名方式,使用加州的某些标志性景点来替换猫...
- Android常用ADB命令(安卓adb工具是什么)
-
杀死应用①根据包名获取APP的PIDadbshellps|grep应用包名②执行kill命令...
- 微软Mac版PowerPoint测试Reading Order Pane功能
-
IT之家5月20日消息,微软公司昨日(5月19日)发布博文,邀请Microsoft365Insiders成员,测试macOS新版PowerPoint演示文稿应用,重点引入...
- Visual Studio跨平台开发实战(4):Xamarin Android控制项介绍
-
前言不同于iOS,Xamarin在VisualStudio中针对Android,可以直接设计使用者界面.在本篇教学文章中,笔者会针对Android的专案目录结构以及基本控制项进行介绍,包...
- 用云存储30分钟快速搭建APP,你信吗?
-
背景不管你承认与否,移动互联的时代已经到来,这是一个移动互联的时代,手机已经是当今世界上引领潮流的趋势,大型的全球化企业和中小企业都把APP程序开发纳入到他们的企业发展策略当中。但随着手机APP上传的...
- 谷歌P图神器来了!不用学不用教,输入一句话,分分钟给结果
-
Pine发自凹非寺量子位|公众号QbitAI当你拍照片时,“模特不好好配合”怎么办?...
- iOS文本编辑控件UITextField和UITextVie
-
记录一个菜鸟的IOS学习之旅,如能帮助正在学习的你,亦枫不胜荣幸;如路过的大神如指教几句,亦枫感激涕淋!细心的朋友可能已经注意到了,IOS学习之旅系列教程在本篇公众号的文章中,封面已经换成美女图片了,...
- Android入门图文教程集锦(android 入门教程)
-
Android入门视频教程集锦AndroidStudio错误gradientandroid:endXattributenotfound...
- 如何使用Android自定义复合视图(如何使用android自定义复合视图)
-
在最近的一个客户应用中,我遇到了一个需求,根据选定的值来生成指定数量的编辑框字段,这样用户可以输入人物信息。最初我的想法是把这些逻辑放到Fragment中,只是根据选中值的变化来向线性布局容器中增加编...
- 原生安卓开发app的框架frida常用关键代码定位
-
前言有时候可能会对APP进行字符串加密等操作,这样的话你的变量名等一些都被混淆了,看代码就可能无从下手...
- 教程10 | 三分钟搞定一个智能输入法程序
-
一案例描述1、考核知识点网格布局线性布局样式和主题Toast2、练习目标掌握网格布局的使用掌握Toast的使用掌握线性布局的使用...
- (Android 8.1) 功能与新特性(android的功能)
-
和你一起终身学习,这里是程序员AndroidAndroid8.1(API级别27)为用户和开发人员引入了各种新特性和功能。本文档重点介绍了开发人员的新功能。通过本章阅读,您将获取到以下内容:Andr...
- 怎样设置EditText内部文字被锁定不可删除和修改
-
在做项目的时候,我曾经遇到过这样的要求,就是跟百度贴吧客户端上的一样,在回复帖子的时候,在EditText中显示回复人的名字,而且这个名字不可以修改和删除,说白了就是不可操作,只能在后面输入内容。在E...
- 如何阻止 Android 活动启动时 EditText 获得焦点
-
技术背景在Android开发中,当活动启动时,EditText有时会自动获得焦点并弹出虚拟键盘,这可能不是用户期望的行为。为了提升用户体验,我们需要阻止...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
因果推断Matching方式实现代码 因果推断模型
-
git pull命令使用实例 git pull--rebase
-
面试官:git pull是哪两个指令的组合?
-
git 执行pull错误如何撤销 git pull fail
-
git fetch 和git pull 的异同 git中fetch和pull的区别
-
git pull 和git fetch 命令分别有什么作用?二者有什么区别?
-
git pull 之后本地代码被覆盖 解决方案
-
还可以这样玩?Git基本原理及各种骚操作,涨知识了
-
git命令之pull git.pull
-
- 最近发表
-
- 开发者必看的八大Material Design开源项目
- 另类插这么可爱,一定是…(另类t恤)
- Android常用ADB命令(安卓adb工具是什么)
- 微软Mac版PowerPoint测试Reading Order Pane功能
- Visual Studio跨平台开发实战(4):Xamarin Android控制项介绍
- 用云存储30分钟快速搭建APP,你信吗?
- 谷歌P图神器来了!不用学不用教,输入一句话,分分钟给结果
- iOS文本编辑控件UITextField和UITextVie
- Android入门图文教程集锦(android 入门教程)
- 如何使用Android自定义复合视图(如何使用android自定义复合视图)
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)