文章目录
- Redis概述
- 1.Redis-String数据类型概述
- 2.常用命令
- 2.1 SET:添加或者修改已经存在的一个String类型的键值对
- 2.2 GET:根据key获取String类型的value
- 2.3 MSET:批量添加多个String类型的键值对
- 2.4 MGET:根据多个key获取多个String类型的value
- 2.5 INCR:让一个整型的key自增1
- 2.6 INCRBY:让一个整型的key自增并指定步长
- 2.7 INCRBYFLOAT:让一个浮点类型的数字自增并指定步长
- 2.8 SETNX:添加一个String类型的键值对,前提是这个key不存在,否则不执行
- 2.9 SETEX:添加一个String类型的键值对,并且指定有效期
- 2.10 MSETNX :设置多个键值对,但只有在所有指定的键都不存在时才执行设置操作
- 2.11 APPEND:将指定的值追加到已存在键的值末尾
- 2.12 DECR:将指定键的值减一
- 2.13 DECRBY:将指定键的值减去给定的整数
- 2.14 GETDEL:获取指定键的值并将该键删除
- 2.15 GETEX:获取一个键的值,并且可以选择性地设置该键的过期时间或者移除其过期时间
- 2.16 GETRANGE:获取指定键(key)的字符串值中参数指定的子字符串
- 2.17 SETRANGE:在指定的偏移量开始处替换或插入一部分字符串
- 2.18 GETSET:设置给定键(key)对应的值,同时返回该键的旧值
- 2.19 STRLEN:返回指定键(key)对应的字符串值的长度
Redis概述
Redis概述
1.Redis-String数据类型概述
-
在 Redis 中,String 类型是最简单的存储类型,它的 value 可以是普通字符串、整数类型或浮点类型。不同格式的字符串在底层都是以字节数组形式存储,只是编码方式不同。
-
普通字符串类型的 value 可以存储任意文本数据,而整数类型和浮点类型的 value 则分别代表整数和浮点数,可以对其进行自增、自减等操作。
-
无论是哪种格式,String 类型的 value 在 Redis 中的最大空间不能超过 512MB。这个限制是为了确保 Redis 在内存管理方面有较好的性能表现。
-
Redis键区分大小写。
2.常用命令
2.1 SET:添加或者修改已经存在的一个String类型的键值对
SET key value [EX seconds] [PX milliseconds] [NX|XX]
其中:
key
是要设置的键名。value
是要设置的键值。- 可选参数
EX seconds
或PX milliseconds
用于设置键的过期时间,EX
表示以秒为单位设置过期时间,PX
表示以毫秒为单位设置过期时间。 - 可选参数
NX
或XX
用于控制是否只在 key 不存在时进行设置,NX
表示只在 key 不存在时进行设置,XX
表示只在 key 已经存在时进行设置。 - 如果命令执行成功,返回结果为
"OK"
。
redis> SET mykey "Hello"
"OK"
redis> GET mykey
"Hello"
redis> SET anotherkey "will expire in a minute" EX 60
"OK"
redis>
使用 SET
命令将值 "Hello"
存储在键 mykey
中,命令返回结果为 "OK"
,表示设置成功。
使用 GET
命令来获取键 mykey
的值,返回的结果是 "Hello"
,表示获取成功。
使用 SET
命令创建了另一个键值对 anotherkey
,并使用 EX
参数设置了它的过期时间为 60 秒,命令返回结果为 "OK"
,表示设置成功。
2.2 GET:根据key获取String类型的value
redis> GET nonexisting
(nil)
redis> SET mykey "Hello"
"OK"
redis> GET mykey
"Hello"
redis>
2.3 MSET:批量添加多个String类型的键值对
MSET key1 value1 [key2 value2 ...]
其中:
key1
、key2
等是要设置的键名。value1
、value2
等是对应键的值。
命令返回结果为 "OK"
,表示设置成功。
redis> MSET key1 "Hello" key2 "World"
"OK"
redis> GET key1
"Hello"
redis> GET key2
"World"
redis>
2.4 MGET:根据多个key获取多个String类型的value
MGET 命令用于根据多个 key 获取对应的多个 String 类型的 value。
MGET key1 [key2 ...]
key1
、key2
等是要获取 value 的键名。
redis> SET key1 "Hello"
"OK"
redis> SET key2 "World"
"OK"
redis> MGET key1 key2 nonexisting
1) "Hello"
2) "World"
3) (nil)
redis>
nonexisting 这个键不存在,所以对应的值为 (nil)。
2.5 INCR:让一个整型的key自增1
INCR key
其中:
key
是要增加的整型键名。
使用 SET
命令将整型值 10
存储在键 mykey
中,然后使用 INCR
命令对 mykey
的值进行自增操作,结果返回 (integer) 11
,表示增加后的值为 11。
redis> SET mykey "10"
"OK"
redis> INCR mykey
(integer) 11
redis> GET mykey
"11"
redis>
- If the key does not exist, it is set to 0 before performing the operation. 如果该键不存在,则在执行操作前将其设置为0。
- This operation is limited to 64 bit signed integers.INCR 命令仅适用于64位有符号整数。
- An error is returned if the key contains a value of the wrong type or contains a string that can not be represented as integer. 如果键包含错误类型的值(非整数),或者字符串值无法表示为整数,将返回错误。
- this is a string operation because Redis does not have a dedicated integer type.The string stored at the key is interpreted as a base-10 64 bit signed integer to execute the operation. Redis没有专门的整数类型,因此存储在键中的字符串值将被解释为十进制的64位有符号整数来执行操作。
- Redis stores integers in their integer representation, so for string values that actually hold an integer, there is no overhead for storing the string representation of the integer.Redis以整数表示存储整数,因此对于实际保存整数的字符串值,不需要额外存储整数的字符串表示。
2.6 INCRBY:让一个整型的key自增并指定步长
INCRBY key increment
其中:
key
是要增加的整型键名。increment
是增加的步长,可以是正数或负数。
使用 SET
命令将整型值 10
存储在键 mykey
中
使用 INCRBY
命令对 mykey
的值增加 5
,结果返回 (integer) 15
,表示增加后的值为 15。
使用 INCRBY
命令对 mykey
的值减少 3
,结果返回 (integer) 12
,表示减少后的值为 12。
redis> SET mykey 10
"OK"
redis> INCRBY mykey 5
(integer) 15
redis> INCRBY mykey -3
(integer) 12
- If the key does not exist, it is set to 0 before performing the operation. 如果该键不存在,则在执行操作前将其设置为0。
- This operation is limited to 64 bit signed integers.INCRBY 命令仅适用于64位有符号整数。
- An error is returned if the key contains a value of the wrong type or contains a string that can not be represented as integer. 如果键包含错误类型的值(非整数),或者字符串值无法表示为整数,将返回错误。
- Redis没有专门的整数类型,因此存储在键中的字符串值将被解释为十进制的64位有符号整数来执行操作。
- Redis以整数表示存储整数,因此对于实际保存整数的字符串值,不需要额外存储整数的字符串表示。
2.7 INCRBYFLOAT:让一个浮点类型的数字自增并指定步长
INCRBYFLOAT key increment
key
是要增加的浮点键名。increment
是增加的步长,可以是正数或负数,且可以包含小数部分。
redis> SET mykey 10.5
"OK"
redis> INCRBYFLOAT mykey 0.5
"11"
redis> INCRBYFLOAT mykey -1.5
"9.5"
redis> SET mykey 10.50
"OK"
redis> INCRBYFLOAT mykey 0.1
"10.6"
redis> INCRBYFLOAT mykey -5
"5.6"
redis> SET mykey 5.0e3
"OK"
redis> INCRBYFLOAT mykey 2.0e2
"5200"
redis>
- 如果键不存在,会先将其设置为 0.0。
- 如果键包含错误类型的值(非字符串),或者字符串值无法解析为浮点数,会返回错误。
- INCRBYFLOAT 使用双精度浮点数进行计算,但返回值的精确度固定为小数点后17位,多余的尾随零将被移除。
- 对于指数形式的输入,如 1.2e3,Redis 在存储计算结果时会保持其浮点数形式。
2.8 SETNX:添加一个String类型的键值对,前提是这个key不存在,否则不执行
SETNX
命令用于添加一个 String 类型的键值对,前提是指定的 key 不存在,如果 key 已经存在,则不执行任何操作。
SETNX is short for “SET if Not eXists”.
SETNX key value
key
是要设置的键名。value
是要设置的值。
redis> SETNX mykey "Hello"
(integer) 1
redis> SETNX mykey "World"
(integer) 0
redis> GET mykey
"Hello"
使用 SETNX
命令尝试将 "Hello"
设置为键 mykey
的值,由于 mykey
之前不存在,所以成功执行,返回 (integer) 1
。
再次使用 SETNX
命令尝试将 "World"
设置为键 mykey
的值,但由于 mykey
已经存在,所以不执行任何操作,返回 (integer) 0
。
2.9 SETEX:添加一个String类型的键值对,并且指定有效期
SETEX
命令用于添加一个 String 类型的键值对,并为该键值对设置指定的过期时间(单位为秒)。如果键已经存在,则会覆盖已有的值,并设置新的过期时间。
SETEX key seconds value
key
是要设置的键名。seconds
是键值对的过期时间,单位为秒。value
是要设置的值。
redis> SETEX mykey 10 "Hello"
"OK"
redis> TTL mykey
(integer) 10
使用 SETEX
命令将值为 "Hello"
的键值对设置到键 mykey
中,并且指定过期时间为 10
秒。
使用 TTL
命令查询 mykey
的剩余过期时间,返回 (integer) 10
,表示该键值对还有 10 秒过期。
2.10 MSETNX :设置多个键值对,但只有在所有指定的键都不存在时才执行设置操作
Sets the given keys to their respective values. MSETNX will not perform any operation at all even if just a single key already exists.
设置多个键值对,但只有在所有指定的键都不存在时才执行设置操作。
如果至少有一个键已经存在,则不会对任何键进行设置。
MSETNX key value [key value ...]
key value
:成对出现的键值对,可以指定多个键值对。
返回值
redis> MSETNX key1 "Hello" key2 "there"
(integer) 1
redis> MSETNX key2 "new" key3 "world"
(integer) 0
redis> MGET key1 key2 key3
1) "Hello"
2) "there"
3) (nil)
redis>
命令执行后,返回一个整数值:
1
表示所有键都设置成功,且没有一个键存在。0
表示至少有一个键已经存在,没有键被设置。
注意事项
MSETNX
是一个原子操作,要么所有键都被设置,要么一个键都不被设置。- 如果需要设置的键值对中有某个键已经存在,可以考虑使用
MSET
命令来替代,MSET
会覆盖已存在的键值。 - 在分布式环境下,使用
MSETNX
可以确保多个键的设置操作是原子的,避免并发操作导致的问题。
2.11 APPEND:将指定的值追加到已存在键的值末尾
APPEND
命令是 Redis 中用于将指定的值追加到已存在键的值末尾。
如果键不存在,APPEND
将创建一个新的键并将给定值作为其初始值。
通过 APPEND
命令,可以方便地向已有字符串末尾追加数据,而不需要读取和重写整个字符串。
APPEND key value
key
:要操作的键。value
:要追加的值。
返回值
redis> EXISTS mykey
(integer) 0
redis> APPEND mykey "Hello"
(integer) 5
redis> APPEND mykey " World"
(integer) 11
redis> GET mykey
"Hello World"
redis>
命令执行后,返回一个整数值,表示追加操作完成后键的值的长度。
-
追加值到一个不存在的键:
APPEND mykey "Hello"
如果
mykey
不存在,这个命令会创建mykey
并将其值设置为"Hello"
。返回值是5
,因为"Hello"
的长度是5
。 -
追加值到一个已有的键:
APPEND mykey " World"
假设
mykey
的当前值是"Hello"
,这个命令会将" World"
追加到"Hello"
后面,因此mykey
的新值变成"Hello World"
。返回值是11
,因为"Hello World"
的长度是11
。
注意事项
APPEND
针对的是字符串类型的键。如果键的现有值不是字符串类型,会返回错误。- 尽管
APPEND
操作可以处理非常大的字符串,但在实际使用中需要注意字符串的大小,以避免内存问题。
2.12 DECR:将指定键的值减一
DECR
命令是 Redis 中用于将指定键的值减一的命令。
该键的值必须是一个可以解析为整数的字符串。
如果键不存在,Redis 会将其初始化为 0
然后再执行递减操作。
DECR key
key
:要递减值的键。
返回值
redis> SET mykey "10"
"OK"
redis> DECR mykey
(integer) 9
redis> SET mykey "234293482390480948029348230948"
"OK"
redis> DECR mykey
(error) value is not an integer or out of range
redis>
命令执行后,返回一个整数值,表示键在递减之后的值。
-
键存在且值为整数:
假设
mykey
的当前值是10
:DECR mykey
这个命令会将
mykey
的值减一,因此新的值为9
。返回值是9
。 -
键不存在:
如果
mykey
不存在:DECR mykey
Redis 会将
mykey
初始化为0
,然后对其执行递减操作。新的值为-1
。返回值是-1
。 -
键的值不是整数:
如果
mykey
的当前值是"hello"
这样一个无法解析为整数的字符串:DECR mykey
这个命令会返回一个错误,因为
"hello"
不能被解析为整数。
注意事项
DECR
命令只能对可以解析为整数的字符串值进行操作。- This operation is limited to 64 bit signed integers.对于超出 64 位带符号整数范围的值,Redis 会返回一个错误。因此需要确保数值在合理范围内。
DECR
操作是原子的,可以在并发环境中安全使用。
2.13 DECRBY:将指定键的值减去给定的整数
DECRBY
命令是 Redis 中用于将指定键的值减去给定的整数 decrement 的命令。
该键的值必须是一个可以解析为整数的字符串。
如果键不存在,Redis 会将其初始化为 0
然后再执行递减操作。
DECRBY key decrement
key
:要递减值的键。decrement
:要减去的整数值。
返回值
redis> SET mykey "10"
"OK"
redis> DECRBY mykey 3
(integer) 7
redis>
命令执行后,返回一个整数值,表示键在递减之后的值。
-
键存在且值为整数:
假设
mykey
的当前值是10
:DECRBY mykey 3
这个命令会将
mykey
的值减去3
,因此新的值为7
。返回值是7
。 -
键不存在:
如果
mykey
不存在:DECRBY mykey 5
Redis 会将
mykey
初始化为0
,然后对其执行递减操作,即0 - 5 = -5
。返回值是-5
。 -
键的值不是整数:
如果
mykey
的当前值是"hello"
这样一个无法解析为整数的字符串:DECRBY mykey 2
这个命令会返回一个错误,因为
"hello"
不能被解析为整数。
注意事项
DECRBY
命令只能对可以解析为整数的字符串值进行操作。- 对于超出 64 位带符号整数范围的值,Redis 会返回一个错误。因此需要确保数值在合理范围内。
DECRBY
操作是原子的,可以在并发环境中安全使用。
2.14 GETDEL:获取指定键的值并将该键删除
GETDEL
命令是 Redis 6.2 版本中引入的一个命令,用于获取指定键的值并将该键删除。
它结合了 GET
和 DEL
操作:返回键的值,并在读取值之后删除这个键。
GETDEL key
key
:要获取并删除的键。
返回值
redis> SET mykey "Hello"
"OK"
redis> GETDEL mykey
"Hello"
redis> GET mykey
(nil)
redis>
- 如果键存在,返回键的值。
- 如果键不存在,返回
nil
。
-
键存在:
假设
mykey
的当前值是"Hello"
:GETDEL mykey
这个命令会返回
"Hello"
并删除键mykey
。 -
键不存在:
如果
mykey
不存在:GETDEL mykey
这个命令会返回
nil
。
使用场景
- 一次性读取和删除:在某些情况下,你可能需要读取一个键的值并在读取后立即删除它,比如处理消息队列中的单个消息。
- 简化操作:通过一个命令实现读取和删除操作,减少网络通信次数和代码复杂度。
注意事项
- 原子性:
GETDEL
命令是原子的,即读取和删除操作是在同一个原子性操作中完成的,确保了数据一致性。 - 版本要求:
GETDEL
命令需要 Redis 6.2 或更高版本支持,如果使用的是较低版本的 Redis,需要通过其他方式组合GET
和DEL
操作。
2.15 GETEX:获取一个键的值,并且可以选择性地设置该键的过期时间或者移除其过期时间
GETEX
命令是 Redis 6.2 引入的一个命令,它用于获取一个键的值,并且可以选择性地设置该键的过期时间或者移除其过期时间。
这个命令结合了 GET
和 EXPIRE
的功能。
GETEX key [EX seconds | PX milliseconds | EXAT unix-time-seconds | PXAT unix-time-milliseconds | PERSIST]
key
:要获取值并设置过期时间的键。EX seconds
:以秒为单位设置过期时间。PX milliseconds
:以毫秒为单位设置过期时间。EXAT unix-time-seconds
:指定到 Unix 时间戳(秒)设置过期时间。PXAT unix-time-milliseconds
:指定到 Unix 时间戳(毫秒)设置过期时间。PERSIST
:移除键的过期时间。
返回值
redis> SET mykey "Hello"
"OK"
redis> GETEX mykey
"Hello"
redis> TTL mykey
(integer) -1
redis> GETEX mykey EX 60
"Hello"
redis> TTL mykey
(integer) 60
redis>
- 如果键存在,返回键的值。
- 如果键不存在,返回
nil
。
-
用
EX
设置过期时间:假设
mykey
的当前值是"Hello"
:GETEX mykey EX 10
这个命令会返回
"Hello"
,同时将mykey
的过期时间设置为 10 秒。 -
用
PX
设置过期时间:GETEX mykey PX 5000
这个命令会返回
"Hello"
,同时将mykey
的过期时间设置为 5000 毫秒(5 秒)。 -
用
EXAT
设置过期时间:GETEX mykey EXAT 1654291200
这个命令会返回
"Hello"
,同时将mykey
的过期时间设置为 Unix 时间戳 1654291200(例如某个具体日期和时间)。 -
用
PXAT
设置过期时间:GETEX mykey PXAT 1654291200000
这个命令会返回
"Hello"
,同时将mykey
的过期时间设置为 Unix 时间戳 1654291200000 毫秒。 -
移除过期时间:
GETEX mykey PERSIST
这个命令会返回
"Hello"
,同时移除mykey
的过期时间,使其变成永久键。
使用场景
- 延长过期时间:在某些情况下,你可能需要读取一个键的值并延长其过期时间,例如用户会话管理。
- 设置绝对过期时间:需要在特定时间点让键过期,而不是相对时间。
- 移除过期时间:有时你可能需要使一个临时键变为永久键,移除其过期时间。
注意事项
- 原子性:
GETEX
命令是原子的,即读取和设置过期时间操作是在同一个原子性操作中完成的,确保了数据一致性。 - 版本要求:
GETEX
命令需要 Redis 6.2 或更高版本支持,如果使用的是较低版本的 Redis,需要通过其他方式组合GET
和EXPIRE
操作。
2.16 GETRANGE:获取指定键(key)的字符串值中参数指定的子字符串
GETRANGE
命令用于获取指定键(key)的字符串值中,由 start
和 end
参数指定的子字符串。
这个命令在 Redis 2.4 版本以后可用。
GETRANGE key start end
key
:要获取子字符串的键。start
:子字符串的起始位置(包括该位置的字符)。end
:子字符串的结束位置(包括该位置的字符)。
返回值
redis> SET mykey "This is a string"
"OK"
redis> GETRANGE mykey 0 3
"This"
redis> GETRANGE mykey -3 -1
"ing"
redis> GETRANGE mykey 0 -1
"This is a string"
redis> GETRANGE mykey 10 100
"string"
redis>
命令返回指定键的字符串值中,由 start
和 end
参数指定的子字符串。
假设有个键 mykey
的值为 "Hello, World!"
。
GETRANGE mykey 0 4
这个命令会返回 "Hello"
,因为从位置 0 开始到位置 4 的子字符串是 "Hello"
。
GETRANGE mykey 7 11
这个命令会返回 "World"
,因为从位置 7 开始到位置 11 的子字符串是 "World"
。
GETRANGE mykey 7 -1
这个命令会返回 "World!"
,因为从位置 7 开始到末尾的子字符串是 "World!"
。
注意事项
GETRANGE
命令使用的是 0-based 索引,即第一个字符的索引为 0。- 如果
start
参数超出字符串的范围,或者end
参数小于start
参数,那么返回的子字符串为空字符串。 - 如果
start
或end
参数为负数,则表示从字符串末尾开始的偏移量,例如-1
表示倒数第一个字符。 - 在 Redis 中,字符串的长度是按照字节数来计算的,而非字符数。所以如果字符串包含多字节字符(如 UTF-8 编码的字符),需要特别注意子字符串的起始和结束位置。
2.17 SETRANGE:在指定的偏移量开始处替换或插入一部分字符串
-
在指定的偏移量开始处替换或插入一部分字符串。
-
如果新的字符串超出了当前字符串的长度,Redis 会自动扩展这个字符串,并用空字节填充扩展部分。
语法
SETRANGE key offset value
key
: 要修改的键。offset
: 开始插入的偏移量,以字节为单位,从 0 开始。value
: 要插入的字符串。
返回值
SETRANGE
返回修改后字符串的长度。
示例
键 mykey
,其值为 "Hello World"
:
SET mykey "Hello World"
从偏移量 6 开始,将字符串 "Redis"
插入到现有字符串中:
SETRANGE mykey 6 "Redis"
操作完成后,mykey
的值将变为 "Hello Redis"
。
如果偏移量超出了当前字符串的长度,Redis 会用空字节(\x00
)填充扩展部分。例如:
SETRANGE mykey 11 "!"
假设 mykey
之前的值是 "Hello Redis"
,那么操作后,mykey
的值将变为 "Hello Redis!"
。
如果我们使用更大的偏移量,例如 20:
SETRANGE mykey 20 "abc"
在这种情况下,Redis 将填充空字节直到偏移量 20,然后插入 "abc"
。结果是:
"Hello Redis!\x00\x00\x00\x00\x00\x00\x00\x00abc"
- 性能: 使用
SETRANGE
修改大字符串时可能会影响性能,因为字符串需要被复制和重新分配。 - 二进制安全:
SETRANGE
是二进制安全的,可以处理包含空字节的字符串。 - 自动扩展: 如果偏移量超出当前字符串的长度,Redis 会自动扩展字符串并用空字节填充不足的部分。
2.18 GETSET:设置给定键(key)对应的值,同时返回该键的旧值
GETSET
命令用于设置给定键(key)对应的值,同时返回该键的旧值。
GETSET key value
key
:要设置值的键。value
:新的值。
返回值
redis> SET mykey "Hello"
"OK"
redis> GETSET mykey "World"
"Hello"
redis> GET mykey
"World"
redis>
- 如果键存在,返回键的旧值。
- 如果键不存在,返回
nil
。
假设有个键 mykey
的当前值为 "Hello"
:
-
使用
GETSET
命令设置新值:GETSET mykey "World"
这个命令会返回
"Hello"
,因为这是mykey
的旧值。执行完该命令后,mykey
的值变为"World"
。 -
如果键不存在:
假设没有
newkey
这个键:GETSET newkey "Foo"
这个命令会返回
nil
,因为newkey
键之前不存在。执行完该命令后,newkey
的值变为"Foo"
。
使用场景
-
原子操作:
GETSET
命令是原子的,它可以确保在设置新值和返回旧值之间没有其他操作干扰,这在某些需要确保数据一致性的场景中非常重要。 -
缓存机制:在缓存的实现中,可以使用
GETSET
来确保在更新缓存值时获取到旧的缓存内容。
注意事项
GETSET
会覆盖键的现有值,因此要谨慎使用,确保不会意外覆盖关键数据。- 如果键的值非常大,使用
GETSET
可能会导致较高的网络带宽消耗,因为它会返回旧值并传输到客户端。
2.19 STRLEN:返回指定键(key)对应的字符串值的长度
STRLEN
命令用于返回指定键(key)对应的字符串值的长度。
STRLEN key
key
:要获取长度的键。
返回值
redis> SET mykey "Hello world"
"OK"
redis> STRLEN mykey
(integer) 11
redis> STRLEN nonexisting
(integer) 0
redis>
命令返回指定键的字符串值的长度。
键 mykey
的值为 "Hello, World!"
。
STRLEN mykey
命令会返回 13
注意事项
STRLEN
命令可以用于获取字符串的长度,无论是 ASCII 字符还是包含多字节字符(如 UTF-8 编码的字符)。- 如果键不存在,那么返回值为
0
。 - 如果键对应的值不是字符串类型,那么会返回一个错误。
更多的string命令可以去官网https://redis.io/docs/latest/commands/?group=string查看哦~