缓存的使用,是一个逐渐演进的过程。

问一下你自己,最直接的使用缓存的原因是什么?

无它,唯快而已!

追溯一下自己最开始使用缓存的场景,一些数据库里存储的不变的配置信息,服务启动时,直接加载到本地公共模块,方便其它功能模块共享使用。这便是最基本,最简单的本地缓存应用。

一、服务与缓存

所谓的服务,简而言之,一层应用 + 一层数据,应用从数据层获取数据然后加工输出。

数据层,通常我们指的是持久化介质上的持久化存储。它有多种形式的,可以是文件,或者数据库。

数据存储在持久化介质上,而应用运行与内存中。内存和持久化介质是两个有着量级速度差别的不同介质,由此,应用和数据之间便有了“矛盾”。

有了这“矛盾”的引子,便有了对缓存的迫切需求。

我们说的缓存,必然要是存放于内存中的,这样它便能距离应用更近,更快的给出应用所需要的数据,以获得更快的服务响应。

当然,并不是缓存完全隔绝持久层数据。缓存,伴随而生的一个词叫做命中率

当我们查询的数据存在于缓存中的时候,我们称之为“命中”,此时,所需数据可以直接由缓存提供。

而对于未“命中”的数据,则需要穿过缓存层,进一步去持久化数据层获取。此种情景,我们称之为缓存穿透

数据获取之后,在返回给应用之前,我们需要重新填充缓存,以供下一次“命中”查询。

当然,上述我们所述只是指“读”查询情景。

当应用发生数据操作变更,我们则需要将变更同时更新到持久层及缓冲层。此时,我们又会面临另外一个问题,**“先”与“后”**的问题。

“先”与“后”的问题,我们也称之为缓存一致性问题。

如果先更新缓存,则可能面临持久层更新失败,产生缓存脏数据的问题。

然则,假如先更新持久层,我们又不得不面对从持久层更新成功之后到缓存更新之前这个间期,缓存对外提供旧数据的窘境。

缓存一致性问题,尤其在高并发环境,需要根据特定场景进行更精妙的控制。

比如,并发修改的一致性锁;比如,异步刷新的延迟刷新等等。

二、缓存与更新

上面我们提到了缓存更新一致性的问题,从实际应用情景来讲,可以细分为强一致性需求,弱一致性需求及最终一致性需求。

1、强一致性需求

比如,交易状态信息,已下单、支付中,已支付等应用,需要我们主动及时进行关联更新并保证事务层面的一致性。

应景而生的许多包括分布式事务等理论也为我们解决实际问题提供了很好的践行方案。

2、弱一致性需求

一些涉及不太重要的信息更新,能够容忍短时间(比如,几分钟)内持久层数据和缓存数据不一致的场景。比如不外显的描述信息,统计性的计数缓存信息等。通常可以采取异步处理的方式。

一些一段短时间内(几秒,几分钟)输出固定信息的场景。比如每隔30s更新热点信息,票价信息等。可以通过设置缓存超时自动剔除的方式进行处理。

3、最终一致性需求

保障数据状态的最终一致性。

三、缓存的粒度

所谓粒度,也即缓存信息块层级,大小。选择何种粒度的缓存,取决于我们应用的整体架构,数据存储规划及具体的应用场景。

拿用户信息来举例,是缓存活跃信息?还是相对静态的信息?是按单属性层级来缓存?还是按整个对象信息?

不同的数据粒度,也决定着我们存储缓存的形式:整个对象的二进制序列化数据?更透明直观的json字符串?属性与值的一一映射?

每种形式都有各自的使用优缺点,开发者可以从应用、存储及维护成本各方面进行全面性评估选择。

四、缓存穿透的危害

第一小节,我们提到过关于缓存穿透发生的原因:缓存未命中。那为什么会未命中呢?

1、数据暂时不存在于缓存中

所谓暂时,可以指数据初始尚未加载到缓存,lazy load 按需按时时事加载应用;

也可以是缓存数据被我们特定的缓存过期策略自动或主动过期,通常使用的过期策略包括元素数量限制,内存占用限制及生存时间限制。

其实,无论是初始未加载还是缓存过期,删除,这些都属于我们假定的正常应用场景,再次我们不予过多评论。

2、数据从来不存在

当一个查询不存在数据的请求到来,其必然会穿过缓存,达到持久化存储层。

持久话存储的响应能力是有限的,当这种请求达到一定的量级,服务可能就要面临着宕机的危险。

至此,我们对于缓存的作用认知,也需要进一步延伸:降低下层负载,保护后端资源

造成这种缓存穿透的原因可以简单的分为内外两方面诱因:内部的应用逻辑问题及外部恶意攻击、爬虫干扰等。

内部问题容易解决,内观可预知,良性优化即可;

反而是外部的不可预料,可能需要更谨慎的进行多面的防御性处理。

其实,不论内部还是外部,在缓存层面需要处理的就只有一件事:有效拦截穿透

到此,通常惯性的思维第一步,就是把造成缓存穿透的数据放置到缓存中,无论其是否存在在于持久化存储中。

比如对于正常的已删除的用户数据,做缓存层面的软删除处理,以状态信息做标注(**我存在,其实我不存在!**

应用缓存的基本概念,香(Redis)相关推荐

  1. 分布式数据库缓存的基本概念?MemCache和redis的详细比较?

    分布式数据库缓存指的是在高并发环境下,为了减轻数据库压力和提高系统响应时间,在数据库系统和应用系统之间增加的独立缓存系统. 目前市场上常见的数据库缓存系统是MemChace和Redis,他们的主要区别 ...

  2. redis缓存实现原理php,分析redis原理及实现

    下面由Redis教程栏目给大家介绍分析redis原理及实现,希望对需要的朋友有所帮助! 1 什么是redis redis是nosql(也是个巨大的map) 单线程,但是可处理1秒10w的并发(数据都在 ...

  3. 高性能网站架构设计之缓存篇(5)- Redis 集群(上)

    2019独角兽企业重金招聘Python工程师标准>>> 集群技术是构建高性能网站架构的重要手段,试想在网站承受高并发访问压力的同时,还需要从海量数据中查询出满足条件的数据,并快速响应 ...

  4. 带上问题来学redis,看到不吃亏(什么是redis?缓存问题、数据一致性、redis配置文件汉化版)

    愿打开此篇能对你有帮助. 文章目录 redis是什么? 为什么说redis是缓存中间件?? redis.conf翻译与配置 redis VS memcache 缓存穿透 什么是缓存穿透? 缓存穿透的危 ...

  5. 缓存的基本概念和常用的缓存技术

    摘要: 介绍缓存的基本概念和常用的缓存技术,给出了各种技术的实现机制的简单介绍和适用范围说明,以及设计缓存方案应该考虑的问题(共17页) 1         概念 1.1   缓存能解决的问题 · 性 ...

  6. php redis 切换数据库,Laravel Redis数据库切换以及laravel缓存/Session使用不同的Redis数据库 - Laravel学习网...

    Redis Select命令用于切换到指定的数据库,数据库索引号index用数字值指定,以0作为起始索引值. 比如我们要使用db10数据库,只需要使用如下命令即可: redis 127.0.0.1:6 ...

  7. Redis学习总结(10)——缓存雪崩、缓存穿透、缓存并发、缓存预热、缓存更新、缓存降级、缓存算法的概念及解决思路总结

    前言 缓存是CPU的一部分,它存在于CPU中 CPU存取数据的速度非常的快,一秒钟能够存取.处理十亿条指令和数据(术语:CPU主频1G),而内存就慢很多,快的内存能够达到几十兆就不错了,可见两者的速度 ...

  8. 分布式缓存架构(3)-Redis事务主从复制哨兵机制

    Redis的主从复制 概述: redis的复制功能是支持多个数据库之间的数据同步.一类是主数据库,一类是从数据库,主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数据库,而从数据库一般是 ...

  9. (转)使用 Spring缓存抽象 支持 EhCache 和 Redis 混合部署

    背景:最近项目组在开发本地缓存,其中用到了redis和ehcache,但是在使用注解过程中发现两者会出现冲突,这里给出解决两者冲突的具体方案. spring-ehcache.xml配置: <?x ...

最新文章

  1. linux nfs如何配置,Linux上的NFS如何配置?
  2. Partition函数
  3. FD.io/VPP — VPP Agent — Telemetry Plugin
  4. Linux下使用parted对硬盘进行分区
  5. boost::mpl::string相关的测试程序
  6. mongodb 持久性_多语言持久性:带有MongoDB和Derby的EclipseLink
  7. Android开发之Java集合类性能分析
  8. mysql启多_MySQL启多个实例
  9. Android系统(117)---Activity启动过程
  10. python中while与else的联姻
  11. 如何用绩效考核搞垮一个团队?
  12. 【BZOJ3674】—可持久化并查集加强版(可持久化并查集)
  13. 模拟实现memcpy、memmove函数
  14. java基础之static
  15. python中rgb颜色_python颜色显示
  16. 电力系统稳态matlab,基于MATLAB的电力系统稳态仿真分析
  17. 【VHDL】半减器和全减器的设计
  18. 推荐效果线上评测:AB测试平台的设计与实现
  19. 50道C/C++编程练习题 复习必备(1-10)
  20. Docker的数据管理

热门文章

  1. 223.主成分分析PCA
  2. Nature Method:DEMIC——使用宏基因组数据预测细菌的生长速率
  3. Nature Protocols:整合宏基因组、代谢组和表型分析的的计算框架
  4. Cell:人体细菌到究竟有多少,再作报告必引此文
  5. mysql内存爆_线上MySQL机器内存爆掉原因分析与解决
  6. pandas使用query函数基于组合索引筛选dataframe的数据行(与and、或or、非not)
  7. python中使用squarify包可视化treemap图:treemap将分层数据显示为一组嵌套矩形,每一组都用一个矩形表示,该矩形的面积与其值成正比
  8. R语言随机森林回归(randomforest)模型构建
  9. 机器学习特征筛选:相关系数法(correlation)
  10. python代码找到链表的倒数第K个节点并打印