数据库缓存

article/2025/10/6 11:54:02

一、什么是数据库缓存

我们知道常见的数据库,比如oracle、mysql等,数据都是存放在磁盘中。虽然在数据库层也做了对应的缓存,但这种数据库层次的缓存一般针对的是查询内容,而且粒度也太小,一般只有表中数据没有变更的时候,数据库对应的cache才发挥了作用。但这并不能减少业务系统对数据库产生的增、删、查、改的庞大IO压力。所以数据库缓存技术在此诞生,实现热点数据的高速缓存,提高应用的响应速度,极大缓解后端数据库的压力。
以下为memcache数据库缓存为例,以图说明一下什么是数据库缓存:

二、数据库缓存的技术特点

性能优越
数据库缓存的第一个技术特点就是提高性能,所以数据库缓存的数据基本上都是存储在内存中,相比io读写的速度,数据访问快速返回。而且在mysql 5.6的版本开始,已经把memcache这种跟数据库缓存直接挂钩的中间件直接集成进去了,已经等不及我们自己去单独部署对应数据库缓存的中间件了。
应用场景
针对数据库的增、删、查、改,数据库缓存技术应用场景绝大部分针对的是“查”的场景。比如,一篇经常访问的帖子/文章/新闻、热门商品的描述信息、好友评论/留言 等。因为在常见的应用中,数据库层次的压力有80%的是查询,20%的才是数据的变更操作。所以绝大部分的应用场景的还是“查”缓存。当然,“增、删、改”的场景也是有的。比如,一篇文章访问的次数,不可能每访问一次,我们就去数据库里面加一次吧?这种时候,我们一般“增”场景的缓存就必不可少。否则,一篇文章被访问了十万次,代码层次不会还去做十万次的数据库操作吧。
数据一致性
在很多应用场景中,当一个数据发生变更的时候,很多人在考虑怎么样确保缓存数据和数据库中数据保存一致性,确保从缓存读取的数据是最新的。甚至,有人在对应数据变更的时候,先更新数据库,然后再去更新缓存。我觉得这个考虑不太现实,一方面这会导致代码层次逻辑变得复杂,另外一方面也真想不明白还要缓存干什么了。在绝大多数的应用中,缓存中的数据和数据库中的数据是不一致的。即,我们牺牲了实时性换回了访问速度。比如,一篇经常访问的帖子,可能这篇帖子已经在数据库层次进行了变更。而我们每次访问的时候,读取的都是缓存中的数据(帖子)。既然是缓存,那么必然是对实时性可以有一定的容忍度的数据,容忍度的时间可以是5分钟,也可以是5小时,取决于业务场景的要求。相反,一定要求是实时性的数据库,就不应该从缓存里读取,比如库存,再比如价格。
高可用
自从有了缓存,代码每天快乐的去缓存中愉快的玩耍。为什么说高可用呢,我们知道缓存为数据库抵挡了很多压力,同时也为应用提供了良好的访问速度。但同时有没有想过缓存的感受,如果当数据库缓存“罢工”了,这会出现什么后果?特别在一些高并发的应用中,数据库层肯定是“消化不良“,最终导致应用全面崩溃。所以缓存的高可用显得非常重要。


三、数据库缓存常见开源技术

要说用于数据库缓存场景的开源技术,那必然是memcache和redis这两个中间件。

| 数据类型 | 持久性 | 分布式
----|------|---- | -----
memcache | 支持简单数据类型 | 不支持数据持久化存储 | 不支持主从、不支持sharing(代码层次通过hash可以实现)
redis | 数据类型丰富,支持set、list等类型| 支持数据磁盘持久化存储|支持主从,支持sharding(redis 3.0开始支持)
因为都是专注于内存缓存领域,memcache和redis向来都有争议。比如性能,到底是memcache性能好,还是redis性能更好等。同样都是内存缓存技术,它们都有自己的技术特性。没有更好的技术,只有更合适的技术。个人总结一下,有持久化需求或者对数据结构和处理有高级要求的应用,选择redis。其他简单的key/value存储,选择memcache。所以根据自身业务特性,数据库缓存来选择适合自己的技术。

暂不说用不用数据库缓存,见过有人把session存储在数据库中的,也见过把视频/文件转化成二进制存储在数据库的,这种行为无疑是逆天的。合理应用数据库缓存技术,且行且珍惜,切勿走向误区。



作者:耕云者
链接:https://www.jianshu.com/p/51be1b9ca60b
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 


http://chatgpt.dhexx.cn/article/K89xnQq0.shtml

相关文章

【技术干货】缓存随谈系列之一:数据库缓存

本文作者: 乔锐杰 现担任上海驻云信息科技有限公司运维总监/架构师。曾任职过黑客讲师、java软件工程师/网站架构师、高级运维、阿里云架构师等职位。维护过上千台服务器,主导过众安保险、新华社等千万级上云架构。在云端运维、分布式集群架构等方面有着丰富的经验。 以…

内连接、外连接、全连接图示语法

外连接 外连接分为外左连接(left outer join)和外右连接(right outer join) left outer join 与 left join 等价, 一般写成left join right outer join 与 right join等价, 一般写成right join左连接:左侧交集部分 语法:…

MySQL 内连接、外连接、左连接、右连接、全连接

建表语句: CREATE TABLE a_table (a_id int(11) DEFAULT NULL,a_name varchar(10) DEFAULT NULL,a_part varchar(10) DEFAULT NULL ) ENGINEInnoDB DEFAULT CHARSETutf8CREATE TABLE b_table (b_id int(11) DEFAULT NULL,b_name varchar(10) DEFAULT NULL,b_part v…

SQL中的各种连接的区别总结(内连接,左连接,左外连接,右连接,右外连接,全连接,全外连接)

在数据库中建立两张表方便大家理解,teacher和student表(student表中的teacherid字段是对应teacher表中的ID,举个例子张三的老师就是李四,没有teacherid就是这个人暂时没有老师) INNER JOIN: 返回两个表的匹配得上的数据,不匹配不…

MYSQL语法:左连接、右连接、内连接、全外连接

文章目录 概念上手使用left join(左连接)rint join(右连接)inner join(内连接,等同join)full join(全连接,等同full outer join) 概念 left join(左连接):返回包括左表中…

MySQL 的等值连接、交叉连接、左外连接 、右外连接、全外连接实例

1. 测试数据 测试数据如下所示,数据库脚本(含数据)在文章最后的附录中给出。 测试工具:MySQL8.0 , Navicat Premium。 首先是一个班级表:class,class表中的数据如下所示。 学生表: student&a…

数据库学习之MySQL (十六)—— SQL99 外连接 左外连接 右外连接 全外连接 交叉连接

文章目录 外连接 之 左外连接 与 右外连接为啥要用外连接全外连接总结 内连接 外连接交叉连接 外连接 之 左外连接 与 右外连接 我们先来看个之前的 女神男朋友的案例 传送:数据库学习之MySQL (十三)——多表查询 SQL92 SQL99 连接种类划分 我们先考虑…

ORACLE的左右连接,全外连接

先上概念 oracle连接分为: 左外连接:左表不加限制,保留左表的数据,匹配右表,右表没有匹配到的行中的列显示为null。 右外连接:右表不加限制,保留右表的数据。匹配左表,左表没有匹配…

SQL的内连接、左连接、右连接、 交叉连接、全外连接

sql表连接分成 外连接 、 内连接 和 交叉连接。. 外连接包括三种,分别是左外连接、右外连接、全外连接。. 对应的sql关键字:LEFT/RIGHT/FULL OUTER JOIN,通常我们都省略OUTER关键字,写成LEFT/RIGHT/FULL JOIN。. 在左、右外连接中都会以一种表为基表,基表的所有行、…

Mysql中实现全外连接

MySql中多表查询只提供了内连接,左外连接与右外连接: table_reference {[INNER] JOIN | {LEFT|RIGHT} [OUTER] JOIN} table_reference ON conditional_expr 1】INNER JOIN ON内连接(只写join时默认为内连接) SELECT * FROM emp e…

mysql 全外连接报错的原因

mysql 不支持 直接写full outer join 或者 full join来表示全外连接但是可以用left right union right 代替。 全外连接图(非原创图) 下面的是全外连接例子: select * from table a A(A为别名)LEFT JOIN table b B …

Oracle:左连接、右连接、全外连接、(+)号详解

目录 Oracle 左连接、右连接、全外连接、()号详解 1、左外连接(LEFT OUTER JOIN/ LEFT JOIN) 2、右外连接(RIGHT OUTER JOIN/RIGHT JOIN) 3、全外连接(FULL OUTER JOIN/FULL JOIN&#xff0…

全外连接给你讲

你知道的越多,你不知道的就越多 先来看看标准SQL里面定义的外连接的三种类型: 左外连接右外连接全外连接 其中,左外连接和右外连接没有本质的区别,用作主表的表写在运算符左侧就是左外连接,卸载运算符右侧就是右外连接…

SegmentFault 技术周刊 Vol.30 - 学习 Python 来做一些神奇好玩的事情吧

前言 开始之前,我们先来看这样一个提问: python初学者,请教python学习路径 相信看完 X_AirDu 的回答我们已经对 Python 有了一个大概的了解。那接下来就让我们更深入的了解 Python 吧~ Python 入门 [零基础学Python]一些关于Python的事情 已经…

产品读书《金字塔原理》

PPT参考 1PPT参考2 其实我读这本书并不是把它当作一本读物来读,反倒觉得像是一本工具书,全书的内容可能干货不多,总结出来就是“金字塔”,倒没什么其他,再多也就是一些案例!但是这个思想已经能让人俯首称赞…

转载-代码的马斯洛金字塔

从科技爱好者周刊(第 156 期):显卡缺货与异业竞争看到的关于代码的马斯洛金字塔这种说法;搬运过来方便自己随时阅读; 原文是代码的马斯洛金字塔; 内容如下: As in Maslow’s pyramid, each laye…

需求挖掘:产品经理怎么基于项目做需求挖掘

零、需求分析的背景 日常工作中,我们常常面临别人提过来的需求要不要做,如何去挖掘新的需求、衡量需求的投入产出比等相应的场景,这些场景都涉及到我们对需求的分析和挖掘,也就意味着我们需要掌握足够多的认知和方法论去对指定的需…

如何思考总结,并如何写文档展示. 结构化思考, 金字塔思维

先看三张图: 术语: 交叉表, 是人分类能力提升的一个标志. (对问题思考可以分类到多个维度,并了解维度之间的层级关系,哪个更主要,哪个是次要) 该图的是最简单的整理表格. 进一步复杂的在数据分析上有专门的术语: 叫做交叉表 找不到了 1.上线前 道: 法(制度): 术…

程序员应了解:知识技能金字塔

这是我的开篇文章!! 如今计算机非常火热,尤其是程序员(软件开发)更是大众眼中高工资的代表。 而新的编程语言和技术框架等更新迭代速度可以说是360行中最快之一,一般来说程序员知识半衰期是五年&#xff0…

需求

什么是需求 定义 需求是满足某类用户的某种欲望或解决某些问题时所产生的现象。工具类App的出现就是为了解决用户的某些问题。比如印象笔记,解决了用户记录事物,并整理笔记的需求;番茄todo解决拖延症人群效率低下,办事无条理的问题…