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;
        }
    }

 

posted @ 2019-10-21 14:43  ricky0001  阅读(240)  评论(0编辑  收藏  举报