项目中需要使用到缓存,缓存一些机构登录信息。这是一个实现数据共享接口的项目,不大,经过比较使用了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服务类