- 最新动态
- 功能总览
- 服务公告
- 产品介绍
-
GeminiDB Redis接口
- 产品介绍
- 计费说明
- 快速入门
-
用户指南
- 权限管理
- 购买GeminiDB Redis实例
- 实例连接及管理
-
数据迁移
- Redis数据迁移方案概览
- 使用DRS服务将GeminiDB Redis迁移到Redis(推荐)
- 阿里云数据库Redis/Tair到GeminiDB Redis的迁移
- 腾讯云Redis到GeminiDB Redis的迁移
- 使用DRS服务将自建Redis或者Redis集群迁移到GeminiDB Redis(推荐)
- 通过Redis-Shake迁移工具将自建Redis迁移到GeminiDB Redis
- 使用Redis-Shake工具将RDB文件/AOF文件 导入到GeminiDB Redis
- 使用数据导入功能将RDB文件恢复到GeminiDB Redis(推荐)
- Kvrocks到GeminiDB Redis的迁移
- Pika到GeminiDB Redis的迁移
- SSDB到GeminiDB Redis的迁移
- LevelDB到GeminiDB Redis的迁移
- RocksDB到GeminiDB Redis的迁移
- AWS ElasticCache for Redis数据库到GeminiDB Redis的迁移
- 迁移后Redis数据一致性校验
- 实例管理
- 变更实例
- 数据备份
- 数据恢复
- 诊断分析
- 账号与安全
- 参数管理
- 日志与审计
- 查看监控指标与配置告警
- GeminiDB Redis标签管理
- GeminiDB Redis用户资源配额
- 通过GeminiDB Redis实现MySQL内存加速
- 开发参考
- 最佳实践
- 性能白皮书
-
常见问题
- 高频常见问题
-
产品咨询
- GeminiDB Redis和开源Redis、其他开源Redis云服务有什么区别?
- 和开源Redis相比,GeminiDB Redis性能如何?
- GeminiDB Redis兼容Redis哪些版本,兼容哪些命令,客户端连接是否需要修改
- 自建Redis是否可以搬迁至GeminiDB Redis,需要注意什么
- 什么是GeminiDB Redis实例可用性
- GeminiDB Redis实例总容量是总内存吗,内存和容量之间是什么联系
- 购买GeminiDB Redis实例时,如何选择合适的节点规格和节点数量?
- 购买x GB的GeminiDB Redis的实例,优选主备还是集群?
- GeminiDB Redis持久化机制是怎样的,会丢数据吗
- GeminiDB Redis的内存淘汰策略是什么
- GeminiDB Redis是否支持布隆过滤器等modules
- 计费相关
-
数据库使用
- scan指定match参数,数据中确实存在匹配的key,为什么返回的是空
- 业务侧原本做了数据分片,切换到GeminiDB Redis后如何处理这部分逻辑
- GeminiDB Redis接口是否支持keys命令的模糊查询
- GeminiDB Redis是否支持多DB
- 对于scan类的操作,GeminiDB Redis接口与开源Redis 5.0的返回值顺序为什么有差异
- 针对某些不合法命令,GeminiDB Redis接口与开源Redis 5.0的报错信息为什么有差异
- 如何处理报错:CROSSSLOT Keys in request don't hash to the same slot
- GeminiDB Redis单次事务推荐包含的命令条数
- GeminiDB Redis集群版实例中,哪些命令需要使用hashtag
- 如何处理报错“ERR unknown command sentinel"
- 对于阻塞命令,GeminiDB Redis接口(主备实例)与开源Redis的返回值为什么可能有差异
- GeminiDB Redis存储扩容需要多久,对业务有影响吗?
- GeminiDB Redis多个节点同时扩容需要多长时间,对业务影响如何?
- GeminiDB Redis规格变更包含的在线变更和离线变更有什么区别,通常需要多长时间,对业务有哪些影响?
- GeminiDB Redis版本补丁升级包含的在线升级和离线升级有什么区别,通常需要多长时间,对业务有哪些影响?
- GeminiDB Redis备份文件是否可以下载到本地,是否支持线下恢复数据
- GeminiDB Redis数据备份工作机制是怎样的,对业务有哪些影响?
- 购买GeminiDB Redis 1U*2节点特惠型实例后,业务访问量比较少,但CPU占用率比较高,是什么原因?
- GeminiDB Redis监控面板上key数量下降又恢复至正常数量是什么原因?
- GeminiDB Redis节点CPU偶发冲高,可能是哪些原因
- GeminiDB Redis如何从5.0版本升级到6.2版本
- GeminiDB Redis什么时候进入只读
-
数据库连接
- 如何接入GeminiDB Redis
- 如何使用GeminiDB Redis提供的多个节点IP地址
- GeminiDB Redis提供的ELB的实现方式是怎样的
- 如何创建和连接弹性云服务器
- GeminiDB Redis实例购买成功后是否支持更换VPC
- 绑定了弹性公网IP但是连接不上数据库
- 内网如何访问GeminiDB Redis
- GeminiDB Redis自带的负载均衡地址是否能绑定公网IP?如何通过公网连接GeminiDB Redis实例?
- 设置了安全组,还需要设置负载均衡内网访问控制吗?
- 如何处理客户端连接池报错“Could not get a resource from the pool”
- 常见客户端报错及解决方法
- 备份与恢复
- 区域和可用区
-
数据迁移
- DRS上找不到GeminiDB Redis链路
- 报错ERR the worker queue is full, and the request cannot be excecuted
- 报错ERR the request queue of io thread is full, and the request cannot be excecuted
- 报错 read error, please check source redis log or network
- 报错 slaveping_thread.cc-ThreadMain-90: error: Ping master error
- 同步状态正向迁移速度太慢
- 同步状态正向迁移速度太快,报错:ERR server reply timeout, some responses may lose, but requests have been executed
- 4.0、5.0以及6.2版本的自建Redis能迁移至GeminiDB Redis吗?
- 自建Redis主备、集群实例如何迁移到GeminiDB Redis?
- 为什么阿里云Redis、腾讯云Redis等云服务不能使用DRS进行数据迁移?
- 自建主备Redis,迁移到GeminiDB Redis集群,需要考虑哪些因素?
- 迁移完成后数据量变少了,100GB的数据迁移到GeminiDB Redis只有20-30GB,数据是不是没迁移完?
- 内存加速
- 资源冻结/释放/删除/退订
- GeminiDB Influx接口
-
GeminiDB Cassandra接口
- 产品介绍
- 计费说明
- 快速入门
-
用户指南
- 权限管理
- 购买GeminiDB Cassandra实例
- 实例连接及管理
- 数据迁移
- 实例生命周期管理
- 变更实例
- 同城容灾
- 异地双活
- 数据备份
- 数据恢复
- 参数管理
- 日志与审计
- 查看监控指标与配置告警
- 企业项目
- GeminiDB Cassandra标签管理
- GeminiDB Cassandra用户资源配额
- 最佳实践
- 性能白皮书
- 常见问题
- GeminiDB (兼容DynamoDB API)实例
- HBase协议兼容版实例
- GeminiDB Mongo接口
- 技术白皮书
-
API参考
- 使用前必读
- API概览
- 如何调用API
- 快速入门
-
API v3(推荐)
- 查询API版本
- 接口版本和规格
-
实例管理
- 创建实例
- 删除实例
- 查询实例列表和详情
- 扩容实例存储容量
- 扩容实例的节点数量
- 缩容实例的节点数量
- 获取节点会话列表
- 查询实例节点会话统计信息
- 关闭实例节点会话
- 查询实例可变更规格
- 变更实例规格
- 修改实例的管理员密码
- 修改实例名称
- 变更实例安全组
- 数据库补丁升级
- 批量数据库补丁升级
- 创建冷数据存储
- 扩容冷数据存储
- 绑定/解绑弹性公网IP
- 切换实例SSL开关
- 重启实例
- 设置磁盘自动扩容策略
- 修改数据库端口
- 判断弱密码
- 修改副本集跨网段访问配置
- 删除扩容失败的节点
- 查询创建实例或扩容节点时需要的IP数量
- 查询磁盘自动扩容策略
- 变更实例存储容量
- 查询高危命令
- 修改高危命令
- 查询Redis实例的热key
- 设置Redis禁用命令
- 查询Redis禁用命令
- 删除Redis禁用命令
- 设置实例可维护时间段
- Redis主备切换
- 支持节点的开关机
- 查询GeminiDB Redis实例的大key
- 获取GeminiDB Redis的免密配置
- 支持修改GeminiDB Redis的免密配置
- 查询内存加速映射列表和详情
- 创建内存加速规则
- 解除内存加速映射
- 创建内存加速映射
- 修改内存加速规则
- 查询内存加速规则列表和详情
- 删除内存加速规则
- 开启/关闭实例数据导出
- 开启/关闭秒级监控
- 查询秒级监控配置
- 连接管理
- 备份与恢复
- 参数模板管理
- 管理数据库和账号
- 标签管理
- 日志管理
- 配额管理
- 容灾管理
- 任务管理
- 企业项目管理
- 实例负载均衡管理
- API v3(即将下线)
- 权限策略和授权项
- 附录
- SDK参考
- 场景代码示例
- 视频帮助
- 文档下载
- 通用参考
链接复制成功!
exHash命令列表
exHash是一种可为field设置过期时间和版本的Hash类型数据结构,提高了Hash数据结构的灵活性,简化了很多场景下的业务开发工作。
主要特征
- field支持单独设置expire和version。
- field支持高效灵活的主动、被动过期淘汰(expire)策略。
- 语法和原生Redis Hash数据类型类似。
命令列表
命令 |
语法 |
说明 |
---|---|---|
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"。
其它情况返回相应的异常信息。
- 示例
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的值。
其它情况返回异常。
- 示例
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", 6379, 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实现广告频控业务方案概述。