shiro中CacheManager相关的类结构介绍,提供redis Cache实现

cacheManager主要用于对shiro中的session、realm中的认证信息、授权信息进行缓存。

1.类结构

shiro中CacheManager相关的类结构介绍,提供redis Cache实现

2.接口及类介绍

  • CacheManager

shiro中CacheManager相关的类结构介绍,提供redis Cache实现

提供根据名字获取cache的作用。

  • AbstractCacheManager

shiro中CacheManager相关的类结构介绍,提供redis Cache实现

本地提供并发map做缓存。提供抽象类给子类继承,子类只需要创建cache即可。

  • MemoryConstrainedCacheManager

shiro中CacheManager相关的类结构介绍,提供redis Cache实现

实现上面的抽象类。创建一个map作为缓存。

3.Cache相关介绍

  • Cache接口

shiro中CacheManager相关的类结构介绍,提供redis Cache实现

主要提供缓存相关的增删改查方法。

  • MapCache

shiro中CacheManager相关的类结构介绍,提供redis Cache实现

用map做缓存。通过构造器注入。

下面也提供我自己的redisCache实现。key是String类型的。需要自己提供spring redistemplate。

import lombok.Getter;
import lombok.Setter;
import org.apache.commons.collections.CollectionUtils;
import org.apache.shiro.cache.Cache;
import org.apache.shiro.cache.CacheException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations; import java.util.*;
import java.util.concurrent.TimeUnit; /**
* desc:
*
* @author:
* creat_date: 2018/3/22 0022
* creat_time: 9:53
**/
@Getter
@Setter
public class ShiroRedisCache<V> implements Cache<String, V> {
private Logger log = LoggerFactory.getLogger(getClass()); private RedisTemplate<String, V> redisTemplate;
/**
* 缓存的全局前缀
*/
private String globalPrefix = "shiro_cache:";
/**
* 真正的缓存前缀 = 全局前缀 + 缓存名
*/
private String prefix;
/**
* 过期时间
*/
private int expireTime; public ShiroRedisCache(RedisTemplate<String, V> redisTemplate, String prefix, int expireTime) {
this.redisTemplate = redisTemplate;
this.prefix = prefix;
this.expireTime = expireTime;
} @Override
public V get(String key) throws CacheException {
if (log.isDebugEnabled()) {
log.debug("Key: {}", key);
}
if (key == null) {
return null;
} return redisTemplate.opsForValue().get(key);
} @Override
public V put(String key, V value) throws CacheException {
if (log.isDebugEnabled()) {
log.debug("Key: {}, value: {}", key, value);
} if (key == null || value == null) {
return null;
} redisTemplate.opsForValue().set(key, value);
redisTemplate.expire(key, expireTime, TimeUnit.MINUTES);
return value;
} @Override
public V remove(String key) throws CacheException {
if (log.isDebugEnabled()) {
log.debug("Key: {}", key);
} if (key == null) {
return null;
} ValueOperations<String, V> vo = redisTemplate.opsForValue();
V value = vo.get(key);
redisTemplate.delete(key);
return value;
} @Override
public void clear() throws CacheException {
redisTemplate.delete(keys());
} @Override
public int size() {
int len = keys().size();
return len;
} @SuppressWarnings("unchecked")
@Override
public Set<String> keys() {
String key = prefix + "*";
Set<String> set = redisTemplate.keys(key);
if (CollectionUtils.isEmpty(set)) {
return Collections.emptySet();
} return set;
} @Override
public Collection<V> values() {
Set<String> keys = keys();
List<V> values = new ArrayList<>(keys.size());
for (String key : keys) {
values.add(redisTemplate.opsForValue().get(key));
}
return values;
} }
上一篇:SpringMVC---400错误The request sent by the client was syntactically incorrect ()


下一篇:快速掌握和使用Flyway