通过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");
//    }
}

 

 

每天努力一点,每天都在进步

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐