20250708-03-string结构及命令详解_笔记

一、字符串操作

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不存在则创建,存在则修改
  • 有效期冲突处理
    • 冲突规则:
      • 当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...
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开始编号
  • 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过大时,中间会自动填充0
  • 内存影响:大offset操作会占用大量内存(最大512MB)
  • 位操作原理
    • 内存计算:
      • 最大offset为N时,需要

        (N+1)/8(N+1)/8(N+1)/8

        个字节
      • 2322^{32}232

        位 = 512MB内存
    • 验证方法:
      • 尝试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
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字符串

大数据存储场景

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值