Redis学习笔记(数据结构篇)String

书籍推荐:《Redis使用手册》 作者:黄建宏

String 是最基本的键值对类型,这种类型的键值对会将数据库中的单独的键单独的值关联起来。被关联的键和值既可以是简单的字符、文字,也可以是图像、视频、音频、压缩文件等二进制数据。

“message”“hello word”
“redis_log.jpg”“\x8cf\xfug\xjghjhd\xjgjjh\kkxc …”

redis为字符串键提供了一系列的操作命令,通过这些命令可以:

  • 为字符串键设置值

    127.0.0.1:6379> SET number "10086"
    OK
    
    如果用户在执行SET命令时,给定NX选项

    就意味着SET命令在没有值的情况下给键设置值。假如该键有值则SET将会放弃该操作,并返回一个空值nil 表示设置失败。

    127.0.0.1:6379> SET number "10086"
    OK
    127.0.0.1:6379> SET number "10010" NX
    (nil)
    
    如果用户在执行SET命令时,给定XX选项

    就意味着SET命令在有值的情况下给键设置值。假如该键没有值则SET将会放弃该操作,并返回一个空值nil 表示设置失败。(下例中键number3 无值)

    127.0.0.1:6379> SET number3 "10010" XX
    (nil)
    

    对已有值的键number执行SET命令:

    127.0.0.1:6379> SET number "10086"
    OK
    127.0.0.1:6379> SET number "10010" XX
    OK
    

    注意:

    1. NX和XX等可选项的SET命令出现在Redis 2.6.12后
    2. Redis数据库的键的存放方式是无序的,一个新加入的键可以出现在数据库的任何位置上。
    3. 为已有值的键重新设置值会覆盖原值。
  • 获取字符串键的值

    用户可以使用GET命令获取键的值,GET命令接收字符串键作为参数,返回字符串键的值

    127.0.0.1:6379> GET number
    "10010"
    

    如果用户给定的键在数据库中并没有与之对应的值,就会返回空值(nil)

    127.0.0.1:6379> GET number5
    (nil)
    

    注意:
    Redis要求所有键都必须有与之对应的值,所以不存在”有键没值“和”没键有值“的情况,只存在”有值有键“的情况。

  • 在获取旧值的同时为字符串键设置新值

    用户可以使用GETSET命令获取旧值,并为该键设置新值。

    127.0.0.1:6379> GET number
    "10010"、
    127.0.0.1:6379> GETSET number "10086"
    "10010"
    127.0.0.1:6379> GET number
    "10086"
    

    当数据库中并没有与SETGET的键值对时:会返回空(nil)作为旧值,并为改键设置值。

    127.0.0.1:6379> GET number5
    (nil)
    127.0.0.1:6379> GETSET number5 "10011"
    (nil)
    127.0.0.1:6379> GET number5
    "10011"
    

    注意:

    这意味着这种为键赋值的方式,是先GET再SET

    Redis 1.0.0开始使用

  • 同时为多个字符串键设置值

    使用命令MSET为多个字符串键设置值:
    127.0.0.1:6379> MSET message "hello world" number "10086" homepage "redis.io"
    OK
    127.0.0.1:6379> GET message
    "hello world"
    127.0.0.1:6379> GET number
    "10086"
    127.0.0.1:6379> GET homepage
    "redis.io"
    
    使用命令MSETNX为多个字符串键设置值:
    MSETNX key value [key value ...]
    

    MSETNX命令只有在要设置的键在数据库中不存在时才能使用,否则返回0

    示例:

    127.0.0.1:6379> GET number1000
    "10086"
    -- number1000,"10086" 已经存在于数据库
    127.0.0.1:6379> MSETNX number1000 "10010" number1001 "10011" number1002 "10012"
    (integer) 0
    127.0.0.1:6379> GET number1000
    "10086"
    127.0.0.1:6379> GET number1001
    (nil)
    -- 此时返回0,值并未改变
    
    127.0.0.1:6379> MGET number1001 number1002 number1003
    1) (nil)
    2) (nil)
    3) (nil)
    -- number1001,number1002,number1003在数据库中不存在
    127.0.0.1:6379> MSETNX number1001 "1001" number1002 "1002" number1003 "1003"
    127.0.0.1:6379> MGET number1001 number1002 number1003
    1) "1001"
    2) "1002"
    3) "1003"
    (integer) 1
    
    -- 三个键都没有在数据库中对应相应的值,此时能执行MSETNX命令,成功后返回1
    
    属性
    复杂度O(N),其中 N 为用户给定的字符串键数量。
    版本要求MGET 命令从 Redis 1.0.0 开始可用。

    为什么要使用MSET:
    MSET 命令除了可以让用户更为方便地执行多个设置操作之外, 还能够有效地提高程序的效率: 执行多条 SET 命令需要客户端和服务器之间进行多次网络通信, 并因此耗费大量的时间; 通过使用一条 MSET 命令去代替多条 SET 命令, 可以将原本所需的多次网络通信降低为只需一次网络通信, 从而有效地减少程序执行多个设置操作时所需的时间。

  • 同时获取多个字符串键的值

    MGET 命令就是一个多键版本的 GET 命令, 它接受一个或多个字符串键作为参数, 并返回这些字符串键的值:

    MGET key [key ...]
    

    MGET 命令返回一个列表作为结果, 这个列表按照用户执行命令时给定键的顺序排列各个键的值: 比如说, 列表的第一个元素就是第一个给定键的值, 而列表的第二个元素则是第二个给定键的值, 以此类推。

    作为例子, 以下代码展示了如何使用一条 MGET 命令去获取 messagenumberhomepage 三个键的值:

    127.0.0.1:6379> MGET message number homepage
    1) "hello world"
    2) "10086"
    3) "redis.io"
    

    碰到空值也会返回空:

    127.0.0.1:6379> MGET message number homepage
    1) (nil)
    2) "10086"
    3) "redis.io"
    

    为什么要使用MGET命令:

    MSET 命令类似, MGET 命令也可以将执行多个获取操作所需的网络通信次数从原来的 N 次降低至只需一次, 从而有效地提高程序的运行效率。

    属性
    复杂度O(N),其中 N 为用户给定的字符串键数量。
    版本要求MGET 命令从 Redis 1.0.0 开始可用。
  • 获取字符串值的长度

    通过对字符串键执行 STRLEN 命令, 用户可以取得字符串键储存的值的字节长度:

    STRLEN key
    

    示例:

    127.0.0.1:6379> STRLEN number
    (integer) 5
    127.0.0.1:6379> GET number
    "10086"
    
    属性
    复杂度O(1)
    版本要求STRLEN 命令从 Redis 2.2.0 开始可用。
  • 获取字符串指定索引范围内的值

    通过使用 GETRANGE 命令, 用户可以获取字符串值从 start 索引开始, 直到 end 索引为止的所有内容:

    GETRANGE key start end
    

    示例:

    127.0.0.1:6379> GET number
    "10086"
    127.0.0.1:6379> GETRANGE number 1 4
    "0086"
    

    注意:

    GETRANGE 命令接受的是闭区间索引范围, 也即是说, 位于 start 索引和 end 索引上的值也会被包含在命令返回的内容当中。

    举个例子, 以下代码展示了如何使用 GETRANGE 命令去获取 message 键的值的不同部分:

    redis> GETRANGE message 0 4     -- 获取字符串值索引 0 至索引 4 上的内容
    "hello"
    
    redis> GETRANGE message 6 10    -- 获取字符串值索引 6 至索引 10 上的内容
    "world"
    
    redis> GETRANGE message 3 7     -- 获取字符串值的中间部分
    "lo wo"
    
    redis> GETRANGE message -11 -7  -- 使用负数索引获取指定内容
    "hello"
    

    下图展示了上面的这四个命令是如何根据索引去获取值的内容的:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UsjZ4bAB-1623837117777)(http://redisguide.com/_images/IMAGE_GETRANGE_1.png)] _images/IMAGE_GETRANGE_2.png [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1yq5nYH8-1623837117786)(http://redisguide.com/_images/IMAGE_GETRANGE_3.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1xjrqMQ5-1623837117793)(http://redisguide.com/_images/IMAGE_GETRANGE_4.png)]


    其他信息

    属性
    复杂度O(N),其中 N 为被返回内容的长度。
    版本要求GETRANGE 命令从 Redis 2.4.0 开始可用。
  • 指定索引范围内的内容进行修改

    通过使用 SETRANGE 命令, 用户可以将字符串键的值从索引 index 开始的部分替换为指定的新内容, 被替换内容的长度取决于新内容的长度:

    SETRANGE key index substitute
    

    SETRANGE 命令在执行完设置操作之后, 会返回字符串值当前的长度作为结果。

    比如说, 我们可以通过执行以下命令, 将 message 键的值从原来的 "hello world" 修改为 "hello Redis"

    redis> GET message
    "hello world"
    
    redis> SETRANGE message 6 "Redis"
    (integer) 11    -- 字符串值当前的长度为 11 字节
    
    redis> GET message
    "hello Redis"
    

    这个例子中的 SETRANGE 命令会将 message 键的值从索引 6 开始的内容替换为 "Redis" , 图 2-7 展示了这个命令的执行过程。


    图 2-7 SETRANGE 命令修改 message 键的过程

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qYFgEzoY-1623837117796)(http://redisguide.com/_images/IMAGE_SETRANGE_MESSAGE_1.png)] _images/IMAGE_SETRANGE_MESSAGE_2.png [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sCTqBjvH-1623837117799)(http://redisguide.com/_images/IMAGE_SETRANGE_MESSAGE_3.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IEJ1Be0t-1623837117800)(http://redisguide.com/_images/IMAGE_SETRANGE_MESSAGE_4.png)] _images/IMAGE_SETRANGE_MESSAGE_5.png _images/IMAGE_SETRANGE_MESSAGE_6.png

    自动扩展被修改的字符串

    当用户给定的新内容比被替换的内容更长时, SETRANGE 命令就会自动扩展被修改的字符串值, 从而确保新内容可以顺利写入。

    比如说, 以下代码就展示了如何通过 SETRANGE 命令, 将 message 键的值从原来的 11 字节长修改为 41 字节长:

    redis> GET message
    "hello Redis"
    
    redis> SETRANGE message 5 ", this is a message send from peter."
    (integer) 41
    
    redis> GET message
    "hello, this is a message send from peter."
    

    图 2-8 展示了这个 SETRANGE 命令扩展字符串并进行写入的过程。


    图 2-8 SETRANGE 命令的执行过程示例

    SETRANGE 命令执行之前的字符串值

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qWMwPujP-1623837117804)(http://redisguide.com/_images/IMAGE_EXPAND_SETRANGE_1.png)]

    将字符串值扩展至 41 字节长

    _images/IMAGE_EXPAND_SETRANGE_2.png

    对字符串值进行设置

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VWmKZujX-1623837117807)(http://redisguide.com/_images/IMAGE_EXPAND_SETRANGE_3.png)]

    在值里面填充空字节

    SETRANGE 命令除了会根据用户给定的新内容自动扩展字符串值之外, 还会根据用户给定的 index 索引扩展字符串: 当用户给定的 index 索引超出字符串值的长度时, 字符串值末尾直到索引 index-1 之间的部分将使用空字节进行填充, 换句话说, 这些字节的所有二进制位都会被设置为 0

    举个例子, 对于字符串键 greeting 来说:

    redis> GET greeting
    "hello"
    

    当我们执行以下命令时:

    redis> SETRANGE greeting 10 "world"
    (integer) 15
    

    SETRANGE 命令会先将字符串值扩展为 15 个字节长, 然后将 "hello" 末尾直到索引 9 之间的所有字节都填充为空字节, 最后再将索引 10 到索引 14 的内容设置为 "world" 。 图 2-9 展示了这个扩展、填充、最后设置的过程。


    图 2-9 SETRANGE greeting 10 "world" 的执行过程

    执行 SETRANGE 之前的字符串值

    _images/IMAGE_FILLED_SETRANGE_1.png

    将字符串值从 5 个字节扩展至 15 个字节

    _images/IMAGE_FILLED_SETRANGE_2.png

    使用空字节填充索引 5 至索引 9

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-webTvgeB-1623837117810)(http://redisguide.com/_images/IMAGE_FILLED_SETRANGE_3.png)]

    将索引 10 至索引 14 的内容设置为 “world”

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oFz1dggg-1623837117811)(http://redisguide.com/_images/IMAGE_FILLED_SETRANGE_4.png)]


    通过执行 GET 命令, 我们可以取得 greeting 键在执行 SETRANGE 命令之后的值:

    redis> GET greeting
    "hello\x00\x00\x00\x00\x00world"
    

    可以看到, greeting 键的值现在包含了多个 \x00 符号, 而每个 \x00 符号就代表一个空字节。

    其他信息
    属性
    复杂度O(N),其中 N 为被修改内容的长度。
    版本要求SETRANGE 命令从 Redis 2.2.0 开始可用。
  • 将一些内容尾加到指定字符串键的值后

    通过调用 APPEND 命令, 用户可以将给定的内容追加到字符串键已有值的末尾:

    APPEND key suffix
    

    APPEND 命令在执行追加操作之后, 会返回字符串值当前的长度作为返回值。

    示例:

    127.0.0.1:6379> GET number
    "10086"
    127.0.0.1:6379> APPEND number " shi yi dong ke fu dian hua"
    (integer) 32
    127.0.0.1:6379> GET number
    "10086 shi yi dong ke fu dian hua"
    

    假如该键不存在,会先将该键设置为空再尾加

    127.0.0.1:6379> GET number1004
    (nil)
    127.0.0.1:6379> APPEND number1004 "1004"
    (integer) 4
    127.0.0.1:6379> GET number 1004
    (error) ERR wrong number of arguments for 'get' command
    127.0.0.1:6379> GET number1004
    "1004"
    
    属性
    复杂度O(N),其中 N 为新追加内容的长度。
    版本要求APPEND 命令从 Redis 2.0.0 开始可用。
  • 对字符串存储的整数或浮点数执行加法或减法操作

    如果值能被解释为以下两种类型就能被解析为数字:

    • 一种是能够使用 C 语言的 long long int 类型储存的整数, 在大多数系统中, 这种类型储存的都是 64 位长度的有符号整数, 取值范围介于 -92233720368547758089223372036854775807 之间;

    • 第二种是能够使用 C 语言的 long double 类型储存的浮点数, 在大多数系统中, 这种类型储存的都是 128 位长度的有符号浮点数, 取值范围介于 3.36210314311209350626e-49321.18973149535723176502e+4932L 之间。

    对整数进行加减法:

    加法:

    INCRBY key value
    

    加法加一:

    INCR key
    

    减法:

    xxxxxxxxxx x DECRBY key value  	
    

    减法减一:

    x DECR key	
    

    示例:

    127.0.0.1:6379> GET number
    "10010"
    -- 加法
    127.0.0.1:6379> INCRBY number 1000
    (integer) 11010
    127.0.0.1:6379> GET number
    "11010"
    -- 减法
    127.0.0.1:6379> DECRBY number 1000
    (integer) 10010
    127.0.0.1:6379> GET number
    "10010"
    -- 加一
    127.0.0.1:6379> INCR number
    (integer) 10011
    -- 减一
    127.0.0.1:6379> DECR number
    (integer) 10010
    

    注意:
    当键在数据库中并不存在时,会将该键默认为0再执行整数的加减法

    浮点数加减法:
    INCRBYFLOAT key increment
    

    浮点加:

    redis> SET decimal 3.14    -- 一个储存着浮点数值的键
    OK
    
    redis> GET decimal
    "3.14"
    
    redis> INCRBYFLOAT decimal 2.55    -- 将键 decimal 的值加上 2.55
    "5.69"
    
    redis> GET decimal
    "5.69"
    

    浮点减:

    redis> SET decimal 3.14    -- 一个储存着浮点数值的键
    OK
    redis> GET decimal
    "3.14"
    
    redis> INCRBYFLOAT decimal -1.00    -- 将键 decimal 的值加上 2.55
    "2.14"
    
    redis> GET decimal
    "2.14"
    

    注意:当键不存在时:默认为0再加减

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值