注:1、放入cache中,采用@Cacheable;使缓存失效@CacheEvict

2、自定义CacheManager只需要继承org.springframework.cache.support.AbstractCacheManager(该类中的map采用了ConcurrentHashMap,解决了并发等问题,可以自己去看原代码),

然后需要自己实现loadCaches方法,同时也可以实现getCaches方法(如下面代码)

3、@Cacheable和@CacheEvict中对应的value为为spring配置文件中配置对应,key为放入缓存中的key

key的常用写法:一、直接写死,这种方法比较适合固定唯一的key

如:@Cacheable(value="indexCache", key="'web_index_adv_top'")

二、动态,带参数(注意不支持Constants),下面列子中的#这些都是传入的参数,condition是条件(例子中是加入缓存的条件)

如:@Cacheable(value="indexCache", key="'web_index_goods_'+#columnId+'_' + #param.page +'_' + #param.size", condition="#param.page <=2")

public SearchResult<IndexGoodsBean> queryByParam(long columnId, PageParam param) {

4、注意@Cacheable是把方法的结果放入了缓存;@CacheEvict是将key从缓存中移除(注意这里移除的理解)

实现步骤:

一、自定义CacheManager

二、spring配置文件(CacheManager和caches,集成redis,cache可以多个;注意这里的caches对应于@Cacheable和@CacheEvict中对应的value)

三、CacheService(也可以采用service,我这里分成了好几个项目,有parent、support、core、web、admin,core中写的是共用dao和共用的service,所以我的结构是web中的service调用web中的cacheService,然后web中的cacheService调用core的service,缓存是在web中的cacheService中实现)

四、@Cacheable和@CacheEvict注解写完整

下面来看完整实现

一、自定义CacheManager(我这里提供缓存的是redis)

import java.util.Collection;

import org.springframework.cache.Cache;

import org.springframework.cache.support.AbstractCacheManager;

public class RedisCacheManager extends AbstractCacheManager {

private Collection<Cache> caches;

@Override

protected Collection<? extends Cache> loadCaches() {

return this.caches;

}

public Collection<Cache> getCaches() {

return caches;

}

public void setCaches(Collection<Cache> caches) {

this.caches = caches;

}

}

二、spring配置文件(配置cacheManager,caches,集成redis)

<cache:annotation-driven />

<!--这里的class就是上面定义的cacheManager-->

<bean id="cacheManager" class="com.xxx.core.aop.RedisCacheManager">

<property name="caches">

<set>

<ref bean="indexCache"/>

</set>

</property>

</bean>

<bean id="indexCache" class="com.xxx.core.aop.RedisCache">

<property name="name" value="indexCache" />

<!--注入org.springframework.data.redis.core.StringRedisTemplate,这种写法很奇怪吧,你可以手动把这个类配置进也可以-->

<property name="stringRedisTemplate" ref="stringRedisTemplate" />

<property name="expireTime" value="300" />

</bean>

三、

import org.springframework.cache.annotation.Cacheable;

@Service

public class IndexAdvWebCacheServiceImpl implements IndexAdvWebCacheService{

@Autowired

private AdvColumnService advColumnService;

@Autowired

private AdvService advService;

/**顶部广告位*/

public AdvColumnBean getAdvColumnTop() {

return advColumnService.getByPosition(AdvColumnBean.POSTION_TOP_VALUE);

}

/**

* 头部广告位

* 广告位中的广告

*/

public List<AdvBean> advInpire(long columnId) {

List<AdvBean> list = CopyUtil.copyList(advService.getByColumnIdInpire(columnId), AdvBean.class);

Collections.sort(list, new AdvComparator());

return list;

}

private static class AdvComparator implements Comparator<AdvBean> {

@Override

public int compare(AdvBean arg0, AdvBean arg1) {

if(null == arg0 || null == arg1){

return 0;

}

if(arg0.getSortIndex() > arg1.getSortIndex()){

return 1;

}

if(arg0.getSortIndex() < arg1.getSortIndex()){

return -1;

}

return 0;

}

}

//我这里的key是可以固定的,如果不是固定的可以使用@Cacheable的语法来使用

@Override

@Cacheable(value="indexCache", key="'web_index_adv_top'")

public List<AdvBean> advTop() {

if(getAdvColumnTop() != null) {

return advInpire(getAdvColumnTop().getId());

}

return new ArrayList<AdvBean>();

}

}

//使缓存失效@CacheEvict

import org.springframework.cache.annotation.CacheEvict;

@Service

public class AdvAdminCacheServiceImpl implements AdvAdminCacheService{

@Autowired

private AdvService advService;

@Override

@CacheEvict(value="indexCache", key="'web_index_adv_top'")

public boolean updateOne(AdvBean bean) {

return advService.updateOne(bean);

}

@Override

@CacheEvict(value="indexCache", key="'web_index_adv_top'")

public long save(AdvBean bean) {

return advService.save(bean);

}

@Override

@CacheEvict(value="indexCache", key="'web_index_adv_top'")

public boolean deleteByIds(long[] ids) {

return advService.deleteByIds(ids);

}

}

170316、spring4:@Cacheable和@CacheEvict实现缓存及集成redis的更多相关文章

  1. Spring缓存注解@Cacheable、@CacheEvict、@CachePut使用(转)

    原文地址:https://www.cnblogs.com/fashflying/p/6908028.html 从3.1开始,Spring引入了对Cache的支持.其使用方法和原理都类似于Spring对 ...

  2. Spring缓存注解@Cacheable、@CacheEvict、@CachePut使用

    从3.1开始,Spring引入了对Cache的支持.其使用方法和原理都类似于Spring对事务管理的支持.Spring Cache是作用在方法上的,其核心思想是这样的:当我们在调用一个缓存方法时会把该 ...

  3. 缓存注解@Cacheable、@CacheEvict、@CachePut使用及注解失效时间

    从3.1开始,Spring引入了对Cache的支持.其使用方法和原理都类似于Spring对事务管理的支持.Spring Cache是作用在方法上的,其核心思想是这样的:当我们在调用一个缓存方法时会把该 ...

  4. Spring Boot缓存注解@Cacheable、@CacheEvict、@CachePut使用

    从3.1开始,Spring引入了对Cache的支持.其使用方法和原理都类似于Spring对事务管理的支持.Spring Cache是作用在方法上的,其核心思想是这样的:当我们在调用一个缓存方法时会把该 ...

  5. Spring4.1新特性——Spring缓存框架增强(转)

    目录 Spring4.1新特性——综述 Spring4.1新特性——Spring核心部分及其他 Spring4.1新特性——Spring缓存框架增强 Spring4.1新特性——异步调用和事件机制的异 ...

  6. 8 -- 深入使用Spring -- 5...3 使用@CacheEvict清除缓存

    8.5.3 使用@CacheEvict清除缓存 被@CacheEvict注解修饰的方法可用于清除缓存,使用@CacheEvict注解时可指定如下属性: ⊙ value : 必须属性.用于指定该方法用于 ...

  7. SpringBoot集成Redis分布式锁以及Redis缓存

    https://blog.csdn.net/qq_26525215/article/details/79182687 集成Redis 首先在pom.xml中加入需要的redis依赖和缓存依赖 < ...

  8. SpringBoot集成Redis来实现缓存技术方案

    概述 在我们的日常项目开发过程中缓存是无处不在的,因为它可以极大的提高系统的访问速度,关于缓存的框架也种类繁多,今天主要介绍的是使用现在非常流行的NoSQL数据库(Redis)来实现我们的缓存需求. ...

  9. (35)Spring Boot集成Redis实现缓存机制【从零开始学Spring Boot】

    [本文章是否对你有用以及是否有好的建议,请留言] 本文章牵涉到的技术点比较多:Spring Data JPA.Redis.Spring MVC,Spirng Cache,所以在看这篇文章的时候,需要对 ...

随机推荐

  1. [svc]linux buffer和cache的区别

    通俗理解buffer,cache Cache:缓存区,是高速缓存,是位于CPU和主内存之间的容量较小但速度很快的存储器,因为CPU的速度远远高于主内存的速度,CPU从内存中读取数据需等待很长的时间,而 ...

  2. [POJ 1236][IOI 1996]Network of Schools

    Description A number of schools are connected to a computer network. Agreements have been developed ...

  3. IOS7 隐藏状态栏 (电池栏)

    电池状态栏. //方法一(代码设置): 现在ios7已经更改为透明,并且不占用屏幕高度.其中隐藏及显示的方法如下: 在uiviewcontroller的子类下,调用:     if ([self re ...

  4. weblogic管理服务器密码相关

    安全控制weblogic,我们可以为weblogic Administrator服务器设置密码 1.administrator服务器或受管服务器启动时,需要认证,方法有三种: (1)command启动 ...

  5. 结构体内重载小于号< 及构造函数

    struct Node { int d, e; bool operator < (const Node x) const { return x.d < d; } Node(int d, i ...

  6. a标签去掉下划线

    转载自:http://jingyan.baidu.com/article/a17d52853095838099c8f24e.html <a>是默认有下划线的.所以有时候为了美观,我们需要去 ...

  7. 时钟.html

    <!DOCTYPE html><html charset="utf-8"> <head> <title>时钟</title&g ...

  8. could not find com.android.support.appcompat-v7:23.4.0

    导入别人的工程到AS中,出现错误,是由于android studio的版本比所加载的工程所使用的版本低,有些包不是最新的. 我的android studio这个包的版本是 v7:23.1.1 所以需要 ...

  9. No mysqld or mysql.server after mariadb-server install

    To start MariaDB on Fedora 20, execute the following command: systemctl start mariadb.service To aut ...

  10. json 转 T

    T test = JsonConvert.DeserializeObject<T>(json);(json.net)