目录
1. 添加pom依赖
<!--redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2. 配置application.yml文件
spring:
redis:
#服务端IP
host: 127.0.0.1
#端口
port: 6379
#密码
password: 1234
#选择数据库
database: 0
#超时时间
timeout: 10000ms
#Lettuce的连接是基于Netty的,连接实例(StatefulRedisConnection)可以在多个线程间并发访问
#Lettuce线程安全,Jedis线程非安全
lettuce:
pool:
#最大连接数,默认8
max-active: 8
#最大连接阻塞等待时间,默认-1
max-wait: 10000ms
#最大空闲连接,默认8
max-idle: 200
#最小空闲连接,默认0
min-idle: 5
3. Redis核心配置类
package com.jmh.springboot03.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import javax.annotation.Resource;
/**
* @author 蒋明辉
* @data 2022/10/1 17:08
*/
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
//实例化一个redis模板
RedisTemplate<String,Object> redisTemplate=new RedisTemplate<>();
//设置连接工厂
redisTemplate.setConnectionFactory(redisConnectionFactory);
//针对string类型的key和value进行序列化
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
//针对has类型的key和value进行序列化
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
//将上诉代码启用
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
4. 定义购物车接口
- IRedisService接口定义
package com.jmh.shopping.service;
import com.jmh.shopping.model.ShopCarItem;
import com.jmh.shopping.model.User;
import com.jmh.shopping.utils.JsonResponseBody;
import java.util.List;
/**
* @author 蒋明辉
* @data 2022/11/20 6:59
*/
public interface IRedisService {
/**
* 根据用户编号获取购物车商品
*/
List<ShopCarItem> queryRedisUserId(String id);
/**
* 增加购物车商品
*/
JsonResponseBody<?> add(User user, Long gid,Integer num);
/**
* 更新购物车商品
*/
JsonResponseBody<?> update(User user, Long gid, Integer num);
/**
* 删除购物车商品
*/
JsonResponseBody<?> delete(User user, String ids);
/**
* 获取用户要结算购物车商品信息
*/
List<ShopCarItem> toOrder(User user,String ids);
}
- RedisServiceImpl接口实现类
package com.jmh.shopping.service.impl;
import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.jmh.shopping.config.RedisConfig;
import com.jmh.shopping.model.Goods;
import com.jmh.shopping.model.ShopCarItem;
import com.jmh.shopping.model.User;
import com.jmh.shopping.service.IGoodsService;
import com.jmh.shopping.service.IRedisService;
import com.jmh.shopping.utils.JsonResponseBody;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundHashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
* @author 蒋明辉
* @data 2022/11/20 7:01
*/
@Service
public class RedisServiceImpl implements IRedisService {
@Autowired
private RedisTemplate<String,Object> redisConfig;
@Autowired
private IGoodsService goodsService;
@Override
public List<ShopCarItem> queryRedisUserId(String id) {
//1.根据用户编号获取购物车数据
BoundHashOperations<String, Object, Object> cartMap = redisConfig.boundHashOps(id);
List<Object> cartList = cartMap.values();
if (CollectionUtils.isNotEmpty(cartList)) {
List<ShopCarItem> items = new ArrayList<>();
cartList.forEach(item -> {
String objStr = (String) item;
ShopCarItem carItem = JSON.parseObject(objStr, ShopCarItem.class);
items.add(carItem);
});
return items;
}
return null;
}
@Override
public JsonResponseBody<?> add(User user, Long gid,Integer num) {
//1.根据用户编号获取购物车数据
BoundHashOperations<String, Object, Object> cartMap = redisConfig.boundHashOps(user.getId()+"");
//2.判断商品是否存在
String cart = (String) cartMap.get(gid+"");
if (StringUtils.isBlank(cart)) {
//3.商品不存在,则添加商品信息
Goods goods = goodsService.getById(gid);
ShopCarItem shopCarItem= new ShopCarItem();
shopCarItem.setGid(goods.getGid());
shopCarItem.setGoodsImg(goods.getGoodsImg());
shopCarItem.setGoodsName(goods.getGoodsName());
shopCarItem.setGoodsImg(goods.getGoodsImg());
shopCarItem.setGoodsPrice(goods.getGoodsPrice());
shopCarItem.setQuantity(num);
cartMap.put(gid+"", JSON.toJSONString(shopCarItem));
} else {
//4.商品存在,则数量增加
ShopCarItem item = JSON.parseObject(cart, ShopCarItem.class);
item.setQuantity(item.getQuantity() + num);
cartMap.put(gid+"", JSON.toJSONString(item));
}
return new JsonResponseBody<>();
}
@Override
public JsonResponseBody<?> update(User user, Long gid, Integer num) {
//1.根据用户编号获取所有数据
BoundHashOperations<String, Object, Object> cartMap = redisConfig.boundHashOps(user.getId()+"");
//2.根据商品编号获取数据
String cart = (String) cartMap.get(gid+"");
ShopCarItem item = JSON.parseObject(cart, ShopCarItem.class);
//3.设置商品数量
item.setQuantity(num);
//4.重新添加商品数据
cartMap.put(gid+"", JSON.toJSONString(item));
return new JsonResponseBody<>();
}
@Override
public JsonResponseBody<?> delete(User user, String ids) {
//1.将ids切割成数组
List<String> gids = Arrays.asList(ids.split(","));
//2.根据用户编号获取购物车数据
BoundHashOperations<String, Object, Object> cartMap = redisConfig.boundHashOps(user.getId()+"");
//3.遍历商品编号删除redis对应商品的key
gids.forEach(e->{
cartMap.delete(e);
});
return new JsonResponseBody<>();
}
@Override
public List<ShopCarItem> toOrder(User user, String ids) {
//1.定义一个新集合,来保存用户要结算的商品信息
List<ShopCarItem> it=new ArrayList<>();
//2.获取当前用户的购物车商品数据
List<ShopCarItem> items = this.queryRedisUserId(user.getId() + "");
//2.1商品详情页点击立即购买
//2.2判断根据用户编号获取到的购物车商品非空
if(null!=items){
//3.切割成数组
List<String> gids = Arrays.asList(ids.split(","));
//4.遍历用户购物车商品数据筛选用户点击结算的商品数据
items.forEach(e->{
//4.如果包含就新增到新集合里面
if(gids.contains(e.getGid()+"")) {
//将是否状态设置为true 选中
/* e.setTrueFalse("true");*/
it.add(e);
}
});
}
return it;
}
}