骚操作!使用二进制模型,仅靠0和1保存数据

    技术2022-07-10  218

    目录

    前言测试效果项目使用需求功能接口服务器测试结果嵌入功能

    前言

    需要在属性表配置用户环境变量的字段,为了节省内存空间,主管让我用一个字段记录多个数据状态,开始用表结构,但客户端不支持,就想到二进制数值保存数据

    测试效果

    先简单测试了下使用效果,数据很直观,代码如下图: 活动奖励储存:以前的用法是rewardlist表储存已领取奖励列表也很方便,用数值的话更省空间 示例:奖励列表有7个id。表结构{1,2,4,6},对应二进制数字0101011(43) 打印方法

    --10进制转二进制。n需要转的数,m几位数,二进制只有8位,改造了下 function byte2bin(n,m) local t = {} if not m then m = 8 end for i=m-1,0,-1 do t[#t+1] = math.floor(n / 2^i) n = n % 2^i end return table.concat(t) end

    项目使用

    需求

    配置表用户设置默认值,现在改成默认0 统一格式使用数值类型,转成二进制数记录修改后格式如下图

    { "userset" ,"int(11)" ,0 --0默认开放 是否播放bgm--是否允许好友申请--是否预设聊天内容--是否播放bgm ,"用户个性设置" },

    功能接口

    --用户个性设置修改 function Player:ChangeUserSetting(type) if self.cache.userset & (1<<(type - 1)) ~= 0 then --已设置为1 self.cache.userset = self.cache.userset &~(1<<type-1) else self.cache.userset = self.cache.userset | (1<<(type - 1)) end --个性设置 self.prop.userset = self.cache.userset return true end

    因为只有简单的开关设置,所以设置时候1的类型改为0,0的类型改1

    服务器测试结果

    初始userset属性为0默认打开,调用四次Player:ChangeUserSetting(type=1,2,3,4)方法后为15(1111)四个设置关掉 再调用一次Player:ChangeUserSetting(type = 4)关掉,打印结果7 = 15-8测试开关没有问题

    嵌入功能

    我们只需获取所需位数的值

    --获取二进制数据索引值(1右到左) function lua_util.getbyte2index(x,index) return (x>>index-1) & 1 end

    这里是判定好友申请设置,如果不为0则不接受申请好友

    --申请添加好友 function Friend:ApplyFriend(dbid) local target = server.playerCenter:DoGetPlayerByDBID(dbid) local targerdata = target.cache.friend_data if lua_util.getbyte2index(target.prop.userset,settype) ~= 0 then server.chatCenter:sendTipMsg(1712,self.player.cache.dbid) return false end (……省略) end

    类型控制

    UserSetConfig.SettingType = { isOpenBgm = 1, --是否播放bgm isApplyFriend = 2, --是否允许申请好友 isdefalutChat = 3,--是否默认聊天框 test = 4,-- } local settype = UserSetConfig.SettingType.isApplyFriend

    二进制骚操作也很多,学习还是有用的

    Processed: 0.011, SQL: 9