Redis(四) - 使用Python操作Redis详解

文章目录

  • 前言
  • 一、下载Python插件
  • 二、创建项目
  • 三、安装 redis 库
  • 四、新建python软件包
  • 五、键操作
  • 六、字符串操作
  • 七、列表操作
  • 八、集合操作
  • 九、哈希表操作
  • 十、有序集合操作
  • 十一、完整代码
    • 1. 完整代码
    • 2. 项目下载


前言

本文是基于 Python 操作 Redis 数据库的实战指南,旨在通过分步教程与代码示例,帮助开发者掌握 Redis 常见数据类型(字符串、列表、集合、哈希表、有序集合)的操作方法。内容覆盖开发环境搭建、库安装、项目结构创建及核心功能代码实现,适合 Python 初学者及 Redis 入门开发者参考。


一、下载Python插件

打开设置菜单:首先,点击左上角的“文件”菜单,然后选择“设置”选项。这将打开一个新窗口,显示各种设置选项。
进入插件管理:在设置窗口左侧的导航栏中,找到并点击“插件”选项。这将带你进入插件管理页面。
搜索Python插件:在插件管理页面顶部的搜索框中输入“python”,然后按回车键进行搜索。这将列出与Python相关的所有插件。
选择Python插件:从搜索结果中找到名为“Python”的插件,并点击它。确保该插件旁边的复选框被勾选,表示已启用。
应用更改:完成上述步骤后,点击右下角的“应用(A)”按钮,然后点击“确定”按钮以保存更改并关闭设置窗口。

具体步骤如下图所示:

在这里插入图片描述


二、创建项目

项目创建是 Python 开发的起始点,规范且合理地创建项目有助于组织代码结构、管理项目资源。在开发与 Redis 交互的 Python 项目时,明确项目名称、路径以及选择合适的环境类型,如 Virtualenv 虚拟环境,能有效隔离项目依赖,避免不同项目间的依赖冲突,为项目开发营造稳定的运行环境。下面详细介绍创建 Python 项目的具体流程。

点击“文件”菜单–>选择“新建(N)”–>点击“项目…”–>选择“Python”项目类型–>输入项目名称和路径–>选择环境类型为“Virtualenv”–>指定虚拟环境路径–>选择基础解释器版本–>点击“创建©”按钮。

具体步骤如下图所示:

在这里插入图片描述


三、安装 redis 库

Redis 库是 Python 与 Redis 数据库交互的桥梁。通过终端执行 pip install redis 命令(推荐使用阿里云镜像源加速下载),可快速安装官方提供的 Redis 客户端库。安装完成后,需验证库是否导入成功(如在 Python 中执行 import redis 无报错),确保后续代码能够调用 Redis 相关接口。

打开终端,执行如下命令安装redis库。

pip install redis -i https://mirrors.aliyun.com/pypi/simple/

具体步骤如下图所示:

在这里插入图片描述


四、新建python软件包

在 Python 项目中,软件包用于组织相关的模块,有助于构建清晰的代码结构,提高代码的可维护性与复用性。当项目涉及复杂的功能模块时,合理创建软件包能够更好地管理代码逻辑。以下介绍在项目中新建 Python 软件包的操作方法。

在项目视图中找到并点击项目名称–>右键点击项目名称–>选择“新建(N)”–>选择“Python 软件包”–>输入软件包名称–>点击“确定”按钮。

具体步骤如下图所示:

在这里插入图片描述

创建完成如下图所示:

在这里插入图片描述


五、键操作

键操作是 Redis 数据管理的基础,涉及键的创建、查询、修改与删除。核心方法包括:

  • SET/MSET:设置单个或多个键值对;
  • KEYS:按模式匹配查询键(如 k* 匹配以 k 开头的键);
  • EXPIRE/TTL:设置键的生存时间及查询剩余存活时间;
  • RENAME:重命名键;
  • DELETE:删除单个或多个键。

通过这些操作,可高效管理 Redis 中的数据生命周期。

def key_operation():print("===========键操作===========")# 示例:给school键设置值为dy。set_result = r.set("school", "dy")print(set_result)print("===============")# 示例:给k1键设置值为v1,k2键设置值为v2,k3键设置值为v3。set_result1 = r.mset({"k1": "v1", "k2": "v2", "k3": "v3"})print(set_result1)print("===============")# 示例1:查看所有键。keys = r.keys("*")for key in keys:print(key.decode())print("===============")# 示例2:查看所有以k开头的键。keys1 = r.keys("k*")for key in keys1:print(key.decode())print("===============")# 示例:查看scool键的值。school = r.get("school")print(school.decode() if school else None)print("===============")# 示例:查看k1、k2、k3键的值。mget = r.mget("k1", "k2", "k3")for s in mget:print(s.decode() if s else None)print("===============")# 示例:查看k1键的值的序列化版本。k1s = r.dump("k1")print(k1s)print("===============")# 示例1:查看school键是否存在。exists = r.exists("school")print(exists)# print(bool(exists))print("===============")# 示例2:查看k1、k2、k3、k4、k5键是否存在。exists1 = r.exists("k1", "k2", "k3", "k4", "k5")print(exists1)print("===============")# 示例:查看school键的值的类型。type_ = r.type("school").decode()print(type_)print("===============")# 示例:把school键重命名为new_school键。rename = r.rename("school", "new_school")print(rename)print("===============")# 示例:把k3键的生存时间设置为600秒。expire = r.expire("k3", 600)print(expire)print("===============")# 示例:查看k3键的剩余存活时间。ttl = r.ttl("k3")print(ttl)print("===============")# 示例:删除k3键的存活时间。persist = r.persist("k3")print(persist)print("===============")# 示例1:删除new_school键。del_ = r.delete("new_school")print(del_)print("===============")# 示例2:删除k1、k2、k3键。del1 = r.delete("k1", "k2", "k3")print(del1)print("===============")

六、字符串操作

字符串是 Redis 最基础的数据类型,支持原子性操作。核心方法包括:

  • GET/MGET:获取单个或多个字符串值;
  • GETSET:先获取旧值再设置新值;
  • STRLEN:获取字符串长度;
  • SETRANGE:按索引替换字符串内容;
  • APPEND:向字符串末尾追加内容。

这些操作适用于缓存简单数据(如用户信息、配置项)场景。

def string_operation():print("===========字符串操作===========")# 示例:给字符串键str1设置值为value1。set_result = r.set("str1", "value1")print(set_result)print("===============")# 示例:给字符串键str2、str3、str4分别设置值为value2、value3、value4。mset_result = r.mset({"str2": "value2", "str3": "value3", "str4": "value4"})print(mset_result)print("===============")# 示例:获取字符串键str1的值。str1 = r.get("str1")print(str1.decode() if str1 else None)print("===============")# 示例:获取字符串键str2、str3、str4的值。mget = r.mget("str2", "str3", "str4")for s in mget:print(s.decode() if s else None)print("===============")# 示例:获取字符串键str1的旧值,并设置新值为new_value1。get_set = r.getset("str1", "new_value1")print(get_set.decode() if get_set else None)# 查看设置后的新值。str11 = r.get("str1")print(str11.decode() if str11 else None)print("===============")# 示例:获取字符串键str1的值的长度。strlen = r.strlen("str1")print(strlen)print("===============")# 示例:获取字符串键str1的索引0-5的值的内容。getrange = r.getrange("str1", 0, 5)print(getrange.decode() if getrange else None)print("===============")# 示例:把字符串键str1从索引2开始的后面三个字母的内容替换为aaa。setrange = r.setrange("str1", 2, "aaa")print(setrange)# 查看设置后的新值。str12 = r.get("str1")print(str12.decode() if str12 else None)print("===============")# 示例:向字符串键str1的结尾追加内容bbb。append = r.append("str1", "bbb")print(append)# 查看设置后的新值。str13 = r.get("str1")print(str13.decode() if str13 else None)

七、列表操作

列表(List)是 Redis 中有序、可重复的链表结构,支持两端插入与删除。核心方法包括:

  • LPUSH/RPUSH:左 / 右端插入元素;
  • LRANGE:按索引范围获取列表元素(如 0 -1 表示所有元素);
  • LPOP/RPOP:左 / 右端弹出并删除元素;
  • LREM:按条件删除元素(如删除指定数量或方向的元素)。

列表适用于队列、栈、历史记录等有序数据场景。

def list_operation():print("===========列表操作===========")# 示例:在列表右端向列表color中添加多个值。rpush = r.rpush("color", "blue", "green", "purple", "red", "white")print(rpush)print("===============")# 示例:在列表左端向列表color中添加多个值。lpush = r.lpush("color", "blue2", "green2", "purple2", "red2", "white2")print(lpush)print("===============")# 示例1:获取列表color中索引0-5的元素。color = r.lrange("color", 0, 5)for s in color:print(s.decode())print("===============")# 示例2:获取列表color中的所有元素。color1 = r.lrange("color", 0, -1)for s in color1:print(s.decode())print("===============")# 示例:获取列表color中索引为2的元素。color2 = r.lindex("color", 2)print(color2.decode() if color2 else None)print("===============")# 示例:移除并获取列表color中的最后一个(最右端)元素。rpop = r.rpop("color")print(rpop.decode() if rpop else None)print("===============")# 示例:移除并获取列表color中的第一个(最左端)元素。lpop = r.lpop("color")print(lpop.decode() if lpop else None)print("===============")# 示例:获取列表color的长度。llen = r.llen("color")print(llen)print("===============")# 示例1:从列表开头开始搜索移除列表color中1个red元素。lrem = r.lrem("color", 1, "red")print(lrem)print("===============")# 示例2:从列表结尾开始搜索移除列表color中3个blue元素。lrem1 = r.lrem("color", -3, "blue")print(lrem1)print("===============")# 示例3:移除列表color中所有blue2元素。lrem2 = r.lrem("color", 0, "blue2")print(lrem2)print("===============")

八、集合操作

集合(Set)是 Redis 中无序、唯一的元素集合,支持交集、并集、差集运算。关键操作包括:

  • SADD:添加成员(自动去重);
  • SMEMBERS:获取所有成员;
  • SISMEMBER:判断成员是否存在;
  • SMOVE:移动成员至其他集合。

集合常用于标签管理、用户去重、交集查询(如共同好友)等场景。

def set_operation():print("===========集合操作===========")# 示例:给集合键set1添加多个成员。sadd = r.sadd("set1", "mem1", "mem2", "mem3")print(sadd)print("===============")# 示例:查看集合键set1中成员的数量。scard = r.scard("set1")print(scard)print("===============")# 示例:查看集合键set1中的所有成员。set1 = r.smembers("set1")for s in set1:print(s.decode())print("===============")# 示例:检查成员mem1是否在集合set1中。sismember = r.sismember("set1", "mem1")print(sismember)print("===============")# 示例:移除集合set1中成员mem3。srem = r.srem("set1", "mem3")print(srem)print("===============")# 示例:把集合set1中成员mem2移动到集合set2中。smove = r.smove("set1", "set2", "mem2")print(smove)print("===============")

九、哈希表操作

哈希表(Hash)用于存储键值对的集合,适合存储结构化数据(如用户详情)。核心方法包括:

  • HSET:设置单个字段值或批量设置(通过 mapping 参数);
  • HGET/HMGET:获取单个或多个字段值;
  • HGETALL:获取所有字段和值;
  • HDEL:删除指定字段。

哈希表可减少键的数量,提升数据读写效率,适用于存储对象属性场景。

def hash_operation():print("===========哈希表操作===========")# 示例:给哈希表student添加一个学生信息。hset = r.hset("student:1", "name", "zhangsan")print(hset)hset1 = r.hset("student:1", "age", "19")print(hset1)hset2 = r.hset("student:1", "address", "yunnan")print(hset2)print("===============")# 示例:给哈希表student添加一个学生信息。# 修复:使用 hset 替代 hmset,传入映射字典hmset = r.hset("student:2", mapping={"name": "lisi", "age": "20", "address": "guizhou"})print(hmset)print("===============")# 示例:获取hash键student:2中name字段的值。hget = r.hget("student:2", "name")print(hget.decode() if hget else None)print("===============")# 示例:获取hash键student:2中name、age和address字段的值。hget1 = r.hmget("student:2", ["name", "age", "address"])for s in hget1:print(s.decode() if s else None)print("===============")# 示例:获取hash键student:2中的所有字段和值。student2 = r.hgetall("student:2")for key, value in student2.items():print(f"{key.decode()}: {value.decode()}")print("===============")# 示例:获取hash键student:2中的所有字段。hkeys = r.hkeys("student:2")for s in hkeys:print(s.decode())print("===============")# 示例:获取hash键student:2中的所有值。hvals = r.hvals("student:2")for s in hvals:print(s.decode())print("===============")# 示例:删除hash键student:2中的age和address字段。hdel = r.hdel("student:2", "age", "address")print(hdel)print("===============")

十、有序集合操作

有序集合(Sorted Set)通过分数(Score)实现元素的有序排列,支持按分数或索引范围查询。核心方法包括:

  • ZADD:添加成员与分数;
  • ZCOUNT:统计指定分数范围内的成员数量;
  • ZRANGE:按索引范围获取成员(默认按分数升序);
  • ZSCORE:获取成员的分数。

有序集合适用于排行榜、实时数据排序(如点赞数、访问量)等场景。

def order_set_operation():print("===========有序集合操作===========")# 示例:给有序集合salary添加多个分数和成员。zadd = r.zadd("salary", {"zhangsan": 5000, "lisi": 4500, "wangwu": 6000})print(zadd)print("===============")# 示例:获取有序集合salary中的成员数量。zcard = r.zcard("salary")print(zcard)print("===============")# 示例:计算有序集合中分数在5000-6500之间的成员数量。zcount = r.zcount("salary", 5000, 6500)print(zcount)print("===============")# 示例:根据索引范围获取有序集合salary中的成员。salary = r.zrange("salary", 0, 1)for s in salary:print(s.decode())print("===============")# 示例:获取有序集合salary中成员wangwu的分数。zscore = r.zscore("salary", "wangwu")print(zscore)print("===============")# 示例:移除有序集合salary中成员wangwu。zrem = r.zrem("salary", "wangwu")print(zrem)print("===============")

十一、完整代码

本章提供完整的 Python 代码示例,整合前文各模块功能。代码通过 redis.Redis 类连接本地 Redis 服务(默认端口 6379,数据库 1),包含以下核心逻辑:

  • flush_db():清空数据库,确保测试环境干净;
  • 各数据类型操作函数(如 key_operation()、string_operation()):封装具体功能逻辑;
  • __main__ 入口:按顺序调用各操作函数,实现完整的 Redis 交互流程。
    运行前需确保 Redis 服务已启动,且代码中的连接参数与实际环境一致。

1. 完整代码

import redis# 连接到本地 Redis 服务
r = redis.Redis(host='127.0.0.1', port=6379, db=1)def flush_db():# 清空数据库r.flushdb()def key_operation():print("===========键操作===========")# 示例:给school键设置值为dy。set_result = r.set("school", "dy")print(set_result)print("===============")# 示例:给k1键设置值为v1,k2键设置值为v2,k3键设置值为v3。set_result1 = r.mset({"k1": "v1", "k2": "v2", "k3": "v3"})print(set_result1)print("===============")# 示例1:查看所有键。keys = r.keys("*")for key in keys:print(key.decode())print("===============")# 示例2:查看所有以k开头的键。keys1 = r.keys("k*")for key in keys1:print(key.decode())print("===============")# 示例:查看scool键的值。school = r.get("school")print(school.decode() if school else None)print("===============")# 示例:查看k1、k2、k3键的值。mget = r.mget("k1", "k2", "k3")for s in mget:print(s.decode() if s else None)print("===============")# 示例:查看k1键的值的序列化版本。k1s = r.dump("k1")print(k1s)print("===============")# 示例1:查看school键是否存在。exists = r.exists("school")print(exists)# print(bool(exists))print("===============")# 示例2:查看k1、k2、k3、k4、k5键是否存在。exists1 = r.exists("k1", "k2", "k3", "k4", "k5")print(exists1)print("===============")# 示例:查看school键的值的类型。type_ = r.type("school").decode()print(type_)print("===============")# 示例:把school键重命名为new_school键。rename = r.rename("school", "new_school")print(rename)print("===============")# 示例:把k3键的生存时间设置为600秒。expire = r.expire("k3", 600)print(expire)print("===============")# 示例:查看k3键的剩余存活时间。ttl = r.ttl("k3")print(ttl)print("===============")# 示例:删除k3键的存活时间。persist = r.persist("k3")print(persist)print("===============")# 示例1:删除new_school键。del_ = r.delete("new_school")print(del_)print("===============")# 示例2:删除k1、k2、k3键。del1 = r.delete("k1", "k2", "k3")print(del1)print("===============")def string_operation():print("===========字符串操作===========")# 示例:给字符串键str1设置值为value1。set_result = r.set("str1", "value1")print(set_result)print("===============")# 示例:给字符串键str2、str3、str4分别设置值为value2、value3、value4。mset_result = r.mset({"str2": "value2", "str3": "value3", "str4": "value4"})print(mset_result)print("===============")# 示例:获取字符串键str1的值。str1 = r.get("str1")print(str1.decode() if str1 else None)print("===============")# 示例:获取字符串键str2、str3、str4的值。mget = r.mget("str2", "str3", "str4")for s in mget:print(s.decode() if s else None)print("===============")# 示例:获取字符串键str1的旧值,并设置新值为new_value1。get_set = r.getset("str1", "new_value1")print(get_set.decode() if get_set else None)# 查看设置后的新值。str11 = r.get("str1")print(str11.decode() if str11 else None)print("===============")# 示例:获取字符串键str1的值的长度。strlen = r.strlen("str1")print(strlen)print("===============")# 示例:获取字符串键str1的索引0-5的值的内容。getrange = r.getrange("str1", 0, 5)print(getrange.decode() if getrange else None)print("===============")# 示例:把字符串键str1从索引2开始的后面三个字母的内容替换为aaa。setrange = r.setrange("str1", 2, "aaa")print(setrange)# 查看设置后的新值。str12 = r.get("str1")print(str12.decode() if str12 else None)print("===============")# 示例:向字符串键str1的结尾追加内容bbb。append = r.append("str1", "bbb")print(append)# 查看设置后的新值。str13 = r.get("str1")print(str13.decode() if str13 else None)def list_operation():print("===========列表操作===========")# 示例:在列表右端向列表color中添加多个值。rpush = r.rpush("color", "blue", "green", "purple", "red", "white")print(rpush)print("===============")# 示例:在列表左端向列表color中添加多个值。lpush = r.lpush("color", "blue2", "green2", "purple2", "red2", "white2")print(lpush)print("===============")# 示例1:获取列表color中索引0-5的元素。color = r.lrange("color", 0, 5)for s in color:print(s.decode())print("===============")# 示例2:获取列表color中的所有元素。color1 = r.lrange("color", 0, -1)for s in color1:print(s.decode())print("===============")# 示例:获取列表color中索引为2的元素。color2 = r.lindex("color", 2)print(color2.decode() if color2 else None)print("===============")# 示例:移除并获取列表color中的最后一个(最右端)元素。rpop = r.rpop("color")print(rpop.decode() if rpop else None)print("===============")# 示例:移除并获取列表color中的第一个(最左端)元素。lpop = r.lpop("color")print(lpop.decode() if lpop else None)print("===============")# 示例:获取列表color的长度。llen = r.llen("color")print(llen)print("===============")# 示例1:从列表开头开始搜索移除列表color中1个red元素。lrem = r.lrem("color", 1, "red")print(lrem)print("===============")# 示例2:从列表结尾开始搜索移除列表color中3个blue元素。lrem1 = r.lrem("color", -3, "blue")print(lrem1)print("===============")# 示例3:移除列表color中所有blue2元素。lrem2 = r.lrem("color", 0, "blue2")print(lrem2)print("===============")def set_operation():print("===========集合操作===========")# 示例:给集合键set1添加多个成员。sadd = r.sadd("set1", "mem1", "mem2", "mem3")print(sadd)print("===============")# 示例:查看集合键set1中成员的数量。scard = r.scard("set1")print(scard)print("===============")# 示例:查看集合键set1中的所有成员。set1 = r.smembers("set1")for s in set1:print(s.decode())print("===============")# 示例:检查成员mem1是否在集合set1中。sismember = r.sismember("set1", "mem1")print(sismember)print("===============")# 示例:移除集合set1中成员mem3。srem = r.srem("set1", "mem3")print(srem)print("===============")# 示例:把集合set1中成员mem2移动到集合set2中。smove = r.smove("set1", "set2", "mem2")print(smove)print("===============")def hash_operation():print("===========哈希表操作===========")# 示例:给哈希表student添加一个学生信息。hset = r.hset("student:1", "name", "zhangsan")print(hset)hset1 = r.hset("student:1", "age", "19")print(hset1)hset2 = r.hset("student:1", "address", "yunnan")print(hset2)print("===============")# 示例:给哈希表student添加一个学生信息。# 修复:使用 hset 替代 hmset,传入映射字典hmset = r.hset("student:2", mapping={"name": "lisi", "age": "20", "address": "guizhou"})print(hmset)print("===============")# 示例:获取hash键student:2中name字段的值。hget = r.hget("student:2", "name")print(hget.decode() if hget else None)print("===============")# 示例:获取hash键student:2中name、age和address字段的值。hget1 = r.hmget("student:2", ["name", "age", "address"])for s in hget1:print(s.decode() if s else None)print("===============")# 示例:获取hash键student:2中的所有字段和值。student2 = r.hgetall("student:2")for key, value in student2.items():print(f"{key.decode()}: {value.decode()}")print("===============")# 示例:获取hash键student:2中的所有字段。hkeys = r.hkeys("student:2")for s in hkeys:print(s.decode())print("===============")# 示例:获取hash键student:2中的所有值。hvals = r.hvals("student:2")for s in hvals:print(s.decode())print("===============")# 示例:删除hash键student:2中的age和address字段。hdel = r.hdel("student:2", "age", "address")print(hdel)print("===============")def order_set_operation():print("===========有序集合操作===========")# 示例:给有序集合salary添加多个分数和成员。zadd = r.zadd("salary", {"zhangsan": 5000, "lisi": 4500, "wangwu": 6000})print(zadd)print("===============")# 示例:获取有序集合salary中的成员数量。zcard = r.zcard("salary")print(zcard)print("===============")# 示例:计算有序集合中分数在5000-6500之间的成员数量。zcount = r.zcount("salary", 5000, 6500)print(zcount)print("===============")# 示例:根据索引范围获取有序集合salary中的成员。salary = r.zrange("salary", 0, 1)for s in salary:print(s.decode())print("===============")# 示例:获取有序集合salary中成员wangwu的分数。zscore = r.zscore("salary", "wangwu")print(zscore)print("===============")# 示例:移除有序集合salary中成员wangwu。zrem = r.zrem("salary", "wangwu")print(zrem)print("===============")if __name__ == "__main__":flush_db()key_operation()string_operation()list_operation()set_operation()hash_operation()order_set_operation()

2. 项目下载

下载地址:https://download.csdn.net/download/zcs2312852665/90889723

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/81430.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

xdvipdfmx:fatal: File ended prematurely. No output PDF file written.

今天忽然遇到:使用xelatex或lualatex编译,一直卡住,不报错,也无法生成PDF,主动停止编译后就报错 xdvipdfmx:fatal: File ended prematurely. No output PDF file written. 然后,之前能正常编译的一些文件…

解锁未来AI:使用DACA模式和Agentic技术提高开发效率

学习Agentic AI:Dapr Agentic Cloud Ascent (DACA)设计模式的应用与演进 背景介绍 近年来,Agentic AI(代理型人工智能)的概念在学术界和产业界掀起了一阵热潮。Agentic AI指的是能够自主感知、决策和行动的智能体系统,它们不仅改变了我们与技术互动的方式,也为行业发展…

Jenkins+Docker+Harbor快速部署Spring Boot项目详解

JenkinsDockerHarbor快速部署Spring Boot项目详解 Jenkins、Docker和Harbor是现代DevOps流程中的核心工具,结合使用可以实现自动化构建、测试和部署。下面我将详细介绍如何搭建这个集成环境。 一、各工具的核心作用 Jenkins 自动化CI/CD工具,负责拉取代…

第12次04 :首页展示用户名

登录后&#xff0c;跳转到首页&#xff0c;首页会展示用户名&#xff1b;未登录时&#xff0c;首页将展示登录与注册的选项。 第一步&#xff1a;index.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml…

Flask 路由跳转机制:url_for生成动态URL、redirect页面重定向

在 Flask 开发中&#xff0c;url_for() 与 redirect() 是实现路由跳转逻辑的核心工具。 url_for()负责安全、灵活地生成 URL。 redirect()负责发起重定向响应。 1、url_for()&#xff1a;生成URL url_for(endpoint, **values) 是 Flask 提供的 URL 构造工具&#xff0c;可根据…

华为OD机试真题——构成正方形的数量(2025B卷:100分)Java/python/JavaScript/C++/C/GO六种最佳实现

2025 B卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 本文收录于专栏:《2025华为OD真题目录+全流程解析/备考攻略/经验分享》 华为OD机试真题《构成…

FFMPEG-AAC编码

一、流程图 二、代码解释 avcodec_find_encoder: 根据指定的AVCodecID查找注册的编码器。avcodec_alloc_context3: 为AVCodecContext分配内存。()avcodec_open2: 打开编码器。avcodec_send_frame: 将AVFrame⾮压缩数据给编码器。avcodec_receive_packet: 获取到编码后的…

RPC 协议详解、案例分析与应用场景

一、RPC 协议原理详解 RPC 协议的核心目标是让开发者像调用本地函数一样调用远程服务&#xff0c;其实现过程涉及多个关键组件与流程。 &#xff08;一&#xff09;核心组件 客户端&#xff08;Client&#xff09;&#xff1a;发起远程过程调用的一方&#xff0c;它并不关心调…

Docker基础 -- Ubuntu 22.04 AArch64 交叉编译 Docker 镜像构建指南

Ubuntu 22.04 AArch64 交叉编译 Docker 镜像构建指南 作者&#xff1a; &#xff08;填写作者&#xff09; 发布日期&#xff1a; 2025‑05‑26 1 背景与目标 在企业内网&#xff08;需要代理&#xff09;环境下&#xff0c;我们需要一套可靠、可复用的 Ubuntu 22.04 交叉编…

【ISP算法精粹】ISP算法管线的预处理算法有哪些?

1. ISP预处理算法有哪些&#xff1f; 在图像信号处理&#xff08;ISP&#xff09;流程中&#xff0c;预处理阶段主要针对图像传感器&#xff08;如CMOS/CCD&#xff09;输出的原始图像数据&#xff08;通常为拜耳格式的RAW图像&#xff09;进行初步处理&#xff0c;以校正硬件…

华为OD机试真题——字符串加密 (2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 B卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

视频存储开源方案

项目成熟度 GitHub - ceph/ceph: Ceph is a distributed object, block, and file storage platform GitHub - minio/minio: MinIO is a high-performance, S3 compatible object store, open sourced under GNU AGPLv3 license. GitHub - seaweedfs/seaweedfs: SeaweedFS i…

典型城市工况数据(Drive Cycle)用于车辆仿真

典型城市工况数据&#xff08;Drive Cycle&#xff09;用于车辆仿真 在车辆仿真过程中&#xff0c;使用典型的城市工况数据&#xff08;Drive Cycle&#xff09;是评估车辆性能、能耗和排放的关键步骤。以下是一些常用的典型城市工况数据及其来源&#xff0c;这些数据可以帮助…

深度解析新能源汽车结构与工作原理

一、核心系统架构 新能源汽车主要由三大核心系统构成&#xff1a; 电力驱动系统&#xff1a;包含永磁同步电机、电机控制器&#xff08;MCU&#xff09;及减速器&#xff0c;采用三合一集成设计实现轻量化。永磁同步电机通过电磁感应原理将电能转化为机械能&#xff0c;其效率可…

跳板问题(贪心算法+细节思考)

首先直接看题&#xff1a; 这题直接贪心其实问题不大&#xff1a; 下面先展示我的一个错误代码&#xff1a; # include<iostream> # include<vector> # include<algorithm>using namespace std;int main() {int N,M;cin>>N>>M;vector<vecto…

pgsql 一些用法

要查询PostgreSQL数据库中剩余的磁盘空间&#xff0c;可以使用以下方法&#xff1a; 使用SQL查询函数&#xff1a; 可以通过pg_size_pretty函数来查看数据库的总磁盘使用情况&#xff0c;例如&#xff1a; SELECT pg_size_pretty(pg_database_size(‘your_database_name’)); …

【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之如何形成高斯椭球

【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之如何形成高斯椭球 文章目录 【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之如何形成高斯椭球前言高斯函数一维高斯多维高斯 椭球基本定义一般二次形式 3D高斯椭球3D高斯与椭球的关系各向同性(Isotropic)和…

unix的定时任务和quartz和spring schedule的cron表达式区别

一、核心区别对比表 对比项Unix CrontabQuartzSpring Scheduled表达式位数5 位6 位或 7 位6 位秒级支持❌ 不支持&#xff08;最小单位是分钟&#xff09;✅ 支持✅ 支持年字段❌ 无✅ 可选第7位❌ 不支持特殊符号支持较少&#xff08;如 *, ,, -, /&#xff09;很丰富和 Quar…

C++基础算法————递推

C++递推:初学者的进阶之旅 一、引言 在计算机编程的世界里,C++ 以其强大的功能和高效性受到众多开发者的青睐。递推作为一种重要的编程思想,在解决各种复杂问题时发挥着关键作用。对于初学者来说,理解并掌握递推不仅可以提升编程能力,还能培养逻辑思维和问题解决能力。本…

QTabWidget垂直TabBar的图标和文本水平显示

一般情况下,我们可以通过QTabWidget的setTabPosition方法来设置TabBar的位置,比如设置在左边 ui->tabWidget->setTabPosition(QTabWidget::West); 但是此时图标和文字都是垂直的,如果让它们水平显示呢? 一.效果 二.原理 在绘制TabBar时,顺时针旋转90度 三.实现 …