Redis里浮点数到底咋设置才对,方法和细节一起聊聊
- 问答
- 2025-12-27 10:31:26
- 1
你得知道,Redis本身没有专门为浮点数设置一个独立的数据类型,你平时用的SET、GET,主要是针对字符串的,那浮点数怎么办?答案就是,把浮点数当成字符串存进去,没错,就是这么简单粗暴,当你需要存一个浮点数,比如3.14,你实际上就是存了一个字符串 "3.14" 到Redis的键值对里。
(根据Redis官方文档对数据类型的说明,字符串类型是用于存储任何二进制安全数据的,这自然包括了数字的字符串表现形式。)
光存进去不行,我们还得能进行计算,如果我存了两个浮点数,想做个加法,总不能取出来在程序里转成数字算完再存回去吧?那也太麻烦了,而且网络IO开销大,这时候,就要用到Redis提供的另一套命令了,也就是“位操作”的远房亲戚——增量命令。
最核心的两个命令是INCRBYFLOAT和HINCRBYFLOAT,别看名字里带着INCR(增加),它们其实能实现加法和减法(通过增加一个负值)。
INCRBYFLOAT是针对普通的字符串类型的键,比如你有一个键叫user:1000:account_balance,初始值是0,你可以直接用SET user:1000:account_balance 100.5把它设为100.5,当用户充值50.8元时,你不需要先GET再计算再SET,而是直接一条命令:INCRBYFLOAT user:1000:account_balance 50.8,Redis会帮你把值(字符串"100.5")转换成浮点数,加上50.8,再把结果(151.3)转换成字符串存回去,同样,消费就是INCRBYFLOAT user:1000:account_balance -30.1。HINCRBYFLOAT是针对哈希(Hash)类型中的某个字段的,用法一模一样,只是前面需要指定哈希的键和字段名,比如在用户信息哈希里存个余额:HSET user:1000 balance 100.5,然后充值:HINCRBYFLOAT user:1000 balance 50.8。
(参考自Redis命令手册中对INCRBYFLOAT和HINCRBYFLOAT的说明,这些命令会解析字符串为IEEE 754标准的双精度浮点数进行计算。)
现在我们来聊聊细节,这也是最容易出问题的地方。
第一个细节是精度问题,这是浮点数计算的通病,不是Redis的锅,而是遵循IEEE 754标准的任何计算机系统都会有的问题,简单说,就是有些十进制小数无法用二进制精确表示,会有微小的误差,你执行INCRBYFLOAT mykey 0.1,连续执行10次,你期望的结果是1.0,但实际得到的值可能是 00000000000000000000001 之类的,这在金融等对精度要求极高的场景是致命的。
怎么办呢?有常见的几种对策:
- 规避:如果可能,尽量用整数,比如把钱的单位从“元”改成“分”,这样所有计算都是整数运算,用
INCRBY命令,绝对精确。 - 容忍:如果你的业务场景对小数点后几位不敏感,比如一些统计值、温度值,那么直接使用浮点数,在显示结果时四舍五入到所需位数即可。
- 后期处理:在从Redis取回数据后,在你的应用程序中(比如用Python、Java)进行精确的十进制计算,然后再展示或使用。
第二个细节是原子性,这是一个好消息!INCRBYFLOAT和HINCRBYFLOAT命令是原子操作,这意味着即使在多客户端同时并发地对同一个键进行增减时,Redis也能保证每个操作都会正确执行,不会出现竞争条件导致的数据错乱,你不需要自己加锁,Redis帮你搞定了,这是使用这些命令而不是“GET-计算-SET”流程的最大优势。
第三个细节是关于获取和设置,除了增量操作,你当然也可以直接设置和获取浮点数的值。
- 设置:直接用
SET或HSET,后面跟数字形式的字符串就行,比如SET temperature 36.5。 - 获取:用
GET或HGET,但这里有个小坑:你取回来的是一个字符串,你的客户端驱动程序(比如Python的redis-py)通常会比较智能,会尝试把这个字符串转换成整数或浮点数再返回给你,但为了保险起见,你最好知道它的本质是字符串,并且在你的代码里做好类型转换的准备。
第四个细节是值的范围,Redis能够处理非常大或非常小的浮点数,它使用C语言的long double类型来进行计算,以尽可能保持精度,但对于指数形式表示的极值,可能会存在精度丢失,常规的科学计算和业务场景完全够用。
正确设置和使用Redis浮点数的方法就是:
- 心里有数:明白它本质是存成字符串,用专门命令计算。
- 选对命令:做加减法,毫不犹豫地用
INCRBYFLOAT或HINCRBYFLOAT,享受原子操作的便利。 - 警惕精度:这是核心痛点,根据业务场景决定是转整数、容忍误差还是后期处理。
- 放心并发:增量命令是原子的,在高并发下可以信赖。
你把Redis当成一个支持基础浮点运算的、线程安全的计数器来用就对了,但千万别把它当成Python或Java里的高精度Decimal计算器。

本文由歧云亭于2025-12-27发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://haoid.cn/wenda/69359.html
