制作APP時(shí)對(duì)于sorted set--有序且不重復(fù)的元素集合的使用,關(guān)于sorted-set類型與set類型非常相似,不允許出現(xiàn)重復(fù)的元素。其主要區(qū)別是sorted-set中提供了個(gè)分?jǐn)?shù)(score)與每個(gè)成員對(duì)應(yīng)Redis根據(jù)score對(duì)成員進(jìn)行排序,而且插入是有序的,即插入后就自動(dòng)排序。當(dāng)App后臺(tái)開發(fā)者需要有序且不重復(fù)的數(shù)據(jù),選擇sorted-set這種數(shù)據(jù)結(jié)構(gòu)就非常合適。需要特別注意:sorted-set中的成員是不允許重復(fù),但score是允許重復(fù)的。深圳APP開發(fā)公司先就sorted set應(yīng)用以及內(nèi)存優(yōu)化方面的方法整理如下:
1、數(shù)據(jù)模型
sored-set的數(shù)據(jù)模型示意圖7-11
APP制作對(duì)于sored-set應(yīng)模型示意圖7-11
2、應(yīng)用場(chǎng)景
sorted-set類型適用于各種類型的排行榜。如圖7-12所示的用戶人氣榜。
APP制作工具應(yīng)用圖7-12用戶人氣榜
用戶如果需要使用sorted-set實(shí)現(xiàn)如圖7-12的用戶人氣榜,首先通過下面的命令把用戶的數(shù)據(jù)添加到Redis中。
ZADD Key score member
本例中sorted-set的Kev是“userTop”,添加數(shù)據(jù)的過程如下所示。
接著通過下面的命令返回索引在st art和stop之間的成員列表。
zrevrange key start stop [withscores]
其中start為O表示第個(gè)成員,stop為l表示最后個(gè)成員,WITHSCORES表示返回的結(jié)果中包含每個(gè)成員的分?jǐn)?shù)),排序命令如下。
上面的返回結(jié)果己按照分?jǐn)?shù)從大到小排序了
APP開發(fā)之內(nèi)存優(yōu)化
由于Redis在內(nèi)容中存儲(chǔ)數(shù)據(jù)的特性,Reids會(huì)占用大量的內(nèi)存,Redis的開發(fā)者也考慮到這點(diǎn),因此在Redis中提供了系列的參數(shù)和方法來監(jiān)控、控制和優(yōu)化內(nèi)存。
1、監(jiān)控內(nèi)存使用的狀況
在通過Redis的終端命令redis-cli中輸入命令“iufo”可查看Redis的各種統(tǒng)計(jì)信息其中有關(guān)內(nèi)存的統(tǒng)計(jì)信息如下
# Plemory
used_memc.ry:12660096
used_memc.ry_human:l2.07M
used_memc.ry_rss:14299136
used_memc.ry_peak:15534680
used_memc.ry_peak_hum an:18.82M
used_memc.ry_lua:31744
mem fracjmentati_.n rati::1.13
mem_allocator:jemallOC-3.2.0
在上面展示的參數(shù)中,3個(gè)重要的內(nèi)存統(tǒng)計(jì)信息的說明如下:
·used_memory_hmuan:以可讀格式返回Redis分配的內(nèi)存總量。
·used_memory_ rss從操作系統(tǒng)的角度,返回Redis已分配的內(nèi)存總量。這個(gè)值的結(jié)果,和top命令的輸出一致。
·used_memory_peak_hmuan:以可讀格式返回Redis的內(nèi)存消耗峰值。
如果APP開發(fā)者在這里的統(tǒng)計(jì)數(shù)據(jù)中查看到內(nèi)存使用過多,在不考慮使用Redis分布式存儲(chǔ)的情況下,開發(fā)者務(wù)必要想辦法優(yōu)化Redis內(nèi)存的使用情況。
2、優(yōu)化存儲(chǔ)結(jié)構(gòu)
Redis的開發(fā)者在配置文件中提供了組參數(shù)來控制hash、list、set、sorted-set某些結(jié)構(gòu)的內(nèi)存存儲(chǔ)方式。
在正常的情況下,hash中的value是Uhashmap的方式存儲(chǔ),如果hashmap的成員較少,或者h(yuǎn)ashmap的值的長(zhǎng)度較少,會(huì)以類似于線性壓縮表的萬式( Redis中稱為ziplist)的萬式保存hash的數(shù)據(jù),該控制參數(shù)對(duì)應(yīng)于Redis配置文件中的下面兩項(xiàng):
hash-max-zUJlist-entrie0 51:
hash-max-zirllist-value e4
·hash-max-ziplist-entries:當(dāng)hashmapih部的成員不超過512時(shí),就采用ziplist的形式存儲(chǔ)數(shù)據(jù);當(dāng)hashmapih部的成員超過512時(shí),
就采用hasluuap的形式存儲(chǔ)數(shù)據(jù)。
·hash-max-ziplist-value:當(dāng)hashmap內(nèi)部的成員的長(zhǎng)度不超過64時(shí),就采用ziplist的形式存儲(chǔ)數(shù)據(jù);當(dāng)hashmapih部的成員的長(zhǎng)度超過64時(shí),就采用hashmap的形式存儲(chǔ)數(shù)據(jù)。
APP開發(fā)公司提示:以上兩個(gè)值任意一個(gè)超過了.hash的存儲(chǔ)方式就會(huì)轉(zhuǎn)換/jhashmap。當(dāng)hash采用ziplist存儲(chǔ)數(shù)據(jù)時(shí),數(shù)據(jù)模型如下。
Redis配置文件中下面這些參數(shù)的含義也是類似,分別控制list和zset是否采用ziplist的存儲(chǔ)方式set是否使用intset的存儲(chǔ)方式來節(jié)省內(nèi)存。
list-max-zirilist-entries 512
list-max-ziplist-value 64
set-max-zirilist-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
當(dāng)list采用ziplist存儲(chǔ)數(shù)據(jù)時(shí),數(shù)據(jù)模型如下。
當(dāng)zset采用ziplist存儲(chǔ)數(shù)據(jù)時(shí),數(shù)據(jù)模型如下。
注意set使用了intset的結(jié)構(gòu)來節(jié)省內(nèi)存,intset數(shù)據(jù)模型如圖7-13所示。
上面的這些參數(shù)值不是沒置得越大越好,例如,hash的數(shù)據(jù)結(jié)構(gòu)中如果用hashmap存儲(chǔ)數(shù)據(jù),查找和操作的時(shí)間復(fù)雜度都是0(1),采用了ziplist后,由于ziplist是一個(gè)線性表結(jié)構(gòu),查找和操作的時(shí)間復(fù)雜度會(huì)變成0(n)。如果數(shù)據(jù)成員量不大,則影響不大,當(dāng)數(shù)據(jù)成員量變大后,則會(huì)嚴(yán)重影響性能。開發(fā)者需要在時(shí)間和空間之間認(rèn)真衡量怎么設(shè)置上面所述的參數(shù)。APP開發(fā)公司關(guān)于項(xiàng)目制作時(shí)對(duì)于sorted set的功能與應(yīng)用方面的經(jīng)驗(yàn)本文就分享到這里。博納網(wǎng)絡(luò)編輯整理謝謝關(guān)注。