zoukankan      html  css  js  c++  java
  • 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);

    }

    }

  • 相关阅读:
    错误论:错误是人类实践结果的一种状态,是实践的一个中间环节
    逻辑思维
    正确与错误、真理与谬误
    正确的判断,来自于错误的判断
    PHP+MySQL实现对一段时间内每天数据统计优化操作实例
    centos linux ip地址无法连接数据库,ssh登录服务器时必须使用22端口
    如何更改linux文件目录拥有者及用户组
    navicat ssh通道受限问题处理
    Navicat for MySQL 使用SSH方式链接远程数据库(二)
    Navicat for MySQL 使用SSH方式链接远程数据库
  • 原文地址:https://www.cnblogs.com/zrbfree/p/6708813.html
Copyright © 2011-2022 走看看