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

Redis的string类型使用

第一步:添加缓存

以若依岗位代码为例

一:首先从redis中查询岗位信息,如果查询到了则直接返回。

二:如果redis中没有数据,则直接从数据库中查询。查询后放到redis并返回

package com.ruoyi.system.service.impl;import java.util.List;import com.alibaba.fastjson2.JSON;
import lombok.AllArgsConstructor;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SysPost;
import com.ruoyi.system.mapper.SysPostMapper;
import com.ruoyi.system.mapper.SysUserPostMapper;
import com.ruoyi.system.service.ISysPostService;/*** 岗位信息 服务层处理* * @author ruoyi*/
@Service
@RequiredArgsConstructor
public class SysPostServiceImpl implements ISysPostService
{private final SysPostMapper postMapper;private final SysUserPostMapper userPostMapper;private final StringRedisTemplate redisTemplate;/*** 岗位前缀*/private static final String POST_KEY = "sys:post:";/*** 查询岗位信息集合* * @param post 岗位信息* @return 岗位信息集合*/@Overridepublic List<SysPost> selectPostList(SysPost post){return postMapper.selectPostList(post);}/*** 查询所有岗位* * @return 岗位列表*/@Overridepublic List<SysPost> selectPostAll(){return postMapper.selectPostAll();}/*** 通过岗位ID查询岗位信息* * @param postId 岗位ID* @return 角色对象信息*/@Overridepublic SysPost selectPostById(Long postId){// 一:从redis中查询缓存是否存在String postInfo = redisTemplate.opsForValue().get(POST_KEY + postId);// 二:判定是否存在if (StringUtils.isNotEmpty(postInfo)){// 转换为beanSysPost sysPost = JSON.parseObject(postInfo, SysPost.class);return sysPost;}// 三:如果存在直接返回SysPost post = postMapper.selectPostById(postId);// 四:不存在则查询数据库判定数据中是否存在if (StringUtils.isNull(post)){return null;}redisTemplate.opsForValue().set(POST_KEY + postId, JSON.toJSONString(post));// 五:如果存在则放到redis中,并返回return post;}/*** 根据用户ID获取岗位选择框列表* * @param userId 用户ID* @return 选中岗位ID列表*/@Overridepublic List<Long> selectPostListByUserId(Long userId){return postMapper.selectPostListByUserId(userId);}/*** 校验岗位名称是否唯一* * @param post 岗位信息* @return 结果*/@Overridepublic boolean checkPostNameUnique(SysPost post){Long postId = StringUtils.isNull(post.getPostId()) ? -1L : post.getPostId();SysPost info = postMapper.checkPostNameUnique(post.getPostName());if (StringUtils.isNotNull(info) && info.getPostId().longValue() != postId.longValue()){return UserConstants.NOT_UNIQUE;}return UserConstants.UNIQUE;}/*** 校验岗位编码是否唯一* * @param post 岗位信息* @return 结果*/@Overridepublic boolean checkPostCodeUnique(SysPost post){Long postId = StringUtils.isNull(post.getPostId()) ? -1L : post.getPostId();SysPost info = postMapper.checkPostCodeUnique(post.getPostCode());if (StringUtils.isNotNull(info) && info.getPostId().longValue() != postId.longValue()){return UserConstants.NOT_UNIQUE;}return UserConstants.UNIQUE;}/*** 通过岗位ID查询岗位使用数量* * @param postId 岗位ID* @return 结果*/@Overridepublic int countUserPostById(Long postId){return userPostMapper.countUserPostById(postId);}/*** 删除岗位信息* * @param postId 岗位ID* @return 结果*/@Overridepublic int deletePostById(Long postId){return postMapper.deletePostById(postId);}/*** 批量删除岗位信息* * @param postIds 需要删除的岗位ID* @return 结果*/@Overridepublic int deletePostByIds(Long[] postIds){for (Long postId : postIds){SysPost post = selectPostById(postId);if (countUserPostById(postId) > 0){throw new ServiceException(String.format("%1$s已分配,不能删除", post.getPostName()));}}return postMapper.deletePostByIds(postIds);}/*** 新增保存岗位信息* * @param post 岗位信息* @return 结果*/@Overridepublic int insertPost(SysPost post){return postMapper.insertPost(post);}/*** 修改保存岗位信息* * @param post 岗位信息* @return 结果*/@Overridepublic int updatePost(SysPost post){return postMapper.updatePost(post);}
}

这是一个简单的添加缓存功能。

第二步:缓存更新策略

主动更新有几种方式?

第一种是常用的

第二种市面上三方的工具少

第三种感觉有点不靠谱。一致性和可靠性都会存在问题,如果redis挂了就出现了一些问题

第三种有疑问其中2种都可以。但是需要具体的分析一下?

先删除缓存,在操作数据库

分析下正常情况:

线程1代表业务人员:业务人员先删除缓存,然后更新数据库

线程2代表客户:客户人员查询缓存未命中,然后写入缓存

非正常情况:

线程1代表业务人员:业务人员先删除缓存。但是由于更新数据库业务复杂,没有更新完。因为没                                    有加锁的原因

线程2代表客户:在数据库未更新完的情况下,客户点击查询结果缓存中没有直接查询到数据库,

                           但是数据库还是10,造成了缓存也是10。最终出现了数据库是20,缓存10。

先操作数据库,在删除缓存

正常情况下:

线程2代表业务人员:业务人员更新数据库,然后删除缓存

线程1代表客户:客户查询缓存未命中,在查询数据库写入缓存

非正常业务:这种情况是在

这种情况是线程1查询缓存,缓存正好过期,然后他在查询玩数据库后,准备写入缓存

恰好有一个在更新数据库为20,然后删除缓存,但是那个写入缓存还没开始执行,等他删除缓存后开始执行了。这就造成了脏数据。但是这种情况是在毫秒级别发生的,太需要巧合了。

第三步:案例实现

之前做了岗位的缓存机制:现在实现一个缓存超时剔除和主动更新的策略

1:根据id查询岗位,如果未命中查询数据库,将数据库数据放到缓存里面,并添加超时时间

2:根据id修改岗位是,先修改数据库,在删除缓存

实现超时剔除

 /*** 通过岗位ID查询岗位信息** @param postId 岗位ID* @return 角色对象信息*/@Overridepublic SysPost selectPostById(Long postId) {// 一:从redis中查询缓存是否存在String postInfo = redisTemplate.opsForValue().get(POST_KEY + postId);// 二:判定是否存在if (StringUtils.isNotEmpty(postInfo)) {// 转换为beanSysPost sysPost = JSON.parseObject(postInfo, SysPost.class);return sysPost;}// 三:如果存在直接返回SysPost post = postMapper.selectPostById(postId);// 四:不存在则查询数据库判定数据中是否存在if (StringUtils.isNull(post)) {return null;}redisTemplate.opsForValue().set(POST_KEY + postId, JSON.toJSONString(post),RedisConstants.THIRTY_MINUTES,TimeUnit.MINUTES);// 五:如果存在则放到redis中,并返回return post;}

直接设置过期时间,并且设置为分钟就可以实现缓存自动剔除了。

实现主动更新策略

   /*** 修改保存岗位信息** @param post 岗位信息* @return 结果*/@Overridepublic int updatePost(SysPost post) {if (StringUtils.isNull(post.getPostId())) {throw new ServiceException("id不存在");}// 修改岗位信息int count = postMapper.updatePost(post);if (count > 0) {redisTemplate.delete(POST_KEY + post.getPostId());return count;}return 0;}

这种直接可以实现主动更新策略

结果点击岗位详情,可以看到已经

更新信息的时候则删除缓存了。

第四步:缓存穿透

缓存穿透:当redis和数据库都没有请求的数据时,这样缓存会不生效,所有请求都会打到redis中

解决方案:。2:布隆过滤。

1:缓存空对象

      优点:实现简单。可以设置一个时间短的TTL。能解决占内存

      缺点:可能站内存。可能会一直给你一个不存在id

2:布隆过滤

      优点:内存占用少,少量key。

      缺点:不一定准确。

给岗位查询解决缓存穿透的方案:流程图

代码修改:

 /*** 通过岗位ID查询岗位信息** @param postId 岗位ID* @return 角色对象信息*/@Overridepublic SysPost selectPostById(Long postId) {// 一:从redis中查询缓存是否存在String postInfo = redisTemplate.opsForValue().get(POST_KEY + postId);// 二:判定是否存在if (StringUtils.isNotEmpty(postInfo)) {// 转换为beanSysPost sysPost = JSON.parseObject(postInfo, SysPost.class);return sysPost;}// 这边还有点绕,不是空的,直接返回数据,但是如果不是null说明里面是空字符串就直接返回错误信息if (StringUtils.isNotNull(postInfo)) {throw new ServiceException("数据不存在");}// 三:如果存在直接返回SysPost post = postMapper.selectPostById(postId);// 四:不存在则查询数据库判定数据中是否存在if (StringUtils.isNull(post)) {// 然后给控制写入redisredisTemplate.opsForValue().set(POST_KEY + postId, StringUtils.EMPTY,RedisConstants.THIRTY_MINUTES,TimeUnit.MINUTES);return null;}redisTemplate.opsForValue().set(POST_KEY + postId, JSON.toJSONString(post),RedisConstants.THIRTY_MINUTES,TimeUnit.MINUTES);// 五:如果存在则放到redis中,并返回return post;}

第五步:缓存雪崩

第六步:缓存击穿

2种方案:互斥锁方案和逻辑删除方案

方案对比:

第七种:利用互斥锁来解决岗位缓存击穿的问题

 /*** 通过岗位ID查询岗位信息** @param postId 岗位ID* @return 角色对象信息*/@Overridepublic SysPost selectPostById(Long postId) {// 缓存穿透解决方案// queryWithPost(postId);// 缓存击穿return queryWithMutex(postId);}
  /*** 缓存击穿问题* @param postId id* @return 返回值*/@SneakyThrowsprivate SysPost queryWithMutex(Long postId) {// 一:从redis中查询缓存是否存在String postInfo = redisTemplate.opsForValue().get(POST_KEY + postId);// 二:判定是否存在if (StringUtils.isNotEmpty(postInfo)) {// 转换为beanSysPost sysPost = JSON.parseObject(postInfo, SysPost.class);return sysPost;}// 这边还有点绕,不是空的,直接返回数据,但是如果不是null说明里面是空字符串就直接返回错误信息if (StringUtils.isNotNull(postInfo)) {throw new ServiceException("数据不存在");}// 尝试获取互斥锁String lockKey = "lock:post:" + postId;// 如果失败了,说明可能其他线程在获取取,所以需要休眠一下Boolean lock = getLock(lockKey);if (!lock) {Thread.sleep(NUMBER_1000);// 递归 在此查询,如果有数据,直接返回return queryWithMutex(postId);}// 三:如果存在直接返回SysPost post = postMapper.selectPostById(postId);// 四:不存在则查询数据库判定数据中是否存在if (StringUtils.isNull(post)) {// 然后给控制写入redisredisTemplate.opsForValue().set(POST_KEY + postId, StringUtils.EMPTY,THIRTY_MINUTES,TimeUnit.MINUTES);return null;}redisTemplate.opsForValue().set(POST_KEY + postId, JSON.toJSONString(post),THIRTY_MINUTES,TimeUnit.MINUTES);// 五:如果存在则放到redis中,并返回// 释放锁deleteLock(lockKey);return post;}
/*** 获取锁** @param key 值* @return 成功失败*/private Boolean getLock(String key) {return redisTemplate.opsForValue().setIfAbsent(key, String.valueOf(UUID.randomUUID()), THIRTY_MINUTES, TimeUnit.SECONDS);}/*** 是否锁** @param key 值* @return 成功失败*/private Boolean deleteLock(String key) {return redisTemplate.delete(key);}

第八种:利用逻辑处理处理岗位缓存击穿问题

这种方案感觉不太好,保证不了数据一致性。

相关文章:

Redis的string类型使用

第一步&#xff1a;添加缓存 以若依岗位代码为例 一&#xff1a;首先从redis中查询岗位信息&#xff0c;如果查询到了则直接返回。 二&#xff1a;如果redis中没有数据&#xff0c;则直接从数据库中查询。查询后放到redis并返回 package com.ruoyi.system.service.impl;imp…...

AIGC架构与原理

AIGC&#xff08;AI Generated Content&#xff0c;人工智能生成内容&#xff09;的架构与原理 AIGC通过整合数据采集、模型训练、推理服务等模块&#xff0c;结合深度学习与生成对抗网络&#xff08;GAN&#xff09;等技术&#xff0c;实现从数据到内容的自动化生成。 一、AIG…...

安全复健|windows常见取证工具

写在前面&#xff1a; 此博客仅用于记录个人学习内容&#xff0c;学识浅薄&#xff0c;若有错误观点欢迎评论区指出。欢迎各位前来交流。&#xff08;部分材料来源网络&#xff0c;若有侵权&#xff0c;立即删除&#xff09; 取证 01系统运行数据 使用工具&#xff1a;Live-F…...

Oracle EBS R12.2 汉化

一、前言 在使用oracle ebs时&#xff0c;使用中文会更好的理解整个ebs流程&#xff0c;以下介绍oracle r12中文补丁的方式 如果你的系统除了支持英语外&#xff0c;还支持其他语言&#xff0c;比如中文&#xff0c;那你在下载补丁的时候除了下载Generic Platform版本外&#…...

【Java面试笔记:基础】12.Java有几种文件拷贝方式?哪一种最高效?

在 Java 中,文件拷贝可以通过多种方式实现,不同方式的性能和适用场景有所差异。 1. Java 文件拷贝方式 传统 IO 方式 使用 FileInputStream 和 FileOutputStream,通过循环读取和写入数据实现文件拷贝。 示例代码: try (InputStream is = new FileInputStream("sou…...

互联网大厂Java面试:RocketMQ、RabbitMQ与Kafka的深度解析

互联网大厂Java面试&#xff1a;RocketMQ、RabbitMQ与Kafka的深度解析 面试场景 面试官&#xff1a;马架构&#xff0c;您好&#xff01;欢迎参加我们的面试。今天我们将围绕消息中间件展开讨论&#xff0c;尤其是RocketMQ、RabbitMQ和Kafka。您有十年的Java研发和架构设计经…...

kali安装切换jdk1.8.0_451java8详细教程

kali安装切换jdk1.8.0_451java8详细教程 下载链接&#xff1a; jdk-8u451-linux-i586.tar.gz 链接: https://pan.baidu.com/s/1lpgI0JMfHpZ__RxsF8UoBw?pwdx3z2 提取码: x3z2 解压jdk 首先将下载好的压缩包放在kali虚拟机中&#xff0c;一般是直接拖到桌面 然后cd到压缩包…...

众趣科技X世界读书日丨数字孪生技术赋能图书馆空间智慧化运营

4月23日&#xff0c;是第30个“世界读书日”&#xff0c;不仅是庆祝阅读的日子&#xff0c;更是思考知识传播未来的契机。 图书馆作为主要传播图书的场所&#xff0c;在科技的发展中&#xff0c;图书馆正面临前所未有的挑战&#xff0c;联合国数据显示&#xff0c;全球近30%的…...

Python内置函数-aiter()

Python内置函数 aiter() 用于获取异步可迭代对象的异步迭代器&#xff0c;是异步编程中的核心工具之一。 1. 基本概念 异步可迭代对象&#xff1a;实现了 __aiter__() 和 __anext__() 方法的对象&#xff0c;支持 async for 循环。 异步迭代器&#xff1a;通过 aiter() 获取的…...

Java 实现单链表翻转(附详细注释)

1. 引言 单链表&#xff08;Singly Linked List&#xff09;是一种常见的数据结构&#xff0c;在算法和数据结构的学习中占有重要地位。翻转单链表是一道经典的面试题&#xff0c;本文将介绍几种常见的 Java 实现方法&#xff0c;并详细讲解关键步骤的含义。 2. 单链表定义 …...

基于HPC的气候模拟GPU加速实践全流程解析

基于HPC的气候模拟GPU加速实践全流程解析 关键词&#xff1a;气候模型、GPU加速、CUDA编程、性能优化、分布式训练 摘要&#xff1a; 本文针对全球气候模拟中10^12级网格点实时计算需求&#xff0c;提出基于CUDA的并行计算架构。通过改进WRF模式的分块矩阵乘法算法&#xff0c…...

【初级】前端开发工程师面试100题(一)

本题库共计包含100题,考察html,css,js,以及react,vue,webpack等基础知识掌握情况。 HTML基础篇 说说你对HTML语义化的理解? 语义化就是用合适的标签表达合适的内容,比如<header>表示页眉,<nav>表示导航。这样不仅代码更清晰,对SEO也友好,屏幕阅读器也能…...

大模型框架技术演进与全栈实践指南

‌一、大模型框架概述 ‌大模型框架‌是支撑大规模语言模型&#xff08;LLM&#xff09;训练、推理和应用开发的核心技术体系&#xff0c;涵盖分布式训练、高效推理、应用编排等全流程。从AlphaGo到GPT-4&#xff0c;大模型框架的进化推动AI从实验室走向工业化落地。据IDC预测…...

【Bug】 [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed

当你在进行深度学习相关操作时&#xff0c;若因缺少本地的 CA 证书而无法下载资源&#xff0c;下面为你介绍几种解决办法&#xff1a; 方法一&#xff1a;更新 CA 证书 在大多数 Linux 发行版中&#xff0c;你可以使用包管理器来更新 CA 证书。例如&#xff0c;在基于 Debian…...

第七章:Workspace Security

Chapter 7: Workspace Security 从变形金刚到安全防护罩&#xff1a;如何为代理设置权限边界&#xff1f; 在上一章多后端配置&#xff0c;我们学会了让代理像变形金刚一样切换不同环境。但就像超级英雄需要遵守法律一样&#xff0c;代理也需要一个“安全防护罩”来限制它的操…...

【论文阅读】Hierarchical Group-Level Emotion Recognition

【论文阅读】Hierarchical Group-Level Emotion Recognition 摘要1.介绍2.相关工作3.方法4.实验5.分析 摘要 本篇博客参考IEEE于2021年收录的论文Hierarchical Group-Level Emotion Recognition&#xff0c;对其主要内容进行总结&#xff0c;以便加深理解和记忆 1.介绍 1&am…...

(2025最新版)CUDA安装及环境配置

CUDA安装 文章目录 CUDA安装检查本地环境下载CUDA安装包CUDA安装检查是否安装成功 学习深度学习的小伙伴在配置环境的时候必不可少的一件事就是安装CUDA&#xff0c;在这个过程中也是容易踩很多坑&#xff0c;所以这里写一篇教程来帮助新入门的小伙伴快速安装CUDA&#xff0c;减…...

ODC 4.3.4 发布:三大核心功能升级,打造更好的数据开发体验

ODC 是OceanBase提供的企业级数据库协同开发平台&#xff0c;提供了团队协作开发的基础框架&#xff0c;和14种工单任务类型。此次升级的 ODC 4.3.4版本&#xff0c;重点优化了30余项功能&#xff0c;主要聚焦快速上手、配置管理和核心功能中的改进&#xff0c;来为用户打造更高…...

JavaFX 第一篇 Hello World

1、简介 JavaFX 是一个用于构建客户端应用程序的 Java 库&#xff0c;作为 Java 标准库的一部分&#xff08;JDK 8 到 10&#xff09;&#xff0c;从 JDK 11 开始&#xff0c;JavaFX 将以独立模块发布&#xff0c;将不再包含在 JDK标准库中&#xff0c;他是 Java 应用程序开发的…...

es的range失效

es的range失效的解决方法 问题描述 当我们es使用keyword类型存储数字时&#xff0c;当我们使用range时我们发现range失效的问题&#xff0c;例如以下的用例&#xff1a; 我们创建一个test1的索引test1&#xff1a; 使用_bulk进行批量导入数据&#xff1a; 进行查询我们发现我…...

gem5-gpu教程03 当前的gem5-gpu软件架构(因为涉及太多专业名词不知道该如何翻译所以没有汉化)

Current gem5-gpu Software Architecture 这是当前gem5-gpu软件架构的示意图。 CudaCore (src/gpu/gpgpu-sim/cuda_core.*, src/gpu/gpgpu-sim/CudaCore.py) Wrapper for GPGPU-Sim shader_core_ctx (gpgpu-sim/gpgpu-sim/shader.h) Sends instruction, global and const m…...

【C++】vector扩容缩容

vector扩容缩容 1 扩容 一般来说&#xff0c;主要是重新分配内存 2 缩容 resize 缩小后&#xff0c;vector 的容量&#xff08;capacity()&#xff09;可能保持不变&#xff0c;需要显式调用 shrink_to_fit() 来释放内存。 验证代码&#xff1a; #include <vector>…...

【鸿蒙HarmonyOS】深入理解router与Navigation

5. 路由 1.页面路由(router模式&#xff09; 1.概述 页面路由指的是在应用程序中实现不同页面之间的跳转&#xff0c;以及数据传递。 我们先明确自定义组件和页面的关系&#xff1a; 自定义组件&#xff1a;Component 装饰的UI单元&#xff0c;页面&#xff1a;即应用的UI…...

手机端touch实现DOM拖拉功能

touch实现DOM拖拉功能 1、面板交互流程图 [ 用户触摸拖动手柄 ]↓ [ 记录起始位置、偏移量 ]↓ [ 实时更新面板 translateY ]↓ [ 手指松开 → 判断释放位置 ]↓ [ 达到恢复条件&#xff1f; → 复位 ]2、详细实现步骤 2.1 初始面板位置 const initialPosition () > tr…...

Discuz!与DeepSeek的AI融合:打造智能网址导航新体验——以“虎跃办公”为例

在数字化办公需求日益增长的今天&#xff0c;高效获取优质资源成为职场人士的核心痛点。传统网址导航网站往往面临信息过载、个性化不足、交互体验单一等问题&#xff0c;难以满足用户精准触达目标资源的需求。本文将深入剖析“虎跃办公”这一基于Discuz!系统构建的网址导航网站…...

【AI】Windows环境安装SPAR3D单图三维重建心得

效果一览 左图为原始单个图像&#xff0c;右图为通过SPAR3D重建后的三维建模&#xff0c;可以看出效果还是不错的。 本地环境配置 系统&#xff1a;Windows 11 专业版CPU&#xff1a;i5-13400F内存&#xff1a;32GBGPU&#xff1a;RTX3060 12GBcuda&#xff1a;11.8conda&…...

关于Agent的简单构建和分享

前言&#xff1a;Agent 具备自主性、环境感知能力和决策执行能力&#xff0c;能够根据环境的变化自动调整行为&#xff0c;以实现特定的目标。 一、Agent 的原理 Agent(智能体)被提出时&#xff0c;具有四大能力 感知、分析、决策和执行。是一种能够在特定环境中自主行动、感…...

【C/S通信仿真】

文章目录 一、实验背景与目的二、实验设计与实现思路1. 设计思想2. 核心代码实现 总结 一、实验背景与目的 在网络编程中&#xff0c;TCP 协议是实现可靠通信的核心。本次实验基于 Windows 平台&#xff0c;使用 WinSock2 库实现客户端与服务器的双向数据传递&#xff0c;模拟…...

Tomcat 8 启动闪退解决方案:版本差异与调试技巧详解

在使用 Tomcat 8 时&#xff0c;启动闪退是常见问题&#xff0c;核心原因多与 JAVA_HOME 环境变量配置、版本特性及启动脚本逻辑相关。本文结合官方文档与专家实践&#xff0c;提供分版本解决方案及调试技巧&#xff0c;适用于开发与运维场景。 一、核心问题&#xff1a;JAVA_…...

【Project】基于spark-App端口懂车帝数据采集与可视化

文章目录 hadoop完全分布式部署hdfs-site.xmlcore-site.xmlmarpred-site.xmlyarn-site.xml spark集群部署spark-env.sh mongodb分片模式部署config 服务器初始化config 副本集 shard 服务器初始化shard 副本集 mongos服务器添加shard设置chunk大小 启动分片为集合 user 创建索引…...

基于ARM+FPGA+DSP的储能协调控制器解决方案,支持国产化

储能协调控制器的作用与设计方案 一、‌核心作用‌ ‌实时监测与协调控制‌ 实时采集储能系统电压、电流、温度等参数&#xff0c;监测电池电量状态及充放电功率&#xff0c;动态调整储能与电网、负载的功率交互&#xff0c;保障能源供需平衡15。支持一次调频&#xff08;AGC&a…...

将天气查询API封装为MCP服务

下面我将展示如何将一个天气查询API封装为符合MCP协议的服务。我们将使用Python实现&#xff0c;包括服务端和客户端。 ## 1. 服务端实现 python # weather_mcp_server.py from fastapi import FastAPI, HTTPException from pydantic import BaseModel from typing import Di…...

JSON实现动态按钮管理的Python应用

在开发桌面应用程序时&#xff0c;动态生成用户界面元素并根据配置文件灵活管理是一项常见需求。本文将介绍如何使用Python的wxPython库结合JSON配置文件&#xff0c;开发一个支持动态按钮创建、文件执行和配置管理的桌面应用程序。该应用允许用户通过设置界面配置按钮名称和关…...

基于GA遗传优化TCN-BiGRU注意力机制网络模型的时间序列预测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2024b&#xff08;提供软件版本下载&#xff09; 3.部分核心程序 &#xff08;完整版代码包…...

MongoDB(docker版)备份还原

docker启动MongoDB docker run -d -p 27017:27017 --name my-mongo -v /mongodb/db:/data/db mongo备份MongoDB 使用mongodump备份数据库时&#xff0c;默认会将备份数据保存在当前工作目录下的dump文件夹中。 docker容器中默认备份在当前工作目录&#xff0c;所以此处指定当…...

[蓝桥杯 2025 省 Python B] 异或和

暴力&#xff08;O(n^2)&#xff09;&#xff1a; def xor_sum(n, arr):total 0for i in range(n):for j in range(i 1, n):total (arr[i] ^ arr[j]) * (j - i)return total# 主函数 if __name__ "__main__":n int(input())arr list(map(int, input().split()…...

HTTP代理基础:网络新手的入门指南

目录 一、为什么需要了解HTTP代理&#xff1f; 二、HTTP代理的“中间人”角色 三、代理的三大核心类型 四、HTTP代理的5大实用场景 五、设置代理的三种方式 六、代理的优缺点分析 七、如何选择代理服务&#xff1f; 八、安全使用指南 九、未来趋势 结语 一、为什么需要…...

GRE 多层级网络数据处理系统

​ 一、整体架构​ 多层级网络数据处理系统&#xff0c;从底层硬件中断到上层协议处理&#xff0c;涵盖了数据包的接收、转发、解封装、路由决策和发送全流程。系统采用分层处理和模块化设计&#xff0c;结合了传统Linux网络协议栈与快速路径&#xff08;Fast Path&#xff0…...

展望未来,楼宇自控系统如何全方位推动绿色建筑智能高效发展

在全球积极践行可持续发展理念的时代背景下&#xff0c;绿色建筑已成为建筑行业发展的必然趋势。绿色建筑追求在全生命周期内&#xff0c;最大限度地节约资源、保护环境和减少污染&#xff0c;为人们提供健康、舒适、高效的使用空间。而楼宇自控系统作为建筑智能化的核心技术&a…...

【计算机视觉】CV项目实战- Florence-SAM 多模态视觉目标检测+图像分割

Florence-SAM多模态视觉分析系统&#xff1a;技术解析与实战指南 一、项目架构与技术解析1.1 核心模型架构1.2 支持的任务模式 二、环境配置与部署实战2.1 本地部署指南2.2 运行演示系统 三、核心功能实战解析3.1 图像开放词汇检测3.2 视频目标跟踪 四、高级应用与二次开发4.1 …...

2025-04-23 Python深度学习3——Tensor

文章目录 1 张量1.1 数学定义1.2 PyTorch中的张量 2 创建 Tensor2.1 直接创建**torch.tensor()****torch.from_numpy()** 2.2 依据数值创建**torch.zeros() / torch.zeros_like()****torch.ones() / torch.ones_like()****torch.full() / torch.full_like()****torch.arange() …...

ZYNQ笔记(十三):双核 AMP 通信实验

版本&#xff1a;Vivado2020.2&#xff08;Vitis&#xff09; ZYNQ 裸机双核 AMP 实验&#xff1a; CPU0 接收串口的数据&#xff0c;并写入 OCM 中&#xff0c;然后利用软件产生中断触发 CPU1&#xff1b;CPU1 接收到中断后&#xff0c;根据从 OCM 中读出的数据控制呼吸灯的频…...

黑马Java基础笔记-3

短路逻辑运算符与逻辑运算符 逻辑运算符 符号作用说明&逻辑与&#xff08;且&#xff09;并且&#xff0c;两边都为真&#xff0c;结果才是真|逻辑或或者&#xff0c;两边都为假&#xff0c;结果才是假^逻辑异或相同为 false&#xff0c;不同为 true!逻辑非取反 短路逻辑…...

4.23学习总结

虽然之前写过的相关dfs和bfs的题&#xff0c;但方法忘的差不多了&#xff0c;重写了一遍相关的算法题&#xff0c;今天完成了岛屿数量的算法题&#xff0c;我利用的是bfs的算法&#xff0c;遍历每个结点&#xff0c;如果是1就count,然后再bfs向四周遍历并标记已经走过 初步看了…...

ElasticSearch:高并发场景下如何保证读写一致性?

在Elasticsearch高并发场景下&#xff0c;可以通过以下多种方式来保证读写一致性&#xff1a; 等待主分片和副本分片都确认&#xff08;类似半同步机制&#xff09; 设置consistency参数&#xff1a;在写操作时&#xff0c;可以设置consistency参数来控制写操作的一致性级别。…...

Qt基础007(Tcp网络编程)

文章目录 QTcp服务器的关键流程QTtcp客户端的关键流程TCP协议Socket QTcp服务器的关键流程 工程建立&#xff0c;需要在.pro加入网络权限 创建一个基于 QTcpServer 的服务端涉及以下关键步骤&#xff1a; 创建并初始化 QTcpServer 实例&#xff1a; 实例化 QTcpServer 。 调…...

visio导出的图片过大导致latex格式转成pdf之后很不清楚

联想电脑解决方法 右键打开方式选择【照片】&#xff0c;然后选择调整图片大小&#xff0c;将像素的宽度和高度调低。...

leetcode刷题——判断对称二叉树(C语言版)

题目描述&#xff1a; 示例 1&#xff1a; 输入&#xff1a;root [6,7,7,8,9,9,8] 输出&#xff1a;true 解释&#xff1a;从图中可看出树是轴对称的。 示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false 解释&#xff1a;从图中可看出最…...

STM32与i.MX6ULL内存与存储机制全解析:从微控制器到应用处理器的设计差异

最近做FreeRTos&#xff0c;以及前面设计的RVOS&#xff0c;这种RTOS级别的系统内存上的分布与CortexA系列里面的分布有相当大的区别&#xff0c;给我搞糊涂了。 目录 STM32&#xff08;Cortex-M系列&#xff09;的内存与存储机制 Flash存储内容RAM存储内容启动与运行时流程示例…...

经验分享-上传ios的ipa文件

.ipa格式的二进制文件&#xff0c;是打包后生成的文件&#xff0c;无论我们是放上去testflight测试还是正式上传到app store&#xff0c;都需要先上传到苹果开发者中心的app store connect上的构建版本上。 在app store connect上&#xff0c;上传构建版本的功能&#xff0c;它…...