添运娱乐下载中心

添运娱乐下载中心-添运娱乐gg捕鱼手机版【中文版】

进程内缓存究竟怎么玩?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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