美文网首页技术分享系统架构
利用zookeeper即时更新本地缓存

利用zookeeper即时更新本地缓存

作者: 无醉_1866 | 来源:发表于2019-10-17 22:58 被阅读0次

本地缓存

当系统中需要有一些基础数据时,往往会使用本地缓存将这些数据缓存在内存中,以减少对数据库的查询,提升系统性能,但是本地缓存如何处理数据更新的情况呢?当应用集群中某台机器更新了数据,其它机器如何快速响应?

一般更新本地缓存有如下 方式:

  • 定时更新,这种方式延迟比较大
  • 通过消息广播机制更新
  • 使用协调者,比如zookeeper,适用于更新频率低的场景

本文介绍第三种方式,如何利用zookeeper做缓存的即时更新

基本思路

假设应用有三台机器,分别标记为A\B\C,整个过程遵循如下逻辑:

  • 应用在创建本地缓存时,向zookeeper注册一个节点
  • 注册监听器,监听数据变化
  • 当其中一台机器更新缓存后(假设是机器A),修改zookeeper上的节点的数据,标识有缓存更新
  • 集群中所有机器都会收到节点数据更新的回调,随后刷新缓存

整体逻辑如下图:

image

实现

将实现分为两部分,第一部分基于zk实现一个可复用的通知服务,用于通知集群中的其它机器,第二部分基于通知服务实现对缓存的封装

通知服务

通知服务抽象出一个资源的概念,用String表示资源Id,一个资源Id对应于zookeeper上的一个节点,针对资源id触发通知服务实际上就是修改资源id对应的节点上的数据,接口如下:

image

接口定义中包含三个方法:

  • Register:注册资源
  • Unregister:删除资源
  • Notify:通知,目前只接受String类型的值
image

缓存封装

因为本地缓存有多种实现方式:

  • Guava
  • ConcurrentHashMap
  • 其它…

为了支持各种类型的local cache实现,定义CacheProvider接口,用于创建缓存:

image

为zookeeper提供抽象类的支持:

image

不同的local cache实现从此abstract类继承,例如guava的实现:

image

基于ConcurrentHashMap的local cache实现:

image

最后通过一个工具类提供的工厂方法来使用:

image

使用方式

最后看一下使用方式:

image.png

相关文章

  • 利用zookeeper即时更新本地缓存

    本地缓存 当系统中需要有一些基础数据时,往往会使用本地缓存将这些数据缓存在内存中,以减少对数据库的查询,提升系统性...

  • 31 简单看 storm

    上一篇 带你利用zookeeper 分布式锁解决缓存重建冲突, 主要讲解了nginx 并发更新缓存时导致的缓存重建...

  • 利用zookeeper实现缓存更新功能

    开发一个专门用于运维的接口,每次需要运维时,指定ip进行(若不指定ip,由于有多台部署机器,请求路由到完全不可知的...

  • Python功能点实现:数据热更新

    关键词:热更新 | 热重载 | 定时更新 | 即时更新 | 缓存 | functools | cachetools...

  • NSURLRequest的缓存机制

    NSURLRequest可以实现网页缓存,下面实现了网页有更新时候,重新从网络获取,没有更新就使用本地缓存,如果没...

  • 缓存

    内存缓存 数据库缓存 文件系统缓存 本地内存缓存 没有利用缓存机制之前,所耗费的时间 1. 数据库缓存 配置中间件...

  • 2020-06-02 git使用

    更新本地远程分支缓存git fetch -p origin 迁入远程分支到本地git checkout -b xx...

  • 记录一下CocoaPods的常用命令

    Pods 版本号:pod --version更新本地缓存的Pods仓库:pod repo update更新Pods...

  • 有关iOS 缓存

    缓存 在众多可以本地保存数据的技术中,有三种脱颖而出:URL缓存、数据模型缓存(利用NSKeyedArchiver...

  • 使用zookeeper在分布式环境下更新本地缓存

    最近在做一个项目,需求很简单,就是要为平台网站web端,h5端,app端提供轮播图,公告,新闻等cms内容的系统。...

网友评论

    本文标题:利用zookeeper即时更新本地缓存

    本文链接:https://www.haomeiwen.com/subject/uqjbmctx.html