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

spring自定义cache

    博客分类:
  • java
阅读更多

下面是一个较为详细的spring缓存的介绍

http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/

 

Cacheable注解,是spring支持的一个注解,用法就不多说了,但是发现了一个奇怪的用法,Cacheable的value属性官方定义为缓存的名字,但是在这里却被当成了缓存的失效时长。

    /**
     * http请求获取城市列表
     */
    @Override
    @Cacheable(value = "86400", key = "'***_city_list'")
    public CityListModel getCities() {
        String cities;
    ......
    }

 

 

 

这就需要研究下自定义spring缓存的步骤

1.自定义CacheManager

2.自定义Cache

其中CacheManager.getCache方法的入参的含义是缓存的名字,就是Cacheable注解的value值,接下来思路就清晰了,通过获取getCache(String name)的name(实际上是超时时间)对缓存的操作,就实现了上面的功能。

 

package org.springframework.cache;
public interface CacheManager {
	/**
	 * Return the cache associated with the given name.
	 * @param name the cache identifier (must not be {@code null})
	 * @return the associated cache, or {@code null} if none found
	 */
	Cache getCache(String name);

	/**
	 * Return a collection of the cache names known by this manager.
	 * @return the names of all caches known by the cache manager
	 */
	Collection<String> getCacheNames();
}

 

 

package org.springframework.cache;
public interface Cache {...}

 

 

 

下面是CacheManager的实现类,根据一个ConcurrentMap(key超时时间,value对应相应的缓存),MedisConcurrentCache封装了缓存的超时操作,用一种很巧妙的方式给Cacheable增加了超时的功能。

 

public class MedisConcurrentCacheManager extends AbstractConcurrentCacheManager implements InitializingBean {
    private static final Logger LOGGER = LoggerFactory.getLogger(MedisConcurrentCacheManager.class);

    private MedisConcurrentCache cache;
    private String nameSpace;
    private IMedis meids;
    private ConcurrentMap<Integer, MedisConcurrentCache> cachedCaches = Maps.newConcurrentMap();

    public void setCache(MedisConcurrentCache cache) {
        this.cache = cache;
    }

    @Override
    public Cache getCache(String expire) {
        try {
            if (StringUtils.isBlank(expire)) {
                return cache;
            }
            for (char c : expire.toCharArray()) {
                if (!Character.isDigit(c)) {
                    return cache;
                }
            }
            int expireInt = Integer.valueOf(expire);
            MedisConcurrentCache cache = cachedCaches.get(expireInt);
            if (null == cache) {
                cache = new MedisConcurrentCache();
                cache.setExpireTime(expireInt);
                cache.setMedis(meids);
                cache.setNameSpace(nameSpace);
                cachedCaches.putIfAbsent(expireInt, cache);
                cache = cachedCaches.get(expireInt);
            }
            return cache;
        } catch (Exception e) {
            LOGGER.error(e.getMessage(), e);
        }
        return cache;
    }
。。。。。。
}

 

 

 

下面是spring的配置

 

<bean id="cacheManager"
      class="com.meituan.service.mobile.movie.cache.impl.MedisConcurrentCacheManager">
    <property name="cache" ref="cache"/>
</bean>

<cache:annotation-driven cache-manager="cacheManager" proxy-target-class="true"/>

<import resource="classpath:rediscloud-auth-test.xml"/>

<bean id="cache"
      class="com.meituan.service.mobile.movie.cache.impl.MedisConcurrentCache">
    <property name="medis" ref="medis"/>
    <property name="nameSpace" value="apollosupplier:"/>
</bean>

<bean id="medis"
      class="com.meituan.cache.redisCluster.client.MedisBean">
    <property name="authDao" ref="zkAuthDao"/>
    <property name="poolId" value="mobile-apollo-item-cache01"/>
    <property name="authKey" value="gE9rVsIOG2Rh5y2dcAOW"/>
</bean>

 

分享到:
评论

相关推荐

    Spring security 自定义密码加密方式的使用范例。

    Spring Security 是一个强大的Java安全框架,...通过这个项目,你可以深入理解Spring Security的工作原理,并学习如何自定义其核心组件。如果你对码云不熟悉,也可以选择其他版本控制系统,如Git,进行代码托管和协作。

    spring mvc 和spring security自定义登录

    本文将深入探讨如何结合Spring MVC和Spring Security来实现自定义登录功能。 首先,Spring MVC是Spring框架的一部分,它为构建基于HTTP的Web应用程序提供了模型-视图-控制器架构。通过使用Spring MVC,开发者可以...

    spring aop 自定义切面示例

    在Spring AOP(面向切面编程)中,自定义切面是实现业务逻辑解耦、增强代码可维护性的重要手段。AspectJ是一个强大的面向切面的编程库,它提供了与Spring AOP集成的能力,使我们可以编写更为灵活和模块化的代码。...

    spring aop 自定义注解保存操作日志到mysql数据库 源码

    3、对spring aop认识模糊的,不清楚如何实现Java 自定义注解的 4、想看spring aop 注解实现记录系统日志并入库等 二、能学到什么 1、收获可用源码 2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑...

    Spring 自定义注解的解析

    在Spring框架中,自定义注解的解析是一个强大的特性,允许开发者根据业务需求创建特定的注解,并在Spring容器启动时自动处理这些注解。本文将深入探讨如何在Spring环境中通过`component-scan`配置来处理自定义Java...

    spring自定义标签例子

    在Spring框架中,自定义标签是一项非常实用的功能,它允许我们创建符合XML语法的自定义元素,以便在配置文件中更方便地表达业务逻辑。在"spring自定义标签例子"这个项目中,我们可以深入理解这一特性,特别是通过...

    spring中自定义注解(annotation)与AOP中获取注解

    在Spring框架中,自定义注解(Annotation)和AOP(面向切面编程)的结合使用,极大地增强了代码的可读性和可维护性。本文将深入探讨如何在Spring中创建自定义注解以及如何在AOP中有效地获取并利用这些注解。 首先,...

    [课堂课件讲解]Java微服务实践-Spring Boot 自定义启动器.pptx

    Java微服务实践-Spring Boot自定义启动器 Java微服务实践是当前流行的软件架构风格,旨在将应用程序拆分成多个小型的、独立的服务,以提高系统的可扩展性、灵活性和可维护性。Spring Boot是当前最流行的Java微服务...

    spring 自定义属性编辑器

    在Spring框架中,属性编辑器(PropertyEditor)是一种强大的工具,允许我们自定义类型转换过程。当我们需要将字符串形式的数据转换为Java对象时,属性编辑器就发挥了关键作用。例如,从请求参数或配置文件中读取的...

    Spring Boot自定义错误页面

    为了提供更友好的用户体验,Spring Boot允许我们自定义这些错误页面,而不是显示默认的Spring Boot错误页面。这篇博文的资源包含了三个自定义错误页面文件:404.html、500.html和401.html,分别对应HTTP状态码404、...

    spring-security实现自定义登录认证.rar

    本资源“spring-security实现自定义登录认证.rar”包含了一个使用Spring Security进行登录认证的示例,以及JWT(JSON Web Tokens)与Spring Security集成的代码。 首先,让我们了解Spring Security的基本工作原理。...

    springsecurity2 自定义filter实现

    在Spring Security框架中,自定义过滤器是实现特定安全需求的一种常见方式。Spring Security的核心功能是通过一系列的Filter链来处理HTTP请求,这些Filter包括认证、授权等关键操作。本篇我们将深入探讨如何在Spring...

    Spring中自定义session管理,SpringSession的使用

    本文将详细介绍如何在Spring项目中自定义Session管理以及如何使用SpringSession。 一、SpringSession简介 SpringSession是一个开源项目,它扩展了Spring MVC和Spring WebFlux,以支持基于Redis、MongoDB、Hazelcast...

    利用Spring Context上下文创建自定义对象

    本篇文章将深入探讨如何利用Spring Context上下文来创建自定义对象,并理解控制反转的原理。 首先,让我们了解什么是Spring Context。Spring Context是Spring框架的应用上下文,它充当了全局容器,存储了应用的所有...

    Spring Boot 自定义starter启动器(demo).zip

    Spring Boot 自定义starter启动器 Demo 部分,用于记录使用。该demo 配套教程 https://blog.csdn.net/lzb348110175/article/details/105330274。

    Spring Boot自定义异常内容展示代码.zip

    Spring Boot自定义异常内容代码,用来自定义异常展示信息,添加需要展示的信息等,并满足自适应显示。浏览器访问出现异常返回 Hmtl页面,客户端访问出现异常返回 Json 数据。该 Demo 仅用作备份

    spring security 4 小例子带自定义过滤器

    在Spring Security 4中,我们可以通过自定义过滤器来扩展其功能,以满足特定的安全需求。在这个小例子中,我们将探讨如何创建并集成自定义过滤器,以及它在Spring Security中的工作原理。 首先,我们需要理解Spring...

    spring aop 自定义缓存实现

    在Spring AOP(面向切面编程)中,自定义缓存是一种常见的优化技术,它可以显著提高应用程序的性能,减少对数据库或远程服务的重复访问。本实例将介绍如何利用Spring AOP来实现自定义缓存功能。 首先,理解Spring ...

    spring security自定义数据库小项目

    **Spring Security 自定义数据库小项目概述** Spring Security 是一个强大且高度可定制的身份验证和访问控制框架,用于保护 Java 应用程序。本项目旨在演示如何利用 Spring Security 的灵活性,将权限管理与数据库...

Global site tag (gtag.js) - Google Analytics