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

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

}

原文地址:https://www.cnblogs.com/grey-wolf/p/8630676.html

时间: 2024-08-08 11:35:53

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

从零到实现Shiro中Authorization和Authentication的缓存

本文大纲 一.简介 二.缓存的概念 三.自定义实现缓存机制 四.什么是Ehcache 五.Ehcache怎么用 六.Spring对缓存的支持 七.Spring+Ehcache实现 八.Spring+Shiro+Ehcache实现 九.总结 一.简介 在项目中,用到Shiro来做验证授权的控制.但在实际使用的时候,发现用户每访问一个功能,都会重新到UserRealm中获取一次权限.这样子会花费大量的系统系统.此时就想到了使用缓存,查了一下,Shiro也确实支持Authorization和Authe

C语言中随机数相关问题

用C语言产生随机数重要用到rand函数.srand函数.及宏RAND_MAX(32767),它们均在stdlib.h中进行了声明. int rand(void);//生成一个随机数 voidsrand(unsigned int seed); //为rand设置"种子"的值 srand()就是给rand()提供种子seed,如果srand每次输入的数值是一样的,那么每次运行产生的随机数也是一样的.通常的做法是以这样一句代码: srand((unsigned)time(NULL)); 来取

Linux内核中的jiffies及其作用介绍及jiffies等相关函数详解

在LINUX的时钟中断中涉及至二个全局变量一个是xtime,它是timeval数据结构变量,另一个则是jiffies,首先看timeval结构struct timeval{time_t tv_sec; /***second***/susecond_t tv_usec;/***microsecond***/}到底microsecond是毫秒还是微秒?? 1秒=1000毫秒(3个零),1秒=1000 000微秒(6个零),1秒=1000 000 000纳秒(9个零),1秒=1000 000 000

Android 中常见控件的介绍和使用

1 TextView文本框 1.1 TextView类的结构 TextView 是用于显示字符串的组件,对于用户来说就是屏幕中一块用于显示文本的区域.TextView类的层次关系如下: java.lang.Object   ? android.view.View   ? android.widget.TextView 直接子类: Button, CheckedTextView, Chronometer, DigitalClock, EditText 间接子类: AutoCompleteTextV

SD/MMC相关寄存器的介绍

熟悉SD/MMC的相关寄存器对协议的理解有一定的辅助作用,所以这篇文章来介绍一下SD/MMC相关的寄存器有哪些呢? 1.SD卡内部架构 在熟悉SD/MMC相关寄存器之前,我们先来看看SD卡的内部架构是怎么样的,如下图所示: 2.SD/MMC相关寄存器的介绍 从上图中总结出:SD卡内部有7个寄存器. 一.OCR,CID,CSD和SCR寄存器保存卡的配置信息; 二.RCA寄存器保存着通信过程中卡当前暂时分配的地址(只适合SD模式); 三.CSR寄存器卡状态(Card Status)和SSR寄存器SD

iOS中多线程原理与runloop介绍

http://mobile.51cto.com/iphone-403490.htm iOS中多线程原理与runloop介绍 iPhone中的线程应用并不是无节制的,官方给出的资料显示iPhone OS下的主线程的堆栈大小是1M,第二个线程开始都是512KB.并且该值不能通过编译器开关或线程API函数来更改.只有主线程有直接修改UI的能力.……>>详细 兄弟专题:iOS人机交互指南之UI设计基础 1 iOS多线程编程知多少 在iOS的世界里有两种实现多线程的方式: 多线程是一个比较轻量级的方法来

Android开发环境中的概念和工具介绍

最近学习Android开发,以前使用C/C++多一些,现在再补点Java知识,不管是哪种语言,都不过是一种工具而已,真的学起来,大同小异,无谓优劣.学习Android编程肯定是要先从环境搭建开始,无论是在Windows.还是Linux.Mac环境都可以,在搭建环境之前,有些概念综合了解一下确有必要,本文即是面向Android初学者的文章,作为Android入门的启蒙篇章. Android是Google主导开发的基于Linux开源智能移动终端操作系统,当然这里说的开源,也不是说Google把所有的

【Socket编程】Java中网络相关API的应用

Java中网络相关API的应用 一.InetAddress类 InetAddress类用于标识网络上的硬件资源,表示互联网协议(IP)地址. InetAddress类没有构造方法,所以不能直接new出一个对象: InetAddress类可以通过InetAddress类的静态方法获得InetAddress的对象: 1 InetAddress.getLocalHost();//获取本地对象 2 InetAddress.getByName("");//获取指定名称对象 主要方法使用: 1 /

Redis中Key相关的常用指令详解

Redis是一个开源的使用ANSI C 语言编写.支持网络.同memcache相比在Redis下可以实现基于内存亦可持久化的日志型.Key-Value 类型的NoSQL数据库,且在Redis中Key的类型也更为丰富.所以较为广泛的在生产环境中使用,在这里就说一说Redis中Key相关的常用指令. 首先,先要说明下在Redis下Key,Redis的key是字符串类型,但是key 中不能包括边界字符(""),由于key 不是binary safe的字符串,所以像"my key&q