首页 > 数据库 >五、redis之hash

五、redis之hash

时间:2024-10-02 15:22:59浏览次数:8  
标签:... hash 过期 redis value field key

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.

标签:...,hash,过期,redis,value,field,key
From: https://www.cnblogs.com/shigongp/p/18444466

相关文章

  • 高级java每日一道面试题-2024年9月30日-服务器篇[Redis篇]-Redis持久化有几种方式?
    如果有遗漏,评论区告诉我进行补充面试官:Redis持久化有几种方式?我回答:Redis是一个高性能的键值存储系统,常用于缓存、消息队列和实时数据分析等场景。为了保证数据的持久性,Redis提供了两种主要的持久化方式:RDB(RedisDatabaseBackup)和AOF(AppendOnlyFile)。这两种方......
  • redis的数据结构,内存处理,缓存问题
    redisObjectredis任意数据的key和value都会被封装为一个RedisObject,也叫redis对象:这就redis的头信息,占有16个字节redis中有两个热门数据结构1.SkipList,跳表,首先是链表,和普通链表有以下差异:元素按照升序排列存储节点可能包含多个指针,指针跨度不同那么跳表的特点有以下:......
  • 用C/C++构建自己的Redis——第五章、Redis中的AVL树实现
    用C/C++构建自己的Redis——第五章、Redis中的AVL树实现文章目录用C/C++构建自己的Redis——第五章、Redis中的AVL树实现前言一、键值对集查询概念1.1键值对集合查询1.2数据结构排序的复习排序数组(SortedArrays)树形数据结构(TreeDataStructures)通过随机性平衡(Balan......
  • redis: 开启io多线程
    一,配置redis.conf[root@webconf]#viredis.conf修改两个参数#Soforinstanceifyouhaveafourcoresboxes,trytouse2or3I/O#threads,ifyouhavea8cores,trytouse6threads.Inorderto#enableI/Othreadsusethefollowingconfigurationdire......
  • Spring boot中使用实现Redis Lua计数器
    Springboot中使用实现RedisLua计数器在SpringBoot中使用RedisLua脚本实现计数器,可以通过以下步骤来完成。这个示例将展示如何使用Lua脚本在Redis中安全地增加计数器的值。步骤1:添加依赖首先,确保你的pom.xml文件中包含了SpringDataRedis和Lettuce的依赖:<dependency>......
  • Redis 中Lua脚本的使用
    Redis中Lua脚本的使用Redis支持使用Lua脚本来执行原子操作,以下是一个简单的RedisLua脚本示例以及如何在Redis中使用它。示例:计数器这个脚本会增加一个指定键的计数器,并返回新的计数值。--increase_counter.lualocalkey=KEYS[1]--第一个参数是键localincrem......
  • 代码随想录算法训练营第六天|理解hash表
    WhatisHashTable?引用自文章链接:https://programmercarl.com/哈希表理论基础.html#哈希表哈希表是根据关键码的值而直接进行访问的数据结构。直白来讲其实数组就是一张哈希表,哈希表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素。哈希函数通过hashCode把......
  • Redis缓存穿透解决方案之一:布隆过滤器与计数型布隆过滤器概述以及两者在Spring中的使
    布隆过滤器(BloomFilter)和计数型布隆过滤器(CountingBloomFilter)都是高效的概率性数据结构,用于判断某个元素是否在集合中。它们的设计目标是降低内存开销,通过多个哈希函数与位数组的组合,实现快速查询,但允许一定的误判率。文章目录1.布隆过滤器(BloomFilter)1.1原理1.2......
  • HashMap原理
    HashMap原理在很多地方都会利用到hash表来提高查找效率。在Java的Object类中有一个方法:publicnativeinthashCode();```根据这个方法的声明可知,该方法返回一个int类型的数值,并且是本地方法,因此在Object类中并没有给出具体的实现。为何Object类需要这样一个方法?它......
  • Redis
    目录集群哨兵模式工作原理:三大常见问题缓存穿透解决方案:缓存击穿解决方案:缓存雪崩解决方案:集群由多个Redis节点组成,提供更高的性能、可用性和可扩展性。采用hash槽分片的方式,将数据分布到不同的节点上,每个节点负责存储一部分数据,并通过集群中的元数据来管理这......