1. Redis数据类型-String

String字符串是编程语言里最常用的数据类型,使用双引号表示。比如JAVA

String str="1234";

比如C语言:

char str[] = "1234";

Redis 中, String类型是最基本的数据类型,是二进制安全的,可以存储任意类型的数据,文本、数字、图片或者序列化的对象 。

image-20240913105447064

注意Key的类型只能为字符串,Value的类型为字符串时,默认情况下的最大值是 512M

2. 常用命令

String 相关的所有命令:

命名 描述
APPEND value 追加到 key 原来的值的末尾
DECR key 中储存的数字值减一
DECRBY key 所储存的值减去给定的减量值( decrement )
GET 设置指定 key 的值
GETDEL 获取 key 的值并删除该 key
GETEX 获取 key 的值,并可选择设置其过期时间
GETRANGE 返回 key中字符串值的子字符
GETSET 将给定 key 的值设为value ,并返回 key 的旧值
INCR key 中储存的数字值增一
INCRBY key 所储存的值加上给定的增量值( increment )
INCRBYFLOAT key所储存的值加上给定的浮点增量值 ( increment )
LCS 实现了最长公共子序列算法,可用于评估字符串的相似程度
MGET 获取所有(一个或多个)给定 key 的值
MSET 同时设置一个或多个 key-value
MSETNX 同时设置一个或多个 key-value
PSETEX 以毫秒为单位设置 key 的生存时间
SET 设置指定 key 的值
SETEX 设置 key 的值为 value同时将过期时间设为 seconds
SETNX 只有在 key 不存在时设置 key的值
SETRANGE 从偏移量 offset 开始用value 覆写给定 key 所储存的字符串值
STRLEN 返回 key 所储存的字符串值的长度
SUBSTR 返回字符串值的子字符串,由偏移量开始和结束(两者都包含在内)决定

2.1 SET

用于给指定的 Key 设置字符串 值,如果 Key 已经保存了一个值,那么这个操作会直接覆盖原来的值,并且忽略原始类型。当 SET命令执行成功后,之前设置的过期时间都将失效。

示例:

127.0.0.1:6379> SET mykey "Hello World"
OK
127.0.0.1:6379> SET mykey "Hello World" EX 60
OK

2.2 GET

用于获取指定 Key 的字符串值,如果 Key 不存在, 那么返回特殊值 nil, 如果键 Key的值不是字符串类型, 返回错误, 因为GET 命令只能用于字符串值。

示例:

127.0.0.1:6379> GET mykey
"Hello World"
127.0.0.1:6379> GET mykey_nil
(nil)

2.3 MSET

SET 命令一样,会用新值替换旧值, MSET 是原子操作,所有 Key 的值同时设置,客户端不会看到有些 Key 值被修改,而另一些Key 值没变。总是返回 OK ,因为 MSET 不会失败。

基本语法:

MSET key1 value1 key2 value2 .. keyN valueN 

示例:

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"

2.4 MGET

用于获取所有给定 Key 的值,返回一个列表,值的类型是字符串,如果某个 Key 不存在或者值不是字符串,那么这个 Key 返回特殊值nil

基本语法:

MGET KEY1 KEY2 .. KEYN

示例:

127.0.0.1:6379> MGET key1 key2 nonexisting
1) "Hello"
2) "World"
3) (nil)

2.5 GETSET

用于给指定的 Key 设置字符串 值, 并返回设置之前的旧值。如果 Key 没有旧值返回 nil,如果 Key对应的值存在但不是字符串类型时,返回一个错误。

示例:

127.0.0.1:6379> SET mykey "Hello"
OK
127.0.0.1:6379> GETSET mykey "World"
"Hello"
127.0.0.1:6379> GET mykey
"World"

2.6 STRLEN

用于获取指定 Key 所储存的字符串值的长度,当储存的不是字符串类型时,返回错误。

基本语法:

STRLEN KEY_NAME

示例:

127.0.0.1:6379> SET mykey "Hello world"
OK
127.0.0.1:6379> STRLEN mykey
(integer) 11
127.0.0.1:6379> STRLEN mykey_nil
(integer) 0

2.7 SETEX

用于给指定的 Key 设置字符串 值,并将 Key 的生存时间设置为多少秒。如果键 Key 已经存在,将覆盖已有的值。

基本语法:

SETEX key seconds value

示例:

127.0.0.1:6379> SETEX mykey 60 "Hello"
OK
127.0.0.1:6379> TTL mykey
(integer) 52
127.0.0.1:6379> GET mykey
"Hello"

2.8 SETNX

SETNXSET if Not eXists 的缩写,在指定的 Key 不存在时,设置指定的值,这种情况下等同 SET 命令,当Key 存在时,什么也不做。返回值为整数:

  • 1Key 存在
  • 0Key 不存在

SETNX 命令是原子性的,常用于实现分布式锁,添加成功表示获取到锁,添加失败表示未获取到锁(后续详解介绍)。

示例:

redis> SETNX mykey "Hello"
(integer) 1
redis> SETNX mykey "World"
(integer) 0
redis> GET mykey
"Hello"

2.9 INCR

用于将指定的 Key 储存的数字值增一,如果 Key 不存在,那么值会先被初始化为 0 ,然后再执行 INCR 操作,返回值为执行操作之后Key 的值。如果值包含错误的类型,或字符串类型的值不能表示为数字,将会返回一个错误 ERR ERR hash value is not aninteger

操作的值限制在 64 位(bit)有符号数字表示之内。本质上这是一个字符串操作,因为 Redis 没有专门的整数类型,储在 Key中的字符串被转换为十进制有符号整数,在此基础上加 1 。常用于计数器、限流(后续详解介绍)。

基本语法:

 INCR KEY_NAME

示例:

127.0.0.1:6379> SET mykey "10"
"OK"
127.0.0.1:6379> INCR mykey
(integer) 11
127.0.0.1:6379>  GET mykey
"11"

2.10 DECR

用于将指定的 Key 储存的数字值减去一,如果 Key 不存在,那么值会先被初始化为 0 ,然后再执行 DECR操作。如果值包含错误的类型,或字符串类型的值不能表示为数字,将会返回一个错误。操作的值限制在 64位(bit)有符号数字表示之内,返回值为执行操作之后 Key 的值。

基本语法:

 DECR KEY_NAME

示例:

127.0.0.1:6379> DECR mykey
(integer) 9
127.0.0.1:6379> SET mykey "234293482390480948029348230948"
"OK"
127.0.0.1:6379>DECR mykey
ERR ERR value is not an integer or out of range

3. 应用场景

3.1 存储常规数据

String 可以存储任意类型的数据,文本、数字、图片或者序列化的对象 。

常用实际场景:

  • 图形、短信验证码
  • 令牌

例如,存储短信验证码并设置过期时间为 60 秒:

localhost:0>SET 13688889999 80906 EX 60
"OK"
localhost:0>GET 13688889999
"80906"

3.2 计数器

INCR 用于将指定的 Key 储存的数字值增一, DECR 用于将指定的 Key 储存的数字值减去一。

常用实际场景:

  • 阅读数
  • 点赞
  • 分布式ID
  • 网站访问量
  • 记录接口访问次数,实现防止重复提交、简单限流

例如,使用 INCR 记录网站每日访问量:

localhost:0>SET web_views:20240617 0
"OK"
localhost:0>INCR web_views:20240617
"1"
localhost:0>GET web_views:20240617
"1"

3.3 分布式锁

SETNX 命令是原子性的,常用于实现分布式锁,添加成功表示获取到锁,添加失败表示未获取到锁(后续详解介绍)。

例如,执行 SETNX 添加锁,返回 1 表示成功获取到锁:

localhost:0>SETNX my_lock yes
"1"

其他线程执行SETNX,返回 0 表示获取锁失败:

localhost:0>SETNX my_lock yes
"0"

执行完成后,删除锁,其他线程再次获取则成功:

localhost:0>DEL my_lock
"1"
localhost:0>SETNX my_lock yes
"1"