Redis,作为一个开源的、内存中的数据结构存储系统,以其出色的性能和灵活的数据类型,广泛应用于缓存、消息队列、发布订阅系统等多种场景。在 Redis 的五种基本数据类型中, String 类型是最基本也是最常用的一种。它不仅可以存储字符串,还可以存储整数和浮点数,甚至可以执行原子操作,如自增和自减。这使得 Redis 的 String 类型在实际应用中有着广泛的用途,从简单的键值对存储,到复杂的实时系统,都离不开 String 类型的支持。 在接下来的文章中,我将详细介绍 Redis 的 String 类型,包括它的内部实现、主要特性、常用命令以及应用场景。无论你是刚接触 Redis 的新手,还是已经有一定经验的开发者,我相信你都能从这篇文章中学到一些有用的知识。让我们一起深入了解 Redis 的 String 类型,探索它的魅力所在。
Redis 的 String 数据类型是最基本的数据类型,它在内部使用 SDS(Simple Dynamic String)实现。String 类型的值可以是字符串、整数或者浮点数,并且可以对整个字符串或者字符串的其中一部分执行操作。
以下是 Redis String 数据类型的一些主要特性:
Redis 的 String 数据类型作为最基本的数据类型,它的应用场景非常广泛,以下是一些常见的应用场景:
SET key value
”(只有当 key 不存在时才设置 value)命令,可以实现分布式锁,保证系统的并发安全;以上只是一些常见的应用场景,实际上,由于 Redis 的灵活性,我们可以根据自己的需求,将 Redis 的 String 类型应用在更多的场景中。
Redis 使用 SDS 简单动态字符串(Simple Dynamic String,SDS)来表示字符串,Redis 中字符串类型包含的数据结构有:“整数(R_INT)” 与 “字符串(R_RAW)”
SDS 被广泛应用在 Redis 的各个地方,包括:
SDS(Simple Dynamic String,简单动态字符串)是 Redis 自己构建的抽象字符串类型,其在 C 语言原生字符串类型的基础上进行了一些改进和扩展。SDS 的主要结构如下:
+---------+---------+---------+---------+---------+---------+---------+---------+
| free | len | buf | buf | buf | buf | buf | \0 |
+---------+---------+---------+---------+---------+---------+---------+---------+
---------------------------------------------------------------------------------
struct sdshdr {
// buf数组中已使用字节的数量
int len;
// buf数组中未使用字节的数量
int free;
// 字节数组,用于保存字符串
char buf[];
};
---------------------------------------------------------------------------------
属性 | 说明 |
---|---|
“Free” | 表示 Buf 数组中未使用字节的数量,也就是 Buf 数组的剩余空间。这样可以在增加字符串长度时,避免频繁的内存重新分配 |
“Len” | 表示 Buf 数组中已使用字节的数量,也就是字符串的长度。这样可以在 O(1) 的时间复杂度内获取字符串长度,而不需要像 C 语言字符串那样遍历整个字符串 |
“Buf[]” | 字节数组,用于保存字符串。这个数组的末尾总是包含一个空字符(‘\0’),这样 SDS 就可以兼容 C 语言的字符串函数 |
这种设计使得 SDS 在保持与 C 语言字符串兼容的同时,具有更高的效率和更好的安全性。
C 字符串结构与 SDS 字符串结构对比图参照如下:
SDS(Simple Dynamic String,简单动态字符串)作为 Redis 自己构建的抽象字符串类型,相比于 C 语言的字符串,它主要具有以下优点:
在 Redis 中,设定和获取 String 类型的 key 值主要使用以下命令:
SET key value
这个命令用于设定一个 key 的值。如果 key 已经存在,那么这个命令会覆盖原来的值。
在 Redis 中,获取 String 类型的 key 值主要使用以下命令:
GET key
这个命令用于获取一个 key 的值。如果 key 不存在,那么这个命令会返回 nil。
自减/自增 Key 值:
INCR key # 自增
DECR key # 自减
String 类型除了可以存字符串也可以是数字。注意这里得是数字才可以进行
如果要带步长:
INCRBY key num # 自增
DECRBY key num # 自减
使用 append 追加字符串:
APPEND key addvalue
append 命令后但会当前 string 长度。
使用 del 删除字符串:
DEL key
DEL key1 key2 key3
使用 getrange 截取字符串:
getrange key start end
getrange key 0 -1 # 查询全部
使用 setrange 替换字符串::
setrange key num value
分布锁设置,只有在 key 不存在时设置 key 的值:
SETNX key value
设置指定 key 的值,并将 key 的过期时间设为 seconds 秒:
SETEX key seconds value
一次性设置多个:
MSET k1 v1 k2 v2 k3 v3
一次性获取多个:
MGET k1 k2 k3
一次性设置多个(事务),只要有一个失败,则都不成功:
MSETNX k1 v1 k2 v2 k3 v3
使用 strlen 获取字符串长度:
STRLEN key