一、字符串操作
1. set命令
1)set命令详解
- 基本语法与参数
- 命令格式:set key value [ex 秒数]/[px 毫秒数][nx]/[xx]
- 有效期设置:
- ex参数:以秒为单位设置过期时间,如set a 1 ex 10表示10秒有效
- px参数:以毫秒为单位设置过期时间,如set a 1 px 9000表示9秒有效
- 注意事项:
- ex和px不要同时使用,否则以后面的参数为准
- 例如set a 1 ex 100 px 9000实际以9000毫秒为准
- 条件参数nx/xx
- nx(not exist):
- 仅当key不存在时才执行操作
- 示例:set site www.baidu.com nx,若site已存在则操作无效
- xx(exist):
- 仅当key存在时才执行操作(相当于修改)
- 示例:set site www.google.com xx,若site不存在则操作无效
- 默认行为:
- 不加参数时:key不存在则创建,存在则修改
- nx(not exist):
- 有效期冲突处理
- 冲突规则:
- 当ex和px同时指定时,以后面的参数为准
- 示例:set search www.baidu.com ex 10 px 1567实际以1567毫秒为准
- 实际应用:
- 建议只使用一种时间单位(秒或毫秒)
- 毫秒级精度更高,适合需要精确控制的场景
- 相关辅助命令
- ttl命令:查看key剩余生存时间(秒)
- pttl命令:查看key剩余生存时间(毫秒)
- persist命令:移除key的过期时间,使其永久有效
- flushdb命令:清空当前数据库所有key
- 批量操作命令
- mset命令:一次性设置多个键值对
- 示例:mset key1 v1 key2 v2...
- mget命令:一次性获取多个key的值
- 示例:mget key1 key2...
- mset命令:一次性设置多个键值对
2)mset命令
- 批量设置:一次性设置多个键值对,语法为mset key1 value1 key2 value2...
- 实例演示:如mset a aman b bold c controller d diamond同时设置四个键值
- 效率优势:相比多次使用set命令,减少网络往返时间,提升操作效率
- 注意事项:所有键值必须成对出现,若参数数量为奇数会报错
3)mget命令
- 批量获取:一次性获取多个键的值,语法为mget key1 key2...
- 实例演示:如mget a b c可同时获取键a、b、c对应的值
- 返回值顺序:返回值的顺序与请求键的顺序严格对应
- 特殊处理:当某个键不存在时,返回列表中对应位置显示(nil)
- 性能对比:与循环执行get命令相比,显著减少网络开销
- 相关字符串操作
- 过期时间设置:
- ex参数设置秒级过期(如set a 1 ex 10)
- px参数设置毫秒级过期(如set a 1 px 9000)
- 同时存在时以后出现的参数为准
- 条件设置:
- nx:仅当键不存在时设置(类似setnx)
- xx:仅当键存在时设置
- 字符串修改:
- setrange key offset value:从指定偏移量开始修改字符串
- 偏移量超长时自动用0x00填充(如setrange greet 6 !)
4)setrange命令
- 基本功能
- 命令格式: setrange key offset value
- 核心作用: 修改字符串中指定偏移位置的字节内容
- 操作原理: 从字符串的offset偏移位置开始,用value值进行覆盖替换
- 基础示例
- 示例演示:
- 偏移规则: 字符串偏移量从0开始计算,如"hello"中h=0,e=1,l=2...
- 边界情况处理
- 超长偏移处理: 当offset超过原字符串长度时,中间空缺部分会自动用
0x000x000x00
填充 - 填充示例:
- 内存变化: 命令返回值为修改后的字符串总长度
- 实战案例
- 应用场景: 可用于实现文字游戏功能
- 案例演示:
- 注意事项: 替换内容长度可以与原内容不同,但会影响最终字符串长度
- 特殊字符处理
- 空位填充: 偏移量超过字符串长度时,中间空位会显示为
0x000x000x00
- 显示效果: 在Redis客户端中会直接显示为\x00字符
- 内存占用: 这些填充字符会占用实际存储空间
5)append命令
- 功能描述: 将指定value追加到key的原值末尾
- 语法格式: append key value
- 操作示例:
- 原值"he11o\x00!"执行append word @@后变为"he11o\x00!@@"
- 演示了在字符串尾部追加内容的实际效果
- 特点:
- 操作简单直接,类似字符串拼接
- 会修改原始键值对内容
- 返回值为操作后字符串的总长度
6)getrange命令
- 功能描述: 获取字符串中指定范围的子串
- 语法格式: getrange key start stop
- 下标规则:
- 左数从0开始,右数从-1开始
- 示例:getrange title 0 3返回"chin"
- 示例:getrange title 1 -2返回"hines"
- 边界情况:
- 当
start>=lengthstart >= lengthstart>=length
时返回空字符串 - 当
stop>=lengthstop >= lengthstop>=length
时截取至字符串结尾 - 当start位置在stop右边时返回空字符串
- 当
- 注意事项:
- 范围包含start和stop位置字符
- 支持正负索引混合使用
7)getset命令
- 功能描述: 获取旧值并设置新值
- 语法格式: getset key newvalue
- 特点:
- 原子性操作,保证线程安全
- 返回值为修改前的旧值
- 示例:set cnt 0后执行getset会返回0
- 使用场景:
- 需要获取当前值并更新的场景
- 计数器等需要原子操作的场景
8)setrange命令
- 功能描述: 从指定位置开始修改字符串内容
- 语法格式: setrange key offset value
- 操作示例:
- setrange word 2 ??将"he11o"修改为"he??o"
- setrange word 6 !在超出位置填充空字节后添加字符
- 特点:
- 可以覆盖原有内容
- 当offset超过原字符串长度时用空字节(
\x00\x00\x00
)填充 - 返回值为修改后字符串的总长度
- 与append区别:
- setrange可指定修改位置
- append只能在末尾追加
9)getrange命令
- 基本语法: getrange key start stop
- 作用: 获取字符串中
[start,stop][start,stop][start,stop]
范围的子串 - 下标规则:
- 左数从
000
开始 - 右数从
−1-1−1
开始(倒数第一个字符)
- 左数从
- getrange命令使用示例
- 正向索引示例:
- set title 'chinese'后
- getrange title 0 3返回"chin"
- 解释: 包含第0到第3个字符(含两端)
- 反向索引示例:
- getrange title 1 -2返回"hines"
- 应用场景: 如处理动词时去掉"ing"后缀
- 例:getrange status 0 -4可取出"work"(原词为"working")
- 正向索引示例:
- 特殊情况处理
- 边界条件:
- 空字符串情况:
- 当
start≥lengthstart \geq lengthstart≥length
(超出字符串长度) - 当
startstartstart
在stopstopstop
右边(如start=6start=6start=6
,stop=3stop=3stop=3
)
- 当
- 截断处理:
- 当
stop≥lengthstop \geq lengthstop≥length
时自动截取至字符串结尾
- 当
- 空字符串情况:
- 记忆要点:
- 范围包含两端字符(闭区间)
- 反向索引时
−1-1−1
表示最后一个字符 - 无效范围返回空字符串而非报错
- 相关命令:
- getset key newvalue: 获取旧值并设置新值
- 示例:计数器场景中getset cnt 1返回"0"并更新值为1
- 边界条件:
10)getset命令
- 功能特点:同时执行获取旧值和设置新值两个操作,原子性保证数据一致性
- 典型应用:状态更新场景(如睡眠->起床->工作状态变更)
- 返回值说明:返回的是被替换前的旧值
- 操作示例:
- 效率优势:相比先get再set的两步操作,减少网络往返时间
11)incr和decr命令
- incr和decr的基本操作
- 基础功能:
- incr key:将key存储的值加1,返回增加后的值
- decr key:将key存储的值减1,返回减少后的值
- 特殊处理:
- 不存在的key会被当作0处理后再执行操作
- 数值范围限制为64位有符号整数
- 操作示例:
- 基础功能:
- 应用场景:秒杀和抢票设计
- 设计原理:利用内存操作的高性能和原子性特征
- 实现方案:
- 初始化商品数量:set product_count 100000
- 用户抢购时执行:decr product_count
- 返回值≥0表示抢购成功,<0表示库存不足
- 优势分析:
- 避免直接操作关系型数据库
- 资格确认与实际订单分离
- 支持高并发请求处理
- 注意事项:需要后续异步处理真实订单数据
- incrby和decrby命令
- 扩展功能:
- incrby key increment:按指定整数值增加
- decrby key decrement:按指定整数值减少
- incrbyfloat key increment:支持浮点数增量
- 操作示例:
- 使用场景:适用于需要批量调整数值的场景,如积分批量增减、年龄跨年更新等
12)incrby和decrby命令
- 整型增减:
- incrby key number:将键值增加指定整数,如incrby age 90将age从2增加到92
- decrby key number:将键值减少指定整数,如decrby age 3将age从19减少到16
- 基础命令incr/decr是增减1的特例,如decr age使20变为19
- 浮点增减:
- incrbyfloat key floatnumber:支持浮点数增量,如incrbyfloat age 3.5使92变为95.5
- 特殊场景:适用于需要半岁概念的场景(如29.5岁),演示中通过incrbyfloat age 0.5实现
13)setbit命令
- 位读取:
- getbit key offset:获取值二进制表示的指定位(左起从0编号)
- 示例:字符'A'的二进制中,第1位为1,第2位为0,第7位为1
- 位修改:
- setbit key offset value:设置指定位的值并返回旧值
- 注意事项:
- offset过大会自动填充中间位为0
- 演示中将字符'Q'通过位操作变为'q'(修改第7位)
- 位运算:
- BITOP operation destkey key1 [key2...]:支持AND/OR/NOT/XOR四种位运算
- 特殊限制:NOT操作只能对单个key进行
- 案例:通过bitop or char char lower实现大小写转换
14)例题:字母大小写转换
- ASCII码与大小写转换原理
- 大小写ASCII码差异:大写字母与小写字母在ASCII码表中相差32,例如大写A是65,小写a是97。
- 二进制位规律:大写字母与小写字母的二进制表示在第5位(从右数第3位)不同,大写为0,小写为1。如A(65)是01000001,a(97)是01100001。
- 转换方法:通过位操作直接加减32即可实现大小写转换,比if-else判断更高效。
- Redis位操作命令
- setbit命令:
- 功能:设置指定偏移量上的二进制位值
- 语法:setbit key offset value
- 返回值:该位上的旧值
- 注意事项:offset过大会自动填充0
- getbit命令:
- 功能:获取指定偏移量上的二进制位值
- 语法:getbit key offset
- 编号规则:从左从0开始编号
- setbit命令:
- BITOP位运算
- 功能:对多个key进行位运算并将结果保存到目标key
- 支持的运算:AND(与)、OR(或)、NOT(非)、XOR(异或)
- 语法:BITOP operation destkey key1 [key2...]
- 应用场景:可用于批量处理二进制数据,如同时修改多个标志位
- 通用大小写转换实现
- 核心思路:利用ASCII码中大小写字母固定的32差值
- 优势:无需逐个字母判断,通过统一位操作即可完成
- 实现步骤:
- 获取字符的ASCII码值
- 通过位操作修改第5位
- 将结果写回Redis
- 效率对比:比传统的条件判断方法更高效,特别适合批量处理
2. setbit命令详解
- 基本原理:通过修改ASCII码的二进制位实现大小写转换
- 关键位:ASCII码中第2位(偏移量2)决定大小写,1为小写,0为大写
- 操作示例:
- 将字符'A'变为'a':setbit char 2 1
- 将字符'b'变为'B':setbit char 2 0
- 获取字符值:get char
1)例题:设置字符为小写
- 解题步骤:
- 确定要修改的位偏移量(ASCII码第2位)
- 使用setbit命令将该位设为1
- 验证结果使用get命令
- 关键点:无论原字符是什么,通过修改第2位都能实现大小写转换
1)setbit命令的注意事项
- 参数限制:
- offset最大值为
232−12^{32}-1232−1
(4294967295) - 超过限制会报错:"ERR bit offset is not an integer or out of range"
- offset最大值为
- 自动填充:当offset过大时,中间会自动填充0
- 内存影响:大offset操作会占用大量内存(最大512MB)
- 位操作原理
- 内存计算:
- 最大offset为N时,需要
(N+1)/8(N+1)/8(N+1)/8
个字节 -
2322^{32}232
位 = 512MB内存
- 最大offset为N时,需要
- 验证方法:
- 尝试setbit char 4294967296 1会报错
- setbit char 4294967295 1可以成功
- 内存计算:
- BITOP命令
- 操作类型:AND、OR、NOT、XOR
- 使用示例:
- bitop or char char lower 将字符转为小写
- NOT操作只能对单个key进行
- 注意事项:操作结果会保存到destkey中
3. bitop命令
1)bitop命令介绍
- 基本语法: bitop operation destkey key1 [key2...]
- 操作类型:
- AND: 按位与操作
- OR: 按位或操作
- NOT: 按位非操作(注意:NOT操作只能对单个key执行)
- XOR: 按位异或操作
- 存储机制: 将操作结果保存到destkey中
- 字符串限制:
- offset最大值为
232−12^{32}-1232−1
- 由此可推出最大字符串长度为512MB
- offset最大值为
2)bitop操作示例
- setbit使用:
- setbit lower 7 0:将lower键的第7位设为0
- setbit lower 2 1:将lower键的第2位设为1
- get操作验证:
- get lower:查看设置后的二进制值
- set char Q:设置字符'Q'
- bitop or char char lower:对char和lower执行OR操作后存回char
- 结果验证:get char返回"q",说明大小写转换成功
3)位操作与字符串变化
- 位操作本质:
- 通过设置特定bit位(如第2位)为1,创建"触发器键"
- OR操作特性:任何值与触发器OR操作后,对应位必然变为1
- AND操作特性:与特定掩码AND操作可清除指定位
- 最大偏移量验证:
- setbit char 4294967295 1:成功设置最大偏移量
- setbit char 4294967296 1:报错"bit offset out of range"
- 内存计算:
- 最大字符串值计算公式:
232∗2−3=512MB2^{32}*2^{-3}=512MB232∗2−3=512MB
- 每个字节对应8个bit位
- 最大字符串值计算公式:
4)大小写转换操作
- 小写转换器:
- setbit lower 2 1:设置第2位为1(ASCII大小写差异位)
- 任何字符与lower执行OR操作后,对应字母变为小写
- 示例:'Q'(01010001)OR lower → 'q'(01110001)
- 大写转换器:
- 创建特定掩码(如11011111)
- 通过AND操作清除第5位实现大写转换
- 实际应用:
- 注意事项:
- NOT操作只能作用于单个key
- 位操作会直接修改原始值,建议先备份重要数据
- 大偏移量操作可能影响性能,需谨慎使用
二、知识小结
知识点 |
核心内容 |
关键参数/用法 |
应用场景 |
SET命令 |
设置字符串类型键值 |
EX(秒级过期)、PX(毫秒级过期)、NX(仅不存在时设置)、XX(仅存在时更新) |
缓存设置、分布式锁 |
MSET/MGET |
批量设置/获取多个键值 |
原子性操作多个键值对 |
初始化配置、批量数据查询 |
SETRANGE |
修改字符串指定偏移量内容 |
offset(从0开始)、自动用0x00填充空缺 |
字符串局部修改、掩码处理 |
GETRANGE |
获取字符串子串 |
支持负偏移量(从-1开始反向计数) |
提取固定格式数据(如文件扩展名) |
APPEND |
字符串追加操作 |
自动扩展原始字符串 |
日志追加、消息队列 |
INCR/DECR |
原子增减操作 |
INCRBY/DECRBY指定步长、INCRBYFLOAT浮点增减 |
计数器、秒杀库存控制 |
位操作 |
二进制位级别操作 |
SETBIT(设置特定位)、BITOP(位运算AND/OR/XOR) |
布隆过滤器、权限位图 |
GETSET |
获取旧值并设置新值 |
原子性取值+更新操作 |
状态机转换记录 |
字符串限制 |
最大长度限制 |
通过位偏移推算最大支持512MB字符串 |
大数据存储场景 |