浏览器书签智能分类
浏览器书签智能分类工具
最近发现浏览器的书签越来越乱了,主要是因为自己太懒,其次之前建的分类太多又乱,重新手动整理确实比较烦。因此有了这个小项目。借助智谱AI的力量对书签进行重新分类。
项目简介
本工具用于自动整理浏览器书签,通过AI智能分类技术,将杂乱的书签按照主题自动归类,并且重新生成结构化的书签文件。
功能特性
- 自动提取书签信息
- 智能分类书签内容
- 分类智能生成
- 生成HTML格式书签文件,可直接导入浏览器
- 自动清理临时文件
使用说明
准备工作
- 获取智谱AI API密钥
- 准备浏览器导出的书签HTML文件
快速开始
- 下载脚本
- 修改
CONFIG
配置中的INPUT_FILE
和OUTPUT_FILE
- 修改
CONFIG
配置中的API_KEY - 运行脚本:
python 浏览器书签文件重新分类.py
- 查看生成的分类结果文件
bookmarks.html
配置文件说明
在脚本开头的CONFIG
字典中可配置以下参数:
API_KEY
: 智谱AI API密钥(必填)INPUT_FILE
: 输入的书签HTML文件路径EXTRACTED_FILE
: 提取的临时文件路径CLASSIFIED_FILE
: 分类结果Markdown文件路径OUTPUT_FILE
: 最终输出的HTML书签文件路径DEFAULT_CATEGORIES
: 默认分类列表
代码结构
# 主要功能模块
1. 配置参数 (CONFIG)
2. AI客户端初始化 (zhipu_client)
3. 书签提取 (extract_bookmark_info)
4. 书签分类 (classify_bookmark)
5. 分类创建 (create_new_category)
6. 格式转换 (md_to_netscape)
7. 文件清理 (cleanup_temp_files)
脚本代码详细说明
浏览器书签文件重新分类脚本详细说明
1. 配置参数
CONFIG = {'API_KEY': "9e2458a8acf46274d1c1b9418eec500c.oBojpibVHt3IyXnz", # 智谱API密钥,必填'INPUT_FILE': 'bookmarks_2025_1_3.html', # 输入文件,必填'EXTRACTED_FILE': 'extracted_bookmarks.txt', # 提取的临时文件'CLASSIFIED_FILE': 'classified_bookmarks.md', # 分类结果文件'OUTPUT_FILE': 'bookmarks.html', # 最终输出文件'DEFAULT_CATEGORIES': [ # 默认分类'编程语言','人工智能', '数据科学',]
}
- API_KEY: 用于调用智谱AI API的密钥。
- INPUT_FILE: 输入的HTML格式浏览器书签文件路径。
- EXTRACTED_FILE: 提取的书签信息保存为文本文件的路径。
- CLASSIFIED_FILE: 分类后的书签信息保存为Markdown文件的路径。
- OUTPUT_FILE: 最终生成的HTML格式书签文件路径。
- DEFAULT_CATEGORIES: 预定义的默认分类列表。
2. 初始化客户端
zhipu_client = ZhipuAI(api_key=CONFIG['API_KEY'])
- 使用提供的API密钥初始化智谱AI客户端,用于后续与AI模型交互。
3. 获取AI响应
def get_llm_response(sysPrompt, questionPrompt):response = zhipu_client.chat.completions.create(model="GLM-4-Plus", # 填写需要调用的模型编码messages=[{"role": "user", "content": sysPrompt},{"role": "assistant", "content": "你好,请告诉我你需要分类的书签?"},{"role": "user", "content": questionPrompt},],)return response.choices[0].message.content
- 定义一个函数
get_llm_response
,用于向AI模型发送系统提示和用户问题,并返回模型的响应内容。
4. 读取并解析HTML文件
with open(CONFIG['INPUT_FILE'], 'r', encoding='utf-8') as file:html_content = file.read()soup = BeautifulSoup(html_content, 'html.parser')
bookmarks = soup.find_all('a')bookmark_info = []
for bookmark in bookmarks:href = bookmark.get('href')add_date = bookmark.get('add_date')icon = bookmark.get('icon')text = bookmark.text.strip().replace('\n', '').replace('\t', '').replace('\r', '').replace(' ', '')bookmark_info.append({'URL': href,'Text': text})with open(CONFIG['EXTRACTED_FILE'], 'w', encoding='utf-8') as f:for info in bookmark_info:f.write(f"Name: {info['Text']}, URL: {info['URL']}\n")
- 读取输入的HTML书签文件内容。
- 使用BeautifulSoup解析HTML,提取所有的
<a>
标签作为书签。 - 将每个书签的URL和名称保存到
bookmark_info
列表中。 - 将提取的书签信息保存到临时文件
EXTRACTED_FILE
中。
5. 分类书签
def extract_bookmark_info(line):name_match = re.search(r'Name: ([^,]+)', line)url_match = re.search(r'URL: (https?://[^\s]+)', line)if not name_match or not url_match:return None, Nonereturn name_match.group(1), url_match.group(1)def classify_bookmark(bookmark_name, bookmark_url, categories):system_prompt = ("你是一个智能助手,任务是根据提供的书签名称和URL从给定的分类列表中选择最合适的分类返回给用户。仅返回分类名称。\n""请根据书签的内容和性质选择最适合的分类。如果没有合适的分类,请回答'无法分类'。\n""给定分类: {categories_str}\n""请选择最合适的分类。\n""示例:""user: 书签名称:Python官方文档\n""书签URL:https://docs.python.org/3/\n""assistant: 编程语言\n").format(categories_str=", ".join(categories))user_prompt = ("书签名称: {bookmark_name}\n""书签URL: {bookmark_url}\n").format(bookmark_name=bookmark_name, bookmark_url=bookmark_url)try:response = get_llm_response(system_prompt, user_prompt)except Exception as e:response = "其他"if response == "无法分类":return Nonereturn responsedef create_new_category(name, url):system_prompt = ("你是一个智能助手,任务是根据提供的书签名称和URL给定一个合适的书签分类。仅返回分类名称。\n""请根据书签的内容和性质给定分类。\n""示例:""user: 书签名称:Python官方文档\n""书签URL:https://docs.python.org/3/\n""assistant: 编程语言\n")user_prompt = ("书签名称: {name}\n""书签URL: {url}\n").format(name=name, url=url)response = get_llm_response(system_prompt, user_prompt)return response
extract_bookmark_info
: 从临时文件中每行提取书签名称和URL。classify_bookmark
: 根据书签名称和URL,使用AI模型从预定义分类中选择最合适的分类。如果无法分类,则返回None
。create_new_category
: 如果书签无法归入现有分类,则创建新分类。
6. 处理书签分类
categories = CONFIG['DEFAULT_CATEGORIES']with open(CONFIG['EXTRACTED_FILE'], 'r', encoding='utf-8') as f:bookmarks = f.readlines()classified = defaultdict(list)
for line in bookmarks:if not line.strip():continuename, url = extract_bookmark_info(line)if not name or not url:continuecategory = classify_bookmark(name, url, categories)if not category:category = create_new_category(name, url)categories.append(category)print(f'分类书签: {name} -> {category}')classified[category].append(line)with open(CONFIG['CLASSIFIED_FILE'], 'w', encoding='utf-8') as f:f.write('# 书签\n\n')for category, items in classified.items():f.write(f'## {category}\n')for item in items:name, url = extract_bookmark_info(item)if name and url:f.write(f'- [{name}]({url})\n')f.write('\n')
- 从临时文件中读取所有书签信息。
- 对每个书签进行分类,如果无法归入现有分类则创建新分类。
- 将分类结果保存到Markdown文件
CLASSIFIED_FILE
中。
7. 将分类结果转换为HTML书签文件
def md_to_netscape(md_content):html = '''<!DOCTYPE NETSCAPE-Bookmark-file-1><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8"><TITLE>Bookmarks</TITLE><H1>Bookmarks</H1><DL><p>'''lines = md_content.split('\n')stack = []current_level = 0for line in lines:if line.startswith('#'):level = line.count('#')title = line.lstrip('#').strip()while stack and stack[-1] >= level:html += '</DL><p>\n'stack.pop()html += f' <DT><H3 ADD_DATE="{int(datetime.now().timestamp())}" LAST_MODIFIED="{int(datetime.now().timestamp())}">{title}</H3>\n'html += ' <DL><p>\n'stack.append(level)current_level = levelelif line.startswith('-'):match = re.match(r'-\s*\[(.*?)\]\((.*?)\)', line)if match:name, url = match.groups()html += f' <DT><A HREF="{url}" ADD_DATE="{int(datetime.now().timestamp())}">{name}</A>\n'while stack:html += '</DL><p>\n'stack.pop()return htmlwith open(CONFIG['CLASSIFIED_FILE'], 'r', encoding='utf-8') as f:md_content = f.read()html_content = md_to_netscape(md_content)with open(CONFIG['OUTPUT_FILE'], 'w', encoding='utf-8') as f:f.write(html_content)
- 定义
md_to_netscape
函数,将Markdown格式的分类结果转换为Netscape Bookmark HTML格式。 - 读取分类结果文件
CLASSIFIED_FILE
,将其转换为HTML格式并保存到OUTPUT_FILE
。
8. 清理临时文件
def cleanup_temp_files():temp_files = [CONFIG['EXTRACTED_FILE'],CONFIG['CLASSIFIED_FILE']]for file in temp_files:if os.path.exists(file):os.remove(file)print(f"已删除临时文件: {file}")if __name__ == '__main__':try:# 主逻辑代码...cleanup_temp_files()print("脚本执行完成,临时文件已清理")except Exception as e:print(f"脚本执行出错: {str(e)}")
- 定义
cleanup_temp_files
函数,清理脚本运行过程中产生的临时文件。 - 在主程序执行完成后调用此函数,确保临时文件被删除。
总结
该脚本通过以下步骤实现了对浏览器书签文件的重新分类:
- 读取和解析:从HTML文件中提取书签信息。
- 分类:使用AI模型对书签进行分类,必要时创建新分类。
- 保存结果:将分类结果保存为Markdown文件。
- 转换格式:将Markdown格式的分类结果转换为HTML格式。
- 清理:删除临时文件以保持工作环境整洁。
这个过程不仅简化了书签管理,还利用AI技术提高了分类的准确性和效率。
注意事项
- 确保API密钥有效
- 输入文件格式需为标准Netscape书签格式
- 分类结果可能受AI模型影响,建议人工复核
- 脚本运行后会清理临时文件,请及时保存结果
完整代码
# 浏览器书签文件重新分类.pyfrom zhipuai import ZhipuAI
from bs4 import BeautifulSoup
import re
import os
from collections import defaultdict
from datetime import datetime# 配置参数
CONFIG = {'API_KEY': "my-secret-key", # 智谱API密钥,必填'INPUT_FILE': 'bookmarks_2025_1_3.html', # 输入文件,必填'EXTRACTED_FILE': 'extracted_bookmarks.txt', # 提取的临时文件'CLASSIFIED_FILE': 'classified_bookmarks.md', # 分类结果文件'OUTPUT_FILE': 'bookmarks.html', # 最终输出文件'DEFAULT_CATEGORIES': [ # 默认分类'编程语言',#这个被用到给AI举例,不能删除'人工智能', '数据科学',]
}# 初始化客户端
zhipu_client = ZhipuAI(api_key=CONFIG['API_KEY'])def get_llm_response(sysPrompt, questionPrompt):response = zhipu_client.chat.completions.create(model="GLM-4-Plus", # 填写需要调用的模型编码messages = [{"role": "user", "content": sysPrompt},{"role": "assistant", "content": "你好,请告诉我你需要分类的书签?"},{"role": "user", "content": questionPrompt},],)return response.choices[0].message.content# 读取HTML文件内容
with open(CONFIG['INPUT_FILE'], 'r', encoding='utf-8') as file:html_content = file.read()# 使用BeautifulSoup解析HTML
soup = BeautifulSoup(html_content, 'html.parser')# 查找所有的<A>标签
bookmarks = soup.find_all('a')# 提取书签信息
bookmark_info = []
for bookmark in bookmarks:href = bookmark.get('href')add_date = bookmark.get('add_date')icon = bookmark.get('icon')text = bookmark.text.strip().replace('\n', '').replace('\t', '').replace('\r', '').replace(' ', '')bookmark_info.append({'URL': href,'Text': text})# 打印提取的书签信息
for info in bookmark_info:print(info)# 保存提取的书签信息with open(CONFIG['EXTRACTED_FILE'], 'w', encoding='utf-8') as f:for info in bookmark_info:f.write(f"Name: {info['Text']}, URL: {info['URL']}\n")def extract_bookmark_info(line):"""从书签行中提取名称和URL"""name_match = re.search(r'Name: ([^,]+)', line)url_match = re.search(r'URL: (https?://[^\s]+)', line)if not name_match or not url_match:return None, Nonereturn name_match.group(1), url_match.group(1)def classify_bookmark(bookmark_name, bookmark_url, categories):system_prompt = ("你是一个智能助手,任务是根据提供的书签名称和URL从给定的分类列表中选择最合适的分类返回给用户。仅返回分类名称。\n""请根据书签的内容和性质选择最适合的分类。如果没有合适的分类,请回答'无法分类'。\n""给定分类: {categories_str}\n""请选择最合适的分类。\n""示例:""user: 书签名称:Python官方文档\n""书签URL:https://docs.python.org/3/\n""assistant: 编程语言\n").format(categories_str=", ".join(categories))user_prompt = ("书签名称: {bookmark_name}\n""书签URL: {bookmark_url}\n").format(bookmark_name=bookmark_name, bookmark_url=bookmark_url)try:response = get_llm_response(system_prompt, user_prompt)except Exception as e:response = "其他"if response == "无法分类":return Nonereturn responsedef create_new_category(name, url):"""创建新分类:param name: 书签名称:param url: 书签URL:return: 新分类名"""system_prompt = ("你是一个智能助手,任务是根据提供的书签名称和URL给定一个合适的书签分类。仅返回分类名称。\n""请根据书签的内容和性质给定分类。\n""示例:""user: 书签名称:Python官方文档\n""书签URL:https://docs.python.org/3/\n""assistant: 编程语言\n")user_prompt = ("书签名称: {name}\n""书签URL: {url}\n").format(name=name, url=url)response = get_llm_response(system_prompt, user_prompt)return response# 使用配置中的分类规则
categories = CONFIG['DEFAULT_CATEGORIES']with open(CONFIG['EXTRACTED_FILE'], 'r', encoding='utf-8') as f:bookmarks = f.readlines()classified = defaultdict(list)
for line in bookmarks:if not line.strip():continuename, url = extract_bookmark_info(line)if not name or not url:continue# 分类书签category = classify_bookmark(name, url, categories)if not category:# 创建新分类category = create_new_category(name, url)categories.append(category)print(f'分类书签: {name} -> {category}')classified[category].append(line)# 将分类结果保存为文件
with open(CONFIG['CLASSIFIED_FILE'], 'w', encoding='utf-8') as f:f.write('# 书签\n\n')for category, items in classified.items():f.write(f'## {category}\n')for item in items:name, url = extract_bookmark_info(item)if name and url:f.write(f'- [{name}]({url})\n')f.write('\n')from datetime import datetime
# 将分类结果重新转为HTML书签文件
def md_to_netscape(md_content):# 初始化HTML结构html = '''<!DOCTYPE NETSCAPE-Bookmark-file-1><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8"><TITLE>Bookmarks</TITLE><H1>Bookmarks</H1><DL><p>'''# 解析MD内容lines = md_content.split('\n')stack = []current_level = 0for line in lines:# 处理标题if line.startswith('#'):level = line.count('#')title = line.lstrip('#').strip()# 关闭之前的DLwhile stack and stack[-1] >= level:html += '</DL><p>\n'stack.pop()# 添加H3标签html += f' <DT><H3 ADD_DATE="{int(datetime.now().timestamp())}" LAST_MODIFIED="{int(datetime.now().timestamp())}">{title}</H3>\n'html += ' <DL><p>\n'stack.append(level)current_level = level# 处理链接elif line.startswith('-'):match = re.match(r'-\s*\[(.*?)\]\((.*?)\)', line)if match:name, url = match.groups()html += f' <DT><A HREF="{url}" ADD_DATE="{int(datetime.now().timestamp())}">{name}</A>\n'# 关闭所有打开的DLwhile stack:html += '</DL><p>\n'stack.pop()return htmlwith open(CONFIG['CLASSIFIED_FILE'], 'r', encoding='utf-8') as f:md_content = f.read()html_content = md_to_netscape(md_content)with open(CONFIG['OUTPUT_FILE'], 'w', encoding='utf-8') as f:f.write(html_content)# 清理临时文件
def cleanup_temp_files():"""清理脚本运行过程中产生的临时文件"""temp_files = [CONFIG['EXTRACTED_FILE'],CONFIG['CLASSIFIED_FILE']]for file in temp_files:if os.path.exists(file):os.remove(file)print(f"已删除临时文件: {file}")# 主程序执行
if __name__ == '__main__':try:# 原有主逻辑代码...# 脚本执行完成后清理临时文件cleanup_temp_files()print("脚本执行完成,临时文件已清理")except Exception as e:print(f"脚本执行出错: {str(e)}")
相关文章:
浏览器书签智能分类
浏览器书签智能分类工具 最近发现浏览器的书签越来越乱了,主要是因为自己太懒,其次之前建的分类太多又乱,重新手动整理确实比较烦。因此有了这个小项目。借助智谱AI的力量对书签进行重新分类。 项目简介 本工具用于自动整理浏览器书签&…...
通俗易懂的讲一下Vue的双向绑定和React的单向绑定
1.Vue 的双向绑定: <template><!-- 输入框和数据自动绑定,就像连体婴儿,一个动另一个也动 --><input v-model"message"><p>{{ message }}</p><!-- 完整表单示例 --><form><!-- 所有…...
Redis 深度解析:从入门到精通
引言 Redis 是一个开源的、高性能的键值存储系统,它支持多种数据结构,并且提供了丰富的功能和接口。作为内存数据库,Redis 以其快速的数据访问速度、灵活的数据模型以及持久化选项而闻名。本文将详细介绍 Redis 的核心概念、工作原理及其应用…...

基于物联网的冻保鲜运输智能控制系统
基于物联网的冻保鲜运输智能控制系统设计文档 1. 项目开发背景 随着全球化贸易的发展,冷链物流在现代运输行业中扮演着日益重要的角色。尤其是冻品、食品、药品等对运输环境有着严格要求的货物,其运输过程中温度、湿度等环境参数必须严格控制ÿ…...
【深度学习基础之多尺度特征提取】多尺度卷积神经网络(MS-CNN)是如何在深度学习网络中提取多尺度特征的?附代码(二)
【深度学习基础之多尺度特征提取】多尺度卷积神经网络(MS-CNN)是如何在深度学习网络中提取多尺度特征的?附代码(二) 【深度学习基础之多尺度特征提取】多尺度卷积神经网络(MS-CNN)是如何在深度…...

论文解读之learning to summarize with human feedback
最近在看大模型训练相关的论文,预计会追溯经典的和最新的训练策略以及微调原理等 本次解读经典论文learning to summarize with human feedback 一、简介 部分生成任务需要对齐人类偏好,但是根据最大化可能性(对数似然)进行微调…...

STM32学习(六 )
串口初始化IO引脚 串口的引脚在哪里 串口可以利用GPIO_InitTypeDef结构体和GPIO_Init()函数进行初始化 USART_InitTypeDef USART_InitStruct;//建立串口结构体USART_InitStruct.USART_BaudRate 115200;//波特率115200USART_InitStruct.USART_Mode US…...

基于 GitHub API 的 Issue 和 PR 自动化解决方案
文章目录 摘要引言优化 Issue 和 PR 管理的方法工具选择流程优化 自动化 Issue 和 PR 管理代码逻辑详解获取 Issue 数据为 Issue 添加标签将 Issue 分配给开发者主逻辑 实际运行效果进一步扩展QA 环节总结参考资料 摘要 在开源项目中,Issue 和 Pull Request&#x…...

56.在 Vue 3 中使用 OpenLayers 通过 moveend 事件获取地图左上和右下的坐标信息
前言 在现代 Web 开发中,地图应用越来越成为重要的组成部分。OpenLayers 是一个功能强大的 JavaScript 地图库,它提供了丰富的地图交互和操作功能,而 Vue 3 是当前流行的前端框架之一。在本篇文章中,我们将介绍如何在 Vue 3 中集…...

文件本地和OSS上传
这里写目录标题 前端传出文件后端本地存储阿里云OSS存储上传Demo实现上传ConfigurationProperties 前端传出文件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>上传文件</title> </head&g…...

elementui table 表格 分页多选,保持选中状态
elementui多选时分页,解决选中状态无法保留选中项问题: 在el-table标签中加入row-key,row-key的值取当前数据里的唯一key在el-table-column selection 项中加入以下:reserve-selection“true” 完成后,将需要清空的地方 ( 如返回…...
MSE+Range案例
MSE的demo实现思路:首先准备fmp4格式的视频地址或者切片,接着将MSE挂载到video上,创建createObjectURL转二进制数据,fetch请求在线地址,分段请求,监听这个数据流的获取状态,当这个ReadyState为o…...
C# 设计模式(结构型模式):代理模式
C# 设计模式(结构型模式):代理模式 在软件开发中,有时我们需要通过某种方式间接地访问一个对象,这时就可以使用代理模式(Proxy Pattern)。代理模式通过引入一个代理对象来控制对目标对象的访问…...

YOLO——pytorch与paddle实现YOLO
YOLO——pytorch与paddle实现YOLO 本文将深入探讨YOLO目标检测的理论基础,并通过PyTorch和PaddlePaddle两个深度学习框架来展示如何实现基础的YOLO模型。我们将首先介绍YOLO的基本概念,这些理论基础是理解和实现YOLO网络的基础。通过PyTorch和PaddlePad…...

持续大额亏损,销量增幅有限,北汽蓝谷依旧黯然神伤
撰稿 | 行星 来源 | 贝多财经 “起了个大早,赶了个晚集”,用在如今的北汽蓝谷身上再合适不过。 2025年的第一个工作日,北汽蓝谷新能源科技股份有限公司(SH:600733,简称“北汽蓝谷”)对外披露了子公司北京…...

C# OpenCV机器视觉:背景减除与前景分离
在实验室的一角,阳光仿若一个急性子的小精灵,迫不及待地穿过窗帘缝隙,在阿强的桌面上欢快跳跃,洒下一片片斑驳陆离的光影,似乎在催促着阿强赶紧开启今日的奇妙探索。阿强端坐在桌前,眼神炽热地盯着眼前那台…...
C语言return与 ? :
上次讲解过一次函数,函数要配合return返回东西,但是在编写一些程序的时候我发现了很多冷门逻辑语法还没有掌握,当时讲课也是看一眼就过去了(死去的记忆开始攻击我) Return,爽! 现在有一个小问…...

【论文阅读】SCGC : Self-supervised contrastive graph clustering
论文地址:SCGC : Self-supervised contrastive graph clustering - ScienceDirect 代码地址: https://github.com/gayanku/SCGC 摘要 图聚类旨在发现网络中的群体或社区。越来越多的模型使用自编码器(autoencoders)结合图神经网…...

python pyqt5+designer的信号槽和动态显示
至少需要两个文件,一个是python的主文件,一个是designer的UI文件 1.对UI文件的处理 首先需要将UI文件转化成python文件,并且引入到主文件中。 2.在主文件中接受UI上的一些动作和返回主文件处理的数据到UI界面上。 框中选中的部分,…...

版本控制系统Helix Core 2024.2增强功能:与OpenTelemetry协议集成、Delta同步和传输等
“Perforce团队非常高兴为您带来Helix Core 2024.2版本,它拥有众多旨在提高团队效率、优化工作流程的增强功能。通过新的Open Telemetry协议集成,团队现在可以轻松将结构化日志集成到可观测性平台中。DeltaTransfer现在也适用于同步操作——这是2024.1版…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...