首页 >> 手游攻略

O被多人强制标记车WRITE

很多朋友对于O被多人强制标记车WRITE和通过位运算打标记不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!

通过位运算打多个标记

如何在一个字段上,记录多个标记?

如何在一个字段上,记录不同类型的多个标记?

如何用较少的字段,记录多个标记?

如何在不增加字段的要求下,记录新增的标记?

在实际的开发中,经常有这样的需求,需要用尽可能少的字段,记录多个标记?

比如交易中一个订单,是否发生过支付?是否进行过发货?是否发生过退货退款?是否进行过理赔?

比如社交中一个帖子,是否审核通过?是否被举报过?是否发生过二次编辑,是否要置顶等等

以上场景,最终都是要记录到数据库中的。如果每增加一个类型,都增加一个字段标记是或者否的话,那每行记录的字段数,得增加到多少?

所以我们的诉求是希望通过尽可能少的字段,最好是不要增加数据库的字段,能够记录同时记录多个标记。

这样的场景,一种解决方式是:在数据库中增加一个内容是JSON格式的字段,然后每次往JSON中增加内容。这种方式的好处是比较灵活,增加标记不用修改数据库DDL。而且不需要记录的标记可以不存储,不用占用存储空间。但文本格式毕竟会占用较多的存储空间,随着标记的增加,类似MySQL数据库可能需要调整字符串长度

另一种解决方式是位运算,通过在不同的位置填充0或者1,表示标记的是或者否,有或者没有。大名鼎鼎的布隆过滤器,实现原理也是类似的

比如说一个订单,我们需要记录它是否发生过支付?是否发生过发货?是否发生过退货?那么就可以设计这么几个标记

PAY_FLAG(1L<<1L),DELIVER_FLAG(1L<<2L),REFUNR_FLAG(1L<<3L),

然后在订单表中增加一个flag字段,通过位运算,记录订单的不同标记。方法如下

//设置FlagpublicstaticLongsetFlag(LongorderFlag,OrderFlagEnumorderFlagEnum){orderFlag|=orderFlagEnum.getFlag();returnorderFlag;}//清除FlagpublicstaticLongclearFlag(LongorderFlag,OrderFlagEnumorderFlagEnum){orderFlag&=~orderFlagEnum.getFlag();returnorderFlag;}//判断是否设置过某个FlagpublicstaticbooleanhasFlag(OrderFlagEnumorderFlagEnum,LongorderFlag){return(orderFlag&orderFlagEnum.getFlag())!=0;}

引申一下,如果需要在一个字段中,记录多个标记,通过位运算,又该怎么实现呢?

比如说想要在一个字段中,记录两个标记。

还是可以通过不同位置标记1还是0实现,比如一个Long型标记,可以在低53位记录一个标记,在高10位记录另一个标记。

//初始标记Longflag=0L;//低位需要记录的标记LonglowFlag=1L<<11L;//高位需要记录的标记LonghighFlag=1L<<3L;//设置低位的标记flag|=lowFlag;//设置高位的标记flag|=(highFlag<<53);//判断是否设置低位标记System.out.println((flag&lowFlag)!=0);//true//判断是否设置高位标记System.out.println((flag>>53L&highFlag)!=0);//true

同理,如果需要在一个字段记录多个标记,只需要划分不同的标记区间就可以了。

比如Java中的读写锁ReentrantReadWriteLock,就是通过在内部表示锁状态的state变量上的低16位,表示写锁,高16位,表示读锁

这里为什么这么设计呢?而不是维护一个读锁,一个写锁?是因为通过CAS的方式,无法一次性操作两个变量

文章分享结束,O被多人强制标记车WRITE和通过位运算打标记的答案你都知道了吗?欢迎再次光临本站哦!



本文由欣欣吧手游攻略栏目发布,感谢您对欣欣吧的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人站长或者朋友圈,但转载请说明文章出处“O被多人强制标记车WRITE

标签:
o被多人强制标记车
« 上一篇 2023-10-17