Redis实现自定义Shiro的缓存管理器
Shiro缓存可以用来临时缓存授权信息,这样就可以不用每次都去查数据库,在一定程度上提高了使用效率。
依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>2.5.3</version> </dependency>
自定义Shiro的缓存管理器
import org.apache.shiro.cache.Cache; import org.apache.shiro.cache.CacheException; import org.apache.shiro.cache.CacheManager; import org.springframework.data.redis.core.RedisTemplate; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; public class ShiroRedisCacheManager implements CacheManager { private final ConcurrentMap<String, Cache> caches = new ConcurrentHashMap<>(); //TODO:缓存存活时间 private long cacheLive; //TODO:缓存名称前缀 private String cacheKeyPrefix; private RedisTemplate redisTemplate; public ShiroRedisCacheManager() { } public ShiroRedisCacheManager(long cacheLive, String cacheKeyPrefix, RedisTemplate redisTemplate) { this.cacheLive = cacheLive; this.cacheKeyPrefix = cacheKeyPrefix; this.redisTemplate = redisTemplate; } @Override public <K, V> Cache<K, V> getCache(String name) throws CacheException { Cache cache = this.caches.get(name); if (null == cache) { //TODO:自定义Shiro的Cache cache = new ShiroRedisCache<K, V>(cacheLive, cacheKeyPrefix, redisTemplate); this.caches.put(name, cache); } return cache; } public long getCacheLive() { return cacheLive; } public void setCacheLive(long cacheLive) { this.cacheLive = cacheLive; } public String getCacheKeyPrefix() { return cacheKeyPrefix; } public void setCacheKeyPrefix(String cacheKeyPrefix) { this.cacheKeyPrefix = cacheKeyPrefix; } public RedisTemplate getRedisTemplate() { return redisTemplate; } public void setRedisTemplate(RedisTemplate redisTemplate) { this.redisTemplate = redisTemplate; } }
自定义配置
@Resource(name = "shiroRedisTemplate") private RedisTemplate redisTemplate; /** * 全局缓存时间,单位为秒 */ @Value("${hdw.jwt.expiration}") private int cacheLive; /** * 全局缓存名称前缀,默认为应用名 */ @Value("${spring.application.name}") private String cacheKeyPrefix; /** * 缓存管理器 * * @return */ @Bean public CacheManager shiroRedisCacheManager() { ShiroRedisCacheManager redisCacheManager = new ShiroRedisCacheManager(cacheLive * 1000, cacheKeyPrefix + ":shiro-cache:", redisTemplate); return redisCacheManager; }
下一篇:
maven打包时过滤文件及排除依赖包