W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
除了用于實(shí)現(xiàn)引用計(jì)數(shù)內(nèi)存回收機(jī)制之外, 對象的引用計(jì)數(shù)屬性還帶有對象共享的作用。
舉個(gè)例子, 假設(shè)鍵 A 創(chuàng)建了一個(gè)包含整數(shù)值 100
的字符串對象作為值對象, 如圖 8-20 所示。
如果這時(shí)鍵 B 也要?jiǎng)?chuàng)建一個(gè)同樣保存了整數(shù)值 100
的字符串對象作為值對象, 那么服務(wù)器有以下兩種做法:
100
的字符串對象;以上兩種方法很明顯是第二種方法更節(jié)約內(nèi)存。
在 Redis 中, 讓多個(gè)鍵共享同一個(gè)值對象需要執(zhí)行以下兩個(gè)步驟:
舉個(gè)例子, 圖 8-21 就展示了包含整數(shù)值 100
的字符串對象同時(shí)被鍵 A 和鍵 B 共享之后的樣子, 可以看到, 除了對象的引用計(jì)數(shù)從之前的 1
變成了 2
之外, 其他屬性都沒有變化。
共享對象機(jī)制對于節(jié)約內(nèi)存非常有幫助, 數(shù)據(jù)庫中保存的相同值對象越多, 對象共享機(jī)制就能節(jié)約越多的內(nèi)存。
比如說, 假設(shè)數(shù)據(jù)庫中保存了整數(shù)值 100
的鍵不只有鍵 A 和鍵 B 兩個(gè), 而是有一百個(gè), 那么服務(wù)器只需要用一個(gè)字符串對象的內(nèi)存就可以保存原本需要使用一百個(gè)字符串對象的內(nèi)存才能保存的數(shù)據(jù)。
目前來說, Redis 會在初始化服務(wù)器時(shí), 創(chuàng)建一萬個(gè)字符串對象, 這些對象包含了從 0
到 9999
的所有整數(shù)值, 當(dāng)服務(wù)器需要用到值為 0
到 9999
的字符串對象時(shí), 服務(wù)器就會使用這些共享對象, 而不是新創(chuàng)建對象。
注意
創(chuàng)建共享字符串對象的數(shù)量可以通過修改 redis.h/REDIS_SHARED_INTEGERS
常量來修改。
舉個(gè)例子, 如果我們創(chuàng)建一個(gè)值為 100
的鍵 A
, 并使用 OBJECT REFCOUNT 命令查看鍵 A
的值對象的引用計(jì)數(shù), 我們會發(fā)現(xiàn)值對象的引用計(jì)數(shù)為 2
:
redis> SET A 100
OK
redis> OBJECT REFCOUNT A
(integer) 2
引用這個(gè)值對象的兩個(gè)程序分別是持有這個(gè)值對象的服務(wù)器程序, 以及共享這個(gè)值對象的鍵 A
, 如圖 8-22 所示。
如果這時(shí)我們再創(chuàng)建一個(gè)值為 100
的鍵 B
, 那么鍵 B
也會指向包含整數(shù)值 100
的共享對象, 使得共享對象的引用計(jì)數(shù)值變?yōu)?nbsp;3
:
redis> SET B 100
OK
redis> OBJECT REFCOUNT A
(integer) 3
redis> OBJECT REFCOUNT B
(integer) 3
圖 8-23 展示了共享值對象的三個(gè)程序。
另外, 這些共享對象不單單只有字符串鍵可以使用, 那些在數(shù)據(jù)結(jié)構(gòu)中嵌套了字符串對象的對象(linkedlist
編碼的列表對象、 hashtable
編碼的哈希對象、 hashtable
編碼的集合對象、以及 zset
編碼的有序集合對象)都可以使用這些共享對象。
為什么 Redis 不共享包含字符串的對象?
當(dāng)服務(wù)器考慮將一個(gè)共享對象設(shè)置為鍵的值對象時(shí), 程序需要先檢查給定的共享對象和鍵想創(chuàng)建的目標(biāo)對象是否完全相同, 只有在共享對象和目標(biāo)對象完全相同的情況下, 程序才會將共享對象用作鍵的值對象, 而一個(gè)共享對象保存的值越復(fù)雜, 驗(yàn)證共享對象和目標(biāo)對象是否相同所需的復(fù)雜度就會越高, 消耗的 CPU 時(shí)間也會越多:
因此, 盡管共享更復(fù)雜的對象可以節(jié)約更多的內(nèi)存, 但受到 CPU 時(shí)間的限制, Redis 只對包含整數(shù)值的字符串對象進(jìn)行共享。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: