Redis Hash实现购物车功能如何存_利用HINCRBY增减商品数量

夏枫酱_2775

夏枫酱_2775

2026-04-08

1016人浏览

原创

redis hash 最适合存购物车,因其天然支持按商品id(field)原子增减、查询、删除;hincrby可安全±数量并自动初始化为0,但需应用层校验负数;key为cart:{user_id},value仅存整数数量,过期用expire设置。

redis hash实现购物车功能如何存_利用hincrby增减商品数量

为什么用 Redis Hash 存购物车而不是 String 或 JSON?

因为购物车本质是「用户 → 多个商品 ID → 各自数量」的映射关系,Hash 天然支持按 field(商品 ID)独立增减、查询、删除,且所有操作原子——HINCRBY 增减时不会出现并发超卖或负数,也不用先读再算再写。String 存 JSON 要反序列化+重序列化,锁或事务成本高;List 不支持按商品 ID 快速定位;Set 不能存数量。Hash 是最直接匹配语义的结构。

HINCRBY 增减商品数量的正确用法

HINCRBY 是唯一能安全做“+1/-1”且自动初始化为 0 的命令,比 HSET + 读取判断更简洁可靠。它只接受整数,所以必须确保传入的是数字类型值(不是字符串 "1"),否则报错 (error) ERR hash value is not an integer。

  • 加 1 件:HINCRBY cart:123 "sku:1001" 1
  • 减 1 件(可能归零):HINCRBY cart:123 "sku:1001" -1
  • 设为 5 件(不能用 HINCRBY,改用 HSET):HSET cart:123 "sku:1001" 5
  • 清空某商品:HDEL cart:123 "sku:1001"(比设为 0 更干净,后续 HLEN 统计也准确)

如何避免 HINCRBY 导致负库存?

HINCRBY 本身不校验业务逻辑,减到负数会成功(比如当前 0,再 HINCRBY ... -1 得 -1)。必须在应用层兜底:

  • 减之前用 HGET cart:123 "sku:1001" 拿当前值,判断是否 ≤ 0 再决定是否执行减操作
  • 或者用 Lua 脚本把“读-判-减”打包成原子操作(推荐):
    if tonumber(redis.call("HGET", KEYS[1], ARGV[1])) > 0 then
      return redis.call("HINCRBY", KEYS[1], ARGV[1], -1)
    else
      return 0
    end
  • 注意:不要依赖 HEXISTS 判断是否存在,因为 field 存在但值为 "0" 也是合法状态(比如用户手动设为 0 后又加回)

实际存哪些字段?key 设计和过期怎么配?

key 用 cart:{user_id} 最清晰;field 用业务主键(如 sku:1001),别用数据库自增 ID,避免跨系统耦合。value 只存数量(整数),其他信息(名称、价格、图片)查商品服务实时获取,不冗余进 Redis —— 否则价格变时要同步更新所有购物车,极易不一致。

  • 设置过期:EXPIRE cart:123 3600(1 小时),登录态续期时刷新;别用 SETEX,因为 Hash 不能用 SETEX 直接设过期,得额外调一次 EXPIRE
  • 慎用 HGETALL:用户商品多时返回大体积数据,建议分页用 HSCAN(配合游标)或前端按需拉单个 HGET
  • 清空整个购物车:DEL cart:123,比循环 HDEL 所有 field 快得多

真正容易被忽略的是:用户登出或长时间未操作后,Redis 中的购物车 key 不会自动消失,得靠过期时间兜底;而如果业务要求“登出即清空”,就得在登出逻辑里显式 DEL,不能只靠 TTL。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2155

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

3342

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

1116

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

3839

7

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

6539

3

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

989

5

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.25

3020

5

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.03

1778

5

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

2764

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.9万人学习