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

Redis?在業(yè)務(wù)中的典型用法匯總

 更新時(shí)間:2026年04月15日 09:51:30   作者:晴天sir  
文章主要介紹了Redis在業(yè)務(wù)中的六種常見(jiàn)應(yīng)用場(chǎng)景,包括緩存access_token、存儲(chǔ)業(yè)務(wù)狀態(tài)、計(jì)數(shù)器、分布式鎖、消息隊(duì)列、標(biāo)簽和排行榜等,通過(guò)SpringBoot+RedisTemplate的方式進(jìn)行實(shí)現(xiàn),感興趣的朋友跟隨小編一起看看吧

最近在做小程序后端時(shí),用 Redis 解決了幾個(gè)典型問(wèn)題:緩存 access_token、記錄用戶(hù)訂閱狀態(tài)、分布式鎖防止并發(fā)。借此機(jī)會(huì),我總結(jié)了 Redis 在業(yè)務(wù)中最常用的幾種模式,希望對(duì)大家有幫助。相關(guān)代碼,可以參考  wx小程序?qū)崙?zhàn)

一、為什么選擇 Redis?

首先 Redis 是一款基于內(nèi)存的鍵值存儲(chǔ)系統(tǒng),速度快、數(shù)據(jù)結(jié)構(gòu)豐富、支持持久化。在需要高性能緩存分布式鎖、計(jì)數(shù)器消息隊(duì)列等場(chǎng)景下,Redis 幾乎是首選。

我將以 Spring Boot + RedisTemplate 為例,展示幾種常見(jiàn)用法。

二、用法一:緩存(String 類(lèi)型 + 過(guò)期時(shí)間)

場(chǎng)景

微信小程序的 access_token 有效期為 2 小時(shí)(7200 秒),且每日獲取次數(shù)有限(2000 次)。必須緩存起來(lái),避免頻繁調(diào)用。

實(shí)現(xiàn)

// 獲取 token
String token = redisTemplate.opsForValue().get("WECHAT_ACCESS_TOKEN");
if (token == null) {
    token = fetchFromWechat();
    redisTemplate.opsForValue().set("WECHAT_ACCESS_TOKEN", token, 7000, TimeUnit.SECONDS);
}

關(guān)鍵點(diǎn)

  • 設(shè)置 過(guò)期時(shí)間(略小于微信的有效期,提前刷新)
  • 配合 分布式鎖 防止緩存擊穿(見(jiàn)用法四)

三、用法二:存儲(chǔ)業(yè)務(wù)狀態(tài)(String 類(lèi)型 + 過(guò)期時(shí)間)

場(chǎng)景

用戶(hù)訂閱消息后,需要在后端記錄訂閱關(guān)系,30 天后自動(dòng)失效(與微信授權(quán)有效期對(duì)齊)。

實(shí)現(xiàn)

String key = "SUBSCRIBE:" + templateId + ":" + openId;
redisTemplate.opsForValue().set(key, "1", 30, TimeUnit.DAYS);
// 檢查是否訂閱
Boolean exists = redisTemplate.hasKey(key);

擴(kuò)展

可以用 Hash 存儲(chǔ)一個(gè)用戶(hù)訂閱的多個(gè)模板:hset user:openId templateId 1

但簡(jiǎn)單場(chǎng)景下 String 更直觀

四、用法三:計(jì)數(shù)器(自增/自減)

場(chǎng)景

限制用戶(hù)每天發(fā)送意見(jiàn)的次數(shù)(防刷)。例如每個(gè)村民每天最多提交 3 條意見(jiàn)。

實(shí)現(xiàn)

String key = "OPINION:LIMIT:" + openId + ":" + LocalDate.now();
Long count = redisTemplate.opsForValue().increment(key);
if (count == 1) {
 // 設(shè)置過(guò)期時(shí)間為當(dāng)天結(jié)束
    redisTemplate.expire(key, 1, TimeUnit.DAYS);
}
if (count > 3) {
    return Result.error("今日提交次數(shù)已達(dá)上限");
}

其他應(yīng)用

  • 統(tǒng)計(jì)點(diǎn)贊數(shù)、閱讀數(shù)
  • 接口限流(滑動(dòng)窗口)

五、用法四:分布式鎖(String + setIfAbsent + Lua)

場(chǎng)景

多實(shí)例部署時(shí),緩存失效瞬間多個(gè)線(xiàn)程同時(shí)請(qǐng)求微信 access_token,導(dǎo)致 token 被覆蓋或超限。需要分布式鎖保證只有一個(gè)線(xiàn)程去刷新。

實(shí)現(xiàn)

String lockKey = "WECHAT:ACCESS_TOKEN_LOCK";
String lockValue = UUID.randomUUID().toString();
Boolean locked = redisTemplate.opsForValue()
        .setIfAbsent(lockKey, lockValue, 5, TimeUnit.SECONDS);
if (locked) {
    try {
        // 雙重檢查
        String token = redisTemplate.opsForValue().get("WECHAT_ACCESS_TOKEN");
        if (token == null) {
            token = fetchFromWechat();
            redisTemplate.opsForValue().set("WECHAT_ACCESS_TOKEN", token, 7000, TimeUnit.SECONDS);
        }
        return token;
    } finally {
        // 釋放鎖:Lua 腳本保證原子性,只釋放自己加的鎖
        String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
        redisTemplate.execute(new DefaultRedisScript<>(script, Long.class), 
                Collections.singletonList(lockKey), lockValue);
    }
} else {
    // 睡 100ms 后重試
    Thread.sleep(100);
    return getAccessToken();
}

注意

  • 鎖必須有過(guò)期時(shí)間,防止死鎖
  • 釋放鎖時(shí)必須驗(yàn)證 value,防止誤刪他人的鎖
  • 使用 Lua 腳本保證 get + del 的原子性

六、用法五:消息隊(duì)列(List / PubSub)

場(chǎng)景

異步處理耗時(shí)任務(wù),例如發(fā)送訂閱消息后需要記錄日志,但不影響主流程響應(yīng)。

用 List 實(shí)現(xiàn)簡(jiǎn)單隊(duì)列

// 生產(chǎn)者:入隊(duì)
redisTemplate.opsForList().rightPush("MSG:QUEUE", message);
// 消費(fèi)者:阻塞彈出(配合 while 循環(huán)或定時(shí)任務(wù))
String message = redisTemplate.opsForList().leftPop("MSG:QUEUE", 10, TimeUnit.SECONDS);

用 Pub/Sub 實(shí)現(xiàn)廣播

// 發(fā)布
redisTemplate.convertAndSend("CHANNEL:OPINION", "新意見(jiàn)");
// 訂閱(需實(shí)現(xiàn) MessageListener)
@Bean
public MessageListenerAdapter listenerAdapter(RedisReceiver receiver) {
    return new MessageListenerAdapter(receiver, "onMessage");
}

對(duì)比

方式特點(diǎn)適用場(chǎng)景
List點(diǎn)對(duì)點(diǎn),支持阻塞等待簡(jiǎn)單任務(wù)隊(duì)列
Pub/Sub廣播,消息即發(fā)即失(不持久化)實(shí)時(shí)通知、聊天
Stream(5.0+)持久化、消費(fèi)組可靠消息隊(duì)列

七、用法六:Set / SortedSet 實(shí)現(xiàn)標(biāo)簽和排行榜

Set 應(yīng)用:用戶(hù)標(biāo)簽系統(tǒng)

// 給用戶(hù)打標(biāo)簽
redisTemplate.opsForSet().add("TAG:GRID_MEMEBER", openId1, openId2);
// 判斷是否網(wǎng)格員
Boolean isGrid = redisTemplate.opsForSet().isMember("TAG:GRID_MEMEBER", openId);

SortedSet 應(yīng)用:排行榜

// 增加積分
redisTemplate.opsForZSet().incrementScore("RANK:OPINION", openId, 1);
// 獲取前三名
Set<String> top3 = redisTemplate.opsForZSet().reverseRange("RANK:OPINION", 0, 2);

八、總結(jié)

數(shù)據(jù)結(jié)構(gòu)典型用法你的項(xiàng)目中的應(yīng)用
String緩存、計(jì)數(shù)器、分布式鎖access_token、訂閱狀態(tài)、限流
Hash存儲(chǔ)對(duì)象字段(可擴(kuò)展)用戶(hù)配置
List消息隊(duì)列異步任務(wù)
Set標(biāo)簽、去重用戶(hù)角色標(biāo)識(shí)
SortedSet排行榜、延遲隊(duì)列積分排行
Pub/Sub實(shí)時(shí)廣播通知推送

ok,結(jié)束。

到此這篇關(guān)于Redis 在業(yè)務(wù)中的幾種典型用法的文章就介紹到這了,更多相關(guān)Redis 業(yè)務(wù)中用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis之Set和Zset使用及說(shuō)明

    Redis之Set和Zset使用及說(shuō)明

    文章介紹了Redis集合和有序集合的相關(guān)命令,包括添加、查詢(xún)、修改、刪除元素,集合間的交集、并集、差集操作,以及數(shù)據(jù)庫(kù)管理操作,強(qiáng)調(diào)了在實(shí)際開(kāi)發(fā)中合理使用這些功能的重要性
    2026-03-03
  • Redis統(tǒng)計(jì)訪(fǎng)問(wèn)量的3種實(shí)現(xiàn)方式

    Redis統(tǒng)計(jì)訪(fǎng)問(wèn)量的3種實(shí)現(xiàn)方式

    這篇文章主要介紹了Redis統(tǒng)計(jì)訪(fǎng)問(wèn)量的3種實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • redis中RDB(Redis Data Base)的機(jī)制

    redis中RDB(Redis Data Base)的機(jī)制

    本文主要介紹了redis中RDB(Redis Data Base)的機(jī)制,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • redis實(shí)現(xiàn)延遲任務(wù)的項(xiàng)目實(shí)踐

    redis實(shí)現(xiàn)延遲任務(wù)的項(xiàng)目實(shí)踐

    本文主要介紹了redis實(shí)現(xiàn)延遲任務(wù)的項(xiàng)目實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Redis Subscribe timeout 報(bào)錯(cuò)的問(wèn)題解決

    Redis Subscribe timeout 報(bào)錯(cuò)的問(wèn)題解決

    最近系統(tǒng)偶爾報(bào)出org.redisson.client.RedisTimeoutException: Subscribe timeout: (7500ms)的錯(cuò)誤,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-08-08
  • Windows環(huán)境下查看、添加、修改redis數(shù)據(jù)庫(kù)的密碼兩種方式

    Windows環(huán)境下查看、添加、修改redis數(shù)據(jù)庫(kù)的密碼兩種方式

    在Windows系統(tǒng)上設(shè)置Redis密碼的過(guò)程與Linux系統(tǒng)類(lèi)似,但需注意幾個(gè)關(guān)鍵步驟以確保正確配置,這篇文章主要給大家介紹了關(guān)于Windows環(huán)境下查看、添加、修改redis數(shù)據(jù)庫(kù)的密碼兩種方式,需要的朋友可以參考下
    2024-07-07
  • Redis基礎(chǔ)學(xué)習(xí)之管道機(jī)制詳析

    Redis基礎(chǔ)學(xué)習(xí)之管道機(jī)制詳析

    這篇文章主要給大家介紹了關(guān)于Redis基礎(chǔ)學(xué)習(xí)之管道機(jī)制的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Redis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • Redis實(shí)現(xiàn)查看服務(wù)狀態(tài)、關(guān)閉和啟動(dòng)方式

    Redis實(shí)現(xiàn)查看服務(wù)狀態(tài)、關(guān)閉和啟動(dòng)方式

    本文介紹了如何在Linux系統(tǒng)中查看、關(guān)閉和啟動(dòng)Redis服務(wù),包括使用命令行工具和配置文件進(jìn)行相關(guān)操作
    2025-11-11
  • Redis哨兵集群模式全方位解讀

    Redis哨兵集群模式全方位解讀

    Redis哨兵集群通過(guò)心跳檢測(cè)實(shí)現(xiàn)主從自動(dòng)故障轉(zhuǎn)移,當(dāng)主節(jié)點(diǎn)宕機(jī)時(shí),依據(jù)斷開(kāi)時(shí)間、優(yōu)先級(jí)、offset和運(yùn)行ID規(guī)則選舉新主,腦裂問(wèn)題因網(wǎng)絡(luò)分割導(dǎo)致數(shù)據(jù)沖突,可通過(guò)配置參數(shù)限制同步延遲和從節(jié)點(diǎn)數(shù)量來(lái)避免數(shù)據(jù)丟失
    2025-09-09
  • Redis實(shí)現(xiàn)高效插入大量數(shù)據(jù)的三種方法

    Redis實(shí)現(xiàn)高效插入大量數(shù)據(jù)的三種方法

    在實(shí)際開(kāi)發(fā)中,我們經(jīng)常需要向Redis批量寫(xiě)入大量數(shù)據(jù),本文將詳細(xì)介紹三種基于管道的批量插入方案,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2026-04-04

最新評(píng)論

晋宁县| 清原| 衢州市| 杂多县| 陆川县| 通河县| 腾冲县| 酉阳| 和平县| 会理县| 阿勒泰市| 阳西县| 郸城县| 荥阳市| 买车| 怀远县| 南充市| 卢氏县| 呼图壁县| 托克逊县| 北流市| 余干县| 永福县| 连州市| 六枝特区| 和平区| 五华县| 潢川县| 馆陶县| 利津县| 盐城市| 金昌市| 惠来县| 新闻| 广饶县| 鹤壁市| 永新县| 大冶市| 镇坪县| 新巴尔虎右旗| 扎鲁特旗|