[编程技术] Redis Zset的精度问题分析及解决方案
作者:CC下载站 日期:2020-12-04 13:00:51 浏览:6 分类:编程开发
背景
最近使用Redis的SortedSet,使用int64作为score时遇到了一些预料之外的情况,在此总结一下。
介绍
项目中采用Redis SortedSet存储用户一些信息,score值存储的msgid(消息ID)。msgid采用snowflake算法生成,按照时间有序。
Snowflake的算法在我之前的博客里面有讲解: Snowflake算法
我们这边生成的msgid是根据snowflake算法生成的int64位整数。例如:215857550229364734
我们发现数值很接近的msgid,在redis中无法通过score进行区分。
举个列子,在redis中tzset结构里存入如下几条数据。
ZADD tzset 215857550229364734 test1
ZADD tzset 215857550229364735 test2
ZADD tzset 215857550229364736 test3
ZADD tzset 215857550229364737 test4
ZADD tzset 215857550229375123 test5
查询看一下结果
127.0.0.1:6379> zrange tzset 0 -1 WITHSCORES
1) "test1"
2) "2.1585755022936474e+17"
3) "test2"
4) "2.1585755022936474e+17"
5) "test3"
6) "2.1585755022936474e+17"
7) "test4"
8) "2.1585755022936474e+17"
9) "test5"
10) "2.1585755022937514e+17"
我们发现score值采用科学计数法表示,test1,test2,test3,test4几个元素的score值显示是一样的。
使用score=215857550229364735
执行查询,结果如下:
127.0.0.1:6379> zrangebyscore tzset 215857550229364735 215857550229364735
1) "test1"
2) "test2"
3) "test3"
4) "test4"
127.0.0.1:6379> zrangebyscore tzset (215857550229364735 215857550229375123
1) "test5"
发现与预期不符。
问题描述
这导致了我们使用socre做分页查找的时候,(一页10个,下一页使用上一页最后一个socre来继续查找)。会导致其中的一些数据丢失。 这些都是因为SortedSet的类型是double64的浮点数,存在精度问题。
贴上Redis官方文档ZADD指令的描述里面的一段话。 Redis ZAdd
Range of integer scores that can be expressed precisely
Redis sorted sets use a double 64-bit floating point number to represent the score. In all the architectures we support, this is represented as an IEEE 754 floating point number, that is able to represent precisely integer numbers between -(2^53) and +(2^53) included. In more practical terms, all the integers between -9007199254740992 and 9007199254740992 are perfectly representable. Larger integers, or fractions, are internally represented in exponential form, so it is possible that you get only an approximation of the decimal number, or of the very big integer, that you set as score.
简单来说,double64位的浮点数只有53bit
的精度。所以使用int64的大整数是需要注意,这个大整数的值不能大于这个最大值。
对于snowflake算法,之前的文章中有讲过。它是使用41+10+12=63
位的大整数。在此场景下是有精度问题的。
注:使用js也会有53bit的精度问题,几乎所有的编程语言都采用了 IEEE-754
双精度64 位浮点数表示法,任何使用二进制浮点数的编程语言都会有这个问题.
- sign bit(符号): 用来表示正负号
- exponent(指数): 用来表示次方数
- mantissa(尾数): 用来表示精确度
也就是说一个数字的范围只能在 -(2^53 -1) 至 2^53 -1 之间。
这个精度问题在很多业务上都会出现,很多时候前后端交互的时候作为web数据传输,大多数都会需要用到json传输数据。所以设计的数字类型就需要保证在53bit
之内。不然就会导致丢失精度。
解决方案
可以改造一下score的生成规则,比如我就修改了各个部分的长度。
- 修改timestamp的精度,由millionseconds改为seconds.
- 修改node的长度,由10位改为9位。(1024->512).
这样总长度就变为 32+9+12=53位。 当然也可以根据需求随机组合。比如把timestamp改为10millionseconds级别,或者100millionseconds级别。然后把step的精度变小一点。
<全文完>
猜你还喜欢
- 03-29 [编程相关] Winform窗体圆角以及描边完美解决方案
- 03-29 [前端问题] has been blocked by CORS policy跨域问题解决
- 03-29 [编程相关] GitHub Actions 入门教程
- 03-29 [编程探讨] CSS Grid 网格布局教程
- 10-12 [编程相关] python实现文件夹所有文件编码从GBK转为UTF8
- 10-11 [编程算法] opencv之霍夫变换:圆
- 10-11 [编程算法] OpenCV Camshift算法+目标跟踪源码
- 10-11 [Python] python 创建 Telnet 客户端
- 10-11 [编程相关] Python 基于 Yolov8 + CPU 实现物体检测
- 03-15 [脚本工具] 使用go语言开发自动化脚本 - 一键定场、抢购、预约、捡漏
- 01-08 [编程技术] 秒杀面试官系列 - Redis zset底层是怎么实现的
- 01-05 [编程技术] 《Redis设计与实现》pdf
取消回复欢迎 你 发表评论:
- 精品推荐!
-
- 最新文章
- 热门文章
- 热评文章
[资料] 非常多行业-工作总结word 共736份,个人部门述职范文,完整内容直接套用
[书籍] 双色球中奖分析与擒号秘技全图解(实用案例全新版)
[课程] 解锁AI未来:14门顶尖的平台付费AI课程全收录
[短剧] 付费短剧 黑料女配霸榜热搜
[书籍] 王阳明:一切心法(合集共2册)【PDF】
[课程] 回医马氏传承班
[电影] 2024年国产动作片《迷雾刺杀》HD国语中字
[电影] 2001年美国经典惊悚片《十一罗汉》蓝光国英双语中英双字
[红包活动] 放水!支付宝抽随机实体店通用红包
[电影] 2024年美国冒险片《冠军亚瑟》HD中英双字
[资料] [大学期末救急课] 猴博士+高斯课堂+斐多课堂,全集视频合集
[云资源] 价值2万元的老男孩Python教程
[书库] 史上最全摄影书推荐(附700本PDF版打包下载)
[云资源] 花了一千多元买的私人健身教程
[下载工具] Internet Download Manager 6.42.7 (IDM)
[影视] 灌篮高手 WEB-DL版下载/Slam Dunk/スラムダンク/灌篮高手:THE FIRST/灌篮高手电影版 2022 The First Slam Dunk 61.35G
[即时通讯] 腾讯QQ PC版9.7.22.29315去广告绿色纯净版
[开发环境] PhpStorm2023中文激活版v2023.3.3 正式版
[资料] 3000 套电影电视剧 LOGO 宣传片常用音效合集包
[安卓软件] 酷我音乐APP_v10.7.6.4 去广告破解豪华VIP版
[云资源] 价值2万元的老男孩Python教程
[影视] 灌篮高手 WEB-DL版下载/Slam Dunk/スラムダンク/灌篮高手:THE FIRST/灌篮高手电影版 2022 The First Slam Dunk 61.35G
[云资源] 花了一千多元买的私人健身教程
[书库] 史上最全摄影书推荐(附700本PDF版打包下载)
[动画] 北斗神拳(1984) [两季合集] [MKV]
[资料] 抗战阵亡将士资料+续编
[电视剧] 三体 (2024) 全8集 网飞版本 中文字幕 合集
[影视] 三大队 WEB-DL版下载/Endless Journey/请转告局长,三大队任务完成了 2023 三大队 6.7G
[纪录片] 河西走廊【10集 国语 中文字幕 1080P 10.8G MP4】
[安卓软件] OfficeSuite中文版APP v14.2.50872.0破解版
- 最新评论
-
我想看看mw2ddyy 评论于:04-26 好东西阿zfy123123 评论于:04-18 谢谢楼主xiaoqi 评论于:04-12 勿在线解压,勿手机解压,请在电脑上用最新款压缩软件解压!推荐360压缩或者好压CC下载站 评论于:04-10 无法解压啊,客服能不能给个解压教程ravengrey 评论于:04-10 谢谢支持!!CC下载站 评论于:03-26 很棒的资源,感谢分享云体风身 评论于:03-26 感谢分享,好东西云体风身 评论于:03-26 谢谢支持!CC下载站 评论于:03-14 央视精品,感谢付出提供。qwer9009 评论于:03-14
- 热门tag