Spring Boot学习(五):集成ehcache,自定义存取

项目中需要使用到缓存,缓存一些机构登录信息。这是一个实现数据共享接口的项目,不大,经过比较使用了ehcache实现,权限登录验证使用的自定义方法,没有使用shiro等成熟框架。

1.项目环境

IDEA + maven + Spring Boot

2.代码实现

1)pom.xml文件引入必要依赖

<!--cache-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
    <groupId>net.sf.ehcache</groupId>
    <artifactId>ehcache</artifactId>
    <version>2.10.6</version>
</dependency>

2)新建ehcache.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
         updateCheck="false">
    <!--缓存路径,ehcache分为内存和磁盘两级,此属性定义磁盘的缓存位置。-->
    <diskStore path="java.io.tmpdir/Tmp_EhCache"/>

    <!--默认缓存-->
    <defaultCache
            eternal="false"
            maxElementsInMemory="1000"
            overflowToDisk="false"
            diskPersistent="false"
            timeToIdleSeconds="0"
            timeToLiveSeconds="100"
            memoryStoreEvictionPolicy="LRU"/>

    <!--自定义缓存,存储登录机构信息-->
    <cache
            name="oragnCache"
            eternal="false"
            maxElementsInMemory="100"
            overflowToDisk="false"
            diskPersistent="false"
            timeToIdleSeconds="0"
            timeToLiveSeconds="1800"
            memoryStoreEvictionPolicy="LRU"/>
</ehcache>

3)启动类中增加@EnableCaching注解,增加@Bean(EhCacheCacheManager)

@SpringBootApplication
@EnableConfigurationProperties
@Configuration
@EnableCaching //开启cache
@ComponentScan(basePackages = "com.xxfamly")
@MapperScan("com.xxfamly.dao") //扫描的是mapper.xml中namespace指向值的包位置
public class HidcApiApplication{

    public static void main(String[] args) {
        SpringApplication.run(HidcApiApplication.class, args);
    }

    @Bean
    public EhCacheCacheManager ehCacheCacheManager() {
        EhCacheCacheManager em = new EhCacheCacheManager();
        return em;
    }

}

4)新建cache服务类,供调用

/**
 * cache服务
 */
@Service
public class CacheService {

    @Autowired
    private EhCacheCacheManager ehCacheCacheManager;

    private Cache getCache(String name){
        //获取CacheManager类
        CacheManager cacheManager = ehCacheCacheManager.getCacheManager();
        //获取Cache
        Cache cache = cacheManager.getCache(name);

        return cache;
    }


    /**
     * 数据存入缓存
     * @param name
     * @param key
     * @param obj
     */
    public void setCacheValue(String name, String key, Object obj) {
        this.getCache(name).put(new Element(key, obj));
    }

    /**
     * 判断key是否存在
     * @param name
     * @param key
     * @return
     */
    public boolean isKeyInCache(String name, String key) {
        //获取Cache
        Cache cache = this.getCache(name);

        //ehcache惰性删除机制,缓存失效后key有可能依然存在
        if (cache.isKeyInCache(key)) {
            return cache.get(key) == null ? false : true;
        } else {
            return false;
        }
    }

    /**
     * 获取key对应的缓存数据
     * @param name
     * @param key
     * @return
     */
    public Object getCacheValue(String name, String key){
        return isKeyInCache(name,key) == true?this.getCache(name).get(key):null;
    }
}

5)使用cache服务

@Service
public class OragnAuthServiceImpl implements OragnAuthService {
    @Autowired
    private OragnBaseInfoMapper oragnBaseInfoMapper;

    @Autowired
    private CacheService cacheService;

    /**
     * 通过机构编号查询机构信息
     * @param organId
     * @return
     */
    @Override
    public OragnBaseInfo selectByOrganId(String organId) {
        return oragnBaseInfoMapper.selectByOrganId(organId);
    }

    /**
     * 登录操作
     * @param reqMap
     * @return
     */
    @Override
    public OragnBaseInfo login(Map<String, Object> reqMap) {
        //机构编码
        String organId = (String) reqMap.get("organId");
        //密码
        String password = (String) reqMap.get("password");

        OragnBaseInfo oragnBaseInfo = oragnBaseInfoMapper.selectByOrganId(organId);
        if (oragnBaseInfo != null && oragnBaseInfo.getPassword().equals(password)) {
            //cache存储
            cacheService.setCacheValue("oragnCache",organId,oragnBaseInfo);
        } else {
            oragnBaseInfo = null;
        }

        return oragnBaseInfo;

    }
    
    /**
     * 登录鉴权
     * @param reqMap
     * @return
     */
    @Override
    public boolean loginAuth(Map<String, Object> reqMap) {
        //机构编码
        String organId = (String) reqMap.get("organId");

        return cacheService.isKeyInCache("oragnCache",organId);
    }
}

3.注意事项

ehcache惰性删除机制,缓存失效后,key有可能依然存在,判断时需要特殊处理一下,先判断key是否存在,若存在再判断值是否为空。为空则缓存失效。之后再取key也是不存在了。具体代码参考上面的cache服务类

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值