<?php
// 服务层 namespace Common\Service;
use Vendor\Func\Red; class CartService extends CommonService {
protected $redis;
protected $pre_key;
public function __construct()
{
parent::__construct();
$this->redis = Red::create();
$this->pre_key = C('USER.CART').C('APPID').':';
} /**
* 加入购物车,移除购物车,但是不会删除
* @param $openid
* @param $sku_id
* @param int $count
* @return mixed
*/
public function add($openid, $sku_id, $count = 1)
{
$key = $this->pre_key.$openid;
// 可增可减
return $this->redis->hIncrBy($key, $sku_id, $count);
} /**
* 批量添加
* @param $openid
* @param array $data
* @return mixed
*/
public function addBatch($openid, array $data)
{
$key = $this->pre_key.$openid;
// 批量执行
$r = $this->redis->multi(\Redis::PIPELINE);
foreach ($data as $k => $v) {
$r = $r->hIncrBy($key, $k, $v);
}
return $this->redis->exec();
} /**
* 删除购物车单个商品
* @param $openid
* @param $sku_id
* @return mixed
*/
public function delete($openid, $sku_id)
{
$key = $this->pre_key.$openid;
return $this->redis->hdel($key, $sku_id);
} /**
* 删除购物车多个商品
* @param $openid
* @param $sku_ids
* @return bool
*/
public function deleteBatch($openid, $sku_ids)
{
$key = $this->pre_key.$openid;
foreach ($sku_ids as $k => $v) {
$this->redis->hdel($key, $v);
} return true;
} /**
* 检测商品是否已在购物车中
* @param $openid
* @param $sku_id
* @return mixed
*/
public function exists($openid, $sku_id)
{
$key = $this->pre_key.$openid;
return $this->redis->hExists($key, $sku_id);
} /**
* 清空购物车
* @param $openid
* @return mixed
*/
public function deleteAll($openid)
{
$key = $this->pre_key.$openid;
return $this->redis->del($key);
} /**
* 判断购物车中是否有数据,有多少
* @param $openid
* @return mixed
*/
public function hasUserCart($openid)
{
$key = $this->pre_key.$openid;
return $this->redis->hLen($key);
} /**
* 设置为固定数量
* @param $openid
* @param $sku_id
* @param $count
* @return bool
*/
public function setCount($openid, $sku_id, $count)
{
$key = $this->pre_key.$openid;
$status = $this->redis->hset($key, $sku_id, $count);
if ((int)$status === -1) {
return false;
}
return true;
} /**
* 获取购物车中单个商品的数量
* @param $openid
* @param $sku_id
* @return mixed
*/
public function getCount($openid, $sku_id)
{
$key = $this->pre_key.$openid;
return $this->redis->hget($key, $sku_id);
} /**
* 获取全部数据
* @param $openid
* @return mixed
*/
public function getAll($openid)
{
$key = $this->pre_key.$openid;
return $this->redis->hgetall($key);
} /**
* 获取全部商品id
* @param $openid
* @return mixed
*/
public function getAllKeys($openid)
{
$key = $this->pre_key.$openid;
return $this->redis->hkeys($key);
} /**
* 获取全部商品数量
* @param $openid
* @return mixed
*/
public function getAllVal($openid)
{
$key = $this->pre_key.$openid;
return $this->redis->hvals($key);
}
}

加入购物车,移除购物车,清空购物车,查看购物车数量,查看全部商品等等。

PHP中封装Redis购物车功能的更多相关文章

  1. openresty开发系列27--openresty中封装redis操作

    openresty开发系列27--openresty中封装redis操作 在关于web+lua+openresty开发中,项目中会大量操作redis, 重复创建连接-->数据操作-->关闭 ...

  2. python开发-实现redis中的发布订阅功能

    Python3学习(二十七):python实现Redis的订阅与发布(sub-pub机制) 先介绍一下redis的pub/sub功能: Pub/Sub功能(means Publish, Subscri ...

  3. Java实现购物车功能:方式一:存放在session中.方式二:存储在数据库中

    //将购物车产品加入到cookie中,方式同浏览记录.Java实现购物车,方式一(简易版):存储在session中.这种方式实现还不严谨,大家看的时候看思路即可.(1). JSP页面中,选择某一款产品 ...

  4. $Django python中使用redis, django中使用(封装了),redis开启事务(管道)

    一 Python操作Redis之普通连接 #先安装 pip3 install redis import redis r = redis.Redis(host='127.0.0.1', port=637 ...

  5. 042——VUE中组件之子组件使用$on与$emit事件触发父组件实现购物车功能

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. spring中订阅redis键值过期消息通知

    1.首先启用redis通知功能(ubuntu下操作):编辑/etc/redis/redis.conf文件,添加或启用以下内容(过期通知): notify-keyspace-events Ex 或者登陆 ...

  7. Redis的安装以及在项目中使用Redis的一些总结和体会

    第一部分:为什么我的项目中要使用Redis 我知道有些地方没说到位,希望大神们提出来,我会吸取教训,大家共同进步! 注册时邮件激活的部分使用Redis 发送邮件时使用Redis的消息队列,减轻网站压力 ...

  8. javaweb学习——session和Cookie实现购物车功能

    1.创建Book类,实现对图书信息的封装. package cn.it.sessionDemo.example1; import java.io.Serializable; /** * 该类实现对图书 ...

  9. 红包雨中:Redis 和 Lua 的邂逅

    2018年,王思聪的冲顶大会,西瓜视频的百万英雄,再到映客的芝士超人,直播答题火爆全网. 我服务的一家电商公司也加入了这次热潮,技术团队研发了直播答题功能.答题结束之后,红包会以红包雨的形式落下,用户 ...

随机推荐

  1. Oracle12.2中新增的分区功能

    Oracle 12.2已经发布一段时间,公网上也可以下载试用.针对12.2,partitioning(分区)也有了不少增强. 自动列表分区 多字段列表分区 只读分区 分区维护时允许过滤 在线转换非分区 ...

  2. springboot打war包需要注意事项

    1. pom文件 1.1 添加servlet-api依赖: <!-- 添加servlet-api的依赖--> <dependency> <groupId>org.a ...

  3. 2017第十三届湖南省省赛B - Simplified Blackjack CSU - 1998

    在一次聚会上,Bob打算和Alice一起玩Blackjack游戏,但Alice平时很少玩扑克类游戏,Bob觉得跟Alice解释清楚Blackjack的规则有点困难,于是Bob决定和Alice玩一次简化 ...

  4. 合并ts到mp4

    这个比较好用. copy /b d:\xxx\download_ts\*   d:\xxx\download_ts\new.mp4 用python ffmpeg也可以,不过我合出来有卡顿或者掉声问题, ...

  5. leetcode [34] Find First and Last Position of Element in Sorted Array

    Given an array of integers nums sorted in ascending order, find the starting and ending position of ...

  6. eclipse maven Errors while generating javadoc on java8

    With JDK 8, we are unable to get Javadoc unless your tool meets the standards of doclint. Some of it ...

  7. 【题解】 Luogu CF375D Tree and Queries

    原题传送门 这道题要用树链剖分,我博客里有对树链剖分的详细介绍 我博客中对莫队的详细介绍 莫队好题 我一上来想写线段树,随后觉得不好写并弃坑 我们可以看见没有修改操作,钦定莫队 但这是在树上,所以不能 ...

  8. OpenJudge cdqz/Data Structure Challenge 2 (Problem 5822) - 可持久化线段树

    描述 给一个空数列,有M次操作,每次操作是以下三种之一: (1)在数列后加一个数 (2)求数列中某位置的值 (3)撤销掉最后进行的若干次操作(1和3) 输入 第一行一个正整数M. 接下来M行,每行开头 ...

  9. 复旦高等代数II(16级)每周一题

    每周一题的说明 一.本学期高代II的每周一题面向16级的同学,将定期更新(一般每周的周末公布下一周的题目); 二.欢迎16级的同学通过微信或书面方式提供解答图片或纸质文件给我,优秀的解答可以分享给大家 ...

  10. spring配置jax-ws

    在spring配置文件中新建bean(或者是在配置文件中添加bean),在该bean中添加指定的访问地址. @Bean public static SimpleJaxWsServiceExporter ...