尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Redis命令:HINCRBYFLOAT

发布时间:2026/9/29 1:33:41

资讯中心
01
ARTICLE

Redis命令:HINCRBYFLOAT

Redis命令:HINCRBYFLOAT
Redis HINCRBYFLOAT 命令详细教程HINCRBYFLOAT对 Hash 中某个字段的浮点数值做加减。字段不存在时按 0 起算返回的是字符串形式的运算结果不是整数。资料合集https://pan.quark.cn/s/10e98d308913、https://pan.quark.cn/s/f56bc69c5338一、概览与语法HINCRBYFLOAT key field increment项目说明数据类型Hash 字段的浮点数值支持版本Redis 2.6.0 起keyHash 的 Key不存在时自动创建field要增减的字段不存在时按 0 起算increment浮点数可为负数实现减法也支持科学计数法返回值运算后该字段的值字符串回复时间复杂度O(1)ACLwrite、hash、fast返回值是批量字符串而不是整数即使结果是10这样的整数值也带引号。客户端可能把它解码为字符串或浮点数取决于客户端实现与配置。$TRAE_REF二、基础示例以下命令在测试实例的 redis-cli 中执行。文中结果是预期说明未实际连接 Redis 运行。DEL tutorial:{hincrbyfloat}:wallet HSET tutorial:{hincrbyfloat}:wallet balance 10.50 HINCRBYFLOAT tutorial:{hincrbyfloat}:wallet balance 0.1 HINCRBYFLOAT tutorial:{hincrbyfloat}:wallet balance -5 HSET tutorial:{hincrbyfloat}:wallet balance 5.0e3 HINCRBYFLOAT tutorial:{hincrbyfloat}:wallet balance 2.0e2 HGET tutorial:{hincrbyfloat}:wallet balance预期结果第一次 HINCRBYFLOAT 返回10.6注意不是10.60第二次返回5.6HSET ... 5.0e3返回0表示是更新已有字段而非新增随后 HINCRBYFLOAT 返回5200科学计数法输入被解析为普通数值输出。HGET 返回5200说明字段以字符串形式存储。三、返回值的格式与精度Redis 内部以高精度浮点类型完成加法输出时会去除多余的尾随零因此10.50加0.1得到10.6而不是10.60。这带来几点实践上的注意现象说明返回字符串而非数字需要业务自行解析为浮点或定点数尾随零被去除10.60与10.6表示同一数值字符串比较不相等输出精度有限不能保证任意小数位完全精确不能当作定点金额类型使用输入支持科学计数法5.0e3、2.0e2均可解析负数增量等价于减法无需单独命令十进制小数在二进制浮点中往往无法精确表示0.1这类数值的累加可能产生极小的误差。因此金额、账务等要求精确的场景不应使用 HINCRBYFLOAT应改用整数存储最小货币单位例如以“分”为单位配合 HINCRBY 完成加减。四、错误与边界情况场景行为Key 不存在自动创建 Hash字段从 0 起算字段不存在按 0 起算不报错字段值不是数字如abc报错提示不是有效浮点数increment 不是数字报错运算结果产生 NaN 或 Infinity报错字段值保持不变Key 是 String、List 等非 Hash报 WRONGTYPE 错误字段带 TTL7.4 及以上运算保留该字段的 TTL字段值是3.0e3可被解析为 3000DEL tutorial:{hincrbyfloat}:errors HSET tutorial:{hincrbyfloat}:errors text abc HINCRBYFLOAT tutorial:{hincrbyfloat}:errors text 1 HSET tutorial:{hincrbyfloat}:errors big 1e308 HINCRBYFLOAT tutorial:{hincrbyfloat}:errors big 1e308 SET tutorial:{hincrbyfloat}:wrong text HINCRBYFLOAT tutorial:{hincrbyfloat}:wrong field 1对 text 字段的调用因值不是有效数字而报错1e308加1e308会超出可表示范围而产生 Infinity同样触发错误且字段值保持不变最后一条在 String 类型上报 WRONGTYPE。具体错误文案可能随版本变化业务应捕获客户端抛出的响应错误而不是匹配固定文本。五、复制与 AOF 的传播方式为避免不同平台浮点运算实现的差异导致主从数据不一致HINCRBYFLOAT 不会把命令原样写入复制流和 AOF而是转换为等价的 HSET 操作传播。这意味着影响说明数据一致性从库与 AOF 重放得到的是确定的结果值不受浮点实现差异影响命令审计在 AOF 或慢查询相关记录中可能看到的是 HSET 而不是 HINCRBYFLOAT语义不变对使用方而言命令行为与返回值不受影响这一点在排查“为什么 AOF 里没有 HINCRBYFLOAT”时容易产生困惑属于预期设计。$TRAE_REF六、TTL、原子性与并发与 HINCRBY 相同HINCRBYFLOAT 是在原值基础上运算不覆盖字段内容因此保留字段已有的过期时间而 HSET 覆盖字段会清除该字段的 TTL。在 Redis 7.4 及以后可以用 HEXPIRE 单独给字段设置期限。DEL tutorial:{hincrbyfloat}:ttl HSET tutorial:{hincrbyfloat}:ttl score 1.5 HEXPIRE tutorial:{hincrbyfloat}:ttl 300 FIELDS 1 score HINCRBYFLOAT tutorial:{hincrbyfloat}:ttl score 0.5 HTTL tutorial:{hincrbyfloat}:ttl FIELDS 1 score HSET tutorial:{hincrbyfloat}:ttl score 2 HTTL tutorial:{hincrbyfloat}:ttl FIELDS 1 score预期结果HINCRBYFLOAT 后 HTTL 仍为正数说明 TTL 保留改用 HSET 覆盖后 HTTL 变为-1说明 TTL 被清除。单条 HINCRBYFLOAT 在服务端原子执行并发调用不会丢失更新。但“先读取、再判断、再累加”的流程仍不是原子的需要阈值判断时应使用 Lua 脚本或带 WATCH 的事务设计。另外由于浮点误差的存在用等值比较判断结果是否符合预期并不可靠。七、客户端示例前提为已安装 redis-py 并准备好本地测试实例。redis-py 的hincrbyfloat(name, key, amount)返回浮点数客户端会完成字符串到浮点的转换。importredis rredis.Redis(hostlocalhost,port6379,decode_responsesTrue)ktutorial:{hincrbyfloat}:pythontry:r.delete(k)print(r.hincrbyfloat(k,score,10.5))# 10.5print(r.hincrbyfloat(k,score,0.1))# 10.6print(r.hincrbyfloat(k,score,-5))# 5.6print(r.hget(k,score))# 5.6服务端存的是字符串# 原始命令返回字符串可用于观察去除尾随零的行为r.hset(k,raw,10.50)print(r.execute_command(HINCRBYFLOAT,k,raw,0.1))# 10.6字符串finally:r.delete(k)r.close()JavaJedis示例返回 doubletry(JedisjedisnewJedis(localhost,6379)){System.out.println(jedis.hincrByFloat(tutorial:{hincrbyfloat}:java,score,10.5));// 10.5System.out.println(jedis.hincrByFloat(tutorial:{hincrbyfloat}:java,score,-0.5));// 10.0jedis.del(tutorial:{hincrbyfloat}:java);}八、与相近命令的区别命令数值类型返回值类型适用场景HINCRBY64 位有符号整数整数计数、精确累加、金额按最小单位存储HINCRBYFLOAT浮点数字符串评分、权重等允许误差的累加INCRBYFLOAT浮点数String Key字符串整个 Key 的浮点累加HSET任意字符串新增字段数直接赋值会清除字段已有的 TTL需要精确金额时使用 HINCRBY 配合整数分需要浮点统计时使用 HINCRBYFLOAT 并接受误差需要按整个 Key 操作时使用 INCRBYFLOAT。九、练习、排错与总结练习新建tutorial:{hincrbyfloat}:exercise用 HINCRBYFLOAT 对字段 rate 依次加 1.5、加 0.25、减 0.75预期返回1.5、1.75、1用 HGET 确认值为1再对字段写入abc后执行 HINCRBYFLOAT预期报错。排错要点返回1却被当成整数处理时注意它实际是字符串比较结果字符串失败时应先解析为数值再比较且避免使用浮点等值判断报“不是有效浮点数”时检查字段内容是否被写入了非数字文本报 WRONGTYPE 时用 TYPE 确认类型结果与手算有微小差异属于浮点误差金额场景应改用整数方案。清理使用DEL tutorial:{hincrbyfloat}:wallet tutorial:{hincrbyfloat}:errors tutorial:{hincrbyfloat}:wrong tutorial:{hincrbyfloat}:ttl tutorial:{hincrbyfloat}:exercise。速记2.6 起支持、浮点累加、返回字符串、去除尾随零、保留字段 TTL、复制与 AOF 中以 HSET 传播、金额场景改用整数分。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。