Cache Aside Pattern缓存+数据库读写模式的分析

 

 

最经典的缓存+数据库读写的模式,cache aside pattern

1、Cache Aside Pattern

(1)读的时候,先读缓存,缓存没有的话,那么就读数据库,然后取出数据后放入缓存,同时返回响应

(2)更新的时候,先删除缓存,然后再更新数据库

2、为什么是删除缓存,而不是更新缓存呢?

原因很简单,很多时候,复杂点的缓存的场景,因为缓存有的时候,不简单是数据库中直接取出来的值

商品详情页的系统,修改库存,只是修改了某个表的某些字段,但是要真正把这个影响的最终的库存计算出来,可能还需要从其他表查询一些数据,然后进行一些复杂的运算,才能最终计算出

现在最新的库存是多少,然后才能将库存更新到缓存中去

比如可能更新了某个表的一个字段,然后其对应的缓存,是需要查询另外两个表的数据,并进行运算,才能计算出缓存最新的值的

更新缓存的代价是很高的

是不是说,每次修改数据库的时候,都一定要将其对应的缓存去跟新一份?也许有的场景是这样的,但是对于比较复杂的缓存数据计算的场景,就不是这样了

如果你频繁修改一个缓存涉及的多个表,那么这个缓存会被频繁的更新,频繁的更新缓存

但是问题在于,这个缓存到底会不会被频繁访问到???

举个例子,一个缓存涉及的表的字段,在1分钟内就修改了20次,或者是100次,那么缓存跟新20次,100次; 但是这个缓存在1分钟内就被读取了1次,有大量的冷数据

28法则,黄金法则,20%的数据,占用了80%的访问量

实际上,如果你只是删除缓存的话,那么1分钟内,这个缓存不过就重新计算一次而已,开销大幅度降低

每次数据过来,就只是删除缓存,然后修改数据库,如果这个缓存,在1分钟内只是被访问了1次,那么只有那1次,缓存是要被重新计算的,用缓存才去算缓存

其实删除缓存,而不是更新缓存,就是一个lazy计算的思想,不要每次都重新做复杂的计算,不管它会不会用到,而是让它到需要被使用的时候再重新计算

mybatis,hibernate,懒加载,思想

查询一个部门,部门带了一个员工的list,没有必要说每次查询部门,都里面的1000个员工的数据也同时查出来啊

80%的情况,查这个部门,就只是要访问这个部门的信息就可以了

先查部门,同时要访问里面的员工,那么这个时候只有在你要访问里面的员工的时候,才会去数据库里面查询1000个员工

推荐这些技术文章:

guava工具之cache缓存

1、pom
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>23.0</version>
</dependency>
2、cache
// 方式一
...

BDB数据库缓存大小和页面大小

问题
PAGESIZE和CACHE这两个参数,如何设置才是比较优化的?
手册里说到,PAGESIZE的大小范围是【512B,64K】,这个跟多种因素有关,主要的是OS的块大小。
CACHE的大小设置也有多个参数,在调整参数大小时,会找到一个比较优化的值,难道要一个一个的尝试吗?
有没有相关的文档供参考?

最佳回答
参考BerkeleyDB ...

缓存原理与设计之缓存的读写模式

  上篇缓存原理与设计之缓存基本思想及分类 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中提到了缓存的应用场景,这些场景的应用也是缓存的优势所在:减轻服务器压力、提升性能、提高用户体验等;同时增加缓存也意味着其他额外的开销也就是代价:额外的硬件支出、高并发缓存失效、缓存与数据库不同步(脏读)等一系列问题。
  问题存在了就要解决,而且解决问题的代价必然是可接收的,否则就不使用缓存...

Flask-Cache 缓存带参数的url

from flask import Flask
from flask import Blueprint
from flask_caching import Cache
config = {
"DEBUG": True, # some Flask specific configs
"CACHE_TYPE": "SimpleCache", # Flask-Cach...

MVC 中怎样手动删除缓存?

问题
我对一个页面设置了缓存

怎么样可以通过执行一条语句,手动删除缓存?

比如我进行了后台更改,我想让数据马上显示出来,是否有这样的语句,能直接删除缓存,而不等到缓存到期?

最佳回答
Response.Expires = -1;

...

django的缓存做了主从,如何实现读写分离

# 第一步:redis的配置中配置多个redis

CACHES = {
   "default": {
       "BACKEND": "django_redis.cache.RedisCache",
       "LOCATION": "redis://localhost:637...

缓存使用过程中的五种策略总结及优缺点组合分析

缓存使用过程中的五种策略总结及优缺点组合分析

概述
常用缓存策略

第一种:Cache-Aside
第二种:Read-Though Cache
第三种:Write-Through Cache
第四种 Write-Around
第五种 Write-Back

总结

 
概述
缓存是提高系统性能的最简单方法之一。相对而言,数据库(or NoSQL数据库)的速度比较慢,而...

[PHP] wordpress WP_Object_Cache机制,服务器内存会不会爆掉?

问题
看wordpress缓存机制时,博客的缓存是由cache.php中的 class WP_Object_Cache完成的,实际就是在数据缓存在对象的var $cache = array ()数据组,在内存中共享。
这里有个问题就是,如果缓存数据太多的话,服务器的内存会不会爆掉?还是有什么机制可以控制?

最佳回答
数据量太大超出服务器最大...

Redis(1-2) 缓存与数据库一致性 Cache Aside Pattern

缓存与数据库一致性
#1. Cache Aside Pattern
标准的方案,facebook 就是使用这种方式。

核心概念说明

失效
应用程序先从 cache 取数据,没有得到,则从数据库中取数据,成功后,放到缓存中。

命中
应用程序从 cache 中取数据,取到后返回。

更新
先把数据存到数据库中,成功后,再让缓存失效。

#读流程:

步骤说明

1
读缓存...

缓存与数据库的一致性

对于读多写少的场景,缓存是提升系统读性能的一个常见技术。而数据系统一旦引入了新的组件,必然会带来数据一致性的问题。这里不考虑强一致性,强一致性带来的性能问题在高并发的场景下是不可接受的,因此这里说的是最终一致性。
对于缓存和数据库一起使用的模式,一般来说有以下几种。其中最常用的应该是 Cache Aside Pattern。
Cache Aside Pattern
这种方案下,需要分别操作缓存和...

文章标题:Cache Aside Pattern缓存+数据库读写模式的分析
文章链接:https://www.dianjilingqu.com/2108.html
本文章来源于网络,版权归原作者所有,如果本站文章侵犯了您的权益,请联系我们删除,联系邮箱:saisai#email.cn,感谢支持理解。
THE END
< <上一篇
9
下一篇>>