专栏首页蓝天REdis zset和double

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++浮点知识图谱

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 两个SSH2间免密码登录

    以下针对的是ssh2,而不是ssh,也不是OpenSSH。配置分两部分:一是对登录机的配置,二是对被登录机的配置,其中登录机为客户端,被登录机为服务端,也就...

    一见
  • SSH2免密码登录精简详细说明

    以下针对的是ssh2,而不是ssh。精简的意思是无多余步骤,详细是说关键细节都有提到。配置分两部分:一是对登录机的配置,二是对被登录机的配置,其中登录机为客...

    一见
  • MYSQL 的 MASTER到MASTER的主主循环同步

    刚刚抽空做了一下MYSQL 的主主同步。 把步骤写下来,至于会出现的什么问题,以后随时更新。这里我同步的数据库是TEST 1、环境描述。    主机:192.1...

    一见
  • VuePress +Gitee 快速搭建个人博客

    其实很简单就是拿来主义。首先你要知道有哪些工具可以搭建博客;然后你可通过搜索引擎搜索官方文档,动动手指就可以本地运行起来。但是运行起来的只是个 demo ,你的...

    不安分的猿人
  • 硅谷投资家:数据科学大于生物科技对健康行业的贡献!

    大数据文摘
  • 大数据和隐私:政府必须选择!(下)

    大数据文摘
  • 超大触摸屏设计的7大注意事项

    以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具。

    奔跑的小鹿
  • 科技大V“董老师”:预测性销售云才是企业增长的未来

    数据猿导读 Datatist(画龙科技)CMO董飞告诉数据猿记者:“市场急需能够进行数据采集、建模、分析和实现一站式营销的人才和云产品;市场也需要真正以运营优化...

    数据猿
  • 数据科学家:21世纪最性感的职业

    2006年Jonathan Goldman到商业社交网站LinkedIn工作,那时的LinkedIn还只是刚创业不久,网站注册人数不到8百万,但是很多成员会邀请...

    小莹莹
  • 干货 | 如何用超大规模真实驾驶视频数据集做端到端自动驾驶

    AI 科技评论按:自动驾驶是人工智能落地的重要应用之一,许多业界公司和学校实验室都在以自己的方法研究自动驾驶系统。本次 AI 科技评论请到了许华哲博士介绍他们团...

    AI科技评论

扫码关注云+社区

领取腾讯云代金券