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

Java基础

浏览数:119

2019-6-26

AD:资源代下载服务

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

1.类结构

2.接口及类介绍

  • CacheManager

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

  • AbstractCacheManager

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

  • MemoryConstrainedCacheManager

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

3.Cache相关介绍

  • Cache接口

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

  • MapCache

用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;
    }

}

 

作者:三国梦回