博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Redis从基础命令到实战之集合类型(Set)
阅读量:4693 次
发布时间:2019-06-09

本文共 4557 字,大约阅读时间需要 15 分钟。

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
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
tags; public Set
getTags() { return tags; } public void setTags(Set
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
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
findGoodsByTag(String size, String color) { Set
ids = jedis.sinter("tag:" + size + ":goods", "tag:" + color + ":goods"); List
goodsList = new ArrayList<>(); for(String id : ids) { String key = "goods:" + id; Map
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
list = sl.getGoodsList(2, 20); System.out.println("第二页商品:"); for(Goods goods : list) { System.out.println(goods); } //按分类查找 List
listByTag = sl.findGoodsByTag("big", "green"); System.out.println("所有尺寸为big,颜色为green的商品:"); for(Goods goods : listByTag) { System.out.println(goods); } }

转载于:https://www.cnblogs.com/autfish/p/5612042.html

你可能感兴趣的文章
2018年11月21日 元祖
查看>>
iOS文件和文件夹的创建,删除,移动, 拷贝,是否存在及简单数据类型的读写
查看>>
8080端口被占用
查看>>
iOS开发--地图与定位
查看>>
Ubuntu下添加开机启动项的2种方法
查看>>
学密码学一定得学程序(SDUT 2463)
查看>>
java:jsp: 一个简单的自定义标签 tld
查看>>
position跟display、margin collapse、overflow、float这些特性相互叠加后会怎么样?
查看>>
food(洛谷P4040 [AHOI2014/JSOI2014]宅男计划)
查看>>
SIM卡(EF)基本文件内容
查看>>
深入剖析PE文件
查看>>
生产者/消费者问题的多种Java实现方式
查看>>
AX 2012 createInventDim
查看>>
AtomicBoolean介绍与使用
查看>>
px和em的区别(转)
查看>>
《Windows核心编程系列》九谈谈同步设备IO与异步设备IO之同步设备IO
查看>>
IOS-翻转时,使用2个view的交换(需注意)
查看>>
IO模型之阻塞IO
查看>>
go语言学习笔记2----变量、常量
查看>>
在阿里云上遇见更好的Oracle(二)
查看>>