豐富的數(shù)據(jù)類型是Redis作為緩存系統(tǒng)的最大優(yōu)勢之一彩郊,區(qū)別于Memcache僅支持簡單的key-value類型找岖,Redis支持五種數(shù)據(jù)類型:string(字符串)绑改,hash(哈希)沪编,list(列表)苦始,set(集合)及zset(sorted set:有序集合)
帖池。
各個(gè)數(shù)據(jù)類型應(yīng)用場景:
類型 | 簡介 | 特性 | 場景 |
---|---|---|---|
String(字符串) | 二進(jìn)制安全 | 可以包含任何數(shù)據(jù),比如jpg圖片或者序列化的對象,一個(gè)鍵最大能存儲512M | --- |
Hash(字典) | 鍵值對集合,即編程語言中的Map類型 | 適合存儲對象,并且可以像數(shù)據(jù)庫中update一個(gè)屬性一樣只修改某一項(xiàng)屬性值(Memcached中需要取出整個(gè)字符串反序列化成對象修改完再序列化存回去) | 存儲奈惑、讀取、修改用戶屬性 |
List(列表) | 鏈表(雙向鏈表) | 增刪快,提供了操作某一段元素的API | 1,最新消息排行等功能(比如朋友圈的時(shí)間線) 2,消息隊(duì)列 |
Set(集合) | 哈希表實(shí)現(xiàn),元素不重復(fù) | 1睡汹、添加肴甸、刪除,查找的復(fù)雜度都是O(1) 2、為集合提供了求交集囚巴、并集原在、差集等操作 | 1、共同好友 2彤叉、利用唯一性,統(tǒng)計(jì)訪問網(wǎng)站的所有獨(dú)立ip 3庶柿、好友推薦時(shí),根據(jù)tag求交集,大于某個(gè)閾值就可以推薦 |
Sorted Set(有序集合) | 將Set中的元素增加一個(gè)權(quán)重參數(shù)score,元素按score有序排列 | 數(shù)據(jù)插入集合時(shí),已經(jīng)進(jìn)行天然排序 | 1、排行榜 2秽浇、帶權(quán)重的消息隊(duì)列 |
多數(shù)據(jù)庫知識點(diǎn)擊右角標(biāo)進(jìn)行跳轉(zhuǎn)[1]
注意:Redis的命令不區(qū)分大小寫浮庐,但是key 嚴(yán)格區(qū)分大小寫!<砘馈审残!
一、 準(zhǔn)備知識
1.1 Redis 客戶端
Redis 命令用于在 redis 服務(wù)上執(zhí)行操作,要在 redis 服務(wù)上執(zhí)行命令需要一個(gè) redis 客戶端斑举。Redis 客戶端在我們之前下載的的 redis 的安裝包中搅轿。
1.1.1 本地服務(wù)
啟動Redis 客戶端的基本語法為:
$ redis-cli
windows為雙擊bin目錄下:redis-cli.exe
。
連接到本地的 redis 服務(wù)并執(zhí)行 PING 命令富玷,該命令用于檢測 redis 服務(wù)是否啟動:
127.0.0.1:6379> ping
PONG
1.1.2 在遠(yuǎn)程服務(wù)
如果需要在遠(yuǎn)程 redis 服務(wù)上執(zhí)行命令璧坟,同樣我們使用的也是 redis-cli 命令既穆。
語法
$ redis-cli -h host -p port -a password
1.2 獲取符合規(guī)則的鍵名列表
keys pattern
,Redis Keys 命令用于查找所有符合給定模式 pattern 的 key 。
pattern
是一個(gè)支持glob風(fēng)格的通配符格式雀鹃,具體規(guī)則如下:
符號 | 含義 |
---|---|
? | 匹配一個(gè)字符 |
* | 匹配任意個(gè)字符幻工,包括0個(gè) |
[] | 匹配括號間的任一字符,可是使用“-”符號表示一個(gè)范圍褐澎,比如a[b-d]可以匹配“ab”会钝、“ac”伐蒋、“ad”工三。 |
\x | 匹配字符x,用于轉(zhuǎn)義符號先鱼。如果要匹配“?”俭正,就需要使用? |
案例:
我們先往Redis中塞幾個(gè)鍵值對:
set color red
set name erbadagang
set my_name guoxiuzhi
set age 18
然后使用keys *name
命令查看獲取Redis中所有的鍵。
127.0.0.1:6379[1]> keys *name
1) "my_name"
2) "name"
1.3 判斷一個(gè)鍵是否存在
exists key [key ...]
如果鍵存在則返回1焙畔,否則返回0掸读。比如:
127.0.0.1:6379[1]> exists name
(integer) 1
1.4 刪除某個(gè)鍵
del key [key ...]
刪除一個(gè)或多個(gè)鍵,返回值是刪除的鍵的個(gè)數(shù)宏多。比如:
127.0.0.1:6379[1]> del name my_name
(integer) 2
1.5 設(shè)置key過期時(shí)間
EXPIRE key seconds
為給定 key 設(shè)置過期時(shí)間儿惫,以秒計(jì)。
127.0.0.1:6379[1]> expire age 10
(integer) 1
127.0.0.1:6379[1]> get age
"18"
127.0.0.1:6379[1]> get age
(nil)
其他常用命令參考:https://www.runoob.com/redis/redis-keys.html
二伸但、Redis 字符串(String)
字符串類型是Redis中最基本的數(shù)據(jù)類型肾请,它能存儲任何形式的字符串,包括二進(jìn)制數(shù)據(jù)更胖。比如:郵箱铛铁、JSON化的對象甚至是一張圖片。一個(gè)字符串類型鍵允許存儲的數(shù)據(jù)的最大容量是512MB却妨。
string類型在Redis中的相關(guān)命令:
命令 | 用法 | 描述 |
---|---|---|
set | set key value | (1)將字符串value值設(shè)置到key上饵逐;(2)如果key有對應(yīng)的值,則會被覆蓋彪标;(3)如果原本key有過期時(shí)間倍权,則過期時(shí)間會被清除。 |
get | get key | (1)返回key對應(yīng)的字符串值捞烟;(2)如果key無對應(yīng)值薄声,則返回nil;(3)如果key對應(yīng)的值不是字符串坷襟,則返回錯(cuò)誤奸柬,因?yàn)間et只適用于字符串類型。 |
mset | mset key value [key value ...] | (1)同時(shí)設(shè)置一個(gè)或多個(gè)key-value鍵值對婴程;(2)如果key有對應(yīng)的值廓奕,則會被覆蓋;(3)mset是一個(gè)原子操作,所有的key都會在同一時(shí)間被設(shè)置桌粉,不會存在有些更新有些沒更新的情況蒸绩。 |
mget | mget key [key ...] | (1)返回一個(gè)或多個(gè)給定key對應(yīng)的值;(2)某個(gè)key不存在時(shí)返回nil铃肯。 |
setex | setex key seconds value | (1)將字符串value值設(shè)置到key上患亿;(2)設(shè)置key生存時(shí)間為seconds,單位為秒押逼;(3)如果key有對應(yīng)的值步藕,則會被覆蓋概荷。 |
setnx | setnx key value | (1)只有在 key 不存在時(shí)谭贪,將key的值設(shè)置為value;(2)若給定的key已經(jīng)存在中捆,setnx將不做任何操作漂彤。 |
append | APPEND key value | 如果 key 已經(jīng)存在并且是一個(gè)字符串雾消, APPEND 命令將指定的 value 追加到該 key 原來值(value)的末尾。 |
上面是string類型的基本命令挫望,
但是當(dāng)一個(gè)字符串可以轉(zhuǎn)換成數(shù)值時(shí)立润,我們可能還會接觸到以下幾個(gè)自增自減操作。
命令 | 用法 | 描述 |
---|---|---|
incr | incr key | (1)對key的值加1媳板,返回增加之后的值桑腮;(2)如果key不存在,則key會被初始化為0拷肌,再執(zhí)行incr操作到旦。 |
decr | decr key | (1)對key的值減1。 |
incrby | incrby key increment | (1)將key所存儲的值加上指定的數(shù)值巨缘,并返回增加之后的值添忘。 |
decrby | decrby key decrement | (1)將key的值減去一個(gè)指定的數(shù)值。 |
示例:
127.0.0.1:6379[1]> get color
"red"
127.0.0.1:6379[1]> append color ,purple
(integer) 10
127.0.0.1:6379[1]> get color
"red,purple"
127.0.0.1:6379[1]> set age 18
OK
127.0.0.1:6379[1]> incr age
(integer) 19
127.0.0.1:6379[1]> decr age
(integer) 18
127.0.0.1:6379[1]> incrby age 5
(integer) 23
三若锁、Redis 哈希(Hash)
我們知道Redis是采用字典結(jié)構(gòu)以鍵值對的形式存儲數(shù)據(jù)的搁骑,而hash類型的鍵值也是一種字典結(jié)構(gòu),其存儲了字段(field)和字段值的映射又固。
hash類型適合存儲對象:使用對象類型和對象唯一標(biāo)識作為key仲器,使用對象屬性作為字段名,屬性值作為字段值仰冠。
命令 | 用法 | 描述 |
---|---|---|
hset | hset key field value | (1)設(shè)置key的field值為value乏冀;(2)如果key不存在,則直接創(chuàng)建洋只;(3)如果field值已經(jīng)存在辆沦,則直接覆蓋昼捍。 |
hget | hget key field | (1)獲取指定key和field的值。 |
hdel | hdel key field [field ...] | (1)刪除key下的field值肢扯;(2)如果field不存在妒茬,則直接忽略。 |
hexists | hexists key filed | (1)查看是否存在指定key的field蔚晨,存在返回1乍钻,不存在返回0。 |
hgetall | hgetall key | (1)返回指定key的所有字段名和字段值铭腕。 |
hincrby | hincrby key field increment | (1)對指定key的field字段增加一個(gè)數(shù)值银择。 |
hkeys | hkeys key | (1)返回指定key的所有字段名。 |
hlen | hlen key | (1)返回指定key的所有字段名數(shù)量谨履。 |
hmget | hmget key field [field ...] | (1)返回指定key對應(yīng)字段名的值欢摄。 |
hmset | hmset key field value [field value ...] | (1)批量設(shè)置key的字段名和字段值。 |
hvals | hvals key | (1)返回指定key的所有字段值笋粟,可對比hkeys命令。 |
示例:
127.0.0.1:6379[1]> HMSET erbadagang_key name "guo xiu zhi" description "redis basic commands for hash" likes 20 visitors 88
OK
127.0.0.1:6379[1]> hgetall erbadagang_key
1) "name"
2) "guo xiu zhi"
3) "description"
4) "redis basic commands for hash"
5) "likes"
6) "20"
7) "visitors"
8) "88"
#取出likes字段的值
127.0.0.1:6379[1]> hget erbadagang_key likes
"20"
#likes字段的值+1
127.0.0.1:6379[1]> hincrby erbadagang_key likes 1
(integer) 21
四析蝴、Redis 列表(List)
列表類型(list)可以存儲一個(gè)有序的字符串列表害捕,常用的操作是向列表兩端添加元素,或者獲得列表的某一個(gè)片段闷畸。
列表類型內(nèi)部使用雙向鏈表實(shí)現(xiàn)的尝盼,所以向列表兩端添加元素的時(shí)間復(fù)雜度為O(1),獲取越接近兩端的元素速度越快佑菩。但是使用鏈表的代價(jià)是通過索引訪問元素比較慢盾沫。
命令 | 用法 | 描述 |
---|---|---|
lpush | lpush key value [value ...] | (1)將一個(gè)或多個(gè)值插入到列表key的表頭;(2)如果有多個(gè)value值殿漠,則從左到右的順序依次插入表頭赴精;(3)如果key不存在,則會創(chuàng)建一個(gè)空列表绞幌,然后執(zhí)行l(wèi)push操作蕾哟;如果key存在,但不是列表類型莲蜘,則返回錯(cuò)誤谭确。 |
lpushx | lpushx key value | (1)將value值插入到列表key的表頭,當(dāng)且僅當(dāng)key存在且是一個(gè)列表票渠;(2)如果key不存在時(shí)逐哈,lpushx命令什么都不會做。 |
lpop | lpop key | (1)移除并返回列表key的頭元素问顷。 |
lrange | lrange key start stop | (1)返回列表key中指定區(qū)間內(nèi)的元素昂秃;(2)start大于列表最大下標(biāo)是薯鼠,返回空列表;(3)可使用負(fù)數(shù)下標(biāo)械蹋,-1表示列表最后一個(gè)元素出皇,以此類推。 |
lrem | lrem key count value | (1)count>0表示從頭到尾搜索哗戈,移除與value相等的元素郊艘,數(shù)量為count;(2)count<0表示從尾到頭搜索唯咬,移除與value相等的元素纱注,數(shù)量為count;(3)count=0表示移除列表中所有與value相等的元素胆胰。 |
lset | lset key index value | (1)將列表key下標(biāo)為index的元素值設(shè)置為value狞贱;(2)當(dāng)index參數(shù)超出范圍,或?qū)σ粋€(gè)空列表進(jìn)行l(wèi)set操作時(shí)蜀涨,返回錯(cuò)誤瞎嬉。 |
lindex | lindex key index | (1)返回列表key中下標(biāo)為index的元素。 |
linsert | linsert key BEFORE AFTER pivot value | (1)將值value插入列表key中厚柳,位于pivot前面或者后面氧枣;(2)當(dāng)pivot不存在列表key中,或者key不存在時(shí)别垮,不執(zhí)行任何操作便监。 |
llen | len key | (1)返回列表key的長度,當(dāng)key不存在時(shí)碳想,返回0烧董。 |
rpop | rpop key | (1)移除并返回列表key的尾元素。 |
rpoplpush | rpoplpush source destination | (1)將列表source中最后一個(gè)元素彈出并返回給客戶端胧奔,并且將該元素插入到列表destincation的頭部逊移。 |
rpush | rpush key value [value ...] | (1)將一個(gè)或多個(gè)值插入到列表key的尾部。 |
rpushx | rpushx key value | (1)將value值插入到列表key的表尾葡盗,當(dāng)且僅當(dāng)key存在且是一個(gè)列表螟左;(2)如果key不存在時(shí),lpushx命令什么都不會做觅够。 |
示例:
127.0.0.1:6379[1]> lpush tech_key spring cloud
(integer) 2
127.0.0.1:6379[1]> lpush tech_key spring boot
(integer) 4
127.0.0.1:6379[1]> lpush tech_key JPA
(integer) 5
127.0.0.1:6379[1]> lpush tech_key Mysql
(integer) 6
127.0.0.1:6379[1]> lpush tech_key Redis
(integer) 7
127.0.0.1:6379[1]> llen tech_key
(integer) 7
127.0.0.1:6379[1]> lrange tech_key 0 7
1) "Redis"
2) "Mysql"
3) "JPA"
4) "boot"
5) "spring"
6) "cloud"
7) "spring"
五胶背、Redis 集合(Set)
Redis中的set類型是string類型的無序集合。集合類型的常用操作是向集合中加入或刪除元素喘先、判斷某個(gè)元素是否存在等钳吟,由于集合類型在Redis內(nèi)部是使用值為空的散列表實(shí)現(xiàn)的,所以這些操作的時(shí)間復(fù)雜度都是O(1)窘拯。最方便的是多個(gè)集合類型鍵之間還可以進(jìn)行并集红且、交集和差集運(yùn)算坝茎。
命令 | 用法 | 描述 |
---|---|---|
sadd | sadd key member [member ...] | (1)將一個(gè)或多個(gè)member元素加入key中,已存在在集合中的member將被忽略暇番;(2)如果key不存在嗤放,則創(chuàng)建一個(gè)只包含member元素的集合;(3)當(dāng)key不是集合類型時(shí)壁酬,將返回一個(gè)錯(cuò)誤次酌。 |
scard | scard key | (1)返回key對應(yīng)的集合中的元素?cái)?shù)量。 |
sdiff | sdiff key [key ...] | (1)返回所有key對應(yīng)的集合的差集舆乔。 |
sdiffstore | sdiffstore destionation key [key ...] | (1)返回所有key對應(yīng)的集合的差集岳服,并把該差集賦值給destionation;(2)如果destionation已經(jīng)存在希俩,則直接覆蓋吊宋。 |
sinter | sinter key [key ...] | (1)返回所有key對應(yīng)的集合的交集;(2)不存在的key被視為空集颜武。 |
sinterstore | sinter destionation key [key ...] | (1)返回所有key對應(yīng)的集合的交集璃搜,并把該交集賦值給destionation;(2)如果destionation已經(jīng)存在盒刚,則直接覆蓋腺劣。 |
sismember | sismember key member | (1)判斷member元素是否是key的成員,0表示不是因块,1表示是。 |
smembers | smember key | (1)返回集合key中的所有成員籍铁;(2)不存在的key被視為空集涡上。 |
srem | srem key member [member ...] | (1)移除集合key中的一個(gè)或多個(gè)member元素,不存在的member將被忽略拒名。 |
sunion | sunion key [key ...] | (1)返回所有key對應(yīng)的集合的并集吩愧;(2)不存在的key被視為空集。 |
sunionstore | sunionstore destionation key [key ...] | (1)返回所有key對應(yīng)的集合的并集增显,并把該并集賦值給destionation雁佳;(2)如果destionation已經(jīng)存在,則直接覆蓋同云。 |
示例:
127.0.0.1:6379[1]> sadd set_key spring cloud
(integer) 2
127.0.0.1:6379[1]> sadd set_key spring boot
(integer) 1
127.0.0.1:6379[1]> sadd set_key JPA
(integer) 1
127.0.0.1:6379[1]> sadd set_key Mysql
(integer) 1
127.0.0.1:6379[1]> sadd set_key Redis
(integer) 1
127.0.0.1:6379[1]> smembers set_key
1) "JPA"
2) "cloud"
3) "spring" #設(shè)置了2次只有一個(gè)糖权。
4) "Redis"
5) "boot"
6) "Mysql"
#兩個(gè)集合交集
127.0.0.1:6379[1]> sadd set2_key spring cloud
(integer) 2
127.0.0.1:6379[1]> sadd set2_key Redis
(integer) 1
127.0.0.1:6379[1]>
127.0.0.1:6379[1]> sinter set_key set2_key
1) "Redis"
2) "cloud"
3) "spring"
127.0.0.1:6379[1]>
六、Redis 有序集合(sorted set)
Redis 有序集合和集合一樣也是string類型元素的集合,且不允許重復(fù)的成員炸站。
不同的是每個(gè)元素都會關(guān)聯(lián)一個(gè)double類型的分?jǐn)?shù)星澳。redis正是通過分?jǐn)?shù)來為集合中的成員進(jìn)行從小到大的排序。
有序集合的成員是唯一的,但分?jǐn)?shù)(score)卻可以重復(fù)旱易。
示例:
127.0.0.1:6379[1]> zadd zset_key 1 cloud
(integer) 0
127.0.0.1:6379[1]> zadd zset_key 3 boot
(integer) 1
127.0.0.1:6379[1]> zadd zset_key 5 JPA
(integer) 0
127.0.0.1:6379[1]> zadd zset_key 4 Mysql
(integer) 0
127.0.0.1:6379[1]> zadd zset_key 5 Mysql
(integer) 0
127.0.0.1:6379[1]> zadd zset_key 6 Mysql #由于set的特性禁偎,score 為 6 的覆蓋前面的值腿堤,所以這個(gè)值有效。
(integer) 0
127.0.0.1:6379[1]> zadd zset_key 4 Redis
(integer) 0
127.0.0.1:6379[1]> zrange zset_key 0 7 withscores
1) "cloud"
2) "1"
3) "boot"
4) "3"
5) "Redis"
6) "4"
7) "JPA"
8) "5"
9) "Mysql"
10) "6"
-
注意:Redis支持多個(gè)數(shù)據(jù)庫如暖,并且每個(gè)數(shù)據(jù)庫的數(shù)據(jù)是隔離的不能共享笆檀,并且基于單機(jī)才有,如果是集群就沒有數(shù)據(jù)庫的概念盒至。
Redis是一個(gè)字典結(jié)構(gòu)的存儲服務(wù)器酗洒,而實(shí)際上一個(gè)Redis實(shí)例提供了多個(gè)用來存儲數(shù)據(jù)的字典,客戶端可以指定將數(shù)據(jù)存儲在哪個(gè)字典中妄迁。這與我們熟知的在一個(gè)關(guān)系數(shù)據(jù)庫實(shí)例中可以創(chuàng)建多個(gè)數(shù)據(jù)庫類似寝蹈,所以可以將其中的每個(gè)字典都理解成一個(gè)獨(dú)立的數(shù)據(jù)庫。
每個(gè)數(shù)據(jù)庫對外都是一個(gè)從0開始的遞增數(shù)字命名登淘,Redis默認(rèn)支持16個(gè)數(shù)據(jù)庫(可以通過配置文件支持更多箫老,無上限),可以通過配置databases來修改這一數(shù)字黔州∷w蓿客戶端與Redis建立連接后會自動選擇0號數(shù)據(jù)庫,不過可以隨時(shí)使用SELECT命令更換數(shù)據(jù)庫流妻,如要選擇1號數(shù)據(jù)庫:127.0.0.1:6379> select 1
然而這些以數(shù)字命名的數(shù)據(jù)庫又與我們理解的數(shù)據(jù)庫有所區(qū)別牲蜀。首先Redis不支持自定義數(shù)據(jù)庫的名字,每個(gè)數(shù)據(jù)庫都以編號命名绅这,開發(fā)者必須自己記錄哪些數(shù)據(jù)庫存儲了哪些數(shù)據(jù)涣达。另外Redis也不支持為每個(gè)數(shù)據(jù)庫設(shè)置不同的訪問密碼,所以一個(gè)客戶端要么可以訪問全部數(shù)據(jù)庫证薇,要么連一個(gè)數(shù)據(jù)庫也沒有權(quán)限訪問度苔。最重要的一點(diǎn)是多個(gè)數(shù)據(jù)庫之間并不是完全隔離的,比如FLUSHALL命令可以清空一個(gè)Redis實(shí)例中所有數(shù)據(jù)庫中的數(shù)據(jù)浑度。綜上所述寇窑,這些數(shù)據(jù)庫更像是一種命名空間,而不適宜存儲不同應(yīng)用程序的數(shù)據(jù)箩张。比如可以使用0號數(shù)據(jù)庫存儲某個(gè)應(yīng)用生產(chǎn)環(huán)境中的數(shù)據(jù)甩骏,使用1號數(shù)據(jù)庫存儲測試環(huán)境中的數(shù)據(jù),但不適宜使用0號數(shù)據(jù)庫存儲A應(yīng)用的數(shù)據(jù)而使用1號數(shù)據(jù)庫B應(yīng)用的數(shù)據(jù)先慷,不同的應(yīng)用應(yīng)該使用不同的Redis實(shí)例存儲數(shù)據(jù)饮笛。由于Redis非常輕量級,一個(gè)空Redis實(shí)例占用的內(nèi)在只有1M左右熟掂,所以不用擔(dān)心多個(gè)Redis實(shí)例會額外占用很多內(nèi)存缎浇。 ?