您的位置:首页 > 数据库 > Redis

maven项目配置redis,实现购物车功能

2017-10-30 16:04 633 查看
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">

13634
<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));
})*/
},
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: