Redis String问题

在 C 语言中,字符串采用的是一个 char 数组(柔性数组)来存储字符串,而且字符串必须要以一个空字符串 \0 来结尾。而且字符串并不记录长度,所以如果想要获取一个字符串的长度就必须遍历整个字符串,直到遇到第一个 \0 为止(\0 不会计入字符串长度),故而获取字符串长度的时间复杂度为 O(n)。
正因为 C 语言中是以遇到的第一个空字符 \0 来识别是否到了字符串末尾,因此其只能保存文本数据,不能保存图片,音频,视频和压缩文件等二进制数据,否则可能出现字符串不完整的问题,所以其是二进制不安全的。
Redis 中为了实现二进制安全的字符串,对原有 C 语言中的字符串实现做了改进。经过改进之后,如果想要获取 sds 的长度不用去遍历 buf 数组了,直接读取 len 属性就可以得到长度,时间复杂度一下就变成了 O(1),而且因为判断字符串长度不再依赖空字符 \0,所以其能存储图片,音频,视频和压缩文件等二进制数据,不用担心读取到的字符串不完整。
需要注意的是,sds 依然遵循了 C 语言字符串以 \0 结尾的惯例,这么做是为了方便复用 C 语言字符串原生的一些API,换言之就是在 C 语言中会以碰到的第一个 \0 字符当做当前字符串对象的结尾,所以如果一些二进制数据就会可能出现读取字符串不完整的现象,而 sds 会以长度来判断是否到字符串末尾。
String的操作命令如下:
SET

将字符串值 vv设置到kk中。
如果 kk已经持有其他值, SET 就覆写旧值, 无视类型。
当 SET 命令对一个带有生存时间(TTL)的键进行设置之后, 该键原有的 TTL 将被清除。

SETNX

只在键 kk不存在的情况下, 将键 kk的值设置为 vv。
若键 kk已经存在, 则 SETNX 命令不做任何动作。
SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简写。

SETEX

将键 的值设置为 vv, 并将键 kk的生存时间设置为 seconds 秒钟。
如果键 kk已经存在, 那么 SETEX 命令将覆盖已有的值。

PSETEX

这个命令和 SETEX 命令相似, 但它以毫秒为单位设置 kk的生存时间, 而不是像 SETEX 命令那样以秒为单位进行设置。

GET

如果键 kk不存在, 那么返回特殊值 nil ; 否则, 返回键 kk的值。
如果键 kk的值并非字符串类型, 那么返回一个错误, 因为 GET 命令只能用于字符串值。

GETSET

将键 kk的值设为 vv, 并返回键 kk在被设置之前的旧值。

STRLEN

返回键 kk储存的字符串值的长度。

APPEND

如果键 kk已经存在并且它的值是一个字符串, APPEND 命令将把 vv追加到键 kk现有值的末尾。
如果 kk不存在, APPEND 就简单地将键 kk的值设为 vv, 就像执行 SET kkvv一样。

SETRANGE

从偏移量 offset 开始, 用 vv参数覆写(overwrite)键 kk储存的字符串值。
不存在的键 kk当作空白字符串处理。

GETRANGE

返回键 kk储存的字符串值的指定部分, 字符串的截取范围由 start 和 end 两个偏移量决定 (包括 start 和 end 在内)

INCR

为键 kk储存的数字值加上一。
如果键 kk不存在, 那么它的值会先被初始化为 0 , 然后再执行 INCR 命令。

INCRBY

为键 kk储存的数字值加上增量 increment 。
如果键 kk不存在, 那么键 kk的值会先被初始化为 0 , 然后再执行 INCRBY 命令。

INCRBYFLOAT

为键 kk储存的值加上浮点数增量 increment 。
如果键 kk不存在, 那么 INCRBYFLOAT 会先将键 kk的值设为 0 , 然后再执行加法操作。

DECR

为键 kk储存的数字值减去一。
如果键 kk不存在, 那么键 kk的值会先被初始化为 0 , 然后再执行 DECR 操作。

DECRBY

将键 kk储存的整数值减去减量 decrement 。

MSET

同时为多个键设置值。
如果某个给定键已经存在, 那么 MSET 将使用新值去覆盖旧值, 如果这不是你所希望的效果, 请考虑使用 MSETNX 命令, 这个命令只会在所有给定键都不存在的情况下进行设置。

MSETNX

当且仅当所有给定键都不存在时, 为所有给定键设置值。
即使只有一个给定键已经存在, MSETNX 命令也会拒绝执行对所有键的设置操作。

MGET

返回给定的一个或多个字符串键的值。
如果给定的字符串键里面, 有某个键不存在, 那么这个键的值将以特殊值 nil 表示。

你可能感兴趣的:(redis,字符串,数据结构,linux,c语言)