Redis 批量查詢優(yōu)化

1 介紹

redis使用API查詢數(shù)據(jù),當碰到多個key查詢的時候,會下意識的使用循環(huán)的查詢方式。

示例代碼:

    /**
     * 大量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;
  
    /**
     * 實現(xiàn)命令:GET key,返回 key所關(guān)聯(lián)的字符串值。
     *
     * @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;
  
   /**
     * 批量查詢
     * 實現(xiàn)命令:MGET key1 key2,返回 多個結(jié)果。
     *
     * @param keys
     * @return value
     */
    public List<String> mget(List<String> keys) {
        return redisTemplate.opsForValue().multiGet(keys);
    }
  
}

3 pipeline管道

正常的redis通過key獲取數(shù)據(jù),需要先建立連接,然后返回數(shù)據(jù)。

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 相關(guān)信息

  • 博文不易,辛苦各位猿友點個關(guān)注和贊,感謝
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容