[编程技术] Redis Zset的精度问题分析及解决方案
作者:精品下载站 日期:2020-12-04 13:00:51 浏览:37 分类:编程开发
背景
最近使用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
取消回复欢迎 你 发表评论:
- 精品推荐!
-
- 最新文章
- 热门文章
- 热评文章
[短剧] 2025年06月03日 精选+付费短剧推荐25部
[软件合集] 25年6月3日 精选软件44个
[短剧合集] 2025年06月2日 精选+付费短剧推荐39部
[软件合集] 25年6月2日 精选软件18个
[软件合集] 25年6月1日 精选软件15个
[短剧合集] 2025年06月1日 精选+付费短剧推荐59部
[短剧] 2025年05月31日 精选+付费短剧推荐58部
[软件合集] 25年5月31日 精选软件66个
[电影] 黄沙漫天(2025) 4K.EDRMAX.杜比全景声 / 4K杜比视界/杜比全景声
[风口福利] 短视频红利新风口!炬焰创作者平台重磅激励来袭
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电视剧] 欢乐颂.5部全 (2016-2024)
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[影视] 【稀有资源】香港老片 艺坛照妖镜之96应召名册 (1996)
[剧集] 神经风云(2023)(完结).4K
[剧集] [BT] [TVB] [黑夜彩虹(2003)] [全21集] [粤语中字] [TV-RMVB]
[资源] B站充电视频合集,包含多位重量级up主,全是大佬真金白银买来的~【99GB】
[影视] 内地绝版高清录像带 [mpg]
[书籍] 古今奇书禁书三教九流资料大合集 猎奇必备珍藏资源PDF版 1.14G
[美图] 2W美女个美女小姐姐,饱眼福
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电影] 美国队长4 4K原盘REMUX 杜比视界 内封简繁英双语字幕 49G
[电影] 死神来了(1-6)大合集!
[软件合集] 25年05月13日 精选软件16个
[精品软件] 25年05月15日 精选软件18个
[绝版资源] 南与北 第1-2季 合集 North and South (1985) /美国/豆瓣: 8.8[1080P][中文字幕]
[软件] 25年05月14日 精选软件57个
[短剧] 2025年05月14日 精选+付费短剧推荐39部
[短剧] 2025年05月15日 精选+付费短剧推荐36部
- 最新评论
-
- 热门tag