Redis实现自定义Shiro的缓存管理器
时间:2023-09-04 06:07:00
Shiro临时缓存授权信息可用于缓存,不需要每次查看数据库,在一定程度上提高了使用效率。
依赖
org.springframework.boot spring-boot-starter-data-redis 2.5.3
自定义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 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 Cache getCache(String name) throws CacheException { Cache cache = this.caches.get(name); if (null == cache) { //TODO:自定义Shiro的Cache cache = new ShiroRedisCache(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; }