五、redis之hash

redis的hash类型就是平时说的hash表,字典。类似于Java中的HashMap。可以用来存储对象等结构。现在看下操纵hash类型的命令。

HGET

HGET key field

hget获取hash中的field字段的值。

HSET

HSET key field value [field value ...]

hset命令将多个 field value键值对设置到key中。

获取name的值,但是显示的是乱码,这与控制台的编码有关。

HSETNX

HSETNX key field value

hsetnx命令与hset命令类似,区别是当field的值不存在时才会执行。

以上的三个命令都是设置单个key-value,如果有多个key-value就需要执行多次,比较麻烦。如果能执行一次将多个key-value执行成功就好了。现在看下:

HMGET

HMGET key field [field ...]

获取多个field的值。

HMSET

HMSET key field value [field value ...]

HMSET设置多个key-value的值。

在开发中会经常遍历hash,redis也提供了相应的命令。

HGETALL

HGETALL key

hgetall命令返回所有的key-value对。

可以看到返回了hash2中所有的key-value值对。在开发测试中可以使用,但是在生产环境中慎用。redis在生产环境中的数据量通常都很大。执行后返回的数据量也很大,占很大的网络带宽。会长时间阻塞redis服务器。如果要遍历hash,推荐使用HSCAN

HSCAN

HSCAN key cursor [MATCH pattern] [COUNT count] [NOVALUES]

第一次调用时cursor为0,返回值中第一个参数为下一次迭代的cursor,下一次调用时传入此参数为cursor。如果返回的cursor为0,表示已迭代完成。

从结果中看到count 1怎么全部返回了。看下redis文档怎么说:

SCAN family functions do not guarantee that the number of elements returned per call are in a given range. The commands are also allowed to return zero elements, and the client should not consider the iteration complete as long as the returned cursor is not zero.

However the number of returned elements is reasonable, that is, in practical terms SCAN may return a maximum number of elements in the order of a few tens of elements when iterating a large collection, or may return all the elements of the collection in a single call when the iterated collection is small enough to be internally represented as an encoded data structure (this happens for small Sets, Hashes and Sorted Sets).

大致意思是,count参数不是精准的,只是控制返回数量的数量级。看下redis官网怎么描述count参数:

1、count默认值是10
2、CAN不能保证每次迭代返回的元素数量,可以使用COUNT选项根据经验调整SCAN的行为。仅仅是实现上的提示
3、当迭代编码为intset(仅由整数组成的小集合)的Set,或编码为ziplist(由小单个值组成的小哈希和集合)的Hashes和Sorted Set时,通常所有元素都会在第一次SCAN调用中返回,而不管COUNT值如何。

match参数匹配对应的数据。是在redis服务查询数据后返回给客户端之前。可以和Redis Cluster的tag结合使用。

使用HSCAN时,可以使用NOVALUES选项使Redis仅返回哈希表中的键,而不返回其相应的值。

综上所述,hsacn适合用来遍历hash,而不是分页查询hash

HKEYS

HKEYS key

hkeys获取hash中所有的key。

HVALS

HVALS key

hvals返回hash中所有的value。

HDEL

 HDEL key field [field ...]

hdel删除hash中给定的field。

HEXISTS

HEXISTS key field

hexists判断hash中field是否存在。

HLEN

HLEN key

hlen返回hash中key的数量。

HSTRLEN

HSTRLEN key field

htrlen返回hash中field对应的value的字节长度。

可以看出hash1中name的长度为6,因为一个汉字占了3个字节。

HRANDFIELD

HRANDFIELD key [count [WITHVALUES]]

返回hash中count个随机字段,WITHVALUES选项同时返回对应的value。

HINCRBY , HINCRBYFLOAT

接下来,看下hash对数值的操作

HINCRBY key field increment
HINCRBYFLOAT key field increment

HINCRBY对hash中field对应的value加上increment并设置到value中。HINCRBYFLOAT是加个小数。

过期时间

最后看下时间。

先说下每个选项的含义:

NX--对于每个指定的字段,仅当字段没有过期时才设置过期。
XX——对于每个指定的字段,仅当该字段已有过期时间时,才设置过期时间
GT--对于每个指定字段,仅当新过期时间大于当前过期时间时才设置过期时间。
LT--对于每个指定字段,仅当新过期时间小于当前过期时间时才设置过期时间。

NX、XX、GT和LT选项是互斥的。

HEXPIRE key seconds [NX|XX|GT|LT] FIELDS numfields field [field ...]
HPEXPIRE key milliseconds [NX|XX|GT|LT] FIELDS numfields field [field ...]

numfields是后面field的数量。HEXPIRE以秒为单位设置相对于现在的过期时间。HPEXPIRE以毫秒为单位设置相对于现在的过期时间。

HEXPIREAT key unix-time-seconds [NX|XX|GT|LT] FIELDS numfields field [field ...]
HPEXPIREAT key unix-time-milliseconds [NX|XX|GT|LT] FIELDS numfields field [field ...]

HEXPIREAT以秒为单位设置unix时间戳绝对时间。HPEXPIREAT以毫秒为单位设置unix时间戳绝对时间。

HEXPIRETIME key FIELDS numfields field [field ...]
HPEXPIRETIME key FIELDS numfields field [field ...]

HEXPIRETIME返回给定键的字段将过期的Unix纪元以来的绝对Unix时间戳(秒)。HPEXPIRETIME与HEXPIRETIME具有相同的语义,但返回自Unix纪元以来的绝对Unix到期时间戳(毫秒),而不是秒。

HPERSIST key FIELDS numfields field [field ...]

HPERSIST删除哈希键字段上的现有过期时间,将字段从volatile(设置了过期时间的字段)转换为persistent(由于没有关联TTL(生存时间),因此永远不会过期的字段)。

PTTL key FIELDS numfields field [field ...]
HTTL key FIELDS numfields field [field ...]

HTTL命令返回已设置过期的密钥的剩余生存时间(单位:秒),而PTTL以毫秒为单位返回。如果key没有设置过期时间则返回-1,如果key不存在返回-2.

posted @ 2024-10-02 15:20  shigp1  阅读(26)  评论(0编辑  收藏  举报