进制在业务中的运用

背景

之前策划是所有房间共存一个状态,但需求修改需要每个房间单独存一个状态,常规的解决方案是建表

  1. 建表加字段
    优点:代码结构清晰,业务需要更多状态存储也可以容易扩展
    缺点:需要建表,登陆需要多读一张表,多耗一些性能。业务扩展需要新建表字段。
  2. 通过进制在用一个数值存储多个房间状态
    优点:不需要改表结构,性能消耗和之前相当,扩展不需要新建字段
    缺点:需要对进制足够了解,且业务扩展受限,不能超过单个数的最大值。

具体用哪个方案需要根据业务场景,和扩展预期来选择,最后我选择了 2 方案通过 25 进制对六个房间数据存储,下面是对进制的公式做个记录

公式记录

初始化 n 进制的 ab 值为

1
a * Math.pow(n, 1) + b * Math.pow(n, 0);

将 n 进制的 p 的第 a 位数换为 c

1
2
3
Math.floor(p / Math.pow(25, a)) * Math.pow(25, a) +
(p % Math.pow(25, a - 1)) +
c * Math.pow(25, a - 1);

获取 n 进制 p 的第 a 位

1
Math.floor((p % Math.pow(n, a)) / Math.pow(25, a - 1));

总结

最后这个算法太骚了被禁止使用了。接手的人进制了解不够,代码就不好维护。