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

除了常见的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吧。

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

原文发布于微信公众号 - 架构师之路(road5858)

原文发表时间:2018-06-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JavaEE

nginx+vsftp搭建图片服务器前言:简介:nginx的安装:vsftp的安装:配置nginx为图片服务器:总结:

6655
来自专栏北京马哥教育

试试Linux下的ip命令,ifconfig已经过时了

linux的ip命令和ifconfig类似,但前者功能更强大,并旨在取代后者。使用ip命令,只需一个命令,你就能很轻松地执行一些网络管理任务。ifconfig...

5046
来自专栏架构说

简单的 HTTP 协议

第二章 http特点 主要描述http是无状态(stateless)的协议 发送过的请求或响应都不做持久化处理 HTTP协议自身不对请求和响应之间的通信状态...

3509
来自专栏技术碎碎念

同步/异步,阻塞/非阻塞

什么是同步和异步 同步和异步是针对应用程序和内核的交互而言的, 同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪,而异步是指用户进程触发IO...

3436
来自专栏Linyb极客之路

Nginx代理功能与负载均衡详解

Nginx的代理功能与负载均衡功能是最常被用到的,关于nginx的基本语法常识与配置已在上篇文章中有说明,这篇就开门见山,先描述一些关于代理功能的配置,再说明负...

1192
来自专栏从流域到海域

数据库连接池

数据库连接池相关资料: 关于数据库连接池的使用,首先我们要明白我们为什么要用它,对应普通的数据库连接操作,通常会涉及到以下一些操作是比较耗时的: 网络通讯...

2337
来自专栏大壮

iOS GCD定时器

2953
来自专栏张戈的专栏

Linux:10个实用的网络和监控命令

本文列出了 10 个基础的每个 Linux 用户都应该知道的网络和监控命令。网络和监控命令类似于这些: hostname, ping, ifconfig, iw...

4003
来自专栏学海无涯

Java Web之Cookie和Session的理解

Cookie和Session.jpg 日常现象 登录了某个网站,过一会儿再登录,诶,不用输入密码了,直接是登录状态了,好神奇~~~ 在某网站看了一部手机,接下来...

2923
来自专栏企鹅号快讯

Nginx入门介绍与安装

Nginx是什么? Nginx是俄罗斯人编写的十分轻量级的HTTP和反向代理服务器。发音:"engine X" Nginx能干什么? (1)Http反向代理 N...

19710

扫码关注云+社区

领取腾讯云代金券