Redis字符串(string)使用

Redis有5种基础的数据结构,分别为:string(字符串),list(列表),hash(哈希表),set(集合)和zset(有序集合)。string数据结构是最常用的数据结构之一,string字符串既可以做Redis的数据键,也可以做键对应的值。

string字符串简单说明

字符串string是Redis最简单的数据结构,它的内部表示就是一个字符数组。Redis所有的数据结构都是以唯一的key字符串欧威名称,然后通过这个唯一的key值来获取相应的value数据。不同类型的数据结构的差异就在于value的结构不一样。

字符串结构使用相当广泛,一个常见的用途就是缓存用户信息。我们将用户信息结构体使用json序列化成字符串,然后将序列化后的字符串塞进Redis来缓存。同样,取用户信息会经过一次反序列化的过程。

Redis的字符串是动态字符串,是可以修改的字符串,内部结构的实现类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。

如图,绿色背景为字符串实际长度len,绿色背景和白色框一起为Redis为当前字符串分配的实际空间capacity,一般来讲分配空间capacity要高于实际字符串长度len。当字符串长度小于1MB的时候,扩容都是加倍现有的空间。如果字符串长度超过1MB,扩容时一次只会多扩1MB的空间,避免空间的浪费。Redis中字符串最大长度为512MB。

字符串键值对示例

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

  • 为字符串设置值
  • 获取字符串键对应的值
  • 在获取旧址的同时为字符串键设置新值
  • 同时为多个字符串键设置值,或同时获取多个字符串键的值
  • 获取字符串的长度
  • 获取字符串值指定索引范围内的内容,或者对字符串值指定索引范围内的内容进行修改
  • 将一些内容追加到字符串值的末尾
  • 对字符串键存储的整数值或者浮点数据执行加减法操作

string键值对命令说明

set:为字符串键设置值

创建字符串最常见的方法是使用set命令,这个命令可以为一个字符串键值设置相应的值。在最基本的情况下,用户只需要向set命令提供一个键和一个值就可以了

set key value

与之前提到的一样,这里的键和值既可以是文字,可以是二进制数据。

set 命令在成功创建字符串键值之后将返回OK作为结果。

如上图,创建一个键为telnumber值为13012341234的键值对到Redis数据库中,创建成功,会提示OK

上图,创建一个键为sentence,值为“you see see you, one day day de”的键值对。

默认情况下,对一个已经设置了值的字符串键执行set命令将导致键的旧值被新值覆盖。例如,我们继续对上面的telnumber键set新的值

之前的telnumber值为13012341234,使用set telnumber 13012345678后,telnumber的值变为了13012345678,之前的旧值13012341234被直接覆盖掉了。

如果我们在set值的时候,只在键不存在的情况下才设置值,Redis提供了参数nx 和 xx 参数项:

  • set key value nx 只在键不存在的情况下设置值,如果键已经存在,则放弃设置值,返回空值nil表示设置失败
  • set key value xx 只在键已经存在的情况下设置值,如果键不存在,则放弃设置值,返回空值nil表示

如何查看键对应的值是多少,使用get命令,get命令如何使用,继续向下看。


get:获取字符串键的值

set是向数据库中设置键值对,而get则是从数据库中获取指定字符串键对应的值:

get key

get命令接受一个字符串键作为参数,然后返回与该键相关联的值。另外,如果用户给字符串键在数据库中并没有与之相关联的值,那么get命令将返回一个空值:

getset:获取旧值并设置新值

getset命令就像get命令和set命令的组合版本,getset首先获取字符串键目前已有的值,接着为键设置新值,最后把之前获取到的旧值返回给用户:

getset key new_value

以下代码展示了如何使用getset命令去获取键的旧值并为它设置新值

如果被设置的键并不存在于数据库,那么getset命令将返回空值作为键的旧值,此时的getset命令效果与set命令效果类似。


mset:一次为多个字符串键设置值

set和getset都是只设置一个键值对到数据库中,Redis提供了mset命令用于对多个字符串键值对进行设置。

mset key value [key value ...]

以下示例是一个mset 命令的使用

与set命令一样,mset命令会在执行设置操作之后返回OK表示设置成功。此外,如果给定的字符串键已经有相关联的值,那么mset命令也会直接使用新值去覆盖已有的旧值。

mset命令除了可以让用户更为方便的执行多个设置操作之外,还可以提高程序的效率:执行多条set命令须要客户端和服务器之间进行多次网络通信,并因此消耗大量的时间;使用一条mset命令去替代多条set命令只须要一次网络通信,从而有效减少程序执行多个设置操作时的时间。


mget:一次获取多个字符串键的值

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

mget key [key ...]

mget命令返回一个列表作为结果,这个列表按照用户执行命令时候给定键的顺序排列各个键的值。

与get命令一样,mget命令在碰到不存在的键时也会返回空值

与mset命令类似,mget命令也可以将多个获取操作所须的网络通信次数从原来的N次降低至只须要一次,从而提升程序运行效率。


msetnx:只在键不存在的情况下,为多个字符串键设置值

msetnx命令与mset命令类似,都可以对多个字符串键值对进行设置

msetnx key value [key vlaue ...]

msetnx 与 mset的主要区别在于,msetnx只会在所有给定的键都不存在的情况下多键进行设置,而不会像mset那样直接覆盖键已有的值:如果所给的键中,有一个键已经有值了,那么msetnx命令会放弃对所有给定键的设置操作。msetnx命令在成功执行设置操作时返回1,在放弃执行设置操作时则返回0。

strlen:获取字符串值的字节长度

set类似命令在对键设置对应的value值,通过strlen命令,可以获取到字符串键对应的值的字节长度。

strlen key

以下示例,展示strlen获取不同字符串值的字节长度,对于不存在的键,strlen命令将返回0。

因为每个字符串都是由一系列连续的字节组成的,所以字符串中的每个字节实际上都拥有与之相对应的索引。Redis为字符串键提供了一系列索引操作命令,这些命令允许用户通过正数索引或者负数索引,对字符串值的某个字节或者某个部分进行处理,其中:

  • 字符串值的正数索引以0为开始,从字符串的开头向结尾不断递增
  • 字符串值的负数索引以-1位开始,从字符串的结尾向开头不断递减


getrange:获取字符串值指定索引范围上的内容

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

getrange key start end

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

举个例子,以下示例展示getrange命令获取value字符值的使用方式

上图设置message内容长度为11,则正向索引为0到10,负向索引为-11到-1。

通过正向和负向索引内的数值都可以获取到结果值,最后一个命令getrange message 6 14,当索引范围超出存在的索引值时,只取到存在的索引范围值对应内容,当取6到14索引范围的值时候,实际有效的只有6到10,获取到对应值world。


setrange:对字符串值的指定索引范围进行设置

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

setrange key index substitute

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

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


append:追加新内容到值的末尾

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

append key suffix

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

如果用户给定的键不存在,那么append命令会先将键的值初始化为空字符串" ",然后再执行追加操作,最终效果与使用set命令为键设置值类似。


incrby、decrby、incr、decr:对整数值执行加减法操作

每当用户将一个值存储到字符串键里面的时候,Redis会自动对这个值进行检测,如果这个值能够被解释为如下两种类型的其中一种,那么Redis就会把这个值当做数字来处理

  • 第一种类型是能够使用C语言的long int 类型存储的正数,在大多数系统中,这个类型存储的都是64位长度的有符号整数。
  • 第二种类型是C语言的long double型存储的浮点数,在大多数系统中,这种类型存储的都是128位长度的有符号浮点数。

当字符串键存储的值能够被Redis解释为整数时,用户可以使用incrby命令和decrby命令对被存储的整数值执行加法或减法操作。

incrby 命令用于为整数值加上指定的整数增量,并返回在执行加法操作之后的值

incrby key increment

decrby 命令用于为整数值减去指定的整数增量,并返回在执行减法操作之后的值,decrby用法和incrby用法类似。

decrby key decrement

下面示例,展示incrby 和 decrby命令的使用方式

当字符串键的值不能被Redis解释为整数时,对键执行incrby命令或decrby命令会返回错误。

incrby和decrby的增量和减量必须是能够被Redis解释为整数,否则执行incrby命令或decrby命令会返回错误

incr命令和decr命令的作用与incrby和decrby命令的作用类似,都是给指定键对应的值进行增减操作,不同的是,incrby 和 decrby命令后必须跟指定的增量或减量,而incr命令和decr命令的增减量都是1,且这个增减量不须要跟在命令后。

incr key

decr key

Redis除了可以对整数进行加减法操作外,也提供了对浮点数加减法操作的incrbyfloat命令

incrbyfloat key increment

incrbyfloat命令可以把一个浮点数增量加到字符串键存储的数字值上面,并返回键在执行加法操作之后的数字值作为命令的返回值。

与incrby有对应的减法操作命令decrby不同,对于浮点数加法命令incrbyfloat命令并没有对应的减法命令,如果须要对浮点数操作减操作,就传入负数的增量值。

incrbyfloat命令对于类型限制的要求比incrby和incr命令要宽松得多:

  • incrbyfloat命令既可用于浮点数值,也可以用于整数值
  • incrbyfloat命令的增量既可以是浮点数,也可以是整数
  • 当incrbyfloat命令的执行结果可以表示为整数时,命令的执行结果将以整数形式存储。

上面例子,当fv的值为3时候,系统默认按照整数保存了,此时,使用incr命令是可以成功给fv加一的。

string字符串键值对使用总结

1、Redis的字符串键可以把单独的一个键和单独的一个值在数据库中关联起来,并且这个键和值既可以存储文字数据,又可以存储二进制数据

2、set命令在默认情况下会直接覆盖字符串键已有的值,如果我们只想在键不存在的情况下为它设置值,可以使用带有nx选项的set命令;相反,如果我们只想在键已经存在的情况下为它设置值,那么可以使用带有xx选项的set命令

3、使用mset、msetnx以及mget命令可以有效地减少程序的网络通信次数,从而提升程序执行效率

4、字符串值的正数索引从0开始,从字符串开头向结尾不断递增;字符串值的负数索引以-1位开始,从字符串的结尾向开头不断递减

5、getrange key start end命令接受的是闭区索引范围,位于start索引和end索引位置的值也会包含在命令返回的内容当中

6、setrange命令在须要时会自动对字符串值进行扩展,并使用空字节填充新扩展空间中没有内容的部分

7、append命令在键不存在时执行设置操作,在键存在时执行追加操作

8、Redis会自动把long int 类型的整数一级能够表示未long double类型的浮点数当做数字来处理

猜你喜欢

转载自blog.csdn.net/magi1201/article/details/113608873