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 中其他数据类型的知识,感谢阅览!!

相关推荐
banzhenfei39 分钟前
xp_cmdshell bcp 导出文件
java·数据库·sql
CodeJourney.43 分钟前
ChemBlender:科研绘图创新解决方案
数据库·人工智能·信息可视化·excel
电鱼智能的电小鱼1 小时前
产线视觉检测设备技术方案:基于EFISH-SCB-RK3588/SAIL-RK3588的国产化替代赛扬N100/N150全场景技术解析
linux·人工智能·嵌入式硬件·计算机视觉·视觉检测·实时音视频
子非衣1 小时前
Ubuntu系统挂载磁盘并配置开机自动挂载
linux·运维·ubuntu
笨蛋不要掉眼泪2 小时前
SpringAOP
java·数据库·spring·log4j
风暴智能2 小时前
问题处理——在ROS2(humble)+Gazebo+rqt下,无法显示仿真无人机的相机图像
linux·无人机
IvanCodes2 小时前
九、HQL DQL七大查询子句
大数据·数据库·hive
Channing Lewis2 小时前
如何判断一个网站后端是用什么语言写的
前端·数据库·python
唐志远19972 小时前
VMware虚拟机 安装 CentOS 7
linux·运维·centos
難釋懷2 小时前
Android开发-数据库SQLite
android·数据库·sqlite