spring boot 配置ehcache缓存

使用场景

  • 为shiro认证与授权时高频的sql查询配置上缓存
  • shiro有缓存管理器的配置入口,因为做了一些调整,所以要手动配置.

引入

        
            org.springframework.boot
            spring-boot-starter-cache
        

        
            net.sf.ehcache
            ehcache
            2.10.6
        

使用

  • 总体上分三步
    1.添加ehcache.xml文件并配置
    2.添加EhCacheConfig类
    3.通过注解使用
- ehcache.xml文件


         
    

    

    
    
    



    

  • 文件应该放到项目resources目录下,如果调整了位置或者文件名称,需要在配置文件中指定.
  • 可以根据需要增加cache 标签,一个cache 标签可以理解为一个Map.缓存储存时需要指定cache 的名称

EhCacheConfig 类

import net.sf.ehcache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.ehcache.EhCacheCacheManager;
import org.springframework.cache.ehcache.EhCacheManagerFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;

/**
 * ehcache配置
 */
@Configuration
@EnableCaching
public class EhCacheConfig {

    /**
     * EhCache的配置
     */
    @Bean
    public EhCacheCacheManager cacheManager(CacheManager cacheManager) {
        return new EhCacheCacheManager(cacheManager);
    }

    /**
     * EhCache的配置
     */
    @Bean
    public EhCacheManagerFactoryBean ehcache() {
        EhCacheManagerFactoryBean ehCacheManagerFactoryBean = new EhCacheManagerFactoryBean();
        ehCacheManagerFactoryBean.setConfigLocation(new ClassPathResource("ehcache.xml"));
        return ehCacheManagerFactoryBean;
    }
}

  • 主要做的就是创建实例和注入Bean

  • 使用注解前创建几个常量类.非必须
/**
 * 所有缓存名称的集合
 *
 */
public interface CacheName {
    /**
     * 用于进行shiro认证和授权的缓存 应与xml文件一致
     */
    String SHIRO_CACHE = "shiro_cache";
}

/**
 * 缓存标识前缀 

 */
public interface CacheKey {

    /**
     * 用于通过userid获取角色的id和名称集合
     */
    String ROLES_BY_USERID_ = "roles_by_userid_";

    /**
     * 获取用于认证的用户信息
     */
    String USER_AUTH_ = "user_auth_";

}


  • ehcahe的注解 见https://www.cnblogs.com/fashflying/p/6908028.html

  • 在通过账号获取用户的方法加上注解,该方法是进行认证时执行的查询方法

    @Cacheable(value = CacheName.SHIRO_CACHE ,key = "'" + CacheKey.USER_AUTH_ + "'+#account")
    @Override
    public BaseUser getByAccount(String account){
        return userDao.getByAccount(account);
    }
  • 在通过用户id获取用户角色信息的接口增加注解.
    @Cacheable(value = CacheName.SHIRO_CACHE ,key = "'" + CacheKey.ROLES_BY_USERID_ + "'+#userId")
    List> getRoleIdAndNameByUserId(Long userId);

  • 缓存的删除
  • 缓存的删除一般通过@CacheEvict实现,用于场景的限制,使用了手动删除的方式.
  • 场景:在用户信息变更时,移除认证查询时的缓存,在用户角色信息变更时,移除授权查询的缓存.
    @Autowired
    EhCacheCacheManager ehCacheCacheManager;

   public Long addOrEdit(BaseUser model, RequestPara  para){
        BaseUser user_temp= getByAccount(model.getAccount());
        //如果user_temp不为空,但id一样,说明是进行不改名字的编辑,不视为用户名存在
        Assert.isTrue(user_temp==null||user_temp.getId().equals(model.getId()),"该账号已存在");
        Long id=null;
        if(ModelUtil.isNew(model)){
            if(!StringUtils.hasText(model.getName())){
                model.setName(model.getAccount());
            }
            super.save(model);
        }
        id= model.getId();
        Assert.isTrue(id!=null,"添加用户失败");

        //修改密码
        String is_update_password=WebUtils.get("is_update_password");
        if(YesOrNotEnum.Y.getCodeTest().equals(is_update_password)){
            //密码md5加密后,加盐加密
            String md5Password= null;
            try {
                md5Password = Md5Salt.sec(String.valueOf(id),model.getPassword());
            } catch (Exception e) {
                throw new ServiceException(MsgEnum.ENCRYPT_ERROR);
            }
            model.setPassword(md5Password);
        }

        super.updateById(model);

        //删除shiro_cache内的 用户信息缓存
        CacheManager cacheManager = ehCacheCacheManager.getCacheManager();
        Cache cache = cacheManager.getCache(CacheName.SHIRO_CACHE);
        cache.remove(CacheKey.USER_AUTH_+model.getAccount());


        //设置用户的角色
        String[] role_ids=para.getArray("role_ids");

        if(role_ids!=null){
            Long[] role_ids_int= (Long[]) ConvertUtils.convert(role_ids, Long.class);
            saveRoleInfo(id,role_ids_int);
            //移除角色信息缓存
            cache.remove(CacheKey.ROLES_BY_USERID_+id);
        }

        return model.getId();
    }

你可能感兴趣的:(spring boot 配置ehcache缓存)