最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

RedisTemplate批量操作工具類性能測試

 更新時間:2023年08月15日 10:59:12   作者:小波同學(xué)  
這篇文章主要為大家介紹了RedisTemplate批量操作工具類性能測試詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

RedisTemplate批量添加操作教程

RedisTemplate批量添加操作教程,利用pipeline批量操作;multiSet()批量操作;for循環(huán)批量操作

一、使用pipeline的好處

了解redis的小伙伴都知道,redis是一個高性能的單線程的key-value數(shù)據(jù)庫。它的執(zhí)行過程為:

(1)發(fā)送命令-〉(2)命令排隊(duì)-〉(3)命令執(zhí)行-〉(4)返回結(jié)果

如果我們使用redis進(jìn)行批量插入數(shù)據(jù),正常情況下相當(dāng)于將以上四個步驟批量執(zhí)行N次。(1)和(4)稱為Round Trip Time(RTT,往返時間)。在一條簡單指令中,往往(1)(4)步驟之和大過于(2)(3)步驟之和,如何進(jìn)行優(yōu)化?Redis提供了pipeline管道機(jī)制,它能將一組Redis命令進(jìn)行組裝,通過一次RTT傳輸給Redis,并將這組Redis命令的執(zhí)行結(jié)果按順序返回給客戶端。

優(yōu)缺點(diǎn)總結(jié):

  • 1、性能對比:multiSet()>pipeline管道>普通for循環(huán)set
  • 2、擴(kuò)展性強(qiáng),可以支持設(shè)置失效時間。multiSet()不支持失效時間的設(shè)置

二、批量操作的工具類

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.RedisStringCommands;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.types.Expiration;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
/**
 * @author: huangyibo
 * @Date: 2022/6/23 16:15
 * @Description:
 */
@Component
public class BatchRunRedisUtil {
    @Autowired
    private RedisTemplate<String, Object> stringRedisTemplate;
    /**
     * 批量添加
     * @param map
     */
    public void batchSet(Map<String, String> map) {
        stringRedisTemplate.opsForValue().multiSet(map);
    }
    /**
     * 批量添加 并且設(shè)置失效時間
     * @param map
     * @param seconds
     */
    public void batchSetOrExpire(Map<String, String> map, Long seconds) {
        RedisSerializer<String> serializer = stringRedisTemplate.getStringSerializer();
        stringRedisTemplate.executePipelined(new RedisCallback<String>() {
            @Override
            public String doInRedis(RedisConnection connection) throws DataAccessException {
                map.forEach((key, value) -> {
                    connection.set(serializer.serialize(key), serializer.serialize(value), Expiration.seconds(seconds), RedisStringCommands.SetOption.UPSERT);
                });
                return null;
            }
        }, serializer);
    }
    /**
     * 批量獲取
     * @param list
     * @return
     */
    public List<Object> batchGet(List<String> list) {
        List<Object> objectList = stringRedisTemplate.opsForValue().multiGet(list);
        return objectList;
    }
    /**
     * Redis批量Delete
     * @param list
     */
    public void batchDelete(List<String> list) {
        stringRedisTemplate.delete(list);
    }
}

三、性能測試

通過for循環(huán)來向redis插入數(shù)據(jù),通過pipeline插入數(shù)據(jù),通過使用redisTemplate.opsForValue().multiSet(map)插入數(shù)據(jù)查看執(zhí)行時間。

import com.demo.util.BatchRunRedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.redis.core.RedisTemplate;
import java.util.HashMap;
import java.util.Map;
@SpringBootApplication
public class DemoApplication implements CommandLineRunner {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
    @Autowired
    private RedisTemplate<String, Object> stringRedisTemplate;
    @Autowired
    private BatchRunRedisUtil batchRunRedisUtil;
    @Override
    public void run(String... args) throws Exception {
        //for循環(huán)批量添加
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            stringRedisTemplate.opsForValue().set("aaa" + i, "a", 60);
        }
        long endTime = System.currentTimeMillis();
        System.out.println("普通set消耗" + (endTime - startTime) + "毫秒");
        //利用pipeline批量操作
        long startTime2 = System.currentTimeMillis();
        Map map = new HashMap(100000);
        for (int i = 0; i < 100000; i++) {
            map.put("bbb" + i, "b");
        }
        batchRunRedisUtil.batchSetOrExpire(map, 60l);
        long endTime2 = System.currentTimeMillis();
        System.out.println("管道set消耗" + (endTime2 - startTime2) + "毫秒");
        //multiSet()批量操作
        long startTime3 = System.currentTimeMillis();
        Map map2 = new HashMap(100000);
        for (int i = 0; i < 100000; i++) {
            map2.put("ccc" + i, "b");
        }
        batchRunRedisUtil.batchSet(map2);
        long endTime3 = System.currentTimeMillis();
        System.out.println("批量set消耗" + (endTime3 - startTime3) + "毫秒");
    }
}

在本機(jī)分別執(zhí)行了三次結(jié)果:

普通set消耗9010毫秒
管道set消耗1606毫秒
批量set消耗18毫秒

普通set消耗8228毫秒
管道set消耗1059毫秒
批量set消耗14毫秒

普通set消耗8365毫秒
管道set消耗1092毫秒
批量set消耗13毫秒

通過比較發(fā)現(xiàn),逐條執(zhí)行時間是pipeline執(zhí)行平均時間的8倍!這是在本機(jī)測試的結(jié)果,理論上,客戶端與服務(wù)端的網(wǎng)絡(luò)延遲越大,性能體能越明顯。

當(dāng)然,pipeline性能提升雖然明顯,但是每次管道里命令個數(shù)太多的話,也會造成客戶端響應(yīng)時間變久,網(wǎng)絡(luò)傳輸阻塞。最好還是根據(jù)業(yè)務(wù)情況,將大的pipeline拆分成多個小的pipeline來執(zhí)行。

如果不用設(shè)置失效時間的話最好使用redisTemplate.opsForValue().multiSet(map)方法來添加

以上就是RedisTemplate批量操作工具類性能測試的詳細(xì)內(nèi)容,更多關(guān)于RedisTemplate批量操作的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 基于session?Redis實(shí)現(xiàn)登錄

    基于session?Redis實(shí)現(xiàn)登錄

    這篇文章主要介紹了基于session?Redis實(shí)現(xiàn)登錄的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • Redis 緩存問題及解決

    Redis 緩存問題及解決

    網(wǎng)上收集的一些經(jīng)典特效,這里因?yàn)槠^長,不加整理了,想運(yùn)行的代碼的朋友可以點(diǎn)擊textarea中,全選復(fù)制即可。
    2010-07-07
  • Spring Boot整合Redis實(shí)現(xiàn)訂單超時處理問題

    Spring Boot整合Redis實(shí)現(xiàn)訂單超時處理問題

    這篇文章主要介紹了Spring Boot整合Redis實(shí)現(xiàn)訂單超時處理,通過這個基本的示例,你可以了解如何使用Spring Boot和Redis來處理訂單超時問題,并根據(jù)需要進(jìn)行擴(kuò)展和定制,需要的朋友可以參考下
    2023-11-11
  • redis緩存預(yù)熱的實(shí)現(xiàn)示例

    redis緩存預(yù)熱的實(shí)現(xiàn)示例

    本文主要介紹了Java中實(shí)現(xiàn)緩存預(yù)熱的多種策略,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11
  • Redis核心原理詳細(xì)解說

    Redis核心原理詳細(xì)解說

    這篇文章主要介紹了Redis核心原理詳細(xì)解說,redis利用epoll實(shí)現(xiàn)IO多路復(fù)用,將連接信息和事件放到隊(duì)列中,依次放到文件事件分派器,事件分派器將事件分發(fā)給事件處理器
    2022-07-07
  • Redis連接與查詢的實(shí)用操作指南

    Redis連接與查詢的實(shí)用操作指南

    當(dāng)我們需要深入排查緩存問題或驗(yàn)證數(shù)據(jù)一致性時,直接使用 redis-cli 是最有效的手段,但在此之前,你需要知道服務(wù)在哪、如何認(rèn)證以及使用哪些命令,本文精簡了冗余理論,直接提供可落地的操作步驟,跟著步驟走,快速解決你的 Redis 連接與查詢難題,需要的朋友可以參考下
    2026-03-03
  • Redis分布式鎖解決秒殺超賣問題

    Redis分布式鎖解決秒殺超賣問題

    本文主要介紹了Redis分布式鎖解決秒殺超賣問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Redis分布式緩存與秒殺

    Redis分布式緩存與秒殺

    這篇文章主要介紹了Redis分布式緩存與秒殺,單點(diǎn)Redis的問題,主要有數(shù)據(jù)丟失,并發(fā)能力,故障恢復(fù),存儲能力,想進(jìn)一步了解的同學(xué),可以借鑒本文
    2023-04-04
  • redis和hiredis的基本使用詳解

    redis和hiredis的基本使用詳解

    這篇文章主要介紹了redis和hiredis的基本使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • Redis實(shí)現(xiàn)好友關(guān)注的示例代碼

    Redis實(shí)現(xiàn)好友關(guān)注的示例代碼

    本文主要介紹了Redis實(shí)現(xiàn)好友關(guān)注的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01

最新評論

秦安县| 怀柔区| 新龙县| 平原县| 肥城市| 慈利县| 高青县| 广南县| 黎平县| 榆林市| 巧家县| 察哈| 旬阳县| 庆城县| 岑溪市| 常山县| 长白| 咸阳市| 酉阳| 德格县| 临洮县| 舟曲县| 陆良县| 盘山县| 绥阳县| 阿拉善左旗| 墨玉县| 高淳县| 扶风县| 黔江区| 拉孜县| 沐川县| 孟州市| 临泽县| 尚义县| 合山市| 宣汉县| 大港区| 乐昌市| 昌图县| 慈利县|