JSONObject.toJSONString(areaGoodsVO)
//hash数据结构 (key , map(hashKey,hashValue))==> redisKey , hashKey, value ==> key key value
redisTemplate.opsForHash().put(redisKey, hashKey, value);
1.根据业务不同定义不同的redisKey ,此时的业务场景是 缓存区域下的商品 每个区域都有对应的商品有很多,要想把商品按区域划分存储,多个商品都归于某一个区域
String redisKey = String.format(GoodsRedisKey.GOODS_AREA_HASH, areaGoodsVO.getAreaCode());
redisKey--> 固定的+根据业务定义的 ydgf:goods:area_goods_hash: 101
hashKey--> 6906785230165
value ---> {
"areaCode": "101",
"backCashRatio": 15,
"goodsCode": "11020102241",
"inputCode": "6906785230165",
"onLinePrice": 8.50,
"qpcMunit": "瓶",
"qpcNum": 1,
"qpcStr": "1*1",
"status": 1
}
redisTemplate.opsForHash().put(redisKey, hashKey, value);
固定的 + 根据业务定义key 这个key的定义是有业务联系的key ps
redisKey--> ydgf:goods:area_goods_hash: 102
hashKey--> 6948939601186
value--> {
"areaCode": "102",
"backCashRatio": 15,
"goodsCode": "29000003441",
"inputCode": "6948939601186",
"onLinePrice": 8.00,
"qpcMunit": "个",
"qpcNum": 1,
"qpcStr": "1*1",
"status": 1
}
hashKey--> 6928064006018
value--> {
"areaCode": "102",
"backCashRatio": 15,
"goodsCode": "72010400012",
"inputCode": "6928064006018",
"onLinePrice": 15.00,
"qpcMunit": "个",
"qpcNum": 1,
"qpcStr": "1*1",
"status": 1
}
hashKey ----> 6972659820268
value ----> {
"areaCode": "102",
"backCashRatio": 15,
"goodsCode": "62030200009",
"inputCode": "6972659820268",
"onLinePrice": 12.90,
"qpcMunit": "袋",
"qpcNum": 1,
"qpcStr": "1*1",
"status": 1
}
2.系统应用程序的背景图 不同的应用系统 和不同的业务模块 使用不同的图片
构思: redisKey = 固定的 + 根据业务需要定义的
String redisKey = 固定的 + 应用系统类型(多个) + 业务模块类型(多种)
String imageKey = String.format(BackgroundImageRedisKey.BACK_GROUND_IMAGE, backgroundImageParam.getSystemType(), backgroundImageParam.getType());
redisUtil.hPut(imageKey,backgroundImage.getCode(), backgroundImage.getOldUrl());
redisTemplate.opsForHash().put(key, hashKey, value);
构造需要的key:
固定的 + 根据业务需要定义的
String imageKey = String.format(BackgroundImageRedisKey.BACK_GROUND_IMAGE, 不同的应用系统中定义不同的值, 业务模块类型(要查出所有模块的业务类型 集合 遍历 挨个取出来每个模块的背景图 每个模块有很多个背景图 ) );
获取不同模块的 业务类型
@ApiModelProperty(value = "类型:1首页,2分类,3购物车,4我的")
private Integer type;
之前 存了吗? 存哪了? 访问数据库获取?
存数据库了 不能每次都访问数据库
那就存缓存
怎麽存
考虑
类型不能存重复 虽然存数据库了 查的时候也是需要去重的
那么 现在存缓存也不能重复
不能重复 考虑不重复的结构 set 去重
key === 构造需要的key 固定的值 + 根据业务定义(当前业务需要根据不同的应用系统 所以定义一个应用系统类型属性 作为 key的 组成部分 )
redisTemplate.opsForSet().add(key, values);
取值
Set<String> setCollection = redisTemplate.opsForSet().members(key);
ps: 设置的value不能为空 ,否则会报错:
IllegalArgumentException: Values must not contain null elements!
redisTemplate.opsForHash().entries(key)
3.用户的购物车
redisKey 组成: 固定值 + 根据业务需要定义的
设计好key
String userCartKey = String.format(CartRedisKey.CART_LIST,loginUserVO.getUserId());
存
存什么?
存购物车
存购物车的什么?
购物车有什么?
购物车有 用户购买的商品 有 用户购买的商品的数量 有用户购买的商品的信息 比如 商品条码等等
存哪些?
存重要的 核心的 有关联性的 信息
存 用户的商品条码
存 用户购买的商品的数量
怎麽存? 用缓存
存用户的商品条码 用那个结构?
购车车key定义好了,用户购买的商品在用户的购物车里面 多个商品存到一个购物车里面 用什么结构存?
string? key value是什么呢? 整个商品太大了 取商品的核心 比如条码 购买的商品多 条码是多个 多个用集合 用string不行 会覆盖掉value 排除
list? 重复的怎麽办? 同一个商品条码要累加 排除
set? set可以去重 可以把 用户购买的商品条码都加进来 不重复的加进来 可以
hash hash是key hashKey value 用户购物车key已经定义好了 value是用户购买的商品的条码 hashKey 是什么呢? 不需要hashKey了 结构冗余 排除
综上考虑还是用 set 结构
set结构 去重 唯一 适合存一定数量的 业务具有唯一性的 数据 比如 用户购买的多个商品的条码 也就是用户加入购物车的商品的条码
定义存储的key 思考存的是 用户的购物车商品的条码
固定值 + 用户的标识
String cartSelectedGoodsKey = String.format(CartRedisKey.CART_SELECTED_GOODS,loginUserVO.getUserId());
商品条码是用户一个一个的加入的
redisTemplate.opsForSet().add(cartSelectedGoodsKey, 用户加入购物车的商品的条码);
不想要选错了 用户移除商品条码
redisTemplate.opsForSet().remove(key, values);
同时加入购物车的还有指定的商品条码对应的数量
用户购买的商品的数量 用那个结构?
购车车key定义好了, 每加一次商品 需要增加指定商品的数量
商品条码 和 数量 是一对一的键值对
多个商品条码就会产生多个键值对
存储这些键值对 就需要hash结构
redisTemplate.opsForHash().put(定义好的用户购物车key, 用户购买的商品条码, 商品条码对应的数量);
redisUtil.hPut(cartKey, inputCode, String.valueOf(count));
获取用户购物车所有键值对的数量 多少个商品条码
redisTemplate.opsForHash().size(key)
判断用户购物车是否存在
redisTemplate.opsForHash().hasKey(key, field);
获取用户购物车的entry对象集合 key代表商品条码 value代表 商品数量 汇总收集value的值
redisTemplate.opsForHash().entries(key)
Map<Object, Object> objectObjectMap = redisUtil.hGetAll(cartKey);
Java Map.values()方法之如何获取Map集合中的所有键值对象
获取指定商品条码对应的数量
redisTemplate.opsForHash().get(key, field);
Object result = redisUtil.hGet(cartKey, inputCode);
Integer.parseInt(result.toString());
判断购物商品是否是用户选中的勾选的状态
redisTemplate.opsForSet().isMember(key, value);
这里面才是用户购物车里所有的商品条码及其对应的商品数量
redisTemplate.opsForHash().entries(key);
便利所有的商品条码
4.获取购物车中的商品的区域商品
//根据商品条码 获取商品条码对应的商品数据
根据商品条码获取区域商品
根据传入的商品条码 和 当前登录用户所在的区域代码 从缓存中获取 当前区域下 有没有这个商品条码 有的话取出这个商品条码对应的商品对象
String areaGoodsKey = String.format(GoodsRedisKey.GOODS_AREA_HASH,areaCode);
区域商品的存储 商品条码 归属于哪个区域下 选哪种结构存?
根据业务分析: 当前业务里 核心业务属性有 区域代码 商品条码 商品数据信息Obj
05-16
1296
06-17
1万+