`
yao_wenjun
  • 浏览: 2783 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

 
阅读更多

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

    博客分类:
    Java/Cache

memcachedcache分布式锁
为了将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代码  收藏代码

    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-笔记资料"涉及到的核心知识点是分布式内存缓存系统——Memcached,它是一个高性能、轻量级的缓存解决方案,主要用于减轻数据库的负载,提高Web应用的性能。 【描述】"memcached-笔记资料"暗示了...

    memcached之客户端memadmin安装

    "memcached之客户端memadmin安装" 这个标题涉及到的是关于`memcached`的一个客户端工具——`memadmin`的安装过程。`memcached`是一种高性能的分布式内存对象缓存系统,常用于减轻数据库负载,提高Web应用性能。而`...

    【MyBatis学习笔记八】——MyBatis缓存.zip

    本篇笔记将深入探讨MyBatis的缓存机制,包括一级缓存和二级缓存的概念、工作原理、配置与使用。 一级缓存是SqlSession级别的缓存,每当执行一个SQL查询时,如果结果不在缓存中,MyBatis会将其放入一级缓存。当同一...

    SSM实战项目——Java高并发秒杀API,详细流程+学习笔记

    SSM实战项目——Java高并发秒杀API是一个深入学习Java后端开发的重要实践,它涵盖了Spring、SpringMVC和MyBatis三大框架的整合应用,以及如何处理高并发下的秒杀场景。在这个项目中,我们将深入理解如何设计并实现一...

    PHP实例开发源码——PHP FexBook v1.0 Beta.zip

    【PHP实例开发源码——PHP FexBook v1.0 Beta】 PHP FexBook v1.0 Beta 是一个基于PHP编程语言开发的应用程序实例,它可能是类似于Facebook的一个社交网络平台的早期版本。这个源码提供了深入理解PHP在构建大型Web...

    PHP整理笔记

    在深入探讨PHP这一主题之前,让我们首先明确一下PHP的全称——PHP:Hypertext Preprocessor,即超文本预处理器。这是一种广泛使用的开源脚本语言,尤其适合于Web开发,并可嵌入到HTML中。PHP的设计目标是使网站制作...

    Redis基础配置笔记

    - **Memcached**:只支持单一类型的数据——字符串。 #### 三、Redis的安装 1. **下载**: - 官方站点:`redis.io` - 下载最新版或最新稳定版。 2. **解压与编译**: - 解压源码并进入目录。 - 不需要进行 `...

    Redis 笔记1

    【Redis笔记1】 Redis是一种内存数据结构存储系统,常被用作数据库、缓存和消息中间件。在本文中,我们将探讨Redis与NoSQL数据库的相关知识点。 **一、单机MySQL的瓶颈** 随着数据量的增长,单机MySQL面临几个...

    Java_Architect_Notes-John_H.rar_architect_java architect

    【Java架构师笔记——John_H】是一份针对Java架构师认证考试的重要学习资源,由知名专家John H提供。这份资料全面覆盖了Java架构设计的核心概念和技术,旨在帮助备考者深入理解并掌握成为一名合格的Java架构师所需的...

    VIP .Net培训高级班第十期全套资料(含代码).rar

    这些标签进一步细化了学习内容,包括整个.NET培训课程的范围,涵盖了从基础到高级的全方位知识,以及现代软件开发中的两大热门技术——微服务和分布式架构。代码的提供意味着学习者有机会亲手实践,增强对这些概念的...

Global site tag (gtag.js) - Google Analytics