Shiro

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

2018-09-03  本文已影响41人  Hiwayz

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;
    }
上一篇下一篇

猜你喜欢

热点阅读