Redis key命令key的儲存方式
Redis是目前使用比較廣泛的nosql數(shù)據(jù)庫,它也是一種基于key-value結構的數(shù)據(jù)庫且支持多種數(shù)據(jù)類型,Redis中它的存儲是使用一張hash表用于存儲所有的key和對應value的地址。
因此key的命令是我們必須要掌握的。
前項
數(shù)據(jù)準備,首先我們先在redis中設置一些數(shù)據(jù)
arr1 = beijing arr2 = shanghai arr3 = shenzhen arr4 = guangzhou param1 = guangdong param2=hunan param3 = jiangxi param4 = hubei
Key命令使用
1. keys [pattern]
查看當前庫的key(*代表通配符)。
該命令慎用,keys命令會掃描所有key,由于redis的執(zhí)行是串行執(zhí)行,當key過多時使用keys命令時會導致阻塞其他命令的執(zhí)行,從而導致redis服務的崩潰。
大多數(shù)生產(chǎn)使用redis時會將keys命令禁用。
keys * 查看所有的key
keys arr* 匹配以arr開頭的key
keys *guangzhou 匹配以guangzhou結尾的key
keys param1 指定查看key為param1
2. exists [key . . .]
判斷key是否存在,可以同時判斷多個key
exists arr1 判斷arr1 是否存在 返回1則存在 返回0則不存在
exists arr1 arr2 arr3 同時判斷arr1 arr2 arr3 是否存在 匹配到n個key則返回n
如果都不存在則返回0
3. type key
查看key的類型,只能支持單個判斷
4. del [key . . .]
刪除指定的key 刪除n個key 則返回n
unlink [key . . .]異步刪除
5. exprie key [second]
設置key的過期時間
6. ttl key
查看key還剩多少時間過期,數(shù)字代表剩下多少秒, -2 代表已過期, -1 代表永不過期
7. dbsize
查看當前key的數(shù)量
Key的存儲
redis中對key的存儲使用的是一張全局的hashtable來存儲,將每個key使用siphash函數(shù)生成一個64位的數(shù)字作為存儲在hashtable里的索引。
當不同的鍵被落在同一個索引下時,使用鏈表結構來存儲。
如下圖:
漸進式rehash
當相同的索引鍵鏈表節(jié)點數(shù)過大,超過整個hashtable的數(shù)量時,那么查找key的效率就會降低,因此redis則會對該全局hashtable進行rehash的操作。
如果 key的數(shù)量過大時直接進行rehash操作進行擴容時有可能會導致redis服務阻塞,因此redis則采用的是漸進式的rehash操作。
漸進式rehash的過程
redis在啟動時內(nèi)部默認會分配兩個hashtable(ht0 、ht1),在正常使用時則使用其中一個ht0,當需要進行rehash操作時ht1才需要被使用到。
漸進式rehash的操作步驟:
1、首先將原h(huán)t1的空間擴容,讓ht1同時有ht0 和 ht1兩個哈希表的空間大小。
2、進行rehash操作時,在ht0中維護一個索引計數(shù)器 rehashidx , 并將它的值設置為 0 。
3、在rehash期間,當執(zhí)行添加、刪除、查找或者更新操作時,redis會將ht0 哈希表在 rehashidx 索引上的所有鍵值對 rehash 到 ht1,同時rehashidx 的值加1。
4、當rehash的次數(shù)不斷增多時,ht0的所有鍵值對都會被 rehash 至 ht1,此時rehashidx 屬性的值設為 -1 ,則代表rehash 操作已經(jīng)全部完成,那么ht1和ht0的位置進行交換,前面提到的默認操作都是在ht0上的。
總之
rehash操作主要是解決由于hash沖突導致key鏈表過大影響性能,而使用漸進式rehash操作則是未來避免key數(shù)量過大因rehash導致redis服務的阻塞。
這些機制最終的目的都是為了能夠提高redis服務的性能。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
redis的key出現(xiàn)的\xac\xed\x00\x05t\x00亂碼問題及解決
這篇文章主要介紹了redis的key出現(xiàn)的\xac\xed\x00\x05t\x00亂碼問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09redis中token失效引發(fā)的一次生產(chǎn)事故
項目再測試的時候發(fā)現(xiàn)不定時token失效,本文主要介紹了redis中token失效引發(fā)的一次生產(chǎn)事故,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧2024-03-03Redis實現(xiàn)和數(shù)據(jù)庫的數(shù)據(jù)同步
本文介紹了Redis與傳統(tǒng)數(shù)據(jù)庫數(shù)據(jù)同步的幾種常見方法,包括CacheAside、WriteThrough、WriteBehind,以及如何通過分布式事務、樂觀鎖、數(shù)據(jù)過期策略和消息隊列來解決數(shù)據(jù)一致性問題,每種方法都有其適用場景和優(yōu)缺點,需要根據(jù)具體需求進行選擇2025-01-01Spring?Boot?3.0x的Redis?分布式鎖的概念和原理
Redis?分布式鎖是一種基于?Redis?的分布式鎖解決方案,它的原理是利用?Redis?的原子性操作實現(xiàn)鎖的獲取和釋放,從而保證共享資源的獨占性,這篇文章主要介紹了適合?Spring?Boot?3.0x的Redis?分布式鎖,需要的朋友可以參考下2024-08-08