Redis(三) String字符串

在这里插入图片描述

文章目录

  • 前言
  • 常见命令
    • SET
    • GET
    • MSET
    • MGET
    • INCR
    • INCRBY
    • DECR
    • DECRBY
    • INCRBYFLOAT
    • APPEND
    • GETRANGE
    • SETRANGE
    • STRLEN
    • 命令小结

前言

Redis 的数据有很多种数据类型,包括字符串类型、列表类型、哈希类型、集合类型、有序集合类型等。这几种数据类型是针对于 value 来说的,redis 的 key 都是字符串类型,可以说字符串是 redis 最基本的数据类型,其他几种数据结构也是在字符串类似基础上构建的,例如列表和集合的元素类型是字符串类型,所以字符串类型能为其他 4 种数据结构的学习奠定基础。

字符串类型的值实际可以是字符串,包含⼀般格式的字符串或者类似 JSON、XML 格式的字符串;数字,可以是整型或者浮点型;甚⾄是⼆进制流数据,例如图⽚、⾳频、视频等。不过⼀个字符串的最⼤值不能超过 512 MB。

字符串数据类型
在这里插入图片描述

常见命令

SET

set 命令将 String 类型的 value 设置到 key 中。如果之前 key 存在,则覆盖,无论之前的数据类型是什么,都会将其覆盖,并且关于之前 key 的 TTL 全部失效。

127.0.0.1:6379> set key1 hello
OK
127.0.0.1:6379> expire key1 10
(integer) 1
127.0.0.1:6379> ttl key1
(integer) 6
127.0.0.1:6379> set key1 world
OK
127.0.0.1:6379> get key1
"world"
127.0.0.1:6379> ttl key1
(integer) -1

上面只是 set 的简单用法,set 的完整用法如下:

SET key value [expiration EX seconds | PX milliseconds] NX | XX]
  • EX seconds:以秒为单位设置 key 的过期时间
  • PX milliseconds:以毫秒为单位设置 key 的过期时间
  • NX:只有当 key 不存在时才进行设置,key 存在设置不执行
  • XX:只有当 key 存在时才进行设置,key 不存在时设置不执行

并且 SET 命令还可以简化为:SETNX、SETEX、SETPX、SETXX、PSETNX

SET 命令时间复杂度:O(1)
返回值:设置成功返回 OK,失败返回 nil

FLUSHALL 可以用来清除当前 redis 中存储的所有 key,在工作中一定要慎用该命令。

//NX key1不存在时创建
127.0.0.1:6379> set key1 hello ex 10 NX
OK
127.0.0.1:6379> ttl key1
(integer) 5
127.0.0.1:6379> ttl key1
(integer) -2
//key1存在时创建,失败
127.0.0.1:6379> set key1 hello
OK
127.0.0.1:6379> set key1 world ex 10 NX
(nil)
//XX key1 存在时创建,成功
127.0.0.1:6379> set key1 hello
OK
127.0.0.1:6379> set key1 world ex 10 XX
OK
127.0.0.1:6379> get key1
"world"
127.0.0.1:6379> ttl key1
(integer) 4
//XX key1不存在时创建,失败
127.0.0.1:6379> get key1
(nil)
127.0.0.1:6379> set key1 hello ex 10 XX
(nil)

GET

获取 key 对应的 value,如果 key 不存在,则返回 nil,如果 value 的类型不为 String 字符串类型,则会报错。

GET 命令时间复杂度:O(1)
返回值:获取成功返回对应 key 的 value 值,key 不存在返回 nil

127.0.0.1:6379> keys *
(empty array)
//key1不存在
127.0.0.1:6379> get key1
(nil)
127.0.0.1:6379> set key1 hello
OK
127.0.0.1:6379> get key1
"hello
127.0.0.1:6379> lpush key2 nihao
(integer) 1
127.0.0.1:6379> get key2
(error) WRONGTYPE Operation against a key holding the wrong kind of value

使用 lpush 命令设置的 key 的 value 的数据类型是列表类型,当我们使用 get 名来来获取 key 的时候就会报错:WRONGTYPE Operation against a key holding the wrong kind of value

MSET

mset 命令用来一次设多个 key,因为分多次设置 key 的话,就意味着需要进行多次网络传输,那么速度就会很慢,所以我们 redis 也考虑到了这点,允许一次请求设置多个 key。MSET key value [key value...]

MSET 时间复杂度:O(N),N为key的数量
返回值:设置成功返回 OK,设置失败返回 nil

127.0.0.1:6379> mset key1 hello key2 world
OK
127.0.0.1:6379> get key1
"hello"
127.0.0.1:6379> get key2
"world"

但是这个一次设置多个 key 的时候就不能像上面的 set 完整命令一样了,这里一次设置多个 key 只支持 set 的简单用法。

127.0.0.1:6379> mset key1 hello ex 20 NX key2 world ex 20 NX
OK
127.0.0.1:6379> ttl key1
(integer) -1
127.0.0.1:6379> get key1
"hello"
127.0.0.1:6379> get key2
(nil)

MGET

与 MSET 相对应的——MGET可以一次获取多个 key:
MGET key [key...]

MGET 时间复杂度:O(N),N为 key 的数量
返回值:获取成功,返回n个 key 对应的 value 值,获取失败,key 不存在,对应的返回值为 nil

127.0.0.1:6379> mset key1 hello key2 world
OK
127.0.0.1:6379> mget key1 key2
1) "hello"
2) "world"

INCR

INCR 命令将对应的 String 字符串所表示的数字加一。如果 key 不存在,那么这个 key 会被当作 0,然后加一结果就是1,如果 key 对应的 value 类型不是整型或者加1之后超出了 64 位可以表示的范围,则报错。INCR key

时间复杂度:0(1)
返回值:返回 key 值加一之后的值

127.0.0.1:6379> set key1 10
OK
127.0.0.1:6379> incr key1
(integer) 11
127.0.0.1:6379> get key2
(nil)
127.0.0.1:6379> incr key2
(integer) 1
127.0.0.1:6379> get key2
"1"
127.0.0.1:6379> set key3 hello
OK
127.0.0.1:6379> incr key3
(error) ERR value is not an integer or out of range
127.0.0.1:6379> set key4 2222222222222222222222222222222222222222222
OK
127.0.0.1:6379> incr key4
(error) ERR value is not an integer or out of range

INCRBY

INCRBY 命令将指定的 key 的值加上任意值。如果 key 不存在,那么会将这个 key 当作 0 然后相加。INCRBY key n

时间复杂度:O(1)
返回值:返回 key 加上 n 之后的结果

127.0.0.1:6379> set key1 10
OK
127.0.0.1:6379> incrby key1 20
(integer) 30
127.0.0.1:6379> get key2
(nil)
127.0.0.1:6379> incrby key2 40
(integer) 40
127.0.0.1:6379> get key2
"40"

当然 n 也可以为负数:

127.0.0.1:6379> get key1
"30"
127.0.0.1:6379> incrby key1 -40
(integer) -10

但是我们通常不这样用,因为减去对应的值有专门的命令。

DECR

DECR 命令可以将指定的 key 减去 1,如果 key 不存在,则这个 key 会被当作 0,然后减去1,但是如果减去 1 之后的数据超过了 64 位能表示的数字就会报错。DECR key

时间复杂度:O(1)
返回值:key 减去 1 之后的值

127.0.0.1:6379> set key1 10
OK
127.0.0.1:6379> decr key1
(integer) 9
127.0.0.1:6379> get key2
(nil)
127.0.0.1:6379> decr key2
(integer) -1
127.0.0.1:6379> get key2
"-1"
127.0.0.1:6379> set key3 hello
OK
127.0.0.1:6379> decr key3
(error) ERR value is not an integer or out of range
127.0.0.1:6379> set key4 -222222222222222222222222222222222222
OK
127.0.0.1:6379> decr key4
(error) ERR value is not an integer or out of range

DECRBY

DECRBY 命令用来将指定的 key 减去 n。如果 key 不存在,则这个 key 会被当作 0 然后减去n。DECRBY key n

时间复杂度:O(1)
返回值:对应 key 减去 n 之后的值

127.0.0.1:6379> set key1 20
OK
127.0.0.1:6379> decrby key1 10
(integer) 10
127.0.0.1:6379> get key2
(nil)
127.0.0.1:6379> decrby key2 10
(integer) -10
127.0.0.1:6379> get key2
"-10"

这里 n 也可以是负数:

127.0.0.1:6379> get key1
"10"
127.0.0.1:6379> decrby key1 -20
(integer) 30
127.0.0.1:6379> get key1
"30"

但是不建议这样使用,加法用 INCRBY,减法用 DECRBY。

INCRBYFLOAT

INCRBYFLOAT 将 key 对应的 string 表示的浮点数加上对应的值。如果 n 为负数,则表示减去对应的值,如果 key 不存在,则 key 会当作 0,然后减去 n。如果 key 对应的不是 string,或者不是⼀个浮点数,则报错。允许采用科学计数法表示浮点数。INCRBYFLOAT key n

时间复杂度:O(1)
返回值:对应的 key 的 value 减去 n 之后的值

127.0.0.1:6379> set key1 13.14
OK
127.0.0.1:6379> incrbyfloat key1 6.86
"20"
127.0.0.1:6379> incrbyfloat key1 -10
"10"

既然存在 increbyfloat 加上浮点数的操作,那么是否存在 decrbyfloat 减去浮点数的命令呢?很遗憾这里不存在,这里 increbyfloat 是够我们使用的。

这里 incr、decr 就是类似前置++或者后置++的操作,我们都知道++操作在底层是分为三个步骤的:将变量的值从内存中读取->对变量进行+1操作->将修改之后的变量再存储到硬盘中。在多线程的环境中,由于++的操作不是原子性的操作,所以有可能发生线程不安全的问题。但是在 redis 中是不会发生这种问题的,因为我们的 redis 是单线程架构,不会出现类似的线程不安全问题。

APPEND

APPEND 命令,如果 key 已存在并且是一个 String 字符串,则会将 value 追加到原 key 的 value 的后面,如果不存在,则类似 SET 命令。APPEND key value

时间复杂度:O(1)
返回值:追加完成之后 String 的长度(单位字节)

127.0.0.1:6379> set key1 hello
OK
127.0.0.1:6379> append key1 world
(integer) 10
127.0.0.1:6379> get key2
(nil)
127.0.0.1:6379> append key2 redis
(integer) 5
127.0.0.1:6379> get key2
"redis"
127.0.0.1:6379> get key1
"helloworld"
127.0.0.1:6379> append key1 你好
(integer) 16
127.0.0.1:6379> get key1
"helloworld\xe4\xbd\xa0\xe5\xa5\xbd"

如果我们的 reids 字符串出现了中文的话,是会出现乱码的,那么为什么会出现乱码呢?这是因为 redis 底层是不知道什么字符编,redis 只认识字节,redis 中存储的是数据的二进制形式,那么通过查看 append 的返回值可以知道:在这里一个汉字占三个字节,redis 不是不知道一个字符有多少个字节吗,这里为什么呢?这是因为我们这里使用的是 xshell,xshell 默认的字符编码是 utf8,utf8中一个字符是3个字节。

在这里插入图片描述
但是在实际生活中我们很可能会向 redis 中存储中文,那么要想存储的中文显示出来也是中文怎么做呢?我们可以在启动 redis 的时候加上 --raw 这个选项,加上这个选项了之后,redis 会尽可能的对二进制数据进行翻译。

root@iZ2ze5bzkbeuwwqowjzo27Z:~# redis-cli --raw
127.0.0.1:6379> get key1
helloworld你好
127.0.0.1:6379> 

GETRANGE

GETRANGE 返回 key 对应 string 的子串,由 start 和 end 决定(左闭右闭)。可以使用负数表示倒数,-1 表示倒数第一个字符,-2 表示倒数第二个字符…(第一个字符用0表示)

时间复杂度:O(N) N为子串的长度
返回值:string 类型的子串

127.0.0.1:6379> get key1
"helloworld"
127.0.0.1:6379> getrange key1 5 9
"world"
127.0.0.1:6379> getrange key1 0 -1
"helloworld"
127.0.0.1:6379> getrange key1 4 20
"oworld"

如果 start end 的范围超出了字符串的范围,redis 会根据字符串的长度调整成正确的值。

如果字符串中存储的有汉字,那么使用 GETRANGE 获得的子串可能就不是完整的汉字了:

127.0.0.1:6379> getrange key1 10 11


这里没有显示出 key1 10-11 个字节的内容,因为10-12个字节才是一个完成的汉字“你”,这里10-11不能显示出完整的汉字。

SETRANGE

SETRANGE 覆盖字符串的一部分,从指定的偏移开始。SETRANGE key offset value

时间复杂度:O(N) N为子串的长度
返回值:替换后的字符换的长度

127.0.0.1:6379> get key1
helloworld你好
127.0.0.1:6379> setrange key1 5 hello
16
127.0.0.1:6379> get key1
hellohello你好
127.0.0.1:6379> setrange key1 5 hellohellohello
20
127.0.0.1:6379> get key1
hellohellohellohello
127.0.0.1:6379> get key2
你好
127.0.0.1:6379> setrange key2 2 hello
7
127.0.0.1:6379> get key2
伨ello

当 SETRANGE 设置的返回不是完整的一个汉字的时候,就可能出现其他的汉字。

127.0.0.1:6379> get key3
(nil)
127.0.0.1:6379> setrange key3 2 hello
(integer) 7
127.0.0.1:6379> get key3
"\x00\x00hello"

SETRANGE 可以设置一个不存在的 key,只不过偏移量之前的会被用 \x00 来填充。

STRLEN

STRLEN 获取 key 对应的 string 的长度(单位是字节),如果 key 的 value 的类型不是 string 类型的话,会报错。

时间复杂度:0(1)
返回值:string 字符串的长度,如果 key 不存在返回0

127.0.0.1:6379> get key1
"hellohellohellohello"
127.0.0.1:6379> strlen key1
(integer) 20
127.0.0.1:6379> get key4
(nil)
127.0.0.1:6379> strlen key4
(integer) 0

命令小结

命令执行效果时间复杂度
set key value [key value…]设置 key 的值是 valueO(k), k 是键个数
get keyget keyO(1)
del key [key …]删除指定的 keyO(k), k 是键个数
mset key value [key value…]mset key value [key value…]O(k), k 是键个数
mget key [key …]批量获取 key 的值O(k), k 是键个数
incr key指定的 key 的值 +1O(1)
decr key指定的 key 的值 -1指定的 key 的值 -1
incrby key n指定的 key 的值 +nO(1)
decrby key n指定的 key 的值 -nO(1)
incrbyfloat key n指定的 key 的值 +nO(1)
append key value指定的 key 的值追加 valueO(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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/535947.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据应用OneID:ID-Mapping Spark GraphX实现

前言 说明 以用户实体为例,ID 类型包含 user_id 和 device_id。当然还有其他类型id。不同id可以获取到的阶段、生命周期均不相同。 device_id 生命周期通常指的是一个设备从首次被识别到不再活跃的整个时间段。 user_id是用户登录之后系统分配的唯一标识&#xff…

ELK及ELFK排错

目录 一、ELK及ELFK排错思路 1.1filebeat侧排查 1.2logstash侧排查 1.3ES、kibana侧问题 一、ELK及ELFK排错思路 1.1filebeat侧排查 第一步:排查filebeat上的配置文件有没有写错,filebeat的配置文件是yml文件,一定要注意格式。 第二步…

Harmony鸿蒙南向驱动开发-HDMI接口使用

功能简介 HDMI(High Definition Multimedia Interface),即高清多媒体接口,主要用于DVD、机顶盒等音视频Source到TV、显示器等Sink设备的传输。 HDMI以主从方式工作,通常有一个Source端和一个Sink端。 HDMI接口定义了…

Harmony鸿蒙南向驱动开发-MIPI CSI接口使用

功能简介 CSI(Camera Serial Interface)是由MIPI联盟下Camera工作组指定的接口标准。CSI-2是MIPI CSI第二版,主要由应用层、协议层、物理层组成,最大支持4通道数据传输、单线传输速度高达1Gb/s。 物理层支持HS(High …

Flutter - 环境配置提示 cmdline-tools component is missing

问题: flutter doctor运行命令 flutter doctor 报错: Android toolchain - develop for Android devices (Android SDK version 30.0.2) ✗ cmdline-tools component is missing Run path/to/sdkmanager --install "cmdline-tools;lates…

NI-LabView的DAQ缺少或丢失的解决办法(亲测有效)

DAQmx在Labview中不显示或缺失 问题:在NI Packasge Manager安装完DAQ后在labview中不显示控件解决办法 问题:在NI Packasge Manager安装完DAQ后在labview中不显示控件 在打开测量I/O时,见不到 DAQmx,或者在Express中见不到DAQ助手…

《战神4》和《战神5》有什么联系吗 苹果电脑如何运行《战神4》苹果电脑玩战神 Mac玩游戏 战神5攻略 crossover激活码

《战神4》(God of War 2018)和《战神5》(God of War: Ragnark)是一对引人注目的游戏作品,它们不仅在游戏界引起了广泛的关注,也给玩家带来了深入探索北欧神话世界的机会。这两部游戏之间的联系不仅体现在剧…

Docker 安装 RocketMQ

目录 一、新建两个配置文件 1.1 创建docker-compose.yml文件 1.2 .新建broker.conf文件 二、运行 三、可视化界面 一、新建两个配置文件 1.1 创建docker-compose.yml文件 version: 3.5 services:rmqnamesrv:image: foxiswho/rocketmq:servercontainer_name: rmqnamesrvports…

集合系列(十九) -List与数组互转操作介绍

一、数组转List 方式一 通过 Arrays.asList(strArray) 方式,将数组转换List,但不能对List增删,只能查改,否则抛异常,例子如下: public static void main(String[] args) {//创建一个字符串数组String[] …

MobX入门指南:快速上手状态管理库

一、什么是MobX MobX 是一个状态管理库,它可以让你轻松地管理应用程序的状态,并且可以扩展和维护。它使用观察者模式来自动传播你的状态的变化到你的 React 组件。 二、安装及配置 安装 MobX 和 MobX-React:你可以使用 npm 或 yarn 安装这…

ubuntu 应用程序设置 开机自启动

1. 通过.desktop方式 autostart 中.desktop 配置文件 1.1 用户级自启动 登录后才可以启动服务。 可视化配置:在ubuntu自带的可视化程序来配置,就是StartupApplications,它在启动台中可以找到。 在ubuntu下目录是 ~/.config/autostart 添…

《前端面试题》- JS基础 - 伪数组

第一次听说伪数组这个概念,听到的时候还以为是说CSS的伪类呢,网上一查,这东西原来还是个很常见的家伙。 何为伪数组 伪数组有两个特点: 具有length属性,其他属性(索引)为非负整数但是却不具备…

solidworks electrical 2D和3D有什么区别

SolidWorks Electrical 是一款专为电气设计开发的软件工具,它提供了两种主要的工作环境:2D电气设计和3D电气集成设计。两者在功能和应用场景上存在显著的区别: SolidWorks Electrical 2D 设计 特点与用途: SolidWorks Electrica…

小程序中配置scss

找到:project.config.json 文件 setting 模块下添加: "useCompilerPlugins": ["sass","其他的样式类型"] 配置完成后,重启开发工具,并新建文件 结果:

MapReduce过程解析

一、Map过程解析 Read阶段:MapTask通过用户编写的RecordReader,从输入的InputSplit中解析出一个个key/value。Map阶段:将解析出的key/value交给用户编写的Map()函数处理,并产生一系列的key/value。Collect阶段:在用户编…

Day36|贪心算法part05:435. 无重叠区间、763.划分字母区间、56. 合并区间

435. 无重叠区间 有了上题射气球的因子,这题也就有思路了,反正无脑排序就行了: 首先将所有区间按照end的大小从小到大排序;选取最早end为起始x_end遍历所有区间,如果该区间的start比end大(可重叠&#xf…

【牛客SQL快速入门】SQL基础(三)

一、条件函数 IF 条件函数 IF函数是最常用到的条件函数,写法为 if(xn,a,b),xn代表判断条件,如果xn时,那么结果返回a,否则返回b。 -- 把非北京大学的用户统一归为其他大学 Select device_id,if(university ‘北京大…

51-基于GitHubActions的CI实战

在Go项目开发中,我们要频繁地执行静态代码检查、测试、编译、构建等操作。如果每一步我们都手动执行,效率低不说,还容易出错。所以,我们通常借助CI系统来自动化执行这些操作。 当前业界有很多优秀的CI系统可供选择,例…

✌2024/4/3—力扣—无重复字符的最长子串

代码实现&#xff1a; 解法一&#xff1a;暴力法 int lengthOfLongestSubstring(char *s) {int hash[256] {0};int num 0;for (int i 0; i < strlen(s); i) {int count 0;for (int j i; j < strlen(s); j) {if (hash[s[j]] 0) {hash[s[j]];count;num num > cou…

基于 WebRTC 实现的点对点文件传输和音视频聊天工具 | 开源日报 No.220

tl-open-source/tl-rtc-file Stars: 2.1k License: MIT tl-rtc-file 是一个基于 WebRTC 的文件传输工具&#xff0c;支持跨终端、不限平台的在线文件传输。它提供了丰富的功能和特性&#xff1a; 分片传输&#xff1a;支持大型文件的分片传输&#xff0c;确保高效稳定地完成上…