Redis集合类型的基础功能也是存储字符串列表,和列表类型的区别是字符串不能重复且没有顺序。当然,存储元素唯一性也可以通过应用程序保证,单从这一点上并没有体现出对比列表类型的特点。

其实,集合类型的一个鲜明特性是可以对多个集合求交集、并集和差集。例如在一个社交应用中,A用户有C、D两个好友,B用户有D、E两个好友,可用通过sinter A B的命令很方便的查出A和B的共同好友。

本节中将利用这个特性给实践练习中的商品管理模块添加一个按分类查找商品的功能。

一、常用命令

import java.util.Set;

import redis.clients.jedis.Jedis;

public class SetExample {

	public static void main(String[] args) {
Jedis jedis = JedisProvider.getJedis();
jedis.flushDB(); // 向sets集合中加入元素, 成功返回1, 失败返回0
Long sadd = jedis.sadd("fruit", "apple");
print("sadd fruit apple=" + sadd); //不能添加重复元素
sadd = jedis.sadd("fruit", "apple");
print("sadd fruit apple again=" + sadd);
jedis.sadd("fruit", "banana", "orange", "grape"); // 返回所有元素
print("smembers fruit=" + jedis.smembers("fruit")); // 删除元素
long srem = jedis.srem("fruit", "apple");
print("srem fruit apple=" + srem); // 判断是否存在元素
boolean exists = jedis.sismember("fruit", "apple");
print("sismember fruit apple=" + exists);
exists = jedis.sismember("fruit", "banana");
print("sismember fruit banana=" + exists); // 统计元素个数
print("scard fruit=" + jedis.scard("fruit")); // 随机获取一个元素
print("srandmember fruit=" + jedis.srandmember("fruit")); // 随机弹出一个元素
print("spop fruit=" + jedis.spop("fruit")); jedis.sadd("fruit", "apple", "banana", "orange", "grape");
jedis.sadd("food", "orange", "grape", "peach", "lemon"); // 求交集
Set<String> set = jedis.sinter("fruit", "food");
print("sinter fruit food=" + set); // 求交集并存储到指定集合
jedis.sinterstore("sinter", "fruit", "food");
print("sinterstore sinter=" + jedis.smembers("sinter")); // 求并集
set = jedis.sunion("fruit", "food");
print("sunion fruit food=" + set); // 求差集(fruit中有, food中没有的元素)
set = jedis.sdiff("fruit", "food");
print("sdiff fruit food=" + set); jedis.close();
} private static void print(String info) {
System.out.println(info);
System.out.println("------------------------------------------------------");
System.out.println();
}
}

二、实践练习

首先修改商品类,添加一个设置分类的属性 Goods.java

	private Set<String> tags;
public Set<String> getTags() {
return tags;
}
public void setTags(Set<String> tags) {
this.tags = tags;
}

然后给商品管理类添加两个字符串数组用于随机获得分类

	private final String[] SIZE = { "small", "middle", "big" };
private final String[] COLOR = { "red", "yellow", "green" };

修改添加商品的方法,同时保存分类信息

	/**
* 添加一个商品
* @param goods
* @return
*/
public boolean addGoods(Goods goods) {
long id = getIncrementId();
Map<String, String> map = new HashMap<>();
map.put("id", String.valueOf(id));
map.put("title", goods.getTitle());
map.put("price", String.valueOf(goods.getPrice())); //随机获得三个分类
String size = SIZE[new Random().nextInt(SIZE.length)];
String color = COLOR[new Random().nextInt(COLOR.length)]; String key = "goods:" + id;
boolean added = jedis.hmset(key, map).equals("OK");
if(added) {
jedis.rpush("goods:list", String.valueOf(id));
//记录商品所属分类
jedis.sadd("goods:" + id + ":tags", size, color);
//记录每个分类下包含的商品ID
jedis.sadd("tag:" + size + ":goods", String.valueOf(id));
jedis.sadd("tag:" + color + ":goods", String.valueOf(id));
}
return added;
}

按分类查找商品

	/**
* 查找指定尺寸和颜色的商品
* @param size
* @param color
* @return
*/
public List<Goods> findGoodsByTag(String size, String color) {
Set<String> ids = jedis.sinter("tag:" + size + ":goods", "tag:" + color + ":goods");
List<Goods> goodsList = new ArrayList<>();
for(String id : ids) {
String key = "goods:" + id;
Map<String, String> maps = jedis.hgetAll(key);
Goods goods = new Goods();
goods.setId(NumberUtils.toLong(maps.get("id")));
goods.setTitle(maps.get("title"));
goods.setPrice(NumberUtils.toFloat(maps.get("price")));
//读取分类
goods.setTags(jedis.smembers("goods:" + id + ":tags"));
goodsList.add(goods);
}
return goodsList;
}

测试代码

	public static void main(String[] args) {
SetLession sl = new SetLession();
sl.clear(); //添加一批商品
for(int i = 0; i< 42; i++) {
Goods goods = new Goods(0, "goods" + String.format("%05d", (i + 1)), i);
sl.addGoods(goods);
}
//读取商品总数
System.out.println("商品总数: " + sl.getTotalCount());
//删除第29件商品
sl.delGoods(29);
System.out.println("删除后商品总数: " + sl.getTotalCount());
//分页显示
List<Goods> list = sl.getGoodsList(2, 20);
System.out.println("第二页商品:");
for(Goods goods : list) {
System.out.println(goods);
}
//按分类查找
List<Goods> listByTag = sl.findGoodsByTag("big", "green");
System.out.println("所有尺寸为big,颜色为green的商品:");
for(Goods goods : listByTag) {
System.out.println(goods);
}
}

源码下载

最新文章

  1. ASP.NET MVC搭建项目后台UI框架—3、面板折叠和展开
  2. Markdown中插入数学公式的方法
  3. 十五天精通WCF——第五天 你需要了解的三个小技巧
  4. uC/OS-II内存(OS_mem)块
  5. BeanFactory not initialized or already closed - call &#39;refresh&#39; before accessing beans解决办法
  6. 使用Linux调用资源库中的Job报错-ERROR: No repository provided, can&#39;t load job.
  7. Github上更新自己Fork的代码
  8. There is already an open DataReader associated with this Connection which must be closed first
  9. objective-C nil,Nil,NULL 和NSNull的小结
  10. VC中的Attach和Detach
  11. NotePad++安装和配置C/C++开发插件
  12. leetCode in Java (一)
  13. MD5 SHA1 HMAC HMAC_SHA1区别
  14. python实现维吉利亚密码加密(Vigen&#232;re cipher)
  15. VS2010+OpenMP的简单使用
  16. Restful OData Protocol
  17. 转://因触发器限制导致oracle用户登录失败
  18. ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  19. 【github&amp;&amp;git】1、github中的watch、star、fork的作用
  20. Serializable接口

热门文章

  1. delphi locate多字段查询
  2. JUnit 简介
  3. 序列化Image到byte[]
  4. SQL: ROW_NUMBER
  5. android的四层体系结构,基于mvc三层结构浅析
  6. Scale和Resolution的含义及转换算法
  7. spring+ibatis整合
  8. IntelliJ IDEA - 注释模板
  9. java ==与equal
  10. Node.js 自学之旅