com.diboot.iam.redis.ShiroRedisCache Maven / Gradle / Ivy
/*
* Copyright (c) 2015-2021, www.dibo.ltd ([email protected]).
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.diboot.iam.redis;
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 java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.TimeUnit;
/**
* RedisCache缓存定义
*
* @author : uu
* @version : v1.0
* @Date 2021/6/8 18:36
* Copyright © diboot.com
*/
public class ShiroRedisCache implements Cache {
private static final Logger log = LoggerFactory.getLogger(ShiroRedisCache.class);
private RedisTemplate redisTemplate;
private String cacheName;
private static final String SUFFIX_KEYS = "_KEYS";
private int tokenExpireMinutes;
public ShiroRedisCache(String cacheName, RedisTemplate redisTemplate, int tokenExpireMinutes) {
this.cacheName = cacheName;
this.redisTemplate = redisTemplate;
this.tokenExpireMinutes = tokenExpireMinutes;
}
private String getKey(String key){
return this.cacheName + ":" + key;
}
@Override
public V get(K k) throws CacheException {
String key = this.getKey(k.toString());
log.debug("get key : {}", key);
return (V)redisTemplate.opsForValue().get(key);
}
@Override
public V put(K k , V v) throws CacheException {
if (k == null || v == null) {
return null;
}
String key = this.getKey(k.toString());
log.debug("put key : {}, value: {}", key, v);
redisTemplate.opsForValue().set(key, v, tokenExpireMinutes, TimeUnit.MINUTES);
// 添加keys
redisTemplate.opsForSet().add(this.cacheName + SUFFIX_KEYS, key);
log.debug("redis缓存新增key:{}", key);
return v;
}
@Override
public V remove(K k) throws CacheException {
if (k == null) {
return null;
}
String key = this.getKey(k.toString());
V value = get(k);
log.debug("remove key : {}", key);
redisTemplate.delete(key);
// 从keys缓存中移除
redisTemplate.opsForSet().remove(this.cacheName + SUFFIX_KEYS, key);
log.debug("redis缓存移除key:{}", key);
return value;
}
@Override
public void clear() throws CacheException {
redisTemplate.delete(this.keys());
}
@Override
public int size() {
return keys().size();
}
@Override
public Set keys() {
return (Set) redisTemplate.opsForSet().members(this.cacheName + SUFFIX_KEYS);
}
@Override
public Collection values() {
Set keys = keys();
Set values = new HashSet<>(keys.size());
for (K key: keys) {
V value = (V)redisTemplate.opsForValue().get(key);
if(value != null){
values.add(value);
}
}
return values;
}
}