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

redis鍵空間通知使用實現(xiàn)

 更新時間:2021年08月31日 15:56:44   作者:今天又鴿了  
這篇文章主要介紹了redis鍵空間通知使用實現(xiàn)

導語

最近在開發(fā)一個定時活動,而且活動是多個場次的。這個是后就需要在活動開始的時候推送信息給客戶端,結束的時候也要推送一次。簡單的設計方案就是將配置緩存在redis,然后每隔一秒就輪詢reids,獲取配置信息,然后判斷是不是到活動開始或者結束的時間點,然后推送給客戶端。

但是,這里會有一個問題,如果沒有到活動開始或結束的時間點,這里會造成很多無用的輪詢操作。這個操作不但增大了對這個key的訪問量,同時也會占用cpu,降低機器性能。

redis在2.8.0版本提供了一個鍵空間通知功能機制,對于這個功能的詳細描述,可以查閱官方文檔。簡單總結就是,客戶端可以訂閱一個key,當這個可以發(fā)生改變時,redis會通知到已經(jīng)訂閱的客戶端。

實現(xiàn)

這個實現(xiàn)也很簡單,我們可以通過一個demo來看看如何使用這個機制。

package main

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

var redisCli *redis.Client

func init() {
   // 連接redis
   redisCli = redis.NewClient(&redis.Options{
      Addr:     "127.0.0.1:6379",
      Password: "redis123",
   })
}

/*
 * redis key 過期自動通知
 */
func SetExpireEvent() {
   // 設置一個鍵,并且3秒鐘之后過期
   redisCli.Set(context.Background(), "test_expire_event_notify", "測試鍵值過期通知", 3*time.Second)
}

func SubExpireEvent() {
   // 訂閱key過期事件
   sub := redisCli2.Subscribe(context.Background(), "__keyevent@0__:expired")
   
   // 這里通過一個for循環(huán)監(jiān)聽redis-server發(fā)來的消息。
   // 當客戶端接收到redis-server發(fā)送的事件通知時,
   // 客戶端會通過一個channel告知我們。我們再根據(jù)
   // msg的channel字段來判斷是不是我們期望收到的消息,
   // 然后再進行業(yè)務處理。
   for {
      msg := <-sub.Channel()
      fmt.Println("Channel ", msg.Channel)
      fmt.Println("pattern ", msg.Pattern)
      fmt.Println("pattern ", msg.Payload)
      fmt.Println("PayloadSlice ", msg.PayloadSlice)
   }
}

func main() {
   SetExpireEvent()
   go SubExpireEvent()
   
   // 這里sleep是為了防止main方法直接推出
   time.Sleep(10 * time.Second)
}

代碼結果輸出如下:

上面代碼實現(xiàn)邏輯很簡單,核心邏輯就是訂閱__keyevent@0__:expired這個事件,然后一個循環(huán)等待事件的通知。值得注意的是,要啟用這個特性需要修改配置文件,啟用notify-keyspace-events這個配置,可以參考配置文件中的注釋對不同事件進行啟用。

在業(yè)務中使用

回到開始提及的業(yè)務場景,如何在這種場景中使用redis的機制呢?其實很簡單,當活動配置到數(shù)據(jù)庫之后,會有一個更新緩存的步驟。在將數(shù)據(jù)設置在活動緩存時,只要我們計算當前時間到活動開始/結束這個時間差,將這個差作為鍵的過期時間。

例如,活動id1的開始時間為t0, 結束時間為t2, 當前時間為t。這個時候就可以這么設置:

// 活動開始的key設置
redisCli.Set(context.Background(), "id1:start", "活動開始了", t0 - t)
// 活動結束結束的key設置
redisCli.Set(context.Background(), "id1:start", "活動開始了", t1 - t)

通過這么設置,當活動開啟/結束就可以接收到相應的通知了。

總結

這種方案其實可以完全滿足文中的需求場景,但是這種方案其實也存在一些問題。其實這些問題在redis文檔中也有相應說明。

  • 第一,redis-server在推送這個事件通知時,只要訂閱了這個事件的客戶端端都會收到這個消息。通常,我們的業(yè)務都是跑在多個結點中,所以這個時候就要根據(jù)場景看要不要進行業(yè)務的原子操作。
  • 第二,redis-server只會推送一次這個通知。假如說在redis-server推送這個通知時,結點掛了或者由于其他異常情況沒有收到消息,redis-server不會再重新推送。
  • 第三,通知可能會延遲。由于redis實現(xiàn)機制,對于過期的鍵,會有兩種機制進行處理,一種是當命令訪問鍵時,發(fā)現(xiàn)鍵已過期。另一種是通過后臺系統(tǒng)在后臺逐步查找過期的鍵,以便能夠收集那些從未被訪問的鍵。所以會有出現(xiàn)延遲的可能。

本文介紹了使用redis的鍵空間通知機制來實現(xiàn)了一種業(yè)務場景,當然這種方式并不是最好的,還有其他方式來實現(xiàn)。在實際開發(fā)中會有很多的因素要考慮,而且實現(xiàn)方式也是多種多樣,這個就需要我們分析每一種方案的利弊,然后進行抉擇。

到此這篇關于redis鍵空間通知使用實現(xiàn)的文章就介紹到這了,更多相關redis鍵空間通知 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • redis內(nèi)存空間效率問題的深入探究

    redis內(nèi)存空間效率問題的深入探究

    redis緩存固然高效,可是它會占用我們系統(tǒng)中寶貴的內(nèi)存資源,那該如何解決呢?這篇文章主要給大家介紹了關于redis內(nèi)存空間效率問題的相關資料,需要的朋友可以參考下
    2021-05-05
  • Redis 設置密碼無效問題解決

    Redis 設置密碼無效問題解決

    本文主要介紹了Redis 設置密碼無效問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • Redis指南及6.2.x版本安裝過程

    Redis指南及6.2.x版本安裝過程

    Redis?是完全開源免費的,遵守BSD協(xié)議,是一個高性能(NOSQL)的key-value數(shù)據(jù)庫,Redis是一個開源的使用ANSI?C語言編寫、支持網(wǎng)絡、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API,本文給大家介紹Redis介紹及6.2.x版本安裝,感興趣的朋友一起看看吧
    2025-06-06
  • redis集合類型_動力節(jié)點Java學院整理

    redis集合類型_動力節(jié)點Java學院整理

    這篇文章給大家介紹了redis集合類型的常用方法,感興趣的朋友參考下吧
    2017-08-08
  • 基于Redis實現(xiàn)共享Session登錄的實現(xiàn)

    基于Redis實現(xiàn)共享Session登錄的實現(xiàn)

    本文主要介紹了基于Redis實現(xiàn)共享Session登錄的實現(xiàn),包括發(fā)送短信驗證碼、短信驗證碼登錄和注冊、以及登錄狀態(tài)校驗的流程,具有一定的參考價值,感興趣的可以了解一下
    2025-03-03
  • 多維度深入分析Redis的5種基本數(shù)據(jù)結構

    多維度深入分析Redis的5種基本數(shù)據(jù)結構

    此篇文章主要對Redis的5種基本數(shù)據(jù)類型,即字符串(String)、列表(List)、散列(Hash)、集合(Set)、有序集合(Sorted?Set),從使用場景和底層結構出發(fā),進行多維度深入分析。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-11-11
  • Redis集群搭建(主從模式、哨兵模式、集群模式)

    Redis集群搭建(主從模式、哨兵模式、集群模式)

    本文主要介紹了Redis集群搭建,主要包括主從模式、哨兵模式、集群模式這三種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-01-01
  • 詳解Redis主從復制實踐

    詳解Redis主從復制實踐

    本文將演示主從復制如何配置、實現(xiàn)以及實現(xiàn)原理,Redis主從復制三大策略,全量復制、部分復制和立即復制。
    2021-05-05
  • redis restore 命令的用法實例詳解

    redis restore 命令的用法實例詳解

    Redis的RESTORE命令用于將DUMP生成的序列化數(shù)據(jù)恢復為鍵值,適用于數(shù)據(jù)遷移、備份恢復和跨實例同步,本文介紹redis restore 命令的用法,感興趣的朋友一起看看吧
    2025-02-02
  • redis key命名規(guī)范的設計

    redis key命名規(guī)范的設計

    如果結構規(guī)劃不合理、命令使用不規(guī)范,會造成系統(tǒng)性能達到瓶頸、活動高峰系統(tǒng)可用性下降,也會增大運維難度,本文主要介紹了redis key命名規(guī)范的設計,感興趣的可以了解一下
    2024-03-03

最新評論

武隆县| 潼南县| 五原县| 汽车| 宜兴市| 泗水县| 新余市| 石首市| 桂阳县| 芒康县| 根河市| 吐鲁番市| 册亨县| 土默特左旗| 汝阳县| 温宿县| 永修县| 于田县| 巍山| 福泉市| 洪江市| 广州市| 筠连县| 濮阳市| 阳泉市| 雷山县| 疏勒县| 绵竹市| 马关县| 江阴市| 磐石市| 晋江市| 陕西省| 遂川县| 广昌县| 温州市| 平乐县| 阿拉善右旗| 林芝县| 吉安市| 徐州市|