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