当前位置: 首页 > news >正文

【Redis实战】投票功能

1. 前言

现在就来实践一下如何使用 Redis 来解决实际问题,市面上很多网站都提供了投票功能,比如 Stack OverFlow 以及 Reddit 网站都提供了根据文章的发布时间以及投票数计算出一个评分,然后根据这个评分进行文章的展示顺序。本文就简单演示了如何使用 Redis 构建一个网站投票后端逻辑。

2. 数据结构设计

要想完成这个后端系统我们就需要思考如何设计 Redis 的存储内容及其结构:

  • 文章信息(包含文章id、标题、内容、作者、投票数、发布时间):hash 结构
  • 评分排行榜(成员是文章id、分数是评分):zset 结构
  • 发布时间排行榜(成员是文章id、分数是发布时间):zset 结构
  • 文章投票用户集合(成员是用户id):set 结构

3. 接口设计

想要设计一个投票网站,我们就必须限定一些数值和规则条件:

  1. 用户只能给在发布时间一周内的文章投票
  2. 每个用户不得重复给一个文章投票

3.1 对文章进行投票

想要对文章进行投票,我们前提是需要设定一个评分函数(投票数越高评分越高、发布时间越久评分越低)我们假设使用以下函数:rate = 100 * vote_num + publish_time

其中:

  • rate:表示该文章的评分
  • vote_num: 表示该文章的得票数
  • publish_time: 表示发布时间的 unix 时间戳

详细步骤如下:

  1. 校验文章发布时间是否已经超过一周
  2. 校验该用户是否已经给该文章投过票
  3. 给评分加上 100 使用ZINCRBY命令重新放入 zset 中,使用HINCRBY命令修改文章信息将投票数+1
  4. 将投票用户 id 使用SADD命令加入到该文章对应已投票用户集合当中

示例代码如下:

const ONE_WEEK_SECONDS = 7 * 86400
const ARTICLE_PREFIX = "article:"
const VOTED_USERS_PREFIX = "voted:"
const RATE_SCORE_KEY = "rate:"
const TIME_SCORE_KEY = "time:"
const USER_PREFIX = "user:"
const BASE_SCORE = 100 // 基准分// ArticleVote 给文章投票函数
func ArticleVote(articleId string, userId string, client *redis.Client, ctx context.Context) {// 1. 校验文章发布时间是否超过一周var articleKey = ARTICLE_PREFIX + articleIdresult, _ := client.HGet(ctx, articleKey, "publish_time").Result()publishTime, _ := strconv.Atoi(result)if int64(publishTime) < time.Now().Unix()-ONE_WEEK_SECONDS {panic("发布时间已经超过一周!")}// 2. 校验用户是否已经投过票了var votedKey = VOTED_USERS_PREFIX + articleKeyvar userKey = USER_PREFIX + userIdi, _ := client.SAdd(ctx, votedKey, userKey).Result()if i == 0 {// 已经投过票了panic("用户已经投过票!")}// 3. 重新计算文章评分client.ZIncrBy(ctx, RATE_SCORE_KEY, float64(BASE_SCORE), articleKey)// 4. 重置文章得票数client.HIncrBy(ctx, articleKey, "vote_num", int64(1))
}

💡 注意:

  1. 实际上我们应该用 redis 的事务保证修改操作的同步!但是由于还没有介绍 Lua 脚本之类的知识,所以暂不考虑!
  2. 我们常用 “:” 冒号分隔符分隔 key 中的多个标识符

3.2 发布文章

详细步骤如下:

  1. 构建一个 redis 当中的 hash 结构,使用HMSET命令保存到 redis 中,键格式为:“article:articleId”
  2. 将发布的用户id保存到文章对应已投票用户集合当中(并设置一周的过期时间)
  3. 保存 发布时间-文章id 使用ZADD命令添加到有序集合中
  4. 保存 评分-文章id 使用ZADD命令添加到有序集合中
// PublishArticle 发布文章
func PublishArticle(articleId string, userId string, article article.Article, client *redis.Client, ctx context.Context) {// 1. 保存文章信息var articleKey = ARTICLE_PREFIX + articleIdvar publishTime = time.Now().Unix()article.PublishTime = publishTimearticle.VoteNum = 0client.HMSet(ctx, articleKey, article)// 2. 保存发布人到已发布用户集合中并设置过期时间var votedKey = VOTED_USERS_PREFIX + articleKeyvar voteUser = USER_PREFIX + userIdclient.SAdd(ctx, votedKey, voteUser)client.Expire(ctx, votedKey, ONE_WEEK_SECONDS*time.Second)// 3.设置初始评分到有序集合中client.ZAdd(ctx, RATE_SCORE_KEY, redis.Z{Member: articleKey,Score:  float64(publishTime),})// 4. 设置初始发布时间到有序集合中client.ZAdd(ctx, TIME_SCORE_KEY, redis.Z{Member: articleKey,Score:  float64(publishTime),})
}

3.3 获取文章

我们已经实现了给文章投票以及发布文章的功能,那么写下来就要考虑如何获取评分最高的前 n 个文章以及获取发布时间最新的前 n 个文章了,详细流程如下(以评分为例):

  1. 使用zrevrange命令按照 score 从高到低获取score:有序集合中指定数量的成员
  2. 根据每个成员的文章 id 从article:articleId中使用HGETALL命令获取详细文章数据
  3. 构建结果返回
// GetArticlesByCondition 根据条件获取特定页文章列表
func GetArticlesByCondition(pageNo int64, scoreCondition string, client *redis.Client, ctx context.Context) []article.Article {// 1. 计算起始和结束索引下标var start = (pageNo - 1) * ARTICLES_PER_PAGEvar end = start + ARTICLES_PER_PAGE - 1// 2. 使用ZREVRANGE命令按照score倒序获取数据// 2.1 先判断是否存在该keyresult, _ := client.Exists(ctx, scoreCondition).Result()if result == 0 {// 没有这个有序集合键panic("不存在该有序集合键!")}articleIds, _ := client.ZRevRange(ctx, scoreCondition, start, end).Result()// 3. 根据id获取文章具体内容// 4. 构建响应var articles = make([]article.Article, 0, len(articleIds))for _, articleId := range articleIds {articleMap, _ := client.HGetAll(ctx, articleId).Result()var article article.Articlearticle.Id = articleMap["id"]article.Title = articleMap["title"]article.Content = articleMap["content"]publishTime, _ := strconv.ParseInt(articleMap["publish_time"], 10, 64)article.PublishTime = publishTimevoteNum, _ := strconv.ParseInt(articleMap["vote_num"], 10, 64)article.VoteNum = voteNumarticles = append(articles, article)}return articles
}

3.4 给文章分组

3.4.1 添加或删除分组

我们有些时候希望网站能够提供一个分组展示的功能,比如"Java"分组、"Go"分组等等,在 redis 中就可以设计为set集合类型(对应 key 为group:group_name),我们就需要提供一个往分组中添加或者删除指定文章的功能:

  1. 构建文章对应 key
  2. addGroups中将文章添加到每个分组中
  3. removeGroups每个分组中删除文章
const GROUP_PREFIX = "group:"             // 分组前缀// AddOrRemoveGroups 添加或删除文章到分组中
func AddOrRemoveGroups(articleId string, addGroups []string, removeGroups []string, client *redis.Client, ctx context.Context) {var articleKey = ARTICLE_PREFIX + articleIdfor _, group := range addGroups {// 添加到分组中client.SAdd(ctx, GROUP_PREFIX+group, articleKey)}for _, group := range removeGroups {// 从分组中删除client.SRem(ctx, GROUP_PREFIX+group, articleKey)}
}
3.4.2 获取分组文章

我们已经有了对应的分组比如group:test分组成员为article:1,现在我们希望能够对某个特定分组当中的文章按照指定 score 进行排序,即构建一个新的有序集合,我们可以借助ZINTERSTORE命令,将rate:有序集合或者time:有序集合中的元素与group:test当中的元素取交集(设定 aggregate 为 max 表示得分为较大值),除此以外我们还可以缓存过期时间提高效率

  1. 检查分组有序集合 key 是否存在,若不存在则使用ZINTERSTORE命令构建分组有序集合
  2. 设定过期时间为 60s
  3. 复用GetArticlesByCondition方法获取文章列表
const SCORE_GROUP_EXPIRATION = 60         // 分组有序集合过期时间// GetGroupArticlesByCondition 根据条件获取分组特定页文章列表
func GetGroupArticlesByCondition(pageNo int64, group string, scoreCondition string, client *redis.Client, ctx context.Context) []article.Article {// 2. 判断是否已经存在该分组下的有序集合var scoreGroupKey = scoreCondition + groupresult, _ := client.Exists(ctx, scoreGroupKey).Result()if result == 0 {// 创建分组评分集合client.ZInterStore(ctx, scoreGroupKey, &redis.ZStore{Keys:      []string{GROUP_PREFIX + group, scoreCondition},Aggregate: "max",})// 设置过期时间client.Expire(ctx, scoreGroupKey, SCORE_GROUP_EXPIRATION*time.Second)}// 3. 返回响应return GetArticlesByCondition(pageNo, scoreGroupKey, client, ctx)
}

4. 总结

我们可以把上述功能中提到的 redis 命令总结如下:

  1. 对于hash结构
    • HMSET:批量向 hash 结构插入键值对
    • HGETALL:获取 key 对应的 hash 结构全部键值对
    • HINCRBY:向 key 对应的 hash 结构特定的键进行自增
  2. 对于set集合结构
    • SADD:向 set 结构插入成员
    • SREM:从 set 结构中删除成员
  3. 对于zset有序集合结构
    • ZADD:向 zset 结构插入成员-分数
    • ZREVRANGE:从 zset 结构中按照分数从大到小取出成员
    • ZINCRBY:向 zset 结构特定成员分数自增
    • ZINTERSTORE:将两个集合进行交集运算得到一个新的 zset 结构
  4. 通用命令
    • EXPIRE:对某个 key 设置过期时间(单位为 ms )
    • EXISTS:检查某个 key 是否存在

相关文章:

【Redis实战】投票功能

1. 前言 现在就来实践一下如何使用 Redis 来解决实际问题&#xff0c;市面上很多网站都提供了投票功能&#xff0c;比如 Stack OverFlow 以及 Reddit 网站都提供了根据文章的发布时间以及投票数计算出一个评分&#xff0c;然后根据这个评分进行文章的展示顺序。本文就简单演示…...

1Panel应用推荐:WordPress开源博客软件和内容管理系统

1Panel&#xff08;github.com/1Panel-dev/1Panel&#xff09;是一款现代化、开源的Linux服务器运维管理面板&#xff0c;它致力于通过开源的方式&#xff0c;帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用&#xff0c;1Panel特别开通应用商店&am…...

GGML、GGUF、GPTQ 都是啥?

GGML、GGUF和GPTQ是三种与大型语言模型(LLM)量化和优化相关的技术和格式。它们各自有不同的特点和应用场景,下面将详细解释: 1. GGML(GPT-Generated Model Language) 定义:GGML是一种专为机器学习设计的张量库,由Georgi Gerganov创建。它最初的目标是通过单一文件格式…...

MySQL主从复制原理及工作过程

一、主从复制原理 1、MySQL将数据变化记录到二进制日志中&#xff1b; 2、Slave将MySQL的二进制日志拷贝到Slave的中继日志中&#xff1b; 3、Slave将中继日志中的事件在做一次&#xff0c;将数据变化&#xff0c;反应到自身&#xff08;Slave&#xff09;的数据库 详细步骤&…...

Unity VideoPlayer播放视屏不清晰的一种情况

VideoPlayer的Rnder Texture可以设置Size,如果你的视屏是1920*1080那么就设置成1920*1080。 如果设置成其他分辨率比如800*600会导致视屏不清晰。...

发布:大彩科技DN系列2.8寸高性价比串口屏发布!

一、产品介绍 该产品是一款2.8寸的工业组态串口屏&#xff0c;采用2.8寸液晶屏&#xff0c;分辨率为240*320&#xff0c;支持电阻触摸、电容触摸、无触摸。可播放动画&#xff0c;带蜂鸣器&#xff0c;默认为RS232通讯电平&#xff0c;用户短接屏幕PCB上J5短接点即可切换为TTL电…...

Oh3.2项目升级到Oh5.0(鸿蒙Next)具体踩坑记录(一)

目录 1.自动修复部分 Cause: The project structure and configuration require an upgrade. Solution: 1. Use Migrate Assistant to auto-upgrade the project structure and configuration. 2. Manually upgrade the project structure and configuration by following th…...

pytest+request+yaml+allure 接口自动化测试全解析[手动写的跟AI的对比]

我手动写的:Python3:pytest+request+yaml+allure接口自动化测试_request+pytest+yaml-CSDN博客 AI写的:pytest+request+yaml+allure 接口自动化测试全解析 在当今的软件开发流程中,接口自动化测试扮演着至关重要的角色。它不仅能够提高测试效率,确保接口的稳定性和正确性…...

Redis存储⑤Redis五大数据类型之 List 和 Set。

目录 1. List 列表 1.1 List 列表常见命令 1.2 阻塞版本命令 1.3 List命令总结和内部编码 1.4 List典型使用场景 1.4.1 消息队列 1.4.2 分频道的消息队列 1.4.3 微博 Timeline 2. Set 集合 2.1 Set 集合常见命令 2.2 Set 集合间命令 2.3 Set命令小结和内部编码 2.…...

使用PyCharm进行Django项目开发环境搭建

如果在PyCharm中创建Django项目 1. 打开PyCharm&#xff0c;选择新建项目 2.左侧选择Django&#xff0c;并设置项目名称 3.查看项目解释器初始配置 4.新建应用程序 执行以下操作之一&#xff1a; 转到工具| 运行manage.py任务或按CtrlAltR 在打开的manage.pystartapp控制台…...

C# 综合运用介绍

.NET学习资料 .NET学习资料 .NET学习资料 C# 作为一种由微软开发的面向对象编程语言&#xff0c;在软件开发领域占据着重要地位。凭借其简洁、类型安全以及与.NET 框架的紧密结合等特性&#xff0c;C# 被广泛应用于多个领域。下面将详细介绍 C# 的综合运用。 一、C# 语言特性…...

Docker 和 Docker Compose

Docker 和 Docker Compose 是两个相关但用途不同的工具&#xff0c;它们在容器化应用的管理和部署中扮演不同的角色。以下是它们的核心区别&#xff1a; 1. 功能定位 Docker: 是一个容器化平台&#xff0c;用于创建、运行和管理单个容器。适用于单个容器应用的开发和测试。通过…...

文件上传到腾讯云存储、签名及设置过期时间

将文件上传到腾讯云对象存储&#xff08;COS&#xff0c;Cloud Object Storage&#xff09;可以通过腾讯云提供的 SDK 实现。以下是详细的步骤和示例代码&#xff0c;帮助您完成文件上传操作。 步骤 注册腾讯云账号并创建存储桶&#xff1a; &#xff08;1&#xff09;登录腾讯…...

从0开始达芬奇(6)

软件交互 就是与PR&#xff0c;AE软件进行交互。&#xff08;这个就不多说啦&#xff09; 快捷键&#xff08;以下是TIM总结的常用快捷键&#xff09;...

如何在Windows上使用Docker

引言 WSL2&#xff08;Windows Subsystem for Linux2&#xff09;是微软开发的一种技术&#xff0c;允许在 Windows 操作系统上运行 Linux 环境。它提供了一个兼容层&#xff0c;使得用户可以在 Windows 系统中直接运行 Linux 命令行工具、应用程序和开发工具&#xff0c;而无需…...

细胞计数专题 | 如何减少台盼蓝沉淀?

台盼蓝&#xff08;Trypan Blue&#xff09;是一种在生物学研究中广泛使用的染料&#xff0c;尤其常用于细胞活力检测。当细胞死亡时&#xff0c;其细胞膜会变得对台盼蓝具有通透性&#xff0c;染料因而能够进入细胞并与细胞内的蛋白质结合&#xff0c;产生染色效果。由此&…...

go流程控制

流程控制是每种编程语言控制逻辑走向和执行次序的重要部分&#xff0c;流程控制可以说是一门语言的“经脉”。 Go 语言中最常用的流程控制有 if 和 for&#xff0c;而 switch 和 goto 主要是为了简化代码、降低重复代码而生的结构&#xff0c;属于扩展类的流程控制。 if else…...

Spring Web MVC项目的创建及使用

一、什么是Spring Web MVC&#xff1f; Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架&#xff0c;从⼀开始就包含在 Spring 框架中&#xff0c;通常被称为Spring MVC。 1.1 MVC的定义 MVC 是 Model View Controller 的缩写&#xff0c;它是软件工程中的一种软件架构…...

RabbitMQ 从入门到精通:从工作模式到集群部署实战(四)

#作者&#xff1a;闫乾苓 系列前几篇&#xff1a; 《RabbitMQ 从入门到精通&#xff1a;从工作模式到集群部署实战&#xff08;一&#xff09;》&#xff1a;link 《RabbitMQ 从入门到精通&#xff1a;从工作模式到集群部署实战&#xff08;二&#xff09;》&#xff1a; lin…...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_get_options函数

声明 就在 main函数所在的 nginx.c 中&#xff1a; static ngx_int_t ngx_get_options(int argc, char *const *argv); 实现 static ngx_int_t ngx_get_options(int argc, char *const *argv) {u_char *p;ngx_int_t i;for (i 1; i < argc; i) {p (u_char *) argv[i]…...

TCP长连接、HTTP短轮询、HTTP长轮询、HTTP长连接、WebSocket的区别

1.TCP长连接 &#xff08;1&#xff09;概念&#xff1a;该连接属于传输层的协议。客户端和服务器之间建立连接后&#xff0c;不立即断开该连接&#xff0c;而是一直保持这个状态&#xff0c;以便后续数据的持续、连续传输。&#xff08;2&#xff09;应用场景&#xff1a;适合…...

在 Flownex 中创建自定义工作液

在这篇博文中&#xff0c;我们将了解如何在 Flownex 中为流网添加和定义一种新的流体温度相关工作材料。 Flownex 物料管理界面 在 Flownex 中使用与温度相关的流体材料时&#xff0c;了解其特性与温度的关系非常重要。这种了解可确保准确预测各种热条件下的流体行为&#xff0…...

基于Spring Boot的图书个性化推荐系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

【抽象代数】1.1. 运算及关系

集合与映射 定义1. 设 为 的子集&#xff0c;定义 到 的映射 &#xff1a; 使得 &#xff0c;称 为 到 的嵌入映射。 定义2. 设 为 的子集&#xff0c; 为 到 的映射&#xff0c; 为 到 的映射&#xff0c;如果 &#xff0c;称为的开拓&#xff0c; 为 的限制&…...

拥抱开源,助力创新:IBM永久免费云服务器助力开源项目腾飞

近年来&#xff0c;开源项目蓬勃发展&#xff0c;为全球科技进步做出了巨大贡献。然而&#xff0c;服务器成本高昂常常成为开源项目的巨大障碍。许多优秀的项目因缺乏资源而难以持续发展&#xff0c;甚至夭折。令人振奋的是&#xff0c;IBM云计算平台推出了一项重磅活动&#x…...

Windows Docker笔记-简介摘录

Docker是一个开源的容器化平台&#xff0c;可以帮助开发人员将应用程序与其依赖项打包在一个独立的容器中&#xff0c;然后在任何安装的Docker的环境中快速、可靠地运行。 几个基本概念和优势&#xff1a; 1. 容器 容器是一个轻量级、独立的运行环境&#xff0c;包含了应用程…...

threejs 建筑设计(室内设计)软件 技术调研之五 墙体生成后自动生成房间(地面)

运用threejs 开发 建筑设计&#xff08;室内设计&#xff09;软件 技术调研 四 墙体添加真实门窗并保持原材质 在线体验地址&#xff1a;http://47.96.130.245:8080/design/index.html 实现功能&#xff1a; 墙体材质变换后&#xff0c;自动根据墙体的顶点生成相应的房间 视…...

C++:string类的模拟实现

目录 1.引言 2.C模拟实现 2.1模拟实现构造函数 1&#xff09;直接构造 2&#xff09;拷贝构造 2.2模拟实现析构函数 2.3模拟实现其他常规函数 1&#xff09;c_str函数 2&#xff09;size函数 3&#xff09;begin/end函数 4&#xff09;reserve函数 5&#xff09;re…...

UE制作2d游戏

2d免费资产: Free 2D Game Assets - CraftPix.net 需要用到PaperZD插件 官网下载后启用即可 导入png素材 然后全选 - 创建Sprite 创建 人物基类 设置弹簧臂和相机 弹簧臂设置成旋转-90 , 取消碰撞测试 设置子类Sprite 拖到场景中 绑定设置输入映射,让角色移动跳跃 神似卡拉比…...

verilog练习:i2c slave 模块设计

文章目录 前言1. 结构2.代码2.1 iic_slave.v2.2 sync.v2.3 wr_fsm.v2.3.1 状态机状态解释 2.4 ram.v 3. 波形展示4. 建议5. 资料总结 前言 首先就不啰嗦iic协议了&#xff0c;网上有不少资料都是叙述此协议的。 下面将是我本次设计的一些局部设计汇总&#xff0c;如果对读者有…...

mysql的语句备份详解

使用mysqldump工具备份&#xff08;适用于逻辑备份&#xff09; mysqldump是 MySQL 自带的一个非常实用的逻辑备份工具&#xff0c;它可以将数据库中的数据和结构以 SQL 语句的形式导出到文件中。 1. 备份整个数据库 mysqldump -u [用户名] -p [数据库名] > [备份文件名].…...

BFS算法篇——广度优先搜索,探索未知的旅程(上)

文章目录 前言一、BFS的思路二、BFS的C语言实现1. 图的表示2. BFS的实现 三、代码解析四、输出结果五、总结 前言 广度优先搜索&#xff08;BFS&#xff09;是一种广泛应用于图论中的算法&#xff0c;常用于寻找最短路径、图的遍历等问题。与深度优先搜索&#xff08;DFS&…...

短剧APP开发:短剧风口下的机遇

今年春节以来&#xff0c;各种精品短剧不断上线&#xff0c;短剧赛道热度持续上升&#xff0c;展现出了强大的经济效益&#xff0c;为影视市场提供了越来越多的机会。短剧的持续火爆也带动了短剧APP的发展&#xff0c;“短剧”迎来了爆发式增长&#xff0c;本文将探讨短剧APP开…...

PT2021K 单触控同步输出 IC

1. 产品概述 PT2021K 是一款电容式触摸控制 ASIC &#xff0c;支持 1 通道触摸输入&#xff0c; 1 通道同步型开关输出。具有低 功耗、高抗干扰、宽工作电压范围、高穿透力的突出优势。 2. 主要特性 工作电压范围&#xff1a; 2.4~5.5V 待机电流约 9uAV DD 5V&…...

[论文笔记] Deepseek-R1R1-zero技术报告阅读

启发: 1、SFT&RL的训练数据使用CoT输出的格式,先思考再回答,大大提升模型的数学与推理能力。 2、RL训练使用群体相对策略优化(GRPO),奖励模型是规则驱动,准确性奖励和格式化奖励。 1. 总体概述 背景与目标 报告聚焦于利用强化学习(RL)提升大型语言模型(LLMs)…...

选择LabVIEW开发外协还是自己做开发?

在决定是否选择外协进行LabVIEW开发时&#xff0c;选择合适的外协团队是至关重要的。一个专业的外协团队不仅能提高项目的开发效率&#xff0c;还能帮助解决技术难题&#xff0c;确保项目的高质量交付。在选择团队时&#xff0c;以下几个方面值得特别注意&#xff1a; ​ 1. 团…...

网络工程师 (20)计算机网络的概念

一、定义 计算机网络是指将地理位置不同、具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路及通信设备连接起来&#xff0c;在网络操作系统、网络管理软件及网络通信协议的管理和协调下&#xff0c;实现信息传递和资源共享的计算机通信系统。 二、组成 资源子网&…...

RockyLinux9.4安装教程

Rocky Linux 9.4 安装教程 Rocky Linux 是由 CentOS 创始人 Gregory Kurtzer 发起的一个社区企业操作系统,旨在与 Red Hat Enterprise Linux (RHEL) 保持二进制兼容。本教程将详细介绍如何在您的系统上安装 Rocky Linux 9.4。 步骤 1: 下载 Rocky Linux 9.4 ISO 文件 打开 R…...

单片机之基本元器件的工作原理

一、二极管 二极管的工作原理 二极管是一种由P型半导体和N型半导体结合形成的PN结器件&#xff0c;具有单向导电性。 1. PN结形成 P型半导体&#xff1a;掺入三价元素&#xff0c;形成空穴作为多数载流子。N型半导体&#xff1a;掺入五价元素&#xff0c;形成自由电子作为多…...

TOTP实现Google Authenticator认证工具获取6位验证码

登录遇到Google认证怎么办? TOTP是什么?(Google Authenticator) TOTP(Time-based One-Time Password)是一种基于时间的一次性密码算法,主要用于双因素身份验证。其核心原理是通过共享密钥和时间同步生成动态密码,具体步骤如下: 共享密钥:服务端与客户端预先共享一个…...

114,【6】攻防世界 web wzsc_文件上传

进入靶场 传个桌面有的 直接空白了 我们 访问一下上传的东西 /index 没显示用于解析的.htaccess和.user.ini 文件&#xff0c;还两个都不显示 .htaccess 和 .user.ini 文件分别用于 Apache 服务器和 PHP-FPM 环境的目录级配置 但上传的时候bp查看状态码是200&#xff0c;…...

Rust unresolved import `crate::xxx` 报错解决

问题阐述 该问题出现在我使用actix编写的crud后端api中&#xff0c;我的后端结构如下: D:. | handle_err.rs | lib.rs | main.rs | ---application | mod.rs | user_service.rs | ---domain | dto.rs | mod.rs | user.rs | ---infrastru…...

dl学习笔记(9):pytorch数据处理的完整流程

1&#xff09;自动导入常用库的设置方式 在开始之前&#xff0c;这里介绍一下自动导入常用的你需要加载的库的操作方式。 首先在我们的目录下找到ipython文件&#xff0c;如下图&#xff1a; 然后找到里面的startup文件&#xff1a; 然后新建一个文本文档&#xff0c;输入你每…...

结构化表达(三):归纳分组

目录 归纳分组 一、如何归纳分组 二、如何掌握更多模型 归纳分组 一、如何归纳分组 整理思路&#xff0c;多用分类模型&#xff0c;列如&#xff1a; 1、内部、外部分类。 2、市场营销学中的4P&#xff1a;产品、渠道、价格、促销。 3、战略3C&#xff1a;公司、客户、竞…...

BUU17 [RoarCTF 2019]Easy Calc1

自用 源代码 $(#calc).submit(function(){$.ajax({url:"calc.php?num"encodeURIComponent($("#content").val()),type:GET,success:function(data){$("#result").html(<div class"alert alert-success"><strong>答案:&l…...

openGauss 3.0 数据库在线实训课程2:学习客户端工具gsql的使用

openGauss数据库状态查看 前提 我正在参加21天养成好习惯| 第二届openGauss每日一练活动 课程详见&#xff1a;openGauss 3.0.0数据库在线实训课程 学习目标 学习openGauss数据库客户端工具gsql的使用。 课程作业 gsql是openGauss提供在命令行下运行的数据库连接工具&am…...

mac环境下,ollama+deepseek+cherry studio+chatbox本地部署

春节期间&#xff0c;deepseek迅速火爆全网&#xff0c;然后回来上班&#xff0c;我就浅浅的学习一下&#xff0c;然后这里总结一下&#xff0c;我学习中&#xff0c;总结的一些知识点吧&#xff0c;分享给大家。具体的深度安装部署&#xff0c;这里不做赘述&#xff0c;因为网…...

C# SQlite使用流程

前言 不是 MySQL 用不起&#xff0c;而是 SQLite 更有性价比&#xff0c;绝大多数的应用 SQLite 都可以满足。 SQLite 是一个用 C 语言编写的开源、轻量级、快速、独立且高可靠性的 SQL 数据库引擎&#xff0c;它提供了功能齐全的数据库解决方案。SQLite 几乎可以在所有的手机…...

mysql8 C++源码中创建表函数,表字段最大数量限制,表行最大存储限制

在 MySQL 8 的 C 源码中&#xff0c;表的最大字段数量限制体现在 MAX_FIELDS 宏定义中。这个宏定义了表中可以拥有的最大字段数量。 代码中的体现 在 mysql_prepare_create_table 函数中&#xff0c;有以下代码段检查表的字段数量是否超过最大限制&#xff1a; cpp if (alt…...

stable diffusion安装包与常用模型下载

本地安装包&#xff08;直接借用秋叶大佬的包&#xff09;&#x1f64f; 1.最好用的 Forge 版整合包 网盘&#xff1a;https://pan.quark.cn/s/4e9459b17c94 解压密码&#xff1a;bilibili-秋葉aaaki 2.最好用的整合包&#xff01; https://pan.baidu.com/s/1MjO3CpsIvTQID…...