Spring-Simple-memcached 增加支持只取键值

本贴最后更新于 2796 天前,其中的信息可能已经事过景迁

这里使用的 Spring-Simple-Memcached 的版本为:

compile 'com.google.code.simple-spring-memcached:spymemcached:2.8.4' compile 'com.google.code.simple-spring-memcached:spymemcached-provider:3.1.0' compile 'com.google.code.simple-spring-memcached:simple-spring-memcached:3.1.0'

ssm 支持的读取相关的方法有:

@ReadThroughAssignCache: 读取指定 key 缓存
@ReadThroughSingleCache: 读取单个缓存
@ReadThroughMultiCache: 读取多个缓存

在 get(key) key 值不存在时,该方法会默认把返回的 value 值添加至该 key 值的缓存。

假设,我们有需求要只取某 key 的缓存值,不存在时也不需要增加缓存,以下是对 ssm 包的扩展。

google.code.ssm.ReadOnlyThroughSingleCacheAdvice.java

package com.google.code.ssm.aop; import com.google.code.ssm.aop.support.AnnotationData; import com.google.code.ssm.api.ReadOnlyThroughSingleCache; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Created by ixiaozhi on 16/7/27. */ @Aspect public class ReadOnlyThroughSingleCacheAdvice extends SingleReadCacheAdviceExtend<ReadOnlyThroughSingleCache> { private static final Logger LOG = LoggerFactory.getLogger(ReadThroughSingleCacheAdvice.class); public ReadOnlyThroughSingleCacheAdvice() { super(ReadOnlyThroughSingleCache.class); } @Pointcut("@annotation(com.google.code.ssm.api.ReadOnlyThroughSingleCache)") public void getSingle() { } @Around("getSingle()") public Object cacheGetSingle(final ProceedingJoinPoint pjp) throws Throwable { return cache(pjp); } @Override protected String getCacheKey(final AnnotationData data, final Object[] args, final String methodDesc) throws Exception { return getCacheBase().getCacheKeyBuilder().getCacheKey(data, args, methodDesc); } @Override protected Logger getLogger() { return LOG; } }

com.google.code.ssm.aop.SingleReadCacheAdviceExtend.java

package com.google.code.ssm.aop; import com.google.code.ssm.aop.support.AnnotationData; import com.google.code.ssm.aop.support.AnnotationDataBuilder; import com.google.code.ssm.api.format.SerializationType; import org.aspectj.lang.ProceedingJoinPoint; import java.lang.annotation.Annotation; import java.lang.reflect.Method; /** * Created by ixiaozhi on 16/7/27. */ abstract class SingleReadCacheAdviceExtend<T extends Annotation> extends CacheAdvice { private final Class<T> annotationClass; protected SingleReadCacheAdviceExtend(final Class<T> annotationClass) { this.annotationClass = annotationClass; } protected Object cache(final ProceedingJoinPoint pjp) throws Throwable { if (isDisabled()) { getLogger().info("Cache disabled"); return pjp.proceed(); } // This is injected caching. If anything goes wrong in the caching, LOG // the crap outta it, but do not let it surface up past the AOP injection itself. final T annotation; final AnnotationData data; final SerializationType serializationType; String cacheKey = null; try { final Method methodToCache = getCacheBase().getMethodToCache(pjp); getCacheBase().verifyReturnTypeIsNoVoid(methodToCache, annotationClass); verifyNoUseJsonAnnotation(methodToCache); annotation = methodToCache.getAnnotation(annotationClass); serializationType = getCacheBase().getSerializationType(methodToCache); data = AnnotationDataBuilder.buildAnnotationData(annotation, annotationClass, methodToCache); cacheKey = getCacheKey(data, pjp.getArgs(), methodToCache.toString()); final Object result = getCacheBase().getCache(data).get(cacheKey, serializationType); if (result != null) { getLogger().debug("Cache hit."); return getCacheBase().getResult(result); } else { return null; } } catch (Throwable ex) { warn(ex, "Caching on method %s and key [%s] aborted due to an error.", pjp.toShortString(), cacheKey); return pjp.proceed(); } } protected abstract String getCacheKey(final AnnotationData data, final Object[] args, final String methodDesc) throws Exception; }

com.google.code.ssm.api.ReadOnlyThroughSingleCache.java

package com.google.code.ssm.api; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * Created by ixiaozhi on 16/7/27. */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface ReadOnlyThroughSingleCache { String namespace() default AnnotationConstants.DEFAULT_STRING; int expiration() default 0; }

配置文件中的 simplesm-context.xml 添加以下实例化配置:(如果有的话;如果不存在,在自己的 Spring 配置中添加也是一样的)

<bean id="readOnlyThroughSingleCache" class="com.google.code.ssm.aop.ReadOnlyThroughSingleCacheAdvice"> <property name="cacheBase" ref="cacheBase" /> </bean>

使用时,使用自定义的注解: @ReadOnlyThroughSingleCache,参数与 ReadThroughSingleCache 相同,有 namespace 与 expiration。

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3198 引用 • 8215 回帖 • 1 关注
  • 缓存
    42 引用 • 70 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Visio
    1 引用 • 2 回帖 • 2 关注
  • Bootstrap

    Bootstrap 是 Twitter 推出的一个用于前端开发的开源工具包。它由 Twitter 的设计师 Mark Otto 和 Jacob Thornton 合作开发,是一个 CSS / HTML 框架。

    18 引用 • 33 回帖 • 644 关注
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    952 引用 • 944 回帖
  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用 • 9 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 60 关注
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 532 关注
  • Markdown

    Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。

    170 引用 • 1529 回帖
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 568 关注
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    79 引用 • 431 回帖
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖 • 3 关注
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 397 关注
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    54 引用 • 41 回帖
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 160 关注
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    173 引用 • 3849 回帖
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 505 关注
  • Hexo

    Hexo 是一款快速、简洁且高效的博客框架,使用 Node.js 编写。

    22 引用 • 148 回帖 • 16 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    52 引用 • 228 回帖
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    92 引用 • 752 回帖 • 1 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 110 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖 • 3 关注
  • Thymeleaf

    Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 Velocity、 FreeMarker 等,它也可以轻易的与 Spring 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。

    11 引用 • 19 回帖 • 387 关注
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    44 引用 • 208 回帖 • 4 关注
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 384 回帖 • 10 关注
  • Pipe

    Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    133 引用 • 1124 回帖 • 115 关注
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    245 引用 • 1338 回帖