1 介绍

redis使用API查询数据,当碰到多个key查询的时候,会下意识的使用循环的查询方式。

示例代码:

    /**
     * 大量key的查询
     * @param keys
     * @return
     */
    @GetMapping("/getKeys")
    public List<String> getKeys(String... keys){
        List<String> result = new ArrayList<>();
        for (String key : keys) {
            result.add(redisOperator.get(key));
        }
        return result;
    }
@Component
public class RedisOperator {


    @Autowired
    private StringRedisTemplate redisTemplate;
  
    /**
     * 实现命令:GET key,返回 key所关联的字符串值。
     *
     * @param key
     * @return value
     */
    public String get(String key) {
        return (String)redisTemplate.opsForValue().get(key);
    }
  
}

2 mget批量查询

示例代码:

 /**
     * 批量查询 mget
     * @param keys
     * @return
     */
    @GetMapping("/mget")
    public List<String> mget(String... keys){
        List<String> keysList = Arrays.asList(keys);
        return redisOperator.mget(keysList);
    }
@Component
public class RedisOperator {


    @Autowired
    private StringRedisTemplate redisTemplate;
  
   /**
     * 批量查询
     * 实现命令:MGET key1 key2,返回 多个结果。
     *
     * @param keys
     * @return value
     */
    public List<String> mget(List<String> keys) {
        return redisTemplate.opsForValue().multiGet(keys);
    }
  
}

3 pipeline管道

正常的redis通过key获取数据,需要先建立连接,然后返回数据。

pipeline管道就相当于,nginx的keepalive,类似于长连接,将每次的操作都从一个管道里面进行操作,交互,只需要建立一次连接。

示例代码:

   /**
     * 批量查询 pipeline
     * @param keys
     * @return
     */
    @GetMapping("/batchGet")
    public List<Object> batchGet(String... keys){
        List<String> keysList = Arrays.asList(keys);
        return redisOperator.batchGet(keysList);
    }
@Component
public class RedisOperator {


    @Autowired
    private StringRedisTemplate redisTemplate;
  
     /**
     * 批量查询 管道 pipeline
     *
     * @param keys
     * @return value
     */
    public List<Object> batchGet(List<String> keys) {
        // nginx -> keepalive
        // redis -> pipeline
        List<Object> result = redisTemplate.executePipelined(new RedisCallback<String>() {
            @Override
            public String doInRedis(RedisConnection connection) throws DataAccessException {
                StringRedisConnection src = (StringRedisConnection) connection;
                for (String key : keys) {
                    src.get(key);
                }
                return null;
            }
        });
        return result;
    }
  
}

4 相关信息

  • 博文不易,辛苦各位猿友点个关注和赞,感谢
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐