1,首先在maven,项目中pom.xml 加入jar包,
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency>2,导入配置文件,applicationContext-jedis.xml,我的在resources 下
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"> <!-- 连接池配置 --> <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <!-- 最大连接数 --> <property name="maxTotal" value="30" /> <!-- 最大空闲连接数 --> <property name="maxIdle" value="10" /> <!-- 每次释放连接的最大数目 --> <property name="numTestsPerEvictionRun" value="1024" /> <!-- 释放连接的扫描间隔(毫秒) --> <property name="timeBetweenEvictionRunsMillis" value="30000" /> <!-- 连接最小空闲时间 --> <property name="minEvictableIdleTimeMillis" value="1800000" /> <!-- 连接空闲多久后释放, 当空闲时间>该值 且 空闲连接>最大空闲连接数 时直接释放 --> <property name="softMinEvictableIdleTimeMillis" value="10000" /> <!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 --> <property name="maxWaitMillis" value="1500" /> <!-- 在获取连接的时候检查有效性, 默认false --> <property name="testOnBorrow" value="true" /> <!-- 在空闲时检查有效性, 默认false --> <property name="testWhileIdle" value="true" /> <!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true --> <property name="blockWhenExhausted" value="false" /> </bean> <!-- jedis客户端单机版 --> <bean id="jedisPool" class="redis.clients.jedis.JedisPool"> <constructor-arg name="host" value="127.0.0.1"></constructor-arg> <constructor-arg name="port" value="6379"></constructor-arg> <constructor-arg name="poolConfig" ref="jedisPoolConfig"></constructor-arg> <constructor-arg name="timeout" value="2000"></constructor-arg> <constructor-arg name="password" value="*****"></constructor-arg> </bean>
<bean id="jedisClient" class="com.mmall.dao.jedis.impl.JedisClientSingle"/> //jedisclientsingle,文件放到dao层下面,项目可以扫描到的包下面,这个是实现impl <!-- jedis集群版配置 --> <!-- <bean id="redisClient" class="redis.clients.jedis.JedisCluster"> <constructor-arg name="nodes"> <set> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value=""></constructor-arg> <constructor-arg name="port" value="7001"></constructor-arg> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value=""></constructor-arg> <constructor-arg name="port" value="7002"></constructor-arg> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value=""></constructor-arg> <constructor-arg name="port" value="7003"></constructor-arg> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value=""></constructor-arg> <constructor-arg name="port" value="7004"></constructor-arg> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value=""></constructor-arg> <constructor-arg name="port" value="7005"></constructor-arg> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value=""></constructor-arg> <constructor-arg name="port" value="7006"></constructor-arg> </bean> </set> </constructor-arg> <constructor-arg name="poolConfig" ref="jedisPoolConfig"></constructor-arg> </bean> <bean id="jedisClientCluster" class="com.ckip.fxsq.rest.dao.impl.JedisClientCluster"></bean> --> </beans>3,项目下的applicationContext.xml,里面要加上
<!-- 导入jedis的配置文件 --> <import resource="applicationContext-jedis.xml"/>4,引入这几个类,调用jedis
5,这个实现类impl ,里面主要内容,
6,看下业务流程吧,具体是怎么调用的,先写下服务端的业务
controller --->service----->serviceImpl
package com.mmall.controller.app; /** * 购物车 * lbx */ import com.mmall.common.ServerResponse; import com.mmall.service.app.ICartService; import com.mmall.vo.app.AppCartProductInfoVo; import com.mmall.vo.app.AppCartVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @Controller @RequestMapping("app/cart") public class AppCartController { @Autowired private ICartService iCartService; /** * <p>Title: getRedisCartList</p> * <p>Description: 获取Redis中的购物车信息</p> */ //购物车商品列表 @RequestMapping(value = "getRedisCartList/{userAccount}.do") @ResponseBody public ServerResponse<AppCartVo> getRedisCartList(@PathVariable String userAccount) { try { ServerResponse<AppCartVo> cartList = iCartService.getRedisCartList(userAccount); return cartList; } catch (Exception e) { e.printStackTrace(); return ServerResponse.createByErrorMessage("获取失败"); } } /** * <p>Title: setAppCartVo</p> * <p>Description: 将setAppCartVo加入到Redis</p> */ @RequestMapping(value = "setCartToReids/{userAccount}.do") @ResponseBody public ServerResponse<AppCartVo> setCartToReids(@RequestBody AppCartVo appCartVo ,@PathVariable String userAccount,HttpServletRequest request, HttpServletResponse response) { try { System.out.println("userAccount-------->" + userAccount); ServerResponse<AppCartVo> appCartVos = iCartService.setCartToRedis(userAccount, appCartVo); return appCartVos; } catch (Exception e) { e.printStackTrace(); return ServerResponse.createByErrorMessage("添加失败"); } } /** * 删除单个商品 */ @RequestMapping(value = "deleteCartRedis/{productId}/{userAccount}.do", method = {RequestMethod.POST, RequestMethod.GET}) @ResponseBody public ServerResponse deleteCartRedis(@PathVariable String productId, @PathVariable String userAccount) { try { ServerResponse isdel = iCartService.deleteCartReids(productId, userAccount); } catch (Exception e) { e.printStackTrace(); return ServerResponse.createByErrorMessage("删除失败"); } return ServerResponse.createBySuccessMessage("删除成功"); } /** * <p>Title: delSelectRedis</p> * 删除选中商品 */ @RequestMapping(value = "delSelectRedis/{userAccount}.do") @ResponseBody public ServerResponse delSelectRedis(@RequestBody AppCartVo appCartVo ,@PathVariable String userAccount,HttpServletRequest request, HttpServletResponse response) { try { if(appCartVo.getAppCartProductInfoVos().size()>0){ for(AppCartProductInfoVo cartProductInfoVo : appCartVo.getAppCartProductInfoVos()){ iCartService.deleteCartReids(cartProductInfoVo.getProductId(), userAccount); } } return ServerResponse.createBySuccessMessage("删除成功"); } catch (Exception e) { e.printStackTrace(); return ServerResponse.createByErrorMessage("添加失败"); } } }
package com.mmall.service.app; import com.mmall.common.ServerResponse; import com.mmall.vo.app.AppCartVo; /** * @author lbx */ public interface ICartService { //将setAppCartVo加入到Redis ServerResponse<AppCartVo> setCartToRedis(String userAccount, AppCartVo appCartVo) throws Exception; //删除单个商品 ServerResponse deleteCartReids(String productId, String userAccount) throws Exception; /*获取Redis中的购物车信息*/ ServerResponse<AppCartVo> getRedisCartList(String userAccount) throws Exception; }
package com.mmall.service.impl.app; import com.mmall.common.ServerResponse; import com.mmall.controller.app.AppCartController; import com.mmall.service.app.ICartService; import com.mmall.dao.jedis.JedisClient; import com.mmall.util.JsonUtils; import com.mmall.vo.app.AppCartProductInfoVo; import com.mmall.vo.app.AppCartVo; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service("ICartService") public class CartServiceImpl implements ICartService{ private Logger Logger = LoggerFactory.getLogger(AppCartController.class); @Autowired private JedisClient jedisClient; /** * <p>Title: getRedisCartList</p> * <p>Description: 获取Redis中购物车信息</p> */ @Override public ServerResponse<AppCartVo> getRedisCartList(String userAccount) { try { //从缓存中取该用户的购物车商品列表 String json = jedisClient.get("REDIS_SHOPPINGCART_KEY" + ":" + userAccount + ""); //判断是否有值 if (!StringUtils.isBlank(json)) { //把json转换成java对象 AppCartVo appCartVo= JsonUtils.jsonToPojo(json, AppCartVo.class); return ServerResponse.createBySuccess(appCartVo); } } catch (Exception e) { e.printStackTrace(); } return ServerResponse.createBySuccess(null); } /** * <p>Title: setCartToRedis</p> * <p>Description: 用户登录状态向购物车Redis中添加商品信息</p> */ @Override public ServerResponse<AppCartVo> setCartToRedis(String userAccount, AppCartVo appCartVo) { try { //添加缓存逻辑 //从缓存中取购userAccount对应的信息 String json = jedisClient.get("REDIS_SHOPPINGCART_KEY" + ":"+ userAccount); Logger.debug("json--->"+json); Logger.debug("json--->"+StringUtils.isNotBlank(json)); //判断是否有值 if (StringUtils.isNotBlank(json)&&!json.equals("null")) { int flagA = 0; //把json转换成java对象 //List<AppCartVo> AppCartVolist = JsonUtils.jsonToList(json, AppCartVo.class); AppCartVo cart = JsonUtils.jsonToPojo(json, AppCartVo.class); //for(FxsqSkupojo cartRedis : cart.getCartProList()){ //Redis中的dealerAccount //String dealerAccountRedis = cartRedis.getCartDealer().getDealerAccount(); //传进来AppCartVo中的dealerAccount //String dealerAccountInput = AppCartVo.getCartDealer().getDealerAccount(); //获取Redis中的SkuPojolist //List<FxsqSkupojo> SkupojoList = cartRedis.getCartDealer().getSkuPojoList(); List<AppCartProductInfoVo> cartProductInfoVos = cart.getAppCartProductInfoVos(); //如果供应商一样 商品不一样的时候 //if(dealerAccountRedis.equals(dealerAccountInput)){ int flagB = 0; for(AppCartProductInfoVo cartProductInfoVo : cartProductInfoVos){ //获取Redis中的ProductId和数量 String productId = cartProductInfoVo.getProductId(); Long Count = cartProductInfoVo.getQuantityNumber(); //获取传过来AppCartVo中的ProductId和数量 String productId1 = appCartVo.getAppCartProductInfoVos().get(0).getProductId(); Long Countt1 = appCartVo.getAppCartProductInfoVos().get(0).getQuantityNumber(); //如果商品一样的时候 if(productId1.equals(productId)){ flagB = 1; //flagA = 1; Long count = Count + Countt1; cartProductInfoVo.setQuantityNumber(count); break; } } //如果商品不一样的时候 if(flagB<1){ // flagA = 1; //获取传过来AppCartvo中的appCartProductInfoVos AppCartProductInfoVo appCartProductInfoVo = appCartVo.getAppCartProductInfoVos().get(0); //把skuInput塞入到Redis中的SkuList //cartRedis.getCartDealer().getSkuPojoList().add(skuInput); cart.getAppCartProductInfoVos().add(appCartProductInfoVo); } //} //} //商家不一样 /*if(flagA<1){ cartPojolist.add(cartPojo); }*/ jedisClient.set("REDIS_SHOPPINGCART_KEY" + ":" + userAccount, JsonUtils.objectToJson(cart)); jedisClient.expire("REDIS_SHOPPINGCART_KEY" + ":" + userAccount, 86400); return ServerResponse.createBySuccess(cart); }else{ //List<CartPojo> cartPojolist = new ArrayList<CartPojo>(); //cartPojolist.add(cartPojo); //jedisClient.set("REDIS_SHOPPINGCART_KEY" + ":" + userAccount, JsonUtils.objectToJson(cartPojolist)); jedisClient.set("REDIS_SHOPPINGCART_KEY" + ":" + userAccount, JsonUtils.objectToJson(appCartVo)); jedisClient.expire("REDIS_SHOPPINGCART_KEY" + ":" + userAccount, 86400); return ServerResponse.createBySuccess(appCartVo); } } catch (Exception e) { e.printStackTrace(); return ServerResponse.createByErrorMessage("添加失败"); } // return ServerResponse.createBySuccessMessage("添加成功"); } /** * 删除单个商品 */ @Override public ServerResponse deleteCartReids(String productId,String userAccount) { try { String json = jedisClient.get("REDIS_SHOPPINGCART_KEY" + ":"+ userAccount); if (!StringUtils.isBlank(json)) { //把json转换成java对象 AppCartVo cartRedis = JsonUtils.jsonToPojo(json, AppCartVo.class); List<AppCartProductInfoVo> cartProductInfoVos = cartRedis.getAppCartProductInfoVos(); for(AppCartProductInfoVo cartProductInfoVo : cartProductInfoVos){ //判断供应商下的商品数量 如果只有一个商品 删除AppCartVo 如果存在多个 删除cartProductInfoVo if(cartProductInfoVo.getProductId().equals(productId)){ //一个供应商下有一个商品 if(cartProductInfoVos.size() == 1){ cartRedis=null; }else{ //一个供应商下多个商品 cartProductInfoVos.remove(cartProductInfoVo); } jedisClient.set("REDIS_SHOPPINGCART_KEY" + ":" + userAccount, JsonUtils.objectToJson(cartRedis)); jedisClient.expire("REDIS_SHOPPINGCART_KEY" + ":" + userAccount, 86400); } } return ServerResponse.createBySuccessMessage("删除成功"); } } catch (Exception e) { e.printStackTrace(); } return ServerResponse.createBySuccessMessage("删除成功"); } }
7,redis 客户端数据存储
8,看下前台我的页面,前端用的是vue框架,axios,发出的请求
cartView: function () { var _this = this; this.apiBaseUrl = getApiBaseUrl(); axios.get(this.apiBaseUrl+"/app/cart/getRedisCartList/TW0001.do").then(function (response) { _this.appCartProductInfoVos = response.data.data.appCartProductInfoVos; _this.totalMoney = response.data.data.totalMoney;//要用_this.appCartProductInfoVos,赋值 }).catch(function (error) { console.log(error); }); /* this.$http.get("http://localhost:8080/yqtw_mall/data/cart0.json").then(res=>{ this.appCartVo = res.body; //console.log("--ee-->"+JSON.stringify(this.appCartVo)); })*/ },