极致性能的服务器Redis之String类型及相关指令介绍

目录

1.String介绍

[2. 相关命令](#2. 相关命令)

[2.1 set](#2.1 set)

[2.2 set+[NX/XX]](#2.2 set+[NX/XX])

[2.3 set+[PX/EX]](#2.3 set+[PX/EX])

[2.4 mget](#2.4 mget)

[2.5 mset](#2.5 mset)

[2.6 incr](#2.6 incr)

[2.7 incrby](#2.7 incrby)

​编辑

[2.8 decr](#2.8 decr)

[2.9 decrby](#2.9 decrby)

[2.10 incrbyfloat](#2.10 incrbyfloat)

[2.11 append](#2.11 append)

[2.12 getrange](#2.12 getrange)

[2.13 setrange](#2.13 setrange)

[2.14 strlen](#2.14 strlen)


1.String介绍

String 是 Redis 最基础的类型,核心优势是 "灵活 + 快"。⾸先 Redis 中所有的键的 类型都是字符串类型,⽽且其他⼏种数据结构也都是在字符串类似基础上构建的,例如列表和集合的元素类型是字符串类型,所以字符串类型能为其他 4 种数据结构的学习奠定基础。

这边所说的String其实就是我们C++里面的那个String类型。

注意我们后面会学习到哈希,列表之类的类型,但是他们只是在结构上有所不同,但是他们的其实也是在String的类型的基础上创建出来的,比如说列表,它里面存储的一个个元素就是String类型的。

2. 相关命令

2.1 set

将 string 类型的 value 设置到 key 中。如果 key 之前存在,则覆盖,⽆论原来的数据类型是什么。

这个的话我们在前面是说过,在这边还说是因为这个set后产生的类型是String的,所以我们在这边再说一下。

语法:

sql 复制代码
set key value

我们看,像这样写出来的value就是string类型的

2.2 set+[NX/XX]

我们去想考一个问题,在Redis中如果说不让我们使用keys *这样的指令的话,那么我们很有可能是会造成数据覆盖问题的,从而导致数据丢失。那么Redis针对这个问题也是有一套自己的处理方式。

NX ⸺只在 key 不存在时才进⾏设置,即如果 key 之前已经存在,设置不执⾏。

语法:

sql 复制代码
set key value nx

我们看下面这张图片,在没有key2的时候是可以插入进去的,但是当已经有key2这个key值的时候就无法插入了,会返回nil。

XX ⸺只在 key 存在时才进⾏设置,即如果 key 之前不存在,设置不执⾏

语法:

sql 复制代码
set key value xx

我们来看下面这张图片,原本的key1在经过set xx后变成了ddd,而我们想要创建一个key3时就直接失败了,这是因为xx代表没有这个key的时候才可以创建这个key。

2.3 set+[PX/EX]

我们在前面学习过expire这个指令,作用是设置这个键值对的过期时间。而在这里我们也可以在创建一条指令的时候直接设置好它的过期时间。

EX seconds⸺使⽤秒作为单位设置 key 的过期时间。

语法:

sql 复制代码
set key value ex 要设置的秒数

我们看下面这张图片,像这样操作我们就设置好了这个键值对的秒数,当时间到了之后我们就没有办法访问这个键值对了。

PX milliseconds⸺使⽤毫秒作为单位设置 key 的过期时间。

语法:

sql 复制代码
set key value px 要设置的毫秒数

我们看下面这张图片,像这样操作我们就设置好了这个键值对的毫秒数,当时间到了之后我们就没有办法访问这个键值对了。

2.4 mget

这个指令可以⼀次性获取多个 key 的值。如果对应的 key 不存在或者对应的数据类型不是 string,返回 nil。

语法:

sql 复制代码
mget 要查询的key值

我们看,直接怎么用就可以把要查询的键值对都拿到了。

Redis是单线程的,所以如果我们在这里mget了上万个key值的话,那么就会导致让Redis陷入卡顿。

2.5 mset

这条指令的话就是可以⼀次性设置多个 key 的值。

语法:

sql 复制代码
mset 键值对 键值对......

我们看下面这张图,这样我们就设置好了多个键值对,要注意的地方和上面一样,不要让Redis陷入卡顿。

2.6 incr

将 key 对应的 string 表⽰的数字加⼀。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错。

语法:

sql 复制代码
incr key

我们来看下面这张图片,当我们创建的键值对里面的value是数字的时候我们就可以用incr的方式来进行自增长。

这个自增长只有在value是整数的时候可以使用,当它是浮点数或者什么别的时候就不可以使用。

2.7 incrby

这个指令就是把 key 对应的 string 表⽰的数字加上对应的值。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错。

语法:

sql 复制代码
incrby key 要增加的值

我们看下面这张图片,只有这个value是整数的时候我们才可以添加成功,否则就会失败。

我们来看下面这张图片,当2这个value很大的时候我们也是无法添加成功的。

我们要注意,当key不存在的时候使用incrby的话他是默认创建这个键值对并且把value给设置为0。

PS:关于自增长和自减少的这些指令在遇到key值不存在的时候都会进行这个操作,那就是创建并默认value为0。

2.8 decr

将 key 对应的 string 表⽰的数字减⼀。如果 key 不存在,则视为 key 对应的 value 是 0。

语法:

sql 复制代码
decr key

我们来看下面这个图片,decr就是这么使用的,当遇到非整数(浮点数,字母,中文...)这些的时候都会报错

当然,当它遇到value很大的情况下,也会无法进行原有的-1操作的。

2.9 decrby

这个指令就是把 key 对应的 string 表⽰的数字减去对应的值。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错。

语法:

sql 复制代码
decrby key 要减去的值

我们看下面这种图片,decrby就是怎么使用的。

2.10 incrbyfloat

这个指令的话就是专门用来给 浮点数来进行增加的。

PS:差点忘记说了,就是虽然我们的value是String类型的,但是它只是以这种方式来进行存储,我们也是可以对其进行加减操作的。

语法:

sql 复制代码
incrbyfloat key 要加的数字

我们看下面这个图片,无论是整数还是浮点数,incrbyfloat都是可以对其进行增加操作的。

2.11 append

这个指令的话如果 key 已经存在并且是⼀个 string,命令会将 value 追加到原有 string 的后边。如果 key 不存在,则效果等同于 SET 命令。

这个和C++里面String的那个接口函数很像,都是差不多的用法。

语法:

sql 复制代码
append key 要添加的子串

我们看下面这张图片,因为在Redis中都是字符窜类型的,所以不管是aaa还是10,我们都是可以在它的后面加上子串的。

我们在这里是可以给一个很大的数的后面加上子串的,这点和incr和decr这些指令不一样。

2.12 getrange

返回 key 对应的 string 的⼦串,由 start 和 end 确定(左闭右闭)。可以使⽤负数表⽰倒数。-1 代表 倒数第⼀个字符,-2 代表倒数第⼆个,其他的与此类似。超过范围的偏移量会根据 string 的⻓度调整成正确的值。

语法:

sql 复制代码
getrange key 要访问的开头 要访问的结尾

我们看下面这张图片,只有最后那个-1 0 是无法访问到任何东西的,这是因为两者错开了。

2.13 setrange

这个指令就是用来覆盖字符串的⼀部分,从指定的偏移开始。 简单来说就是覆盖。

语法:

sql 复制代码
setrange key 要覆盖的起始位置 value

我们看下面这张图片,通过一下的方式我们就可以完成覆盖

我们看下面这张图片,如果说要覆盖的子串的长度远超原字符串,那么就会对其进行扩容,确保后续的子串可以插入。

我们看下面这张图片,如果这边的key是一个没有的键值对,那么就会创建一个键值对。

如果这个时候我们的开头位置不是0的话,那么Redis就会在开头的位置上加上x00。

2.14 strlen

这个指令的话就是获取 key 对应的 string 的⻓度。当 key 存放的类似不是 string 时,报错。

语法:

sql 复制代码
strlen key

我们看下面这张图片,只要我们这边是单纯的String类型的,那么就可以使用strlen这条指令。

在这边之所以两个汉字有6位,这是因为在Redis中采用的是UTF8,所以在这里就是一个字占三个字节。

相关推荐
zihan03212 小时前
Redis Windows版本默认配置文件,Redis配置不生效解决方案
数据库·redis·缓存
Hgfdsaqwr3 小时前
实战:用Python开发一个简单的区块链
jvm·数据库·python
砚边数影3 小时前
InfluxDB迁移替换实战:金仓时序数据库如何提高写入性能
数据库·性能优化·时序数据库·kingbase·kingbasees·金仓数据库
Whisper_Sy9 小时前
Flutter for OpenHarmony移动数据使用监管助手App实战 - 网络状态实现
android·java·开发语言·javascript·网络·flutter·php
eWidget9 小时前
InfluxDB迁移至金仓数据库的同城容灾实践:性能显著提升、运维效率优化,某能源企业实现RPO_5秒的高可靠时序数据管理
运维·数据库·能源·时序数据库·kingbase·kingbasees·金仓数据库
Black蜡笔小新9 小时前
视频汇聚平台EasyCVR打造校园消防智能监管新防线
网络·人工智能·音视频
珠海西格电力科技9 小时前
双碳目标下,微电网为何成为能源转型核心载体?
网络·人工智能·物联网·云计算·智慧城市·能源
小句9 小时前
MySQL慢查询日志详细使用指南
数据库·mysql·adb
REDcker10 小时前
Redis容灾策略与哈希槽算法详解
redis·算法·哈希算法