170316、spring4:@Cacheable和@CacheEvict实现缓存及集成redis
注: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的更多相关文章
- Spring缓存注解@Cacheable、@CacheEvict、@CachePut使用(转)
原文地址:https://www.cnblogs.com/fashflying/p/6908028.html 从3.1开始,Spring引入了对Cache的支持.其使用方法和原理都类似于Spring对 ...
- Spring缓存注解@Cacheable、@CacheEvict、@CachePut使用
从3.1开始,Spring引入了对Cache的支持.其使用方法和原理都类似于Spring对事务管理的支持.Spring Cache是作用在方法上的,其核心思想是这样的:当我们在调用一个缓存方法时会把该 ...
- 缓存注解@Cacheable、@CacheEvict、@CachePut使用及注解失效时间
从3.1开始,Spring引入了对Cache的支持.其使用方法和原理都类似于Spring对事务管理的支持.Spring Cache是作用在方法上的,其核心思想是这样的:当我们在调用一个缓存方法时会把该 ...
- Spring Boot缓存注解@Cacheable、@CacheEvict、@CachePut使用
从3.1开始,Spring引入了对Cache的支持.其使用方法和原理都类似于Spring对事务管理的支持.Spring Cache是作用在方法上的,其核心思想是这样的:当我们在调用一个缓存方法时会把该 ...
- Spring4.1新特性——Spring缓存框架增强(转)
目录 Spring4.1新特性——综述 Spring4.1新特性——Spring核心部分及其他 Spring4.1新特性——Spring缓存框架增强 Spring4.1新特性——异步调用和事件机制的异 ...
- 8 -- 深入使用Spring -- 5...3 使用@CacheEvict清除缓存
8.5.3 使用@CacheEvict清除缓存 被@CacheEvict注解修饰的方法可用于清除缓存,使用@CacheEvict注解时可指定如下属性: ⊙ value : 必须属性.用于指定该方法用于 ...
- SpringBoot集成Redis分布式锁以及Redis缓存
https://blog.csdn.net/qq_26525215/article/details/79182687 集成Redis 首先在pom.xml中加入需要的redis依赖和缓存依赖 < ...
- SpringBoot集成Redis来实现缓存技术方案
概述 在我们的日常项目开发过程中缓存是无处不在的,因为它可以极大的提高系统的访问速度,关于缓存的框架也种类繁多,今天主要介绍的是使用现在非常流行的NoSQL数据库(Redis)来实现我们的缓存需求. ...
- (35)Spring Boot集成Redis实现缓存机制【从零开始学Spring Boot】
[本文章是否对你有用以及是否有好的建议,请留言] 本文章牵涉到的技术点比较多:Spring Data JPA.Redis.Spring MVC,Spirng Cache,所以在看这篇文章的时候,需要对 ...
随机推荐
- Objective-C中的基本数据类型
// // main.m // 01.基本数据类型 // // Created by zhangqs008 on 14-2-13. // Copyright (c) 2014年 zhangqs008. ...
- mysql误删root用户或者忘记root密码解决方法
解决方法一: 到其他安装了Mysql的服务器(前提是要知道该服务器上Mysql的root用户密 码),打开[Mysql的安装目录/var/mysql],将其中的user.frm.user.MYD.us ...
- atitit.激活一个窗口总结 swing java .net php
atitit.激活一个窗口总结 1 激活窗口:鼠标激活vswindows消息激活 1.1 Web框架激活 2 退出激活窗口热键(dbg模式) 3 俩个窗口激活优先级 ...
- atitit.提升研发管理的利器---重型框架 框架 类库的区别
atitit.提升研发管理的利器---重型框架 框架 类库的区别 1. 重型框架就是it界的重武器. 1 2. 框架 VS. 库 可视化图形化 1 3. 应用框架 1 4. 类库 2 5. 框架是不可 ...
- 24 WHEN CAN WE STOP TESTING?
24 WHEN CAN WE STOP TESTING? 2015-09-25 THERE IS NO simple way of deciding when a system is complete ...
- (转载) STL中map用法详解
Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候 ...
- 本地vagrant配置虚拟域名的坑
修改 /usr/local/php56/etc/php.d/Zend.ini 文件 将developer.zl的路径加上去 修改nginx 的vhost里面的xx.com.conf 和上一级目录的 ...
- hdu6143 Killer Names 容斥+排列组合
/** 题目:hdu6143 Killer Names 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6143 题意:有m种字符(可以不用完),组成两个长度 ...
- EMC、Pure和NetApp推新品,NAS闪存场景在哪里
Hardy 架构师技术联盟 All Flash/SSD存储的趋势势不可挡,未来在NAS服务上也是如此,眼下已经有非常多家初创厂商支持全SSD的NAS存储服务,包含EMC Isilion也推出了全闪存节 ...
- ]flexslider 中文文档 使用教程 参数手册
[原创]flexslider 中文文档 使用教程 参数手册 要改前人用的flexslider功能,但苦于找不到详细的文档教程,折磨了好久……(所以我才说不爱乱用插件) 为了福利下之后也苦于这个问题 ...