美文网首页Shiro
SpringBoot+Shiro学习(六):Cache缓存管理

SpringBoot+Shiro学习(六):Cache缓存管理

作者: Hiwayz | 来源:发表于2018-09-03 15:18 被阅读41次

    Shiro中的缓存主要用于两种:realm数据和session数据。其中session的缓存在上一节已经讲过了,这节就不再赘述。
    Shiro提供了类似于Spring的Cache抽象,即Shiro本身不实现Cache,但是对Cache进行了又抽象,方便更换不同的底层Cache实现,例如ehcache,redis等。

    Cache接口

    Shiro提供的Cache接口:

    public interface Cache<K, V> {  
        //根据Key获取缓存中的值  
        public V get(K key) throws CacheException;  
        //往缓存中放入key-value,返回缓存中之前的值  
        public V put(K key, V value) throws CacheException;   
        //移除缓存中key对应的值,返回该值  
        public V remove(K key) throws CacheException;  
        //清空整个缓存  
        public void clear() throws CacheException;  
        //返回缓存大小  
        public int size();  
        //获取缓存中所有的key  
        public Set<K> keys();  
        //获取缓存中所有的value  
        public Collection<V> values();  
    }  
    

    我们在使用的时候需要实现它,例如我们使用redis作为我们的shiro缓存:

    @Component
    public class RedisCache<K,V> implements Cache<K,V> {
    
        @Resource
        RedisUtil redisUtil;
    
        private final String CACHE_PREFIX = "redis-cache";
    
        private byte[] getKey(K k){
         if(k instanceof String){
             return (CACHE_PREFIX+k).getBytes();
         }
         return SerializationUtils.serialize(k);
        }
    
        @Override
        public V get(K key) throws CacheException {
            System.out.println("从redis中取数据");
            byte[] value = redisUtil.get(getKey(key));
            if(value != null){
                return (V)SerializationUtils.deserialize(value);
            }
            return null;
        }
    
        @Override
        public V put(K k, V v) throws CacheException {
            byte[] key = getKey(k);
            byte[] value = SerializationUtils.serialize(v);
            redisUtil.set(key,value);
            redisUtil.expire(key,600);
            return v;
        }
    
        @Override
        public V remove(K k) throws CacheException {
            byte[] key =  getKey(k);
            byte[] value = redisUtil.get(key);
            redisUtil.del(key);
            if(value != null ){
                return (V)SerializationUtils.deserialize(value);
            }
            return null;
        }
    
        @Override
        public void clear() throws CacheException {
    
        }
    
        @Override
        public int size() {
            return 0;
        }
    
        @Override
        public Set<K> keys() {
            return null;
        }
    
        @Override
        public Collection<V> values() {
            return null;
        }
    

    CacheManager接口

    cacheManager接口用来注入securityManager中,提供cache的获取

    public interface CacheManager {  
        //根据缓存名字获取一个Cache  
        public <K, V> Cache<K, V> getCache(String name) throws CacheException;  
    }  
    

    我们可以实现这个接口,然后再securityManager中注入,实现自定义的缓存处理。

    public class RedisCacheManager implements CacheManager {
    
        @Resource
        private RedisCache redisCache;
    
        @Override
        public <K, V> Cache<K, V> getCache(String name) throws CacheException {
            return  redisCache;
        }
    }
    
        @Bean
        public SecurityManager securityManager(){
            DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
            manager.setCacheManager(redisCacheManager());
            return manager;
        }
    
        @Bean
        public RedisCacheManager redisCacheManager(){
            RedisCacheManager cacheManager = new RedisCacheManager();
            return  cacheManager;
        }
    

    相关文章

      网友评论

        本文标题:SpringBoot+Shiro学习(六):Cache缓存管理

        本文链接:https://www.haomeiwen.com/subject/rbhbwftx.html