为了将N个前端数据同步,通过Memcached完成数据打通,但带来了一些新问题:

  • 使用iBatis整合了Memcached,iBatis针对每台server生成了唯一标识,导致同一份数据sql会产生不同的key,造成重复缓存。——通过重写iBatis部分原码,终止了唯一标识的生成,同一个SQL产生同一个Key,同时对生成key做hash,控制长度,使得数据统一在Memcached。
  • 为了迎合iBatis的架构,通过CacheModel模式,对缓存数据分组管理。最初通过Map实现CacheModel,就是简单的Key对应最终的Object。为了后台操作数据时,前台能及时响应,以CacheModel为基准点。后台操作数据时,做Flush,清空对应的CacheModel,可以及时同步数据。但,由于前后台Domain对象可能不一致,调用CacheModel(Map)反序列化时,发生ClassNotFonudException(CNF)。——将CacheModel的Map实现改为Set,CacheModel仅存需要Flush掉的key,Object按原有方式缓存。
  • 以前一直用EhCache,也很少会把List<List>这样的重量级对象放进缓存里。即便如此,只要EhCache没有抛异常,我们恐怕也无感知。这次改用Memcached,没有注意到缓存List过大,导致“Cannot cache data larger than 1MB memcached”,即缓存对象体积不能超过1MB——使用Memcached数据压缩,优化SQL,可以暂时维持。

相关链接:

Memcached笔记——(一)安装&常规错误&监控

Memcached笔记——(二)XMemcached&Spring集成


Memcached笔记——(三)Memcached使用总结


Memcached笔记——(四)应对高并发攻击






说了这么多,简要总结如下:

  • Memcached的Key,要杜绝使用空格,且长度控制在250个字符。
  • Memcached的Value,要控制体积,必须小于1MB,必要时进行使用压缩。
  • 失效时间,0为永久有效,最大值不得超过30天(2592000s),否则重新计算可能缓存只有1秒
  • Memcached仅支持LRU算法,完全适用你的需要。
  • 尽量不要将List这种重体积对象扔到Memcached中,传输、存储都会产生瓶颈。
  • 使用一致性哈希算法实现,提高多个Memcacehd Server利用率。








关于使用XMemcached实现时,参考如下实现:

  1. private MemcachedClientBuilder createMemcachedClientBuilder(
  2. Properties properties) {
  3. String addresses = properties.getProperty(ADDRESSES).trim();
  4. if (logger.isInfoEnabled()) {
  5. logger.info("Configure Properties:[addresses = " + addresses +
    "]");
  6. }
  7. MemcachedClientBuilder builder = new XMemcachedClientBuilder(
  8. AddrUtil.getAddresses(addresses));
  9. // 使用二进制文件
  10. builder.setCommandFactory(new BinaryCommandFactory());
  11. // 使用一致性哈希算法(Consistent Hash Strategy)
  12. builder.setSessionLocator(new KetamaMemcachedSessionLocator());
  13. // 使用序列化传输编码
  14. builder.setTranscoder(new SerializingTranscoder());
  15. // 进行数据压缩,大于1KB时进行压缩
  16. builder.getTranscoder().setCompressionThreshold(1024);
  17. return builder;
  18. }
	private MemcachedClientBuilder createMemcachedClientBuilder(
Properties properties) {
String addresses = properties.getProperty(ADDRESSES).trim(); if (logger.isInfoEnabled()) {
logger.info("Configure Properties:[addresses = " + addresses + "]");
}
MemcachedClientBuilder builder = new XMemcachedClientBuilder(
AddrUtil.getAddresses(addresses)); // 使用二进制文件
builder.setCommandFactory(new BinaryCommandFactory());
// 使用一致性哈希算法(Consistent Hash Strategy)
builder.setSessionLocator(new KetamaMemcachedSessionLocator());
// 使用序列化传输编码
builder.setTranscoder(new SerializingTranscoder());
// 进行数据压缩,大于1KB时进行压缩
builder.getTranscoder().setCompressionThreshold(1024); return builder;
}

主要有以下几点参考:

  • 使用二进制文件模式
  • 使用一致性哈希算法
  • 使用序列化编码
  • 对数据进行压缩

关于SET&ADD

  • SET&ADD都属于更新操作,都要先申请内存
  • SET,会擦除这个键所对应的内存,不管原先是否有内容
  • ADD,会先查看这个键对应的内存是否有内容,如果有,则等待;若没有,则获取锁,并更新内存。

缓存命中率,通常认为:缓存命中率低于95%的设计都是不合理的,存在设计缺陷的。










这是我在线上服务器,经过优化后得到的最好成绩!




相关链接:

Memcached笔记——(一)安装&常规错误&监控

Memcached笔记——(二)XMemcached&Spring集成


Memcached笔记——(三)Memcached使用总结


Memcached笔记——(四)应对高并发攻击








Memcached PPT参考

  • 大小: 50.7 KB
  • 大小: 60.4 KB

Memcached笔记——(三)Memcached使用总结的更多相关文章

  1. Memcached笔记——(四)应对高并发攻击【转】

    http://snowolf.iteye.com/blog/1677495 近半个月过得很痛苦,主要是产品上线后,引来无数机器用户恶意攻击,不停的刷新产品各个服务入口,制造垃圾数据,消耗资源.他们的最 ...

  2. 【 学习笔记 】memcached基础知识

    源地址:http://kb.cnblogs.com/page/42731/ 仔细学习了下,以下是记录的笔记备忘内容. 一.memcached是什么?    memcached是高性能的分布式内存缓存服 ...

  3. Memcached笔记——(四)应对高并发攻击

    近半个月过得很痛苦,主要是产品上线后,引来无数机器用户恶意攻击,不停的刷新产品各个服务入口,制造垃圾数据,消耗资源.他们的最好成绩,1秒钟可以并发6次,赶在Database入库前,Cache进行Mis ...

  4. Memcached笔记——(二)XMemcached&Spring集成

    今天研究Memcached的Java的Client,使用XMemcached 1.3.5,做个简单的测试,并介绍如何与Spring集成. 相关链接: Memcached笔记--(一)安装&常规 ...

  5. Memcached笔记——(一)安装&常规错误&监控

    08年的时候接触过Memcached,当时还对它的客户端产品嗤之以鼻,毕竟手工代码没有各种ORM原生XML配置方便.尽管如此,Memcached现在已经成了服务器架构里不可或缺的一部分! 相关链接: ...

  6. Memcached 笔记与总结(8)Memcached 的普通哈希分布算法和一致性哈希分布算法命中率对比

    准备工作: ① 配置文件 config.php ② 封装 Memcached 类 hash.class.php,包含普通哈希算法(取模)和一致性哈希算法 ③ 初始化 Memcached 节点信息 in ...

  7. Memcached 笔记与总结(7)增加虚拟节点

    仅仅把 Memcached 服务器集群地址通过一致性哈希转映射在圆环上,可能会出现数据不能均匀地分配给各台 Memcached 服务器. 解决方案是引入虚拟节点,就是把每个映射在圆环上的服务器地址(物 ...

  8. 17.Python笔记之memcached&redis

    作者:刘耀 博客:www.liuyao.me 博客园:www.cnblogs.com/liu-yao 一.Memcached 1.介绍 Memcached 是一个高性能的分布式内存对象缓存系统,用于动 ...

  9. Windows Server 2008安装Memcached笔记

    分布式缓存系统Memcached简介与实践 缘起: 在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载.缓存是解决这个问题的好办法.但是ASP.NET中的虽然 ...

随机推荐

  1. 题解 P3117 【[USACO15JAN]牛的矩形Cow Rectangles】

    暴力什么的就算了,贪心他不香吗 这题其实如果分开想,就三种情况需要讨论:(由于不会发图,只能手打) 1) 5 . . . . . 4 . . . . . 3 . . . H . 2 . . G . . ...

  2. Dynamics CRM - 通过 C# Plugin 来 abandon Business Process Flow

    需求说明: 当一个 Entity 存在 Business Process Process 时,有时我们需要改变其状态,在之前写的博客有讲了可以通过 JavaScript 来实现,本篇就来讲一下如何通过 ...

  3. Overlapping generations model

    I.6 Overlapping generations 世代被分离开,世代不重复一定满足哈代公式的条件,但是现实情况远没有这么简单(因为会世代重叠,即亲代死去同时一个亲代在不同时间都有可能产生子代,因 ...

  4. 用PrintStream向文件输入内容

    import java.io.*; public class Main { public static void main(String[] args) throws FileNotFoundExce ...

  5. 解决 Win7 远程桌面 已停止工作的问题

    Windows 7远程桌面登录时崩溃, 错误提示如下: 问题签名: 问题事件名称: APPCRASH 应用程序名: mstsc.exe 应用程序版本: 6.1.7601.18540 应用程序时间戳: ...

  6. rsync配置文件

    vim /etc/rsyncd.conf motd file = /etc/rsyncd.motd #设置服务器信息提示文件,在该文件中编写提示信息 transfer logging = yes #开 ...

  7. Django模型迁移提示版本不匹配解决办法

    Django迁移模型时提示django.core.exceptions.ImproperlyConfigured:mysqlclient 1.3.7 or newer is required; you ...

  8. 深度优先搜索(DFS)和广度优先搜索(BFS)求解迷宫问题

    用下面这个简单的迷宫图作为例子: OXXXXXXX OOOOOXXX XOXXOOOX XOXXOXXO XOXXXXXX XOXXOOOX XOOOOXOO XXXXXXXO O为通路,X为障碍物. ...

  9. 吴裕雄--天生自然python学习笔记:python安装配置tesseract-ocr-setup-3.05.00dev.exe

    下载地址:https://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-setup-3.05.00dev.exe 点击安装,记得复制安装的路径,待会 ...

  10. java实现线程交替打印1-52和A-Z

    题目: 1.开启两个线程,一个线程打印A-Z,两一个线程打印1-52的数据. 2.实现交替打印,输出结果为12A34B...........5152Z. 3.请用多线程方式实现. 实现思路:通过锁(s ...