如何快速高效的更新memcached缓存数据

转载 2015年07月08日 18:09:51
在高并发的分布式系统中,加入缓存机制可以很大的提高性能。最近做的XX省的电信BSS项目中就用到了Memcached,系统中将查询到的结果缓存到Memcached 中(下面称MC好了)。对于配置类的规格数据,是不经常改变的。在MC中的命中率高达90%以上。

       试想如果取消缓存机制,每秒几万、几十万的数据访问都会请求数据库。会造成数据库连接不够用的情况,系统性能会大大降低。服务器的压力会瞬间上升。

具体场景是:系统正在运行时,由于某种原因,需要修改某项配置数据,并且要求立即生效。

MC给我们带来了方便,但是对于一个庞大的MC集群,可能多达几十个memcached节点,总容量达上百GB。如果快速更新缓存中的旧数据呢。

MC本身提供了遍历下面的item的功能,但在这里显然不适用,因为我们的数据太多了。

原来系统的做法是:将每一个Key保存起来,当系统发出更新指令的时候,将保存起来的key对应的Item从MC中逐个删除。显然这不是一个好方法。因为MC保存的对象不能太大(最大是1MB),如果保存key的集合太大、就会存不进MC,连之前保存的也一起丢失了。最后只能将整个MC集群flushAll掉。

flushAll可能不是我们希望的,比如我们同事在MC集群中保存了A地区的配置数据、B地区的、C地区的数据。而我们现在只想更新A地区的数据,这个时候就不能使用flushAll了。

我的做法是通过一套异步的 发布-订阅 方式,利用公共容器MC或者数据库来实现MC数据更新。

图示如下:


通过WebService将更新指令送入MC,分布式的各个应用程序中的守护线程会定期扫描MC,获取最新的指令,和上一个版本比对,如果发现不一样就将当前的缓存版本号更新成最新的——McVersion={newVersion}。

应用程序中从缓存查取数据,会先生成一个key。

key = 参数信息 + 地区信息 +McVersion;

此时,McVersion已经被更新了,所以生成的key也就和之前的不一样了。

这样就能达到更新缓存的目的了。

这种方法最大的优点是高效,而且可以将各地区的数据在逻辑上分离。因为key中加入了地区信息。

如: 北京地区的某个配置信息可能是 key = offerSpec_123_010_version0.1

上海地区的对应的配置信息就是 key = offerSpec_123_021_version0.1

如果此时应用中缓存版本发生变化,从version0.1 变成 version0.2

那么北京和上海地区的 原来对应的key就会变成:

offerSpec_123_010_version0.2

offerSpec_123_025_version0.2

你不必担心原来的旧数据会留在MC中,挥之不去。其实不然,你只需要在存数据到缓存的时候,加上一个失效时间久可以了。MC会到期将一些无用的或者过期的数据清除掉。


memcached启动与清理缓存

memcached启动 memcached清理缓存需要通过telnet服务

应对Memcached缓存失效,导致高并发查询DB的几种思路

当Memcached缓存失效时,容易出现高并发的查询DB,导致DB压力骤然上升。 这篇blog主要是探讨如何在缓存将要失效时,及时地更新缓存,而不是如何在缓存失效之后,如何防止高并发的DB查询。 个...

Memcached 使用记录(以及解决数据不同步的问题的方案)

因为使用了memcached, 所以第一次查找的时候把内容缓存到了memcached里面去了,这样第二次查看的时候就是从memcached里面去取,但是有个坏处是可能第一次查找完,立即内容有更新了,所...

memcached使用总结篇<一>

memcached使用总结 缓存机制

Memcached之缓存雪崩,缓存穿透,缓存预热,缓存算法(7)

缓存雪崩 缓存雪崩可能是因为数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机。 解决思路: 1,采用加锁计数,或者使用合理的队列...

Memcached和Redis数据缓存系统

1.1 Memcached介绍Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动...

缓存Memcached以及缓存策略

缓存是我们在设计中考虑的如何提高软件性能的方法,使用memcached这款简单的K/V缓存,提升软件性能,降低服务器压力。...
  • Scalzdp
  • Scalzdp
  • 2014年05月14日 09:56
  • 16578

Redis VS. Memcached 均不适合数据量高于1千万条,且保证数据完整的key-value存储

引子:     在大数据时代,总希望存在一个Key-value存储机制,像HashMap一样在内存中处理大量(千万数量级)的key-value对,以便提高数据查找、修改速度。     所以...
  • yumengkk
  • yumengkk
  • 2012年08月24日 01:39
  • 54863

怎样刷新memcached

Memcached使用点滴

Centos 7.2 及php7环境下升级memcache未果,改安装 memcached

由于前文“Centos 7.2 yum安装php7”中升级了php到php7,导致之前可以正常使用的phpmyadmin、memcache等无法继续使用,需要重新编译安装,memcache目前未找到有...
  • xahuo
  • xahuo
  • 2015年12月21日 16:16
  • 5388
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何快速高效的更新memcached缓存数据
举报原因:
原因补充:

(最多只允许输入30个字)