likes
comments
collection
share

全栈时代,是时候学习一下 Redis 了之字符串篇

作者站长头像
站长
· 阅读数 29

Redis 的字符串类型是其最基本的数据类型,也是功能最简单的一种。它可以存储任何形式的字符串(包括二进制数据),这意味着你可以在 Redis 中存储从普通的文本到图像或序列化的复杂对象等。下面详细介绍 Redis 字符串类型的特点、用法以及一些常见的操作。

特点

字符串的特点主要有以下这两个方面:

  1. 二进制安全:Redis 的字符串可以包含任何数据,包括二进制数据。字符串的最大长度可以是 512MB。

  2. 灵活性:字符串类型不仅可以保存普通的文本数据,还可以保存图片、视频或任何序列化对象。

字符串常用操作

接下来我们将使用 redis 来实现一系列的基本操作。

设置值 SET

使用 SET 命令来存储字符串值。如果键已经持有其他值,SET 就覆写旧值,且无视类型。

SET key value

最终输出结果如下图所示:

全栈时代,是时候学习一下 Redis 了之字符串篇

获取值 GET

使用 GET 命令来获取存储在键中的值。

GET key

最终输出结果如下图所示:

全栈时代,是时候学习一下 Redis 了之字符串篇

追加值 APPEND

如果键已经存在且是一个字符串,APPEND 命令可以将给定值追加到原始值的末尾。

APPEND key value

最终输出结果如下图所示:

全栈时代,是时候学习一下 Redis 了之字符串篇

它返回了一个字符串的长度,是 15,因为在 UTF-8 编码下中文字符占用 3 个字节。

我们再次获取他的值我们拿到了最新的值:

全栈时代,是时候学习一下 Redis 了之字符串篇

获取字符串长度 STRLEN

STRLEN 命令用于获取指定键的值的长度。

STRLEN key

最终输出结果如下图所示:

全栈时代,是时候学习一下 Redis 了之字符串篇

设置并获取旧值 GETSET

GETSET 命令将给定键的值设为新的值,并返回键的旧值。

GETSET key new_value

全栈时代,是时候学习一下 Redis 了之字符串篇

部分字符串操作

设置子字符串 SETRANGE

使用 SETRANGE 命令可以修改字符串中的一部分,从指定偏移量开始。

SETRANGE key offset value

这是修改之后返回的状态:

全栈时代,是时候学习一下 Redis 了之字符串篇

最终修改后的数据如下图所示:

全栈时代,是时候学习一下 Redis 了之字符串篇

获取部分字符串 GETRANGE

使用 GETRANGE 命令可以获取字符串中的一部分,从指定的开始和结束偏移量。

GETRANGE key start end

最终修改后的数据如下图所示:

全栈时代,是时候学习一下 Redis 了之字符串篇

条件设置

SETNX

仅当键不存在时,才对键进行设置操作

SETNX key value

在前面的内容我们都知道,moment 这个字段是存在的,则会返回零,表示新增不成功:

全栈时代,是时候学习一下 Redis 了之字符串篇

只有当它不存在的时候创建才是成功的:

全栈时代,是时候学习一下 Redis 了之字符串篇

SETEX

设置键的值,并设置过期时间(以秒为单位)。

SETEX key seconds value

全栈时代,是时候学习一下 Redis 了之字符串篇

在上图中,我们经过了两秒再去访问 mm,它的返回值是 null 的。

PSETEX

类似于 SETEX,但时间以毫秒为单位。

PSETEX key milliseconds value

增减数值

INCR:将键的整数值增加 1,如果键不存在,那么在操作前会将它设为 0。

INCR key

DECR:将键的整数值减少 1。

DECR key

INCRBY:将键的整数值增加指定的整数。

INCRBY key increment

DECRBY:将键的整数值减少指定的整数。

DECRBY key decrement

如下图所示:

全栈时代,是时候学习一下 Redis 了之字符串篇

字符串实现原理

Redis 中的字符串是使用非常灵活的数据结构,其核心是简单的动态字符串(simple dynamic string,简称 SDS)。SDS 是 Redis 对传统 C 字符串的扩展和改进,具有多种优势和特性,这些特性使其特别适合用作 Redis 的基础数据类型之一。以下是 SDS 的一些关键特性和原理:

  1. 动态长度:

    • SDS 保持一个记录当前字符串长度的字段,这使得获取字符串长度的操作是常数时间 (O(1)) 的复杂度,而不是像标准的 C 字符串那样需要遍历整个字符串(O(n))。

    • 这个长度字段允许字符串包含任何二进制数据,包括空字符 \0

  2. 空间预分配(Pre-allocation):

    • 当对 SDS 进行扩展(例如通过追加操作)时,SDS 不仅仅分配所需的空间,还会预分配额外的空间。这种预分配策略减少了随后扩展操作的内存重分配次数,从而提高效率。

    • 具体来说,如果扩展后的字符串长度小于 1MB,Redis 会分配与当前长度相同的额外空间;如果大于 1MB,会额外分配 1MB 空间。

  3. 惰性空间释放(Lazy free):

    • 当 SDS 缩短时,Redis 不会立即释放多余的内存,而是使用 free space 字段记录多余的空间,以便未来可能的再次扩展使用。这可以减少频繁增减操作中的内存重分配。

    • 真正的内存释放可以延迟到 SDS 需要更小的空间时进行。

  4. 二进制安全:SDS 可以存储任何包括二进制数据在内的序列,因为它们不依赖于空字符作为结束符。这使得 SDS 可以用来存储如图片、视频文件等二进制数据。

  5. 兼容部分 C 字符串函数:尽管 SDS 使用不同的内部结构,Redis 实现了一些能让 SDS 兼容 C 字符串的操作函数,让开发者可以更容易地进行一些标准字符串操作,如字符串复制、连接等。

总结

Redis 的字符串操作简单而强大,适用于多种场景,如缓存文本数据、存储序列化对象、或作为计数器等。通过合理利用这些基本操作,可以实现各种功能和性能优化。

转载自:https://juejin.cn/post/7386476988881092648
评论
请登录