1、Strings字符串
主要用戶session,存儲(chǔ)字符串值。
應(yīng)用場(chǎng)景
場(chǎng)景1:session 共享
場(chǎng)景2:計(jì)數(shù)器,常規(guī)計(jì)數(shù):微博數(shù),粉絲數(shù),訂閱、禮物
key:value
----------
(1)
set name zhangsan?
(2)
MSET id 101 name zhangsan age 20 gender m
等價(jià)于以下操作:
SET id 101
set name zhangsan
set age 20
set gender m
(3)計(jì)數(shù)器
每點(diǎn)一次關(guān)注,都執(zhí)行以下命令一次
127.0.0.1:6379> incr num
顯示粉絲數(shù)量:
127.0.0.1:6379> get num
暗箱操作:
127.0.0.1:6379> INCRBY num 10000? ?##鍵key直接+10000,默認(rèn)是+1.
(integer) 10006
127.0.0.1:6379> get num
"10006"
127.0.0.1:6379> DECRBY num 10000
(integer) 6
127.0.0.1:6379> get num
"6"
詳細(xì)的例子:------------------------------------
增
set mykey "test"? ? ? ? ? ? ? ? 為鍵設(shè)置新值,并覆蓋原有值
getset mycounter 0? ? ? ? ? ? ? 設(shè)置值,取值同時(shí)進(jìn)行
setex mykey 10 "hello"? ? ? ? ? 設(shè)置指定 Key 的過(guò)期時(shí)間為10秒,在存活時(shí)間可以獲取value
setnx mykey "hello"? ? ? ? ? ? 若該鍵不存在,則為鍵設(shè)置新值
mset key3? "zyx"? key4 "xyz"? ? 批量設(shè)置鍵
刪
del mykey? ? ? ? ? ? ? ? ? ? ? ? 刪除已有鍵
改
append mykey "hello"? ? ? ? ? ? 若該鍵并不存在,返回當(dāng)前 Value 的長(zhǎng)度
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 該鍵已經(jīng)存在,返回追加后 Value的長(zhǎng)度
incr mykey? ? ? ? ? ? ? ? ? ? ? 值增加1,若該key不存在,創(chuàng)建key,初始值設(shè)為0,增加后結(jié)果為1
decrby? mykey? 5? ? ? ? ? ? ? ? 值減少5
setrange mykey 20 dd? ? ? ? ? ? 把第21和22個(gè)字節(jié),替換為dd, 超過(guò)value長(zhǎng)度,自動(dòng)補(bǔ)0
查?
exists mykey? ? ? ? ? ? ? ? ? ? 判斷該鍵是否存在,存在返回 1,否則返回0
get mykey? ? ? ? ? ? ? ? ? ? ? 獲取Key對(duì)應(yīng)的value
strlen mykey? ? ? ? ? ? ? ? ? ? 獲取指定 Key 的字符長(zhǎng)度
ttl mykey? ? ? ? ? ? ? ? ? ? ? 查看一下指定 Key 的剩余存活時(shí)間(秒數(shù))
getrange mykey 1 20? ? ? ? ? ? 獲取第2到第20個(gè)字節(jié),若20超過(guò)value長(zhǎng)度,則截取第2個(gè)和后面所有的
mget key3 key4? ? ? ? ? ? ? ? ? 批量獲取鍵
2、hash類(lèi)型
主要用于存儲(chǔ)對(duì)象,比如存儲(chǔ)mysql數(shù)據(jù)庫(kù)的一行。
應(yīng)用場(chǎng)景:
存儲(chǔ)部分變更的數(shù)據(jù),如用戶信息等。
最接近mysql表結(jié)構(gòu)的一種類(lèi)型
主要是可以做數(shù)據(jù)庫(kù)緩存。
存數(shù)據(jù):
hmset stu? id 101 name zhangsan age 20 gender m
hmset stu1 id 102 name zhangsan1 age 21 gender f
取數(shù)據(jù):
HMGET stu id name age gender
HMGET stu1 id name age gender
mysql數(shù)據(jù)庫(kù)字符串拼接語(yǔ)句,并導(dǎo)出到文件。
select concat("hmset city_",id," id ",id," name ",name," countrycode ",countrycode," district ",district," population ",population) from city limit 10 into outfile '/tmp/hmset.txt'
redis直接導(dǎo)入外部文件直redis庫(kù)中
cat ?/tmp/hmset.txt | redis_cli -a 123456?
---------------------更多的例子
增
hset myhash field1 "s"? ?
若字段field1不存在,創(chuàng)建該鍵及與其關(guān)聯(lián)的Hashes, Hashes中,key為field1 ,并設(shè)value為s ,若存在會(huì)覆蓋原value
hsetnx myhash field1 s? ?
若字段field1不存在,創(chuàng)建該鍵及與其關(guān)聯(lián)的Hashes, Hashes中,key為field1 ,并設(shè)value為s, 若字段field1存在,則無(wú)效
hmset myhash field1 "hello" field2 "world? ? ? 一次性設(shè)置多個(gè)字段
刪
hdel myhash field1? ? ? ? ? ? ? ? ? ? ? 刪除 myhash 鍵中字段名為 field1 的字段
del myhash? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 刪除鍵
改?
hincrby myhash field 1? ? ? ? ? ? ? ? ? 給field的值加1
查
hget myhash field1? ? ? ? ? ? ? ? ? ? ? 獲取鍵值為 myhash,字段為 field1 的值
hlen myhash? ? ? ? ? ? ? ? ? ? ? ? ? ? 獲取myhash鍵的字段數(shù)量
hexists myhash field1? ? ? ? ? ? ? ? ? 判斷 myhash 鍵中是否存在字段名為 field1 的字段
hmget myhash field1 field2 field3? ? ? 一次性獲取多個(gè)字段
hgetall myhash? ? ? ? ? ? ? ? ? ? ? ? ? 返回 myhash 鍵的所有字段及其值
hkeys myhash? ? ? ? ? ? ? ? ? ? ? ? ? ? 獲取myhash 鍵中所有字段的名字
hvals myhash? ? ? ? ? ? ? ? ? ? ? ? ? ? 獲取 myhash 鍵中所有字段的值
3、LIST(列表)
主要用于消息隊(duì)列(特點(diǎn)是先進(jìn)后出,類(lèi)型棧)
應(yīng)用場(chǎng)景
消息隊(duì)列系統(tǒng)
比如sina微博
在Redis中我們的最新微博ID使用了常駐緩存,這是一直更新的。
但是做了限制不能超過(guò)5000個(gè)ID,因此獲取ID的函數(shù)會(huì)一直詢問(wèn)Redis。
只有在start/count參數(shù)超出了這個(gè)范圍的時(shí)候,才需要去訪問(wèn)數(shù)據(jù)庫(kù)。
系統(tǒng)不會(huì)像傳統(tǒng)方式那樣“刷新”緩存,Redis實(shí)例中的信息永遠(yuǎn)是一致的。
SQL數(shù)據(jù)庫(kù)(或是硬盤(pán)上的其他類(lèi)型數(shù)據(jù)庫(kù))只是在用戶需要獲取“很遠(yuǎn)”的數(shù)據(jù)時(shí)才會(huì)被觸發(fā),
而主頁(yè)或第一個(gè)評(píng)論頁(yè)是不會(huì)麻煩到硬盤(pán)上的數(shù)據(jù)庫(kù)了。
特點(diǎn):先進(jìn)后出,類(lèi)似棧。
微信朋友圈:
127.0.0.1:6379> LPUSH wechat "today is nice day !"
127.0.0.1:6379> LPUSH wechat "today is bad day !"
127.0.0.1:6379> LPUSH wechat "today is good? day !"
127.0.0.1:6379> LPUSH wechat "today is rainy? day !"
127.0.0.1:6379> LPUSH wechat "today is friday !"
[5,4,3,2,1]
0 1 2 3 4
[e,d,c,b,a]
0 1 2 3? 4
127.0.0.1:6379> lrange wechat? 0 -1? ??##查看所有的值?
127.0.0.1:6379> lrange wechat? 0 0? ?##查看第一個(gè)值
1) "today is friday !"
127.0.0.1:6379> lrange wechat? 0 1? ##查看前兩個(gè)值
1) "today is friday !"
2) "today is rainy? day !"
127.0.0.1:6379> lrange wechat? 0 2
1) "today is friday !"
2) "today is rainy? day !"
3) "today is good? day !"
127.0.0.1:6379> lrange wechat? 0 3
127.0.0.1:6379> lrange wechat? -2 -1
1) "today is bad day !"
2) "today is nice day !"
-----------------
增
lpush mykey a b? ? ? ? ? ? 若key不存在,創(chuàng)建該鍵及與其關(guān)聯(lián)的List,依次插入a ,b, 若List類(lèi)型的key存在,則插入value中
lpushx mykey2 e? ? ? ? ? ? 若key不存在,此命令無(wú)效, 若key存在,則插入value中
linsert mykey before a a1? 在 a 的前面插入新元素 a1
linsert mykey after e e2? ? 在e 的后面插入新元素 e2
rpush mykey a b? ? ? ? ? ? 在鏈表尾部先插入b,在插入a
rpushx mykey e? ? ? ? ? ? ? 若key存在,在尾部插入e, 若key不存在,則無(wú)效
rpoplpush mykey mykey2? ? ? 將mykey的尾部元素彈出,再插入到mykey2 的頭部(原子性的操作)
刪
del mykey? ? ? ? ? ? ? ? ? 刪除已有鍵
lrem mykey 2 a? ? ? ? ? ? ? 從頭部開(kāi)始找,按先后順序,值為a的元素,刪除數(shù)量為2個(gè),若存在第3個(gè),則不刪除
ltrim mykey 0 2? ? ? ? ? ? 從頭開(kāi)始,索引為0,1,2的3個(gè)元素,其余全部刪除
改
lset mykey 1 e? ? ? ? ? ? ? 從頭開(kāi)始, 將索引為1的元素值,設(shè)置為新值 e,若索引越界,則返回錯(cuò)誤信息
rpoplpush mykey mykey? ? ? 將 mykey 中的尾部元素移到其頭部
查
lrange mykey 0 -1? ? ? ? ? 取鏈表中的全部元素,其中0表示第一個(gè)元素,-1表示最后一個(gè)元素。
lrange mykey 0 2? ? ? ? ? ? 從頭開(kāi)始,取索引為0,1,2的元素
lrange mykey 0 0? ? ? ? ? ? 從頭開(kāi)始,取第一個(gè)元素,從第0個(gè)開(kāi)始,到第0個(gè)結(jié)束
lpop mykey? ? ? ? ? ? ? ? ? 獲取頭部元素,并且彈出頭部元素,出棧
lindex mykey 6? ? ? ? ? ? ? 從頭開(kāi)始,獲取索引為6的元素 若下標(biāo)越界,則返回nil
?4、SET 集合類(lèi)型(join union)
主要用戶計(jì)算集合之間的交集、并集、差集的操作。比如共同好友,共同的愛(ài)好。分析找到共性和不通。
例如:數(shù)學(xué)中集合的概念。key 1{1,2,3,4,5,6} key{6,7,8,9,0}
則:并集:{1,2,3,4,5,6,7,8,9,0}? ? ?交集:{6}??
差集:key1與key2的差集:就是key1有,key2沒(méi)有的。{1,2,3,4,5}
key2與key1的差集:就是key2有,key1沒(méi)有的。{7,8,9,0}
應(yīng)用場(chǎng)景:
案例:在微博應(yīng)用中,可以將一個(gè)用戶所有的關(guān)注人存在一個(gè)集合中,將其所有粉絲存在一個(gè)集合。
Redis還為集合提供了求交集、并集、差集等操作,可以非常方便的實(shí)現(xiàn)如共同關(guān)注、共同喜好、二度好友等功能,
對(duì)上面的所有集合操作,你還可以使用不同的命令選擇將結(jié)果返回給客戶端還是存集到一個(gè)新的集合中。
127.0.0.1:6379> sadd lxl pg1 jnl baoqiang gsy alexsb
(integer) 5
127.0.0.1:6379> sadd jnl baoqiang ms bbh yf wxg
(integer) 5
127.0.0.1:6379> SUNION lx jnl? #并集
1) "baoqiang"
2) "yf"
3) "bbh"
4) "ms"
5) "wxg"
127.0.0.1:6379> SUNION lxl? jnl
1) "gsy"
2) "yf"
3) "alexsb"
4) "bbh"
5) "jnl"
6) "pg1"
7) "baoqiang"
8) "ms"
9) "wxg"
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379> SINTER lxl jnl #交集
1) "baoqiang"
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379> SDIFF jnl lxl
1) "wxg"
2) "yf"
3) "bbh"
4) "ms"
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379> SDIFF lxl jnl? #差集
1) "jnl"
2) "pg1"
3) "gsy"
4) "alexsb"
增
sadd myset a b c?
若key不存在,創(chuàng)建該鍵及與其關(guān)聯(lián)的set,依次插入a ,b,若key存在,則插入value中,若a 在myset中已經(jīng)存在,則插入了 d 和 e 兩個(gè)新成員。
刪
spop myset? ? ? ? ? ? ? 尾部的b被移出,事實(shí)上b并不是之前插入的第一個(gè)或最后一個(gè)成員
srem myset a d f? ? ? ? 若f不存在, 移出 a、d ,并返回2
改
smove myset myset2 a? ? ? ? 將a從 myset 移到 myset2,
查
sismember myset a? ? ? ? ? 判斷 a 是否已經(jīng)存在,返回值為 1 表示存在。
smembers myset? ? ? ? ? 查看set中的內(nèi)容
scard myset? ? ? ? ? ? 獲取Set 集合中元素的數(shù)量
srandmember myset? ? ? 隨機(jī)的返回某一成員
sdiff myset1 myset2 myset3? ? ? 1和2得到一個(gè)結(jié)果,拿這個(gè)集合和3比較,獲得每個(gè)獨(dú)有的值
sdiffstore diffkey myset myset2 myset3? ? ? 3個(gè)集和比較,獲取獨(dú)有的元素,并存入diffkey 關(guān)聯(lián)的Set中
sinter myset myset2 myset3? ? ? ? ? ? ? 獲得3個(gè)集合中都有的元素
sinterstore interkey myset myset2 myset3? 把交集存入interkey 關(guān)聯(lián)的Set中
sunion myset myset2 myset3? ? ? ? ? ? ? 獲取3個(gè)集合中的成員的并集
sunionstore unionkey myset myset2 myset3? 把并集存入unionkey 關(guān)聯(lián)的Set中
例如:數(shù)學(xué)中集合的概念。key 1{1,2,3,4,5,6} key{6,7,8,9,0} 。
? 則:
? 并集:{1,2,3,4,5,6,7,8,9,0}? ?
? 交集:{6}?
? 差集:
? key1與key2的差集:就是key1有,key2沒(méi)有的。{1,2,3,4,5}
? key2與key1的差集:就是key2有,key1沒(méi)有的。{7,8,9,0}
127.0.0.1:6379> SADD key1 1 2 3 4 5 6
(integer) 6
127.0.0.1:6379> SADD key2 6 7 8 9 0
(integer) 5
127.0.0.1:6379>
127.0.0.1:6379> SUNION key1 key2
1) "0"
2) "1"
3) "2"
4) "3"
5) "4"
6) "5"
7) "6"
8) "7"
9) "8"
10) "9"
127.0.0.1:6379> SINTER key1 key2
1) "6"
127.0.0.1:6379>
127.0.0.1:6379> SDIFF key1 key2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> SDIFF key2 key1
1) "0"
2) "7"
3) "8"
4) "9"
127.0.0.1:6379>?
5、SortedSet(有序集合)
主要用于排行榜,比如歌曲排行榜,英雄排行榜等。
應(yīng)用場(chǎng)景:
排行榜應(yīng)用,取TOP N操作
這個(gè)需求與上面需求的不同之處在于,前面操作以時(shí)間為權(quán)重,這個(gè)是以某個(gè)條件為權(quán)重,比如按頂?shù)拇螖?shù)排序,
這時(shí)候就需要我們的sorted set出馬了,將你要排序的值設(shè)置成sorted set的score,將具體的數(shù)據(jù)設(shè)置成相應(yīng)的value,
每次只需要執(zhí)行一條ZADD命令即可。
127.0.0.1:6379> zadd topN 0 smlt 0 fskl 0 fshkl 0 lzlsfs 0 wdhbx 0 wxg? ?#初始定義的有序集合
(integer) 6
127.0.0.1:6379> ZINCRBY topN 100000 smlt? ? #給內(nèi)部的鍵賦值
"100000"
127.0.0.1:6379> ZINCRBY topN 10000 fskl
"10000"
127.0.0.1:6379> ZINCRBY topN 1000000 fshkl
"1000000"
127.0.0.1:6379> ZINCRBY topN 100 lzlsfs
"100"
127.0.0.1:6379> ZINCRBY topN 10 wdhbx
"10"
127.0.0.1:6379> ZINCRBY topN 100000000 wxg
"100000000"
127.0.0.1:6379> ZREVRANGE topN 0 2? ?#ZREVRANGE topN 0 -1? ?獲取有序集合的所有key
1) "wxg"
2) "fshkl"
3) "smlt"
127.0.0.1:6379> ZREVRANGE topN 0 2 withscores? #獲取所有key的值,且會(huì)自動(dòng)排序。
1) "wxg"
2) "100000000"
3) "fshkl"
4) "1000000"
5) "smlt"
6) "100000"
127.0.0.1:6379>
增
zadd myzset 2 "two" 3 "three"? ? ? 添加兩個(gè)分?jǐn)?shù)分別是 2 和 3 的兩個(gè)成員
刪
zrem myzset one two? ? ? ? ? ? ? ? 刪除多個(gè)成員變量,返回刪除的數(shù)量
改
zincrby myzset 2 one? ? ? ? ? ? ? ? 將成員 one 的分?jǐn)?shù)增加 2,并返回該成員更新后的分?jǐn)?shù)
查
zrange myzset 0 -1 WITHSCORES? ? ? 返回所有成員和分?jǐn)?shù),不加WITHSCORES,只返回成員
zrank myzset one? ? ? ? ? ? ? ? ? ? 獲取成員one在Sorted-Set中的位置索引值。0表示第一個(gè)位置
zcard myzset? ? ? ? ? ? ? ? ? ? ? ? 獲取 myzset 鍵中成員的數(shù)量
zcount myzset 1 2? ? ? ? ? ? ? ? ? 獲取分?jǐn)?shù)滿足表達(dá)式 1 <= score <= 2 的成員的數(shù)量
zscore myzset three? ? ? ? ? ? ? ? 獲取成員 three 的分?jǐn)?shù)
zrangebyscore myzset? 1 2? ? ? ? ? ? ? 獲取分?jǐn)?shù)滿足表達(dá)式 1 < score <= 2 的成員
#-inf 表示第一個(gè)成員,+inf最后一個(gè)成員
#limit限制關(guān)鍵字
#2? 3? 是索引號(hào)
zrangebyscore myzset -inf +inf limit 2 3? 返回索引是2和3的成員
zremrangebyscore myzset 1 2? ? ? ? 刪除分?jǐn)?shù) 1<= score <= 2 的成員,并返回實(shí)際刪除的數(shù)量
zremrangebyrank myzset 0 1? ? ? ? ? ? ? 刪除位置索引滿足表達(dá)式 0 <= rank <= 1 的成員
zrevrange myzset 0 -1 WITHSCORES? ? ? ? 按位置索引從高到低,獲取所有成員和分?jǐn)?shù)
#原始成員:位置索引從小到大
? ? ? one? 0?
? ? ? two? 1
#執(zhí)行順序:把索引反轉(zhuǎn)
? ? ? 位置索引:從大到小
? ? ? one 1
? ? ? two 0
#輸出結(jié)果: two?
? ? ? one
zrevrange myzset 1 3? ? ? ? ? ? ? ? 獲取位置索引,為1,2,3的成員
#相反的順序:從高到低的順序
zrevrangebyscore myzset 3 0? ? ? ? ? ? 獲取分?jǐn)?shù) 3>=score>=0的成員并以相反的順序輸出
zrevrangebyscore myzset 4 0 limit 1 2? ? 獲取索引是1和2的成員,并反轉(zhuǎn)位置索引
127.0.0.1:6379> ZADD topn 0 a 0 b 0 c 0 d 0 e
(integer) 5
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379> KEYS *
1) "age"
2) "name"
3) "stu1"
4) "woman"
5) "wo"
6) "key2"
7) "key1"
8) "gender"
9) "1"
10) "topn"
11) "stu2"
127.0.0.1:6379>
127.0.0.1:6379> TYPE topn
zset
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379> ZINCRBY topn 100 a
"100"
127.0.0.1:6379> ZINCRBY topn 200 b
"200"
127.0.0.1:6379> ZINCRBY topn 200 c
"200"
127.0.0.1:6379> ZINCRBY topn 2000 e
"2000"
127.0.0.1:6379>
127.0.0.1:6379> ZINCRBY topn 20000 f
"20000"
127.0.0.1:6379>
127.0.0.1:6379> ZINCRBY topn 20000 g
"20000"
127.0.0.1:6379>
127.0.0.1:6379> ZINCRBY topn 20000 h
"20000"
127.0.0.1:6379>
127.0.0.1:6379> ZINCRBY topn 20000 k
"20000"
127.0.0.1:6379>
127.0.0.1:6379> ZRANGE topn 0 -1
1) "d"
2) "a"
3) "b"
4) "c"
5) "e"
6) "f"
7) "g"
8) "h"
9) "k"
127.0.0.1:6379>
常用操作:
127.0.0.1:6379> KEYS *? ?redis獲取所有的key
1) "age"
2) "name"
3) "gender"
4) "woman"
5) "stu1"
6) "wo"
7) "stu2"
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379> TYPE stu1 #查看key的類(lèi)型
hash
127.0.0.1:6379>
127.0.0.1:6379> TYPE wo
list
127.0.0.1:6379> TYPE name
string
127.0.0.1:6379> LRANGE wo 0 -1? ?#list獲取一個(gè)key的所有元素值
1) "today is 4"
2) "today is 3"
3) "today is 2"
4) "today is 1"
127.0.0.1:6379>
127.0.0.1:6379> HGETALL stu1? ? #hash獲取所有的對(duì)象的鍵值對(duì)
1) "name"
2) "lisi"
3) "age"
4) "88"
5) "gender"
6) "m"
127.0.0.1:6379> KEYS name? #字符串獲取所有的key的值
1) "name"
127.0.0.1:6379>
參考:
http://www.itdecent.cn/p/8af6177f4c23