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

为了将N个前端数据同步,通过Memcached完成数据打通,但带来了一些新问题:
[list]
[*]使用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,可以暂时维持。
[/list]

[b]相关链接:
[url=/blog/1447348]Memcached笔记——(一)安装&常规错误&监控 [/url]
[url=/blog/1471805]Memcached笔记——(二)XMemcached&Spring集成[/url]
[url=/blog/1576818]Memcached笔记——(三)Memcached使用总结[/url]
[url=/blog/1677495]Memcached笔记——(四)应对高并发攻击[/url]
[/b]

说了这么多,简要总结如下:
[list]
[*][color=red][b]Memcached的Key,要杜绝使用空格,且长度控制在250个字符。[/b][/color]
[*][color=red][b]Memcached的Value,要控制体积,必须小于1MB,必要时进行使用压缩。[/b][/color]
[*][color=red][b]失效时间,0为永久有效,最大值不得超过30天(2592000s),否则重新计算可能缓存只有1秒[/b][/color]
[*]Memcached仅支持LRU算法,完全适用你的需要。
[*]尽量不要将List这种重体积对象扔到Memcached中,传输、存储都会产生瓶颈。
[*]使用一致性哈希算法实现,提高多个Memcacehd Server利用率。
[/list]
[img]http://dl.iteye.com/upload/attachment/0070/3304/cb29c5b5-cc7e-35b8-919d-3f0c08427d98.jpg[/img]


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

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;
}

主要有以下几点参考:
[list]
[*]使用二进制文件模式
[*]使用一致性哈希算法
[*]使用序列化编码
[*]对数据进行压缩
[/list]

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


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

[img]http://dl.iteye.com/upload/attachment/0074/6900/b08b0ead-fd00-301d-be64-e10acb3b5f56.jpg[/img]


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

[b]相关链接:
[url=/blog/1447348]Memcached笔记——(一)安装&常规错误&监控 [/url]
[url=/blog/1471805]Memcached笔记——(二)XMemcached&Spring集成[/url]
[url=/blog/1576818]Memcached笔记——(三)Memcached使用总结[/url]
[url=/blog/1677495]Memcached笔记——(四)应对高并发攻击[/url]
[/b]


[url=http://www.slideshare.net/hectcastro/memcached-2536880]Memcached PPT参考[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值