热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

进程内缓存,究竟怎么玩?

除了常见的redismemcache等进程外缓存服务,缓存还有一种常见的玩法,进程内缓存。什么是进程内缓存?答:将一些数据缓

除了常见的redis/memcache等进程外缓存服务,缓存还有一种常见的玩法,进程内缓存。

 

什么是进程内缓存?

:将一些数据缓存在站点,或者服务的进程内,这就是进程内缓存。

 

进程内缓存的实现载体,最简单的,可以是一个带锁的Map。又或者,可以使用第三方库,例如leveldb。

 

进程内缓存能存储啥?

:redis/memcache等进程外缓存服务能存什么,进程内缓存就能存什么。

如上图,可以存储json数据,可以存储html页面,可以存储对象。

 

进程内缓存有什么好处?

:与没有缓存相比,进程内缓存的好处是,数据读取不再需要访问后端,例如数据库。

如上图,整个访问流程要经过1,2,3,4四个步骤。

 

如果引入进程内缓存,

如上图,整个访问流程只要经过1,2两个步骤。

 

与进程外缓存相比(例如redis/memcache),进程内缓存省去了网络开销,所以一来节省了内网带宽,二来响应时延会更低。

 

进程内缓存有什么缺点?

:统一缓存服务虽然多一次网络交互,但仍是统一存储。

如上图,站点和服务中的多个节点访问统一的缓存服务,数据统一存储,容易保证数据的一致性。

 

而进程内缓存,如上图,如果数据缓存在站点和服务的多个节点内,数据存了多份,一致性比较难保障。

 

如何保证进程内缓存的数据一致性?

:保障进程内缓存一致性,有几种方案。

 

第一种方案,可以通过单节点通知其他节点。如上图:写请求发生在server1,在修改完自己内存数据与数据库中的数据之后,可以主动通知其他server节点,也修改内存的数据。

 

这种方案的缺点是:同一功能的一个集群的多个节点,相互耦合在一起,特别是节点较多时,网状连接关系极其复杂。

 

第二种方案,可以通过MQ通知其他节点。如上图,写请求发生在server1,在修改完自己内存数据与数据库中的数据之后,给MQ发布数据变化通知,其他server节点订阅MQ消息,也修改内存数据。

 

这种方案虽然解除了节点之间的耦合,但引入了MQ,使得系统更加复杂。

 

前两种方案,节点数量越多,数据冗余份数越多,数据同时更新的原子性越难保证,一致性也就越难保证。

 

第三种方案,为了避免耦合,降低复杂性,干脆放弃了“实时一致性”,每个节点启动一个timer,定时从后端拉取最新的数据,更新内存缓存。在有节点更新后端数据,而其他节点通过timer更新数据之间,会读到脏数据。

 

为什么不能频繁使用进程内缓存?

:分层架构设计,有一条准则:站点层、服务层要做到无数据无状态,这样才能任意的加节点水平扩展,数据和状态尽量存储到后端的数据存储服务,例如数据库服务或者缓存服务。

 

可以看到,站点与服务的进程内缓存,实际上违背了分层架构设计的无状态准则,故一般不推荐使用。

 

什么时候可以使用进程内缓存?

:以下情况,可以考虑使用进程内缓存。

情况一,只读数据,可以考虑在进程启动时加载到内存。

画外音:此时也可以把数据加载到redis / memcache,进程外缓存服务也能解决这类问题。

 

情况二,极其高并发的,如果透传后端压力极大的场景,可以考虑使用进程内缓存。

例如,秒杀业务,并发量极高,需要站点层挡住流量,可以使用内存缓存。

 

情况三,一定程度上允许数据不一致业务。

例如,有一些计数场景,运营场景,页面对数据一致性要求较低,可以考虑使用进程内页面缓存。

末了,再次强调,进程内缓存的适用场景并不如redis/memcache广泛,不要为了炫技而使用。

更多的时候,还是老老实实使用redis/mc吧。

画外音:额,介绍技术,不希望把大家带偏了。

 

相关推荐:

挖坑篇:《缓存架构,到底设计些什么?》

填坑篇一:《从源码分析,究竟选型redis还是memcache》

填坑篇二:《“选redis还是memcache”,面试官究竟想考察啥?》

任何脱离业务的架构设计都是耍流氓,希望大家有收获,求转。


推荐阅读
  • PHP语言之所以能有今天的地位,得益于PHP语言设计者一直遵从实用主义,将技术的复杂性隐藏在底层。PHP语言入门简单,容易掌握,程序健壮性好。 ... [详细]
  • 单点登录原理及实现方案详解
    本文详细介绍了单点登录的原理及实现方案,其中包括共享Session的方式,以及基于Redis的Session共享方案。同时,还分享了作者在应用环境中所遇到的问题和经验,希望对读者有所帮助。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 旁路|发生_Day749.旁路缓存:Redis是如何工作的Redis 核心技术与实战
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Day749.旁路缓存:Redis是如何工作的-Redis核心技术与实战相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 14亿人的大项目,腾讯云数据库拿下!
    全国人 ... [详细]
  • 玩转直播系列之消息模块演进(3)
    一、背景即时消息(IM)系统是直播系统重要的组成部分,一个稳定的,有容错的,灵活的,支持高并发的消息模块是影响直播系统用户体验的重要因素。IM长连接服务在直播系统有发挥着举足轻重的 ... [详细]
  • 缓存 分布式锁 Redis
    分布式锁现在Redis基本上没家公司都在使用,只是各自使用的场景不以,但Redis最出名的还是做为缓存服务器,提搞服务器的的吞吐量,下面我们来围绕这个作为缓存做一个总结今天的目标其 ... [详细]
  • Java工程师书单(初级,中级,高级)
    简介怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序员也是工作一两年之后开始迷茫的程序 ... [详细]
  • 朱晔的互联网架构实践心得S1E7:三十种架构设计模式(上)【下载本文PDF进行阅读】设计模式是前人通过大量的实践总结出来的一些经验总结和最佳实践。在经过多年的软件开发实践之后,回过头 ... [详细]
  • 讨伐Java多线程与高并发——MQ篇
    本文是学习Java多线程与高并发知识时做的笔记。这部分内容比较多,按照内容分为5个部分:多线程基础篇JUC篇同步容器和并发容器篇线程池篇MQ篇本篇 ... [详细]
  • celery 爬虫使用
    简介celery是一个基于分布式消息传输的异步任务队列,它专注于实时处理,同时也支持任务调度。它由三部分组成,消息中间件, ... [详细]
  • 传统|同类_Spring Boot进阶:原理实战与面试题分析读后感
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了SpringBoot进阶:原理实战与面试题分析读后感相关的知识,希望对你有一定的参考价值。 ... [详细]
  • php yac缓存如何清理,yac和memcache性能对比测试
    yac是Laruence开发的一个php进程共享内存的开源项目。详情可以查看。http:www.laruence.com201303182846.htmlmemcache就不用多说 ... [详细]
  • http:simple-is-better.comnews1047Firefly是免费、开源、稳定、快速扩展、能“热更新”的分布式游戏服务器端框架,采用Python编 ... [详细]
author-avatar
-晴天2602926075
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有