首页 > 编程知识 正文

redis有序set原理,redis的使用场景

时间:2023-05-05 20:03:12 阅读:173816 作者:4982

Redis有五种常见的数据结构:字符串(list )、散列(hash )、哈希表或哈希表(set )和zset。 五种数据结构是作为键值对的值存在于Redis库中的一种形式。顾名思义,字符串中的value值以字符串结构存在,哈希表中的value是哈希表。

散列表简单地说明了Redis的散列表在数据库中将密钥与散列表相关联,用户可以为散列表中的任意数量的单词设置值。 与字符串键值对一样,散列表中的字段和值可以是文本数据或二进制数据。

散列表允许用户将多个相关的数据存储在同一个散列中,并对这些数据进行管理和批量操作。

由上图可知,字符串键值对的值是单一字符串形态的存在; 散列表中的value值是散列表或哈希表,散列表中字段和值的匹配关系类似于字符串中的键值对。

Redis为散列舰提供了一组操作命令,通过这些命令用户可以:

为散列的字段设置值,或者为他设置值,以便仅当字段不存在时才从散列表中检索特定字段的值。 对包含数值的字段执行加法或减法操作。 检查指定的字段是否存在于散列表中。 从散列表中删除指定的字段。 显示散列表中包含的字段的数量。 一次设置哈希表中多个字段的值,或一次从哈希表中获取多个字段的值。 获取散列表中包含的所有字段、所有值或所有字段和值。 散列表命令说明hset :设置字段值的用户可以通过执行hset命令设置散列表中指定字段的值。

hset key field value

根据指定的字段是否已经存在于散列中,命令的执行也不同。

如果散列中不存在特定字段,则此设置会创建操作命令,并将散列中的特定字段和值相关联并返回1。 如果指定的字段已经存在于散列中,则此设置为“更新操作”命令,它将使用用户指定的新值复盖字段的原始地址并返回0。

在上面的示例中,当student_zhangsan第一次将age字段设置为14时,会首先创建字段age,并在命令执行完成后返回1,因为散列表中没有age字段。 第二次将值16重新设定为age时,因为age已经存在于散列表中,所以执行命令时,新字段值16改写旧的字段值14,返回0。

hsetnx :仅在字段不存在时设置值的hsetnx命令的作用类似于为哈希表中的字段设置值的hset命令的作用。 不同之处在于,hsetnx命令仅在指定字段不存在时执行配置操作。

hsetnx key field value

如果字段不存在且设置成功,hsetnx命令将返回值1。 如果存在字段,并且设置失败,则返回值0。

hget :获取字段值的hget命令可以根据用户指定的字段从哈希表中获取字段值。

3358 www.Sina.com/http://www.Sina.com/http://www.Sina.com /

如果散列表中不存在指定的字段,hget命令将返回空值

可以使用hkeys命令获取散列表中的所有字段名称,并使用hget获取不存在的字段birthday的值。 由于散列表中没有字段,因此将返回nil。

如果散列表本身不存在,则尝试获取字段值。 会发生什么

从上面的例子可以看出,如果hget的检索结果是nil,有以下两种情况。

散列表中没有这个字段。散列表本身没有hincrby。 对字段中存储的整数值进行加减运算的操作与字符串的incrby命令类似。 如果散列表中的字段包含可由Redis解释为整数的数字,则用户可以使用hincrby命令将指定的增量与字段值相加。

hget

如果hincrby命令操作成功,则结果会返回字段的当前值。

与decrby命令用于字符串的数值加法不同,散列表中没有用于减去相应字段的命令。 也就是说,要减去散列表中的数值,请使用hincrby命令将增量increment值设置为负值。

另外,字符串中存在增量1的默认命令incr,散列表中没有,对于散列表的增减值都使用hincrby命令,根据需要只能设定适当的增量值increment。

如果在散列表的非整数字段中使用hincrby或增量increment非整数,会发生什么情况

例子如下。

hincrby student_z

hangsan age 1.2 对age字段增加1.2的时候,因1.2非整数值,报错(error) ERR value is not an integer or out of rangehincrby student_zhangsan addr 1 对zddr字段加1的时候,因addr字段值为字符串"beijing",无法解析为数字,报错(error) ERR hash value is not an integerhincrbyfloat:对字段存储的数字值执行浮点加减法操作

hincrbyfloat命令作用与hincrby命令作用类似,hincrby是对字段值为整数的字段进行整数增量值的操作,hincrbyfloat命令可以对整数和浮点数的字段值进行操作,且增量值可以是整数可以是浮点数。与hincrby命令类似,hincrbyfloat命令没有对应的减法命令,如果要操作减法,即要对增量值做负数处理。

hincrbyfloat key field increment

hincrbyfloat命令在执行成功后,将返回给定字段值当前值作为结果

上面示例,展示了hincrbyfloat命令给浮点数增加浮点数值,给整数增加浮点数值。

上面示例,展示hincrbyfloat命令的减法操作,给增量increment字段赋负值。

示例中,前面的score均为浮点数,都是在用hincrbyfloat命令做操作,在执行hincrbyfloat student_zhangsan score -0.5后,score值变为了87,后面使用hincrby命令对score字段值操作成功。说明,散列表操作中,字段值若从浮点数变化为整数的时候,系统中默认按照整数存储。

hstrlen:获取字段值的字节长度

用户可以使用hstrlen命令获取给定字段值的字节长度

hstrlen key field

示例的时候尴尬了,提示hstrlen命令不存在,翻阅了资料发现,hstrlen命令是Redis在3.2.0版本加进来的

而目前使用的Windows版的Redis是3.0.503版本的。

hstrlen命令的用法与字符串对应的strlen类似,可以参考前一篇博文Redis字符串键值对使用中关于strlen命令部分。

hstrlen命令在对于散列表中不存在的字段操作时候,返回0;hstrlen对不存在的散列表操作时候,返回0。

hexists:检查字段是否存在

hexists命令用于检查用户给定的字段是否存在于散列表中

hexists key field

如果散列表中包含了给定的字段filed,则命令返回1,否则命令返回0。

上面示例,可以看到name是student_zhangsan中存在的字段,使用hexists命令操作返回1;对于不存在的字段youreyes命令操作时候返回0;对于不存在的散列表not-exists-hash操作返回0。

同样说明,如果hexists命令结果为0,可能有两种情况:

散列表中字段不存在散列表不存在hdel:删除字段

hdel命令用于删除散列表中指定字段极其对应的关联值

hdel key field

当给定的字段存在于散列表中并且被成功删除的时候,命令返回1;如果给定的字段不存在散列表中,或者给定的散列表不存在的时候,命令返回0。

上面示例,name字段存在于student_zhangsan中,执行hdel命令后,命令返回1,再通过hget获取name字段,返回空值nil

上面示例,展示hdel删除散列表中不存在的字段,和hdel操作不存在的散列表情况,结果都是删除失败,返回0。

上面说的是hdel命令删除散列表中三个字段值的情况,hdel命令可以删除多个字段值

hdel key field1 field2 ... fieldn

hdel命令删除多个字段值的时候,命令结果返回删除成功的字段的个数。若字段都不存在或散列表不存在,则返回0。

上图示例,散列表student_zhangsan中包含addr、score、id、name和age五个字段,使用hdel student_zhangsan name age youreyes 来删除字段name age youreyes,其中name和age是散列表student_zhangsan中存在的字段,youreyes是散列表中不存在的字段。执行hdel命令后,成功删除name和age两个字段和其对应的值,命令返回删除成功的字段的个数2。

上图示例,展示操作完全不存在的字段和操作不存在的散列表的情况,结果都是0。

hlen:获取散列表包含的字段数量

hlen命令获取给定的散列表的字段数量,命令返回结果为散列表中包含的字段数量

hlen key field

如果对不存在的散列表执行hlen命令,结果为0。

hmset:一次为多个字段设置值

hset命令一次只可以为一个字段设置值,hmset命令一次为散列表的多个字段设置值,hset命令在设置成功时返回OK。

hmset key field value [field value ...]

上面示例,展示了hmset的用法,且与hset做了个简单比对。假如我们要给散列表中设置4个字段值进去,使用hset命令须要操作4次,即客户端与Redis服务器有4次通信交互;使用hmset只须要一次即可完成,这里节省了3次通信交互的消耗。所以,在给散列表设置多个字段值的时候,使用hmset是比较高效的。

上面命令中,我们的字段值都是单字符串,如果是句子或字符串中有空格呢,试试

上面示例,第一次使用hmset设置hmset db_book3 book1 redis is book1,这里的原意是字段book1的值为redis is book1,设置成功。再通过hmset 设置 hmset db_book3 book1 redis is book1,多设置一个book2字段进去,设置成功。通过hlen命令查看字段数量时候,发现数量是3。通过hgetall命令获取所有字段和值,得到三个字段和对应值。

这里的问题,由于value值没有加双引号“" "”,系统默认按照空格把每一个词按照字段-值-字段-值的方式处理了,如果value中间有空格时候,value值一定要用双引号引起来。

hmget:一次获取多个字段的值

通过hmget命令,用户可以一次从散列表中获取多个字段的值

hmget key field [field ...]

执行hmget命令后,结果字段顺序,依次返回字段对应的值,对于不存在的字段,返回空值nil。

hkeys、hvals、hgetall:获取所有字段、所有值、所有字段和值

hkeys命令,返回散列表中所有的字段名称

hkeys key

hvals命令,返回散列表中所有的字段对应的值

hvals key

hgetall结合hkeys和hvalues两个命令的作用,返回散列表中所有的字段名称和对应的值

hgetall key

hgetall命令返回结果列表中,每两个连续的元素代表了散列表中的一对字段和值,其中奇数位置上的元素为字段,偶数位置上的元素为字段的值。


散列表使用总结

1、散列键会将一个键和一个散列在数据库中关联起来,用户可以在散列中为任意多个字段设置值与字符串键一样散列的字段和值,既可以是文本数据也可以是二进制数据。

2、用户可以通过散列键,把相关联的多项数据存储到同一散列中,以便对其进行管理,或者针对他们执行批量操作。

3、因为Redis并没有为散列提供相应的减法操作命令,所以如果用户想要对字段存储的数字值进行减法操作,需要将负数增长量传递给命令。

4、Redis散列包含的字段在底层是以无序方式存储的,根据字段插入的顺序不同,包含相同字段的散列在执行等命令时可能会得到不同的结果,因此用户在使用这三个命令时,不应该对命令返回元素的排列顺序,做任何假设。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。