国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Go新項(xiàng)目-調(diào)研關(guān)于go項(xiàng)目中redis的使用場景,lua實(shí)戰(zhàn)(7)

這篇具有很好參考價(jià)值的文章主要介紹了Go新項(xiàng)目-調(diào)研關(guān)于go項(xiàng)目中redis的使用場景,lua實(shí)戰(zhàn)(7)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

Go新項(xiàng)目-調(diào)研關(guān)于go項(xiàng)目中redis的使用場景,lua實(shí)戰(zhàn)(7),Go,golang,redis,lua

參考地址

  • https://juejin.cn/post/7079756129433370638
  • https://blog.csdn.net/gaogaoshan/article/details/41039581
  • https://redis.io/docs/clients/go/

redis的使用場景的解釋

下面一一來分析下Redis的應(yīng)用場景都有哪些。

1、緩存

緩存現(xiàn)在幾乎是所有中大型網(wǎng)站都在用的必殺技,合理的利用緩存不僅能夠提升網(wǎng)站訪問速度,還能大大降低數(shù)據(jù)庫的壓力。Redis提供了鍵過期功能,也提供了靈活的鍵淘汰策略,所以,現(xiàn)在Redis用在緩存的場合非常多。

2、排行榜

很多網(wǎng)站都有排行榜應(yīng)用的,如京東的月度銷量榜單、商品按時(shí)間的上新排行榜等。Redis提供的有序集合數(shù)據(jù)類構(gòu)能實(shí)現(xiàn)各種復(fù)雜的排行榜應(yīng)用。

3、計(jì)數(shù)器

什么是計(jì)數(shù)器,如電商網(wǎng)站商品的瀏覽量、視頻網(wǎng)站視頻的播放數(shù)等。為了保證數(shù)據(jù)實(shí)時(shí)效,每次瀏覽都得給+1,
并發(fā)量高時(shí)如果每次都請(qǐng)求數(shù)據(jù)庫操作無疑是種挑戰(zhàn)和壓力。Redis提供的incr命令來實(shí)現(xiàn)計(jì)數(shù)器功能,內(nèi)存操作,性能非常好,非常適用于這些計(jì)數(shù)場景。

4、分布式會(huì)話

集群模式下,在應(yīng)用不多的情況下一般使用容器自帶的session復(fù)制功能就能滿足,當(dāng)應(yīng)用增多相對(duì)復(fù)雜的系統(tǒng)中,一般都會(huì)搭建以Redis等內(nèi)存數(shù)據(jù)庫為中心
的session服務(wù),session不再由容器管理,而是由session服務(wù)及內(nèi)存數(shù)據(jù)庫管理。

5、分布式鎖

在很多互聯(lián)網(wǎng)公司中都使用了分布式技術(shù),分布式技術(shù)帶來的技術(shù)挑戰(zhàn)是對(duì)同一個(gè)資源的并發(fā)訪問,如全局ID、減庫存、秒殺等場景,
并發(fā)量不大的場景可以使用數(shù)據(jù)庫的悲觀鎖、樂觀鎖來實(shí)現(xiàn),但在并發(fā)量高的場合中,利用數(shù)據(jù)庫鎖來控制資源的并發(fā)訪問是不太理想的,
大大影響了數(shù)據(jù)庫的性能。可以利用Redis的setnx功能來編寫分布式的鎖,如果設(shè)置返回1說明獲取鎖成功,否則獲取鎖失敗,實(shí)際應(yīng)用中要考慮的細(xì)節(jié)要更多。

6、社交網(wǎng)絡(luò)

點(diǎn)贊、踩、關(guān)注/被關(guān)注、共同好友等是社交網(wǎng)站的基本功能,社交網(wǎng)站的訪問量通常來說比較大,而且傳統(tǒng)的關(guān)系數(shù)據(jù)庫類型不適合存儲(chǔ)這種類型的數(shù)據(jù),
Redis提供的哈希、集合等數(shù)據(jù)結(jié)構(gòu)能很方便的的實(shí)現(xiàn)這些功能。

7、最新列表

Redis列表結(jié)構(gòu),LPUSH可以在列表頭部插入一個(gè)內(nèi)容ID作為關(guān)鍵字,LTRIM可用來限制列表的數(shù)量,這樣列表永遠(yuǎn)為N個(gè)ID,無需查詢最新的列表,
直接根據(jù)ID去到對(duì)應(yīng)的內(nèi)容頁即可。

8、消息系統(tǒng)

消息隊(duì)列是大型網(wǎng)站必用中間件,如ActiveMQ、RabbitMQ、Kafka等流行的消息隊(duì)列中間件,主要用于業(yè)務(wù)解耦、流量削峰及異步處理實(shí)時(shí)性低的業(yè)務(wù)。
Redis提供了發(fā)布/訂閱及阻塞隊(duì)列功能,能實(shí)現(xiàn)一個(gè)簡單的消息隊(duì)列系統(tǒng)。另外,這個(gè)不能和專業(yè)的消息中間件相比。

9、地理位置

使用Redis的Geo數(shù)據(jù)類型可以存儲(chǔ)地理位置信息,實(shí)現(xiàn)地理位置相關(guān)的查詢和分析。

10、搜索引擎

Redis的Sorted Set可以用來存儲(chǔ)有序數(shù)據(jù),例如排行榜、搜索結(jié)果等。
在Go語言中,可以使用ZADD、ZRANGE等命令來實(shí)現(xiàn)對(duì)Sorted Set的操作,實(shí)現(xiàn)搜索引擎的功能。

常用命令

  • SET 和 GET:用于設(shè)置和獲取字符串類型的值;
  • HSET、HGET、HMSET、HMGET:用于設(shè)置和獲取哈希類型的值;
  • LPUSH、RPUSH、LPOP、RPOP:用于操作列表類型的值;
  • SADD、SREM、SMEMBERS:用于操作集合類型的值;
  • ZADD、ZREM、ZRANGE:用于操作有序集合類型的值;
  • INCR、INCRBY、DECR、DECRBY:用于對(duì)整數(shù)類型的值進(jìn)行原子性的加減操作;
  • EXPIRE、TTL:用于設(shè)置和查詢鍵的過期時(shí)間;
  • PUBLISH、SUBSCRIBE:用于實(shí)現(xiàn) Redis 的發(fā)布訂閱功能;
  • MULTI、EXEC、WATCH、UNWATCH:用于實(shí)現(xiàn) Redis 的事務(wù)功能;
  • SCAN:用于迭代大量的鍵,避免阻塞 Redis 服務(wù)器。

實(shí)際場景

  • 緩存
  • 數(shù)據(jù)共享分布式
  • 分布式鎖
  • 全局ID
  • 計(jì)數(shù)器
  • 限流
  • 位統(tǒng)計(jì)
  • 購物車
  • 用戶消息時(shí)間線timeline
  • 消息隊(duì)列
  • 抽獎(jiǎng)
  • 點(diǎn)贊、簽到、打卡
  • 商品標(biāo)簽
  • 商品篩選
  • 用戶關(guān)注、推薦模型
  • 排行榜
1、緩存

String類型

例如:熱點(diǎn)數(shù)據(jù)緩存(例如報(bào)表、明星出軌),對(duì)象緩存、全頁緩存、可以提升熱點(diǎn)數(shù)據(jù)的訪問數(shù)據(jù)。

2、數(shù)據(jù)共享分布式

String 類型,因?yàn)?Redis 是分布式的獨(dú)立服務(wù),可以在多個(gè)應(yīng)用之間共享

例如:分布式Session

<dependency> 
 <groupId>org.springframework.session</groupId> 
 <artifactId>spring-session-data-redis</artifactId> 
</dependency>
3、分布式鎖

String 類型setnx方法,只有不存在時(shí)才能添加成功,返回true

public static boolean getLock(String key) {
Long flag = jedis.setnx(key, "1");
if (flag == 1) {
jedis.expire(key, 10);
}
return flag == 1;
}

public static void releaseLock(String key) {
jedis.del(key);
}
4、全局ID

int類型,incrby,利用原子性

incrby userid 1000

分庫分表的場景,一次性拿一段

5、計(jì)數(shù)器
int類型,incr方法

例如:文章的閱讀量、微博點(diǎn)贊數(shù)、允許一定的延遲,先寫入Redis再定時(shí)同步到數(shù)據(jù)庫

6、限流

int類型,incr方法

以訪問者的ip和其他信息作為key,訪問一次增加一次計(jì)數(shù),超過次數(shù)則返回false

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

String類型的bitcount(1.6.6的bitmap數(shù)據(jù)結(jié)構(gòu)介紹)

字符是以8位二進(jìn)制存儲(chǔ)的

set k1 a
setbit k1 6 1
setbit k1 7 0
get k1
/* 6 7 代表的a的二進(jìn)制位的修改
a 對(duì)應(yīng)的ASCII碼是97,轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)是01100001
b 對(duì)應(yīng)的ASCII碼是98,轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)是01100010

因?yàn)閎it非常節(jié)省空間(1 MB=8388608 bit),可以用來做大數(shù)據(jù)量的統(tǒng)計(jì)。
*/

例如:在線用戶統(tǒng)計(jì),留存用戶統(tǒng)計(jì)

setbit onlineusers 01
setbit onlineusers 11
setbit onlineusers 20

支持按位與、按位或等等操作

BITOPANDdestkeykey[key...] ,對(duì)一個(gè)或多個(gè) key 求邏輯并,并將結(jié)果保存到 destkey 。       
BITOPORdestkeykey[key...] ,對(duì)一個(gè)或多個(gè) key 求邏輯或,并將結(jié)果保存到 destkey 。
BITOPXORdestkeykey[key...] ,對(duì)一個(gè)或多個(gè) key 求邏輯異或,并將結(jié)果保存到 destkey 。
BITOPNOTdestkeykey ,對(duì)給定 key 求邏輯非,并將結(jié)果保存到 destkey 。

計(jì)算出7天都在線的用戶

BITOP "AND" "7_days_both_online_users" "day_1_online_users" "day_2_online_users" ...  "day_7_online_users"
8、購物車

String 或hash。所有String可以做的hash都可以做

key:用戶id;field:商品id;value:商品數(shù)量。
+1:hincr。-1:hdecr。刪除:hdel。全選:hgetall。商品數(shù):hlen。
9、用戶消息時(shí)間線timeline

list,雙向鏈表,直接作為timeline就好了。插入有序

10、消息隊(duì)列

List提供了兩個(gè)阻塞的彈出操作:blpop/brpop,可以設(shè)置超時(shí)時(shí)間

blpop:blpop key1 timeout 移除并獲取列表的第一個(gè)元素,如果列表沒有元素會(huì)阻塞列表直到等待超時(shí)或發(fā)現(xiàn)可彈出元素為止。
brpop:brpop key1 timeout 移除并獲取列表的最后一個(gè)元素,如果列表沒有元素會(huì)阻塞列表直到等待超時(shí)或發(fā)現(xiàn)可彈出元素為止。
上面的操作。其實(shí)就是java的阻塞隊(duì)列。學(xué)習(xí)的東西越多。學(xué)習(xí)成本越低
  • 隊(duì)列:先進(jìn)先除:rpush blpop,左頭右尾,右邊進(jìn)入隊(duì)列,左邊出隊(duì)列
  • 棧:先進(jìn)后出:rpush brpop
11、抽獎(jiǎng)

自帶一個(gè)隨機(jī)獲得值

spop myset
12、點(diǎn)贊、簽到、打卡

假如上面的微博ID是t1001,用戶ID是u3001

用 like:t1001 來維護(hù) t1001 這條微博的所有點(diǎn)贊用戶

  • 點(diǎn)贊了這條微博:sadd like:t1001 u3001
  • 取消點(diǎn)贊:srem like:t1001 u3001
  • 是否點(diǎn)贊:sismember like:t1001 u3001
  • 點(diǎn)贊的所有用戶:smembers like:t1001
  • 點(diǎn)贊數(shù):scard like:t1001
13、商品標(biāo)簽

老規(guī)矩,用 tags:i5001 來維護(hù)商品所有的標(biāo)簽。

sadd tags:i5001 畫面清晰細(xì)膩
sadd tags:i5001 真彩清晰顯示屏
sadd tags:i5001 流程至極
14、商品篩選
// 獲取差集
sdiff set1 set2
// 獲取交集(intersection)
sinter set1 set2
// 獲取并集
sunion set1 set2

假如:iPhone15 上市了

sadd brand:apple iPhone11
sadd brand:ios iPhone11
sad screensize:6.0-6.24 iPhone11
sad screentype:lcd iPhone 11

篩選商品,蘋果的、ios的、屏幕在6.0-6.24之間的,屏幕材質(zhì)是LCD屏幕

sinter brand:apple brand:ios screensize:6.0-6.24 screentype:lcd
15、用戶關(guān)注、推薦模型

follow 關(guān)注 fans 粉絲

相互關(guān)注:

sadd 1:follow 2
sadd 2:fans 1
sadd 1:fans 2
sadd 2:follow 1

我關(guān)注的人也關(guān)注了他(取交集):

sinter 1:follow 2:fans

可能認(rèn)識(shí)的人:

用戶1可能認(rèn)識(shí)的人(差集):sdiff 2:follow 1:follow
用戶2可能認(rèn)識(shí)的人:sdiff 1:follow 2:follow
16、排行榜

id 為6001 的新聞點(diǎn)擊數(shù)加1:

zincrby hotNews:20190926 1 n6001

獲取今天點(diǎn)擊最多的15條:文章來源地址http://www.zghlxwxcb.cn/news/detail-801116.html

zrevrange hotNews:20190926 0 15 withscores

go的incr+expire原子性操作之調(diào)用lua腳本

  • 它實(shí)現(xiàn)了 incr 和 expire 的原子化操作,并且在 key 不存在和 key 已經(jīng)過期的情況下也能正常工作。
package main

import (
   "context"
   "fmt"
   "github.com/go-redis/redis/v8"
   "time"
)

// Lua腳本
// 通過執(zhí)行一個(gè) Lua 腳本來實(shí)現(xiàn)原子化的 incr 和 expire 操作。如果該 key 的過期時(shí)間已經(jīng)設(shè)置為 -1,
// 則表示該 key 沒有過期時(shí)間,此時(shí)通過 expire 命令為該 key 設(shè)置過期時(shí)間。
func main(){
   client := redis.NewClient(&redis.Options{
       Addr:     "localhost:6379",
       Password: "123456",
       DB:       10,
   })
   defer client.Close()

   result1, err1 := IncrWithTTL(client, "counter", 3600)
   if err1 != nil {
       fmt.Println(err1)
   } else {
       fmt.Println(result1)
   }
}

func IncrWithTTL(client *redis.Client, key string, ttl time.Duration) (int64, error) {
    script := redis.NewScript(`
    local value = redis.call("incr", KEYS[1])
                if redis.call("ttl", KEYS[1]) == -1 then
                redis.call("expire", KEYS[1], ARGV[1])
                end
                return value
    `)
    result, err := script.Run(context.Background(), client, []string{key}, ttl.String()).Result()
    if err != nil {
         return 0, err
    }
    return result.(int64), nil
}

到了這里,關(guān)于Go新項(xiàng)目-調(diào)研關(guān)于go項(xiàng)目中redis的使用場景,lua實(shí)戰(zhàn)(7)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Go新項(xiàng)目-配置文件的選取及區(qū)別和寫法(1)

    Go新項(xiàng)目-配置文件的選取及區(qū)別和寫法(1)

    先說結(jié)論:我們選型TOML yaml,toml,json,ini 實(shí)際業(yè)務(wù)都有用 實(shí)際栗子是:我們想要把Go的切片作為配置文件,YAML寫起來比較吃力,TOML就很容易了。 配置文件是用于配置計(jì)算機(jī)程序的參數(shù)、初始化設(shè)置的文件、業(yè)務(wù)數(shù)據(jù)公共配置等。如果沒有這些配置,我們的程序就會(huì)硬編碼

    2024年01月18日
    瀏覽(25)
  • Go新項(xiàng)目-Gin中wire的依賴注入方式實(shí)戰(zhàn)(6)

    Go新項(xiàng)目-Gin中wire的依賴注入方式實(shí)戰(zhàn)(6)

    選型Go項(xiàng)目過程中,針對(duì)依賴注入方式的分析和使用 https://go.dev/blog/wire https://medium.com/@dche423/master-wire-cn-d57de86caa1b https://toutiao.io/posts/et0t2lk/preview https://imlht.com/archives/223/ https://lailin.xyz/post/go-training-week4-wire.html https://luenci.me/2022/01/08/%E8%81%8A%E8%81%8AWire%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%

    2024年01月18日
    瀏覽(44)
  • 如何使用Visual Studio創(chuàng)建第一個(gè)新項(xiàng)目

    如何使用Visual Studio創(chuàng)建第一個(gè)新項(xiàng)目

    第一步,打開Visual Studio進(jìn)行創(chuàng)建新項(xiàng)目 這里可以選擇空項(xiàng)目 在這里設(shè)置項(xiàng)目名稱及位置(建議新建一個(gè)文件夾存放自己的代碼) 在源文件里新建 新建源文件進(jìn)行編寫代碼 這里可以選擇文件類型設(shè)置名稱 編寫程序后,進(jìn)行運(yùn)行 如果沒有錯(cuò)誤的話,運(yùn)行成功 到這里的話,你

    2024年02月12日
    瀏覽(93)
  • 如何使用Vue的ui界面創(chuàng)建一個(gè)新項(xiàng)目

    如何使用Vue的ui界面創(chuàng)建一個(gè)新項(xiàng)目

    第一步: win+r打開命令提示符,然后輸入cmd后回車。 第二步: 在命令行輸入命令vue ui(中間有空格)后回車,彈出ui界面。 第三步: 點(diǎn)擊創(chuàng)建,雙擊地址欄確定我們要保存框架的地址,回車確定該地址,然后點(diǎn)擊下面的 ? 第四步: 完成第三步進(jìn)入以下界面: 依次輸入項(xiàng)目名

    2024年02月05日
    瀏覽(96)
  • 編程語言:微軟 Azure CTO 表示,是時(shí)候停止在新項(xiàng)目中使用 C 和 C++

    Azure CTO Mark Russinovich 說,業(yè)界應(yīng)該將 C 和 C++ 語言視為“已棄用”。 Windows 11 22H2:如何獲得微軟最新的操作系統(tǒng)更新以及接下來會(huì)發(fā)生什么 Microsoft Azure 的首席技術(shù)官 Mark Russinovich 表示,出于安全性和可靠性的考慮,開發(fā)人員應(yīng)避免在新項(xiàng)目中使用 C 或 C++ 編程語言,而應(yīng)使用

    2024年02月06日
    瀏覽(18)
  • Gitlab 新項(xiàng)目搭建

    Gitlab 新項(xiàng)目搭建

    項(xiàng)目名稱與本地新建項(xiàng)目名稱相同 進(jìn)入本地項(xiàng)目根目錄下,右擊 git bash here打開命令窗口; 初始化本地倉庫; 提交至?xí)捍鎱^(qū); 提交項(xiàng)目。 建立本地倉庫和遠(yuǎn)端 Gitlab 倉庫關(guān)系; 2.拉取一下遠(yuǎn)程倉庫內(nèi)容; 推送本地內(nèi)容到遠(yuǎn)程倉庫。 出現(xiàn)以下問題: 原因就是 Gitlab 的倉庫中

    2024年02月13日
    瀏覽(94)
  • 新項(xiàng)目搞完啦?。。? decoding=

    新項(xiàng)目搞完啦?。?!

    大家好,我是魚皮。 經(jīng)過了 7 場直播,總時(shí)長近 20 小時(shí),我在 自己的編程導(dǎo)航 的第 5 個(gè) 全程直播開發(fā) 的項(xiàng)目 —— 智能 BI 項(xiàng)目,完結(jié)啦! 我在這里對(duì)該項(xiàng)目做一個(gè)簡單的總結(jié),希望讓更多需要它的同學(xué)看到,把它變成自己的項(xiàng)目~ 這次做的是一個(gè)順應(yīng)潮流的項(xiàng)目, 基于

    2024年02月11日
    瀏覽(94)
  • 筆記 | FastAPI創(chuàng)建新項(xiàng)目

    筆記 | FastAPI創(chuàng)建新項(xiàng)目

    當(dāng)使用FastAPI創(chuàng)建項(xiàng)目時(shí),首先需要安裝FastAPI和其依賴項(xiàng)??梢允褂胮ip來安裝它們。請(qǐng)確保已經(jīng)安裝了Python和pip。 創(chuàng)建項(xiàng)目文件夾并進(jìn)入該文件夾: 創(chuàng)建并激活一個(gè)新的Python虛擬環(huán)境(可選,但強(qiáng)烈推薦): 安裝FastAPI和uvicorn(FastAPI的服務(wù)器): 創(chuàng)建一個(gè)名為 main.py 的文件

    2024年02月06日
    瀏覽(99)
  • 新項(xiàng)目如何推送Git

    新項(xiàng)目如何推送Git

    一、在git新建一個(gè)空的倉庫,不用任何模版,直接創(chuàng)建即可 完成后,copy倉庫地址 二、本地新建項(xiàng)目,進(jìn)入到本地項(xiàng)目命令行,也可以打開終端,其實(shí)是相通的:執(zhí)行命令git init, 此時(shí)在項(xiàng)目上右擊就發(fā)想有g(shù)it選項(xiàng),點(diǎn)擊add添加,接著正常commit,然后push 在push的時(shí)候會(huì)發(fā)現(xiàn)有

    2024年02月12日
    瀏覽(93)
  • idea新項(xiàng)目上傳git

    idea新項(xiàng)目上傳git

    關(guān)于idea新項(xiàng)目怎么上傳到git,今天整理一下操作的步驟。來做一個(gè)記錄! 1.首先要在項(xiàng)目上右擊打開終端或者在idea的下方有一個(gè)快捷按鈕 按照上面的截圖進(jìn)行操作,打開終端窗口 2.然后在終端窗口中輸入 git init 命令,會(huì)出現(xiàn)如圖樣子 3.然后右擊項(xiàng)目會(huì)出現(xiàn)git的選項(xiàng),然后按

    2024年02月12日
    瀏覽(91)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包