概述
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測試。