图文社区用户搜索关系表设计方案:空间换时间的权衡与抉择
背景
我们来聊一个解决方案:我们做了一个和抖音产品类似的图文社区,社区有一个搜索栏,通过名字搜索用户,搜索出来的用户需要体现出其与当前用户的关系:1.当前用户的粉丝。2.当前用户关注的人。3.互相关注。目前总用户量在两百万左右,所以,目前搜索还是用的mysql,使用的like查询,这一块不是重点讨论。重点讨论的是,如何设计用户和关注用户关系的表,使得我们在查询时能直接查询出对应的关系并排序的逻辑。
方案一
1. 用户表(user_table)
主要用来存储社区中所有用户的基本信息,结构大致如下:
字段名 | 类型 | 说明 |
---|---|---|
user_id | int(或其他合适的整型) | 用户的唯一标识 ID |
username | varchar | 用户的名字(用于搜索栏搜索的字段等) |
other_fields | ... | 诸如性别、年龄等其他用户相关的拓展字段 |
2. 关注关系表(follow_relationship_table)
用于记录用户之间的关注关系,结构可以这样设计:
字段名 | 类型 | 说明 |
---|---|---|
follower_id | int | 关注者的用户 ID,也就是执行关注操作的那个用户的 ID |
followed_id | int | 被关注者的用户 ID,也就是被他人关注的那个用户的 ID |
follow_time | datetime | 关注操作发生的时间,可用于后续按关注先后顺序等排序,比如新关注的排在前面等情况 |
逻辑解释:
通过这样的表结构,当一个用户(user A)关注另一个用户(user B)时,就在该表中插入一条记录,记录中follower_id
为 user A 的user_id
,followed_id
为 user B 的user_id
,同时记录下关注时间。
查询逻辑
当用户A在在搜索栏,输入某个用户名,比如:“明”,返回前10条记录,包含用户A关注名字中包含“明”的用户,用户A的粉丝名字中包含“明”的用户以及用户A和名字中包含“明”的相互关注的用户。
查询的SQL。
-- 子查询1:获取用户A关注的名字中包含“明”的用户信息及对应关注时间,并标记为“已关注”关系
SELECT u.user_id,u.username,'已关注' AS relationship,fr.follow_time
FROM user_table u
JOIN follow_relationship_table fr ON u.user_id = fr.followed_id
WHERE fr.follower_id = current_user_idAND u.username LIKE '%明%'
UNION ALL
-- 子查询2:获取关注用户A且名字中包含“明”的用户(即用户A的粉丝)信息及对应关注时间,并标记为“粉丝”关系
SELECT u.user_id,u.username,'粉丝' AS relationship,fr.follow_time
FROM user_table u
JOIN follow_relationship_table fr ON u.user_id = fr.follower_id
WHERE fr.followed_id = current_user_idAND u.username LIKE '%明%'
UNION ALL
-- 子查询3:获取与用户A相互关注且名字中包含“明”的用户信息及对应关注时间,并标记为“互相关注”关系
SELECT u.user_id,u.username,'互相关注' AS relationship,fr.follow_time
FROM user_table u
JOIN follow_relationship_table fr ON (u.user_id = fr.followed_id AND fr.follower_id = current_user_id)OR (u.user_id = fr.follower_id AND fr.followed_id = current_user_id)
WHERE u.username LIKE '%明%'
ORDER BY follow_time DESC -- 根据关注时间倒序排序,最新关注的排在前面
LIMIT 10; -- 限制只返回前10条记录
如果是这种表的设计方案,查询的复杂度非常高,需要考虑三种查询,查询效率也不高。
方案二
1. 用户表(user_table)
结构保持和之前类似,用于存储社区中所有用户的基本信息:
字段名 | 类型 | 说明 |
---|---|---|
user_id | int(或其他合适的整型) | 用户的唯一标识 ID |
username | varchar | 用户的名字(用于搜索栏搜索的字段等) |
other_fields | ... | 诸如性别、年龄等其他用户相关的拓展字段 |
2. 关注关系汇总表(follow_relation_table)
新增这张表用于提前汇总每个用户与其他用户之间的关注关系情况,结构如下:
字段名 | 类型 | 说明 |
---|---|---|
user_id | int | 用户的唯一标识 ID,关联到 user_table 中的 user_id |
related_user_id | int | 与之存在关注关系的其他用户的 ID |
relationship_type | tinyint(可根据实际情况选择合适类型) | 用不同的数值来表示关系类型,例如 1 表示 “已关注”(当前用户关注别人),2 表示 “互相关注”,3 表示 “粉丝”(别人关注当前用户),方便后续查询判断和筛选 |
follow_time | datetime | 关注操作发生的时间,可用于排序依据等 |
数据维护逻辑
情况一:用户 A 关注用户 B(单向关注)
当发生用户 A 关注用户 B 这样的操作时,需要往 follow_relation_table
中插入两条记录,来分别体现从不同角度的关注关系:
-
第一条记录(体现用户 A 对用户 B 的关注):
user_id
字段值设置为用户 A 的user_id
,这表示是从用户 A 的视角出发,记录其关注行为。related_user_id
字段值设置为用户 B 的user_id
,明确其关注的对象是用户 B。relationship_type
字段值设置为1
,根据预先定义的规则,1
代表 “已关注”,也就是当前用户(此处为用户 A)关注了别的用户(用户 B)。follow_time
字段则记录下此次关注操作发生的具体时间,可以通过获取系统当前时间来赋值,例如在很多编程语言中结合数据库操作库可以使用类似datetime.now()
(不同语言具体函数名和用法有差异)这样的方式获取当前时间并插入到该字段。
-
第二条记录(体现用户 B 相对用户 A 的粉丝关系):
user_id
字段值设置为用户 B 的user_id
,从用户 B 的角度来看待这个关注关系,即别人(用户 A)关注了自己。related_user_id
字段值设置为用户 A 的user_id
,表示与自己产生关联的这个 “别人” 是用户 A。relationship_type
字段值设置为3
,按照设定,3
代表 “粉丝”,意味着用户 A 是用户 B 的粉丝(因为 A 关注了 B)。- 同样,
follow_time
字段也记录此次关注操作发生的时间,与第一条记录的时间保持一致,因为这是同一个关注行为从不同主体角度的记录。
情况二:用户 A 关注用户 C,并且用户 C 关注用户 A(双向关注,即互相关注)
当出现这种互相关注的情况时,同样需要往 follow_relation_table
中插入两条记录来体现这种对称的关系:
-
第一条记录(体现用户 A 与用户 C 的互相关注关系从用户 A 角度):
user_id
字段值设置为用户 A 的user_id
,代表是从用户 A 这边出发来看待这个关系。related_user_id
字段值设置为用户 C 的user_id
,明确与之相关的是用户 C。relationship_type
字段值设置为2
,因为根据定义,2
表示 “互相关注”,这里用户 A 和用户 C 互相关注了对方。follow_time
字段记录此次关注操作发生的时间,获取方式同前面情况一的时间获取逻辑。
-
第二条记录(体现用户 A 与用户 C 的互相关注关系从用户 C 角度):
user_id
字段值设置为用户 C 的user_id
,从用户 C 的视角来记录这个关系。related_user_id
字段值设置为用户 A 的user_id
,表明与之相关的另一方是用户 A。relationship_type
字段值同样设置为2
,代表 “互相关注”,与第一条记录保持一致,因为这是双向的互相关注关系。follow_time
字段也记录此次关注操作对应的时间,和第一条记录的时间相同,毕竟是同一个互相关注行为在不同主体角度的体现。
另外,需要注意的是,在实际应用中,往往需要先判断是否已经存在相关的关注关系记录,以避免重复插入等情况导致数据异常。比如在执行用户 A 关注用户 B 的操作前,可以先查询 follow_relation_table
看是否已经存在对应的记录,如果不存在再执行上述插入逻辑;对于互相关注情况,判断会更复杂些,可能需要从两个方向去检查是否已有单向关注记录等,具体的判断逻辑也可以通过 SQL 查询语句结合业务代码来实现,这里为了聚焦数据写入逻辑暂未详细展开判断部分内容。
同时,随着业务的发展,可能还会涉及到取消关注等操作,那时就需要相应地去更新或者删除 follow_relation_table
中的相关记录,以保证数据的准确性和一致性,这也是后续在数据维护方面需要进一步考虑的问题。
查询逻辑
当用户A在在搜索栏,输入某个用户名,比如:“明”,返回前10条记录,包含用户A关注名字中包含“明”的用户,用户A的粉丝名字中包含“明”的用户以及用户A和名字中包含“明”的相互关注的用户。
查询的SQL。
SELECT ut.username,fr.relationship_type,fr.follow_time
FROM user_table ut
JOIN follow_relation_table fr ON ut.user_id = fr.related_user_id
WHERE fr.user_id = current_user_idAND ut.username LIKE '%明%'
ORDER BY fr.follow_time DESC
LIMIT 10;
这种方案,写入带来了极大麻烦,并且数据是双份写入。但是,查询却带来极大的便利。但是,对于读多写少的场景,我们认为这种方案是可取的。
总结
本质上第二种方案也是一种空间换时间的方案,把复杂的查询退化成简单的查询。空间换时间是一种思维方式,不能仅仅狭隘的认为用缓存换时间是空间换时间,同一个表基于不同的分表键或者分库健进行分表分库是空间换时间。
相关文章:
图文社区用户搜索关系表设计方案:空间换时间的权衡与抉择
背景 我们来聊一个解决方案:我们做了一个和抖音产品类似的图文社区,社区有一个搜索栏,通过名字搜索用户,搜索出来的用户需要体现出其与当前用户的关系:1.当前用户的粉丝。2.当前用户关注的人。3.互相关注。目前总用户…...
问题小记-达梦数据库报错“字符串转换出错”处理
最近遇到一个达梦数据库报错“-6111: 字符串转换出错”的问题,这个问题主要是涉及到一条sql语句的执行,在此分享下这个报错的处理过程。 问题表现为:一样的表结构和数据,执行相同的SQL,在Oracle数据库中执行正常&…...
空天地遥感数据识别与计算--数据分析如何助力农林牧渔、城市发展、地质灾害监测等行业革新
在科技飞速发展的时代,遥感数据的精准分析已经成为推动各行业智能决策的关键工具。从无人机监测农田到卫星数据支持气候研究,空天地遥感数据正以前所未有的方式为科研和商业带来深刻变革。然而,对于许多专业人士而言,如何高效地处…...
Cherno C++ 学习笔记 智能指针
这一篇我们会讲到一个C当中非常重要的特性,也就是智能指针smart pointer。在我们知道了new和delete两个关键字之后,我们了解了如何在堆上分配内存以及如何释放内存。但是当我们new了一个或者一堆对象之后,很多时候我们会容易忘掉delete所有需…...
C++ OpenGL学习笔记(2、绘制橙色三角形绘制、绿色随时间变化的三角形绘制)
相关文章链接 C OpenGL学习笔记(1、Hello World空窗口程序) 目录 绘制橙色三角形绘制1、主要修改内容有:1.1、在主程序的基础上增加如下3个函数1.2、另外在主程序外面新增3个全局变量1.3、编写两个shader程序文件 2、initModel()函数3、initS…...
如何创建属于自己的大语言模型:从零开始的指南
如何创建属于自己的大语言模型:从零开始的指南 为什么要创建自己的大语言模型? 随着人工智能的快速发展,大语言模型(LLM)在各种场景中表现出了卓越的能力,例如文本生成、对话交互和内容总结等。虽然市场上…...
【AIGC安全】CCF-CV企业交流会直播回顾:探寻AI安全治理,共筑可信AI未来
文章目录 一、活动背景:AI技术快速发展与安全治理需求迫切二、论坛内容金耀辉:智能共生时代:平衡生成式AI的创新与风险何延哲:人工智能安全检测评估的逻辑和要点谢洪涛:面向特定人物深度伪造视频的主动防御与被动检测技…...
win11+cuda11x+VS2019安装后没有cuda模板,贫穷版cuda环境
显卡是GTX710,挂在闲鱼200块钱一年多都没卖出去的一款。win11最开始安装了visual studio 2022,不过安装目录自定义,后续安装cuda 11.1.1,这个顺序在各种博客资料都是正确的,先VS,后cuda。但是创建项目也没有…...
四相机设计实现全向视觉感知的开源空中机器人无人机
开源空中机器人 基于深度学习的OmniNxt全向视觉算法OAK-4p-New 全景硬件同步相机 机器人的纯视觉避障定位建图一直是个难题: 系统实现复杂 纯视觉稳定性不高 很难选到实用的视觉传感器 为此多数厂家还是采用激光雷达的定位方案。 OAK-4p-New 为了弥合这一差距…...
越疆科技营收增速放缓:毛利率未恢复,持续亏损下销售费用偏高
《港湾商业观察》施子夫 12月13日,深圳市越疆科技股份有限公司(以下简称,越疆科技,02432.HK)发布全球发售公告,公司计划全球发售4000万股股份,其中3800万股国际发售,200万股香港公开…...
南城云趣:智能云平台,杜绝电动车充电安全隐患
电动自行车作为绿色低碳出行的主要方式之一,受到无数市民的推崇,而电动自行车数量的急剧上涨,也严重增加小区管理的负担。记者调查发现,目前电动自行车缺乏有效的管理,使得带车或电瓶上楼充电、乱停乱放、车辆容易被盗等安全问题日益突出,给社区消防安全和管理带来严峻的挑战。…...
uniapp对接unipush 1.0 ios/android
简介 实现方法 是uniapp官网推荐的 unipush-v1 文档配置具体看 uni-app官网 配置好了之后 代码实现 前端代码 前端的主要任务是监听 监听到title content 创建消息推送 安卓 可以收到在线消息并且自动弹出消息 IOS 可以监听到在线消息但是需要手动推送 以下代码app初始…...
Vue.js前端框架教程11:Vue监听器watch和watchEffect
文章目录 监听器(watchers)基本用法deep: trueimmediate: true总结 watchEffect基本用法自动追踪依赖停止监听与 watch 的对比性能优化总结 监听器(watchers) 在 Vue 中,监听器(watchers)是一种…...
和数集团针对元宇宙数字身份及资产验证安全性发起挑战
随着时间的推移,元宇宙的发展潜力是无限的。 但与此同时,故事中充斥着疑问、困惑和不安。马克扎克伯格声称人类在未来将生活在虚拟世界中。也许是这样,但元宇宙的应用也面临很多障碍。其中一个领域是安全。对于在元宇宙中发生的任何交易&…...
llama2中的model.py中的结构示意图
参考文章:https://zhuanlan.zhihu.com/p/679640407...
Spring事务管理详解
一、什么是事务管理 事务是一个最小的不可再分的工作单元。 一个事务对应一套完整的业务操作。事务管理是指这些操作要么全部成功执行,要么全部回滚,从而保证数据的一致性和完整性。比如银行转账,需要保证转出和转入是一个原子操作。Spring提…...
被裁20240927 --- 嵌入式硬件开发 前篇
前篇主要介绍一些相关的概念,用于常识扫盲,后篇开始上干货! 他捧着一只碗吃过百家的饭 处理器芯片处理器芯片制造商嵌入式处理器芯片制造商国内制造商国外制造商 与意法半导体对标的国产芯片制造商一、中芯国际二、华为海思三、紫光国微四、北…...
CMake的INSTALL FILES和INSTALL DIRECTORY有什么区别
在 CMake 中,install() 命令用于安装构建的目标文件、头文件、库等到指定的目标路径。install(FILES ...) 和 install(DIRECTORY ...) 都是 install() 命令的具体用法,它们的功能和适用场景不同。 以下是两者的详细区别和用法说明: 1. insta…...
提炼关键词的力量:AI驱动下的SEO优化策略
内容概要 在当今数字化营销的环境中,关键词对于提升网站的可见性和流量起着至关重要的作用。企业和个人必须重视有效的关键词策略,以便在竞争激烈的网络市场中脱颖而出。本文将深入探讨如何利用人工智能技术来优化SEO策略,特别是在关键词选择…...
springboot中Controller内文件上传到本地以及阿里云
上传文件的基本操作 <form action"/upload" method"post" enctype"multipart/form-data"> <h1>登录</h1> 姓名:<input type"text" name"username" required><br> 年龄…...
【MFC】多工具栏如何保存状态
MFC中的工具栏本来只有一个,如果想增加几个工具栏是比较简单,但现在一个重要的问题是,状态无法保存,导致每次打开,工具栏就会出现问题,要么偏移位置要么显示不出。 经过研究,发现是MFC框架中的…...
IDEA搭建SpringBoot,MyBatis,Mysql工程项目
目录 一、前言 二、项目结构 三、初始化项目 四、SpringBoot项目集成Mybatis编写接口 五、代码仓库 一、前言 构建一个基于Spring Boot框架的现代化Web应用程序,以满足[公司/组织名称]对于[业务需求描述]的需求。通过利用Spring Boot简化企业级应用开发的优势&…...
鸿蒙心路旅程:HarmonyOS NEXT 心路旅程:技术、成长与未来
HarmonyOS NEXT 心路旅程:技术、成长与未来 技术的浪潮中,总有一些瞬间让人感到心潮澎湃。作为一名HarmonyOS NEXT开发者,我有幸成为这个时代科技创新的一部分。从最初的接触到深入学习、开发,以及如今规划未来的职业方向&#x…...
【漫话机器学习系列】010.Bagging算法(Bootstrap Aggregating)
Bagging算法(Bootstrap Aggregating) Bagging(Bootstrap Aggregating 的缩写)是一种集成学习方法,通过构建多个弱学习器(例如决策树)并将它们的结果进行平均(回归)或投票…...
【信息系统项目管理师】高分论文:论信息系统项目的进度管理(人力资源管理系统)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文1、规划进度管理3、排列活动顺序4、估算活动持续时间5、制订进度计划6、控制进度论文 2022年2月,我作为项目经理参与了XX电网公司人力资源管理系统建设项目,该项目是2022年XX电网公司“十三五”信息化规…...
Go web 开发框架 Iris
背景 掌握了 Go 语言的基础后就该开始实践了,编写Web应用首先需要一个 web 开发框架。做框架选型时,处理web请求是基本功能,至于MVC是更进一步需要。现在比较流行的web架构是前后端分离,后端响应RESTful的请求,Iris 能…...
模具生产过程中的标签使用流程图
①NFC芯片嵌入周转筐,通过读卡器读取CK_Label_v3的数据,并将这些信息上传至服务器进行存储; ②服务器随后与客户的WMS(仓库管理系统)进行交互,记录和同步注塑机的原始数据; ③当周转筐内的模具…...
精准提升:从94.5%到99.4%——目标检测调优全纪录
🚀 目标检测模型调优过程记录 在进行目标检测模型的训练过程中,我们面对了许多挑战与迭代。从初始模型的训练结果到最终的调优优化,每一步的实验和调整都有其独特的思路和收获。本文记录了我在优化目标检测模型的过程中进行的几次尝试&#…...
【LC】100. 相同的树
题目描述: 给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。 示例 1: 输入:p [1,2,3], q [1,2,3] 输出&…...
Midjourney参数大全
基本参数 纵横比,宽高比 --aspect,或--ar更改生成的纵横比。 混乱 --chaos <number 0–100>改变结果的变化程度。更高的数值会产生更多不寻常和意想不到的结果。 图像权重 --iw <0–2>设置相对于原始图像相识度。默认值为 1&a…...
【达梦数据库】获取对象DDL
目录 背景获取表的DDL其他 背景 在排查问题时总会遇到获取对象DDL的问题,因此做以下总结。 获取表的DDL 设置disql工具中显示LONG类型数据的最大长度,避免截断: SET LONG 9999获取DDL SELECT DBMS_METADATA.GET_DDL(TABLE,表名,模式名) …...
51c视觉~合集34
我自己的原文哦~ https://blog.51cto.com/whaosoft/12207162 #图像数据增强库综述 10个强大图像增强工具对比与分析 在深度学习和计算机视觉领域,数据增强已成为提高模型性能和泛化能力的关键技术。本文旨在全面介绍当前广泛使用的图像数据增强库,…...
机动车油耗计算API集成指南
机动车油耗计算API集成指南 引言 在当今社会,随着机动车数量的持续增长和环保意识的不断增强,如何有效管理和降低车辆油耗成为了车主、车队管理者以及交通政策制定者共同关注的问题。为了帮助这些群体更好地理解和优化燃油消耗情况,本接口能…...
正也科技荣获“金石奖2024医药健康互联网优秀服务商奖”
近日,上海正也信息科技有限公司在赛柏蓝第五届医药金石奖颁奖典礼上荣获“金石奖2024医药健康互联网优秀服务商奖”。这一殊荣不仅体现了业内对正也科技在医药信息化领域卓越贡献的高度认可,更是对其持续创新与专业服务的充分肯定。 01 作为深耕医药行…...
Ubuntu搭建ES8集群+加密通讯+https访问
目录 写在前面 一、前期准备 1. 创建用户和用户组 2. 修改limits.conf文件 3. 关闭操作系统swap功能 4. 调整mmap上限 二、安装ES 1.下载ES 2.配置集群间安全访问证书密钥 3.配置elasticsearch.yml 4.修改jvm.options 5.启动ES服务 6.修改密码 7.启用外部ht…...
【2024/12最新】CF罗技鼠标宏分享教程与源码
使用效果: 支持的功能 M4 7发一个点HK417 连点瞬狙炼狱加特林一个圈 下载链接 点击下载...
jmeter 接口性能测试 学习笔记
目录 说明工具准备工具配置jmeter 界面汉化配置汉化步骤汉化结果图 案例1:测试接口接口准备线程组添加线程组配置线程组值线程数(Number of Threads)Ramp-Up 时间(Ramp-Up Period)循环次数(Loop Count&…...
SpringBoot3整合Knife4j
文章目录 1. 引入依赖2. yml配置文件3. 常用注解3.1 类级别注解3.2 方法级别注解3.3 参数级别注解3.4 模型类注解 4. 访问界面 1. 引入依赖 <!--swagger--> <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-j…...
Dhatim FastExcel 读写 Excel 文件
Dhatim FastExcel 读写 Excel 文件 一、说明1、主要特点2、应用场景 二、使用方法1、引入依赖2、Sheet 数据3、读取 Excel4、写入 Excel 一、说明 Github 地址:Dhatim FastExcel Dhatim FastExcel是一个高性能、轻量级的Java库,专门用于读取和写入Exce…...
精读 84页华为BLM战略规划方法论
这篇文档主要介绍了华为的BLM战略规划方法论,该方法论旨在帮助企业制定战略规划,并确保战略规划的可执行性和有效性。以下是该文档的核心知识点和重点需要关注的内容: 战略规划的定义:战略规划是企业依据企业外部环境和企业自身的…...
如何评估并持续优化AI呼入机器人的使用效果
如何评估并持续优化AI呼入机器人的使用效果 作者:开源呼叫中心FreeIPCC 随着人工智能技术的快速发展,AI呼入机器人在客户服务、技术支持等多个领域得到了广泛应用。这些智能系统不仅提高了工作效率,降低了运营成本,还显著改善了…...
基于.NetCore 的 AI 识别系统的设计与实现
目录 项目背景与概述 技术架构与选型 后端技术 前端技术 系统功能模块 登录注册 数据大屏 练题系统 AI模块 工具箱 个人中心 项目背景与概述 在当今数字化快速发展的时代,人工智能(AI)技术正逐渐渗透到各个领域,展现出…...
java list 和数组互相转换的一些方法
在Java中,List 和 数组(Array) 之间的转换是一个常见的操作。由于它们是不同的数据结构,Java提供了一些方法来在它们之间进行转换。我们会从List到数组和数组到List两种情况分别讨论。 1. List 转 数组 假设你有一个 List 类型的…...
【WiFi】WiFi6 5G 802.11ax 最大速率对应表
5GHz 频段 1x1 MIMO 速率 20MHz 信道宽度 MCS 0: 8.6 MbpsMCS 1: 17.2 MbpsMCS 2: 25.8 MbpsMCS 3: 34.4 MbpsMCS 4: 51.6 MbpsMCS 5: 68.8 MbpsMCS 6: 77.4 MbpsMCS 7: 86.0 MbpsMCS 8: 103.2 MbpsMCS 9: 114.7 MbpsMCS 10: 129.0 MbpsMCS 11: 143.4 Mbps 40MHz 信道宽度 …...
智能座舱进阶-应用框架层-Handler分析
首先明确, handler是为了解决单进程内的线程之间的通信问题的。我也需要理解Android系统中进程和线程的概念, APP启动后,会有三四个线程启动起来,其中,有一条mainUITread的线程,专门用来处理UI事件…...
颜色空间之RGB和HSV互转
参考文档: https://blog.csdn.net/shandianfengfan/article/details/120600453 定点化实现: #define FRAC_BIT 10 // 小数精度 #define MIN3(x,y,z)int min3(int a, int b, int c) {int ret_val a < b ? (a < c ? a : c) : (b < c ? b :…...
程序员之路:编程语言面向过程的特征
以下是面向过程编程语言所具有的一些典型特征: 一、以过程(函数、子程序)为核心组织代码 强调函数的作用: 在面向过程编程中,函数(或子程序等不同语言中的类似概念)是代码组织的关键单元。程序…...
matlab的一些时间函数【转】
看到就记下来,感觉挺好玩的。 原文:MATLAB-一些时间函数 - 简书 (jianshu.com) 注明出处了,原文是公开的,应该不算侵权。若有侵权请告知删除谢谢。...
OpenGL —— 2.6.1、绘制一个正方体并贴图渲染颜色(附源码,glfw+glad)
源码效果 C++源码 纹理图片 需下载stb_image.h这个解码图片的库,该库只有一个头文件。 具体代码: vertexShader.glsl #version...
【ETCD】【源码阅读】深入解析 EtcdServer.applyEntries方法
applyEntries方法的主要作用是接收待应用的 Raft 日志条目,并按顺序将其应用到系统中;确保条目的索引连续,避免丢失或重复应用条目。 一、函数完整代码 func (s *EtcdServer) applyEntries(ep *etcdProgress, apply *apply) {if len(apply.…...