全栈时代,是时候学习一下 Redis 了之字符串篇
Redis 的字符串类型是其最基本的数据类型,也是功能最简单的一种。它可以存储任何形式的字符串(包括二进制数据),这意味着你可以在 Redis 中存储从普通的文本到图像或序列化的复杂对象等。下面详细介绍 Redis 字符串类型的特点、用法以及一些常见的操作。
特点
字符串的特点主要有以下这两个方面:
-
二进制安全:Redis 的字符串可以包含任何数据,包括二进制数据。字符串的最大长度可以是 512MB。
-
灵活性:字符串类型不仅可以保存普通的文本数据,还可以保存图片、视频或任何序列化对象。
字符串常用操作
接下来我们将使用 redis 来实现一系列的基本操作。
设置值 SET
使用 SET 命令来存储字符串值。如果键已经持有其他值,SET 就覆写旧值,且无视类型。
SET key value
最终输出结果如下图所示:
获取值 GET
使用 GET 命令来获取存储在键中的值。
GET key
最终输出结果如下图所示:
追加值 APPEND
如果键已经存在且是一个字符串,APPEND 命令可以将给定值追加到原始值的末尾。
APPEND key value
最终输出结果如下图所示:
它返回了一个字符串的长度,是 15,因为在 UTF-8 编码下中文字符占用 3 个字节。
我们再次获取他的值我们拿到了最新的值:
获取字符串长度 STRLEN
STRLEN 命令用于获取指定键的值的长度。
STRLEN key
最终输出结果如下图所示:
设置并获取旧值 GETSET
GETSET 命令将给定键的值设为新的值,并返回键的旧值。
GETSET key new_value
部分字符串操作
设置子字符串 SETRANGE
使用 SETRANGE 命令可以修改字符串中的一部分,从指定偏移量开始。
SETRANGE key offset value
这是修改之后返回的状态:
最终修改后的数据如下图所示:
获取部分字符串 GETRANGE
使用 GETRANGE 命令可以获取字符串中的一部分,从指定的开始和结束偏移量。
GETRANGE key start end
最终修改后的数据如下图所示:
条件设置
SETNX
仅当键不存在时,才对键进行设置操作
SETNX key value
在前面的内容我们都知道,moment 这个字段是存在的,则会返回零,表示新增不成功:
只有当它不存在的时候创建才是成功的:
SETEX
设置键的值,并设置过期时间(以秒为单位)。
SETEX key seconds value
在上图中,我们经过了两秒再去访问 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 中的字符串是使用非常灵活的数据结构,其核心是简单的动态字符串(simple dynamic string,简称 SDS)。SDS 是 Redis 对传统 C 字符串的扩展和改进,具有多种优势和特性,这些特性使其特别适合用作 Redis 的基础数据类型之一。以下是 SDS 的一些关键特性和原理:
-
动态长度:
-
SDS 保持一个记录当前字符串长度的字段,这使得获取字符串长度的操作是常数时间
(O(1))
的复杂度,而不是像标准的 C 字符串那样需要遍历整个字符串(O(n))。 -
这个长度字段允许字符串包含任何二进制数据,包括空字符
\0
。
-
-
空间预分配(Pre-allocation):
-
当对 SDS 进行扩展(例如通过追加操作)时,SDS 不仅仅分配所需的空间,还会预分配额外的空间。这种预分配策略减少了随后扩展操作的内存重分配次数,从而提高效率。
-
具体来说,如果扩展后的字符串长度小于 1MB,Redis 会分配与当前长度相同的额外空间;如果大于 1MB,会额外分配 1MB 空间。
-
-
惰性空间释放(Lazy free):
-
当 SDS 缩短时,Redis 不会立即释放多余的内存,而是使用 free space 字段记录多余的空间,以便未来可能的再次扩展使用。这可以减少频繁增减操作中的内存重分配。
-
真正的内存释放可以延迟到 SDS 需要更小的空间时进行。
-
-
二进制安全:SDS 可以存储任何包括二进制数据在内的序列,因为它们不依赖于空字符作为结束符。这使得 SDS 可以用来存储如图片、视频文件等二进制数据。
-
兼容部分 C 字符串函数:尽管 SDS 使用不同的内部结构,Redis 实现了一些能让 SDS 兼容 C 字符串的操作函数,让开发者可以更容易地进行一些标准字符串操作,如字符串复制、连接等。
总结
Redis 的字符串操作简单而强大,适用于多种场景,如缓存文本数据、存储序列化对象、或作为计数器等。通过合理利用这些基本操作,可以实现各种功能和性能优化。
转载自:https://juejin.cn/post/7386476988881092648