Redis -- String 字符串, 计数命令,字符串操作

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Redis -- String 字符串, 计数命令,字符串操作


Redis的String字符串

       redis中所有的key都是字符串的,但是value是存在各种差异的。Redis中的字符串直接就是按照二进制的方式进行存储的,不会做任何编码转换,存的是啥取得就是啥。对于value来说,不仅仅可以存储文本数据,还可以存储整数,普通文本,Json,xml,还有一些二进制文件,例如图片音频等,但是redis对string类型限制了大小,最高位512MB。

       下面是字符串类型的value的不同形式:

       区别于MySQL,MySQL有一个默认的字符集,为拉丁文的字符集,插入中文机会检测插入失败。但是redis是直接存储的二进制,因此redis遇到乱码的概率就小的多。

常见命令

set

       将 string 类型的 value 设置到 key 中。如果 key 之前存在,则覆盖,无论原来的数据类型是什么。之前关于此 key 的 TTL 也全部失效。

        除了最常见的set key value之外,我们还可以在set的时候设置存活时间,类似于expire的操作。

语法set key value [expiration EX seconds | PX milliseconds] [NX|XX]

       相当于set key value和expire key 10这两步的操作。EX设置的相当于秒级,PX设置的表示毫秒级。NX表示如果key不存在才设置,XX表示key存在,则不设置,并且返回nil(相当于更新操作

       [ ]表示一个独立的单元,相当于一个可有可无的选项,[ ]中的|表示或者的意思,即使是多个|也只能选择其中的一个。[ ]和[ ]之间是可以同时存在的。

       还有一个小技巧就是在redis-cli输入flushAll,这个操作就相当于mysql里面的drop database。

演示

        -2表示当前key已经被删除了

       设置NX参数:

       nil表明key1已经存在无法设置

       设置XX参数:

       OK表示覆盖key1成功

get

       get key来获取对应key的value,但是只能获取对应value为字符串类型的key。

       例如 :

       创建一个列表类型的value,然后尝试使用get去获取,发现报错。

mget

       一次性get多个key 的value。对比与get操作,mget可以减少网络传输的次数,可以节省网络资源。

       时间复杂度为O (N),n是key的数量

        下面是一个简单的时间消耗对比:

       但是由于其是单一线程模型,同一个请求的任务的执行时间不宜过长。学会使用批量操作,可以有效提高业务处理效率,但是要注意,每次批量操作所发送的键的数量也不是无节制的,否则可能造成单一命令执行时间过长,导致 Redis 阻塞。

语法:mget key [key1 key2 key3 ... ]

       多个key之间使用空格间隔开

演示:

       设置三个key-value

       使用mget获取三个key-value

mset

       一次性可以设置多个key-value,其用法和mget类型。

       时间复杂度O(N)

语法:mset key value [ key2 value2 key3 value3 ... ]

        多个key-value之间使用空格间隔

       返回值为ok。

演示

setnx

      set if not exists

       功能类似于set key value ex,也就是说,设置的这个key已经存在,那么就会设置失败并且返回一个integer0。

语法:setnx key value

演示

setex

       设置一个key-value,并且向此key value增加一个存活时间

语法:setex  key value seconds value

       解释:second表示秒级,代表你要输入的秒数

演示:

       设置一个存活时间为10秒的key value

          -2表示这个key已经不存在了


       既然有秒级,那么必然有毫秒级,毫秒级别的指令为psetex


psetex

       设置一个key-value,并且向此key value增加一个存活时间(毫秒级别)

语法:psetex key value milliseconds value

       解释:second表示毫秒级,代表你要输入的毫秒数

演示

       设置一个存活时间为1000ms的key value.


计数命令

  • incr:针对数字字符串的value 进行 +1 操作
  • incrby:针对数字字符串的value进行 +n操作
  • decr:针对数字字符串的value进行 -1操作
  • decrby:针对数字字符串的value进行 -n操作
  • incrbyfloat:针对浮点数进行处理

       这些命令的对象的value必须是数字类型的字符串例如 "111",但是不能是"111好"

incr

       设置一个value为10的key,然后对其进行incr操作:

       如果设置一个非整数字符串,然后对其进行incr操作:

       此时就会发生错误:ERR value is not an integer or out of range

       说明,这个value为非数字字符串,或者超出了范围(64位),上述例子为超出了范围。

       这里的范围可以理解为java中的long类型

注意

       如果对一个不存在的key进行incr操作会有什么效果?

       ? 咦?这说明什么?incr操作的key如果不存在,就会把这个key当作0来处理

       

incrby

       针对一个数字类型的value来进行+n操作。

语法:incrby key num

       解释:对key的value进行+num操作。这里的key的value必须是一个整数的字符串形式。

       返回值为+num后的结果

演示

       同理如果针对一个不存在的key,那么效果如incr一样,key都会被当作0来进行+num操作。

       当然你也可以使用incrby key -20来让它进行一个-n的操作。

decr

语法:decr key

       返回值为计算之后的值,例如key的value为10,那么decr的返回值就为9

演示:

       同理如果decr的key不存在,那么这个key就会被当作0,然后进行-1操作:

decrby

       -n操作

语法:decrby key num

       返回值为计算之后的结果

演示:

incrbyfloat

       针对浮点数进行加减操作

语法:incrbyfloat key float

       返回值仍然为计算之后的结果。

演示

       如果incrbyfloat一个不存在的key?

       同样会把这个key2当作0来进行处理。


       很遗憾没有decrbyfloat操作,但是你可以使用incrbyfloat 负数的形式实现减法:


       上述这几个计数命令的时间复杂度都是O(1)

       很多存储系统和编程语言内部使用 CAS 机制实现计数功能,会有一定的 CPU 开销,但在 Redis 中完全不存在这个问题,因为 Redis 是单线程架构,任何命令到了 Redis 服务端都要顺序执行,因此多个客户端对同一个value进行计数操作是不会引起'线程安全'的问题的。


       除了对数字类型的字符串进行incr等操作,还有一些更多更常见的场景也需要使用到一些非常常用的命令,例如对一个字符串进行拼接操作等,字符串拼接操作在java中可以说是非常常见了。Redis中也存在对字符串形式的value进行拼接等一系列操作的命令。

字符串操作

append

       如果这个key已经存在,并且是一个string,append命令会将会将要添加的内容追加到原有的value后边,如果key不存在,则等同于set命令。

语法:append key otherString

       返回值值的单位为字节,如果使用的是xshell的终端,默认的字符集编码是utf8,在终端输入汉字之后,也是按照utf8编码,一个汉字在utf8编码通常是3个字节。

演示

       可以看到返回值为integer10,正好为字母数量。

       如果append的key不存在,那么就相当于set:

       汉字的返回值根据它的字符集来计算:

       然后我们通过get来获取这个中文value的key:

       这个汉字被转化为16进制去了。

       可以去字符编码查看网站。

       那么如何将其设置为可以识别中文?

       只需要在启动redis客户端的时候,加上--raw这样的选项,redis就会尝试翻译二进制数据。

getrange

       返回 key 对应的 string 的子串,由 start 和 end 确定(左闭右闭:[start, end])。可以使用负数表示倒数。-1 代表倒数第一个字符,-2 代表倒数第二个,其他的与此类似。超过范围的偏移量会根据 string 的长度调整成正确的值。

语法getrange key  start   end

        时间复杂度:O(N)

演示:

       我们以helloworld为例:

       对helloworld进行各种getrange操作:

       最后发现,发现getrange操作是不会改变原有的key的value的。

       需要注意的是,这里的0 -1,0 -2都是指的字符,但是如果是中文也可以如此吗,例如:

       就会出现各种乱码问题这是为嘛?所以为汉字的时候就尽量不要使用getrange,很可能切出来就不是完整的汉字,上述的代码是强行切除了几个自己,所以在utf8中查出不知道是什么字符。

setrange

       覆盖字符串的一部分,从指定的偏移开始。

语法setrange  key offset value

       其中offset是从第几个字节开始进行替换。举个例子:

       set key hellowrold

       setrange key  1 aaa

       get key 输出 haaaoworld

       时间复杂度:O(N), N 为 value 的长度. 由于一般给的 value 比较短, 通常视为 O(1).

       返回值:替换后的 string 的长度。

演示

       如果offset为1,那么就是从第一个字节开始,如果为0就是从第一个字节的前面开始:

       假设要替换的字节比较靠后,进行替换的字符串也比较长,那么:

       同样的,尽量不要对中文字符串进行setrange操作

strlen

       获取 key 对应的 string 的长度,单位是字节。当 key 存放的类似不是 string 时,报错。

语法:strlen key

       输出key的vaue 的字节数。

案例

小结

string内部编码

字符串类型的内部编码有 3 种:

• int:8 个字节的长整型。

• embstr:小于等于 39 个字节的字符串。

• raw:大于 39 个字节的字符串。

Redis 会根据当前值的类型和长度动态决定使用哪种内部编码实现。


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
打赏
0
0
0
0
5
分享
相关文章
鸿蒙开发:ArkTs字符串string
字符串类型是开发中非常重要的一个数据类型,除了上述的方法概述之外,还有String对象,正则等其他的用处,我们放到以后得篇章中讲述。
60 19
|
5天前
|
Redis如何优化频繁命令往返造成的性能瓶颈?
频繁的命令往返是Redis性能优化中需要重点关注的问题。通过使用Pipeline、Lua脚本、事务、合并命令、连接池以及合理设置网络超时,可以有效减少网络往返次数,优化Redis的性能。这些优化措施不仅提升了Redis的处理能力,还能确保系统在高并发情况下的稳定性和可靠性。
32 14
Redis是如何建立连接和处理命令的
本文主要讲述 Redis 是如何监听客户端发出的set、get等命令的。
1283 160
java连接redis和基础操作命令
通过以上内容,您可以掌握在Java中连接Redis以及进行基础操作的基本方法,进而在实际项目中灵活应用。
120 30
课时16:String字符串
课时16介绍了Java中的String字符串。在Java中,字符串使用`String`类表示,并用双引号定义。例如:`String str = "Hello world!";`。字符串支持使用“+”进行连接操作,如`str += "world";`。需要注意的是,当“+”用于字符串与其他数据类型时,其他类型会先转换为字符串再进行连接。此外,字符串中可以使用转义字符(如`\t`、`\n`)进行特殊字符的处理。掌握这些基本概念对Java编程至关重要。
|
4月前
|
String(字符串)
String(字符串)。
81 3
|
5月前
|
Redis 字符串(String)
10月更文挑战第16天
75 4
|
4月前
|
Redis命令:列表模糊删除详解
通过本文的介绍,我们详细探讨了如何在Redis中实现列表的模糊删除。虽然Redis没有直接提供模糊删除命令,但可以通过组合使用 `LRANGE`和 `LREM`命令,并在客户端代码中进行模糊匹配,来实现这一功能。希望本文能帮助你在实际应用中更有效地操作Redis列表。
167 0
|
12天前
|
《从头开始学java,一天一个知识点》之:字符串处理:String类的核心API
🌱 **《字符串处理:String类的核心API》一分钟速通!** 本文快速介绍Java中String类的3个高频API:`substring`、`indexOf`和`split`,并通过代码示例展示其用法。重点提示:`substring`的结束索引不包含该位置,`split`支持正则表达式。进一步探讨了String不可变性的高效设计原理及企业级编码规范,如避免使用`new String()`、拼接时使用`StringBuilder`等。最后通过互动解密游戏帮助读者巩固知识。 (上一篇:《多维数组与常见操作》 | 下一篇预告:《输入与输出:Scanner与System类》)
42 11
|
18天前
|
课时14:Java数据类型划分(初见String类)
课时14介绍Java数据类型,重点初见String类。通过三个范例讲解:观察String型变量、"+"操作符的使用问题及转义字符的应用。String不是基本数据类型而是引用类型,但使用方式类似基本类型。课程涵盖字符串连接、数学运算与字符串混合使用时的注意事项以及常用转义字符的用法。