Redis簡單瞭解三

 

事務

redis 的事務跟之前瞭解的事務不一樣。它是將多個命令請求打包,然後按順序、一次性地執行多個命令。事務執行期間,服務器不會中斷事務而去執行其他客戶端的命令。

注意,redis事務是不支持回滾的。

事務分三步:

事務開始 MULTI,打開事務標識
命令入隊 
事務提交執行 EXEC

事務還可以配合watch使用,watch 即樂觀鎖。事務開始前,註冊監視某key,在exec 提交後,發現 watch 的key被修改了,則拒絕執行。

 

發佈訂閱

 

 

過期鍵刪除

對於一些過期鍵的刪除,有三種方式刪除:

刪除策略

描述

優點

缺點

定時刪除

設置過期時間時,創建定時器;過期時間來臨時,立即執行對鍵的刪除

能保證儘快刪除並釋放內存

過期鍵較多時耗費CPU,影響服務器的響應時間和吞吐量;
用一個鏈表維護定時器,操作性差

惰性刪除

過期不管,每次獲取鍵時,檢查是否過期,如果過期則刪除

取出鍵時才刪除,不消耗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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章