redis系列:通過共同好友案例學習set命令

NO IMAGE

前言

這一篇文章將講述Redis中的set類型命令,同樣也是通過demo來講述,其他部分這裡就不在贅述了。

項目Github地址:github.com/rainbowda/l…

案例

demo功能是共同好友,整個demo的大致頁面如下。左邊是存儲到Redis中的數據,右邊是從Redis中彈出的數據。

redis系列:通過共同好友案例學習set命令

準備工作

首先定義一個存儲a、b好友的key

private static final String A_FRIEND_KEY = "friend:a";
private static final String B_FRIEND_KEY = "friend:b";

redis操作對象

private RedisTemplate redisTemplate;
//string 命令操作對象
private ValueOperations valueOperations;
//set 命令操作對象
private SetOperations setOperations;

set在Redis中的結構可以看下圖(圖片來源於Redis in Action)。

redis系列:通過共同好友案例學習set命令

添加好友

命令介紹

命令用例描述
SADDSADD key member [member …]添加一個或多個指定的member元素到集合的 key中

我們來看看demo中的新增功能,點擊添加好友,往用戶A裡面添加一些好友。

redis系列:通過共同好友案例學習set命令

添加完畢後,A有好友1、2、3,B有好友2、3、4。

後臺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命令如下

SADD friend:a 1 2 3
SADD friend:b 2 3 4

好友結構如下

redis系列:通過共同好友案例學習set命令

刪除好友

命令介紹

命令用例描述
SREMSREM key member [member …]在key集合中移除指定的元素

刪除功能如下

redis系列:通過共同好友案例學習set命令

後臺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

列表查詢

命令介紹

命令用例描述
SMEMBERSSMEMBERS 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

共同好友

命令介紹

命令用例描述
SINTERSINTER key [key …]返回指定所有的集合的成員的交集.
SINTERSTORESINTERSTORE destination key [key …]這個命令與SINTER命令類似, 但是它並不是直接返回結果集,而是將結果保存在 destination集合中.

頁面如下,點擊共同好友按鈕,經過後臺的數據獲取,頁面下方顯示共同好友2、3。

redis系列:通過共同好友案例學習set命令

共同好友也就是好友A和好友B共有的好友,兩個數據做交集即可得到共有的數據,即A好友∩B好友={1,2,3}∩{2,3,4}={2,3} 。紅色部分就是交集的結果

redis系列:通過共同好友案例學習set命令

後臺代碼如下

@RequestMapping(value = "/intersectFriend", method = RequestMethod.GET)
public Set intersectFriend() {
return setOperations.intersect(A_FRIEND_KEY, B_FRIEND_KEY);
}

相同的redis命令如下

SINTER friend:a friend:b

A獨有的好友

命令介紹

命令用例描述
SDIFFSDIFF key [key …]返回一個集合與給定集合的差集的元素.
SDIFFSTORESDIFFSTORE destination key [key …]該命令類似於 SDIFF命令, 不同之處在於該命令不返回結果集,而是將結果存放在destination集合中.

頁面如下,點擊A獨有的好友按鈕,經過後臺的數據獲取,頁面下方顯示獨有的好友1。

redis系列:通過共同好友案例學習set命令

A獨有的好友也就是取出A的好友在B好友中沒有出現過的,也就是取差集,即A好友-B好友={1,2,3}-{2,3,4}={1},下方圖片中紅色部分就是差集的結果。

redis系列:通過共同好友案例學習set命令

後臺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

所有的好友

命令介紹

命令用例描述
SUNIONSUNION key [key …]返回給定的多個集合的並集中的所有成員.
SUNIONSTORESUNIONSTORE destination key [key …]該命令作用類似於SUNION命令,不同的是它並不返回結果集,而是將結果存儲在destination集合中.

頁面如下,點擊所有的好友按鈕,經過後臺的數據獲取,頁面下方顯示共同好友1、2、3、4。

redis系列:通過共同好友案例學習set命令

所有的好友就是A和B的好友,也就是A好友和B好友的並集,即A好友∪ B好友={1,2,3}∪ {2,3,4}={1,2,3,4},圖片如下

redis系列:通過共同好友案例學習set命令

後臺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

其他命令

命令用例描述
SCARDSCARD key返回集合存儲的key的基數 (集合元素的數量).
SISMEMBERSISMEMBER key member返回成員 member 是否是存儲的集合 key的成員.
SMOVESMOVE source destination member將member從source集合移動到destination集合中
SPOPSPOP key [count]返回移除的一個或者多個key中的元素
SRANDMEMBERSRANDMEMBER key [count]隨機返回key集合中的一個或者多個元素
SSCANSSCAN key cursor [MATCH pattern][COUNT count]和scan類似

SCARD命令

返回集合存儲的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"));
}

SISMEMBER命令

返回成員 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"));
}

SMOVE命令

將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

執行結果如下

redis系列:通過共同好友案例學習set命令

下面是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命令

移除且返回一個或多個隨機元素
SPOP key [count]
返回值:移除的元素,當key不存在時返回nil

redis客戶端執行的命令如下

sadd sPopKey 0 1 2 3 4
spop sPopKey
spop sPopKey 2
smembers sPopKey

執行結果如下

redis系列:通過共同好友案例學習set命令

下面是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"));
}

SRANDMEMBER命令

僅提供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

執行結果如下

redis系列:通過共同好友案例學習set命令

下面是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));
}

還是那句話建議學習的人最好每個命令都去敲下,加深印象。

紙上得來終覺淺,絕知此事要躬行。————出自《冬夜讀書示子聿》

相關文章

redis系列:哨兵

redis系列:主從複製

redis系列:RDB持久化與AOF持久化

redis系列:通過文章點贊排名案例學習sortedset命令