前面我们讲解了一些 Redis 的全局命令(Redis常用基本全局命令)。所谓全局命令,就是可以匹配任意一个数据结构进行使用。但是不同的数据结构,也有自己的操作命令。本篇文章主要讲解的是 String 的操作命令,希望会对你有所帮助。
文章目录
一、简单介绍
二、常用命令
2、1 常见命令
set
get
MGET 和 MSET
SETNX、SETEX
2、2 计数命令
INCR 和 INCRBY
DECR 和 DECRBY
INCRBYFLOAT
2、3 其他命令
APPEND
GETRANGE
SETRANGE
STRLEN
三、小结
🙋♂️ 作者:@Ggggggtm 🙋♂️
👀 专栏:Redis 👀
💥 标题: Redis命令——String篇 💥
❣️ 寄语:与其忙着诉苦,不如低头赶路,奋路前行,终将遇到一番好风景 ❣️
一、简单介绍
我们再次强调:redis 所有的key都是字符串(String)类型,value的类型是存在差异的!而我们本篇文章讲解的 String 的命令操作,也是针对 value 的。
Redis 中的字符串,直接就是按照字节数组(二进制数据)的方式存储的!不会做任何的编码转换,存的是啥,取出来就还是啥!不仅仅可以存储文本数据,还支持存储整数、文本、JSON、二进制数据等。
字符串类型是Redis最基础的数据类型,关于字符串需要特别注意:
- 首先Redis 中所有的键的类型都是字符串类型,而且其他几种数据结构也都是在字符串类似基础上构建的,例如列表和集合的元素类型是字符串类型,所以字符串类型能为其他4种数据结构的学习奠定基础。
- 其次,如下图所示,字符串类型的值实际可以是字符串,包含一般格式的字符串或者类似JSON、XML格式的字符串;数字,可以是整型或者浮点型;甚至是二进制流数据,例如图片、音频、视频等。不过一个字符串的最大值不能超过512 MB。
由于Redis内部存储字符串完全是按照二进制流的形式保存的,所以Redis是不处理字符集编码问题的,客户端传入的命令中使用的是什么字符集编码,就存储什么字符集编码。
下面我们就来看一下String的操作命令。
二、常用命令
2、1 常见命令
set
前面文章中我们讲解过set命令的使用。在此我们再次详细解释一下 set 命令的使用。首先,get、set都是针对 String 的命令,也是最为重要和基础的两个命令!set 语法格式:
SET key value [expiration EX seconds|PX milliseconds] [NX|XX]
下面是对 set 命令参数的详细解释:
- key:指定要设置值的键。
- value: 要存储的值。
- [expiration EX seconds | PX milliseconds]: 可选参数,用于设置键的过期时间。可以使用
EX
参数和以秒为单位的时间来设置过期时间,或者使用PX
参数和以毫秒为单位的时间来设置过期时间。过期后会自动删除!具体实例如下:- [NX|XX]: 可选参数,用于指定设置操作的行为。NX——只在key不存在时才进行设置,即如果key之前已经存在,设置不执行。XX——只在key存在时才进行设置,即如果key之前不存在,设置不执行。具体实例如下:
注意,redis文档给出的语法格式说明:
- [ ] 相当于一个独立的单元,表示可选项(可有可无的);
- 其中 | 表示 "或者" 的意思,多个只能出现一个;
- [ ] 和 [ ] 之间,是可以同时存在的。
get
get命令没什么好解释的,也是只支持字符串(String)类型的value。如果不匹配,则直接会报错提示。具体如下:
语法也很简单:
get key
直接使用即可,这里不再做过多解释!需要学习的可以参看此篇文章:Redis常用基本全局命令。
MGET 和 MSET
在Redis中,MGET和MSET是用于批量获取和设置多个键值对的命令。之前我们也说明了Redis是一个基于网络的客户端/服务器的中间件。为了减少网络IO的次数,那么就出现了MGET 和 MSET 指令。类似的Redis都有很多命令都是可以支持一次操作多个键值对的。其目的就是为了提高效率。
我们先来看一下MGET 命令语法:
MGET key [key ...]
理解并不难,我们直接看实例:
我们再来看一下MSET 的语法:
MSET key value [key value ...]
我们直接看实例:
两者的时间复杂度均为O(n),这里的 n 并不是指的redis中所有的key,而是我们所设置的key的个数。即使mset 和 mget 指令可以一次操作多个键值对,但是并不会一次设置或者获取 太对的键值对。因为我一次设置假设10w个键值对,有可能把redis 给阻塞住了!导致其他的命令不能够被执行,引起连锁反应!
SETNX、SETEX
SETNX、SETEX其实就是把set 中的nx 和 ex选项结合成为一个命令了。这里再简单解释一下。
SETNX 命令用于在 Redis 中设置一个 key 的值,如果这个 key 不存在的话。如果设置成功,返回 1;如果 key 已经存在,则不做任何操作,返回 0。具体实例如下:
SETEX 命令用于在 Redis 中设置一个 key 的值,并指定该 key 在指定的秒数后过期。如果设置成功,返回 OK。这里要说明一下其语法:
SETEX key seconds value
我们直接看一个实例:
2、2 计数命令
INCR 和 INCRBY
在 Redis 中,INCR 和 INCRBY 命令都用于对存储在指定 key 中的值进行增量操作。
- INCR 命令用于将存储在指定 key 的值递增 1。如果 key 不存在,则先将其设置为 0,然后再执行递增操作。语法:INCR key。
- INCRBY 命令用于将存储在指定 key 的值递增指定的增量值。如果 key 不存在,则先将其设置为 0,然后再执行递增操作。语法:INCRBY key increment。
注意:如果INCR 和 INCRBY key对应的string 不是一个整型或者范围超过了64位有符号整型,则报错。我们来看一下实例:
DECR 和 DECRBY
在 Redis 中,DECR 和 DECRBY 命令与 INCR 和 INCRBY 命令相反,用于对存储在指定 key 中的值进行减量操作。
- DECR 命令用于将存储在指定 key 的值递减 1。如果 key 不存在,则先将其设置为 0,然后再执行递减操作。语法:DECR key。
- DECRBY 命令用于将存储在指定 key 的值递减指定的减量值。如果 key 不存在,则先将其设置为 0,然后再执行递减操作。语法:DECRBY key decrement。
注意:如果DECR 和 DECRBY key对应的string 不是一个整型或者范围超过了64位有符号整型,则报错。
INCRBYFLOAT
INCRBYFLOAT是 Redis 中用于对存储在指定键中的浮点数值进行增加或减少操作的命令。下面是关于 INCRBYFLOAT 命令语法:
INCRBYFLOAT key increment
功能描述:
- INCRBYFLOAT 命令用于在指定键存储的值为浮点数时,将这个值增加(或减少)指定的浮点数增量。
- 如果键不存在,那么在执行命令前,会先将键的值设置为 0,再执行增加操作。
- 如果键包含的值不是浮点数,命令将返回错误。
- 增量参数可以是正数也可以是负数,用来增加或减少存储在键中的浮点数值。
注意:并没有DECRBYFLOAT,我们可以通过INCRBYFLOAT key 负数 来实现对 key 的减法操作。这里就不再举例了,大家可以自己操作一下。
2、3 其他命令
APPEND
append 顾名思义就是追加嘛!如果key已经存在并且是一个string,命令会将value追加到原有string的后边。如果key不存在,会先将键的值设置为空字符串再进行追加操作,则效果等同于SET命令。最终返回值为追加后字符串的长度。其语法如下:
APPEND KEY VALUE
具体实例如下:
可不可以追加汉字呢?是可以的。具体如下:
append返回值,长度的单位是字节。但是为什么会是6个字节呢?redis的字符串不会对字符编码做任何处理(redis 不认识字符,只认识字节)。当前咱们的xshell终端,默认的字符编码是utf8,在终端中输入汉字之后,也就是按照utf8编码的。一个汉字在utf8字符集中通常是3个字节的。
我们通过get 获取value时,发现并不是我们所想的到的汉字,而是一堆二进制。因为存储进去时,并没有指定编码格式,那么存储的就是二进制,并且是以utf8所对应的编码方式的二进制存储进去的。所以我们得到的就是一堆二进制。
在启动redis客户端的时候,加上一个--raw这样的选项。就可以使redis客户端能够自动的把二进制数据尝试翻译。具体如下:
GETRANGE
GETRANGE 命令用于获取指定键对应值的子字符串(根据指定的起始位置和结束位置)。语法:
GETRANGE key start end
返回key对应的string的子串,由start和 end确定(左闭右闭),并且起始位置为0。可以使用负数表示倒数。-1代表倒数第一个字符(len - 1),-2代表倒数第二个(len - 2),其他的与此类似。超过范围的偏移量会根据string的长度调整成正确的值。具体实例如下:
如果字符串中保存的是汉字,此时进行子串切分,很可能切出来的就不是完整的汉字了!如下:
上述的代码,是强行切出了中间的四个字节。随便这么一切,切出的结果在utf8码表上不知道能查出啥了。
SETRANGE
SETRANGE 命令用于替换指定键对应值的字符串中的部分内容。语法:
SETRANGE key offset value
offset 为偏移量,表示从哪个位置开始替换字符串内容(以 0 表示)。value就是覆盖指定位置的值。注意:setrange 是用来覆盖替换的,并不是插入!具体实例如下:
setrange针对不存在的key也是可以操作的.不过会把 offset之前的内容填充成0x00.具体如下:
STRLEN
STRLEN 命令用于获取存储在指定键中的字符串值的长度。当key存储的value不是string时,直接报错。或者当 key 不存在时,返回 0。语法:
STRLEN key
具体实例如下:
三、小结
上述命令总结出如下表格,根据不同场景可以做出不同选择。具体如下: