Redis數(shù)據(jù)類型
Redis支持的數(shù)據(jù)類型要豐富得多已慢,常用的數(shù)據(jù)類型主要有五種:String曲聂、List、Hash佑惠、Set和Sorted Set句葵、bitMap厕鹃,hyperLoglog。Redis數(shù)據(jù)類型內(nèi)存結(jié)構(gòu)分析
List應(yīng)用場景:
String是最常用的一種數(shù)據(jù)類型乍丈,普通的key/value存儲都可以歸為此類剂碴。
常用命令:
(1)set 設(shè)置key對應(yīng)的值為String類型的value
(2)get? 獲取key對應(yīng)的值
(3)expire? 設(shè)置過期時(shí)間
(4)type? 查看值數(shù)據(jù)類型
(5)select 庫號? ?選擇查看指定的庫數(shù)據(jù)
命令說明:
setnx設(shè)置key對應(yīng)的值為String類型的value,如果key已經(jīng)存在則返回0
setex設(shè)置key對應(yīng)的值為String類型的value轻专,并設(shè)定有效期
setrange設(shè)置key對應(yīng)value的子字符串
getrange獲取key對應(yīng)value的子字符串
mset批量設(shè)置多個key的值忆矛,如果成功表示所有值都被設(shè)置,否則返回0表示沒有任何值被設(shè)置
msetnx同mset请垛,不存在就設(shè)置催训,不會覆蓋已有的key
getset設(shè)置key的值,并返回key舊的值
append給指定key的value追加字符串宗收,并返回新字符串的長度
strlen取指定key的value的長度
Hash類型
Hash是一個String類型的field和value之間的映射表漫拭,即redis的Hash數(shù)據(jù)類型的key(hash表名稱)對應(yīng)的value實(shí)際的內(nèi)部存儲結(jié)構(gòu)為一個HashMap,因此Hash特別適合存儲對象混稽。相對于把一個對象的每個屬性存儲為String類型采驻,將整個對象存儲在Hash類型中會占用更少內(nèi)存。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Hash 數(shù)據(jù)類型內(nèi)部結(jié)構(gòu)示意圖
當(dāng)前HashMap的實(shí)現(xiàn)有兩種方式:當(dāng)HashMap的成員比較少時(shí)Redis為了節(jié)省內(nèi)存會采用類似一維數(shù)組的方式來緊湊存儲匈勋,而不會采用真正的HashMap結(jié)構(gòu)礼旅,這時(shí)對應(yīng)的value的redisObject的encoding為zipmap,當(dāng)成員數(shù)量增大時(shí)會自動轉(zhuǎn)成真正的HashMap,此時(shí)encoding為ht洽洁。
應(yīng)用場景
用一個對象來存儲用戶信息痘系,商品信息,訂單信息等等饿自。
List類型
Redis的List類型其實(shí)就是每一個元素都是String類型的雙向鏈表度帮。我們可以從鏈表的頭部和尾部添加或者刪除元素蒋畜。這樣的List既可以作為棧爵政,也可以作為隊(duì)列使用闭翩。
List數(shù)據(jù)結(jié)構(gòu)內(nèi)部示意圖
應(yīng)用場景
如好友列表居砖,粉絲列表间螟,消息隊(duì)列赞警,最新消息排行等验辞。
常用命令
(1)lpush——在key對應(yīng)的list的頭部添加一個元素抄课。
(2)lrange——獲取key對應(yīng)的list的指定下標(biāo)范圍的元素唱星,-1表示獲取所有元素。
(3)lpop——從key對應(yīng)的list的尾部刪除一個元素跟磨,并返回該元素间聊。
Set類型
Redis 集合(Set類型)是一個無序的String類型數(shù)據(jù)的集合,類似List的一個列表抵拘,與List不同的是Set不能有重復(fù)的數(shù)據(jù)哎榴。實(shí)際上,Set的內(nèi)部是用HashMap實(shí)現(xiàn)的,Set只用了HashMap的key列來存儲對象尚蝌。我們來看看java中HashSet的源碼:
可見創(chuàng)建一個HashSet的時(shí)候?qū)嶋H上創(chuàng)建了一個HashMap迎变;Set中的元素,只是存放在了底層HashMap的key上飘言,底層HashMap的value列為空衣形,遍歷HashSet的時(shí)候從HashMap中取出keySet來遍歷。
Set底層結(jié)構(gòu)示意圖
應(yīng)用場景
集合有取交集姿鸿、并集谆吴、差集等操作,因此可以求共同好友苛预、共同興趣句狼、分類標(biāo)簽等。
常用命令
(1)sadd——在key對應(yīng)的set中添加一個元素热某。
(2)smembers——獲取key對應(yīng)的set的所有元素腻菇。
(3)spop——隨機(jī)返回并刪除key對應(yīng)的set中的一個元素。
SortSet
SortSet顧名思義苫拍,是一個排好序的Set芜繁,它在Set的基礎(chǔ)上增加了一個順序?qū)傩詓core,這個屬性在添加修改元素時(shí)可以指定绒极,每次指定后骏令,SortSet會自動重新按新的值排序。sorted set的內(nèi)部使用HashMap和跳躍表(SkipList)來保證數(shù)據(jù)的存儲和有序垄提,HashMap里放的是成員到score的映射榔袋,而跳躍表里存放的是所有的成員,排序依據(jù)是HashMap里存的score铡俐。
應(yīng)用場景
如按時(shí)間排序的時(shí)間軸凰兑。
常用命令
(1)zadd?——在key對應(yīng)的zset中添加一個元素
(2)zrange——獲取key對應(yīng)的zset中指定范圍的元素,-1表示獲取所有元素
Redis常用命令
鍵值常用命令
keys/exits/del/expire/ttl/move/persist/randomkey/rename/type
服務(wù)器常用命令
ping/echo/select/quit/dbsize/info/config?get/flushdb/flushall
Redis分布式存儲的2種常見的方案:
1. 主從
2.cluster
Redis集群切片常見的方式:
1. 客戶端切片审丘,即在客戶端就通過key的hash值對應(yīng)到不同的服務(wù)器吏够。
2. 對數(shù)據(jù)根據(jù)key散列到不同的slot上,不同的slot對應(yīng)到不同服務(wù)器上滩报。
Redis自增實(shí)現(xiàn)計(jì)數(shù)
計(jì)數(shù)器是 Redis 的原子性自增操作可實(shí)現(xiàn)的最直觀的模式了锅知,它的想法相當(dāng)簡單:每當(dāng)某個操作發(fā)生時(shí),向 Redis 發(fā)送一個INCR命令脓钾。
比如在一個 web 應(yīng)用程序中售睹,如果想知道用戶在一年中每天的點(diǎn)擊量,那么只要將用戶 ID 以及相關(guān)的日期信息作為鍵可训,并在每次用戶點(diǎn)擊頁面時(shí)昌妹,執(zhí)行一次自增操作即可捶枢。
比如用戶名是peter,點(diǎn)擊時(shí)間是 2012 年 3 月 22 日飞崖,那么執(zhí)行命令I(lǐng)NCRpeter::2012.3.22烂叔。
可以用以下幾種方式擴(kuò)展這個簡單的模式:
可以通過組合使用INCR和EXPIRE,來達(dá)到只在規(guī)定的生存時(shí)間內(nèi)進(jìn)行計(jì)數(shù)(counting)的目的蚜厉。
客戶端可以通過使用GETSET命令原子性地獲取計(jì)數(shù)器的當(dāng)前值并將計(jì)數(shù)器清零长已,更多信息請參考GETSET命令。
使用其他自增/自減操作昼牛,比如DECR和INCRBY术瓮,用戶可以通過執(zhí)行不同的操作增加或減少計(jì)數(shù)器的值,比如在游戲中的記分器就可能用到這些命令贰健。