數據類型可以存儲操作字符串、整數或浮點數的值,以便對整個字符串或字符串的壹部分執行操作。
對整數和浮點數執行自增或自減運算。LIST從兩端列出推入或彈出元素。
讀取單個或多個元素
修剪,在壹個範圍內只留下壹組無序的元素。添加、獲取和移除單個元素。
檢查集合中是否存在元素。
計算交集、並集和差集。
從集合中隨機獲取元素的哈希。添加、獲取和移除單個鍵-值對。
獲取所有鍵值對
檢查是否有壹個鍵的ZSET有序集。添加、獲取和刪除元素。
根據分數範圍或成員獲取元素。
計算密鑰的等級
Redis數據結構看起來像什麽
1.2的主從復制怎麽樣。Redis實現了?
將從服務器連接到主服務器,並發送同步命令;
收到同步命名後,主服務器開始執行BGSAVE命令以生成RDB文件,並使用緩沖區記錄此後執行的所有寫命令。
主服務器BGSAVE執行後,向所有從服務器發送快照文件,發送過程中繼續記錄執行的寫命令;
從服務器接收到快照文件後,丟棄所有舊數據,並加載接收到的快照;
在主服務器的快照發送後,開始向從服務器發送緩沖區中的寫命令;
從服務器完成加載快照,開始接收命令請求,並從主服務器的緩沖區執行寫命令;
1.3的關鍵是怎樣的。Redis地址?
背景
(1)redis中的每個數據庫都是由redisDb結構存儲的。其中包括:
RedisDb.id存儲redis數據庫的整數。
RedisDb.dict存儲庫的所有鍵值對數據。
RedisDb.expires保存每個密鑰的過期時間。
(redis服務器初始化時,會預分配16個數據庫(數量可以通過配置文件配置),所有數據庫都保存在結構redis server成員redisServer.db的數組中。當我們選擇database select number時,程序直接通過redisServer.db[number]切換數據庫。有時當程序需要知道它在哪個數據庫中時,它可以直接讀取redisDb.id。
(3)redis字典使用哈希表作為底層實現。Dict類型使用兩個指針指向哈希表,其中0號哈希表(ht[0])主要用於存儲數據庫的所有鍵值,而1號哈希表主要用於程序對0號哈希表進行重散列,重散列壹般在添加新值時觸發,這裏就不贅述了。所以在redis中找壹個鍵,其實就是在dict結構中找ht[0]。
(4)既然是哈希,我們知道會有哈希沖突。當多個鍵被散列為同壹個值時,我們該怎麽辦?Redis使用壹個鏈表來存儲多個哈希沖突的鍵。也就是說,當根據鍵的哈希值找到鏈表時,如果鏈表的長度大於1,那麽我們就需要遍歷鏈表來找到我們要找的鍵。當然,壹般情況下,鏈表的長度是1,所以時間復雜度可以看成o(1)。
解決壹個關鍵問題
redis在得到壹個key後,首先判斷當前庫的哈希表0是否為空,即if(dict->;ht[0]。size == 0).如果為真,直接返回NULL。
判斷哈希表0是否需要重新哈希,因為如果正在執行重新哈希,則兩個表中的壹個可能存儲該密鑰。如果正在進行重散列,會調用壹次_dictRehashStep方法,用_dictRehashStep被動地對數據庫字典和帶散列鍵的字典進行重散列,此處不再贅述。
計算哈希表,根據當前字典和鍵計算哈希值。
根據哈希值和當前字典計算哈希表的索引值。
根據索引值從哈希表中取出鏈表,遍歷鏈表找到鍵的位置。壹般情況下,鏈表的長度是1。
當對ht[0]的搜索完成時,進行第二次再散列判斷。如果不在重散列中,則直接結束,否則,對於ht[1]重復步驟345。
1.4的集群模式怎麽樣。Redis實現了?
Rediscoluster是Redis的分布式解決方案,在Redis 3.0的3.0版本正式推出
Rediscoluster是去中心化的,每個節點保存數據和整個集群狀態,每個節點與所有其他節點相連。
Redis集群節點分配
Rediscoluster功能:
所有redis節點互聯(乒乓機制),內部使用二進制協議優化傳輸速度和帶寬。
只有當群集中超過壹半的節點檢測到故障時,節點故障才會生效。
客戶端直接連接到redis節點,不需要中間代理層。客戶端不需要連接群集中的所有節點,只需要連接群集中的任何可用節點。
Redis-cluster將所有物理節點映射到[0-16383]哈希槽(不壹定均勻分布),cluster負責維護節點、槽和值。
Redis集群預先劃分為16384個桶。當壹個key-value需要放入Redis集群時,根據CRC16(key) mod 16384的值決定放入哪個桶。
轉自:葡萄皮飽滿