Redis 的数据类型
Redis 的数据类型有 5 种,分别是 String,List,Set,Zset,Hash
String 类型
Redis 字符串存储字节序列,包括文本、序列化对象和二进制数组。因此,字符串是最基本的 Redis 数据类型。它们通常用于缓存,但它们支持额外的功能,允许实现计数器并执行逐位操作。
默认情况下,单个 Redis 字符串最多可以为 512 MB。
大多数字符串操作都是 O(1),这意味着它们非常高效。但是,请注意 SUBSTR、GETRANGE 和 SETRANGE 命令,它们可以是 O(n)。处理大字符串时,这些随机访问字符串命令可能会导致性能问题。
常用操作命令表格:
命令 | 说明 |
---|---|
set | 设置一个 key/value |
get | 根据 key 获得对应的 value |
mset | 一次设置多个 key value (mset key value key value..) |
mget | 一次获得多个 key 的 value (mget key key …) |
strlen | 获得对应 key 存储 value 的长度 |
append | 为对应 key 的 value 追加内容 |
getrange 索引 0 开始 | 截取 value 的内容 |
setex | 设置一个 key 存活的有效期(秒) |
psetex | 设置一个 key 存活的有效期(毫秒) |
setnx | 存在不做任何操作,不存在添加 |
msetnx 原子操作(只要有一个存在不做任何操作) | 可以同时设置多个 key,只有有一个存在都不保存 |
decr | 进行数值类型的-1 操作 |
decrby | 根据提供的数据进行减法操作 |
Incr | 进行数值类型的+1 操作 |
incrby | 根据提供的数据进行加法操作 |
Incrbyfloat | 根据提供的数据加入浮点数 |
set
set 命令用于设置键以保存字符串值。若键已经保存了一个值,不管其类型如何,它都会被覆盖。成功的 SET 操作将丢弃与密钥相关联的任何先前生存时间。
语法格式
1 | SET key value [NX | XX] [EX seconds | PX milliseconds | EXAT unix-time-seconds | PXAT unix-time-milliseconds | KEEPTTL] |
选项
SET 命令支持一组修改其行为的选项:
- NX 仅当 key 不存在时才设置 key,与 XX 互斥。
- XX 仅当 key 存在时才设置 key,与 NX 互斥。
- EX 设置 key 的过期时间,以秒为单位。
- PX 设置 key 的过期时间,以毫秒为单位。
- EXAT 设置 key 过期的指定 Unix 时间,以秒为单位。
- PXAT 设置 key 过期的指定 Unix 时间,以毫秒为单位。
- KEEPTTL 保留与 key 关联的生存时间。
返回值
简单字符串回复:如果 SET 执行正确,则 OK。
空回复:(nil)如果由于用户指定了 NX 或 XX 选项而未执行 SET 操作,但不满足条件。
示例
1 | redis> SET mykey "Hello" |
get
get 命令获取 key 的值。如果键不存在,则返回特殊值 nil。如果键处存储的值不是字符串,则返回错误,因为 GET 只处理字符串值。
语法格式
1 | GET key |
返回值
返回 key 的值,或当 key 不存在时为 nil。
示例
1 | redis> get test |
mset
mset 命令用于批次设置 key,一次设置多个 key value
语法格式
1 | MSET key value [key value ...] |
返回值
始终正常,因为 MSET 不会失败。
示例
1 | redis> MSET key1 "Hello" key2 "World" |
mget
mget 命令用于一次获得 key 的 value
语法格式
1 | MGET key [key ...] |
返回值
指定 key 的值列表。
示例
1 | redis> SET key1 "Hello" |
strlen
strlen 命令获得对应 key 存储 value 的长度
语法格式
1 | STRLEN key |
返回值
key 的字符串长度,或 key 不存在时为 0。
示例
1 | redis> SET mykey "Hello world" |
append
append 命令为对应 key 的 value 追加内容,如果键已经存在并且是一个字符串,则此命令会在字符串末尾追加值。若键不存在,它将被创建并设置为空字符串,所以在这种特殊情况下,APPEND 将类似于 set。
语法格式
1 | APPEND key value |
返回值
追加操作后的字符串长度。
示例
1 | redis> EXISTS mykey |
setex
setex 命令设置 key 保存字符串值,并设置 key 在给定秒数后超时。此命令相当于执行以下命令:
1 | SET mykey value |
SETEX 是原子级的,可以通过使用 MULTI/EXEC 块中的前两个命令来复制。它是作为给定操作序列的一个更快的替代品提供的,因为当 Redis 用作缓存时,此操作非常常见。秒无效时返回错误。
语法格式
1 | SETEX key seconds value |
返回值
简单回复字符串
示例
1 | redis> SETEX mykey 10 "Hello" |
psetex
psetex 的工作方式与 setex 完全相同,唯一的区别是过期时间以毫秒而不是秒为单位。
语法格式
1 | PSETEX key milliseconds value |
示例
1 | redis> PSETEX mykey 1000 "Hello" |
setnx
如果键不存在,则将键设置为用户给定的字符串值。在这种情况下,它等于 SET。当键已经持有一个值时,不执行任何操作。SETNX 是“SET if Not exists”的缩写
语法格式
1 | SETNX key value |
返回值
整数回复,具体来说:
- 如果设置了键,则为 1
- 如果未设置密钥,则为 0
示例
1 | redis> SETNX mykey "Hello" |
msetnx
将给定的键设置为其各自的值。即使只存在一个密钥,MSETNX 也不会执行任何操作。
由于这种语义,可以使用 MSETNX 来设置代表唯一逻辑对象的不同字段的不同键,以确保设置所有字段或根本不设置任何字段。
MSETNX 是原子的,因此所有给定的键都是一次性设置的。客户端无法看到某些密钥已更新,而其他密钥未更改。
语法格式
1 | MSETNX key value [key value ...] |
返回值
整数回复,具体来说:
- 如果设置了所有键,则为 1。
- 如果未设置键(至少已存在一个密钥),则为 0。
示例
1 | redis> MSETNX key1 "Hello" key2 "there" |
decr
将存储在键上的数字减 1。如果键不存在,则在执行操作之前将其设置为 0。如果键包含错误类型的值或包含无法表示为整数的字符串,则返回错误。此操作仅限于 64 位有符号整数。
语法格式
1 | DECR key |
返回值
整数回复:减后的键值
示例
1 | redis> SET mykey "10" |
decrby
将存储在键上的数字递减。如果键不存在,则在执行操作之前将其设置为 0。如果键包含错误类型的值或包含无法表示为整数的字符串,则返回错误。此操作仅限于 64 位有符号整数。
语法格式
1 | DECRBY key decrement |
返回值
整数回复:减后的键值
示例
1 | redis> SET mykey "10" |
incr
将存储在键上的数字增加一。如果键不存在,则在执行操作之前将其设置为 0。如果键包含错误类型的值或包含无法表示为整数的字符串,则返回错误。此操作仅限于 64 位有符号整数。
注意:这是一个字符串操作,因为 Redis 没有专用的整数类型。存储在键上的字符串被解释为以 10 为基数的 64 位有符号整数,以执行操作。
Redis 以整数表示形式存储整数,因此对于实际包含整数的字符串值,不需要存储整数的字符串表示形式。
语法格式
1 | INCR key |
返回值
整数回复:加后的键值
示例
1 | redis> SET mykey "10" |
incrby
按增量递增存储在键上的数字。如果键不存在,则在执行操作之前将其设置为 0。如果键包含错误类型的值或包含无法表示为整数的字符串,则返回错误。此操作仅限于 64 位有符号整数。
语法格式
1 | INCRBY key increment |
返回值
整数回复:加后的键值
示例
1 | redis> SET mykey "10" |
List 类型
单键多值 redis 列表是简单的字符串列表,按照插入顺序排序。 你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
它的底层实际上是使用双向链表实现的,对两端的操作性能很高,通过索引下标操作中间节点性能会较差。
常用的工作指令
命令 | 说明 |
---|---|
lpush | 将某个值加入到一个 key 列表头部 |
lpushx | 同 lpush,但是必须要保证这个 key 存在 |
rpush | 将某个值加入到一个 key 列表末尾 |
rpushx | 同 rpush,但是必须要保证这个 key 存在 |
lpop | 返回和移除列表左边的第一个元素 |
rpop | 返回和移除列表右边的第一个元素 |
lrange | 获取某一个下标区间内的元素(lrange 起始下标 终点下标) 0-1 表示返回所有元素 |
llen | 获取列表元素个数 |
lset | 设置某一个指定索引的值(索引必须存在) |
lindex | 获取某一个指定索引位置的元素 |
lrem | 删除重复元素 (lerm 要删除重复元素的个数 要删除的重复值) |
ltrim | 保留列表中特定区间内的元素 |
linsert | 在某一个元素之前,之后插入新元素(linsert [要插入的列表名] [before 或者 after] 要插入位置元素名 要插入的元素值) |
Set 类型
redis set 对外提供的功与 list 类似,是一个列表的功能,特殊之处在于 set 是可以自动排重的,当你需要 存储一个列表数据,又不希望出现重复数据时,set 是一个很好的选择。
redis 的 set 是 string 类型的无序集合,他的底层实际是一个 value 为 null 的 hash 表,收益添加,删除,查 找复杂度都是 O(1)。 一个算法,如果时间复杂度是 O(1),那么随着数据的增加,查找数据的时间不变,也就是不管数据多 少,查找时间都是一样的。
Set 的常用命令列表
命令 | 说明 |
---|---|
sadd | 为集合添加元素 |
smembers | 显示集合中所有元素 无序 |
scard | 返回集合中元素的个数 |
spop | 随机返回一个元素 并将元素在集合中删除 |
smove | 从一个集合中向另一个集合移动元素 必须是同一种类型 |
srem | 从集合中删除一个元素 |
sismember | 判断一个集合中是否含有这个元素 |
srandmember | 随机返回元素 |
sdiff | 去掉第一个集合中其它集合含有的相同元素 |
sinter | 求交集 |
sunion | 求和集 |
ZSet
redis 有序集合 zset 与普通集合 set 非常相似,是一个没有重复元素的字符串集合。
不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分 到最高分的方式排序集合中的成员。
集合的成员是唯一的,但是评分是可以重复的。
因为元素是有序的,所以你可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。
访问有序集合中的中间元素也是非常快的,因为你能够使用有序集合作为一个没有重复成员你的智能列表。
命令 | 说明 |
---|---|
zadd | 添加一个有序集合元素 |
zcard | 返回集合的元素个数 |
zrange 升序 zrevrange 降序 | 返回一个范围内的元素 |
zrangebyscore | 按照分数查找一个范围内的元素 |
zrank | 返回排名 |
zrevrank | 倒序排名 |
zscore | 显示某一个元素的分数 |
zrem | 移除某一个元素 |
zincrby | 给某个特定元素加分 |
Hash
Redis hash 是一个键值对集合。 Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
命令 | 说明 |
---|---|
hset | 设置一个key/value对 |
hget | 获得一个key对应的value |
hgetall | 获得所有的key/value对 |
hdel | 删除某一个key/value对 |
hexists | 判断一个key是否存在 |
hkeys | 获得所有的key |
hvals | 获得所有的value |
hmset | 设置多个key/value |
hmget | 获得多个key的value |
hsetnx | 设置一个不存在的key的值 |
hincrby | 为value进行加法运算 |
hincrbyfloat | 为value加入浮点值 |