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

相关推荐
JunLan~1 小时前
Rocky Linux 系统安装/部署 Docker
linux·docker·容器
Python私教1 小时前
model中能定义字段声明不存储到数据库吗
数据库·oracle
方竞2 小时前
Linux空口抓包方法
linux·空口抓包
海岛日记3 小时前
centos一键卸载docker脚本
linux·docker·centos
AttackingLin4 小时前
2024强网杯--babyheap house of apple2解法
linux·开发语言·python
BestandW1shEs4 小时前
谈谈Mysql的常见基础问题
数据库·mysql
重生之Java开发工程师4 小时前
MySQL中的CAST类型转换函数
数据库·sql·mysql
教练、我想打篮球4 小时前
66 mysql 的 表自增长锁
数据库·mysql