通过位运算打多个标记
通过位运算打多个标记
如何在一个字段上,记录多个标记?
如何在一个字段上,记录不同类型的多个标记?
如何用较少的字段,记录多个标记?
如何在不增加字段的要求下,记录新增的标记?
在实际的开发中,经常有这样的需求,需要用尽可能少的字段,记录多个标记?
比如交易中一个订单,是否发生过支付?是否进行过发货?是否发生过退货退款?是否进行过理赔?
比如社交中一个帖子,是否审核通过?是否被举报过?是否发生过二次编辑,是否要置顶等等
以上场景,最终都是要记录到数据库中的。如果每增加一个类型,都增加一个字段标记是或者否的话,那每行记录的字段数,得增加到多少?
所以我们的诉求是希望通过尽可能少的字段,最好是不要增加数据库的字段,能够记录同时记录多个标记。
这样的场景,一种解决方式是:在数据库中增加一个内容是JSON格式的字段,然后每次往JSON中增加内容。这种方式的好处是比较灵活,增加标记不用修改数据库DDL。而且不需要记录的标记可以不存储,不用占用存储空间。但文本格式毕竟会占用较多的存储空间,随着标记的增加,类似MySQL数据库可能需要调整字符串长度
另一种解决方式是位运算,通过在不同的位置填充0或者1,表示标记的是或者否,有或者没有。大名鼎鼎的布隆过滤器,实现原理也是类似的
比如说一个订单,我们需要记录它是否发生过支付?是否发生过发货?是否发生过退货?那么就可以设计这么几个标记
PAY_FLAG(1L << 1L),
DELIVER_FLAG(1L << 2L),
REFUNR_FLAG(1L << 3L),
然后在订单表中增加一个flag
字段,通过位运算,记录订单的不同标记。方法如下
// 设置Flag
public static Long setFlag(Long orderFlag, OrderFlagEnum orderFlagEnum) {orderFlag |= orderFlagEnum.getFlag();return orderFlag;
}
// 清除Flag
public static Long clearFlag(Long orderFlag, OrderFlagEnum orderFlagEnum) {orderFlag &= ~orderFlagEnum.getFlag();return orderFlag;
}// 判断是否设置过某个Flag
public static boolean hasFlag(OrderFlagEnum orderFlagEnum, Long orderFlag) {return (orderFlag & orderFlagEnum.getFlag()) != 0;
}
引申一下,如果需要在一个字段中,记录多个标记,通过位运算,又该怎么实现呢?
比如说想要在一个字段中,记录两个标记。
还是可以通过不同位置标记1还是0实现,比如一个Long型标记,可以在低53位记录一个标记,在高10位记录另一个标记。
// 初始标记
Long flag = 0L;
// 低位需要记录的标记
Long lowFlag = 1L << 11L;
// 高位需要记录的标记
Long highFlag = 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的方式,无法一次性操作两个变量
相关文章:
通过位运算打多个标记
通过位运算打多个标记 如何在一个字段上,记录多个标记? 如何在一个字段上,记录不同类型的多个标记? 如何用较少的字段,记录多个标记? 如何在不增加字段的要求下,记录新增的标记? 在实…...
[学习笔记]Node2Vec图神经网络论文精读
参考资料:https://www.bilibili.com/video/BV1BS4y1E7tf/?p12&spm_id_frompageDriver Node2vec简述 DeepWalk的缺点 用完全随机游走,训练节点嵌入向量,仅能反应相邻节点的社群相似信息,无法反映节点的功能角色相似信息。 …...
C# Linq源码分析之Take(五)
概要 本文在C# Linq源码分析之Take(四)的基础上继续从源码角度分析Take的优化方法,主要分析Where.Select.Take的使用案例。 Where.Select.Take的案例分析 该场景模拟我们显示中将EF中与数据库关联的对象进行过滤,然后转换成Web…...
性能监控-grafana+prometheus+node_exporter
Prometheus是一个开源的系统监控和报警工具。它由SoundCloud开发并于2012年发布,后来成为了一个独立的开源项目,并得到了广泛的应用和支持。 Prometheus的主要功能包括采集和存储各种系统和应用程序的监控数据,并提供强大的查询语言PromQL来…...
(STM32H5系列)STM32H573RIT6、STM32H573RIV6、STM32H573ZIT6嵌入式微控制器基于Cortex®-M33内核
一、应用 工业(PLC、工业电机控制、泵和压缩机) 智能家居(空调、冰箱、冰柜、中央警报系统、洗衣机) 个人电子产品(键盘、智能手机、物联网标签、跟踪设备) 智能城市(工业通信、照明控制、数字…...
mysql配置bind-address不生效
1、前言 因为要ip直接访问mysql,故去修改bind-address参数,按照mysql配置文件查找顺序是:/etc/my.cnf、/etc/mysql/my.cnf、~/.my.cnf,服务器上没有 /etc/my.cnf文件,故去修改 /etc/mysql/my.cnf文件,但是一…...
Linux相关指令(下)
cat指令 查看目标文件的内容 常用选项: -b 对非空输出行编号 -n 对输出的所有行编号 -s 不输出多行空行 一个重要思想:linux下一切皆文件,如显示器文件,键盘文件 cat默认从键盘中读取数据再打印 退出可以ctrlc 输入重定向<…...
Codeforces Round 855 (Div 3)(A - F)
Codeforces Round 855 (Div. 3)(A - F) Codeforces Round 855 (Div. 3) A. Is It a Cat?(思维) 思路:先把所有字母变成小写方便判断 , 然后把每一部分取一个字母出来 , 判断和‘meow’是否相同即可。 复杂度 O ( n…...
Friend.tech(FT):社交媒体金融的未来,真的如此美好吗?
Friend.tech(FT)是一个在2023年8月10日正式推出的社交金融平台,它的特点在于允许用户购买和出售创作者的股票(shares),这些股票赋予用户访问创作者内容的权利。FT的推出引发了广泛的关注,吸引了…...
yolov7中Concat之后加注意力模块(最复杂的情况)
1、common.py中找到Concat模块,复制一份 2、要传参进来,dim通道数 3、然后找yolo.py模块,添加 4、yaml里替换 5、和加的位置也有关系...
解除百度安全验证
使用chrome浏览器用百度浏览时,一直弹百度安全验证: 在设置里进行重置: 然后重启浏览器就可以了。...
Codeforces Round 731 (Div 3)(A - F)
Codeforces Round 731 (Div. 3)(A - F) Dashboard - Codeforces Round 731 (Div. 3) - Codeforces A. Shortest Path with Obstacle(思维) 思路:显然要计算 A → B 之间的曼哈顿距离 , 要绕开 F 当且仅当 AB形成的直线平行于坐…...
Python的sort()与sorted()函数详解
目录 sort()函数 sorted()函数 key参数 区别 sort()函数 sort()方法:该方法用于原地对列表进行排序,即直接在原始列表上进行排序操作,并不返回一个新的列表。 my_l…...
用python实现基本数据结构【04/4】
说明 如果需要用到这些知识却没有掌握,则会让人感到沮丧,也可能导致面试被拒。无论是花几天时间“突击”,还是利用零碎的时间持续学习,在数据结构上下点功夫都是值得的。那么Python 中有哪些数据结构呢?列表、字典、集…...
“必抓!”算法
一个程序员一生中可能会邂逅各种各样的算法,但总有那么几种,是作为一个程序员一定会遇见且大概率需要掌握的算法。今天就来聊聊这些十分重要的“必抓!”算法吧~ 你可以从以下几个方面进行创作(仅供参考) 一ÿ…...
【监控系统】Promethus整合Alertmanager监控告警邮件通知
【监控系统】Promethus整合Alertmanager监控告警邮件通知 Alertmanager是一种开源软件,用于管理和报警监视警报。它与Prometheus紧密集成,后者是一种流行的开源监视和警报系统。Alertmanager从多个源接收警报和通知,并根据一组配置规则来决定…...
【韩顺平】Linux基础
目录 1.网络连接三种方式 1.1 桥接模式:虚拟系统可以和外部系统通讯,但是容易造成IP冲突【1-225】 1.2 NAT模式:网络地址转换模式。虚拟系统可以和外部系统通讯,不造成IP冲突。 1.3 主机模式:独立的系统。 2.虚拟机…...
好奇一下各个大模型对华为mate60系列的看法
目前华为Mate60系列手机已上市并获抢购,个人觉得很不错,很好奇各个AI大模型对此事的看法,于是对chatGPT、文心一言、讯飞星火进行了一下粗浅的测试。 题目一(看看三个模型的综合分析能力) “目前华为Mate60系列手机已…...
UMA 2 - Unity Multipurpose Avatar☀️五.如何使用别人的Recipe和创建自己的服饰Recipe
文章目录 🟥 使用别人的Recipe1️⃣ 导入UMA资源效果展示2️⃣ 更新Library3️⃣ 试一下吧🟧 创建自己的服饰Recipe1️⃣ 创建自己的服饰Recipe2️⃣ 选择应用到的Base Recipe3️⃣ 指定显示名 / 佩戴位置 / 隐藏部位4️⃣ 给该服饰Recipe指定Slot / Overlay🚩 赋予Slot�…...
代码随想录训练营第五十六天| 583. 两个字符串的删除操作 、72. 编辑距离
583. 两个字符串的删除操作 题目链接/文章讲解/视频讲解:代码随想录 1.代码展示 //583.两个字符串的删除操作 int minDistance(string word1, string word2) {//step1 构建dp数组,dp[i][j]的含义是要使以i-1为结尾的word1和以j-1为结尾的word2//删除其元…...
hive解决了什么问题
hive出现的原因 Hive 出现的原因主要有以下几个: 传统数据仓库无法处理大规模数据:传统的数据仓库通常采用关系型数据库作为底层存储,这种数据库在处理大规模数据时效率较低。MapReduce 难以使用:MapReduce 是一种分布式计算框架…...
Lumion 和 Enscape 应该选择怎样的笔记本电脑?
Lumion 和 Enscape实时渲染对配置要求高,本地配置不够,如何快速解决: 本地普通电脑可一键申请高性能工作站,资产安全保障,供软件中心,各种软件插件一键获取,且即开即用,使用灵活&am…...
ICCV 2023 | MoCoDAD:一种基于人体骨架的运动条件扩散模型,实现高效视频异常检测
论文链接: https://arxiv.org/abs/2307.07205 视频异常检测(Video Anomaly Detection,VAD)扩展自经典的异常检测任务,由于异常情况样本非常少见,因此经典的异常检测通常被定义为一类分类问题(On…...
Mac电脑怎么使用NTFS磁盘管理器 NTFS磁盘详细使用教程
Mac是可以识别NTFS硬盘的,但是macOS系统虽然能够正确识别NTFS硬盘,但只支持读取,不支持写入。换句话说,Mac不支持对NTFS硬盘进行编辑、创建、删除等写入操作,比如将Mac里的文件拖入NTFS硬盘,在NTFS硬盘里新…...
Java设计模式-结构性设计模式(代理设计模式)
简介 为其他对象提供⼀种代理以控制对这个对象的访问,属于结构型模式。客户端并不直接调⽤实际的对象,⽽是通过调⽤代理,来间接的调⽤实际的对象应用场景 各⼤数码专营店,代理⼚商进⾏销售对应的产品,代理商持有真正的…...
线性空间、子空间、基、基坐标、过渡矩阵
线性空间的定义 满足加法和数乘封闭。也就是该空间的所有向量都满足乘一个常数后或者和其它向量相加后仍然在这个空间里。进一步可以理解为该空间中的所有向量满足加法和数乘的组合封闭。即若 V 是一个线性空间,则首先需满足: 注:线性空间里面…...
【MySQL】CRUD (增删改查) 基础
CRUD(增删改查)基础 一. CRUD二. 新增 (Create)1. 单行数据 全列插入2. 多行数据 指定列插入 三. 查询(Retrieve)1. 全列查询2. 指定列查询3. 查询字段为表达式4. 别名5. 去重:DISTINCT6. 排序…...
Socks5代理IP:保障跨境电商的网络安全
在数字化时代,跨境电商已成为全球商业的重要一环。然而,随着其发展壮大,网络安全问题也逐渐浮出水面。为了确保跨境电商的安全和隐私,Socks5代理IP技术成为了一项不可或缺的工具。本文将深入探讨Socks5代理IP在跨境电商中的应用&a…...
macOS通过钥匙串访问找回WiFi密码
如果您忘记了Mac电脑上的WiFi密码,可以通过钥匙串访问来找回它。具体步骤如下: 1.打开Mac电脑的“启动台”,然后在其他文件中找到“钥匙串访问”。 2.运行“钥匙串访问”应用程序,点击左侧的“系统”,然后在右侧找到…...
Debian11之稳定版本Jenkins安装
官方网址 系统要求 机器要求 256 MB 内存,建议大于 512 MB 10 GB 的硬盘空间(用于 Jenkins 和 Docker 镜像)软件要求 Java 8 ( JRE 或者 JDK 都可以) Docker (导航到网站顶部的Get Docker链接以访问适合您平台的Docker下载安装…...
做网站一定要会ps么/北京seo排名外包
本文的阅读成本很低,不需要大量地先验 AI 知识。作为纯纯的软件工程师,我们发现:学懂基本的 AI Prompt 原理与模式,不懂 LLM (大语言模型)算法,你也可以轻易驾驭 LoRA (Low-Rank Ada…...
那些网站平台可以做3d建模/公司注册流程
计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备, 通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下, 实现资源共享和信息传递的计算机系统. 目的是什么 传播交流信息,数据交换,通信 需要什么 IP和端口号 网络通讯协…...
企业网站建设与网页设计/百度广告开户流程
虽说现在大部分企业都复工复产了,但是因为这次疫情,学生们仍然要接受线上教育。由此也衍生出来许多有意思的梗,比如说学生们刚开学就毕业,又好笑又心酸,不过这也从侧面印证了线上教育的重要性。 由于这次疫情的推动&am…...
搭建一个网站多少钱/交换链接平台
这个问题源自于我们的UI发现自己在FGUI下制作的东西,在Unity中显示的效果不对。例如90%透明度的黑底图片导出到Unity中的效果非常的透,可能只有70%左右的效果。 然后我们绞尽脑汁的找了半天不同,才发现是由于我们工程Color Space设置成为Lin…...
bbs网站怎么做/易思企业网站管理系统
1、总是在幻想,却很少实际行动,结果发现教材看得少的可怜。 2、每天起很早,睡很晚,觉得自己很努力,其实都是在愣神,效率极低。 3、一有压力就想吃东西,一吃东西就撑,一撑就脑供血不足…...
宁波网站建设报价/网络优化器下载
$keys "\\wuwu\\wuwuiw\\shssiu"; $mWuwu new $keys(); $describe $mWuwu->describe(); var_dump(expression);#111namespace wuwu\wuwuiw; class shssiu{public function describe(){return 111;} }...