Redis String类型
String 类型是 Redis 最基本的数据类型,String 类型在 Redis 内部使用动态长度数组实现,Redis 在存储数据时会根据数据的大小动态地调整数组的长度。Redis 中字符串类型的值最大可以达到 512 MB。
关于字符串需要特别注意∶
- 首先,Redis 中所有的键的类型都是字符串类型,而且其他几种数据结构也都是在字符串类似基础上构建的,例如列表和集合的元素类型是字符串类型,所以字符串类型能为其他4种数据结构的学习奠定基础。
 - 其次,字符串类型的值实际可以是字符串,包含一般格式的字符串或者类似 JSON 、XML 格式的字符串;数字,可以是整型或者浮点型;甚至是二进制流数据,例如图片、音频、视频等。不过一个字符串的最大值不能超过 512 MB。
 
字符串数据类型

由于 Redis 内部存储字符串完全是按照二进制流的形式保存的,所以 Redis 是不处理字符集编码问题的,客户端传入的命令中使用的是什么字符集编码,就存储什么字符集编码。
String常见命令
set和get
set
将string类型的value设置到key中。如果key之前存在,则覆盖,无论原来的数据类型是什么。之前关于此key的TTL也全部失效。
语法:
SET key value [expiration EX seconds|PX milliseconds] [NX|XX]
 
时间复杂度:O(1)
选项: SET命令支持多种选项来影响它的行为:
EXseconds ——使用秒作为单位设置key的过期时间。PXmilliseconds——使用毫秒作为单位设置key的过期时间。NX——只在key不存在时才进行设置,即如果key之前已经存在,设置不执行(返回nil)。XX——只在key存在时才进行设置(相当于更新key),即如果key之前不存在,设置不执行。
注意:由于带选项的SET命令可以被SETNX、SETEX、PSETEX等命令代替,所以之后的版本中,Redis可能进行合并。
返回值:
- 如果设置成功,返回OK
 - 如果由于SET指定了NX或者XX但条件不满足,SET不会执行,并返回(nil)
 
示例:
redis> exists mykey
(integer) 0
redis> set mykey "Hello"
OK
redis> get mykey
"Hello"
redis> set mykey "World" NX
(nil)
redis> del mykey
(integer) 1
redis> exists mykey
(integer) 0
redis> set mykey "World" XX
(nil)
redis> get mykey
(nil)
redis> set mykey "World" NX
OK
redis> get mykey
"World"
redis> set mykey "Will expire in 10s" EX 10
OK
redis> get mykey
"Will expire in 10s"
redis> get mykey # 10秒之后
(nil)
 
get
获取key对应的value。如果key不存在,返回nil。如果value的数据类型不是string,会报错。
语法:
GET key
 
时间复杂度:O(1)
返回值:key对应的value,当key不存在,返回nil。
示例:
redis> get nonexisting
(nil)
redis> set mykey "Hello"
"OK"
redis> get mykey
"Hello"
redis> del mykey
(integer) 1
redis> exists mykey
(integer) 0
redis> hset mykey name Bob   #创建一个哈希类型
(integer) 1
redis> get mykey   #获取非string类型出现报错
(error) WRONGTYPE Operation against a key holding the wrong kind of value
 
mget和mset
mget
一次性获取多个key的值。如果对应的key不存在或者对应的数据类型不是string,返回nil。
语法:
MGET key [key ...]
 
时间复杂度:O(N) N是key数量
返回值:对应value的列表
示例:
redis> set key1 "hello"
OK
redis> set key2 "world"
OK
redis> mget key1 key2 nonexisting
1) "hello"
2) "world"
3) (nil)
 
mset
MSET命令用于同时设置一个或多个键值对。这个命令会覆盖已存在的键值对。使用MSET能够优化网络性能,因为一次的网络请求就可以完成多个键值对的设置,而不是逐个发送SET命令。
语法:
MSET key value [key value ...]
 
时间复杂度:O(N) N 是 key 数量
返回值:永远是 OK
示例:
redis> mset key1 "hello" key2 "world"
OK
redis> mget key1 key2
1) "hello"
2) "world
 
多次 get vs 单次 mget:

使用 mget / mset 由于可以有效地减少了网络时间,所以性能相较更高。
学会使用批量操作,可以有效提高业务处理效率,但是要注意,每次批量操作所发送的键的数量也不是无节制的,否则可能造成单一命令执行时间过长,导致Redis阻塞。
setnx,setex,psetex
setnx
SETNX命令用于设置一个键值对,但是只有当这个键不存在的时候才会进行设置,如果键已经存在,那么SETNX不会做任何操作
语法:
SETNX key value
 
时间复杂度:O(1)
返回值:1 表示设置成功。0 表示没有设置。
示例:
redis> setnx mykey "hello"
(integer) 1
redis> setnx mykey "world"
(integer) 0
redis> get mykey
"hello"
 
setex
该命令用于设置键值对,并指定该键值对的生存时间(TTL,Time-To-Live)。在指定的时间后,Redis将自动删除该键值对。
语法:
SETEX key seconds value
 
时间复杂度:O(1)
返回值:成功返回OK,执行遇到错误,(例如,设置的生存时间(TTL)不是数字或者 TTL 为负数),Redis 将返回一个出错信息。
示例:
redis> setex session 10 "abc123"
OK
redis> get session
"abc123"
redis> ttl session
(integer) 5
redis> get session  #10s之后
(nil)redis> setex session -1 "hello"
(error) ERR invalid expire time in setex   #出现错误,返回错误信息
 
psetex
psetex和setex的用法相同,唯一不同的是psetex的单位是毫秒。
计数命令
incr和incrby
incr:将key对应的string表示的数字加一。如果key不存在,则视为key对应的value是0。如果key对应的string不是一个整型或者范围超过了64位有符号整型,则报错。
语法:
INCR key
 
时间复杂度:O(1)
返回值:integer类型的加完后的数值。
示例:
redis> exists mykey
(integer) 0
redis> incr mykey
(integer) 1
redis> set mykey "10"
"OK"
redis> incr mykey
(integer) 11
redis> set mykey "234293482390480948029348230948"
"OK"
redis> incr mykey
(error) value is not an integer or out of range
redis> set mykey 'not a number'
"OK"
redis> incr mykey
(error) value is not an integer or out of range
 
incrby:将key对应的string表示的数字加上对应的值。如果key不存在,则视为key对应的value是0。如果key对应的string不是一个整型或者范围超过了64位有符号整型,则报错。
语法:
INCRBY key decrement
 
时间复杂度:O(1)
返回值:integer 类型的加完后的数值。
示例:
redis> exists mykey
(integer) 0
redis> incrby mykey 3
(integer) 3
redis> set mykey "10"
"OK"
redis> incrby mykey 3
(integer) 13
redis> incrby mykey "not a number"
(error) ERR value is not an integer or out of range
redis> set mykey "234293482390480948029348230948"
"OK"
redis> incrby mykey 3
(error) value is not an integer or out of range
redis> set mykey 'not a number'
"OK"
redis> incrby mykey 3
(error) value is not an integer or out of range
 
decr和decrby
decr:将key对应的string表示的数字减一。如果key不存在,则视为key对应的value是0。如果key对应的string不是一个整型或者范围超过了64位有符号整型,则报错。
语法:
DECR key
 
时间复杂度:O(1)
返回值:integer 类型的减完后的数值。
示例:
redis> exists mykey
(integer) 0
redis> decr mykey
(integer) -1
redis> set mykey "10"
"OK"
redis> decr mykey
(integer) 9
redis> set mykey "234293482390480948029348230948"
"OK"
redis> decr mykey
(error) value is not an integer or out of range
redis> set mykey 'not a number'
"OK"
redis> decr mykey
(error) value is not an integer or out of range
 
decrby:将key对应的string表示的数字减去对应的值。如果key不存在,则视为key对应的value是0。如果key对应的string不是一个整型或者范围超过了64位有符号整型,则报错。
语法:
DECRBY key decrement
 
时间复杂度:O(1)
返回值:integer 类型的减完后的数值。
示例:
redis> exists mykey
(integer) 0
redis> decrby mykey 3
(integer) -3
redis> set mykey "10"
"OK"
redis> decrby mykey 3
(integer) 7
redis> decrby mykey "not a number"
(error) ERR value is not an integer or out of range
redis> set mykey "234293482390480948029348230948"
"OK"
redis> decrby mykey 3
(error) value is not an integer or out of range
redis> set mykey 'not a number'
"OK"
redis> decrby mykey 3
(error) value is not an integer or out of range
 
incrbyfloat
将key对应的string表示的浮点数加上对应的值。如果对应的值是负数,则视为减去对应的值。如果key不存在,则视为key对应的value是0。如果key对应的不是string,或者不是一个浮点数,则报错。允许采用科学计数法表示浮点数。
语法:
INCRBYFLOAT key increment
 
时间复杂度:O(1)
返回值:加/减完后的数值。
示例:
redis> set mykey 10.50
"OK"
redis> incrbyfloat mykey 0.1
"10.6"
redis> incrbyfloat mykey -5
"5.6"
redis> set mykey 5.0e3    #5000
"OK"
redis> incrbyfloat mykey 2.0e2  #200
"5200"
 
很多存储系统和编程语言内部使用CAS机制实现计数功能,会有一定的CPU开销,但在Redis中完全不存在这个问题,因为Redis是单线程架构,任何命令到了Redis服务端都要顺序执行。
其他命令
append
如果key已经存在并且是一个string,命令会将value追加到原有string 的后边。如果key不存在,则效果等同于SET命令。
语法:
APPEND KEY VALUE
 
时间复杂度:O(1) 追加的字符串一般长度较短, 可以视为 O(1)
返回值:追加完成之后 string 的长度。注意这里的长度单位是字节
redis的字符串,不会对字符编码做任何处理,也就是说redis不认识字符,只认识字节
示例:
redis> exists mykey
(integer) 0
redis> append mykey "Hello"
(integer) 5
redis> get mykey
"Hello"
redis> append mykey " World"
(integer) 11
redis> get mykey
"Hello World"redis> append mykey 你好世界
(integer) 23
redis> get mykey
"hello world\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xb8\x96\xe7\x95\x8c"
 
为什么这里的输出结果"你好世界"输出的结果没有符合预期
“你好世界” 这个字符串是由 4 个 UTF-8 编码的汉字组成,每个汉字占用 3 个字节,总共占用 12 个字节。
当使用 GET 命令获取 “mykey” 的值时,看到的是编码后的 “你好世界” 字符串的字节序列。这个字节序列以十六进制进行了转义
如何解决呢?
在启动redis客户端的时候,加上一个–raw这样的选项,就可以使redis客户端额能够自动的把二进制数据尝试翻译。
[nullptr@bogon Code]$ redis-cli --raw
redis> flushall
OK
redis> append mykey "hello"
5
redis> append mykey " world"
11
redis> append mykey " 你好世界"
23
redis> get mykey
hello world 你好世界
 
getrange
返回key对应的string的子串,由start和end确定(左闭右闭)。可以使用负数表示倒数。-1代表倒数第一个字符,-2代表倒数第二个,其他的与此类似。超过范围的偏移量会根据string 的长度调整成正确的值。
语法:
GETRANGE key start end
 
时间复杂度:O(N) N 为[start, end]区间的长度。由于string通常比较短,可以视为是O(1)
返回值: string类型的子串
示例:
redis> set mykey "This is a string"
"OK"
redis> getrange mykey 0 3
"This"
redis> getrange mykey -3 -1
"ing"
redis> getrange mykey 0 -1
"This is a string"
redis> getrange mykey 10 100
"string
 
注意:如果字符串保存的是汉字,此时进行子串切分,很可能切出来的就不是一个完整的汉字了。
示例:
127.0.0.1:6379> set mykey "你好世界"
OK
127.0.0.1:6379> get mykey
你好世界
127.0.0.1:6379> getrange mykey 0 3
你�
 
setrange
覆盖字符串的一部分,从指定的偏移开始。
语法:
SETRANGE key offset value
 
时间复杂度:O(N) N为value的长度.由于一般给的value 比较短,通常视为O(1)。
返回值:替换后的string的长度。
示例:
redis> set key1 "Hello World"
"OK"
redis> setrange key1 6 "Redis"
(integer) 11
redis> get key1
"Hello Redis"
 
注意:和getrange一样,如果当前value是一个中文字符串,进行setrange的时候,是可能出现问题的
setrange针对不存在的key也是可以操作的,不过会把offset之前的内容填充成0x00
strlen
获取key对应的string的长度(单位是字节)。当key存放的类似不是string时,报错。
语法:
STRLEN key
 
时间复杂度:O(1)
返回值:string的长度。或者当key不存在时,返回0。
示例:
redis> set mykey "hello world"
OK
redis> strlen mykey
11
redis> set mykey "你好世界"
OK
redis> strlen mykey
12
 
命令小结

String内部编码
字符串类型的内部编码有3种:
- int:8个字节的长整型。
 - embstr:小于等于39个字节的字符串。
 - raw:大于39个字节的字符串。
 
Redis会根据当前值的类型和长度动态决定使用哪种内部编码实现。
整型类型示例如下:
127.0.0.1:6379> set key 6379
OK
127.0.0.1:6379> object encoding key
"int"
 
短字符串示例如下:
# ⼩于等于 39 个字节的字符串
127.0.0.1:6379> set key "hello"
OK
127.0.0.1:6379> object encoding key
"embstr"
 
长字符串示例如下:
# ⼤于 39 个字节的字符串
127.0.0.1:6379> set key "one string greater than 39 bytes ........"
OK
127.0.0.1:6379> object encoding key
"raw"
 
String使用场景
缓存(Cache)功能
Redis + MySQL 组成的缓存存储架构:
上图是比较典型的缓存使用场景,其中Redis作为缓冲层,MySQL作为存储层,绝大部分请求的数据都是从Redis中获取。由于Redis具有支撑高并发的特性,所以缓存通常能起到加速读写和降低后端压力的作用。
下面的伪代码模拟了业务数据访问过程:
1)假设业务是根据用户uid获取用户信息
UserInfo getUserInfo(long uid) {...
}
 
2)首先从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;
}
 
3)如果没有从Redis中得到用户信息,及缓存miss,则进一步从MySQL中获取对应的信息,随后写入缓存并返回:
// 如果缓存未命中(miss)
if (value == null) {// 从数据库中,根据 uid 获取⽤⼾信息UserInfo userInfo = MySQL 执⾏ SQL:select * from user_info where uid = <uid>// 如果表中没有 uid 对应的⽤⼾信息if (userInfo == null) {响应 404return null;}// 将⽤⼾信息序列化成 JSON 格式String value = JSON 序列化(userInfo);// 写⼊缓存,为了防⽌数据腐烂(rot),设置过期时间为 1 ⼩时(3600 秒) Redis 执⾏命令:set key value ex 3600// 返回⽤⼾信息return userInfo;
}
 
通过增加缓存功能,在理想情况下,每个用户信息,一个小时期间只会有一次MySQL查询,极大地提升了查询效率,也降低了MySQL的访问数。
与MySQL等关系型数据库不同的是,Redis没有表、字段这种命名空间,而且也没有对键名有强制要求(除了不能使用一些特殊字符)。但设计合理的键名,有利于防止键冲突和项目的可维护性,比较推荐的方式是使用"业务名:对象名:唯一标识:属性"作为键名。例如
MySQL的数据库名为vs,用户表名为user_info,那么对应的键可以使用"vs:user_info:6379"、“vs:user_info:6379:name"来表示,如果当前Redis只会被一个业务使用,可以省略业务名"vs:”。如果键名过程,则可以使用团队内部都认同的缩写替代,例如"user:6379:friends:messages:5217"可以被"u:6379🇫🇷m:5217"代替。毕竟键名过长,还是会导致 Redis的性能明显下降的。
计数(Counter)功能
许多应用都会使用Redis作为计数的基础工具,它可以实现快速计数、查询缓存的功能,同时数据可以异步处理或者落地到其他数据源。如图所示,例如视频网站的视频播放次数可以使用Redis来完成:用户每播放一次视频,相应的视频播放数就会自增1。

// 在 Redis 中统计某视频的播放次数
long incrVideoCounter(long vid) {key = "video:" + vid;long count = Redis 执⾏命令:incr keyreturn counter;}
 
实际中要开发一个成熟、稳定的真实计数系统,要面临的挑战远不止如此简单:防作弊、按照不同维度计数、避免单点问题、数据持久化到底层数据源等。
共享会话(Session)
如图所示,一个分布式Web服务将用户的Session信息(例如用户登录信息)保存在各自的服务器中,但这样会造成一个问题:出于负载均衡的考虑,分布式服务会将用户的访问请求均衡到不同的服务器上,并且通常无法保证用户每次请求都会被均衡到同一台服务器上,这样当用户刷新一次访问是可能会发现需要重新登录,这个问题是用户无法容忍的。
Session分散存储:

为了解决这个问题,可以使用Redis将用户的Session信息进行集中管理,如下图所示,在这种模式下,只要保证Redis是高可用和可扩展性的,无论用户被均衡到哪台Web服务器上,都集中从Redis 中查询、更新Session信息。
Redis集中管理 Session:

手机验证码
很多应用出于安全考虑,会在每次进行登录时,让用户输入手机号并且配合给手机发送验证码,然后让用户再次输入收到的验证码并进行验证,从而确定是否是用户本人。为了短信接口不会频繁访问,会限制用户每分钟获取验证码的频率,例如一分钟不能超过5次。
此功能可以用以下伪代码说明基本实现思路:
String 发送验证码(phoneNumber) {key = "shortMsg:limit:" + phoneNumber;// 设置过期时间为 1 分钟(60 秒)// 使⽤ NX,只在不存在 key 时才能设置成功bool r = Redis 执⾏命令:set key 1 ex 60 nx if (r == false) {// 说明之前设置过该⼿机的验证码了long c = Redis 执⾏命令:incr key if (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的字符串数据类型可以使用的几个场景,但其适用场景远不止于此,开发人员可以结合字符串类型的特点以及提供的命令,充分发挥自己的想象力,在自己的业务中去找到合适的场景去使用Redis的字符串类型。
相关文章:
Redis String类型
String 类型是 Redis 最基本的数据类型,String 类型在 Redis 内部使用动态长度数组实现,Redis 在存储数据时会根据数据的大小动态地调整数组的长度。Redis 中字符串类型的值最大可以达到 512 MB。 关于字符串需要特别注意∶ 首先,Redis 中所…...
lxd提权
lxd/lxc提权 漏洞介绍 lxd是一个root进程,它可以负责执行任意用户的lxd,unix套接字写入访问操作。而且在一些情况下,lxd不会调用它的用户权限进行检查和匹配 原理可以理解为用用户创建一个容器,再用容器挂载宿主机磁盘…...
Ubuntu+Tesla V100环境配置
系统基本信息 nvidia-smi’ nvidia-smi 470.182.03 driver version:470.182.03 cuda version: 11.4 查看系统体系结构 uname -aUTC 2023 x86_64 x86_64 x86_64 GNU/Linux 下载miniconda https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/?CM&OA https://mi…...
leetcode:用栈实现队列(先进先出)
题目描述 题目链接:232. 用栈实现队列 - 力扣(LeetCode) 题目分析 我们先把之前写的数组栈的实现代码搬过来 用栈实现队列最主要的是实现队列先进先出的特点,而栈的特点是后进先出,那么我们可以用两个栈来实现&…...
<JavaEE> 什么是进程控制块(PCB Process Control Block)?
目录 一、进程控制块的概念 二、进程控制块的重要属性 2.1 唯一身份标识(PID) 2.2 内存指针 2.3 文件描述符表 2.4 状态 2.5 优先级 2.6 记账信息 2.7 上下文 一、进程控制块的概念 进程控制块(Process Control Block, PCBÿ…...
简历上的工作经历怎么写
通过了简历筛选,后续的面试官会仔细阅读你的简历内容。他们在找什么呢?他们希望搞清楚你在某一段经历中具体干了什么,并且判断你的能力具体达到了什么水平。 简历在线制作下载:百度幻主简历 面试官喜欢具体的经历 越具体&#x…...
数值分析总结
数值分析总结思维导图 Docs 相关代码的使用和注释 列主元Gauss消元法 %%列主元高斯消元法 function xGauss_lzy(A,b)%A为方程组系数矩阵,b为方程组的右侧向量,x为方程组的解 [n,m]size(A);%%得到矩阵A的行和列的宽度 nblength(b);%%方程组右侧向量的长…...
osg demo汇总
1.example_osganimate 演示了路径动画的使用(AnimationPath、AnimationPathCallback),路径动画回调能够做用在Camera、CameraView、MatrixTransform、PositionAttitudeTransform等四种类型的节点上。 演示了osgSim::OverlayNode的使用node 2…...
Leetcode.1590 使数组和能被 P 整除
题目链接 Leetcode.1590 使数组和能被 P 整除 rating : 2039 题目描述 给你一个正整数数组 n u m s nums nums,请你移除 最短 子数组(可以为 空),使得剩余元素的 和 能被 p p p 整除。 不允许 将整个数组都移除。 请你返回你需…...
uniappios请求打开麦克风 uniapp发起请求
第一种 ajax请求方式 uni.request(OBJECT) 参数名类型必填默认值说明平台差异说明urlString是开发者服务器接口地址dataObject/String/ArrayBuffer否请求的参数App(自定义组件编译模式)不支持ArrayBuffer类型headerObject否设置请求的 header,header 中不能设置 Referer。…...
Java 注解在 Android 中的使用场景
Java 元注解有 5 种,常用的是 Target 和 Retention 两个。 其中 Retention 表示保留级别,有三种: RetentionPolicy.SOURCE - 标记的注解仅保留在源码级别中,并被编译器忽略RetentionPolicy.CLASS - 标记的注解在编译时由编译器保…...
【开源】基于Vue和SpringBoot的数字化社区网格管理系统
项目编号: S 042 ,文末获取源码。 \color{red}{项目编号:S042,文末获取源码。} 项目编号:S042,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、开发背景四、系统展示五、核心源码5…...
Go语言简要介绍
Golang是一种编程语言,也称为Go或者Go语言。它是由Google开发的一种编译型、静态类型的语言。Golang的目标是提高程序开发的效率,同时保证程序的性能和安全。 Golang在语法结构上类似于C语言,但是通过引入新的概念和语法,比如gor…...
STM32H7 RTC及PC13问题
程序加了RTC时间过后,发现原本的RTC定时唤醒中断也不好使了,开始以为是PC13入侵检测引脚问题,经过测试,发现了一个大问题,当使用 HAL_RTC_SetTime(&hrtc, &time, RTC_FORMAT_BCD); 函数后,RTC变得…...
AntDB“超融合+流式实时数仓”——颠覆50年未变的数据库内核
流式处理引擎,颠覆50年未变的数据库内核 流式处理的概念 2001年9月11日,美国世贸大楼被袭击,美国国防部第一次将“主动预警”纳入国防的宏观战略规划。而IBM作为当时全球最大的IT公司,承担了大量基础支撑软件研发的任务。其中200…...
TZOJ 1376 母牛的故事(递推和递归)
答案1(递推): #include<stdio.h> int main() {int n0,i0;int a[55] { 0,1,2,3,4 }; //数组下标就相当于过了几年,以第四年母牛生出的第一只小母牛成年为周期,初始化前四年的值while (scanf("%d", …...
五种多目标优化算法(MOPSO、MOAHA、NSGA2、NSGA3、MOGWO)求解微电网多目标优化调度(MATLAB)
一、多目标优化算法简介 (1)多目标粒子群优化算法MOPSO 多目标应用:基于多目标粒子群优化算法MOPSO求解微电网多目标优化调度(MATLAB代码)-CSDN博客 (2)多目标人工蜂鸟算法(MOAHA…...
01_原理-事件循环
01_原理-事件循环 文章目录 01_原理-事件循环一、浏览器的进程模型①:何为进程?②:何为线程?③:浏览器有哪些进程和线程? 二、渲染主线程是如何工作的?三、若干解释①:何为异步&…...
Redis的性能,哨兵模式,集群,
Redis的性能管理; redis的数据保存在内存中 redis-cli info memory redis内存使用info memory命令参数解析 used_memory:236026888 由 Redis 分配器分配的内存总量,包含了redis进程内部的开销和数据占用的内存,以字节(byte)…...
如何选择共模噪声滤波器
在当前电子产品中,绝大多数的高速信号都使用地差分对结构。 差分结构有一个好处就是可以降低外界对信号的干扰,但是由于设计的原因,在传输结构上还会受到共模噪声的影响。 共模噪声滤波器就可以用于抑制不必要的共模噪声,而不会对…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
【大模型】RankRAG:基于大模型的上下文排序与检索增强生成的统一框架
文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点 C 模型结构C.1 指令微调阶段C.2 排名与生成的总和指令微调阶段C.3 RankRAG推理:检索-重排-生成 D 实验设计E 个人总结 A 论文出处 论文题目:RankRAG:Unifying Context Ranking…...
机器学习复习3--模型评估
误差与过拟合 我们将学习器对样本的实际预测结果与样本的真实值之间的差异称为:误差(error)。 误差定义: ①在训练集上的误差称为训练误差(training error)或经验误差(empirical error&#x…...
