zoukankan      html  css  js  c++  java
  • Memcached笔记——(三)Memcached使用总结

    为了将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实现时,参考如下实现:
    Java代码 复制代码 收藏代码
    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
  • 相关阅读:
    leetcode 673. 最长递增子序列的个数 java
    leetcode 148. 排序链表 java
    leetcode 98. 验证二叉搜索树 java
    leetcode 29. 两数相除 java
    leetcode 234. 回文链表 java
    Valid Palindrome LeetCode Java
    Single Number II LeetCode Java
    Single Number LeetCode java
    Search in Rotated Sorted Array II LeetCode Java
    Search in Rotated Sorted Array leetcode java
  • 原文地址:https://www.cnblogs.com/yangkai-cn/p/4016755.html
Copyright © 2011-2022 走看看