通过redis key的前缀获取所有的key或者获取所有key对应的value
通过redis key的前缀获取所有的key或者获取所有key对应的value异常:从redis获取出来的值为java.lang.Long|3305 或者java.lang.String|"3305" ,导致转化为List< String/Long > 失败。原因:1、设置redis的value要存储String ,五种数据类型不存在Long型redisCacheUtils.creat
·
通过redis key的前缀获取所有的key或者获取所有key对应的value
异常:从redis获取出来的值为 java.lang.Long|3305 或者 java.lang.String|"3305" ,导致转化为List< String/Long > 失败。
原因:
1、设置redis的value要存储String ,五种数据类型不存在Long型
redisCacheUtils.createTimeOutCache(redisKey, user.getId() + "", 60, TimeUnit.SECONDS);
2、获取的 redisTemplate 的类型不正确,要使用 JsonStringRedisSerializer
private RedisTemplate<String, Object> getRedisTemplate(String key) {
return templateProvider.getTemplate(new JsonStringRedisSerializer());
}
3、根据key前缀获取所有redis上所有key
public List<String> getKeysByPrefix(String keyPrefix) {
RedisTemplate<String, Object> redisTemplate = getRedisTemplate(keyPrefix);
Set<String> keys = redisTemplate.keys(keyPrefix + "*");
return Arrays.asList(keys.toArray(new String[0]));
}
4、获取相关redis的所有key相关的values
public List<String> getValuesByPrefix(String keyPrefix) {
RedisTemplate<String, Object> redisTemplate = getRedisTemplate(keyPrefix);
List<String> keys = getKeysByPrefix(keyPrefix);
List<Object> values = redisTemplate.opsForValue().multiGet(keys);
return (List<String>) (List) values;
}
5、附录 redis工具类,有些类封装了,用 templateProvider.getTemplate(new JsonStringRedisSerializer()) 获取 redisTemplate。
@Component
public class RedisCacheUtils {
private static final Logger LOGGER = LoggerFactory.getLogger(RedisCacheUtils.class);
private static final JsonStringRedisSerializer JSON_STRING_REDIS_SERIALIZER = new JsonStringRedisSerializer();
@Autowired
private BigCollectionProvider bigCollectionProvider;
@Autowired
private RedisTemplateProvider templateProvider;
public void updateCache(String key, Object o) {
Accessor acc = bigCollectionProvider.getMapAccessor(key, "");
RedisTemplate redisTemplate = acc.getTemplate(JSON_STRING_REDIS_SERIALIZER);
//查询剩余过期时间
Long expire = redisTemplate.getExpire(key);
if (expire.equals(-1L)){
//未设置超时
createForeverCache(key,o);
}else if (expire.equals(-2L)){
//已超时,不更新
return;
}else {
//有超时时间,重新赋值,但超时时间不更新
createTimeOutCache(key,o,expire,TimeUnit.SECONDS);
}
}
public void createForeverCache(String key, Object o) {
Accessor acc = bigCollectionProvider.getMapAccessor(key, "");
RedisTemplate redisTemplate = acc.getTemplate(JSON_STRING_REDIS_SERIALIZER);
redisTemplate.opsForValue().set(key,o);
}
public void createTimeOutCache(String key, Object o, long time, TimeUnit unit) {
Accessor acc = bigCollectionProvider.getMapAccessor(key, "");
RedisTemplate redisTemplate = acc.getTemplate(JSON_STRING_REDIS_SERIALIZER);
redisTemplate.opsForValue().set(key,o,time,unit);
}
public void deleteKey(String key){
Accessor acc = bigCollectionProvider.getMapAccessor(key, "");
RedisTemplate redisTemplate = acc.getTemplate(JSON_STRING_REDIS_SERIALIZER);
if(redisTemplate.hasKey(key)){
redisTemplate.delete(key);
}else {
LOGGER.info("key not exist");
}
}
public boolean setTimeOut(String key, long time, TimeUnit unit){
Accessor acc = bigCollectionProvider.getMapAccessor(key, "");
RedisTemplate redisTemplate = acc.getTemplate(JSON_STRING_REDIS_SERIALIZER);
if(redisTemplate.hasKey(key)){
return redisTemplate.expire(key,time,unit);
}else {
LOGGER.info("key not exist");
}
return false;
}
public <T> T getCache(String key) {
Accessor acc = bigCollectionProvider.getMapAccessor(key, "");
RedisTemplate<String, T> redisTemplate = acc.getTemplate(JSON_STRING_REDIS_SERIALIZER);
T o = redisTemplate.opsForValue().get(key);
if(o == null) {
return null;
}
return o;
}
public String createRedisKeyByClazz(String topic,Object o){
Class<?> aClass = o.getClass();
Field[] declaredFields = aClass.getDeclaredFields();
List<Field> fields = Arrays.asList(declaredFields);
Collections.sort(fields, Comparator.comparing(Field::getName));
Class<Modifier> modifierClass = Modifier.class;
Method[] methods = modifierClass.getDeclaredMethods();
List<Method> ms = Arrays.stream(methods).filter(r -> {
r.setAccessible(true);
return r.getName().equals("isPrivate") || r.getName().equals("isFinal") || r.getName().equals("isStatic");
}).collect(Collectors.toList());
List<Field> out = fields.stream().filter(r -> {
int modifiers = r.getModifiers();
boolean flag = true;
for (Method m : ms) {
try {
Boolean res = (Boolean) m.invoke(modifierClass, modifiers);
if (m.getName().equals("isPrivate")) {
if (res.equals(false)) {
flag = false;
break;
}
} else {
if (res.equals(true)) {
flag = false;
break;
}
}
} catch (Exception e) {
LOGGER.error("reflect error", e);
}
}
return flag;
}).collect(Collectors.toList());
StringBuffer res = new StringBuffer(topic);
out.stream().forEach(r->{
Object value = getFieldValueByName(r.getName(), o);
if(value==null){
res.append(",");
}else {
res.append(value.toString()).append(",");
}
});
return res.toString();
}
private Object getFieldValueByName(String fieldName, Object o) {
try {
String firstLetter = fieldName.substring(0, 1).toUpperCase();
String getter = "get" + firstLetter + fieldName.substring(1);
Method method = o.getClass().getMethod(getter, new Class[] {});
Object value = method.invoke(o, new Object[] {});
return value;
} catch (Exception e) {
LOGGER.error(e.getMessage(),e);
return null;
}
}
public List<String> getKeysByPrefix(String keyPrefix) {
RedisTemplate<String, Object> redisTemplate = getRedisTemplate(keyPrefix);
Set<String> keys = redisTemplate.keys(keyPrefix + "*");
return Arrays.asList(keys.toArray(new String[0]));
}
private RedisTemplate<String, Object> getRedisTemplate(String key) {
return templateProvider.getTemplate(new JsonStringRedisSerializer());
}
public List<String> getValuesByPrefix(String keyPrefix) {
RedisTemplate<String, Object> redisTemplate = getRedisTemplate(keyPrefix);
List<String> keys = getKeysByPrefix(keyPrefix);
List<Object> values = redisTemplate.opsForValue().multiGet(keys);
return (List<String>) (List) values;
}
// @Scheduled(cron = "* */20 * * * ?")
// @CacheEvict(value = {"getAppDoorOpenStatic","getDeviceByDeviceIdAndType","getFaceRecStatic","getFaceRecRecord"},allEntries = true)
// public void doorOpenRecordEvictCache(){
// LOGGER.info("clear redis cache per 20 minutes cache contains:"+"getAppDoorOpenStatic","getDeviceByDeviceIdAndType","getFaceRecStatic","getFaceRecRecord");
// }
}
每天努力一点,每天都在进步
更多推荐
已为社区贡献2条内容
所有评论(0)