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
  • 相关阅读:
    MFC发送自定义消息
    NDIS LWF:NdisFSendNetBufferLists蓝屏(DRIVER_IRQL_NOT_EQUAL_OR_LESS)
    CreatFile打开驱动失败
    反向代理和正向代理区别(转)
    MFC对文件文件夹转移、删除、重命名、复制【转】
    解决 OnDropFiles 可能无响应的问题【转】
    HTML5
    Spring常见面试题总结
    Mybatis常见面试题总结
    MyBatis
  • 原文地址:https://www.cnblogs.com/yangkai-cn/p/4016755.html
Copyright © 2011-2022 走看看