REdis zset和double
平台:x86_64
结论:Zset的最大分数不要超过18014398509481982(17位数字,54位二进制),否则不会得到期望的值。
REdis:5.0.4
Zset采用double存储分数值(score),而incrbyfloat和hincrbyfloat采用的是long double存储数值。
double本身是可以存储比18014398509481982(17位数字,54位二进制)大的值,比如18014398509481983(也是17位数字,54位二进制)。但REdis在返回结果时,调用strtod将值转成double类型。
取值源代码:
|
double zzlGetScore(unsigned char *sptr) { // t_zset.c:722 unsigned char *vstr; unsigned int vlen; long long vlong; char buf[128]; double score; serverAssert(sptr != NULL); serverAssert(ziplistGet(sptr,&vstr,&vlen,&vlong)); if (vstr) { memcpy(buf,vstr,vlen); buf[vlen] = '\0'; // 调用库函数strtod, // 如果值小于18014398509481983,能得到预期的值, // 否则总是返回18014398509481984(2的54次方)。 score = strtod(buf,NULL); // 字符串转double } else { score = vlong; } return score; } |
以字符串形式返回:
|
/* Add a double as a bulk reply */ void addReplyDouble(client *c, double d) { // networking.c:471 char dbuf[128], sbuf[128]; int dlen, slen; if (isinf(d)) { /* Libc in odd systems (Hi Solaris!) will format infinite in a * different way, so better to handle it in an explicit way. */ addReplyBulkCString(c, d > 0 ? "inf" : "-inf"); } else { dlen = snprintf(dbuf,sizeof(dbuf),"%.17g",d); // double转字符串 slen = snprintf(sbuf,sizeof(sbuf),"$%d\r\n%s\r\n",dlen,dbuf); addReplyString(c,sbuf,slen); } } |
x86_64上的测试:
|
127.0.0.1:6379> del k1 (integer) 1 127.0.0.1:6379> zadd k1 18014398509481982 m1 (integer) 1 127.0.0.1:6379> zrange k1 0 -1 WITHSCORES 1) "m1" 2) "18014398509481982" 预期的值 127.0.0.1:6379> del k1 (integer) 1 127.0.0.1:6379> zadd k1 18014398509481983 m1 (integer) 1 127.0.0.1:6379> zrange k1 0 -1 WITHSCORES 1) "m1" 2) "18014398509481984" 非预期的值(和strtod相关) 127.0.0.1:6379> del k1 (integer) 1 127.0.0.1:6379> zadd k1 18014398509481982 m1 (integer) 1 127.0.0.1:6379> zrange k1 0 -1 WITHSCORES 1) "m1" 2) "18014398509481982" 预期的值 127.0.0.1:6379> zincrby k1 1 m1 "18014398509481984" 非预期的值 127.0.0.1:6379> zrange k1 0 -1 WITHSCORES 1) "m1" 2) "18014398509481984" 非预期的值 |
附:C/C++浮点知识图谱

REdis zset和double的更多相关文章
- 实现排行榜神器——redis zset
需求:假如现在需要搞个 “运动消耗卡路里排行榜”,例似微信步数排名,显示排名前20人的信息和消耗的卡里路,怎样实现排序? 一般思路:存储信息,然后数据库查询,排序?(假如有几十万人参与排名,这样查my ...
- 延时任务-基于redis zset的完整实现
所谓的延时任务给大家举个例子:你买了一张火车票,必须在30分钟之内付款,否则该订单被自动取消.订单30分钟不付款自动取消,这个任务就是一个延时任务. 我之前已经写过2篇关于延时任务的文章: <完 ...
- Redis ZSet 有序集合
有序集合类型与集合类型的区别就是他是有序的.有序集合是在集合的基础上为每一个元素关联一个分数,这就让有序集合不仅支持插入,删除,判断元素是否存在等操作外,还支持获取分数最高/最低的前N个元素.有序集合 ...
- redis zset底层实现原理
一.Zset编码的选择 1.有序集合对象的编码可以是ziplist或者skiplist.同时满足以下条件时使用ziplist编码: 元素数量小于128个 所有member的长度都小于64字节 其他: ...
- Redis ZSet Type
Redis有序集合的操作命令和对应的api如下: zadd [zset] sco 'value' JedisAPI:public Long zadd(final String key, final d ...
- 将mysql表数据批量导入redis zset结构中
工作中有这样一个需求,要将用户的魅力值数据做排行,生成榜单展示前40名,每隔5分钟刷新一次榜单.这样的需求用redis的zset是很方便实现的.但是数据存在mysql的表中,有400多万条,怎么将其快 ...
- Redis学习第六课:Redis ZSet类型及操作
Sorted set是set的一个升级版本,它在set的基础上增加了一个顺序属性,这一属性在添加修改元素时候可以指定,每次指定后,zset会自动重新按新的值调整顺序.可以理解为有两列字段的数据表,一列 ...
- (PHP)redis Zset(有序集合 sorted set)操作
/** * * Zset操作 * sorted set操作 * 有序集合 * sorted set 它在set的基础上增加了一个顺序属性,这一属性在修改添加元素的时候可以指定,每次指定后,zset会自 ...
- C# 通过ServiceStack 操作Redis——ZSet类型的使用及示例
Sorted Sets是将 Set 中的元素增加了一个权重参数 score,使得集合中的元素能够按 score 进行有序排列 /// <summary> /// Sorted Sets是将 ...
随机推荐
- JSONObject optString
JSONObject optString 获取后台返回的{"state":1001,"data":"数据保存成功"} 用optString ...
- Selenium+TestNG+Maven+Jenkins+SVN(转载)
转载自:https://blog.csdn.net/u014202301/article/details/72354069 一. 创建Maven项目,下载Selenium和TestNG的依赖(依赖可以 ...
- gridview 列头自动适应宽度
Gridview gv=Gridcontrol.MainView as Gridview; gv.BestFitColumns();
- ISE初始化
step1:输入setup进行初始化,如下图: step2:输入setup进行初始化,如下图:
- python基础(17)继承类和面向对象初识
1.继承类 class Lm: money = 1000000 house = 5 def driver(self): print('会开车') class Mcb(Lm): def about_me ...
- es6对象的扩展
对象(object)是 JavaScript 最重要的数据结构之一. object 在es6中新增了很多便利的方法 在es6中允许直接写入变量和方法的名称直接作为对象的属性 let x =1 ,y=2 ...
- Busybox构建根文件系统和制作Ramdisk
定制根文件系统的方法很多,最常用的是使用BusyBox来构建定制根文件系统.它集成压缩了Linux的许多工具和命令,可以使用户迅速方便地建立一套相对完整.功能丰富的文件系统,其中包括大量常用的应用 ...
- 识别手机浏览器代码【C#和JS两种语言】
C# 识别手机浏览器代码: public static bool MobileBrowserDetect() { bool bismobile = false; try { #region 包含and ...
- linux一台服务器配置多个Tomcat
前提:linux服务器上已经运行多个Tomcat,再去搭建一个Tomcat服务 1.官网下载Tomcat 2.上传到服务器指定一个目录/usr/local/tomcat 3.然后解压tar包,tar ...
- spring :Log4j各级别日志重复打印
使用filter进行日志过滤 这个其实是Log4j自带的方案,也是推荐方案,不知道为什么网上的资料却很少提到这点. 把log4j.properties配置文件修改成如下: #root日志 log4j. ...