您好,登錄后才能下訂單哦!
本篇內容主要講解“redis內部運作機制是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“redis內部運作機制是什么”吧!
redis 就是一個數據庫,不過與傳統數據庫不同的是 redis 的數據是存在內存中的,所以讀寫速度非常快,因此 redis 被廣泛應用于緩存方向。
當Redis服務器初始化的時候會創建 redis.h/REDIS_DEFAULT_DBNUM(后面簡寫 N ) 個數據庫,且數據庫的id是從 0 到 N-1 , 所有的數據庫保存到 redis.h/redisServer.db 數組中 。
在客戶端可以通過 “SELECT” 命令進行切換,其中程序是直接用 redis.h/redisServer.db[number] 進行切換。 但是,一些內部程序,比如 AOF 程序、復制程序和 RDB 程序,需要知道當前數據庫的號碼, 如果沒有 id 域的話,程序就只能在當前使用的數據庫的指針,和 redisServer.db 數組中所 有數據庫的指針進行對比,以此來弄清楚自己正在使用的是那個數據庫。
typeof struct redisDb{ int id ; // 數據庫的id dict *dict ; // 保存著該數據庫的所有鍵值對 也被稱為鍵空間 dict *expires ; // 保存著鍵的過期時間 ….. } redisDb ; Redis 是一個鍵值對 字典表,同樣Redis數據庫存儲形式也是鍵值對 字典表 鍵是字符串 值可以是字符型、list 列表、 hash、集合以及 有序集合其中之一
新增: Redis會在鍵空間字典中增加一個鍵-值對,其中鍵為一個字符串,值為任意一個值類型。 刪除: Redis會在鍵空間字典中刪去對應鍵的鍵-值對 更新: Redis會在鍵空間字典中釋放之前對應鍵的值對象,并讓鍵指向新的值對象 查詢: Redis會在鍵空間字典中查詢對應鍵的值對象: 鍵不存在,返回NULL 鍵存在,且類型正確,返回正確的值 鍵存在,但類型不正確,返回類型錯誤 其他操作: 除了上面展示的鍵值操作之外,還有很多針對數據庫本身的命令,也是通過對鍵空間進行處理 來完成的: FLUSHDB 刪除鍵空間中的所有鍵值對 RANDOMKEY 從鍵空間中隨機返回一個鍵 DBSIZE 返回鍵空間中鍵值對的數量 EXISTS 檢查給定鍵是否存在于鍵空間中 RENAME 在鍵空間中,對給定鍵進行改名
在Redis數據庫中,所有鍵的過期時間都保存在RedisDb結構體的expires字典中,其中鍵為一個指向dict 字典(鍵空間)里某個鍵的指針,值為改建的過期時間,用long long型表示。
Redis 有四個命令可以設置鍵的生存時間(可以存活多久)和過期時間(什么時候到期): EXPIRE 以秒為單位設置鍵的生存時間; PEXPIRE 以毫秒為單位設置鍵的生存時間; EXPIREAT 以秒為單位,設置鍵的過期 UNIX 時間戳; PEXPIREAT 以毫秒為單位,設置鍵的過期 UNIX 時間戳。
雖然有那么多種不同單位和不同形式的設置方式,但是 expires 字典的值只保存“以毫秒為單 位的過期 UNIX 時間戳” ,這就是說,通過進行轉換,所有命令的效果最后都和 PEXPIREAT 命令的效果一樣。
定時清除: 在創建KEY的時候創建一個定時任務,在KEY到期時定時任務會被觸發,第一時間清除過期KEY。 此種操作對內存最友好,不會有垃圾數據占用內存情況存在 缺點是會造成很大的服務器負載,特別是CPU負載高的時候,CPU很大一部分負載用在了刪除不必要的KEY上了
惰性清除: 放任鍵空間的鍵不管,每次查詢KEY的時候先去校驗KEY是否過期,過期則刪除,不過期則正常返回相應的VALUE。 此種操作對CPU最友好,這種策略僅限于當前KEY,相關不必要的KEY不會造成CPU負載 缺點是:容易造成內存空間浪費,特別是當系統中存在大量過期KEY且很少被用到,這十分影響非常依賴于內存大小Redis的性能
定期刪除: 由定時腳本cron定時對expires的鍵掃描判斷是否有過期的KEY存在,如存在,將其刪除掉。 這是一種折中方案,既不會過多消耗CPU,又可以定時清楚惰性刪除忽略到的不必要的內存消耗
Redis采用的“惰性清除”和“定期清楚”相結合的方式,其中定期刪除模式是在規定的時間限制內,盡 可能地遍歷各個數據庫的 expires 字典,隨機地檢查一部分鍵的過期時間,并刪除其中的過期鍵。
偽代碼如下:
def activeExpireCycle():# 遍歷數據庫(不一定能全部都遍歷完,看時間是否足夠)for db in server.db:# MAX_KEY_PER_DB 是一個 DB 最大能處理的 key 個數 # 它保證時間不會全部用在個別的 DB 上(避免饑餓) i=0 while (i # 數據庫為空,跳出 while ,處理下個 DB if db.is_empty(): break# 隨機取出一個帶 TTL 的鍵 key_with_ttl = db.expires.get_random_key()# 檢查鍵是否過期,如果是的話,將它刪除 if is_expired(key_with_ttl): db.deleteExpiredKey(key_with_ttl)# 當執行時間到達上限,函數就返回,不再繼續 # 這確保刪除操作不會占用太多的 CPU 時間if reach_time_limit(): returni += 1
Redis 過期鍵刪除的主從同步問題(Redis的機制是由主節點統一控制)
如果服務器是主節點,當它刪除一個過期鍵之后,會顯式的向所有附屬節點發送一條DEL命令 如果服務器是附屬節點,當它判斷到當前KEY已經過期,會將該鍵過期的消息發送給主服務器,主服務器刪除后向所有的從服務器節點發送DEL命令。
從服務器節點不自主的對鍵進行刪除是為了保持和主服務器數據的絕對一致性,即當一個過期鍵還存在主服務器上,這個鍵在所有的從服務器上也不會被刪除。
到此,相信大家對“redis內部運作機制是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。