Redis常用命令——String篇

  前面我们讲解了一些 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 中的值进行增量操作。

  1. INCR 命令用于将存储在指定 key 的值递增 1。如果 key 不存在,则先将其设置为 0,然后再执行递增操作。语法:INCR key。
  2. INCRBY 命令用于将存储在指定 key 的值递增指定的增量值。如果 key 不存在,则先将其设置为 0,然后再执行递增操作。语法:INCRBY key increment。

  注意:如果INCR 和 INCRBY key对应的string 不是一个整型或者范围超过了64位有符号整型,则报错。我们来看一下实例:

DECR 和 DECRBY

  在 Redis 中,DECR 和 DECRBY 命令与 INCR 和 INCRBY 命令相反,用于对存储在指定 key 中的值进行减量操作。

  1. DECR 命令用于将存储在指定 key 的值递减 1。如果 key 不存在,则先将其设置为 0,然后再执行递减操作。语法:DECR key。
  2. 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

  具体实例如下:

三、小结

  上述命令总结出如下表格,根据不同场景可以做出不同选择。具体如下:

  • 10
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ggggggtm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值