标题:【Redis01】Redis基础:String相关操作

文章目录
    分类:存储运维 标签:Redis

    Redis基础学习:String相关操作

    在 Redis 中,最基础,最简单的当然就是这个 String 数据类型了。简单地说,你就可以把它看成是 PHP 中的变量,或者你用过 Memcached ,那就再熟悉不过了。本身这种 k/v 形式的缓存也是我们日常使用最多的一种缓存形式,所以大家对于它的操作应该还是比较熟悉的,我们就简单的根据官方文档来学习巩固一下。

    SET 命令

    啥玩意,这个命令还用教?你以为 set 就是写一个 key 再赋值一个 value 嘛?没看文档之前我也是这么认为,但其实它还有很参数。正式的 SET 签名是下面这个样子的。

    SET key value [EX seconds|PX milliseconds|EXAT timestamp|PXAT milliseconds-timestamp|KEEPTTL] [NX|XX] [GET]

    还是比较好理解的吧,EX/PX/EXAT/PXAT/KEEPTTL 都是过期时间相关的,NX/XX 是根据原来键的存在情况有不同的处理表现的,最后一个 GET 则是 Redis6 新加的,我们一个一个来看。

    EX/PX/EXAT/PXAT/KEEPTTL

    都是和过期时间有关的设置,EX和PX是设置时间长度,一个是秒,一个是毫秒,这几个不能一起设置哦。

    127.0.0.1:6379> set a b ex 10 px 10
    (error) ERR syntax error

    EXAT 和 PXAT 是到某个指定的时间戳之后过期,同样也是秒和毫秒的区别。

    127.0.0.1:6379> set a b exat 1650614954
    OK
    127.0.0.1:6379> ttl a
    (integer) 91

    而 KEEPTTL 指的是,如果之前有设置了过期相关的参数,那么再次设置的时候,不影响之前设置的过期时间。


    通过 set 进行修改设置的时候,会覆盖之前设置的过期时间信息,比如下面这样。

    127.0.0.1:6379> set a b ex 1000
    OK
    127.0.0.1:6379> ttl a
    (integer) 997
    127.0.0.1:6379> set a c
    OK
    127.0.0.1:6379> ttl a
    (integer) -1

    一开始我们设置了过期时间为 1000 秒,然后我们再次给这个 a 赋值,这个时候没有带过期时间相关的设置,它就被覆盖成了永久的。而 KEEPTTL 指的是,如果之前有设置了过期相关的参数,那么再次设置的时候,不影响之前设置的过期时间。

    127.0.0.1:6379> set a 123 ex 100
    OK
    127.0.0.1:6379> ttl a
    (integer) 97
    127.0.0.1:6379> set a 234 keepttl
    OK
    127.0.0.1:6379> ttl a
    (integer) 88

    NX/XX

    这两个参数的意思其实很简单,NX 表示如果这个 key 存在,就不能设置,XX 正好反过来,如果这个 key 存在,就可以设置,如果不存在,就不能设置。NX 是神器,后面的进阶学习中有它的超级应用:分布式锁。

    127.0.0.1:6379> set a b nx
    (nil)
    127.0.0.1:6379> set a b xx
    OK
    127.0.0.1:6379> set b a xx
    (nil)

    GET

    这个 GET 参数是 Redis6 新增的,其实就是设置一个 key 的值之后,再把它之前的值返回回来。

    127.0.0.1:6379> set a d get
    "b"

    GETSET 是之前的一个专门用于实现此类操作的命令,不过已经标记为过期了,如果是新项目用得比较新的 Redis 的话,就直接用 SET 的这个参数就好了。


    此外的一些设置相关的命令,比如 SETNX, SETEX, PSETEX ,都和上面的 SET 命令中的参数的作用类似,只是属于独立的命令,毕竟我们的一些其它数据类型也会使用到过期时间设置之类的功能。这一块就不详细说了,因为都比较简单,大家可以自己去看一下。

    GET

    最基础的 GET 命令很简单,咱们也就不多说了,主要来看看两个 GET 的衍生命令,分别是 GETDEL 和 GETEX 。这两个命令也比较好理解,GETDEL 是返回值之后再把它删了,GETEX 则是返回值并且再给它设置一个过期时间。

    127.0.0.1:6379> getdel a
    hello,redisredisfff
    127.0.0.1:6379> get a
    
    127.0.0.1:6379> set b bbb
    OK
    127.0.0.1:6379> ttl b
    -1
    127.0.0.1:6379> getex b ex 100
    bbb
    127.0.0.1:6379> ttl b
    98
    

    SETRANGE和GETRANGE

    这两个是范围相关的操作,也就是可以设置或者获取指定 key 中数据的一部分内容。

    127.0.0.1:6379> set a hello,world
    OK
    127.0.0.1:6379> setrange a 6 redis
    (integer) 11
    127.0.0.1:6379> get a
    "hello,redis"

    上面的例子中,我们设置了一个 a ,内容是 hello,world 。然后使用 SETRANGE ,从第6个字符开始,将后面的值设置成 redis ,最后输出的结果就变成了 hello,redis 。如果我们指定的位置超过了原来字符的数量怎么办呢?

    127.0.0.1:6379> setrange a 16 redis
    (integer) 21
    127.0.0.1:6379> get a
    "hello,redis\x00\x00\x00\x00\x00redis"

    可以看到,超过部分的内容会被替换成零值,注意哦,这个不是0,也不是空字符或者空格,就是个占位零值,大家可以自己试试,如果用PHP获取这条数据打印出来的就是连在一起的 hello,redisredis 。


    获取数据的范围内容也很简单。

    127.0.0.1:6379> getrange a 6 12
    "redis\x00\x00"
    127.0.0.1:6379> getrange a 6 10
    "redis"
    127.0.0.1:6379> getrange a 22 10
    ""
    127.0.0.1:6379> getrange a 22 30
    ""
    127.0.0.1:6379> getrange a 5 1
    ""

    第一个参数是开始位置,也就是从第几个开始,第二个参数是结束位置。注意,第二个参数不是 MySQL 里面那种 limit ,而是确定的结束位置的下标。就像上面最后那条测试语句一样,第5个字符肯定是有内容的,但后面的结束位置给的是1,返回的还是空。

    APPEND

    追加数据,针对指定的 key ,向它的 value 中追加内容。如果指定的 key 不存在,则会创建这个 key 。这个比较好理解,大家看下面的代码即可。

    127.0.0.1:6379> append a fff
    24
    127.0.0.1:6379> get a
    hello,redisredisfff
    
    127.0.0.1:6379> append c ccc  // 不存在的
    3
    127.0.0.1:6379> get c
    ccc

    增减操作

    原子增减操作相信也是不少同学经常使用的功能,没什么多说的,INCR 增1,INCRBY 指定增几。同样的,减1是 DECR ,指定减几就是 DECRBY 。

    127.0.0.1:6379> set a 1
    OK
    127.0.0.1:6379> incr a
    2
    127.0.0.1:6379> incrby a 2
    4
    127.0.0.1:6379> decr a
    3
    127.0.0.1:6379> decrby a 2
    1

    如果我们保存的类型不是数字,那么是无法进行这两个增减操作的,会直接报错。除了标准的数字类型外,还可以操作浮点类型。

    127.0.0.1:6379> incrbyfloat a 2.5
    3.5
    127.0.0.1:6379> decrbyfloat a 1.5
    ERR unknown command `decrbyfloat`, with args beginning with: `a`, `1.5`,
    
    127.0.0.1:6379> incrbyfloat a -1.5
    2

    对于浮点类型的操作,只有 INCRBYFLOAT 这一个操作命令,没有 DECRBYFLOAT ,要进行减的操作其实也比较简单,给个负值就好啦。同样的,我们使用 INCRBY 并给负数的话,也是可以做减操作的。

    批量操作

    除了可以一个一个的添加以及获取数据外,我们也可以批量地添加或者获取数据。

    127.0.0.1:6379> mset a aaa b bbb c ccc
    OK
    127.0.0.1:6379> mget a b c
    aaa
    bbb
    ccc

    对于批量操作来说,MSET 的参数就是一个 key 一个 value 的不停的向下添加。而获取就更简单了,直接写一排 key 就可以获取到这些 key 中的内容了。对于批量操作来说,只有一个额外的 MSETNX 命令,其实就和上面的 SET 命令中的 NX 参数一样,如果 key 存在,就不会修改添加。

    127.0.0.1:6379> msetnx a aaaa b bbbb c cccc
    0
    127.0.0.1:6379> mget a b c
    aaa
    bbb
    ccc
    127.0.0.1:6379> msetnx d aaaa e bbbb f cccc
    1
    127.0.0.1:6379> mget d e f
    aaaa
    bbbb
    cccc
    
    127.0.0.1:6379> del a b c d e f
    6

    最后,DEL 这个删除 key 的命令本身就是支持放多个 key 的。

    中文问题

    默认情况下,redis-cli 客户端打开是以 utf-8 做为字符编码的,打印出来的效果是这样的。

    127.0.0.1:6379> get a
    "\xe4\xb8\xad\xe5\x9b\xbd\xe4\xba\xba"

    如果我们想要看到真实的中文,可以在打开 redis-cli 时加一个参数。

    redis-cli --raw

    然后打开出来的内容就会显示正常的中文了。

    127.0.0.1:6379> get a
    中国人

    另外还需要注意的,像是获取字符长度或者上面 GETRANGE 之类的函数,所针对的字符都是以 UTF-8 为标准的,也就是说,一个中文占三个字节。

    127.0.0.1:6379> set a 中国人
    OK
    127.0.0.1:6379> get a
    中国人
    127.0.0.1:6379> strlen a
    9
    
    127.0.0.1:6379> getrange a 0 1
    �
    127.0.0.1:6379> getrange a 0 2
    中

    这个应该不用过多强调了,和 PHP 中原生的 strlen() 那些函数是一个概念。

    总结

    String 类型是最简单的,也是最常用的数据类型,没有什么别的好总结的,日常使用中肯定还是 SET 和 GET 用得最多,了解一下可以批量添加以及过期相关的设置就可以啦!

    视频链接

    微信文章地址:https://mp.weixin.qq.com/s/CBa7Kz5-u0LyFhX4zMNi0w

    B站视频地址:https://www.bilibili.com/video/BV1uz4y1a7C1

    微信视频地址:https://mp.weixin.qq.com/s/1jIN2GIvKq7g2guZkZReSQ

    搜索
    关注