日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

redis+springboot实现购物车+商品数据修改实例

發布時間:2024/9/30 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 redis+springboot实现购物车+商品数据修改实例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 配置:
    • 實體層
    • 控制層
      • 商品控制層:
      • 購物車控制層:
      • 實現cookie以后的購物車:


配置:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--swagger--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency><!--swagger-ui--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.9.2</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-redis</artifactId><version>1.4.7.RELEASE</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.8</version></dependency><dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>2.6</version></dependency> spring.redis.database=0 ## Redis\u670D\u52A1\u5668\u5730\u5740 spring.redis.host=192.168.1.138 ## Redis\u670D\u52A1\u5668\u8FDE\u63A5\u7AEF\u53E3 spring.redis.port=6379

redis配置:

@Configuration public class RedisConfiguration {/*** 重寫Redis序列化方式,使用Json方式:* 當我們的數據存儲到Redis的時候,我們的鍵(key)和值(value)都是通過Spring提供的Serializer序列化到Redis的。* RedisTemplate默認使用的是JdkSerializationRedisSerializer,* StringRedisTemplate默認使用的是StringRedisSerializer。** Spring Data JPA為我們提供了下面的Serializer:* GenericToStringSerializer、Jackson2JsonRedisSerializer、* JacksonJsonRedisSerializer、JdkSerializationRedisSerializer、* OxmSerializer、StringRedisSerializer。* 在此我們將自己配置RedisTemplate并定義Serializer。*/@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(redisConnectionFactory);//創建一個json的序列化對象GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();//設置value的序列化方式jsonredisTemplate.setValueSerializer(jackson2JsonRedisSerializer);//設置key序列化方式stringredisTemplate.setKeySerializer(new StringRedisSerializer());//設置hash key序列化方式stringredisTemplate.setHashKeySerializer(new StringRedisSerializer());//設置hash value的序列化方式jsonredisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);redisTemplate.afterPropertiesSet();return redisTemplate;}

實體層

購物車

@Data public class Cart {private Long userId;private Long productId;private int amount;}@Data public class CartPage<T> {private List<T> cartList;private int count;}

商品

@Data public class Product {private Long id;/*** 產品名稱*/private String name;/*** 產品價格*/private Integer price;/*** 產品詳情*/private String detail;}

控制層

商品控制層:

@RestController @Slf4j @RequestMapping(value = "/pruduct") public class ProductController {@Autowiredprivate RedisTemplate redisTemplate;@PostMapping(value = "/create")public void create(Product obj) {//TODO 先進db//創建商品,先把數據添加到數據庫,再存入redisString key="product:"+1000;//將Object對象里面的屬性和值轉化成Map對象Map<String, Object> map=this.objectToMap(obj);//批量put操作 putAll 等于 hmset命令//String數據結構opsForValue hash數據結構opsForHashthis.redisTemplate.opsForHash().putAll(key,map);Object name=this.redisTemplate.opsForHash().get(key,"name");log.info("name={}",name);Object price=this.redisTemplate.opsForHash().get(key,"price");log.info("price={}",price);Object detail=this.redisTemplate.opsForHash().get(key,"detail");log.info("detail={}",detail);}@PostMapping(value = "/addPrice")public void addPrice(int id,int price) {String key="product:"+id;//商品價格漲價 increment等于 hincrby命令this.redisTemplate.opsForHash().increment(key,"price",price);Object price2=this.redisTemplate.opsForHash().get(key,"price");log.info("price={}",price2);}/*** 將Object對象里面的屬性和值轉化成Map對象*/public Map<String, Object> objectToMap(Object obj) {Map<String, Object> map = new HashMap<String,Object>();Class<?> clazz = obj.getClass();for (Field field : clazz.getDeclaredFields()) {field.setAccessible(true);String fieldName = field.getName();Object value = null;try {value = field.get(obj);} catch (IllegalAccessException e) {log.error(e.getMessage());}map.put(fieldName, value);}return map;} }

購物車控制層:

RestController @Slf4j @RequestMapping(value = "/cart") public class UserCartController {@Autowiredprivate RedisTemplate redisTemplate;/*** 購物車key的前綴*/public static final String CART_KEY = "cart:user:";/*** 添加購物車*/@PostMapping(value = "/addCart")public void addCart(Cart obj) {String key = CART_KEY + obj.getUserId();Boolean hasKey = redisTemplate.opsForHash().getOperations().hasKey(key);//存在if(hasKey){this.redisTemplate.opsForHash().put(key, obj.getProductId().toString(), obj.getAmount());}else{this.redisTemplate.opsForHash().put(key, obj.getProductId().toString(), obj.getAmount());this.redisTemplate.expire(key,90, TimeUnit.DAYS);}//TODO 發rabbitmq 出去}/*** 修改購物車的數量*/@PostMapping(value = "/updateCart")public void updateCart(Cart obj) {String key = CART_KEY + obj.getUserId();this.redisTemplate.opsForHash().put(key, obj.getProductId().toString(), obj.getAmount());//TODO 發rabbitmq 出去}/***刪除購物車*/@PostMapping(value = "/delCart")public void delCart(Long userId, Long productId) {String key = CART_KEY + userId;this.redisTemplate.opsForHash().delete(key, productId.toString());//TODO 發rabbitmq 出去}@PostMapping(value = "/findAll")public CartPage findAll(Long userId) {String key = CART_KEY + userId;CartPage cartPage = new CartPage();//查購物車的總數long size = this.redisTemplate.opsForHash().size(key);cartPage.setCount((int) size);//查詢購物車的所有商品//entries=hgetall命令Map<String, Integer> map = this.redisTemplate.opsForHash().entries(key);List<Cart> cartList = new ArrayList<>();for (Map.Entry<String, Integer> entry : map.entrySet()) {Cart cart = new Cart();cart.setUserId(userId);cart.setProductId(Long.parseLong(entry.getKey()));cart.setAmount(entry.getValue());cartList.add(cart);}cartPage.setCartList(cartList);return cartPage;} }

實現cookie以后的購物車:

@Data public class CookieCart {private Long productId;private int amount;} @RestController @Slf4j @RequestMapping(value = "/cookiecart") public class CookieCartController {@Autowiredprivate RedisTemplate redisTemplate;@Autowiredprivate IdGenerator idGenerator;@Autowiredprivate HttpServletRequest request;@Autowiredprivate HttpServletResponse response;public static final String COOKIE_KEY = "cart:cookie:";/*** 添加購物車*/@PostMapping(value = "/addCart")public void addCart(CookieCart obj) {String cartId=this.getCookiesCartId();String key=COOKIE_KEY+cartId;Boolean hasKey = redisTemplate.opsForHash().getOperations().hasKey(key);//存在if(hasKey){this.redisTemplate.opsForHash().put(key, obj.getProductId().toString(),obj.getAmount());}else{this.redisTemplate.opsForHash().put(key, obj.getProductId().toString(), obj.getAmount());this.redisTemplate.expire(key,90, TimeUnit.DAYS);}}@PostMapping(value = "/updateCart")public void updateCart(CookieCart obj) {String cartId=this.getCookiesCartId();String key=COOKIE_KEY+cartId;this.redisTemplate.opsForHash().put(key, obj.getProductId().toString(),obj.getAmount());}/*** 刪除購物車*/@PostMapping(value = "/delCart")public void delCart(Long productId) {String cartId=this.getCookiesCartId();String key=COOKIE_KEY+cartId;this.redisTemplate.opsForHash().delete(key, productId.toString());}/*** 查詢某個用戶的購物車*/@PostMapping(value = "/findAll")public CartPage findAll() {String cartId=this.getCookiesCartId();String key=COOKIE_KEY+cartId;CartPage<CookieCart> cartPage=new CartPage();//查詢該用戶購物車的總數long size=this.redisTemplate.opsForHash().size(key);cartPage.setCount((int)size);//查詢購物車的所有商品Map<String,Integer> map= this.redisTemplate.opsForHash().entries(key);List<CookieCart> cartList=new ArrayList<>();for (Map.Entry<String,Integer> entry:map.entrySet()){CookieCart cart=new CookieCart();cart.setProductId(Long.parseLong(entry.getKey()));cart.setAmount(entry.getValue());cartList.add(cart);}cartPage.setCartList(cartList);return cartPage;}/*** 獲取cookies*/public String getCookiesCartId(){//第一步:先檢查cookies是否有cartidCookie[] cookies = request.getCookies();if(cookies != null){for(Cookie cookie : cookies){if(cookie.getName().equals("cartId")){return cookie.getValue();}}}//第二步:cookies沒有cartid,直接生成全局id,并設置到cookie里面//生成全局唯一idlong id=this.idGenerator.incrementId();//設置到cookiesCookie cookie=new Cookie("cartId",String.valueOf(id));response.addCookie(cookie);return id+"";}/*** 合并購物車* 把cookie中的購物車合并到登錄用戶的購物車*/@PostMapping(value = "/mergeCart")public void mergeCart(Long userId) {//第一步:提取未登錄用戶的cookie的購物車數據String cartId=this.getCookiesCartId();String keycookie=COOKIE_KEY+cartId;Map<String,Integer> map= this.redisTemplate.opsForHash().entries(keycookie);//第二步:把cookie中得購物車合并到登錄用戶的購物車String keyuser = "cart:user:" + userId;this.redisTemplate.opsForHash().putAll(keyuser,map);//第三步:刪除redis未登錄的用戶cookies的購物車數據this.redisTemplate.delete(keycookie);//第四步:刪除未登錄用戶cookies的cartidCookie cookie=new Cookie("cartId",null);cookie.setMaxAge(0);response.addCookie(cookie);}}

id生成工具:

@Service public class IdGenerator {@Autowiredprivate StringRedisTemplate stringRedisTemplate;private static final String ID_KEY = "id:generator:cart";/*** 生成全局唯一id*/public Long incrementId() {long n=this.stringRedisTemplate.opsForValue().increment(ID_KEY);return n;}}

總結

以上是生活随笔為你收集整理的redis+springboot实现购物车+商品数据修改实例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。