Redis数据类型--集合类型
夫陶公清風(fēng)千古,余又何人,敢稱庶幾
文章目錄
- 介紹
- 一、基本命令
- 1.增加/刪除元素
- 2.獲得集合中的所有元素
- 3.判斷元素是否在集合中
- 4.集合間運(yùn)算
- 二、命令進(jìn)階
- 1.獲取集合中元素個(gè)數(shù)
- 2.進(jìn)行集合運(yùn)算并鍵結(jié)果存儲(chǔ)
- 3.隨機(jī)獲得集合中的元素
- 4.從集合中彈出一個(gè)元素
介紹
一、基本命令
1.增加/刪除元素
SADD key member [member …] // 添加元素
特性:
- 用來(lái)向集合中增加一個(gè)或多個(gè)元素,鍵不存在自動(dòng)創(chuàng)建。
- 集合中不能有相同元素,加入相同元素會(huì)被忽略掉。
- 返回值是成功加入集合的元素?cái)?shù)量(忽略掉的元素不算)
SREM key member [member …] // 刪除元素
特性:
- 從集合中刪除一個(gè)或多個(gè)元素
- 返回值是此次刪除成功的元素個(gè)數(shù)
- 不存在的元素會(huì)被忽略掉
案例:
- SADD
- SREM
實(shí)踐:使用Java操作Redis數(shù)據(jù)庫(kù):SADD 、SREM
@Testpublic void test() {Jedis jedis = new Jedis("127.0.0.1", 6379);Long a = jedis.sadd("letters", new String[]{"a"});Long a_b_c = jedis.sadd("letters", new String[]{"a", "b", "c"});System.out.print("添加元素:a" + " ");System.out.println("返回值:" + a);System.out.print("添加元素:a、b、c" + " ");System.out.println("返回值:" + a_b_c);Long rm_a = jedis.srem("letters", new String[]{"a"});Long rm_a_b_c = jedis.srem("letters", new String[]{"a", "b", "c"});Long rm_d = jedis.srem("letters", "d");System.out.print("刪除元素:a" + " ");System.out.println("返回值:" + rm_a);System.out.print("刪除元素:a、b、c" + " ");System.out.println("返回值:" + rm_a_b_c);System.out.print("刪除元素:d" + " ");System.out.println("返回值:" + rm_d);} 添加元素:a 返回值:1 添加元素:a、b、c 返回值:2 刪除元素:a 返回值:1 刪除元素:a、b、c 返回值:2 刪除元素:d 返回值:02.獲得集合中的所有元素
SMEMBERS key
特性:
- 獲得集合中的所有元素
- key不存在時(shí)會(huì)返回空
3.判斷元素是否在集合中
SISMEMBER key member
特性:
- 無(wú)論集合中有多少個(gè)元素,時(shí)間復(fù)雜度都為:O(1)
- member存在時(shí)返回1,不存在時(shí)返回0
- key不存在時(shí)返回0
- 一次只能判斷一個(gè)元素,否則會(huì)報(bào)錯(cuò):(error) ERR wrong number of arguments for 'sismember' command
4.集合間運(yùn)算
SDIFF key [key …] // 差集運(yùn)算
特性:
- SDIFF 命令用來(lái)對(duì)多個(gè)集合執(zhí)行差集運(yùn)算。
- 集合A與集合B的差集表示為A-B,代表所有屬于A且不屬于B的元素構(gòu)成的集合 (如下圖所示),且A-B={x|x∈A且x∈B}。
- SDIFF 命令支持同時(shí)傳入多個(gè)鍵(key),當(dāng)有3個(gè)以上時(shí),計(jì)算順序是先計(jì)算前面兩個(gè),再把計(jì)算結(jié)果與后面一個(gè)計(jì)算,依此類推。
案例:
首先我們定義3個(gè)集合:setA:1 2 3 ;setB:2 3 4 ;setC:2 3,當(dāng)A與B執(zhí)行差集運(yùn)算A-B時(shí)因?yàn)樵贐中存在2 3 ,不存在1,所以結(jié)果為1,然后我們?cè)賹-B計(jì)算結(jié)果1與C集合進(jìn)行差集運(yùn)算(A-B)-C,也就是1與2 3 運(yùn)算,所以計(jì)算結(jié)果為1。
127.0.0.1:6379> sadd setA 1 2 3 (integer) 3 127.0.0.1:6379> sadd setB 2 3 4 (integer) 3 127.0.0.1:6379> sdiff setA setB 1) "1" 127.0.0.1:6379> sadd setC 2 3 (integer) 2 127.0.0.1:6379> sdiff setA setB setC 1) "1"SINTER key [ key …] // 交集運(yùn)算
特性:
- 用來(lái)對(duì)多個(gè)集合進(jìn)行交集運(yùn)算
- 集合A與集合B表示A∩B,代表所有屬于A且屬于B的元素構(gòu)成的集合,即A∩B={x|x∈A且x∈B}。
- 此命令支持同時(shí)傳入多個(gè)鍵,用法同交集運(yùn)算。
案例:
127.0.0.1:6379> smembers setA 1) "1" 2) "2" 3) "3" 127.0.0.1:6379> smembers setB 1) "2" 2) "3" 3) "4" 127.0.0.1:6379> sinter setA setB 1) "2" 2) "3"SUNION key [key …] // 并集運(yùn)算
特性:
- SUNION 命令用來(lái)對(duì)多個(gè)集合執(zhí)行并集運(yùn)算
- 集合A與集合B的并集表示A∪B,代表所有屬于A或?qū)儆贐的元素構(gòu)成的集合,即A∪B={x|x∈A或x∈B}。
- 此命令支持同時(shí)傳入多個(gè)鍵,用法同交集運(yùn)算。
案例:
127.0.0.1:6379> smembers setA 1) "1" 2) "2" 3) "3" 127.0.0.1:6379> smembers setB 1) "2" 2) "3" 3) "4" 127.0.0.1:6379> sunion setA setB 1) "1" 2) "2" 3) "3" 4) "4" 127.0.0.1:6379> smembers setC 1) "2" 2) "3" 127.0.0.1:6379> sunion setA setB setC 1) "1" 2) "2" 3) "3" 4) "4"二、命令進(jìn)階
1.獲取集合中元素個(gè)數(shù)
SCARD key
此命令用來(lái)獲取集合中的元素個(gè)數(shù),如果鍵存在,那么正常返回集合元素個(gè)數(shù),不存在則返回0.
7.0.0.1:6379> sadd nums 1 2 3 4 5 6 7 8 9 0 (integer) 10 127.0.0.1:6379> smembers nums1) "0"2) "1"3) "2"4) "3"5) "4"6) "5"7) "6"8) "7"9) "8" 10) "9" 127.0.0.1:6379> scard nums (integer) 10 127.0.0.1:6379> scard other //other鍵不存在,返回 0 (integer) 02.進(jìn)行集合運(yùn)算并鍵結(jié)果存儲(chǔ)
下面三個(gè)命令和去掉后綴STORE的用法相同,只是以下3個(gè)命令會(huì)將計(jì)算結(jié)果存儲(chǔ)到鍵destination中。
SDIFFSTORE destination key [key …]
SINTERSTORE destination key [key …]
SUNIONSTORE destination key [key …]
上面三個(gè)命令的用法和之前的SDIFF SINTER SUNION 用法相同,這里不再詳細(xì)介紹。
127.0.0.1:6379> sadd setA 1 2 3 (integer) 3 127.0.0.1:6379> sadd setB 2 3 4 (integer) 3 127.0.0.1:6379> sadd setC 4 5 6 (integer) 3 127.0.0.1:6379> sdiffstore AB setA setB //將集合setA與集合setB的計(jì)算結(jié)果存儲(chǔ)到集合AB中 (integer) 1 127.0.0.1:6379> keys * 1) "nums" 2) "setB" 3) "setA" 4) "setC" 5) "AB" 127.0.0.1:6379> smembers AB 1) "1"3.隨機(jī)獲得集合中的元素
SRANDMEMBER key [count]
特性:
- SRANDMEMBER 命令用來(lái)隨機(jī)從集合中隨機(jī)獲取一個(gè)元素(沒(méi)有count參數(shù)情況下)。
- 有count參數(shù)可以一次隨機(jī)獲得多個(gè)元素
- 當(dāng)count為整數(shù)時(shí),獲取到的是count個(gè)不重復(fù)的元素
- 當(dāng)count為整數(shù)且大于集合中的元素個(gè)數(shù)時(shí),會(huì)返回集合中的全部元素
- 當(dāng)count為負(fù)數(shù)時(shí),會(huì)隨機(jī)從集合里獲得|count|個(gè)元素,且這些元素可能相同。
案例:
127.0.0.1:6379> sadd num 1 2 3 4 5 6 7 8 9 (integer) 9 127.0.0.1:6379> smembers num 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 6) "6" 7) "7" 8) "8" 9) "9" 127.0.0.1:6379> srandmember num //隨機(jī)獲取一個(gè)元素 "4" 127.0.0.1:6379> srandmember num //隨機(jī)獲取一個(gè)元素 "9" 127.0.0.1:6379> srandmember num 2 //隨機(jī)獲取2個(gè)元素 帶參數(shù) 1) "5" 2) "7" 127.0.0.1:6379> srandmember num 3 //隨機(jī)獲取3個(gè)元素 帶參數(shù) 1) "2" 2) "7" 3) "4" 127.0.0.1:6379> srandmember num 999 //count參數(shù)大于集合中的元素,獲得全部元素 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 6) "6" 7) "7" 8) "8" 9) "9" 127.0.0.1:6379> srandmember num -5 //count參數(shù)為負(fù)數(shù),獲取絕對(duì)值個(gè)元素,這些元素可能相同 1) "8" 2) "8" 3) "6" 4) "8" 5) "4" 127.0.0.1:6379> srandmember num -9 1) "8" 2) "2" 3) "4" 4) "8" 5) "9" 6) "3" 7) "3" 8) "9" 9) "4" 127.0.0.1:6379> srandmember num -11 // count負(fù)值大于集合中所有元素1) "8"2) "3"3) "4"4) "1"5) "6"6) "2"7) "2"8) "1"9) "4" 10) "6" 11) "4"4.從集合中彈出一個(gè)元素
SPOP key
此命令的作用是從集合左邊彈出(刪除)一個(gè)元素,然后返回元素的值,由于集合無(wú)序,所以彈出的元素是隨機(jī)
7.0.0.1:6379> sadd nums 1 2 3 4 5 6 7 8 (integer) 8 127.0.0.1:6379> smembers nums 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 6) "6" 7) "7" 8) "8" 127.0.0.1:6379> spop nums "3" 127.0.0.1:6379> spop nums "5" 127.0.0.1:6379> spop nums "1"注:從上面的案例結(jié)果中可以看出彈出的元素是隨機(jī)的。
Redis中文官方網(wǎng)站:http://www.redis.cn
未完待續(xù),持續(xù)更新中...
總結(jié)
以上是生活随笔為你收集整理的Redis数据类型--集合类型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: angular图片上传
- 下一篇: 一条SQL语句查询当前数据库下有多少张表