一、字符串操作

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字符串

大数据存储场景

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

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

相关文章

SpringBoot3-集成MybatisPlus

此次操作是在多模块下进行的&#xff0c;SpringBoot3-规划多模块目录 添加管理依赖 根模块 zibocoder-parent 的 pom.xml 中添加 MybatisPlus bom 管理依赖 <properties>...<mybatis-plus.version>3.5.12</mybatis-plus.version>... </properties> <…

部署MongoDB

环境:CentOS7 添加 MongoDB 官方 YUM 仓库 sudo vi /etc/yum.repos.d/mongodb-org-6.0.repo 将以下内容粘贴到文件中(以 MongoDB 6.0 为例): [mongodb-org-6.0] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/6.0/x86…

重学前端002 --响应式网页设计 CSS 基础

文章目录css 样式特殊说明根据在这里 Freecodecamp 实践&#xff0c;调整顺序后做的总结。 css 样式 body {background-color: red; # 跟background-image 不同时使用background-image: url(https://cdn.freecodecamp.org/curriculum/css-cafe/beans.jpg);font-family: sans-…

Zig高并发爬取数据简洁模版

上文中我们介绍了Zig语言得爬虫的有些优劣势&#xff0c;想必大家对于自身项目选择那种语言做爬虫应该有些思路了&#xff0c;今天我将使用Zig的标准库来构建一个简单的高并发爬虫模板。由于Zig的异步机制和标准库中的http模块&#xff0c;我们可以实现一个基于事件循环的爬虫。…

IS-IS 协议 | LSP 传输与链路状态数据库同步机制

略作整理&#xff0c;待校。IS-IS 中 SRM 与 SSN 标志的作用及协同机制 SRM 和 SSN 标志的作用 在 IS-IS 协议中&#xff0c;SRM 和 SSN 是两个关键标志&#xff0c;用于控制和优化 LSP&#xff08;Link State PDU,链路状态信息&#xff09;在网络中的泛洪与同步过程。 一、SRM…

xxl-job 改造适配pg数据后的Jenkins自动部署

接上文适配pg数据库之后需要进行部署&#xff0c;便有了此文 1.下载并安装Jenkins如下&#xff1a; https://mirrors.jenkins.io/war-stable/2.504.3/jenkins.war nohup java -jar jenkins.war --httpPort8080 & 启动Jenkins并解锁安装需要的环境&#xff0c;git&#xff0…

数据库Oracle从入门到精通!第四天(并发、锁、视图)

八、并发控制数据库是一个共享资源&#xff0c;可以为多个应用程序所共享&#xff0c;这些程序可以串行执行&#xff08;排队执行&#xff09;&#xff0c;但是很多情况下&#xff0c;可能出现多个程序或一个程序中的多个进程并行的执行&#xff0c;这就是数据库的并行操作&…

EXCEL(带图)转html

文章目录叙述1、效果2、excel 转换主逻辑3、其他补充3.0 主前端bootstrap3.1 my.css&#xff1a;3.2 my.js3.3 入口home.html3.4 Data.ashx叙述 要实现H5 展示excel 查询 了一下没有好的办法,自己写了一个,简单记录一下 1、效果 用bootstrap 根据sheet做了一个菜单。 2、exc…

小程序富文本Editor插入图片、超链接、公式等的一次尝试

小程序插入图片 通过EditorContext.insertImage接口可以实现图片的插入&#xff1a; EditorContext.insertImage({src,width,height,data, })如何插入超链接、公式、视频、表格等等? 通过EditorContext.insertCustomBlock应该是可以实现的&#xff0c;具体实现方式我没有了…

传输层协议TCP、UDP

传输层协议TCP、UDP 1、TCP和UDP报文格式 传输层协议TCPvsUDP 传输层主要两个传输协议&#xff0c;分别是TCP和UDP&#xff0c;负责提供流量控制、排序服务和错误校验。 &#xff08;1&#xff09;TCP是面向连接的&#xff0c;一般用于传输数据量比较少&#xff0c;且对可靠性要…

设计模式—专栏简介

大学总是忙着参加ACM实验室的各种事情&#xff0c;到了毕业的时候&#xff0c;对于设计模式也是仅了解单例模式。毕业后&#xff0c;刚开始代码也是乱写一通&#xff0c;完全没有章法。整个开发环境也是为了解决问题&#xff0c;从来没有考虑结构化什么的&#xff08;没办法&am…

面试150 链表的复制

思路 python可以使用调库法&#xff0c;使用深度拷贝 """ # Definition for a Node. class Node:def __init__(self, x: int, next: Node None, random: Node None):self.val int(x)self.next nextself.random random """class Solution:de…

MySQL分布式ID冲突详解:场景、原因与解决方案

引言 在分布式系统开发中&#xff0c;你是否遇到过这样的崩溃时刻&#xff1f;——明明每个数据库实例的自增ID都从1开始&#xff0c;插入数据时却提示“Duplicate entry ‘100’ for key ‘PRIMARY’”&#xff1b;或者分库分表后&#xff0c;不同库里的订单ID竟然重复&#x…

c++文字游戏_闯关打怪2.0(开源)

本次更新内容: 1.增强对手性能 2.可暂停(按N) 3.修复些许bug 4.增加boos关(第10、20、30...关) 1. 游戏概述 本游戏是一个基于Windows控制台的回合制战斗游戏,采用俯视视角的2D平面设计。玩家控制角色"p"在1325大小的封闭场景中与敌人"@"战斗,通过…

Java学习第十二部分——idea各种项目简介

目录 一.前言 二.语言介绍 三.生成器介绍 四.拓展 一.前言 打开idea项目创建时发现如上情况&#xff0c;“新建项目”下面的是语言&#xff0c;生成器下面的是这些语言对应的生成器工具&#xff0c;本文将简单介绍。 二.语言介绍 Java 用途&#xff1a;Java是一种广泛使…

Codeforces Round 868 (Div. 2) D. Unique Palindromes(1900,构造)

Problem - D - Codeforces 不错的字符串构造体&#xff0c;记录一下 首先注意到k≤20这一条件。对于一个长度为n的字符串&#xff0c;最多有n个不同的回文子串&#xff0c;这种情况出现在所有字符都相同时。因此&#xff0c;限制条件中的xi必须满足xi≤ci&#xff0c;且相邻两…

ClickHouse 全生命周期性能优化

引言 ClickHouse作为列式存储的OLAP数据库&#xff0c;以其极致的查询性能著称&#xff0c;但"高性能"并非开箱即用。不合理的表设计、SQL写法或集群配置&#xff0c;可能导致性能衰减甚至服务不可用。本文基于ClickHouse 24.3版本&#xff0c;从设计规范、开发规范、…

Linux sed 命令 详解

在 Linux 系统中&#xff0c;sed&#xff08;Stream Editor&#xff09;是一个非常强大且灵活的文本处理工具。它不仅可以用于简单的文本替换、删除和插入操作&#xff0c;还能实现复杂的文本转换任务。 &#x1f4cc; 一、什么是 sed&#xff1f; sed 是一个基于模式匹配对文…

项目进度同步不及时,如何提升信息透明度

项目进度同步不及时的核心问题包括沟通渠道不畅通、缺乏统一的信息平台、未建立明确的进度更新机制、团队意识不足、责任划分不明确等。其中&#xff0c;缺乏统一的信息平台最为关键。统一的信息平台能够确保所有相关人员实时掌握最新的进度状态&#xff0c;避免信息孤岛&#…

使用各种CSS美化网页

实验目的1.理解CSS的概念&#xff0c;掌握CSS定义样式的方法&#xff0c;具备使用CSS和相关库进行界面样式设计的能力。 2.掌握Bootstrap 5的基本使用方法。3.Bootstrap框架练习实验步骤1. 实验准备创建一个HTML文件&#xff08;如 index.html&#xff09;。引入Bootstrap5的CS…