redis遇到的问题
redis中遇到的问题
/** * 为指定KEY设置List值 * @param key * @param list * @return */ public boolean setListByKey(String key, List<?> list, Long expires){ if(null==key){ return false; } redisTemplate.opsForList().rightPushAll(key, list); return redisTemplate.expire(key, expires, TimeUnit.SECONDS); }
其中的redisTemplate.opsForList().rightPushAll(key,list)
rightPushAll需要使用rightPushAll(K key, Collection<V> values) ,但是实际调用了前一个方法rightPushAll(K key, V... values
public Long rightPushAll(K key, V... values) { final byte[] rawKey = rawKey(key); final byte[][] rawValues = rawValues(values); return execute(new RedisCallback<Long>() { public Long doInRedis(RedisConnection connection) { return connection.rPush(rawKey, rawValues); } }, true); } @Override public Long rightPushAll(K key, Collection<V> values) { final byte[] rawKey = rawKey(key); final byte[][] rawValues = rawValues(values); return execute(new RedisCallback<Long>() { public Long doInRedis(RedisConnection connection) { return connection.rPush(rawKey, rawValues); } }, true); }
解决方式
强制修改参数
public boolean setListByKey(String key, List<?> list, Long expires){ if(null==key){ return false; } redisTemplate.opsForList().rightPushAll(key, (Collection)list); return redisTemplate.expire(key, expires, TimeUnit.SECONDS); }
由于还是有问题,在key为空时,多用户同时首次查询,会同时往redis中存放相同的值,导致数据重复的问题.
现在使用redis锁来进行限制.
@Override public List<DataDictionary> findByType(String dataType) { String key = CacheKeyConstants.KEY_DICTIONARY + dataType; // key是否存在 boolean existKeyFlag = redisClient.existKey(key); // key存在 if(existKeyFlag){ // 从redis中获取 List<DataDictionary> list = (List<DataDictionary>) redisClient.getListByKey(key); return list; }else{ // 从数据库获取列表值 List<DataDictionary> list = dataDictionaryMapper.findByType(dataType); // 获取锁 RedisLock lock = new RedisLock(redisTemplate, LOCK_KEY); if (lock.isLock()) { logger.info("设置数据字典redis值未获得锁,key:{}",LOCK_KEY); return null; } try { lock.lock(); if(null!=list){ // 设置list类型的redis键值 redisClient.setListByKey(key,list,GlobalConstants.EXPIRE_1DAY); } } catch (Exception e) { logger.error("设置数据字典redis值出错,info:" + e.getMessage(), e); } finally { lock.unlock(); } return list; } }