【技术派后端篇】技术派中的白名单机制:基于Redis的Set实现
在技术派社区中,为了保证文章的质量和社区的良性发展,所有发布的文章都需要经过审核。然而,并非所有作者的文章都需要审核,我们通过白名单机制来优化这一流程。本文将详细介绍技术派中白名单的实现方式,以及如何利用Redis的Set数据结构来管理白名单。
1 为什么要审核?
虽然大部分作者发布的文章都是高质量的,但也有一些作者只是为了体验发文流程而发布测试内容。如果不经过审核直接上线,可能会导致社区文章质量的下降。因此,审核机制是保证社区文章质量的重要手段。
2 白名单的实现方案
在技术派中,我们为部分作者设置了白名单,这些作者发布的文章无需审核即可直接上线。白名单的实现有多种方案,我们选择了基于Redis的Set数据结构来实现。以下是几种可选的方案及其优缺点:
方案 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
配置文件写死(硬编码方式) | 简单 | 不灵活,每次改动需改代码发版,不适用于实际生产项目 | 对配置变动需求极低的简单测试场景 |
数据库配置白名单表 | 灵活,适用性强 | 实现有点重 | 生产环境中对配置灵活性要求高,且能接受一定实现复杂度的场景 |
基于redis的set实现白名单 | 实现简单,轻量 | 依赖redis | 对性能要求较高、且项目中已使用redis,对配置管理有一定灵活性需求的场景 |
3 技术派中的白名单实现策略
技术派中的白名单就是基于Redis的Set来实现的。以下是详细的实现策略:
3.1 Redis Set的基本操作
以下是Redis Set的一些基本操作命令:
- 添加成员:
SADD key val1 val2
- 获取集合成员数量:
SCARD key
- 判断成员是否存在:
SISMEMBER key val
,返回1表示存在,0表示不存在 - 获取所有成员:
SMEMBERS key
- 随机移除成员:
SPOP key
- 随机返回成员:
SRANDMEMBER key count
- 删除成员:
SREM key val
此外,Set还支持多个集合之间的操作,如求差集、交集、并集等。
- 返回第一个集合与其他集合之间的差异:
sdiff key1 key2 key3...
- 返回所有给定集合的差值,并存储在destination:
sdiffstore destination key1 key2 key3...
- 返回给定集合的交集:
sinter key1 key2
- 返回给定集合的交集,并存储在destination集合中 :
sinterstore destination key1 key2...
- 返回所有给定集合的并集:
sunion key1 key2...
- 返回所有给定集合的并集,并存储在destination集合中:
sunionstore destination key1 key2...
3.2 Spring项目中使用RedisTemplate操作Set
在Spring项目中,我们可以使用RedisTemplate
来操作Redis的Set。以下是一些常用的操作示例:
- 新增成员:
public void add(String key, String value) {redisTemplate.opsForSet().add(key, value);
}
- 删除成员:
public void remove(String key, String value) {redisTemplate.opsForSet().remove(key, value);
}
- 判断成员是否存在:
public void contains(String key, String value) {redisTemplate.opsForSet().isMember(key, value);
}
- 获取所有成员:
public Set<String> values(String key) {return redisTemplate.opsForSet().members(key);
}
- 集合运算:
public Set<String> union(String key1, String key2) {return redisTemplate.opsForSet().union(key1, key2);
}public Set<String> intersect(String key1, String key2) {return redisTemplate.opsForSet().intersect(key1, key2);
}public Set<String> diff(String key1, String key2) {return redisTemplate.opsForSet().difference(key1, key2);
}
3.3 白名单的使用实例
在技术派中,白名单的相关业务逻辑封装在com.github.paicoding.forum.service.user.service.AuthorWhiteListService
中。以下是一些核心方法:
-
判断作者是否在白名单中:
boolean authorInArticleWhiteList(Long authorId);
-
获取所有白名单用户:
List<BaseUserInfoDTO> queryAllArticleWhiteListAuthors();
-
添加用户到白名单:
void addAuthor2ArticleWhitList(Long userId);
-
从白名单中移除用户:
void removeAuthorFromArticelWhiteList(Long userId);
实现代码如下:
@Service
public class AuthorWhiteListServiceImpl implements AuthorWhiteListService {/*** 实用 redis - set 来存储允许直接发文章的白名单*/private static final String ARTICLE_WHITE_LIST = "auth_article_white_list";@Autowiredprivate UserService userService;@Overridepublic boolean authorInArticleWhiteList(Long authorId) {return RedisClient.sIsMember(ARTICLE_WHITE_LIST, authorId);}/*** 获取所有的白名单用户** @return*/@Overridepublic List<BaseUserInfoDTO> queryAllArticleWhiteListAuthors() {Set<Long> users = RedisClient.sGetAll(ARTICLE_WHITE_LIST, Long.class);if (CollectionUtils.isEmpty(users)) {return Collections.emptyList();}List<BaseUserInfoDTO> userInfos = userService.batchQueryBasicUserInfo(users);return userInfos;}@Overridepublic void addAuthor2ArticleWhitList(Long userId) {RedisClient.sPut(ARTICLE_WHITE_LIST, userId);}@Overridepublic void removeAuthorFromArticleWhiteList(Long userId) {RedisClient.sDel(ARTICLE_WHITE_LIST, userId);}
}
核心封装的几个公共方法,位于com.github.paicoding.forum.core.cache.RedisClient#sIsMember
处
/*** 判断value是否再set中** @param key* @param value* @return*/
public static <T> Boolean sIsMember(String key, T value) {return template.execute(new RedisCallback<Boolean>() {@Overridepublic Boolean doInRedis(RedisConnection connection) throws DataAccessException {return connection.sIsMember(keyBytes(key), valBytes(value));}});
}/*** 获取set中的所有内容** @param key* @param clz* @param <T>* @return*/
public static <T> Set<T> sGetAll(String key, Class<T> clz) {return template.execute(new RedisCallback<Set<T>>() {@Overridepublic Set<T> doInRedis(RedisConnection connection) throws DataAccessException {Set<byte[]> set = connection.sMembers(keyBytes(key));if (CollectionUtils.isEmpty(set)) {return Collections.emptySet();}return set.stream().map(s -> toObj(s, clz)).collect(Collectors.toSet());}});
}/*** 往set中添加内容** @param key* @param val* @param <T>* @return*/
public static <T> boolean sPut(String key, T val) {return template.execute(new RedisCallback<Long>() {@Overridepublic Long doInRedis(RedisConnection connection) throws DataAccessException {return connection.sAdd(keyBytes(key), valBytes(val));}}) > 0;
}/*** 移除set中的内容** @param key* @param val* @param <T>*/
public static <T> void sDel(String key, T val) {template.execute(new RedisCallback<Void>() {@Overridepublic Void doInRedis(RedisConnection connection) throws DataAccessException {connection.sRem(keyBytes(key), valBytes(val));return null;}});
}
3.4 白名单的应用场景
在文章发布的核心服务中,我们通过白名单机制来决定文章是否需要审核。代码位于com.github.paicoding.forum.service.article.service.impl.ArticleWriteServiceImpl
,以下是一些关键代码片段:
- 判断是否需要审核:
private boolean needToReview(ArticleDO article) {BaseUserInfoDTO user = ReqInfoContext.getReqInfo().getUser();if (user.getRole() != null && user.getRole().equalsIgnoreCase(UserRole.ADMIN.name())) {return false;}return article.getStatus() == PushStatusEnum.ONLINE.getCode() && !articleWhiteListService.authorInArticleWhiteList(article.getUserId());
}
- 发布文章:
private Long insertArticle(ArticleDO article, String content, Set<Long> tags) {if (needToReview(article)) {article.setStatus(PushStatusEnum.REVIEW.getCode());}// 保存文章、内容和标签// ...
}
- 更新文章:
private Long updateArticle(ArticleDO article, String content, Set<Long> tags) {boolean review = article.getStatus().equals(PushStatusEnum.REVIEW.getCode());if (needToReview(article)) {article.setStatus(PushStatusEnum.REVIEW.getCode());}// 更新文章、内容和标签// ...
}
3.5 管理员操作白名单
管理员可以通过com.github.paicoding.forum.web.admin.rest.AuthorWhiteListController
来管理白名单用户:
@RestController
@Api(value = "发布文章作者白名单管理控制器", tags = "作者白名单")
@Permission(role = UserRole.ADMIN)
@RequestMapping(path = {"api/admin/author/whitelist"})
public class AuthorWhiteListController {@Autowiredprivate AuthorWhiteListService articleWhiteListService;@GetMapping(path = "get")@ApiOperation(value = "白名单列表", notes = "返回作者白名单列表")public ResVo<List<BaseUserInfoDTO>> whiteList() {return ResVo.ok(articleWhiteListService.queryAllArticleWhiteListAuthors());}@GetMapping(path = "add")@ApiOperation(value = "添加白名单", notes = "将指定作者加入作者白名单列表")@ApiImplicitParam(name = "authorId", value = "传入需要添加白名单的作者UserId", required = true, allowEmptyValue = false, example = "1")public ResVo<Boolean> addAuthor(@RequestParam("authorId") Long authorId) {articleWhiteListService.addAuthor2ArticleWhitList(authorId);return ResVo.ok(true);}@GetMapping(path = "remove")@ApiOperation(value = "删除白名单", notes = "将作者从白名单列表")@ApiImplicitParam(name = "authorId", value = "传入需要删除白名单的作者UserId", required = true, allowEmptyValue = false, example = "1")public ResVo<Boolean> rmAuthor(@RequestParam("authorId") Long authorId) {articleWhiteListService.removeAuthorFromArticleWhiteList(authorId);return ResVo.ok(true);}
}
4 总结
本文介绍了技术派中白名单机制的实现,重点讲解了如何利用Redis的Set数据结构来管理白名单用户。通过白名单机制,我们能够有效减少不必要的审核流程,提升用户体验。同时,本文也展示了如何在Spring项目中使用RedisTemplate
来操作Redis的Set,希望对大家有所帮助。
Redis的五种基本数据结构(String、List、Set、ZSet、Hash)是每个开发者都应该掌握的知识点。然而,仅仅了解这些数据结构是不够的,更重要的是能够结合实际场景来选择合适的数据结构,这样才能真正发挥Redis的优势。
5 思维导图
6 参考链接
- 技术派Redis实现作者白名单
- 项目仓库(GitHub)
- 项目仓库(码云)
7 附录:Redis 五种数据结构的应用场景
Redis 提供了五种基本数据结构:字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。每种数据结构都有其独特的特性和适用场景。以下是每种数据结构的应用场景详解:
7.1 字符串(String)
应用场景:
- 缓存数据:将经常访问的数据缓存在 Redis 中,以加快访问速度。例如,缓存用户信息、商品信息等。
- 计数器:记录某个事件发生的次数,例如网站的访问次数、文章的点赞次数等。可以使用
INCR
和DECR
命令来实现。 - 分布式锁:使用字符串的
SETNX
命令来实现分布式锁。SETNX
命令在键不存在时设置键值,可以用来实现互斥锁。
示例代码:
// 缓存数据
redisTemplate.opsForValue().set("user:1", "John Doe");
String user = redisTemplate.opsForValue().get("user:1");// 计数器
redisTemplate.opsForValue().increment("page:view:count");
Long viewCount = redisTemplate.opsForValue().get("page:view:count");// 分布式锁
Boolean lockAcquired = redisTemplate.opsForValue().setIfAbsent("lock:key", "lockValue");
if (lockAcquired) {try {// 执行业务逻辑} finally {redisTemplate.delete("lock:key");}
}
7.2 哈希(Hash)
应用场景:
- 存储对象属性:将对象的属性存储在哈希中,方便对属性进行读写操作。例如,存储用户信息、商品信息等。
- 缓存对象:将对象序列化后存储在哈希中,以便快速获取和更新对象。
- 记录用户信息:存储用户的详细信息,如用户名、年龄、性别等。
示例代码:
// 存储对象属性
redisTemplate.opsForHash().put("user:1", "name", "John Doe");
redisTemplate.opsForHash().put("user:1", "age", 30);
String name = (String) redisTemplate.opsForHash().get("user:1", "name");
Integer age = (Integer) redisTemplate.opsForHash().get("user:1", "age");// 缓存对象
User user = new User("John Doe", 30);
redisTemplate.opsForHash().putAll("user:1", new ObjectMapper().convertValue(user, Map.class));
User cachedUser = new ObjectMapper().convertValue(redisTemplate.opsForHash().entries("user:1"), User.class);
7.3 列表(List)
应用场景:
- 消息队列:用于实现消息队列,将生产者产生的消息存储在列表中,消费者从列表中获取消息进行处理。
- 最新动态:存储用户的最新动态或消息,如微博的用户动态、新闻网站的最新消息等。
- 实时排行榜:用于存储用户的分数或权重,并根据分数进行排序,实现实时排行榜功能。
示例代码:
// 消息队列
redisTemplate.opsForList().rightPush("message:queue", "message1");
String message = redisTemplate.opsForList().leftPop("message:queue");// 最新动态
redisTemplate.opsForList().rightPush("user:1:timeline", "动态1");
List<String> timeline = redisTemplate.opsForList().range("user:1:timeline", 0, -1);// 实时排行榜
redisTemplate.opsForList().rightPush("leaderboard", "user:1");
redisTemplate.opsForList().rightPush("leaderboard", "user:2");
List<String> leaderboard = redisTemplate.opsForList().range("leaderboard", 0, -1);
7.4 集合(Set)
应用场景:
- 好友关系:存储用户的好友关系,利用集合的交集、并集、差集等操作来实现好友关系的管理。
- 标签管理:将对象关联的标签存储在集合中,方便进行标签的添加、删除和检索。
- 唯一值集合:用于存储唯一值,如去重、统计等场景。
示例代码:
// 好友关系
redisTemplate.opsForSet().add("user:1:friends", "user:2", "user:3");
Set<String> friends = redisTemplate.opsForSet().members("user:1:friends");// 标签管理
redisTemplate.opsForSet().add("article:1:tags", "技术", "Redis");
Set<String> tags = redisTemplate.opsForSet().members("article:1:tags");// 唯一值集合
redisTemplate.opsForSet().add("unique:values", "value1", "value2");
Set<String> uniqueValues = redisTemplate.opsForSet().members("unique:values");
7.5 有序集合(Sorted Set)
应用场景:
- 排行榜:存储用户的分数,并根据分数进行排序,实现排行榜功能。例如,游戏中的积分排行榜、电商网站的销量排行榜等。
- 实时热门数据:存储数据的热度值,并根据热度值进行排序,用于实时热门数据的展示。例如,新闻网站的热门新闻、社交媒体的热门话题等。
- 计划任务:存储定时任务的执行时间,并根据时间戳进行排序,用于实现计划任务的调度。
示例代码:
// 排行榜
redisTemplate.opsForZSet().add("leaderboard", "user:1", 100);
redisTemplate.opsForZSet().add("leaderboard", "user:2", 200);
Set<String> topUsers = redisTemplate.opsForZSet().range("leaderboard", 0, 9);// 实时热门数据
redisTemplate.opsForZSet().add("hot:news", "新闻1", 10);
redisTemplate.opsForZSet().add("hot:news", "新闻2", 20);
Set<String> hotNews = redisTemplate.opsForZSet().range("hot:news", 0, -1);// 计划任务
redisTemplate.opsForZSet().add("schedule:tasks", "task1", System.currentTimeMillis() + 60000);
Set<String> tasks = redisTemplate.opsForZSet().rangeByScore("schedule:tasks", 0, System.currentTimeMillis());
相关文章:
【技术派后端篇】技术派中的白名单机制:基于Redis的Set实现
在技术派社区中,为了保证文章的质量和社区的良性发展,所有发布的文章都需要经过审核。然而,并非所有作者的文章都需要审核,我们通过白名单机制来优化这一流程。本文将详细介绍技术派中白名单的实现方式,以及如何利用Re…...
Keil A51汇编伪指令
以下是 Keil A51 汇编器支持的常用伪指令 及其详细说明,涵盖代码结构、数据定义、条件编译等关键功能,结合实际应用场景进行分类和示例: 一、程序结构与地址控制 伪指令功能语法示例说明ORG设置代码/数据起始地址ORG 0000H后续代码从指定地址…...
Windows上安装FFmpeg的详细指南
1.下载FFmpeg 访问FFmpeg官方下载页面:https://ffmpeg.org/download.html 点击"Windows builds from gyan.dev"或"Windows builds by BtbN" gyan.dev版本:https://www.gyan.dev/ffmpeg/builds/ BtbN版本:https://githu…...
jmeter利用csv进行参数化和自动断言
1.测试数据 csv测试数据如下(以注册接口为例) 2.jemer参数化csv设置 打开 jmeter,添加好线程组、HTTP信息头管理器、CSV 数据文件设置、注册请求、响应断言、查看结果树 1) CSV 数据文件设置 若 CSV 中数据包含中文,…...
《Android 应用开发基础教程》——第二章:Activity 与生命周期详解
目录 第二章:Activity 与生命周期详解 2.1 什么是 Activity? 作用: 2.2 创建一个 Activity 示例代码 Manifest 注册: 2.3 Activity 生命周期(Life Cycle) 生命周期图解: 2.4 生命周期代…...
[Java]反射、String类补充
目录 1、反射定义 2、用途(了解) 3、反射相关的类 4、Class类(反射机制的起源) 4.1、相关方法 5、反射示例 5.1、获取Class对象 5.2、反射的使用 6、反射优点和缺点 7、String类补充 7.1、创建对象的思考 8、字符串常量池 9、再谈String对象创建 10、intern方法 …...
word表格批量操作——宏
word中所有表格代码 这个是表格的模板代码 Sub 表格通用代码() For i ActiveDocument.Tables.Count To 1 Step -1ActiveDocument.Tables (i) Next End Sub1、根据内容自动调整表格 Sub 表格适用内容() For i ActiveDocument.Tables.Count To 1 Step -1ActiveDocument.Tabl…...
eSTK.me
eSTK.me 调用 USIM 卡的 Applet 实现在 iOS 内自助切换 Profile。写卡仍然需要借助硬件读卡器或者兼容 eSIM 的 Android 手机。支持国行 iPhone。 eSTK.me(固件 v2.x 及以后的版本)基于 ETSI 的 Bearer Independent Protocol (BIP) 协议,使…...
四级英语备考指南
一、引言 大学英语四级考试是对大学生英语综合能力的一次重要检验。无论是为了学业要求,还是提升自身竞争力,顺利通过四级考试都有着重要意义。本文将为大家详细介绍四级英语的备考策略,帮助大家高效备考,取得理想成绩。 二、了…...
Java Web 之 互联网协议 100问
HTTP是什么? HTTP(HyperText Transfer Protocol,超文本传输协议)是互联网上应用最广泛的协议之一,用于在客户端(如浏览器)和服务器之间传输数据。它是 Web 通信的基础,支持浏览器访…...
【单倍型理解及计算系列之二】单倍型基本概念以及其与遗传定位中Bin的定义区别
问题:如何理解单倍型,与遗传定位中Bin的定义区别: 简而言之:就是单倍型是基于LD,通常为连锁不平衡(LD)较高的区域形成。但bin是人为划分的,如以固定SNP数量/固定长度设置࿰…...
ArcPy Mapping 模块基础
在地理信息系统(GIS)的应用中,地图制作是一个非常重要的环节。无论是生成用于展示的静态地图,还是动态更新的地图服务,都需要高效且灵活的工具来实现。ArcPy 提供了强大的mapping模块,可以帮助用户自动化地…...
AcWing 11:背包问题求方案数 ← 0-1背包
【题目来源】 https://www.acwing.com/problem/content/11/ 【题目描述】 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总…...
Redis增删改查
### 进入redis控制台 redis-cli --raw #加上raw,防止中文乱码### 增 127.0.0.1:6379> LPUSH list0 "hello" #增加一个list 1 127.0.0.1:6379> LRANGE list0 0 -1 #查看list hello### 删 127.0.0.1:6379> DEL list0 #删除list 1 127.0.0.1:6379> LRANG…...
多道程序和多任务操作系统区别
多道程序 vs. 多道任务:对比分析 ✅ 共同点 方面共同特征核心机制都依赖于进程/任务切换执行需求实现多个程序或任务"并发"执行系统支持都需要操作系统的支持(如调度算法、内存管理)本质目标提高资源利用率(CPU不空转…...
【MySQL】MySQL建立索引不知道注意什么?
基本原则: 1.选择性原则: 选择高选择性的列建立索引(该列有大量不同的值) 2.适度原则:不是越多越好,每个索引都会增加写入开销 列选择注意事项: 1.常用查询条件列:WHERE字句中频繁使用的列 2.连接操作列…...
区块链木材业务服务平台:商贸物流新变革
区块链木材业务服务平台:商贸物流新变革 在全球商贸物流行业不断发展的当下,木材贸易作为其中重要的一环,面临着诸多挑战。区块链木材业务服务平台的出现,为木材商贸物流领域带来了全新的解决方案,正逐步引领行业走向…...
【AI提示词】经济学家
提示说明 经济学家致力于提供深入的经济分析和预测,帮助用户理解经济趋势、政策影响以及市场动态。他们通过专业的经济模型和数据分析,为用户在投资、决策等方面提供指导。 提示词 # 角色 经济学家## 注意 1. 经济学家专家需要具备深入分析经济现象的…...
C++用于保留浮点数的两位小数,使用宏定义方法(可兼容低版本Visual Studio)
文章目录 一、 描述二、 样例二、 结果输出 一、 描述 这个宏定义(可放入.h头文件里)使用基本的数学运算,几乎兼容所有版本的VS,以下可对正数做四舍五入: #define ROUND_TO_TWO(x) ( (floor((x) * 100 0.5) / 100) …...
kimi+deepseek制作PPT
文章目录 KIMI简介一、基本信息二、核心特点三、服务理念 Deepseek简介PPT关键词提示 KIMI简介 KIMI官网:Kimi - 会推理解析,能深度思考的AI助手 一、基本信息 名称 :KIMI开发团队 :月之暗面科技有限公司上线时间 :…...
Linux-进度条小程序
1. 回车和换行的差异 在输出文本时,回车和换行符的作用是非常不同的。了解它们的行为有助于我们控制输出的方式。 回车(\r):回车符将光标移到当前行的开头,但并不会自动换行。它的作用是覆盖当前行的内容。 换行&…...
Day2—3:前端项目uniapp壁纸实战
接下来我们做一个专题精选 <view class"theme"><common-title><template #name>专题精选</template><template #custom><navigator url"" class"more">More</navigator></template></common…...
什么是超类实体和派生属性
在数据库设计(尤其是实体-关系模型(ER模型))和面向对象建模中,超类实体和派生属性是两个重要的概念,分别用于描述实体间的继承关系和属性的动态计算特性。以下是它们的详细解释和对比: 一、超类…...
性能比拼: Elixir vs Go(第二轮)
本内容是对知名性能评测博主 Anton Putra Elixir vs Go (Golang) Performance Benchmark (Round 2) 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 这是第二轮关于 Elixir 和 Go 的对比测试。我收到了一份来自 Elixir 创作者的 Pull Request ,并且我认为…...
微信、抖音、小红书emoji符号大全
1、Emoji 日常符号 👣👀👁️👄💋👂🦻👃👅🧠🫀🫁🦷🦴💪🦾🦿🦵&a…...
【大模型】 LangChain框架 -LangChain实现问答系统
LangChain 介绍与使用方法 1. 什么是 LangChain?2. LangChain 的主要功能3. 如何使用 LangChain?3.1 环境准备3.2 基本使用示例3.2.1 简单的问答系统3.2.2 结合外部工具 3.3 高级用法 4. 常见问题及解决方法4.1 安装问题4.2 运行问题4.3 性能问题 5. 实战…...
k8s安装kubeadm
使用kubeadm安装部署k8s集群 目前生产部署Kubernetes 集群主要有两种方式: kubeadm Kubeadm 是一个K8s 部署工具,提供kubeadm init 和kubeadm join,用于快速部署Kubernetes 集群。 官方地址:https://kubernetes.io/docs/refer…...
五、小白如何用Pygame制作一款跑酷类游戏(主角跳跃和滑行动作的实现)
五、小白如何用Pygame制作一款跑酷类游戏(主角跳跃和滑行动作的实现) 文章目录 五、小白如何用Pygame制作一款跑酷类游戏(主角跳跃和滑行动作的实现)前言一、添加主角的跳跃和滑行图片素材二、代码部分1.在走路状态时按下按键发生…...
LLM MCP模型上下文协议快速入门(for Java)
什么是MCP Model Control Protocol(MCP)是由AI研究机构Anthropic在2023年第二季度首次提出的新型协议规范,旨在解决大语言模型LLM应用中的上下文管理难题。作为LLM交互领域的创新标准,MCP协议在发布后短短一年内已进行了多次更新…...
CTF--秋名山车神
一、原网页: 二、步骤: 1.尝试用计算器计算: 计算器溢出,无法正常计算 2.使用python计算: 得出计算结果为:1864710043732437134701060769 3.多次刷新页面: 发现变量为value,要用pos…...
Windows桌面图标变白的解决方案
一、问题原因 桌面图标变白通常是由于系统图标缓存文件(IconCache.db)损坏或系统图表示现异常导致。图标缓存是Windows用于存储应用程序和文件夹图标图像的临时文件,当该文件损坏或系统未正确更新缓存时,图标会因无法加载原始图像…...
Linux学习——信号量
1.头文件-semaphore.h 2.信号量类型 sem_t sem; 加强版的互斥锁,是并行的 3.主要函数 初始化信号量 sem_init(sem_t *sem,int pshared,unsigned int value); 第一个参数 信号量类型 第二个参数 0-线程同步 1-进程同步 …...
蓝桥杯 蜗牛 动态规划
16.蜗牛 - 蓝桥云课https://www.lanqiao.cn/problems/4985/learning/?page1&first_category_id1&second_category_id3&sortdifficulty&asc1&tags%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92,%E9%80%92%E6%8E%A8,01%E8%83%8C%E5%8C%85,%E5%8C%BA%E9%97%B4DP,%E6…...
FiftyOne 管理数据
FiftyOne 管理数据 下载安装FiftyOne https://docs.voxel51.com/ 下载 coco-2017 使用 FiftyOne 查看 import fiftyone as fo import fiftyone.zoo as foz# 自定义路径 - 修改这些变量以匹配你的环境 image_path /media/wmx/ws3/AI/data/coco2017/train2017 annotations_…...
解决echarts饼图label显示不全的问题
解决办法 添加如下配置: labelLayout: {hideOverlap: false},...
2000-2017年各省城市天然气供气总量数据
2000-2017年各省城市天然气供气总量数据 1、时间:2000-2017年 2、来源:国家统计局、能源年鉴 3、指标:行政区划代码、城市、年份、城市天然气供气总量 4、范围:31省 5、指标说明:城市天然气供气总量是指在一定时间…...
Linux教程-常用命令系列二
文章目录 1. 系统管理常用命令1. useradd - 创建用户账户功能基本用法常用选项示例 2. passwd - 管理用户密码功能基本用法常用选项示例 3. kill - 终止进程功能基本用法常用信号示例 4. date - 显示和设置系统时间功能基本用法常用选项时间格式示例 5. bc - 高精度计算器功能基…...
苍穹外卖(菜品管理)
菜品管理 公共字段自动填充 实现思路 代码开发 自定义注解 AutoFill 自定义切面 AutoFillAspect 完善自定义切面 AutoFillAspect 的 autoFill 方法 在Mapper接口的方法上加入 AutoFill 注解 将业务层为公共字段赋值的代码注释掉 功能测试 新增菜品 需求分析和…...
Cril 截取字段-生成hostname
有些event 是不规则,需要用regular express 来加工一下, 下面说一下sample 数据: 2021-10-26 17:00:12 PDT sample log data from host eagle1 2021-10-26 17:00:12 PDT sample log data from host eagle2 2021-10-26 17:00:12 PDT sample log data from host eagle3 2021…...
免费将AI生成图像放大4倍的方法
有些人不需要任何高级工具和花哨的技巧;他们只需要一种简单的方法来提升图像分辨率而不损失任何质量 — 今天,我们将学习如何做到这一点。 生成AI图像最大的问题之一是什么?最终结果通常分辨率非常低。 这会导致很多不同的问题,特别是对于那些想要在内容或项目中使用这些…...
Map和Set相关练习
目录 1、只出现一次的数字 2、宝石与石头 3、坏键盘打字 4、复制带随机指针的链表 5、大量数据去重 6、大量数据重复次数 7、前K个高频单词 1、只出现一次的数字 oj:136. 只出现一次的数字 - 力扣(LeetCode) 思路: 1. 使用…...
移动自动化测试-appium
app自动化介绍 工具说明 主流工具 app自动化执行原理 app类型(技术) 环境搭建 所需环境 JDKandroid-sdkappium模拟器 1、JDK安装 说明:为什么要安装JDK? 安卓应用或开发工具是使用JAVA语言开发,必须使用jdk。…...
一个项目中多个Composer的使用方法
composer是依赖管理工具。 有时我们会在一个项目中使用到多个composer,且每个版本不同。 前提:例如项目xyz根目录vendor中存在阿里云的对应代码。我现在需要再composer腾讯云短信发送的SDK。 1、随便找个位置新建文件夹,存储腾讯云短信发送…...
Qt项目实现对西门子PLC的读写操作(snap7)——C++
实际项目中需要用到对西门子PLC进行通讯,故进行记录,方便后续回顾复习 实现功能: ①PLC连接与断开 ②往PLC指定位置读写操作(bit、real、string) PLC中的real相当于C中的float,4字节,32bit 1&…...
Python字典深度解析:高效键值对数据管理指南
一、字典核心概念解析 1. 字典定义与特征 字典(Dictionary)是Python中基于哈希表实现的无序可变容器,通过键值对存储数据,具有以下核心特性: 键值对结构:{key: value}形式存储数据快…...
Java虚拟机面试题:垃圾收集(下)
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
9 C 语言变量详解:声明与定于、初始化与赋值、printf 输出与 scanf 输入、关键字、标识符命名规范
1 初识变量 1.1 变量的意义 在程序设计中,变量是程序中不可或缺的组成单位,最基本的存储单元。它如同现实生活中的容器,用于临时或长期保存各种类型的数据,为程序提供灵活的数据操作能力。 以选购手机为例,手机的各项…...
释放 Mac 存储空间:Ollama 模型迁移到外接 NVMe 磁盘
目录 背景一、准备工作1. 确认外接 NVMe 已挂载2. 创建模型目录 二、迁移已有模型数据(可选)三、配置模型目录1. 设置环境变量2. 使用软链接(强烈推荐) 四、测试是否成功 背景 在本地运行 Ollama 时,模型数据默认保存…...
spring-batch批处理框架(1)
学习链接 SpringBatch高效批处理框架详解及实战演练 spring-batch批处理框架(1) spring-batch批处理框架(2) spring batch官方文档 spring batch官方示例代码 - github 文章目录 学习链接一、课程目标课程目标课程内容前置知识适合人群 二、Spring Batch简介2.1 何为批处理…...
MCP系列:权限管理与隐私保护
前言 随着模型上下文协议(MCP)的广泛应用,安全性问题也逐步突显。在前几篇文章中,我们已经探讨了MCP的基本概念、技术架构、实践应用以及工具调用机制。本篇文章将聚焦于MCP的安全性考量,包括权限管理、隐私保护以及风险缓解策略。 对于企业和开发者而言,了解如何保障M…...