Redis 中 String 字符串类型详解

目录

[Redis 字符串类型详解](#Redis 字符串类型详解)

字符串类型概述

基本特性

常见命令

SET

GET

MGET

MSET

SETNX

计数命令

其他命令

内部编码


Redis 字符串类型详解

在 Redis 中,字符串是最基础也是最常用的数据类型。这里介绍 Redis 字符串类型的特性、常见命令以及内部编码机制。


字符串类型概述

基本特性

  • 所有键都是字符串:在 Redis 里,所有的键(key)都是字符串类型。
  • 其他数据结构的基础:列表、集合等其他数据结构的元素也都是字符串类型。
  • 值的多样性:字符串类型的值可以是普通的文本、JSON 或 XML 格式的字符串、数字(整数或浮点数),甚至是二进制数据(如图片、音频、视频等)。
  • 最大长度限制:一个字符串的最大长度不能超过 512 MB。
  • 字符集编码:Redis 内部存储字符串时,完全按照二进制流的形式保存,不处理字符集编码问题。客户端传入的命令是什么字符集编码,就存储什么字符集编码。

常见命令

SET

  • 功能:设置一个键的值。如果这个键之前已经存在,那么它的旧值会被新值覆盖,无论原来的数据类型是什么。之前的过期时间也会失效。

  • 语法

    复制代码
    1SET key value [EX seconds|PX milliseconds] [NX|XX]
  • 选项

    • EX seconds:以秒为单位设置键的过期时间。
    • PX milliseconds:以毫秒为单位设置键的过期时间。
    • NX:只有在键不存在时才进行设置。
    • XX:只有在键存在时才进行设置。
  • 示例

    复制代码
    1redis> EXISTS mykey
    2(integer) 0
    3redis> SET mykey "Hello"
    4OK
    5redis> GET mykey
    6"Hello"
    7redis> SET mykey "World" NX
    8(nil)
    9redis> DEL mykey
    10(integer) 1
    11redis> EXISTS mykey
    12(integer) 0
    13redis> SET mykey "World" XX
    14(nil)
    15redis> GET mykey
    16(nil)
    17redis> SET mykey "World" NX
    18OK
    19redis> GET mykey
    20"World"
    21redis> SET mykey "Will expire in 10s" EX 10
    22OK
    23redis> GET mykey
    24"Will expire in 10s"
    25redis> GET mykey  # 10秒之后
    26(nil)

GET

功能 :获取一个键对应的值。如果键不存在,返回 nil。如果值不是字符串类型,会报错。

语法

复制代码
1GET key

示例

复制代码
1redis> GET nonexisting
2(nil)
3redis> SET mykey "Hello"
4OK
5redis> GET mykey
6"Hello"
7redis> DEL mykey
8(integer) 1
9redis> EXISTS mykey
10(integer) 0
11redis> HSET mykey name Bob
12(integer) 1
13redis> GET mykey
14(error) WRONGTYPE Operation against a key holding the wrong kind of value

MGET

功能 :一次性获取多个键的值。如果某个键不存在或者其值不是字符串类型,返回 nil

语法

复制代码
1MGET key [key ...]

示例

复制代码
1redis> SET key1 "Hello"
2OK
3redis> SET key2 "World"
4OK
5redis> MGET key1 key2 nonexisting
61) "Hello"
72) "World"
83) (nil)

MSET

功能:一次性设置多个键的值。

语法

复制代码
1MSET key value [key value ...]

示例

复制代码
1redis> MSET key1 "Hello" key2 "World"
2OK
3redis> GET key1
4"Hello"
5redis> GET key2
6"World"

SETNX

功能:设置一个键的值,但只在键不存在的情况下才设置。

语法

复制代码
1SETNX key value

示例

复制代码
1redis> SETNX mykey "Hello"
2(integer) 1
3redis> SETNX mykey "World"
4(integer) 0
5redis> GET mykey
6"Hello"

计数命令

INCR:将键对应的数值加 1。如果键不存在,则视为值为 0。

语法

复制代码
1INCR key

示例

复制代码
1redis> EXISTS mykey
2(integer) 0
3redis> INCR mykey
4(integer) 1
5redis> SET mykey "10"
6OK
7redis> INCR mykey
8(integer) 11

DECR:将键对应的数值减 1。如果键不存在,则视为值为 0。

语法

复制代码
1DECR key

示例

复制代码
1redis> EXISTS mykey
2(integer) 0
3redis> DECR mykey
4(integer) -1
5redis> SET mykey "10"
6OK
7redis> DECR mykey
8(integer) 9

INCRBYDECRBY:分别将键对应的数值加上或减去指定的值。

语法

复制代码
1INCRBY key increment
2DECRBY key decrement

示例

复制代码
1redis> INCRBY mykey 3
2(integer) 3
3redis> DECRBY mykey 3
4(integer) 0

INCRBYFLOAT:将键对应的浮点数值加上指定的值。

语法

复制代码
1INCRBYFLOAT key increment

示例

复制代码
1redis> SET mykey 10.50
2OK
3redis> INCRBYFLOAT mykey 0.1
4"10.6"

其他命令

APPEND :将值追加到键对应的字符串后面。如果键不存在,则效果等同于 SET 命令。

语法

复制代码
1APPEND key value

示例

复制代码
1redis> APPEND mykey "Hello"
2(integer) 5
3redis> APPEND mykey " World"
4(integer) 11

GETRANGE:获取键对应字符串的一部分,由起始和结束位置确定。

语法

复制代码
1GETRANGE key start end

示例

复制代码
1redis> SET mykey "This is a string"
2OK
3redis> GETRANGE mykey 0 3
4"This"

SETRANGE:从指定偏移量开始覆盖字符串的一部分。

语法

复制代码
1SETRANGE key offset value

示例

复制代码
1redis> SET key1 "Hello World"
2OK
3redis> SETRANGE key1 6 "Redis"
4(integer) 11

STRLEN:获取键对应字符串的长度。

语法

复制代码
1STRLEN key

示例

复制代码
1redis> SET mykey "Hello world"
2OK
3redis> STRLEN mykey
4(integer) 11

内部编码

Redis 会根据当前值的类型和长度动态决定使用哪种内部编码实现。字符串类型的内部编码有三种:

  • int:8 个字节的长整型。
  • embstr:小于等于 39 个字节的字符串。
  • raw:大于 39 个字节的字符串。

示例

整型类型

复制代码
1127.0.0.1:6379> set key 6379
2OK
3127.0.0.1:6379> object encoding key
4"int"

短字符串

复制代码
1127.0.0.1:6379> set key "hello"
2OK
3127.0.0.1:6379> object encoding key
4"embstr"

长字符串

复制代码
1127.0.0.1:6379> set key "one string greater than 39 bytes ........"
2OK
3127.0.0.1:6379> object encoding key
4"raw"

感谢阅览,后续会再更新 Redis 中其他数据类型的知识,感谢阅览!!

相关推荐
食咗未12 小时前
Linux USB HOST EXTERNAL STORAGE
linux·驱动开发
食咗未12 小时前
Linux USB HOST HID
linux·驱动开发·人机交互
Xの哲學12 小时前
Linux SLAB分配器深度解剖
linux·服务器·网络·算法·边缘计算
wang60212521813 小时前
阿里云存储的一些简要概述
数据库·阿里云·fastapi
齐鲁大虾13 小时前
UOS(统信操作系统)如何更新CUPS(通用Unix打印系统)
linux·服务器·chrome·unix
小徐Chao努力14 小时前
【Langchain4j-Java AI开发】08-向量嵌入与向量数据库
java·数据库·人工智能
TG:@yunlaoda360 云老大14 小时前
华为云国际站代理商GSL主要有什么作用呢?
网络·数据库·华为云
TG:@yunlaoda360 云老大14 小时前
华为云国际站代理商GSL的流量用量与资费合规是如何实现的?
网络·数据库·华为云
冰冰菜的扣jio14 小时前
MySQL三大重要日志详解
数据库·mysql
JoannaJuanCV14 小时前
自动驾驶—CARLA仿真(30)交通管理器(Traffic Manager)
java·redis·自动驾驶