Redis五种数据类型详解
redis數(shù)據(jù)類型分為:字符串類型、散列類型、列表類型、集合類型、有序集合類型。
redis這么火,它運(yùn)行有多塊?一臺(tái)普通的筆記本電腦,可以在1秒鐘內(nèi)完成十萬(wàn)次的讀寫操作。
原子操作:最小的操作單位,不能繼續(xù)拆分。即最小的執(zhí)行單位,不會(huì)被其他命令插入。高并發(fā)下不存在競(jìng)態(tài)條件。
KEY的命名:一個(gè)良好的建議是article:1:title來(lái)存儲(chǔ)ID為1的文章的標(biāo)題。
一、前言。
1、獲取key的列表:KEYS pattern 通配符有?*[]和轉(zhuǎn)義\
2、key是否存在: EXISTS key 存在返回1,不存在返回0.
3、建立key和刪除key:SET key 和 DEL key
4、根據(jù)key獲取該鍵所存儲(chǔ)的redis數(shù)據(jù)類型:TYPE key。返回是string、list、hash、set、zset。下面會(huì)對(duì)這5種返回的redis數(shù)據(jù)類型逐一講解。
5、rename oldkey newkey:對(duì)key重命名,如果newkey存在則覆蓋。
6、renamenx oldkey newkey:對(duì)key重命名,如果newkey存在則不覆蓋。
7、randomkey:隨即返回一個(gè)key
8、move key db-index:將key移動(dòng)到指定的數(shù)據(jù)庫(kù)中,如果key不存在或者已經(jīng)在該數(shù)據(jù)庫(kù)中,則返回0。成功則返回1.
二、Redis數(shù)據(jù)類型 Redis數(shù)據(jù)命令
1、Redis數(shù)據(jù)類型一字符串類型:
這個(gè)很好理解,一個(gè)key存儲(chǔ)一個(gè)字符串。如果你要存數(shù)據(jù)呢?轉(zhuǎn)換成Json或者其他的字符串序列化。
2、Redis數(shù)據(jù)命令一字符串類型:
1)賦值:SET key value。如set hello world
2)取值:GET key。如get hello。返回是world
3)自增:INCR key。就是Mysql的AUTO_INCREMENT。每次執(zhí)行INCR key時(shí),該key的值都會(huì)+1.若key不存在,則先建立一個(gè)0,然后+1,返回1。如果值不是整數(shù)則報(bào)錯(cuò)。該操作是原子操作。
4)自減:DECR key。將指定key的值減少1.如DECR num,就是num-1
5)自增N:INCRBY key increment用來(lái)給指定key的值加increment。如INCRBY num 5就是num+5
6)自減N:DECRBY key increment用來(lái)給指定key的值減increment。如DECRBY num 5就是num-5
7)增加浮點(diǎn)數(shù):INCRBYFLOAT key increment。
8)向尾部追加:APPEND key value。如set test:key 123 ? ? append test:key 456 ? ? ?get test:key就是123456
9)獲取長(zhǎng)度:STRLEN key。
10)同時(shí)給多個(gè)key 賦值:MSET title 這是標(biāo)題 description 這是描述 content 這是內(nèi)容。
11)同時(shí)獲取多個(gè)key的值:MGET title description content
12)位操作之獲取:GETBIT key offset。如字符a在redis中的存儲(chǔ)為01100001(ASCII為98),那么GETBIT key 2就是1,GET key 0就是0。
13)位操作之設(shè)置:SETBIT key offset value。如字符a在redis中的存儲(chǔ)為01100001(ASCII為98),那么SETBIT key 6 0,SETBIT key 5 1那么get key得到的是b。因?yàn)槿〕龅亩M(jìn)制為01100010。
14)位操作之統(tǒng)計(jì):BITCOUNT key [start] [end]:BITCOUNT key用來(lái)獲取key的值中二進(jìn)制是1的個(gè)數(shù)。而B(niǎo)ITCOUNT key start end則是用來(lái)統(tǒng)計(jì)key的值中在第start和end之間的子字符串的二進(jìn)制是1的個(gè)數(shù)(好繞啊)。
15)位操作之位運(yùn)算:BITOP operation resultKey key1 key2。operation是位運(yùn)算的操作,有AND,OR,XOR,NOT。resultKey是把運(yùn)算結(jié)構(gòu)存儲(chǔ)在這個(gè)key中,key1和key2是參與運(yùn)算的key,參與運(yùn)算的key可以指定多個(gè)。
3、Redis數(shù)據(jù)類型二散列類型:
Redis是以字典(關(guān)聯(lián)數(shù)組)的形式存儲(chǔ)的,一個(gè)key對(duì)應(yīng)一個(gè)value。在字符串類型中,value只能是一個(gè)字符串。那么在散列類型,也叫哈希類型中,value對(duì)應(yīng)的也是一個(gè)字典(關(guān)聯(lián)數(shù)組)。那么就可以理解,Redis的哈希類型/散列類型中,key對(duì)應(yīng)的value是一個(gè)二維數(shù)組。但是字段的值只可以是字符串。也就是說(shuō)只能是二維數(shù)組,不能有更多的維度。
4、Redis數(shù)據(jù)命令二散列類型:
1)賦值:HSET key field value。如hset user name lane。hset user age 23
2)取值:HGET key field。如hget user name,得到的是lane。
3)同一個(gè)key多個(gè)字段賦值:HMSET key field1 value1 field2 value2…
4)同一個(gè)KEY多個(gè)字段取值:HMGET key field1 fields2…
5)獲取KEY的所有字段和所有值:HGETALL key。如HGETALL user得到的是name lane age 23。每個(gè)返回都是獨(dú)立的一行。
6)字段是否存在:HEXISTS key field。存在返回1,不存在返回0
7)當(dāng)字段不存在時(shí)賦值:HSETNX key field value。如果key下面的字段field不存在,則建立field字段,且值為value。如果field字段存在,則不執(zhí)行任何操作。它的效果等于HEXISTS + HSET。但是這個(gè)命令的優(yōu)點(diǎn)是原子操作。再高的并發(fā)也不會(huì)怕怕。
8)自增N:HINCREBY key field increment。同字符串的自增類型,不再闡述。
9)刪除字段:DEL key field1 field2…刪除指定KEY的一個(gè)或多個(gè)字段。10)只獲取字段名:HKEYS key。與HGETALL類似,但是只獲取字段名,不獲取字段值。
11)只獲取字段值:HVALS key。與HGETALL類似,但是只獲取字段值,不獲取字段名。
12)獲取字段數(shù)量:HLEN key。
5、Redis數(shù)據(jù)類型三列表類型:
列表類型存儲(chǔ)了一個(gè)有序的字符串列表。常用的操作是向兩端插入新的元素。時(shí)間復(fù)雜度為O(1)。結(jié)構(gòu)為一個(gè)鏈表。記錄頭和尾的地址。看到這里,Redis數(shù)據(jù)類型的列表類型一個(gè)重大的作用呼之欲出,那就是隊(duì)列。新來(lái)的請(qǐng)求插入到尾部,新處理過(guò)的從頭部刪除。另外,比如微博的新鮮事。比如日志。列表類型就是一個(gè)下標(biāo)從0開(kāi)始的數(shù)組。由于是鏈表存儲(chǔ),那么越靠近頭和尾的元素操作越快,越靠近中間則越慢。
6、Redis數(shù)據(jù)命令三列表類型:
1)向頭部插入:LPUSH key value1 value2…。返回增加后的列表長(zhǎng)度。
2)向尾部插入:RPUSH key value1 value2…。返回增加后的列表長(zhǎng)度。
3)從頭部彈出:LPOP key。返回被彈出的元素值。該操作先刪除key列表的第一個(gè)元素,再將它返回。
4)從尾部彈出:RPOP key。返回被彈出的元素值。
5)列表元素個(gè)數(shù):LLEN key。key不存在返回0。
6)獲取列表的子列表:LRANGE start end。返回第start個(gè)到第end個(gè)元素的列表。包含start和end。支持負(fù)數(shù)索引。-1表示最后一個(gè)元素,-2表示倒數(shù)第二個(gè)元素。
7)刪除列表中指定值:LREM key count value。刪除key這個(gè)列表中,所有值為value的元素,只刪除count。如果有count+1個(gè),那么就保留最后一個(gè)。count不存在或者為0,則刪除所有的。如果count大于0,則刪除從頭到尾的count個(gè),如果count小于0,則刪除從尾到頭的count個(gè)。
8)獲取指定索引值:LINDEX key index。如LINDEX key 0就是列表的第一個(gè)元素。index可以是負(fù)數(shù)。
9)設(shè)置索引和值:LSET key index value。這個(gè)操作只是修改指定key且指定index的值。如果index不存在,則報(bào)錯(cuò)。
10)保留片段,刪除其它:LTRIM key start end。保留start到end之間的所有元素,含start和end。其他全部刪除。
11)向列表插入元素:LINSERT key BEFORE/AFTER value1 value2。從列表頭開(kāi)始遍歷,發(fā)現(xiàn)值為value1時(shí)停止,將value2插入,根據(jù)BEFORE或者AFTER插入到value1的前面還是后面。
12)把一個(gè)列表的一個(gè)元素轉(zhuǎn)到另一個(gè)列表:RPOPLPUSH list1 list2。將列表list1的右邊元素刪除,并把該與元素插入到列表list2的左邊。原子操作。
7、Redis數(shù)據(jù)類型四集合類型:
集合類型是為了方便對(duì)多個(gè)集合進(jìn)行操作和運(yùn)算。集合中每個(gè)元素不同且沒(méi)有順序的概念,每個(gè)元素都是且只能是一個(gè)字符串。常用操作是對(duì)集合插入、刪除、判斷等操作。時(shí)間復(fù)雜度尾O(1)。可以進(jìn)行交集、并集、差集運(yùn)算。例如文章1的有3個(gè)標(biāo)簽,是一個(gè)Redis數(shù)據(jù)類型集合類型存儲(chǔ)。文章2有3個(gè)標(biāo)簽,有一個(gè)Redis數(shù)據(jù)類型集合類型存儲(chǔ)。文章是1是mysql,文章2是講redis。那么交集是不是就交出了一個(gè)數(shù)據(jù)庫(kù)?(假設(shè)數(shù)據(jù)庫(kù)這個(gè)tag在兩篇文字都有)。集合類型在redis中的存儲(chǔ)是一個(gè)值為空的散列表。
8、Redis數(shù)據(jù)命令四集合類型:
1)增加:SADD key value。
2)刪除:SREM key value。
3)獲取指定集合的所有元素:SMEMBERS key。
4)判斷某個(gè)元素是否存在:SISMEMBER key value。
5)差集運(yùn)算:SDIFF key1 key2…。對(duì)多個(gè)集合進(jìn)行差集運(yùn)算。
6)交集運(yùn)算:SINNER key1 key2…。對(duì)多個(gè)集合進(jìn)行交集運(yùn)算。
7)并集運(yùn)算:SUNION key1 key2…。對(duì)多個(gè)集合進(jìn)行并集運(yùn)算。
8)獲取集合中元素個(gè)數(shù):SCARD key。返回集合中元素的總個(gè)數(shù)。
9)對(duì)差集、交集、并集運(yùn)算的結(jié)果存放在一個(gè)指定的key中:SDIFFSTORE storekey key1 key2。對(duì)key1和key2求差集,結(jié)果存放在key為storekey的集合中。SINNERSTORE和SUNIONSTORE類似。
10)獲取集合中的隨即元素:SRANDMEMBER key [count]。參數(shù)count可選,如果count不存在,則隨即一個(gè)。count大于0,則是不重復(fù)的count個(gè)元素。count小于0,則是一共|count|個(gè)元素,可以重復(fù)。
11)隨即彈出一個(gè)元素:SPOP key。隨即從集合中彈出一個(gè)元素并刪除,將該元素的值返回。
9、Redis數(shù)據(jù)類型五有序集合類型:
集合類型是無(wú)序的,每個(gè)元素是唯一的。那么有序集合就是有序的,每個(gè)元素是唯一的。有序集合類型和集合類型的差別是,有序集合為每個(gè)元素配備了一個(gè)屬性:分?jǐn)?shù)。有序集合就是根據(jù)分?jǐn)?shù)來(lái)排序的。有序集合是使用散列表和跳躍表實(shí)現(xiàn)的。所以和列表相比,操作中間元素的速度也很快。時(shí)間復(fù)雜度尾O(log(N))。Redis數(shù)據(jù)類型中的有序集合類型比Redis數(shù)據(jù)類型中的列表類型更加耗費(fèi)資源。
10、Redis數(shù)據(jù)命令五有序集合類型:
1)增加:ZADD key sorce1 value1 sorce2 value2…。
2)獲取分?jǐn)?shù):ZSCORE key value。獲取key的有序集合中值為value的元素的分?jǐn)?shù)。
3)獲取排名在某個(gè)范圍內(nèi)的元素列表:ZRANFGE key start stop [WITHSCORE]。獲取排名在start和end之間的元素列表,包含start和end2個(gè)元素。每個(gè)元素一行。如果有WITHSCORE參數(shù),則一行元素值,一行分?jǐn)?shù)。時(shí)間復(fù)雜度為O(LOGn+m)。如果分?jǐn)?shù)相同,則0<0<A<Z<a<z。
4)獲取指定分?jǐn)?shù)范圍的元素:ZRANGEBYSCORE key min max [WITHSCORE] [LIMIT offset count]。獲取分?jǐn)?shù)在min和max之間的元素列表。含兩頭。每個(gè)元素一行。如果有WITHSCORE參數(shù),則一行元素值,一行分?jǐn)?shù)。如果min大于max則順序反轉(zhuǎn)。
5)為某個(gè)元素增加分?jǐn)?shù):ZINCRBY key increment value。指定的有序集合的值為value的元素的分?jǐn)?shù)+increment。返回值后更改后的分?jǐn)?shù)。
6)獲取集合中元素的數(shù)量:ZCARD key。
7)獲取指定分?jǐn)?shù)范圍內(nèi)的元素個(gè)數(shù):ZCOUNT key min max。
8)刪除一個(gè)或多個(gè)元素:ZREM key value1 value2…
9)根據(jù)排名范圍刪除元素:ZREMRANGEBYRANK key start end。刪除排名在start和end中的元素。
10)按照分?jǐn)?shù)范圍刪除元素:ZREMRANGEBYSCORE key min max。
11)獲得元素排名(正序):ZRANK key value。獲取value在該集合中的從小到大的排名。
12)獲得元素排名(倒序):ZREVRANK key value。獲取value在該集合中從大到小的排名。
13)有序集合的交集:ZINTERSTORE storekey key1 key2…[WEIGHTS weight [weight..]] [AGGREGATE SUM|MIN|MAX]。用來(lái)計(jì)算多個(gè)集合的交集,結(jié)果存儲(chǔ)在storekey中。返回值是storekey的元素個(gè)數(shù)。AGGREGATE為SUM則storekey集合的每個(gè)元素的分?jǐn)?shù)是參與計(jì)算的集合分?jǐn)?shù)和。MIN是參與計(jì)算的分?jǐn)?shù)最小值。MAX是參與計(jì)算分?jǐn)?shù)最大值。WEIGHTS 設(shè)置每個(gè)集合的權(quán)重,如WEIGHTS 1 0.1。那么集合A的每個(gè)元素分?jǐn)?shù)1,集合B的每個(gè)元素分?jǐn)?shù)0.1
14)有序集合的并集:ZUNIONSTORE storekey key1 kye2…[WEIGHTS weight [weight..]] [AGGREGATE SUM|MIN|MAX]
總結(jié)
以上是生活随笔為你收集整理的Redis五种数据类型详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 复仇者联盟4预售火爆 一张票在eBay上
- 下一篇: 商务网站建设与维护【7】