使用規範
一、hgetall 命令
應用介面中使用了大量的hgetall命令從redis中查詢資料資訊,導致redis單例項ops達到秒鐘7w次,redis伺服器cpu使用率達到上限,遇到效能問題。
hgetall key
時間複雜度:o(n)
返回 key 指定的雜湊集中所有的字段和值。返回值中,每個欄位名的下乙個是它的值,所以返回值的長度是雜湊集大小的兩倍
返回值array-reply:雜湊集中欄位和值的列表。當 key 指定的雜湊集不存在時返回空列表。
通過官方文件,可以了解到命令hgetall的時間複雜度為o(n)。這意味著hash的field越多,當使用hgetall獲取全量資料時,效能越差,該命令的效能與field欄位的數量成正比。
遇到問題後,上網查詢資料,解決方案大致兩種:
借助memcached
新增乙個field欄位,將原redis key對應的所有資料資訊全部儲存在該filed中,然後使用hmget命令代替hgetall
但是以上兩種方案,均存在各種弊端,並沒有從根本上解決問題。找公司其他部門技術大拿交流,最終討論出以下方案解決問題:
通過使用redis dump命令獲取到redis序列化後的值,獲取到的是位元組陣列。在應用中將該位元組陣列按照redis協議自行解析成需要的hashmap資料。
方案優點:
dump命令的時間複雜度為o(1),效能優於hgetall
將位元組陣列的解析由redis伺服器轉移到了應用伺服器,減輕了redis 伺服器cpu的運算壓力
充分利用了應用伺服器的cpu,並且應用伺服器方便擴容。
dump key
時間複雜度:o(1)
序列化給定 key ,並返回被序列化的值,使用 restore 命令可以將這個值反序列化為 redis 鍵。
序列化生成的值有以下幾個特點:
它帶有 64 位的校驗和,用於檢測錯誤,restore 在進行反序列化之前會先檢查校驗和。
值的編碼格式和 rdb 檔案保持一致。
rdb 版本會被編碼在序列化值當中,如果因為 redis 的版本不同造成 rdb 格式不相容,那麼 redis 會拒絕對這個值進行反序列化操作。
序列化的值不包括任何生存時間資訊。
返回值如果 key 不存在,那麼返回 nil。 否則,返回序列化之後的值。
二、smembers 命令
smembers 命令是從乙個 set 結構獲取集合,但這個集合資料量已經很大,當這個結合被頻繁的呼叫,會極大的占用網路 io,當網路被佔滿時,其餘的操作也變得慢下來!
同時,檢視了 redis 的連線情況,發現連線數 1000 左右,保持的比較高,又重新檢視 redis 的配置檔案!
配置檔案中 timeout = 0,這表明 redis 預設不會斷開客戶端的連線,這造成的問題:已經無效的連線會造成網路 io 的浪費!
redis版本問題解決
最近在研究redis的集群,redis官方提供了redis trib.rb工具,但是在使用之前 需要安裝ruby,以及redis和ruby連線 yum y install ruby ruby devel rubygems rpm build gem install redis 其中 gem inst...
Django migrate報錯問題解決方案
python3 manage.py makemigrations 生成資料庫遷移檔案 python3 manage.py migrate 遷移資料庫 簡簡單單兩條命令就完成了django的資料庫遷移 但是今天一天的時間都耽誤在這了,一點都不誇張的那種,早上去公司討論需求之後,研究了一下需要更改一下資...
vue axios post 404 問題解決方法
1.在main.js 入口檔案配置 172.20.10.7是我要掉的介面電腦的ip位址 import axios from axios axios.defaults.baseurl 設定乙個類似base url的請求路徑 global.axios axios 設定乙個全域性axios便於呼叫2.然後...