這一篇文章將講述Redis中的set類型命令,一樣也是經過demo來說述,其餘部分這裏就不在贅述了。java
項目Github地址:https://github.com/rainbowda/learnWay/tree/master/learnRedis/case-setgit
demo功能是共同好友,整個demo的大體頁面以下。左邊是存儲到Redis中的數據,右邊是從Redis中彈出的數據。github
首先定義一個存儲a、b好友的keyredis
private static final String A_FRIEND_KEY = "friend:a"; private static final String B_FRIEND_KEY = "friend:b";
redis操做對象spring
private RedisTemplate redisTemplate; //string 命令操做對象 private ValueOperations valueOperations; //set 命令操做對象 private SetOperations setOperations;
set在Redis中的結構能夠看下圖(圖片來源於Redis in Action)。數組
命令 | 用例 | 描述 |
---|---|---|
SADD | SADD key member [member ...] | 添加一個或多個指定的member元素到集合的 key中 |
咱們來看看demo中的新增功能,點擊添加好友,往用戶A裏面添加一些好友。app
添加完畢後,A有好友一、二、3,B有好友二、三、4。dom
後臺java代碼以下學習
@RequestMapping(value = "/addFriend", method = RequestMethod.POST) public Long addFriend(String user, String friend) { String currentKey = A_FRIEND_KEY; if ("B".equals(user)) { currentKey = B_FRIEND_KEY; } //返回添加成功的條數 return setOperations.add(currentKey, friend); }
相同的redis命令以下spa
SADD friend:a 1 2 3 SADD friend:b 2 3 4
好友結構以下
命令 | 用例 | 描述 |
---|---|---|
SREM | SREM key member [member ...] | 在key集合中移除指定的元素 |
刪除功能以下
後臺java代碼以下
@RequestMapping(value = "/delFriend", method = RequestMethod.DELETE) public Long delFriend(String user, String friend) { String currentKey = A_FRIEND_KEY; if ("B".equals(user)) { currentKey = B_FRIEND_KEY; } //返回刪除成功的條數 return setOperations.remove(currentKey, friend); }
相同的redis命令以下
SREM friend:b 5
命令 | 用例 | 描述 |
---|---|---|
SMEMBERS | SMEMBERS key | 返回key集合全部的元素. |
後臺java代碼以下,分別查出A和B的好友,而後添加到map裏
@RequestMapping(value = "/getList", method = RequestMethod.GET) public Map getList() { Map map = new HashMap(); Set aFriend = setOperations.members(A_FRIEND_KEY); Set bFriend = setOperations.members(B_FRIEND_KEY); map.put("aFriend", aFriend); map.put("bFriend", bFriend); return map; }
相同的redis命令以下
SMEMBERS friend:a SMEMBERS friend:b
命令 | 用例 | 描述 |
---|---|---|
SINTER | SINTER key [key ...] | 返回指定全部的集合的成員的交集. |
SINTERSTORE | SINTERSTORE destination key [key ...] | 這個命令與SINTER命令相似, 可是它並非直接返回結果集,而是將結果保存在 destination集合中. |
頁面以下,點擊共同好友按鈕,通過後臺的數據獲取,頁面下方顯示共同好友二、3。
共同好友也就是好友A和好友B共有的好友,兩個數據作交集便可獲得共有的數據,即A好友∩B好友={1,2,3}∩{2,3,4}={2,3} 。紅色部分就是交集的結果
後臺代碼以下
@RequestMapping(value = "/intersectFriend", method = RequestMethod.GET) public Set intersectFriend() { return setOperations.intersect(A_FRIEND_KEY, B_FRIEND_KEY); }
相同的redis命令以下
SINTER friend:a friend:b
命令 | 用例 | 描述 |
---|---|---|
SDIFF | SDIFF key [key ...] | 返回一個集合與給定集合的差集的元素. |
SDIFFSTORE | SDIFFSTORE destination key [key ...] | 該命令相似於 SDIFF命令, 不一樣之處在於該命令不返回結果集,而是將結果存放在destination 集合中. |
頁面以下,點擊A獨有的好友按鈕,通過後臺的數據獲取,頁面下方顯示獨有的好友1。
A獨有的好友也就是取出A的好友在B好友中沒有出現過的,也就是取差集,即A好友-B好友={1,2,3}-{2,3,4}={1},下方圖片中紅色部分就是差集的結果。
後臺java代碼以下
@RequestMapping(value = "/differenceFriend", method = RequestMethod.GET) public Set differenceFriend(String user) { return setOperations.difference(A_FRIEND_KEY, B_FRIEND_KEY); }
相同的redis命令以下
SDIFF friend:a friend:b
命令 | 用例 | 描述 |
---|---|---|
SUNION | SUNION key [key ...] | 返回給定的多個集合的並集中的全部成員. |
SUNIONSTORE | SUNIONSTORE destination key [key ...] | 該命令做用相似於SUNION命令,不一樣的是它並不返回結果集,而是將結果存儲在destination集合中. |
頁面以下,點擊全部的好友按鈕,通過後臺的數據獲取,頁面下方顯示共同好友一、二、三、4。
全部的好友就是A和B的好友,也就是A好友和B好友的並集,即A好友∪ B好友={1,2,3}∪ {2,3,4}={1,2,3,4},圖片以下
後臺java代碼以下
@RequestMapping(value = "/unionFriend", method = RequestMethod.GET) public Set unionFriend() { return setOperations.union(A_FRIEND_KEY, B_FRIEND_KEY); }
相同的redis命令以下
SUNION friend:a friend:b
命令 | 用例 | 描述 |
---|---|---|
SCARD | SCARD key | 返回集合存儲的key的基數 (集合元素的數量). |
SISMEMBER | SISMEMBER key member | 返回成員 member 是不是存儲的集合 key的成員. |
SMOVE | SMOVE source destination member | 將member從source集合移動到destination集合中 |
SPOP | SPOP key [count] | 返回移除的一個或者多個key中的元素 |
SRANDMEMBER | SRANDMEMBER key [count] | 隨機返回key集合中的一個或者多個元素 |
SSCAN | SSCAN key cursor MATCH pattern | 和scan相似 |
返回集合存儲的key的基數 (集合元素的數量).
SCARD key
返回值:集合的基數(元素的數量),若是key不存在,則返回 0.
redis客戶端執行的命令以下
sadd sCardKey 1 2 3 scard sCardKey
下面是java代碼
@Test public void sCard() { jedis.sadd("sCardKey", "1", "2", "3"); System.out.println(jedis.scard("sCardKey")); //spring redisTemplate System.out.println(setOperations.size("sCardKey")); }
返回成員 member 是不是存儲的集合 key的成員.
SISMEMBER key member
返回值:若是member元素是集合key的成員,則返回1。若是member元素不是key的成員,或者集合key不存在,則返回0
redis客戶端執行的命令以下
sadd sIsMemberKey hello sismember sIsMemberKey hello sismember sIsMemberKey redis
下面是java代碼
@Test public void sIsMember() { jedis.sadd("sIsMember", "hello"); System.out.println(jedis.sismember("sIsMember", "hello")); //spring redisTemplate System.out.println(setOperations.isMember("sIsMember", "redis")); }
將member從source集合移動到destination集合中. 對於其餘的客戶端,在特定的時間元素將會做爲source或者destination集合的成員出現.
若是source 集合不存在或者不包含指定的元素,這smove命令不執行任何操做而且返回0.
不然對象將會從source集合中移除,並添加到destination集合中去,
若是destination集合已經存在該元素,則smove命令僅將該元素充source集合中移除.
若是source 和destination不是集合類型,則返回錯誤.
SMOVE source destination member
返回值:若是該元素成功移除,返回1。若是該元素不是 source集合成員,無任何操做,則返回0.
redis客戶端執行的命令以下
sadd sMoveKeySrc 0 1 2 3 4 smove sMoveKeySrc sMoveKeyDst 5 smove sMoveKeySrc sMoveKeyDst 3 smembers sMoveKeyDst
執行結果以下
下面是java代碼
@Test public void sMove() { jedis.sadd("sMoveKeySrc", "0", "1", "2", "3", "4"); System.out.println("移動一個不存在的元素,結果:"+jedis.smove("sMoveKeySrc", "sMoveKeyDst", "5")); //spring redisTemplate System.out.println("移動一個存在的元素,結果:" + setOperations.move("sMoveKeySrc","3", "sMoveKeyDst")); System.out.println(jedis.smembers("sMoveKeyDst")); }
移除且返回一個或多個隨機元素
SPOP key [count]
返回值:移除的元素,當key不存在時返回nil
redis客戶端執行的命令以下
sadd sPopKey 0 1 2 3 4 spop sPopKey spop sPopKey 2 smembers sPopKey
執行結果以下
下面是java代碼
@Test public void sPop() { jedis.sadd("sPopKey", "0", "1", "2", "3", "4"); System.out.println(jedis.spop("sPopKey")); //spring redisTemplate System.out.println(setOperations.pop("sPopKey", 2)); System.out.println(jedis.smembers("sPopKey")); }
僅提供key參數,那麼隨機返回key集合中的一個元素.
Redis 2.6開始, 能夠接受 count 參數,
若是count是整數且小於元素的個數,返回含有 count 個不一樣的元素的數組,
若是count是個整數且大於集合中元素的個數時,僅返回整個集合的全部元素,
當count是負數,則會返回一個包含count的絕對值的個數元素的數組,
若是count的絕對值大於元素的個數,則返回的結果集裏會出現一個元素出現屢次的狀況.
僅提供key參數時,該命令做用相似於SPOP命令, 不一樣的是SPOP命令會將被選擇的隨機元素從集合中移除, 而SRANDMEMBER僅僅是返回該隨記元素,而不作任何操做.
SRANDMEMBER key [count]
返回值:不使用count 參數的狀況下該命令返回隨機的元素,若是key不存在則返回nil.使用count參數,則返回一個隨機的元素數組,若是key不存在則返回一個空的數組.
redis客戶端執行的命令以下
sadd sRandMemberKey 0 1 2 3 4 srandmember sRandMemberKey 2 srandmember sRandMemberKey 9 srandmember sRandMemberKey -2 srandmember sRandMemberKey -9
執行結果以下
下面是java代碼
@Test public void sRandMember() { jedis.sadd("sRandMemberKey", "0", "1", "2", "3", "4"); System.out.println("未加count參數:" + jedis.srandmember("sRandMemberKey")); System.out.println("count是整數且小於元素的個數:" + jedis.srandmember("sRandMemberKey", 2)); System.out.println("count是個整數且大於集合中元素的個數時:" + jedis.srandmember("sRandMemberKey", 9)); System.out.println("count是整數且小於元素的個數:" + jedis.srandmember("sRandMemberKey", -2)); System.out.println("count是個整數且大於集合中元素的個數時:" + jedis.srandmember("sRandMemberKey", -9)); //spring redisTemplate默認支持重複的元素 System.out.println("count是負數,且絕對值大於元素的個數:" + setOperations.randomMembers("sRandMemberKey", 9)); }
仍是那句話建議學習的人最好每一個命令都去敲下,加深印象。
紙上得來終覺淺,絕知此事要躬行。————出自《冬夜讀書示子聿》