咨询个与框架无关的问题,做游戏项目时需要保存用户的积分值且在每局结束时实时返回排名和积分值。这块用的是redis zset,但有个问题是游戏中关数很多,积分值也会很大(就是超过16位数),score中保存整数值超过16位后精度丢失排序也会不准。
我是把原数据处理成json后再入库
不是入库问题,是需要排序
Redis的ZSET底层使用双精度浮点数来存储分值(score),而双精度浮点数的有效精度为15到17位,所以确实会产生精度丢失的问题。 可以使用 bccomp 扩展来进行排序,把他放到静态数组里面,或者单独开启一个进程处理这个数据,写入数据的时候就做排序。 或者,你用c 重构一下redis 简易版,让他支持超过16位的大整数
我是把原数据处理成json后再入库
不是入库问题,是需要排序
Redis的ZSET底层使用双精度浮点数来存储分值(score),而双精度浮点数的有效精度为15到17位,所以确实会产生精度丢失的问题。
可以使用 bccomp 扩展来进行排序,把他放到静态数组里面,或者单独开启一个进程处理这个数据,写入数据的时候就做排序。
或者,你用c 重构一下redis 简易版,让他支持超过16位的大整数