日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

個常見使用場景,redis使用場景( 三 )


只有打開了Redis的虛擬內(nèi)存功能,vm字段字段才會真正的分配內(nèi)存,該功能默認是關(guān)閉狀態(tài)的 。1)String常用命令:set/get/decr/incr/mget等;應(yīng)用場景:String是最常用的一種數(shù)據(jù)類型,普通的key/value存儲都可以歸為此類;實現(xiàn)方式:String在redis內(nèi)部存儲默認就是一個字符串,被redisObject所引用,當(dāng)遇到incr、decr等操作時會轉(zhuǎn)成數(shù)值型進行計算,此時redisObject的encoding字段為int 。
2)Hash常用命令:hget/hset/hgetall等應(yīng)用場景:我們要存儲一個用戶信息對象數(shù)據(jù),其中包括用戶ID、用戶姓名、年齡和生日,通過用戶ID我們希望獲取該用戶的姓名或者年齡或者生日;實現(xiàn)方式:Redis的Hash實際是內(nèi)部存儲的Value為一個HashMap,并提供了直接存取這個Map成員的接口 。
如圖所示,Key是用戶ID, value是一個Map 。這個Map的key是成員的屬性名,value是屬性值 。這樣對數(shù)據(jù)的修改和存取都可以直接通過其內(nèi)部Map的Key(Redis里稱內(nèi)部Map的key為field), 也就是通過 key(用戶ID)field(屬性標簽) 就可以操作對應(yīng)屬性數(shù)據(jù) 。當(dāng)前HashMap的實現(xiàn)有兩種方式:當(dāng)HashMap的成員比較少時Redis為了節(jié)省內(nèi)存會采用類似一維數(shù)組的方式來緊湊存儲,而不會采用真正的HashMap結(jié)構(gòu),這時對應(yīng)的value的redisObject的encoding為zipmap,當(dāng)成員數(shù)量增大時會自動轉(zhuǎn)成真正的HashMap,此時encoding為ht 。
3)List常用命令:lpush/rpush/lpop/rpop/lrange等;應(yīng)用場景:Redis list的應(yīng)用場景非常多,也是Redis最重要的數(shù)據(jù)結(jié)構(gòu)之一,比如twitter的關(guān)注列表,粉絲列表等都可以用Redis的list結(jié)構(gòu)來實現(xiàn);實現(xiàn)方式:Redis list的實現(xiàn)為一個雙向鏈表,即可以支持反向查找和遍歷,更方便操作,不過帶來了部分額外的內(nèi)存開銷,Redis內(nèi)部的很多實現(xiàn),包括發(fā)送緩沖隊列等也都是用的這個數(shù)據(jù)結(jié)構(gòu) 。
4)Set常用命令:sadd/spop/smembers/sunion等;應(yīng)用場景:Redis set對外提供的功能與list類似是一個列表的功能,特殊之處在于set是可以自動排重的,當(dāng)你需要存儲一個列表數(shù)據(jù),又不希望出現(xiàn)重復(fù)數(shù)據(jù)時,set是一個很好的選擇,并且set提供了判斷某個成員是否在一個set集合內(nèi)的重要接口,這個也是list所不能提供的;實現(xiàn)方式:set 的內(nèi)部實現(xiàn)是一個 value永遠為null的HashMap,實際就是通過計算hash的方式來快速排重的,這也是set能提供判斷一個成員是否在集合內(nèi)的原因 。
5)Sorted Set常用命令:zadd/zrange/zrem/zcard等;應(yīng)用場景:Redis sorted set的使用場景與set類似,區(qū)別是set不是自動有序的,而sorted set可以通過用戶額外提供一個優(yōu)先級(score)的參數(shù)來為成員排序,并且是插入有序的,即自動排序 。當(dāng)你需要一個有序的并且不重復(fù)的集合列表,那么可以選擇sorted set數(shù)據(jù)結(jié)構(gòu),比如twitter 的public timeline可以以發(fā)表時間作為score來存儲,這樣獲取時就是自動按時間排好序的 。
實現(xiàn)方式:Redis sorted set的內(nèi)部使用HashMap和跳躍表(SkipList)來保證數(shù)據(jù)的存儲和有序,HashMap里放的是成員到score的映射,而跳躍表里存放的是所有的成員,排序依據(jù)是HashMap里存的score,使用跳躍表的結(jié)構(gòu)可以獲得比較高的查找效率,并且在實現(xiàn)上比較簡單 。2、內(nèi)存管理機制不同在Redis中,并不是所有的數(shù)據(jù)都一直存儲在內(nèi)存中的 。
這是和Memcached相比一個最大的區(qū)別 。當(dāng)物理內(nèi)存用完時,Redis可以將一些很久沒用到的value交換到磁盤 。Redis只會緩存所有的key的信息,如果Redis發(fā)現(xiàn)內(nèi)存的使用量超過了某一個閥值,將觸發(fā)swap的操作,Redis根據(jù)“swappability = age*log(size_in_memory)”計算出哪些key對應(yīng)的value需要swap到磁盤 。
然后再將這些key對應(yīng)的value持久化到磁盤中,同時在內(nèi)存中清除 。這種特性使得Redis可以保持超過其機器本身內(nèi)存大小的數(shù)據(jù) 。當(dāng)然,機器本身的內(nèi)存必須要能夠保持所有的key,畢竟這些數(shù)據(jù)是不會進行swap操作的 。同時由于Redis將內(nèi)存中的數(shù)據(jù)swap到磁盤中的時候,提供服務(wù)的主線程和進行swap操作的子線程會共享這部分內(nèi)存,所以如果更新需要swap的數(shù)據(jù),Redis將阻塞這個操作,直到子線程完成swap操作后才可以進行修改 。

推薦閱讀