redis使用步骤
在common模块下的service-util中添加redis依赖
复制工具类
在需要使用到redis的模块加入配置文件 service-item 、service-product
redis中设计数据结构 key
Redis设计的好不好,完全看key, key模板:Object:userId:field
举个例子:
Key = User:2:password
Value = 123456(需md5加密)
Key为User:2:password,表示为user表中id为2的密码。对应的value密码为 123456。
string类型用法
String skuKey = RedisConst.SKUKEY_PREFIX+skuId+ RedisConst.SKUKEY_SUFFIX;;
//查询缓存
String skuCache = (String)redisTemplate.opsForValue().get(skuKey);
//setIfAbsent 如果键不存在则新增,存在则不改变已经有的值
//3秒钟分布式锁过期
Boolean lock = redisTemplate.opsForValue().setIfAbsent("sku:"+skuId+":stock", uuId, 3, TimeUnit.SECONDS);
//数据库查询完成,放入缓存
if(null != skuInfo){ //null 没有 equals 方法
redisTemplate.opsForValue().set(skuKey, JSON.toJSONString(skuInfo));
}else {
//如果查询为空,防止空对象到redis中,防止缓存穿透,new一个SkuInfo给他放 十秒后过期
redisTemplate.opsForValue().set(skuKey, JSON.toJSONString(new SkuInfo()), 10, TimeUnit.SECONDS);
}
// 删除锁之前判断一下删除的是否是自己当前的锁
String stockLock = redisTemplate.opsForValue().get("sku:"+skuId+":lock").toString();
if (stockLock.equals(uuId)) {
redisTemplate.delete("sku:"+skuId+":stock");//操作完成,释放分布式锁
}
hash类型用法
这里使用的是redis的hash结构:key:user:userId:cart,value:cartInfo
//将购物车的信息添加进缓存 hash结构 key:user:userId: cart value就是skuId跟商品详细信息
redisTemplate.boundHashOps(RedisConst.USER_KEY_PREFIX + userId + RedisConst.USER_CART_KEY_SUFFIX).put(skuId + "", cartInfo);
//删除临时用户数据时把缓存中临时数据的也删掉
redisTemplate.delete(RedisConst.USER_KEY_PREFIX + userTempId + RedisConst.USER_CART_KEY_SUFFIX);
// 将购物车信息同步到缓存
HashMap<String, CartInfo> map = new HashMap<>();
for (CartInfo cartInfo : cartInfos) {
Long skuId = cartInfo.getSkuId();
//把value放进map中 注意 放入的是登录成功的userId
map.put(skuId+"",cartInfo);
}
//将购物车的信息添加进缓存 hash结构 key:user:userId: cart value就是skuId跟商品详细信息
redisTemplate.boundHashOps(RedisConst.USER_KEY_PREFIX + userId + RedisConst.USER_CART_KEY_SUFFIX).putAll(map);
list类型用法
leftPush进list,RightPop出list。
//把数据放进队列 补偿队列
redisTemplate.opsForList().leftPush(MqConst.MQ_KEY_PREFIX, JSON.toJSONString(gmallCorrelationData.getId())); //key:mq:list value:id
//获取补偿队列 mq:list中的数据 先进先出
//String crrelationId = (String)redisTemplate.boundListOps(MqConst.MQ_KEY_PREFIX).rightPop();
String crrelationId = (String)redisTemplate.boundListOps("mq:list").rightPop();
// key:seckill:stock:skuId value:skuId 从左边加入redis
redisTemplate.boundListOps(RedisConst.SECKILL_STOCK_PREFIX+seckillGood.getSkuId()).leftPush(seckillGood.getSkuId()+"");
zset类型用法
ListApiServicelmpl
//点击次数存入redis 将 hotScore 下的 skuId 增加1 hotScore是总分
Double hotScore = redisTemplate.opsForZSet().incrementScore("hotScore", skuId.toString(), 1);
if (hotScore % 10 == 0) {
//点击次数满10次 存入es 先找到es中的元素、在获取这个元素、设置热点值、保存进es
Optional<Goods> byId = elasticsearchRepository.findById(skuId);
Goods goods = byId.get();
goods.setHotScore(hotScore.longValue());
elasticsearchRepository.save(goods);