更新时间:2024-10-30 GMT+08:00

exHash命令列表

exHash是一种可为field设置过期时间和版本的Hash类型数据结构,提高了Hash数据结构的灵活性,简化了很多场景下的业务开发工作。

主要特征

  • field支持单独设置expire和version。
  • field支持高效灵活的主动、被动过期淘汰(expire)策略。
  • 语法和原生Redis Hash数据类型类似。

命令列表

表1 exHash命令介绍

命令

语法

说明

EXHSET

EXHSET key field value [EX time] [EXAT time] [PX time] [PXAT time] [NX | XX] [VER | ABS | GT version] [KEEPTTL]

向Key指定的exHash中插入一个field。如果exHash不存在则自动创建一个,如果field已经存在则覆盖其值。

EXHGET

EXHGET key field

获取key指定的exHash中一个field的值,如果exHash不存在或者field不存在,则返回nil。

EXHPTTL

EXHPTTL key field

查看key指定的exHash中一个field的剩余过期时间,结果精确到毫秒。

EXHTTL

EXHTTL key field

查看key指定的exHash中一个field的过期时间,结果精确到秒。

EXHVER

EXHVER key field

查看key指定的exHash中一个field的当前版本号。

EXHINCRBY

EXHINCRBY key field num [EX time] [EXAT time] [PX time] [PXAT time] [VER | ABS | GT version] [MIN minval] [MAX maxval] [KEEPTTL]

将key指定的exHash中一个field的value增加num,num为一个整数。如果exHash不存在则自动新创建一个,如果指定的field不存在,则在加之前插入该field并将其值设置为0。

说明:

为Key的field设置了超时时间后,再次执行该命令时如果没有设置超时时间,该field将被设置为永不过期。

EXHINCRBYFLOAT

EXHINCRBYFLOAT key field num [EX time] [EXAT time] [PX time] [PXAT time] [VER | ABS | GT version] [MIN minval] [MAX maxval] [KEEPTTL]

将key指定的exHash中一个field的value增加num,num为一个浮点数。如果exHash不存在则自动新创建一个,如果指定的field不存在,则在加之前插入该field并将其值设置为0。

说明:

为Key的field设置了超时时间后,再次执行该命令时如果没有设置超时时间,该field将被设置为永不过期。

EXHMGET

EXHMGET key field [field ...]

同时获取key指定的exHash多个field的值,如果exHash不存在或者field不存在,则返回nil。

EXHLEN

EXHLEN key [NOEXP]

获取key指定的exHash中field个数,该命令不会触发对过期field的淘汰,也不会将其过滤掉,所以结果中可能包含已经过期但还未被删除的field。如果只想返回当前没有过期的field个数,可以在命令中设置NOEXP选项。

EXHGETALL

EXHGETALL key

获取key指定的exHash中所有field及其value。

EXHDEL

EXHDEL key field [field ...]

删除key指定的exHash中的一个field,如果exHash不存在或者field不存在则返回0 ,成功删除返回1。

DEL

DEL <key> [key ...]

使用原生Redis的DEL命令可以删除一条或多条exHash数据。

EXISTS

EXISTS <key> [key ...]

使用原生Redis的EXISTS命令可以查看一条或多条exHash数据是否存在。

复杂命令、选项详细介绍

  • EXHSET
    表2 EXHSET命令介绍

    类别

    说明

    语法

    EXHSET key field value [EX time] [EXAT time] [PX time] [PXAT time] [NX | XX] [VER | GT | ABS version] [KEEPTTL]

    命令描述

    向Key指定的exHash中插入一个field。如果exHash不存在则自动创建一个,如果field已经存在则覆盖其值。

    为Key的field设置了超时时间后,再次执行该命令时如果没有设置超时时间,该field将被设置为永不过期。

    选项

    Key:exHash的key,用于指定作为命令调用对象的exHash。

    field:exHash中的一个元素,一个exHash key可以有多个field。

    value:field对应的值,一个field只能有一个value。

    EX:指定field的相对过期时间,单位为秒,为0表示马上过期,不传此参数表示不过期。

    EXAT:指定field的绝对过期时间,单位为秒,为0表示马上过期,不传此参数表示不过期。

    PX:指定field的相对过期时间,单位为毫秒,为0表示马上过期,不传此参数表示不过期。

    PXAT:指定field的绝对过期时间,单位为毫秒 ,为0表示马上过期,不传此参数表示不过期。

    NX:只在field不存在时插入。

    XX:只在field存在时插入。

    VER:版本号。如果field存在,和当前版本号做比较:如果相等,继续操作,且版本号加1。如果不相等,返回异常。如果field不存在或者field当前版本为0,忽略传入的版本号并继续操作,成功后版本号变为1。

    GT:比当前更大的版本号(Greater Than),设置的版本号如果比当前的版本号小,则返回失败。

    ABS:绝对版本号,不论field是否存在,可以在插入field时设置为本参数所指定的版本号。

    KEEPTTL:在不指定EX、EXAT、PX或PXAT选项时,使用KEEPTTL选项会保留field当前的过期设置。

    返回值

    新建field并成功为它设置值:1。

    field已经存在,成功覆盖旧值:0。

    指定了XX且field不存在:-1。

    指定了NX且field已经存在:-1。

    指定了VER且版本和当前版本不匹配:"ERR update version is stale"。

    其它情况返回相应的异常信息。

    • 示例

      field过期示例:

      127.0.0.1:6579> EXHSET k1 f1 v1 ex 10
      (integer) 1
      127.0.0.1:6579> EXHGET k1 f1
      "v1"
      127.0.0.1:6579> EXHSET k1 f2 v2 ex 10
      (integer) 1
      127.0.0.1:6579> EXHGET k1 f1
      (nil)
      127.0.0.1:6579> EXHGETALL k1
      127.0.0.1:6579> EXHGETALL k1
      (empty array)

      field支持version示例:

      127.0.0.1:6579> EXHSET k1 f1 v1
      (integer) 1
      127.0.0.1:6579> EXHVER k1 f1
      (integer) 1
      127.0.0.1:6579> EXHSET k1 f1 v1 ver 2
      (error) ERR update version is stale
      127.0.0.1:6579> EXHSET k1 f1 v1 ver 1
      (integer) 0
      127.0.0.1:6579> EXHVER k1 f1
      (integer) 2
      127.0.0.1:6579> EXHSET k1 f1 v1
      (integer) 0
      127.0.0.1:6579> EXHVER k1 f1
      (integer) 3
      127.0.0.1:6579> EXHSET k1 f1 v1 GT 3
      (error) ERR update version is stale
      127.0.0.1:6579> EXHSET k1 f1 v1 GT 2
      (error) ERR update version is stale
      127.0.0.1:6579> EXHSET k1 f1 v1 GT 4
      (integer) 0
      127.0.0.1:6579> EXHVER k1 f1
      (integer) 4
      127.0.0.1:6579> EXHSET k1 f1 v1 abs 2
      (integer) 0
      127.0.0.1:6579> EXHVER k1 f1
      (integer) 2
  • EXHINCRBY
    表3 EXHINCRBY命令介绍

    类别

    说明

    语法

    EXHINCRBY key field num [EX time] [EXAT time] [PX time] [PXAT time] [VER | GT | ABS version] [MIN minval] [MAX maxval] [KEEPTTL]

    命令描述

    将Key指定的exHash中一个field的value增加num,num为一个整数。如果exHash不存在则自动新创建一个,如果指定的field不存在,则在加之前插入该field并将其值设置为0。

    为Key的field设置了超时时间后,再次执行该命令时如果没有设置超时时间,该field将被设置为永不过期。

    选项

    Key:exHash的key,用于指定作为命令调用对象的exHash。

    field:exHash中的一个元素,一个exHash key可以有多个field。

    num:需要为field的value增加的整数值。

    EX:指定field的相对过期时间,单位为秒,为0表示马上过期,不传此参数表示不过期。

    EXAT:指定field的绝对过期时间,单位为秒,为0表示马上过期,不传此参数表示不过期。

    PX:指定field的相对过期时间,单位为毫秒,为0表示马上过期,不传此参数表示不过期。

    PXAT:指定field的绝对过期时间,单位为毫秒 ,为0表示马上过期,不传此参数表示不过期。

    VER:版本号。如果field存在,和当前版本号做比较:如果相等,继续操作,且版本号加1。如果不相等,返回异常。如果field不存在或者field当前版本为0,忽略传入的版本号并继续操作,成功后版本号变为1。

    GT:比当前更大的版本号(Greater Than),设置的版本号如果比当前的版本号小,则返回失败。

    ABS:绝对版本号,不论field是否存在,可以在插入field时设置为本参数所指定的版本号。

    KEEPTTL:在不指定EX、EXAT、PX或PXAT选项时,使用KEEPTTL选项会保留field当前的过期设置。

    MIN:value的最小值,小于该值则提示异常。

    MAX:value的最大值,大于该值则提示异常。

    返回值

    成功:与num相加后value的值。

    其它情况返回异常。

    • 示例

      MIN,MAX选项使用示例:

      127.0.0.1:6579> EXHINCRBY k1 f1 5 min 6
      (error) ERR increment or decrement would overflow
      127.0.0.1:6579> EXHINCRBY k1 f1 5 min 4
      (integer) 5
      127.0.0.1:6579> EXHINCRBY k1 f1 5 max 9
      (error) ERR increment or decrement would overflow
      127.0.0.1:6579> EXHINCRBY k1 f1 3 max 9
      (integer) 8

exHash命令使用示例

JAVA(Jedis)

package nosql.cloud.huawei.jedis;

import redis.clients.jedis.*;
import redis.clients.jedis.util.SafeEncoder;

import java.util.ArrayList;

public class Main{
    public static void main(String[] args) throws InterruptedException {
        // 初始化Jedis资源池配置
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        // 设置资源池中的最大连接数
        jedisPoolConfig.setMaxTotal(10);
        // 设置资源池允许的最大空闲连接数
        jedisPoolConfig.setMaxIdle(10);
        // 设置资源池确保的最少空闲连接数
        jedisPoolConfig.setMinIdle(2);

        // 根据配置初始化Jedis资源池
        // note: 若版本不支持user ACL机制, user必须为null
        JedisPool jedisPool = new JedisPool(jedisPoolConfig, "127.0.0.1", 8635, null, "******");

        // 从资源池里获取连接
        try (Jedis jedis = jedisPool.getResource()) {
            // example for: EXHSET key field value [EX time] [EXAT time] [PX time] [PXAT time] [NX | XX] [VER | ABS | GT version] [KEEPTTL]
            jedis.sendCommand(() -> SafeEncoder.encode("exhset"), "key", "field1", "value1");
            jedis.sendCommand(() -> SafeEncoder.encode("exhset"), "key", "field2", "value2", "EX", "5");

            // example for: EXHGET key field
            byte[] byteArray = (byte[]) jedis.sendCommand(() -> SafeEncoder.encode("exhget"), "key", "field1");
            System.out.println(new String(byteArray));
            byteArray = (byte[]) jedis.sendCommand(() -> SafeEncoder.encode("exhget"), "key", "field2");
            System.out.println(new String(byteArray));

            // example for: EXHGETALL key
            ArrayList<byte[]> byteArrayList = (ArrayList<byte[]>) jedis.sendCommand(() -> SafeEncoder.encode("exhgetall"), "key");
            for (byte[] ba : byteArrayList) {
                System.out.print(new String(ba));
                System.out.print(" ");
            }
            System.out.println();

            // sleep for 5 seconds
            Thread.sleep(5000);

            // exhgetall after sleeping
            byteArrayList = (ArrayList<byte[]>) jedis.sendCommand(() -> SafeEncoder.encode("exhgetall"), "key");
            for (byte[] ba : byteArrayList) {
                System.out.print(new String(ba));
                System.out.print(" ");
            }
        }

        // 关闭资源池
        jedisPool.close();
    }
}

exHash命令最佳实践请参考通过exHash实现广告频控业务方案概述