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

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

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

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

一、為什么選擇 Redis?

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

我將以 Spring Boot + RedisTemplate 為例,展示幾種常見用法。

二、用法一:緩存(String 類型 + 過期時間)

場景

微信小程序的 access_token 有效期為 2 小時(7200 秒),且每日獲取次數(shù)有限(2000 次)。必須緩存起來,避免頻繁調(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è)置 過期時間(略小于微信的有效期,提前刷新)
  • 配合 分布式鎖 防止緩存擊穿(見用法四)

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

場景

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

實(shí)現(xiàn)

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

擴(kuò)展

可以用 Hash 存儲一個用戶訂閱的多個模板:hset user:openId templateId 1

但簡單場景下 String 更直觀

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

場景

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

實(shí)現(xiàn)

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

其他應(yīng)用

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

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

場景

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

實(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();
}

注意

  • 鎖必須有過期時間,防止死鎖
  • 釋放鎖時必須驗證 value,防止誤刪他人的鎖
  • 使用 Lua 腳本保證 get + del 的原子性

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

場景

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

用 List 實(shí)現(xiàn)簡單隊列

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

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

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

對比

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

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

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

// 給用戶打標(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)典型用法你的項目中的應(yīng)用
String緩存、計數(shù)器、分布式鎖access_token、訂閱狀態(tài)、限流
Hash存儲對象字段(可擴(kuò)展)用戶配置
List消息隊列異步任務(wù)
Set標(biāo)簽、去重用戶角色標(biāo)識
SortedSet排行榜、延遲隊列積分排行
Pub/Sub實(shí)時廣播通知推送

ok,結(jié)束。

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

相關(guān)文章

  • Redis之Set和Zset使用及說明

    Redis之Set和Zset使用及說明

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

    Redis統(tǒng)計訪問量的3種實(shí)現(xiàn)方式

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

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

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

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

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

    Redis Subscribe timeout 報錯的問題解決

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

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

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

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

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

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

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

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

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

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

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

最新評論

辛集市| 通海县| 吉林省| 乐至县| 丰顺县| 当涂县| 孟津县| 武宣县| 芮城县| 邹城市| 临桂县| 布拖县| 紫金县| 神农架林区| 灵璧县| 绥滨县| 海兴县| 九龙城区| 安平县| 呼伦贝尔市| 山东省| 老河口市| 淅川县| 军事| 黄龙县| 龙里县| 德格县| 建昌县| 革吉县| 开平市| 巴彦淖尔市| 长武县| 韶山市| 甘泉县| 太原市| 冷水江市| 泰顺县| 都匀市| 海安县| 茌平县| 尼勒克县|