redis系列:通过共同好友案例学习set命令
前言
这一篇文章将讲述Redis中的set类型命令,同样也是通过demo来讲述,其他部分这里就不在赘述了。
项目Github地址:https://github.com/rainbowda/learnWay/tree/master/learnRedis/case-set
案例
demo功能是共同好友,整个demo的大致页面如下。左边是存储到Redis中的数据,右边是从Redis中弹出的数据。

准备工作
首先定义一个存储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)。

添加好友
命令介绍
| 命令 | 用例 | 描述 |
|---|---|---|
| SADD | SADD key member [member ...] | 添加一个或多个指定的member元素到集合的 key中 |
我们来看看demo中的新增功能,点击添加好友,往用户A里面添加一些好友。

添加完毕后,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
好友结构如下

删除好友
命令介绍
| 命令 | 用例 | 描述 |
|---|---|---|
| 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集合中. |
页面如下,点击共同好友按钮,经过后台的数据获取,页面下方显示共同好友2、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
A独有的好友
命令介绍
| 命令 | 用例 | 描述 |
|---|---|---|
| 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集合中. |
页面如下,点击所有的好友按钮,经过后台的数据获取,页面下方显示共同好友1、2、3、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][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
执行结果如下

下面是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
执行结果如下

下面是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
执行结果如下

下面是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系列:通过共同好友案例学习set命令的更多相关文章
- redis系列:通过队列案例学习list命令
前言 这一篇文章将讲述Redis中的list类型命令,同样也是通过demo来讲述,其他部分这里就不在赘述了. 项目Github地址:https://github.com/rainbowda/learn ...
- redis系列:通过通讯录案例学习hash命令
前言 这一篇文章将讲述Redis中的hash类型命令,同样也是通过demo来讲述,其他部分这里就不在赘述了. 项目Github地址:https://github.com/rainbowda/learn ...
- redis系列:通过日志案例学习string命令
前言 该文章将通过一个小demo将讲述Redis中的string类型命令.demo将以springboot为后台框架快速开发,iview前端框架进行简单的页面设计,为了方便就不使用DB存储数据了,直接 ...
- redis系列:通过文章点赞排名案例学习sortedset命令
前言 这一篇文章将讲述Redis中的sortedset类型命令,同样也是通过demo来讲述,其他部分这里就不在赘述了. 项目Github地址:https://github.com/rainbowda/ ...
- redis系列:redis介绍与安装
前言 这个redis系列的文章将会记录博主学习redis的过程.基本上现在的互联网公司都会用到redis,所以学习这门技术于你于我都是有帮助的. 博主在写这个系列是用的是目前最新版本4.0.10,虚拟 ...
- NoSql数据库Redis系列(1)——Redis简介
一.redis介绍 (一).Redis 简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点 ...
- Redis系列之key操作命令与Redis中的事务详解(六)
序言 本篇主要目的有二: 1.展示所有数据类型中key的所有操作命令,以供大家学习,查阅,更深入的挖掘redis潜力. 2.掌握redis中的事务,让你的数据完整性一致性拥有更优的保障. redis命 ...
- Redis系列(2)之数据类型
Redis系列(2)之数据类型 <Redis系列(1)之安装>中介绍了Redis支持以下几种数据类型,那么本节主要介绍学习下这几种数据类型的基本操作 字符串类型,string 散列类型,h ...
- Redis系列(1)之安装
Redis系列(1)之安装 由于项目的需要,最近需要研究下Redis.Redis是个很轻量级的NoSql内存数据库,它有多轻量级的呢,用C写的,源码只有3万行,空的数据库只占1M内存.它的功能很丰富, ...
随机推荐
- F1 score,micro F1score,macro F1score 的定义
F1 score,micro F1score,macro F1score 的定义 2018年09月28日 19:30:08 wanglei_1996 阅读数 976 本篇博客可能会继续更新 最近在 ...
- GVM管理Go版本
1.为什么要安装GVM 1.1什么是GVM GVM是一个golang虚拟环境配置工具,其允许一台机器上安装多个golang版本,gvm是第三方开发的Go多版本管理工具,类似ruby里面的rvm工具.使 ...
- PyCharm 常用快捷键和设置
pycharm常用快捷键 1.编辑(Editing) Ctrl + Space 基本的代码完成(类.方法.属性)Ctrl + Alt + Space 快速导入任意类Ctrl + Shift + ...
- jQuery向上遍历DOM树之parents(),parent(),closest()之间的区别
http://www.poluoluo.com/jzxy/201312/253059.html 在这个sprint中,因为要写前端UI,所以用到了jQuery,但是jQuery在向上遍历DOM树的AP ...
- 《Javascript高级程序设计》阅读记录(一):第二、三章
<Javascript高级程序设计>阅读记录(一) 这个系列,我会把阅读<Javascript高级程序设计>之后,感觉讲的比较深入,而且实际使用价值较大的内容记录下来,并且注释 ...
- 洛谷 P4546 & bzoj 5020 在美妙的数学王国中畅游 —— LCT+泰勒展开
题目:https://www.luogu.org/problemnew/show/P4546 先写了个55分的部分分,直接用LCT维护即可,在洛谷上拿了60分: 注意各处 pushup,而且 spla ...
- Git 权限控制
除了 Git 命令,权限控制也是 Git 中极为重要的组成部分,本文主要介绍 GitLab 系统提供的最常用的权限控制功能. 一.分配成员角色 首先来了解下,Git 中的五种角色: 每一种角色所拥有的 ...
- SSH不允许Root登陆的方法
不允许Root登陆的方法如下: vim /etc/ssh/sshd_config 把PermitRootLogin yes 改成: PermitRootLogin no 然后重启sshd服务: Ser ...
- lua 函数调用 -- 闭包详解和C调用
转自:http://www.cnblogs.com/ringofthec/archive/2010/11/05/luaClosure.html 这里, 简单的记录一下lua中闭包的知识和C闭包调用 前 ...
- Python-通过调用Nmap来进行端口扫描
首先要安装python-nmap库,还要安装配置好nmap 实验机器IP:192.168.220.139 端口开放情况 代码 # -*- coding:utf-8 -*- __author__ = & ...