事務
redis 的事務跟之前瞭解的事務不一樣。它是將多個命令請求打包,然後按順序、一次性地執行多個命令。事務執行期間,服務器不會中斷事務而去執行其他客戶端的命令。
注意,redis事務是不支持回滾的。
事務分三步:
事務開始 MULTI,打開事務標識
命令入隊
事務提交執行 EXEC
事務還可以配合watch使用,watch 即樂觀鎖。事務開始前,註冊監視某key,在exec 提交後,發現 watch 的key被修改了,則拒絕執行。
發佈訂閱
過期鍵刪除
對於一些過期鍵的刪除,有三種方式刪除:
刪除策略 |
描述 |
優點 |
缺點 |
定時刪除 |
設置過期時間時,創建定時器;過期時間來臨時,立即執行對鍵的刪除 |
能保證儘快刪除並釋放內存 |
過期鍵較多時耗費CPU,影響服務器的響應時間和吞吐量; |
惰性刪除 |
過期不管,每次獲取鍵時,檢查是否過期,如果過期則刪除 |
取出鍵時才刪除,不消耗CPU |
如果鍵長時間未訪問,可能永遠無法刪除,即內存泄漏 |
定期刪除 |
每隔一段時間,對數據庫進行一次檢查,選擇性地刪除裏面的過期鍵。 |
算是前兩種策略的折中 |
取決於定期刪除策略 |
定期刪除採用一定策略來選擇key來刪除:
noeviction:達到限制內存以後再存新數據會返回出錯。
allkeys-lru:淘汰最近沒使用的數據。
volatile-lru:在設置了過期值(expire)的數據裏淘汰最近沒使用的數據。
allkeys-random:隨機淘汰數據。
volatile-random:在設置了過期值(expire)的數據裏隨機淘汰數據。
volatile-ttl:在設置了過期值(expire)的數據裏淘汰快要過期的數據。
慢查詢
一個客戶端的命令執行需要以下幾步:
1.客戶端發送命令到服務器
2.服務器命令排隊
3.服務器執行命令
4.服務器把結果返回給客戶端
慢查詢指的是 執行命令 這一步。當然其他步驟也有可能導致客戶端感知變慢。
慢查詢日誌
當服務器執行命令超過某個設定閾值時,會記錄這次執行的日誌:發生時間、執行時長、命令信息等。這樣我們可以定位慢查詢。
獲取慢查詢日誌
slowlog len
可以獲取慢查詢日誌的長度。
我們也可以取部分來分析,比如取5條
slowlog get 5
慢查詢日誌有4個屬性:
唯一標識ID
命令執行的時間戳,秒
命令執行時長
命令名和參數
清理
清理慢查詢日誌只需要執行:
slowlog reset
慢查詢閾值
在conf文件中設置:
slowlog-log-slower-than=1000
單位微秒,執行超過這個時間的就會被記錄。
1秒 = 1000 毫秒 = 1000 000 微秒
設置 爲負數,則不記錄日誌;設置爲0,會記錄所有日誌
slowlog-max-len
該屬性指定保存慢查詢日誌最大條數。超過則刪除最早的那條
慢查詢的信息存放在 redisServer 下
struct redisServer {
/ **
*/
list *slowlog; /* SLOWLOG list of commands */
long long slowlog_entry_id; /* SLOWLOG current entry ID */
long long slowlog_log_slower_than; /* SLOWLOG time limit (to get logged) */
unsigned long slowlog_max_len; /* SLOWLOG max number of items logged */
}
從上邊看 慢查詢日誌使用雙端鏈表存放的。
/* Push a new entry into the slow log.
* This function will make sure to trim the slow log accordingly to the
* configured max length. */
void slowlogPushEntryIfNeeded(client *c, robj **argv, int argc, long long duration) {
if (server.slowlog_log_slower_than < 0) return; /* Slowlog disabled */
if (duration >= server.slowlog_log_slower_than)
listAddNodeHead(server.slowlog,
slowlogCreateEntry(c,argv,argc,duration));
/* Remove old entries if needed. */
while (listLength(server.slowlog) > server.slowlog_max_len)
listDelNode(server.slowlog,listLast(server.slowlog));
}
添加是在頭部添加,刪除是在尾部進行。
Hyperloglog