Redis中String类型的基本命令
文章目录
- 一、String字符串简介
- 二、常见命令
- set
- get
- mget
- mset
- setnx
- incr
- incrby
- decr
- decrby
- incrbyfloat
- append
- getrange
- setrange
- strlen
- 三、命令小结
- 四、字符串内部编码
- 五、String典型使用场景
- 1. 缓存(Cache)功能
- 2. 计数功能
- 3. 共享会话(Session)
- 4. 手机验证码
一、String字符串简介
字符串类型是 Redis 最基础的数据类型,关于字符串需要特别注意:
-
- 首先 Redis 中所有的键的类型都是字符串类型,而且其他几种数据结构也都是在字符串类似基础上构建的,例如列表和集合的元素类型是字符串类型,所以字符串类型能为其他4种数据结构的学习奠定基础。
-
- 其次,如图 2-7所示,字符串类型的值实际可以是字符串,包含一般格式的字符串或者类似 JSON、XML格式的字符串;数字,可以是整型或者浮点型;甚至是二进制流数据,例如图片、音频、视频等。不过一个字符串的最大值不能超过 512 MB。
由于 Redis 内部存储字符串完全是按照二进制流的形式保存的,所以 Redis 是不处理字符集编码问题的,客户端传入的命令中使用的是什么字符集编码,就存储什么字符集编码。
二、常见命令
set
SET
- 将 string 类型的 value 设置到 key 中。如果 key之前存在,则覆盖,无论原来的数据类型是什么。之前关于此 key 的 TTL 也全部失效。
- 语法:
SET key value [expiration EX seconds|PX milliseconds] [NX|XX]
-
命令有效版本:1.0.0 之后
-
时间复杂度:0(1)
-
选项:
- SET 命令支持多种选项来影响它的行为:
- EX seconds–使用秒作为单位设置 key 的过期时间。
- PX milliseconds–使用毫秒作为单位设置 key 的过期时间。
- NX-- 只在 key不存在时才进行设置,即如果 key 之前已经存在,设置不执行。
- XX-- 只在 key 存在时才进行设置,即如果 key 之前不存在,设置不执行。
-
注意:由于带选项的 SET命令可以被 SETNX、SETEX、PSETEX 等命令代替,所以之后的版本中,Redis 可能进行合并。
-
返回值:
- 如果设置成功,返回 OK。
- 如果由于 SET指定了 NX或者 XX但条件不满足,SET不会执行,并返回(nil)。
-
示例:
get
GET
- 获取 key 对应的 value。如果 key 不存在,返回nil。如果value的数据类型不是string,会报错。
- 语法:
get key
- 时间复杂度:O(1)
- 返回值:key对应的value,或者nil当key不存在。
- 示例:
mget
MGET
- 一次性获取多个 key 的值。如果对应的 key不存在或者对应的数据类型不是 string,返回 nil。
- 语法:
MGET key [key ...]
-
命令有效版本:1.0.0 之后
-
时间复杂度: O(N)N 是 key数量
-
返回值: 对应 value 的列表
-
示例:
mset
MSET
- 一次性设置多个 key 的值。
- 语法:
MSET key value [key value ...]
- 命令有效版本:1.0.1之后
- 时间复杂度: O(N)N 是 key 数量
- 返回值: 永远是 OK
- 示例:
多次get对比单次mget
如图2-8 所示,使用 mget / mset 由于可以有效减少网络时间,所以性能相较更高。假设网络耗时1毫秒,命令执行时间耗时0.1毫秒,则执行时间如表 2-2 所示。
以下是将您提供的信息整理成表格的形式:
操作 | 次数 | 耗时(毫秒) | 计算方式 |
---|---|---|---|
get | 1000 | 1100 | 1000 * 1 + 1000 * 0.1 |
mget | 1 | 101 | 1 * 1 + 1000 * 0.1 |
学会使用批量操作,可以有效提高业务处理效率,但是要注意,每次批量操作所发送的键的数量也不是无节制的,否则可能造成单⼀命令执行时间过长,导致Redis阻塞。
setnx
SETNX
- 设置 key-value 但只允许在 key 之前不存在的情况下。
- 语法:
SETNX key value
- 命令有效版本:1.0.0 之后
- 时间复杂度: O(1)
- 返回值: 1表示设置成功。0 表示没有设置。
- 示例:
SET、SET NX、SET XX 执行流程
incr
INCR
- 将 key 对应的 string表示的数字加一。如果 key不存在,则视为 key对应的 value 是 0。如果 key对应的 string 不是一个整型或者范围超过了 64 位有符号整型,则报错。
- 语法:
INCR key
- 命令有效版本: 1.0.0 之后
- 时间复杂度:0(1)
- 返回值: integer类型的加完后的数值。
- 示例:
incrby
INCRBY
- 将 key 对应的 string表示的数字加上对应的值。如果 key不存在,则视为 key 对应的 value是 0。如果 key 对应的 string 不是一个整型或者范围超过了 64 位有符号整型,则报错。
- 语法:
INCRBY key decrement
- 命令有效版本:1.0.0 之后
- 时间复杂度: 0(1)
- 返回值: integer类型的加完后的数值。
- 示例:
decr
DECR
- 将 key 对应的 string表示的数字减一。如果 key 不存在,则视为 key对应的 value 是 0。如果 key对应的 string 不是一个整型或者范围超过了 64 位有符号整型,则报错。
- 语法:
DECR key
- 命令有效版本:1.0.0 之后
- 时间复杂度: 0(1)
- 返回值: integer类型的减完后的数值
- 示例:
decrby
DECYBY
- 将 key 对应的 string表示的数字减去对应的值。如果 key不存在,则视为 key 对应的 value是0。如果 key 对应的 string 不是一个整型或者范围超过了 64 位有符号整型,则报错。
- 语法:
DECRBY key decrement
- 命令有效版本:1.0.0之后
- 时间复杂度: 0(1)
- 返回值: integer 类型的减完后的数值。
- 示例:
incrbyfloat
INCRBYFLOAT
- 将 key 对应的 string 表示的浮点数加上对应的值。如果对应的值是负数,则视为减去对应的值。如果key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的不是 string,或者不是一个浮点数,则报错。允许采用科学计数法表示浮点数。
- 语法:
INCRBYFLOAT key increment
- 命令有效版本:2.6.0 之后
- 时间复杂度: 0(1)
- 返回值: 加/减完后的数值。
- 示例:
append
APPEND
- 如果 key 已经存在并且是一个 string,命令会将 value 追加到原有 string 的后边。如果 key 不存在则效果等同于 SET 命令。
- 语法:
APPEND KEY VALUE
- 命令有效版本:2.0.0 之后
- 时间复杂度: 0(1).追加的字符串一般长度较短,可以视为 O(1)
- 返回值: 追加完成之后 string 的长度。
- 示例:
getrange
GETRANGE
- 返回 key对应的 string的子串,由 start和 end确定(左闭右闭)。可以使用负数表示倒数。-1代表倒数第一个字符,-2 代表倒数第二个,其他的与此类似。超过范围的偏移量会根据 string的长度调整成正确的值,字符串下标从0开始。
- 语法:
GETRANGE key start end
- 命令有效版本:2.4.0 之后
- 时间复杂度: O(N).N 为[start,end]区间的长度.由于 string 通常比较短,可以视为是 O(1)
- 返回值: string类型的子串
- 示例:
setrange
SETRANGE
- 覆盖字符串的一部分,从指定的偏移开始。偏移量超过字符个数,填充的时候以\00填充
- 语法:
SETRANGE key offset value
- 命令有效版本:2.2.0 之后
- 时间复杂度: O(N),N 为 value 的长度,由于一般给的 value 比较短,通常视为 O(1).
- 返回值: 替换后的 string 的长度。
- 示例:
strlen
STRLEN
- 获取 key 对应的 string 的长度。当 key 存放的类似不是 string 时,报错。
- 语法:
STRLEN key
- 命令有效版本:2.2.0 之后
- 时间复杂度: 0(1)
- 返回值: string的长度。或者当 key不存在时,返回 0。
- 示例:
三、命令小结
命令 | 执行效果 | 时间复杂度 |
---|---|---|
set key value [key value…] | 设置 key 的值是 value | O(k), k 是键个数 |
get key | 获取 key 的值 | O(1) |
del key [key …] | 删除指定的 key | O(k), k 是键个数 |
mset key value [key value …] | 批量设置指定的 key 和 value | O(k), k 是键个数 |
mget key [key …] | 批量获取 key 的值 | O(k), k 是键个数 |
incr key | 指定的 key 的值 +1 | O(1) |
decr key | 指定的 key 的值 -1 | O(1) |
incrby key n | 指定的 key 的值 +n | O(1) |
decrby key n | 指定的 key 的值 -n | O(1) |
incrbyfloat key n | 指定的 key 的值 +n(浮点数) | O(1) |
append key value | 指定的 key 的值追加 value | O(1) |
strlen key | 获取指定 key 的值的长度 | O(1) |
setrange key offset value | 覆盖指定 key 的从 offset 开始的部分值 | O(n),n 是字符串长度, 通常视为 O(1) |
getrange key start end | 获取指定 key 的从 start 到 end 的部分值 | O(n),n 是字符串长度, 通常视为 O(1) |
四、字符串内部编码
字符串类型的内部编码有3种:
- int:8个字节的长整型。
- embstr:小于等于 39 个字节的字符串。
- raw:大于 39 个字节的字符串。
Redis 会根据当前值的类型和长度动态决定使用哪种内部编码实现。
整型类型示例如下:
短字符串示例如下:
长字符串示例如下:
五、String典型使用场景
1. 缓存(Cache)功能
图 2-10 是比较典型的缓存使用场景,其中 Redis 作为缓冲层,MySQL作为存储层,绝大部分请求的数据都是从 Redis 中获取。由于 Redis 具有支撑高并发的特性,所以缓存通常能起到加速读写和降低后端压力的作用。
图 2-10 Redis+MySQL 组成的缓存存储架构
下面的伪代码模拟了上图业务数据访问过程:
- 业务是根据用户 uid 获取用户信息
UserInfo getUserInfo(long uid) {...
}
- 首先从 Redis 获取用户信息,我们假设用户信息保存在 “user:info:” 对应的键中:
// 根据 uid 得到 Redis 的键
String key = "user:info:" + uid;
// 尝试从 Redis 中获取对应的值
String value = Redis 执⾏命令:get key;
// 如果缓存命中(hit)
if (value != null) {
// 假设我们的⽤⼾信息按照 JSON 格式存储
UserInfo userInfo = JSON 反序列化(value);
return userInfo;
}
- 如果没有从 Redis 中得到用户信息,及缓存 miss,则进⼀步从 MySQL 中获取对应的信息,随后写入缓存并返回:
// 如果缓存未命中(miss)
if (value == null) {
// 从数据库中,根据 uid 获取⽤⼾信息
UserInfo userInfo = MySQL 执⾏ SQL:select * from user_info where uid = <uid>// 如果表中没有 uid 对应的⽤⼾信息
if (userInfo == null) {
//响应 404
return null;
}// 将⽤⼾信息序列化成 JSON 格式
String value = JSON 序列化(userInfo);// 写⼊缓存,为了防⽌数据腐烂(rot),设置过期时间为 1 ⼩时(3600 秒)
Redis 执⾏命令:set key value ex 3600// 返回⽤⼾信息
return userInfo;
}
通过增加缓存功能,在理想情况下,每个用户信息,一个小时期间只会有一次 MySQL查询,极大地提升了查询效率,也降低了 MySOL的访问数。
与 MVSOL等关系型数据库不同的是,Redis
没有表、字段这种命名空间,而且也没有对键名有强制要求(除了不能使用一些特殊字符)。但设计合理的键名,有利于防止键冲突和项目的可维护性,比较推荐的方式是使用"业务名:对象名:唯一标识:属性"作为键名。例如MySOL的数据库名为
vs,用户表名为 user
info,那么对应的键可以使用"'vs:user_info:6379"、“vs:user_info:6379:name"来表示,如果当前
Redis 只会被一个业务使用,可以省略业务名"vs:”。如果键名过程,则可以使用团队内部都认同的缩写替代,例如
"user:6379:friends:messages:5217"可以被"u:6379🇫🇷m:5217"代替。毕竟键名过长,还是会导致
Redis 的性能明显下降的。
2. 计数功能
许多应用都会使用 Redis 作为计数的基础工具,它可以实现快速计数、查询缓存的功能,同时数据可以异步处理或者落地到其他数据源。如图 2-11所示,例如视频网站的视频播放次数可以使用Redis 来完成:用户每播放一次视频,相应的视频播放数就会自增 1。
// 在 Redis 中统计某视频的播放次数
long incrVideoCounter(long vid) {key = "video:" + vid;long count = Redis 执⾏命令:incr keyreturn counter;
}
实际中要开发⼀个成熟、稳定的真实计数系统,要⾯临的挑战远不止如此简单:防作弊、按照不同维度计数、避免单点问题、数据持久化到底层数据源等。
3. 共享会话(Session)
如图 2-12 所示,一个分布式 Web 服务将用户的 Session 信息(例如用户登录信息)保存在各自的服务器中,但这样会造成一个问题:出于负载均衡的考虑,分布式服务会将用户的访问请求均衡到不同的服务器上,并且通常无法保证用户每次请求都会被均衡到同一台服务器上,这样当用户刷新一次访问是可能会发现需要重新登录,这个问题是用户无法容忍的。
为了解决这个问题,可以使用 Redis 将用户的 Session 信息进行集中管理,如图 2-13所示,在这种模式下,只要保证 Redis 是高可用和可扩展性的,无论用户被均衡到哪台 Web 服务器上,都集中从Redis 中查询、更新 Session 信息。
4. 手机验证码
很多应用出于安全考虑,会在每次进行登录时,让用户输入手机号并且配合给手机发送验证码,然后让用户再次输入收到的验证码并进行验证,从而确定是否是用户本人。为了短信接口不会频繁访问,会限制用户每分钟获取验证码的频率,例如一分钟不能超过5次,如图2-14所示。
此功能可以用以下伪代码说明基本实现思路:
String 发送验证码(phoneNumber) {key = "shortMsg:limit:" + phoneNumber;// 设置过期时间为 1 分钟(60 秒)// 使⽤ NX,只在不存在 key 时才能设置成功bool r = Redis 执⾏命令:set key 1 ex 60 nxif (r == false) {// 说明之前设置过该⼿机的验证码了long c = Redis 执⾏命令:incr keyif (c > 5) {// 说明超过了⼀分钟 5 次的限制了// 限制发送return null;}}// 说明要么之前没有设置过⼿机的验证码;要么次数没有超过 5 次String validationCode = ⽣成随机的 6 位数的验证码();validationKey = "validation:" + phoneNumber;// 验证码 5 分钟(300 秒)内有效Redis 执⾏命令:set validationKey validationCode ex 300;// 返回验证码,随后通过⼿机短信发送给⽤⼾return validationCode;
}
// 验证⽤⼾输⼊的验证码是否正确
bool 验证验证码(phoneNumber, validationCode) {validationKey = "validation:" + phoneNumber;String value = Redis 执⾏命令:get validationKey;if (value == null) {// 说明没有这个⼿机的验证码记录,验证失败return false;}if (value == validationCode) {return true;}else {return false;}
}
相关文章:

Redis中String类型的基本命令
文章目录 一、String字符串简介二、常见命令setgetmgetmsetsetnxincrincrbydecrdecrbyincrbyfloatappendgetrangesetrangestrlen 三、命令小结四、字符串内部编码五、String典型使用场景1. 缓存(Cache)功能2. 计数功能3. 共享会话(Session)4. 手机验证码…...

2024 年高教社杯全国大学生数学建模竞赛题目【A/B/C/D/E题】完整思路
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ A题是数模类赛事很常见的物理类赛题,需要学习不少相关知识。此题涉及对一个动态系统的建模,模拟…...

HR招聘新员工,如何考察企业文化适配度
要解决文化适配性问题,那在招聘过程中一定要明确企业核心价值观。比如通过制定明确文化价值观手册的方式,向求职者展示企业的使命愿景和价值观。 目前最为理想的考察方式就是线上的人才测评,比如:采用职业价值观测评法࿰…...

AI算力「搅局」座舱SoC
对于芯片巨头来说,汽车是难以割舍的赛道。 这不仅仅是因为「车规级」向来是准入门槛最高的细分市场之一,更重要的原因来自于从PC、智能手机到智能汽车时代,芯片公司都在寻求成为新周期的标杆。 比如,从PC时代的「英特尔」到智能手…...
lvs DR模式调试
DS配置: # cat /etc/keepalived_docker/keepalived.conf ! Configuration File for keepalived global_defs {router_id LVS_70 # 设置lvs的id,在一个网络内应该是唯一的 }vrrp_instance VI_70 {state MASTER # 两个 DS࿰…...
Java线程池的优化策略与最佳实践
哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互…...
android面试:解释一下 AsyncTask是什么?
AsyncTask 是 Android 中用于处理异步操作的一个类,它允许在后台线程中执行任务,并在完成后将结果传递回主线程。AsyncTask 主要用于执行短时间的后台操作,例如网络请求、文件读写等,而不阻塞用户界面。 AsyncTask 的主要特点&am…...
Django+Vue3前后端分离学习(四)(登录功能实现)
1、序列化数据: 创建serializers.py的python文件 从rest_framework里导入serializers类: from rest_framework import serializers class LoginSerializer(serializers.Serializer):email serializers.EmailField(requiredTrue, error_messages{&qu…...

机器学习面试:SVM为什么使用对偶函数求解?
支持向量机(SVM)在求解过程中使用对偶函数的原因主要与优化问题的性质、计算效率以及模型的泛化能力有关。以下是对偶函数在 SVM 中使用的详细解释: 1. 原始问题与对偶问题 在 SVM 中,我们的目标是找到一个超平面来最大化分类间…...
RabbitMQ 入门教程
介绍 RabbitMQ 是一个消息中间件,它实现了 AMQP (Advanced Message Queuing Protocol) 协议。本教程将引导你通过几个简单的步骤来学习如何使用 RabbitMQ 发送和接收消息。 环境准备 1. 安装 RabbitMQ - 在你的系统上安装 RabbitMQ: https://www.rabbitmq.com/d…...

docker进阶 compose等
Docker Compose 简介: 比如有100个微服务,不需要手动启动每一个,可以使用docker compose定义运行多个容器,高效管理化。 定义、运行多个容器 YAML file配置文件 single command 命令 写docker-compose.yaml docker-compose …...
[详细建模已更新]2024数学建模国赛高教社杯A题:“板凳龙” 闹元宵 思路代码文章助攻手把手保姆级
A 题 “板凳龙” 闹元宵 “板凳龙”,又称“盘龙”,是浙闽地区的传统地方民俗文化活动。人们将少则几十条,多则上百条的板凳首尾相连,形成蜿蜒曲折的板凳龙。盘龙时,龙头在前领头,龙身和龙尾相随盘旋&#x…...

网络编程(TCP+网络模型)
【1】TCP 初版服务器 #include <stdio.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h> #include <unistd.h> #include <arpa/inet.h> #include <string.h…...

Docker Image 命令
文章目录 目录 文章目录 1 . Docker镜像是什么? 2 . 镜像命令详解 docker images docker tag docker pull docker rmi docker save 总结 1 . Docker镜像是什么? Docker image 本质上是一个 read-only 只读文件, 这个文件包含了文件系统、 源码、库文件…...

如何在IntelliJ IDEA中将Tab设置为4个空格
前言 IntelliJ IDEA是一个强大的开发工具,支持多种编程语言。为了保持代码整洁一致,开发者经常需要调整编辑器中的Tab和缩进设置。 步骤1: 打开设置 首先,启动IntelliJ IDEA。在主界面上方的菜单栏中找到 File(文件)…...
ASP.NET Core 入门教学十五 异步编程
在ASP.NET Core中,异步编程是一种非常重要的技术,它可以提高应用程序的性能和响应能力。本教程将介绍如何在ASP.NET Core中使用异步编程。 1. 异步编程基础 异步编程允许程序在等待某些操作(如I/O操作)完成时继续执行其他任务&a…...

pycharm 2024.1下载、安装
下载 下载官网: Other Versions - PyCharm 选择需要的版本下载,这里以 2024.1 的版本为例 安装 双击下载好的安装程序,点击下一步 选择安装路径,最好是英文路径;然后下一步 点击完成 激活 网址: Some…...
实变函数精解【18】
文章目录 有限测度有限测度概率测度有限测度与概率测度的关系 σ \sigma σ-有限测度计数测度完备概率测度 参考文献 有限测度 首先,我们来明确“测度”的概念。在数学中,测度是一个将集合映射到非负实数(通常是实数的扩展,包括正…...

【深入解析】AI工作流中的HTTP组件:客户端与服务端执行的区别
在当今快速发展的技术环境中,AI工作流的设计和实现变得愈发重要。尤其是在处理HTTP组件时,前端执行与后端执行之间的区别,往往会对系统的安全性和数据的准确性产生深远的影响。今天,我们就来深入探讨这一话题,揭示前端…...

用亚马逊云科技Graviton高性能/低耗能处理器构建AI向量数据库(上篇)
简介: 今天小李哥将介绍亚马逊推出的云平台4代高性能计算处理器Gravition,并利用该处理器构建生成式AI向量数据库。利用向量数据库,我们可以开发和构建多样化的生成式AI应用,如RAG知识库,特定领域知识的聊天机器人等。…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

若依登录用户名和密码加密
/*** 获取公钥:前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...

6.9-QT模拟计算器
源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...
从实验室到产业:IndexTTS 在六大核心场景的落地实践
一、内容创作:重构数字内容生产范式 在短视频创作领域,IndexTTS 的语音克隆技术彻底改变了配音流程。B 站 UP 主通过 5 秒参考音频即可克隆出郭老师音色,生成的 “各位吴彦祖们大家好” 语音相似度达 97%,单条视频播放量突破百万…...

UE5 音效系统
一.音效管理 音乐一般都是WAV,创建一个背景音乐类SoudClass,一个音效类SoundClass。所有的音乐都分为这两个类。再创建一个总音乐类,将上述两个作为它的子类。 接着我们创建一个音乐混合类SoundMix,将上述三个类翻入其中,通过它管理每个音乐…...
linux设备重启后时间与网络时间不同步怎么解决?
linux设备重启后时间与网络时间不同步怎么解决? 设备只要一重启,时间又错了/偏了,明明刚刚对时还是对的! 这在物联网、嵌入式开发环境特别常见,尤其是开发板、树莓派、rk3588 这类设备。 解决方法: 加硬件…...