Redis資料庫 如何避免網路延遲問題?

2021-09-21 11:40:25 字數 1154 閱讀 6359

我們知道redis協議是構建在tcp協議之上的。所以當我們在指令碼中呼叫redis時,通常是以傳送-應答-再傳送-再應答的模式進行的,而每一次傳送與應答,都需要資料從客戶端到服務端飛一次。而且,這一切都是預設的。

當你需要使用redis處理多個命令時,這樣時間都消耗到網路延遲上可能就不划算了,下面是幾個使用redis時避免網路延遲問題的方法,其實都是不同程度的組合請求:

使用redis新版本中的可變引數命令

在redis2.4中,很多命令的引數都開始支援批量了,如sadd, zadd, lpush, rpush, hmset等,如果你要對同乙個命令帶著不同引數呼叫多次,最好看一看是否其已經支援指引數了。這樣你的命令只需要一次傳送一次接收就行了。

利用redis的pipelining機制

redis本身就支援pipelining模式接受命令,也就是說你可以一次性向redis傳送多個命令,然後再等著他們的返回。返回的結果和你傳送的資料順序也是一致的。比如最簡單的如下例:

$ (echo -en "ping\r\nping\r\nping\r\n"; sleep 1) | nc localhost 6379

+pong

+pong

+pong

當然,這得看你使用的語言客戶端是否支援了。

使用即將發布的lua 指令碼嵌入功能

lua指令碼嵌入功能能夠提供更大的靈活性,你不僅可以自定義組合你的命令。還可以完全在服務端處理你的業務邏輯。而不必將資料取回客戶端處理後再請求客戶端。

使用sort命令來取出多個key

這個有點geek了,如果你使用了雙層索引的形式在redis中組織你的資料,比如第一層索引是乙個list,裡面放置了所有資料key對應id,第二層是通過這些id查詢到具體的value。

比如典型的,如果我們儲存使用者資料,可能儲存上是用uid作為key使用者資訊作為value的,而我們有乙個list,儲存了某種特點使用者的uid列表,比如今天的活躍使用者,那麼當我們需要取出所有活躍使用者資訊的時候,我們不必先獲取到這個list,再用get或者multiget去取使用者資訊。我們完全可以通過乙個如下的sort命令來完成資料獲取。

redis> sort hotuser:list by nonexistentkey get foobar|id|*

其中nonexistent表示按自然順序排序,這樣redis不會進行相應的排序操作,直接返回結果。

如何避免資料庫被黑

事情的起因從資料庫被黑開始 先前租了一台伺服器,裡面部署了mysql服務,當時密碼隨便設定了下 過了段時間上去一看,所有庫里都剩下一張waring表,長這樣 我還以為裡面會有勒索的資料,開啟一看啥資料都沒 這感覺就像乙個小偷闖入家中,一看這個家一貧如洗,啥都沒幹就走了 這些黑客真是可惡,還瞧不起人。...

go如何操作redis資料庫

通過go向redis寫入資料和讀取資料 func main defer con.close fmt.println redis連線成功 2.通過go向redis寫入資料 string key value err con.do set name bob小公尺 if err nil fmt.printl...

redis快取如何同步資料庫

redis快取如何同步資料庫 redis mysql模式 讀 服務程式先從快取中讀取資料,如果命中,則將資料讀出。如果未命中,則在資料庫中讀取資料,然後將資料寫入到快取中去。更新資料 常見的模式是先到資料庫中寫入,然後刪除快取中的資料。產生的不一致 讀 只是讀資料一般不會有不一致出現。更新 1 資料...