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

高并發(fā)場景分析之redis+lua防重校驗(yàn)

 更新時(shí)間:2023年07月10日 10:13:34   作者:想養(yǎng)一只薩摩耶~  
這篇文章主要介紹了高并發(fā)場景分析之redis+lua防重校驗(yàn),本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

高并發(fā)場景:redis+lua防重校驗(yàn)

大家平時(shí)在做有并發(fā)量下單的項(xiàng)目時(shí),代碼層面基本上就分為這么幾個(gè)步驟:參數(shù)校驗(yàn)--->防重校驗(yàn)--->庫存校驗(yàn)扣減--->下單成功--->支付。

最近公司有個(gè)商城項(xiàng)目說要30分鐘達(dá)到1億的并發(fā)量。當(dāng)時(shí)聽到突然猛了一下。真是牛逼克拉斯呀。

不過該說不說還是得開搞,所謂的并發(fā)無非就是要想辦法減少io的操作,盡量少查表,其余配置方面的問題就看公司舍不舍得花錢了。

其中防重校驗(yàn)這一部分選用了redis集合lua來做,來防止多次提交。

注意:真實(shí)下單操作是分為了訂單前置操作 (前置校驗(yàn)和生成防重令牌)和提交訂單兩個(gè)接口來寫的,這里為了測試簡單合并了

@RestController
@RequestMapping("/lua")
public class TestLuaController {
    @Autowired
    private StringRedisTemplate redisTemplate;
    private static final String ORDER_CHECK_TOKEN = "order_check_token";
    private static final String ORDER_TOKEN_DEFAULT_VALUE = "value";
    /**
     * 場景:最近公司有高并發(fā)場景,涉及到用令牌防重(防止有人多次提交訂單)
     *     可以使用redis執(zhí)行l(wèi)ua腳本 比較key值令牌是否存在,如果存在即刪除
     */
    @RequestMapping("/checkTempToken")
    public Long luaExecute(String checkToken){
        //模擬提交訂單生成的防重令牌
        redisTemplate.opsForValue().set(ORDER_CHECK_TOKEN + checkToken,ORDER_TOKEN_DEFAULT_VALUE,60, TimeUnit.SECONDS);
        String script = "if redis.call(\"get\",KEYS[1]) == ARGV[1]\n" +
                "then\n" +
                "    return redis.call(\"del\",KEYS[1])\n" +
                "else\n" +
                "    return 0\n" +
                "end";
//執(zhí)行redis腳本操作的函數(shù)
        Long execute = redisTemplate.execute(new DefaultRedisScript<>(script, Long.class), Arrays.asList(ORDER_CHECK_TOKEN + checkToken), ORDER_TOKEN_DEFAULT_VALUE);
        System.out.println(execute);
        return execute;
    }
}

結(jié)果:

redis+lua語言去重

1)redis

redis是一種鍵值對的單線程架構(gòu)模型,所以它是線程安全的,也是分布式緩存常用的解決方案。

2)lua

lua是基于c語言的一種腳本語言,它可以很輕便地被使用在嵌入式方面。我們不會去重寫redis,但是我們可以去使用lua來擴(kuò)展redis的功能。而redis也內(nèi)置了對lua支持的模塊。

3)redis+lua是我司基于分布式告警去重的一種解決方案,要達(dá)到的目的:堵住10是s內(nèi)的重復(fù)告警,主要應(yīng)用的場景是同一個(gè)告警,在不通的客戶端同時(shí)推送了一條告警數(shù)據(jù),此時(shí)要堵住

一條數(shù)據(jù)。

直接上代碼吧

@Component
public class RedisLua {
    @Autowired
    private RedisTemplate<String,Object> redisTemplate;
    private DefaultRedisScript<Boolean> script;
    private static final String KEY_PREX = "alertInfo_";
    @PostConstruct
    private void init(){
        script = new DefaultRedisScript<Boolean>();
        script.setResultType(Boolean.class);
        script.setScriptSource(new ResourceScriptSource(new
                ClassPathResource("lua/alert.lua")));//lua腳本文件
    }public Boolean blockRepetition(String ruleId,String status,String ip,Object...args){
        List<String> keys = new ArrayList<>();
        keys.add(KEY_PREX + ip+ruleId+status);//key包括前綴+客戶端ip+告警規(guī)則id+狀態(tài)
        return redisTemplate.execute(script, keys, args);
    }
}

下面是lua腳本

--[[ ARGV1表示redis生效時(shí)間,key表示存儲redis的key值]]
local alert = redis.call('exists',KEYS[1]);
if alert
 then
    return false
 else
    redis.call('set',KEYS[1],ngx.time())
    redis.call('expire',KEYS[1],ARGV[1])
    return true
end

該方案主要用于微服務(wù)集群中,采用分布式鎖防和redis集群確保數(shù)據(jù)唯一。

使用腳本的好處如下:

1.減少網(wǎng)絡(luò)開銷:本來5次網(wǎng)絡(luò)請求的操作,可以用一個(gè)請求完成,原先5次請求的邏輯放在redis服務(wù)器上完成。使用腳本,減少了網(wǎng)絡(luò)往返時(shí)延。

2.原子操作:Redis會將整個(gè)腳本作為一個(gè)整體執(zhí)行,中間不會被其他命令插入。

3.復(fù)用:客戶端發(fā)送的腳本會永久存儲在Redis中,意味著其他客戶端可以復(fù)用這一腳本而不需要使用代碼完成同樣的邏輯。

到此這篇關(guān)于高并發(fā)場景分析之redis+lua防重校驗(yàn)的文章就介紹到這了,更多相關(guān)redis+lua防重內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • redis集群的三種部署之主從復(fù)制、哨兵機(jī)制、cluster集群詳解

    redis集群的三種部署之主從復(fù)制、哨兵機(jī)制、cluster集群詳解

    本文介紹了Redis的主要特點(diǎn),包括高性能、數(shù)據(jù)持久化、分布式特性、豐富的數(shù)據(jù)結(jié)構(gòu)、高可用性、開源免費(fèi)以及可擴(kuò)展性等七大特點(diǎn),文章還詳細(xì)介紹了三種Redis集群部署方式:主從復(fù)制、哨兵機(jī)制和Cluster集群,并通過實(shí)驗(yàn)演示了每種方式的具體配置和操作步驟
    2026-05-05
  • Redis7.0部署集群的實(shí)現(xiàn)步驟

    Redis7.0部署集群的實(shí)現(xiàn)步驟

    本文主要介紹了Redis7.0部署集群的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Redis?RESP?協(xié)議實(shí)現(xiàn)實(shí)例詳解

    Redis?RESP?協(xié)議實(shí)現(xiàn)實(shí)例詳解

    這篇文章主要為大家介紹了Redis?RESP?協(xié)議實(shí)現(xiàn)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Redis8.0.3編譯化安裝的實(shí)現(xiàn)

    Redis8.0.3編譯化安裝的實(shí)現(xiàn)

    本文主要介紹了Redis8.0.3編譯化安裝的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-08-08
  • Redis實(shí)現(xiàn)鎖續(xù)期的項(xiàng)目實(shí)踐

    Redis實(shí)現(xiàn)鎖續(xù)期的項(xiàng)目實(shí)踐

    本文介紹了使用Redis實(shí)現(xiàn)分布式鎖的續(xù)期,包括使用Lua腳本、Redlock算法和Redisson客戶端等方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-12-12
  • Redis的安全機(jī)制詳細(xì)介紹及配置方法

    Redis的安全機(jī)制詳細(xì)介紹及配置方法

    本文介紹Redis安全機(jī)制的配置方法,包括綁定IP地址、設(shè)置密碼、保護(hù)模式、禁用危險(xiǎn)命令、防火墻限制、TLS加密、客戶端連接限制、最大內(nèi)存使用和日志審計(jì)等,通過合理配置這些安全機(jī)制,可以有效地保護(hù)Redis實(shí)例免受未授權(quán)訪問和其他潛在的安全威脅,感興趣的朋友一起看看吧
    2025-11-11
  • Windows環(huán)境下Redis Cluster環(huán)境搭建(圖文)

    Windows環(huán)境下Redis Cluster環(huán)境搭建(圖文)

    這篇文章主要介紹了Windows環(huán)境下Redis Cluster環(huán)境搭建(圖文),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-07-07
  • Redis發(fā)布訂閱和實(shí)現(xiàn).NET客戶端詳解

    Redis發(fā)布訂閱和實(shí)現(xiàn).NET客戶端詳解

    發(fā)布訂閱在應(yīng)用級其作用是為了減少依賴關(guān)系,通常也叫觀察者模式。主要是把耦合點(diǎn)單獨(dú)抽離出來作為第三方,隔離易變化的發(fā)送方和接收方。下面這篇文章主要給大家介紹了關(guān)于Redis發(fā)布訂閱和實(shí)現(xiàn).NET客戶端的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Redis定時(shí)任務(wù)原理的實(shí)現(xiàn)

    Redis定時(shí)任務(wù)原理的實(shí)現(xiàn)

    本文主要是基于?redis?6.2?源碼進(jìn)行分析定時(shí)事件的數(shù)據(jù)結(jié)構(gòu)和常見操作,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Redis報(bào)錯(cuò)“NOAUTH Authentication required”兩種解決方案

    Redis報(bào)錯(cuò)“NOAUTH Authentication required”兩種解決方案

    Redis提供了一個(gè)命令行工具redis-cli,它允許你直接連接到Redis服務(wù)器,如果你知道Redis服務(wù)器的密碼,你可以在連接時(shí)直接提供它,本文給大家介紹連接了Redis報(bào)錯(cuò)“NOAUTH Authentication required”兩種解決方案
    2024-05-05

最新評論

锦州市| 二连浩特市| 岳阳市| 颍上县| 潮州市| 铅山县| 德化县| 厦门市| 乌苏市| 大荔县| 洞头县| 社会| 安顺市| 平度市| 民丰县| 新干县| 呼图壁县| 巫山县| 宜君县| 灵丘县| 淮南市| 内乡县| 郑州市| 莱西市| 泰来县| 中牟县| 抚顺县| 叶城县| 临夏县| 温泉县| 罗田县| 鸡西市| 苍梧县| 肇州县| 新疆| 石屏县| 祁阳县| 卢湾区| 鲁甸县| 灌云县| 丹江口市|