redis五大基本數(shù)據(jù)類型及常用指令

概述

Redis 是一個開源(BSD許可)的瞎颗,內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)存儲系統(tǒng)坐搔,它可以用作數(shù)據(jù)庫婉徘、緩存和消息中間件漠嵌。 它支持多種類型的數(shù)據(jù)結(jié)構(gòu)咐汞,如 字符串(strings), 散列(hashes)儒鹿, 列表(lists)化撕, 集合(sets), 有序集合(sorted sets) 與范圍查詢约炎, bitmaps植阴, hyperloglogs 和 地理空間(geospatial) 索引半徑查詢。 Redis 內(nèi)置了 復(fù)制(replication)圾浅,LUA腳本(Lua scripting)掠手, LRU驅(qū)動事件(LRU eviction),事務(wù)(transactions) 和不同級別的 磁盤持久化(persistence)狸捕, 并通過 Redis哨兵(Sentinel)和自動 分區(qū)(Cluster)提供高可用性(high availability)喷鸽。

Redis有16個數(shù)據(jù)庫,默認使用第0個數(shù)據(jù)庫灸拍。Redis是單線程的做祝。

String類型

  • set(key, value):給數(shù)據(jù)庫中名稱為 key 的 string 賦予值 value
127.0.0.1:6379> set name makunpeng
OK
127.0.0.1:6379> keys *
1) "name"
  • get(key):返回數(shù)據(jù)庫中名稱為 key 的 string 的 value
127.0.0.1:6379> get name
"makunpeng"
  • getset(key, value):給名稱為 key 的 string 賦予上一次的 value
127.0.0.1:6379> getset age 25   //沒有該key不會自動創(chuàng)建,返回nil
(nil)
127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> getset age 25  //存在該key則先返回key的原值鸡岗,之后用新值替換原值
"20"
127.0.0.1:6379> get age
"25"
  • setnx(key, value):若key不存在混槐,創(chuàng)建key,寫入value轩性;若key存在声登,則創(chuàng)建失敗。
127.0.0.1:6379> keys *
1) "age"
2) "name"
127.0.0.1:6379> setnx sex male
(integer) 1
127.0.0.1:6379> keys *
1) "sex"
2) "age"
3) "name"
127.0.0.1:6379> setnx sex female
(integer) 0
  • setex(key, time, value):向庫中添加 string揣苏,設(shè)定過期時間 time
127.0.0.1:6379> keys *
1) "sex"
2) "age"
3) "name"
127.0.0.1:6379> setex age 10 25
OK
127.0.0.1:6379> ttl age
(integer) -2
127.0.0.1:6379> keys *
1) "sex"
2) "name"
  • mset(key N, value N):批量設(shè)置多個 string 的值
127.0.0.1:6379> keys *
1) "sex"
2) "name"
127.0.0.1:6379> mset age 25 k1 hello k2 world
OK
127.0.0.1:6379> keys *
1) "sex"
2) "age"
3) "k1"
4) "k2"
5) "name"
  • mget(key1, key2,…, key N):返回庫中多個 string 的 value
127.0.0.1:6379> mget name age sex k1 k2
1) "makunpeng"
2) "25"
3) "male"
4) "hello"
5) "world"
  • msetnx(key N, value N):如果所有名稱為 key 的 string 都不存在(原子性:要么都成功悯嗓,要么都失敗。)
127.0.0.1:6379> keys *
1) "sex"
2) "age"
3) "k1"
4) "k2"
5) "name"
127.0.0.1:6379> msetnx name zhangsan k4 haha
(integer) 0
127.0.0.1:6379> keys *
1) "sex"
2) "age"
3) "k1"
4) "k2"
5) "name"
127.0.0.1:6379> msetnx k4 haha k5 hehe
(integer) 1
127.0.0.1:6379> keys *
1) "k4"
2) "sex"
3) "age"
4) "k1"
5) "k5"
6) "k2"
7) "name"
  • incr(key):名稱為 key 的 string 增 1 操作
127.0.0.1:6379> mset money 100 out 0
OK
127.0.0.1:6379> incr out
(integer) 1
127.0.0.1:6379> get out
"1"
  • incrby(key, integer):名稱為 key 的 string 增加 integer增量
127.0.0.1:6379> get out
"1"
127.0.0.1:6379> incrby out 19
(integer) 20
127.0.0.1:6379> get out
"20"
  • decr(key):名稱為 key 的 string 減 1 操作
127.0.0.1:6379> decr money
(integer) 99
127.0.0.1:6379> get money
"99"
  • decrby(key, integer):名稱為 key 的 string 減少 integer減量
127.0.0.1:6379> get money
"99"
127.0.0.1:6379> decrby money 19
(integer) 80
127.0.0.1:6379> get money
"80"
  • append(key, value):名稱為 key 的 string 的值附加 value
127.0.0.1:6379> set k1 hello
OK
127.0.0.1:6379> get k1
"hello"
127.0.0.1:6379> APPEND k1 world
(integer) 10
127.0.0.1:6379> get k1
"helloworld"
  • getrange(key,beginIndex,endIndex):返回按指定范圍截取的字符串
127.0.0.1:6379> get k1
"helloworld"
127.0.0.1:6379> GETRANGE k1 2 4
"llo"
  • setrange(key,Index,val):替換指定位置的字符串
127.0.0.1:6379> get k1
"helloworld,zhangsan"
127.0.0.1:6379> setrange k1 11 ,mkp
(integer) 19
127.0.0.1:6379> get k1
"helloworld,,mkpgsan"
  • substr(key, start, end):返回名稱為 key 的 string 的 value 的子串
127.0.0.1:6379> get k1
"helloworld,,mkpgsan"
127.0.0.1:6379> substr k1 12 15
"mkpg"

String類型的應(yīng)用場景:

  • 計數(shù)器
  • 統(tǒng)計多單位數(shù)量
  • 粉絲數(shù)
  • 對象緩存存儲

List類型(有序舒岸、可重復(fù))

  • rpush(key, value):在名稱為 key 的 list 尾添加一個值為 value 的元素
127.0.0.1:6379> rpush name mkp
(integer) 1
127.0.0.1:6379> rpush name lisi
(integer) 2
127.0.0.1:6379> rpush name zhangsan
(integer) 3
127.0.0.1:6379> lrange name 0 -1
1) "mkp"
2) "lisi"
3) "zhangsan"
  • lpush(key, value):在名稱為 key 的 list 頭添加一個值為 value 的元素
127.0.0.1:6379> lpush list one
(integer) 1
127.0.0.1:6379> lpush list two
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3
  • llen(key):返回名稱為 key 的 list 的長度
127.0.0.1:6379> llen list
(integer) 3
  • lrange(key, start, end):返回名稱為 key 的 list 中 start 至 end 之間的元素
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
  • ltrim(key, start, end):截取名稱為 key 的 list
127.0.0.1:6379> ltrim list 1 2
OK
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
  • lindex(key, index):返回名稱為 key 的 list 中 index 位置的元素
127.0.0.1:6379> lrange name 0 -1
1) "mkp"
2) "lisi"
3) "zhangsan"
127.0.0.1:6379> lindex name 2
"zhangsan"
  • lset(key, index, value):給名稱為 key 的 list 中 index 位置的元素賦值
127.0.0.1:6379> lindex name 2
"zhangsan"
127.0.0.1:6379> lset name 2 John
OK
127.0.0.1:6379> lindex name 2
"John"
  • lrem(key, count, value):刪除 count 個 key 的 list 中值為 value 的元素
127.0.0.1:6379> lrange name 0 -1
1) "Tom"
2) "Tom"
3) "Tom"
4) "Tom"
5) "mkp"
6) "lisi"
7) "John"
127.0.0.1:6379> lrem name 3 Tom
(integer) 3
127.0.0.1:6379> lrange name 0 -1
1) "Tom"
2) "mkp"
3) "lisi"
4) "John"
  • lpop(key):返回并刪除名稱為 key 的 list 中的首元素
127.0.0.1:6379> lrange name 0 -1
1) "Tom"
2) "mkp"
3) "lisi"
4) "John"
127.0.0.1:6379> lpop name
"Tom"
127.0.0.1:6379> lrange name 0 -1
1) "mkp"
2) "lisi"
3) "John"
  • rpop(key):返回并刪除名稱為 key 的 list 中的尾元素
127.0.0.1:6379> lrange name 0 -1
1) "mkp"
2) "lisi"
3) "John"
127.0.0.1:6379> rpop name
"John"
127.0.0.1:6379> lrange name 0 -1
1) "mkp"
2) "lisi"
  • linsert(key,before/after,Val ,insertVal):將某個值插入到列表中的指定元素的前一位或者后一位
127.0.0.1:6379> lrange name 0 -1
1) "mkp"
2) "lisi"
127.0.0.1:6379> linsert name before mkp jack
(integer) 3
127.0.0.1:6379> lrange name 0 -1
1) "jack"
2) "mkp"
3) "lisi"
127.0.0.1:6379> linsert name after lisi Tom
(integer) 4
127.0.0.1:6379> lrange name 0 -1
1) "jack"
2) "mkp"
3) "lisi"
4) "Tom"
  • rpoplpush(srckey, dstkey):返回并刪除名稱為 srckey 的 list 的尾元素,并將該元素添加到名稱為 dstkey 的 list 的頭部
127.0.0.1:6379> lrange name 0 -1
1) "jack"
2) "mkp"
3) "lisi"
4) "Tom"
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> rpoplpush name list
"Tom"
127.0.0.1:6379> lrange name 0 -1
1) "jack"
2) "mkp"
3) "lisi"
127.0.0.1:6379> lrange list 0 -1
1) "Tom"
2) "two"
3) "one"

List實際上是一個雙向鏈表芦圾。若key不存在蛾派,創(chuàng)建一個新鏈表;若key存在个少,新增內(nèi)容洪乍。移除所有值,空鏈表夜焦,也就代表不存在壳澳。在兩邊插入或改動值,效率最高茫经;插入中間元素巷波,效率相對較低萎津。

Set類型(無序、無重復(fù))

  • sadd(key, member...):向名稱為 key 的 set 中添加一個或多個元素 member
127.0.0.1:6379> sadd name mkp
(integer) 1
127.0.0.1:6379> sadd name mkp xiaofu panghu //redis單條指令遵循原子性抹镊,即要么都成功锉屈,要么都失敗。
(integer) 0
127.0.0.1:6379> sadd name xiaofu panghu daxiong jingxiang
(integer) 
  • smembers(key) :返回名稱為 key 的 set 的所有元素
127.0.0.1:6379> smembers name
1) "jingxiang"
2) "xiaofu"
3) "xiaohong"
4) "mkp"
5) "daxiong"
6) "panghu"
  • srem(key, member) :刪除名稱為 key 的 set 中的元素 member
127.0.0.1:6379> smembers name
1) "jingxiang"
2) "xiaofu"
3) "xiaohong"
4) "mkp"
5) "daxiong"
6) "panghu"
127.0.0.1:6379> srem name xiaohong
(integer) 1
127.0.0.1:6379> smembers name
1) "jingxiang"
2) "xiaofu"
3) "mkp"
4) "daxiong"
5) "panghu"
  • srandmember(key) :隨機返回名稱為 key 的 set 的一個元素
127.0.0.1:6379> smembers name
1) "xiaofu"
2) "mkp"
3) "daxiong"
127.0.0.1:6379> srandmember name
"mkp"
  • spop(key) :隨機返回并刪除名稱為 key 的 set 中一個元素
127.0.0.1:6379> smembers name
1) "jingxiang"
2) "xiaofu"
3) "mkp"
4) "daxiong"
5) "panghu"
127.0.0.1:6379> spop name
"jingxiang"
127.0.0.1:6379> smembers name
1) "xiaofu"
2) "mkp"
3) "daxiong"
4) "panghu"
  • smove(srckey, dstkey, member) :移到集合元素
127.0.0.1:6379> smembers name
1) "xiaofu"
2) "mkp"
3) "daxiong"
4) "panghu"
127.0.0.1:6379> smove name set panghu
(integer) 1
127.0.0.1:6379> smembers set
1) "panghu"
  • scard(key) :返回名稱為 key 的 set 的長度
127.0.0.1:6379> scard name
(integer) 3
  • sismember(key, member) :member 是否是名稱為 key 的 set 的元素
127.0.0.1:6379> sismember name mkp
(integer) 1
127.0.0.1:6379> sismember name panghu
(integer) 0
127.0.0.1:6379> smembers name
1) "xiaofu"
2) "mkp"
3) "daxiong"
  • sinter(key1, key2,…key N) :求交集
127.0.0.1:6379> smembers name
1) "xiaofu"
2) "mkp"
3) "daxiong"
4) "panghu"
5) "jack"
127.0.0.1:6379> smembers set
1) "xiaofu"
2) "tom"
3) "panghu"
4) "jack"
127.0.0.1:6379> sinter name set
1) "xiaofu"
2) "panghu"
3) "jack"
  • sunion(key1, (keys)) :求并集
127.0.0.1:6379> smembers name
1) "xiaofu"
2) "mkp"
3) "daxiong"
4) "panghu"
5) "jack"
127.0.0.1:6379> smembers set
1) "xiaofu"
2) "tom"
3) "panghu"
4) "jack"
127.0.0.1:6379> sunion name set
1) "xiaofu"
2) "mkp"
3) "daxiong"
4) "tom"
5) "panghu"
6) "jack"
  • sdiff(key1, (keys)) :求差集
127.0.0.1:6379> smembers name
1) "xiaofu"
2) "mkp"
3) "daxiong"
4) "panghu"
5) "jack"
127.0.0.1:6379> smembers set
1) "xiaofu"
2) "tom"
3) "panghu"
4) "jack"
127.0.0.1:6379> sdiff name set
1) "daxiong"
2) "mkp"

set類型的應(yīng)用場景:
利用set集合的無序垮耳、無重復(fù)的特性颈渊,再加上它可以進行求解兩集合的交、并终佛、差集的方法俊嗽,我們可以用它來做:

  • 微博、博客的共同關(guān)注
  • 微信好友間的共同愛好
  • 微信铃彰、QQ等社交軟件的推薦好友(六度分割理論)

Hash類型

  • hset(key, field, value):向名稱為 key 的 hash 中添加元素 field
127.0.0.1:6379> hset User name mkp
(integer) 1
  • hget(key, field):返回名稱為 key 的 hash 中 field 對應(yīng)的 value
127.0.0.1:6379> hget User name
"mkp"
  • hmset(key, (fields)):添加多個值
127.0.0.1:6379> hmset User name mkp age 25 sex male
OK
  • hmget(key, (fields)):獲取多個值
127.0.0.1:6379> hmget User name age sex
1) "mkp"
2) "25"
3) "male"
  • hincrby(key, field, integer):將名稱為 key 的 hash 中 field 的 value 增加 integer 量
127.0.0.1:6379> hget User age
"25"
127.0.0.1:6379> hincrby User age 10
(integer) 35
  • hexists(key, field):名稱為 key 的 hash 中是否存在鍵為 field 的域
127.0.0.1:6379> HEXISTS User name
(integer) 1
127.0.0.1:6379> HEXISTS User k1
(integer) 0
  • hdel(key, field):刪除名稱為 key 的 hash 中鍵為 field 的域
127.0.0.1:6379> hkeys User
1) "name"
2) "age"
3) "sex"
127.0.0.1:6379> hdel User age
(integer) 1
127.0.0.1:6379> hkeys User
1) "name"
2) "sex"
  • hlen(key):返回名稱為 key 的 hash 中元素個數(shù)
127.0.0.1:6379> hkeys User
1) "name"
2) "sex"
127.0.0.1:6379> hlen User
(integer) 2
  • hkeys(key):返回名稱為 key 的 hash 中所有鍵
127.0.0.1:6379> hkeys User
1) "name"
2) "sex"
  • hvals(key):返回名稱為 key 的 hash 中所有鍵對應(yīng)的 value
127.0.0.1:6379> hvals User
1) "mkp"
2) "male"
  • hgetall(key):返回名稱為 key 的 hash 中所有的鍵(field)及其對應(yīng)的 value
127.0.0.1:6379> hgetall User
1) "name"
2) "mkp"
3) "sex"
4) "male"
  • hsetnx(key,fields):存在該key绍豁,則設(shè)置值;不存在豌研,則不可設(shè)置值妹田。
127.0.0.1:6379> hsetnx User age 25
(integer) 1
127.0.0.1:6379> hgetall User
1) "name"
2) "mkp"
3) "sex"
4) "male"
5) "age"
6) "25"
127.0.0.1:6379> hsetnx User age 10
(integer) 0
127.0.0.1:6379> hgetall User
1) "name"
2) "mkp"
3) "sex"
4) "male"
5) "age"
6) "25"

hash類型適合存儲變更數(shù)據(jù),更適合對象的存儲鹃共。

sorted sets類型(“有序”鬼佣,無重復(fù),可以根據(jù)sorted排序)

  • zadd(key,element...):在名稱為key的set里添加一個或多個element霜浴。
127.0.0.1:6379> zadd salary 2000 mkp 
(integer) 1
127.0.0.1:6379> zadd salary 2500 tom 
(integer) 1
127.0.0.1:6379> zadd salary 3500 jack 
(integer) 1
  • zrange(key,start,end):查看set中指定范圍內(nèi)的所有元素晶衷。
127.0.0.1:6379> zrange salary 0 -1
1) "mkp"
2) "tom"
3) "jack"
  • zrangebyscore(key,-inf,+inf):查看set中的所有元素,并從小到大排序。
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf
1) "mkp"
2) "tom"
3) "jack"
  • zrevrange(key,0,-1):查看set中的所有元素,并從大到小排序阴孟。
127.0.0.1:6379> zrevrange salary 0 -1
1) "jack"
2) "tom"
3) "mkp"
  • zrem(key,element):從set中移除指定元素晌纫。
127.0.0.1:6379> zrem salary tom
(integer) 1
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf
1) "mkp"
2) "jack"
  • zcard(key):獲取set長度。
127.0.0.1:6379> zcard salary
(integer) 3
  • zcount(key,start,end):獲取指定區(qū)間的元素數(shù)量永丝。
127.0.0.1:6379> zcount salary 2000 2800
(integer) 2

sorted sets類型應(yīng)用場景:

  • 存儲成績表锹漱、工資表。
  • 帶權(quán)重進行判斷慕嚷。
  • 網(wǎng)易云音樂熱榜哥牍,TopN測試。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載喝检,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者嗅辣。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市挠说,隨后出現(xiàn)的幾起案子澡谭,更是在濱河造成了極大的恐慌,老刑警劉巖损俭,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛙奖,死亡現(xiàn)場離奇詭異潘酗,居然都是意外死亡,警方通過查閱死者的電腦和手機外永,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門崎脉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人伯顶,你說我怎么就攤上這事囚灼。” “怎么了祭衩?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵灶体,是天一觀的道長。 經(jīng)常有香客問我掐暮,道長蝎抽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任路克,我火速辦了婚禮樟结,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘精算。我一直安慰自己瓢宦,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布灰羽。 她就那樣靜靜地躺著驮履,像睡著了一般。 火紅的嫁衣襯著肌膚如雪廉嚼。 梳的紋絲不亂的頭發(fā)上玫镐,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機與錄音怠噪,去河邊找鬼恐似。 笑死,一個胖子當(dāng)著我的面吹牛傍念,可吹牛的內(nèi)容都是我干的矫夷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼捂寿,長吁一口氣:“原來是場噩夢啊……” “哼口四!你這毒婦竟也來了孵运?” 一聲冷哼從身側(cè)響起秦陋,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎治笨,沒想到半個月后驳概,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赤嚼,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年顺又,在試婚紗的時候發(fā)現(xiàn)自己被綠了更卒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡稚照,死狀恐怖蹂空,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情果录,我是刑警寧澤上枕,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站弱恒,受9級特大地震影響辨萍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜返弹,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一锈玉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧义起,春花似錦拉背、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至穷蛹,卻和暖如春土陪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肴熏。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工鬼雀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蛙吏。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓源哩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鸦做。 傳聞我的和親對象是個殘疾皇子励烦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355