当前位置: 首页 > 科技观察

Redis哈希类型使用命令_0

时间:2023-03-21 19:29:35 科技观察

我们知道Redis中有5种数据类型。我们在上一篇文章中介绍过String类型,也就是字符串类型。今天我们来学习第二种数据类型,哈希类型。大多数语言基本都提供了哈希类型,比如Java语言中的Map类型,Python语言中的字典类型。虽然语言不同,但是它们的基本用法是一样的。也就是说,它们都是键值对。例如:value={{field1,value1}让我们通过下图直观感受一下string类型和hash类型的区别。Redis中的hash类型是键值对结构,所以要特别注意,这里的value不是指Redis中key的值,而是指Redis中hash类型中字段对应的value。接下来,我们还是和介绍字符串类型一样。首先我们来了解一下Redis中hash类型的相关命令。命令1.设置值hsetkeyfieldvalue我们从上图中执行的命令得知,hset命令也是有返回值的。如果hset命令设置成功则返回1,否则返回0。另外Redis还提供了hash类型的hsetnx命令。在strings一文中,我们知道nx命令是指key不存在时才能设置成功,而Redis中的hsetnx命令是指field不存在时才能设置成功。2、获取hgetkeyfield的值我们看到hget命令和get有很大的不同。get命令获取时只需要一个名字,而hget命令需要写两个名字。第一个名字是键,第二个名字是字段。另外,当然,当key或field不存在时,返回结果为nil。3、删除fieldhdelkeyfield[field...]hdel命令在删除的时候也会返回一个值,这个返回就是删除成功的字段个数。当字段不存在时,不会报错,直接返回0。4.计算字段数hlenkeyhlen命令返回当前key中的字段数,如果key不存在则返回0。5.批量设置或获取field-valuehmgetkeyfield[field...]hmsetkeyfieldvalue[fieldvalue...]hmset命令和hmget命令分别是批量设置和获取值,hmset命令没什么需要注意的,hmgetcommand要特别注意,当我们获取到一个不存在的key或者field时,Redis不会报错,而是返回nil。而如果有几个字段不存在,Redis返回几个nil,当整个key不存在时,返回所有nil(几个字段返回几个nil)。6.判断字段是否存在hexistskeyfield执行hexists命令时,如果当前key包含该字段,则返回1,否则返回0。7.获取所有fieldhkeyskey8.获取所有valuehvalskey9.获取所有field-valuehvalskeyhgetallcommand会返回当前key中的所有field-values,并按顺序返回,即field-valuefield-value等。10、hincrbyhincrbyfloathincrbykeyfieldincrementhincrbyfloatkeyfieldincrementhincrby命令和incrby命令功能基本相同,都是对值进行增量运算。唯一的区别是incrby命令的范围键,而hincrby命令的范围是字段。11、计算valuehstrlenkeyfield的字符串长度hstrlen命令返回当前key中字段中的字符串长度,如果当前key中没有字段则返回0。哈希类型命令的时间复杂度只有两个内码。Redis哈希类型只有两种内部代码。它们是:ziplist(压缩列表):当hash类型的元素个数小于hash-max-ziplist-entries配置(默认512)且所有值都小于hash-max-ziplist-value配置(默认64字节),Redis会使用ziplist作为hash的内部实现。hashtable(哈希表):当不满足上述条件时,Redis会使用hashtable作为hash的内部实现。下面我们使用如下命令来演示ziplist和hashtable的两种内部编码。当字段数量比较少,值不是很大的时候,Redishash类型的内部编码是ziplist。当value中的字节数大于64字节时(可以通过hash-max-ziplist-value设置),内部编码将从ziplist变为hashtable。由于Redis中中文的字节数比英文的多,一般一个中文占3个字节。当字段数超过512时(可以通过hash-max-ziplist-entries参数设置),内部编码也会从ziplist变为hashtable。由于直接创建512字段不方便,为了更好的验证这个功能,我会用一个程序动态创建512字段来验证这个功能。具体代码如下。以上是Redis中hash类型的相关命令和内部编码。本文如有不准确之处,敬请指出。