[编程技术] Redis Zset的精度问题分析及解决方案
作者:CC下载站 日期:2020-12-04 13:00:51 浏览:24 分类:编程开发
背景
最近使用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
取消回复欢迎 你 发表评论:
- 精品推荐!
-
- 最新文章
- 热门文章
- 热评文章
[电视剧] 芈月传 【全集81集全】【未删减版】【国语中字】【2015】【HD720P】【75G】
[电视剧] 封神榜 梁丽版 (1989) 共5集 480P国语无字 最贴近原著的一版【0.98 G】
[影视] 【雪山飞孤4个版本】【1985、1991、1999、2007】【1080P、720P】【中文字幕】【167.1G】
[资料] 24秋初中改版教材全集(全版本)[PDF]
[电影] 高分国剧《康熙王朝》(2001)4K 2160P 国语中字 全46集 78.2G
[动画] 迪士尼系列动画139部 国英双语音轨 【蓝光珍藏版440GB】
[电影] 莫妮卡贝鲁奇为艺术献身电影大合集 1080P超清 双语字幕
[电影] DC电影宇宙系列合集18部 4K 高码率 内嵌中英字幕 273G
[音乐] 【坤曲/4坤时】鸡你太美全网最全,385首小黑子战歌,黄昏见证虔诚的信徒,巅峰诞生虚伪的拥护!
[音乐] 用餐背景音乐大合集 [MP3/flac]
[书籍] 彭子益医书合集 [PDF/DOC]
[游戏] 《黑神话悟空》免安装学习版【全dlc整合完整版】+Steam游戏解锁+游戏修改工具!
[动画] 《名侦探柯南》名侦探柯南百万美元的五菱星 [TC] [MP4]
[电视剧集] [BT下载][黑暗城市- 清扫魔 Dark City: The Cleaner 第一季][全06集][英语无字][MKV][720P/1080P][WEB-RAW]
[动画] 2002《火影忍者》720集全【4K典藏版】+11部剧场版+OVA+漫画 内嵌简日字幕
[剧集] 《斯巴达克斯》1-4季合集 无删减版 1080P 内嵌简英特效字幕
[CG剧情] 《黑神话:悟空》158分钟CG完整剧情合集 4K120帧最高画质
[游戏] 黑神话悟空离线完整版+修改器
[短剧] 被下架·禁播的羞羞短剧·午夜短剧合集
[图像处理] 光影魔术手v4.6.0.578绿色版
[影视] 美国内战 4K蓝光原盘下载+高清MKV版/内战/帝国浩劫:美国内战(台)/美帝崩裂(港) 2024 Civil War 63.86G
[影视] 一命 3D 蓝光高清MKV版/切腹 / 切腹:武士之死 / Hara-Kiri: Death of a Samurai / Ichimei 2011 一命 13.6G
[影视] 爱情我你他 蓝光原盘下载+高清MKV版/你、我、他她他 2005 Me and You and Everyone We Know 23.2G
[影视] 穿越美国 蓝光原盘下载+高清MKV版/窈窕老爸 / 寻找他妈…的故事 2005 Transamerica 20.8G
[电影] 《黄飞鸿》全系列合集
[Android] 开罗游戏 ▎像素风格的模拟经营的游戏厂商安卓游戏大合集
[游戏合集] 要战便战 v0.9.107 免安装绿色中文版
[书籍] 彭子益医书合集 [PDF/DOC]
[资源] 精整2023年知识星球付费文合集136篇【PDF格式】
[系统]【黑果小兵】macOS Big Sur 11.0.1 20B50 正式版 with Clover 5126 黑苹果系统镜像下载
- 最新评论
-
谢谢分享感谢ppy2016 评论于:11-05 怎么没有后续闲仙麟 评论于:11-03 怎么没后续闲仙麟 评论于:11-03 有靳东!嘻嘻奥古斯都.凯撒 评论于:10-28 流星花园是F4处女作也是4人集体搭配的唯一一部!奥古斯都.凯撒 评论于:10-28 找了好久的资源,终于在这里找到了。感谢本站的资源和分享。谢谢AAAAA 评论于:10-26 找了好久的资源,终于在这里找到了。感谢本站的资源和分享。谢谢password63 评论于:10-26 找了好久的资源,终于在这里找齐了!!!!blog001 评论于:10-21 找了好久的资源,终于在这里找齐了!!!!blog001 评论于:10-21 找了好久的资源,终于在这里找到了。感谢本站的资源和分享。谢谢WillKwok 评论于:10-09
- 热门tag