宅男在线永久免费观看网直播,亚洲欧洲日产国码无码久久99,野花社区在线观看视频,亚洲人交乣女bbw,一本一本久久a久久精品综合不卡

全部
常見問題
產(chǎn)品動態(tài)
精選推薦

掌握工作中最常見的十個Redis應(yīng)用場景

管理 管理 編輯 刪除

前言

Redis作為一種優(yōu)秀的基于key/value的緩存,有非常不錯的性能和穩(wěn)定性,無論是在工作中,還是面試中,都經(jīng)常會出現(xiàn)。

今天這篇文章就跟大家一起聊聊,我在實(shí)際工作中使用Redis的10種場景,希望對你會有所幫助。

b6741202403041001375106.png


1. 統(tǒng)計(jì)訪問次數(shù)

對于很多官方網(wǎng)站的首頁,經(jīng)常會有一些統(tǒng)計(jì)首頁訪問次數(shù)的需求。

訪問次數(shù)只有一個字段,如果保存到數(shù)據(jù)庫中,再最后做匯總顯然有些麻煩。

該業(yè)務(wù)場景可以使用Redis,定義一個key,比如:OFFICIAL_INDEX_VISIT_COUNT。

在Redis中有incr命令,可以實(shí)現(xiàn)給value值加1操作:

incr?OFFICIAL_INDEX_VISIT_COUNT

當(dāng)然如果你想一次加的值大于1,可以用incrby命令,例如:

incrby?OFFICIAL_INDEX_VISIT_COUNT?5

這樣可以一次性加5。

2. 獲取分類樹

在很多網(wǎng)站都有分類樹的功能,如果沒有生成靜態(tài)的html頁面,想通過調(diào)用接口的方式獲取分類樹的數(shù)據(jù)。

我們一般為了性能考慮,會將分類樹的json數(shù)據(jù)緩存到Redis當(dāng)中,為了后面在網(wǎng)站當(dāng)中能夠快速獲取數(shù)據(jù)。

不然在接口中需要使用遞歸查詢數(shù)據(jù)庫,然后拼接成分類樹的數(shù)據(jù)結(jié)構(gòu)。

這個過程非常麻煩,而且需要多次查詢數(shù)據(jù)庫,性能很差。

因此,可以考慮用一個定時任務(wù),異步將分類樹的數(shù)據(jù),直接緩存到Redis當(dāng)中,定義一個key,比如:MALL_CATEGORY_TREE。

然后接口中直接使用MALL_CATEGORY_TREE這個key從緩存中獲取數(shù)據(jù)即可。

可以直接用key/value字符串保存數(shù)據(jù)。

不過需要注意的是,如果分類樹的數(shù)據(jù)非常多可能會出現(xiàn)大key的問題。

3. 做分布式鎖

分布式鎖可能是使用Redis最常見的場景之一,相對于其他的分布式鎖,比如:數(shù)據(jù)庫分布式鎖或者Zookeeper分布式鎖,基于Redis的分布式鎖,有更好的性能,被廣泛使用于實(shí)際工作中。

我們使用下面這段代碼可以加鎖:

try{
??String?result?=?jedis.set(lockKey,?requestId,?"NX",?"PX",?expireTime);
??if?("OK".equals(result))?{
??????return?true;
??}
??return?false;
}?finally?{
????unlock(lockKey);
}??

但上面這段代碼在有些場景下,會有一些問題,釋放鎖可能會釋放了別人的鎖。

說實(shí)話Redis分布式鎖雖說很常用,但坑也挺多的,如果用不好的話,很容易踩坑。

4. 做排行榜

很多網(wǎng)站有排行榜的功能,比如:商城中有商品銷量的排行榜,游戲網(wǎng)站有玩家獲得積分的排行榜。

通常情況下,我們可以使用Sorted Set保存排行榜的數(shù)據(jù)。

使用ZADD可以添加排行榜的數(shù)據(jù),使用ZRANGE可以獲取排行榜的數(shù)據(jù)。

例如:

ZADD?rank:score?100?"周星馳"
ZADD?rank:score?90?"周杰倫"
ZADD?rank:score?80?"周潤發(fā)"
ZRANGE?rank:score?0?-1?WITHSCORES

返回?cái)?shù)據(jù):

1)?"周星馳"
2)?"100"
3)?"周杰倫"
4)?"90"
5)?"周潤發(fā)"
6)?"80"

5. 記錄用戶登錄狀態(tài)

通常下,用戶登錄成功之后,用戶登錄之后的狀態(tài)信息,會保存到Redis中。

這樣后面該用戶訪問其他接口的時候,會直接從Redis中查詢用戶登錄狀態(tài),如果可以查到數(shù)據(jù),說明用戶已登錄,則允許做后續(xù)的操作。

如果從Redis中沒有查到用戶登錄狀態(tài),說明該用戶沒有登錄,或者登錄狀態(tài)失效了,則直接跳轉(zhuǎn)到用戶登錄頁面。

使用Redis保存用戶登錄狀態(tài),有個好處是它可以設(shè)置一個過期時間,比如:該時間可以設(shè)置成30分鐘。

jedis.set(userId,?userInfo,?1800);

在Redis內(nèi)部有專門的job,會將過期的數(shù)據(jù)刪除,也有獲取數(shù)據(jù)時實(shí)時刪除的邏輯。

6. 限流

使用Redis還有一個非常常用的的業(yè)務(wù)場景是做限流

當(dāng)然還有其他的限流方式,比如:使用nginx,但使用Redis控制可以更精細(xì)。

比如:限制同一個ip,1分鐘之內(nèi)只能訪問10次接口,10分鐘之內(nèi)只能訪問50次接口,1天之內(nèi)只能訪問100次接口。

如果超過次數(shù),則接口直接返回:請求太頻繁了,請稍后重試。

跟上面保存用戶登錄狀態(tài)類似,需要在Redis中保存用戶的請求記錄。

比如:key是用戶ip,value是訪問的次數(shù)從1開始,后面每訪問一次則加1。

如果value超過一定的次數(shù),則直接攔截這種異常的ip。

當(dāng)然也需要設(shè)置一個過期時間,異常ip如果超過這個過期時間,比如:1天,則恢復(fù)正常了,該ip可以再發(fā)起請求了。

或者限制同一個用戶id。

7. 位統(tǒng)計(jì)

比如現(xiàn)在有個需求:有個網(wǎng)站需要統(tǒng)計(jì)一周內(nèi)連續(xù)登陸的用戶,以及一個月內(nèi)登陸過的用戶。

這個需求使用傳統(tǒng)的數(shù)據(jù)庫,實(shí)現(xiàn)起來比較麻煩,但使用Redis的bitmap讓我們可以實(shí)時的進(jìn)行類似的統(tǒng)計(jì)。

bitmap 是二進(jìn)制的byte數(shù)組,也可以簡單理解成是一個普通字符串。它將二進(jìn)制數(shù)據(jù)存儲在byte數(shù)組中以達(dá)到存儲數(shù)據(jù)的目的。

保存數(shù)據(jù)命令使用setbit,語法:

setbit?key?offset?value

具體示例:

setbit?user:view:2024-01-17?123456?1

往bitmap數(shù)組中設(shè)置了用戶id=123456的登錄狀態(tài)為1,標(biāo)記2024-01-17已登錄。

然后通過命令getbit獲取數(shù)據(jù),語法:

getbit?key?offset

具體示例:

getbit?user:view:2024-01-17?123456

如果獲取的值是1,說明這一天登錄了。

如果我們想統(tǒng)計(jì)一周內(nèi)連續(xù)登錄的用戶,只需要遍歷用戶id,根據(jù)日期中數(shù)組中去查詢狀態(tài)即可。

8. 緩存加速

我們在工作中使用Redis作為緩存加速,這種用法也是非常常見的。

如果查詢訂單數(shù)據(jù),先從Redis緩存中查詢,如果緩存中存在,則直接將數(shù)據(jù)返回給用戶。

如果緩存中不存在,則再從數(shù)據(jù)庫中查詢數(shù)據(jù),如果數(shù)據(jù)存在,則將數(shù)據(jù)保存到緩存中,然后再返回給用戶。

如果緩存和數(shù)據(jù)庫都不存在,則直接給用戶返回?cái)?shù)據(jù)不存在。

流程圖如下:

bcbc6202403041003394689.png

但使用緩存加速的業(yè)務(wù)場景,需要注意一下,可能會出現(xiàn):緩存擊穿、穿透和雪崩等問題。

9. 做消息隊(duì)列

我們說起隊(duì)列經(jīng)常想到是:kafka、rabbitMQ、RocketMQ等這些分布式消息隊(duì)列。

其實(shí)Redis也有消息隊(duì)列的功能,我們之前有個支付系統(tǒng),就是用的Redis隊(duì)列功能。

PubSub(發(fā)布訂閱)是Redis2.0版本引入的消息傳遞模型。

顧名思義,消費(fèi)者可以訂閱一個或多個channel,生產(chǎn)者向?qū)?yīng)channel發(fā)送消息后,所有訂閱者都能收到相關(guān)消息。對應(yīng)channel發(fā)送消息后,所有訂閱者都能收到相關(guān)消息。

在java代碼中可以實(shí)現(xiàn)MessageListener接口,來消費(fèi)隊(duì)列中的消息。

@Slf4j
@Component
public?class?RedisMessageListenerListener?implements?MessageListener?{
????@Autowired
????private?RedisTemplate<String,?Object>?redisTemplate;

????@Override
????public?void?onMessage(Message?message,?byte[]?pattern)?{
????????String?channel?=?new?String(pattern);
????????RedisSerializer<?>?valueSerializer?=?redisTemplate.getValueSerializer();
????????Object?deserialize?=?valueSerializer.deserialize(message.getBody());
????????if?(deserialize?==?null)?return;
????????String?md5DigestAsHex?=?DigestUtils.md5DigestAsHex(deserialize.toString().getBytes(StandardCharsets.UTF_8));
????????Boolean?result?=?redisTemplate.opsForValue().setIfAbsent(md5DigestAsHex,?"1",?20,?TimeUnit.SECONDS);
????????if?(Boolean.TRUE.equals(result))?{
????????????log.info("接收的結(jié)果:{}",?deserialize.toString());
????????}?else?{
????????????log.info("其他服務(wù)處理中");
????????}
????}
}

10. 生成全局ID

在有些需要生成全局ID的業(yè)務(wù)場景,其實(shí)也可以使用Redis。

可以使用incrby命令,利用原子性操作,可以執(zhí)行下面這個命令:

incrby?userid?10000

在分庫分表的場景,對于有些批量操作,我們可以從Redis中,一次性拿一批id出來,然后給業(yè)務(wù)系統(tǒng)使用。

作者:蘇三說技術(shù)

請登錄后查看

CRMEB-慕白寒窗雪 最后編輯于2024-03-04 10:06:03

快捷回復(fù)
回復(fù)
回復(fù)
回復(fù)({{post_count}}) {{!is_user ? '我的回復(fù)' :'全部回復(fù)'}}
排序 默認(rèn)正序 回復(fù)倒序 點(diǎn)贊倒序

{{item.user_info.nickname ? item.user_info.nickname : item.user_name}} LV.{{ item.user_info.bbs_level || item.bbs_level }}

作者 管理員 企業(yè)

{{item.floor}}# 同步到gitee 已同步到gitee {{item.is_suggest == 1? '取消推薦': '推薦'}}
{{item.is_suggest == 1? '取消推薦': '推薦'}}
沙發(fā) 板凳 地板 {{item.floor}}#
{{item.user_info.title || '暫無簡介'}}
附件

{{itemf.name}}

{{item.created_at}}  {{item.ip_address}}
打賞
已打賞¥{{item.reward_price}}
{{item.like_count}}
{{item.showReply ? '取消回復(fù)' : '回復(fù)'}}
刪除
回復(fù)
回復(fù)

{{itemc.user_info.nickname}}

{{itemc.user_name}}

回復(fù) {{itemc.comment_user_info.nickname}}

附件

{{itemf.name}}

{{itemc.created_at}}
打賞
已打賞¥{{itemc.reward_price}}
{{itemc.like_count}}
{{itemc.showReply ? '取消回復(fù)' : '回復(fù)'}}
刪除
回復(fù)
回復(fù)
查看更多
打賞
已打賞¥{{reward_price}}
2489
{{like_count}}
{{collect_count}}
添加回復(fù) ({{post_count}})

相關(guān)推薦

快速安全登錄

使用微信掃碼登錄
{{item.label}} 加精
{{item.label}} {{item.label}} 板塊推薦 常見問題 產(chǎn)品動態(tài) 精選推薦 首頁頭條 首頁動態(tài) 首頁推薦
取 消 確 定
回復(fù)
回復(fù)
問題:
問題自動獲取的帖子內(nèi)容,不準(zhǔn)確時需要手動修改. [獲取答案]
答案:
提交
bug 需求 取 消 確 定
打賞金額
當(dāng)前余額:¥{{rewardUserInfo.reward_price}}
{{item.price}}元
請輸入 0.1-{{reward_max_price}} 范圍內(nèi)的數(shù)值
打賞成功
¥{{price}}
完成 確認(rèn)打賞

微信登錄/注冊

切換手機(jī)號登錄

{{ bind_phone ? '綁定手機(jī)' : '手機(jī)登錄'}}

{{codeText}}
切換微信登錄/注冊
暫不綁定
CRMEB客服

CRMEB咨詢熱線 咨詢熱線

400-8888-794

微信掃碼咨詢

CRMEB開源商城下載 源碼下載 CRMEB幫助文檔 幫助文檔
返回頂部 返回頂部
CRMEB客服