这篇文章我们接上回的shiro自带缓存ehcahe cacheManager的实现,但是暴露了一个小问题是程序一结束缓存就会消失,所以此时我们就用redis做缓存,解决这个问题。
首先我们将redis的坐标引进来到POM文件中:
<!--redis整合springboot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
之后redis安装、启动等操作不是本篇文章的重点则不做赘述,接着我们在springboot的配置文件中配置redis的信息:
spring.redis.port=6379
spring.redis.host=localhost
spring.redis.database=1
上面的配置声明了redis的端口号,ip为我的本机,用到的redis的库为1号库,因为我的0号库中存储着一些其他数据,所以将库指定为了1号库。
而此时,我们要将redis引入我们的项目用到它其实可以参照我们用shiro自带的接口的ehmanager的缓存实现。
首先我们之前在ShiroConfig文件中做了ehCache的缓存实现,我们则可以将他改为我们自己的redis的缓存实现:
/**
* 自定义shiro缓存管理器
*/
public class RedisCacheManager implements CacheManager {
/**
*
* @param cacheName 认证或缓存的统一名称
* @param <K>
* @param <V>
* @return
* @throws CacheException
*/
@Override
public <K, V> Cache<K, V> getCache(String cacheName) throws CacheException {
RedisCache<K,V> redisCache = new RedisCache<>(cacheName);
return redisCache;
}
}
之前我们看到过shiro的自带缓存用到缓存管理器,此时我们要自定义缓存管理器则一定要实现CacheManager这个接口,这个方法中有一个参数为cacheName这个就是认证或授权的缓存统一名称。可以看到我在上面这段代码中新new了一个对象RedisCache<K,V>这个则是我们自定义Redis缓存实现的类,用缓存管理器来管理我们的自定义Redis缓存实现。下面可以看一下这个类:
/**
* 自定义RedisCache缓存的实现
*/
public class RedisCache<K,V> implements Cache<K,V> {
private String cacheName;
public RedisCache(String cacheName) {
this.cacheName = cacheName;
}
public RedisCache() {
}
private RedisTemplate getRedisTemplate(){
RedisTemplate redisTemplate = (RedisTemplate) ApplicationContextUtils.getBean("redisTemplate");
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
return redisTemplate;
}
/**
*
* @param k 根据key拿v
* @return
* @throws CacheException
*/
@Override
public V get(K k) throws CacheException {
V v = (V)getRedisTemplate().opsForHash().get(this.cacheName, k.toString());
return v;
}
/**
*
* @param k 将k,v放入Redis中
* @param v
* @return
* @throws CacheException
*/
@Override
public V put(K k, V v) throws CacheException {
getRedisTemplate().opsForHash().put(this.cacheName,k.toString(),v);
return null;
}
/**
* 移除指定的k
* @param k
* @return
* @throws CacheException
*/
@Override
public V remove(K k) throws CacheException {
return (V)getRedisTemplate().opsForHash().delete(this.cacheName, k.toString());
}
/**
* 根据cachename清除整个map
* @throws CacheException
*/
@Override
public void clear() throws CacheException {
getRedisTemplate().delete(this.cacheName);
}
/**
* 计算整个认证和授权的数量,key的总条数
* @return
*/
@Override
public int size() {
return getRedisTemplate().opsForHash().size(this.cacheName).intValue();
}
/**
* 获取Keys
* @return
*/
@Override
public Set<K> keys() {
return getRedisTemplate().opsForHash().keys(this.cacheName);
}
/**
* 获取values
* @return
*/
@Override
public Collection<V> values() {
return getRedisTemplate().opsForHash().values(this.cacheName);
}
}
可以看到上面这段代码实现了Cache<K,V>这个接口,并重写了这些方法,这些方法都是我们用来操作数据库中数据到redis和操作Redis中数据的方法。因为我们用到了redis,配置了redis信息,引入了redis坐标,springboot就为我们初始化了一个RedisTemplate对象来让我们操作redis,而RedisTemplate这个对象不是被工厂管理的,所以我们要用到之前我们写的取spring容器中的对象的那个方法。getApplicationContextUtils这个方法使用RedisTemplate。
这时,Redis的存储效果如下:

再登录时就会发现控制台没有任何打印

但是退出登录,logout之后登录信息就会从redis中去除
1万+



被折叠的 条评论
为什么被折叠?



