首页 > 编程知识 正文

no value registered for key(redis查看key的value)

时间:2023-05-03 07:21:20 阅读:84566 作者:3171

1、redis value值格式

Java的常规开发需要面向对象的思想。 对于对象,JSON是一种比较常用且可以快速转换的格式。 比较常用的Java处理JSON数据有三种,一种是比较受欢迎的类库: FastJSON、Gson、帅气栗子。 他们的优劣在这里不做介绍,但在这篇文章中使用蚂蚁的FastJSON。

上面提到了JSON,这是因为Redis的存储是用来存储值的。 为什么要这么做呢? 主要原因是,json格式具有以下优点:

如果你想学习Java工程,高性能,分布式,深入。 微服务、Spring、MyBatis、Netty源码分析的朋友可以添加我的Java高级交流: 854630135,群里免费分享阿里lmdcjl直播讲解技术,以及Java大型互联网技术的视频。

1 .标准、主流数据交换格式

2 .简单,结构清晰,相对于XML更轻,更容易分析

3 )与语言无关,任何语言都能简单地完成

4 .类型安全,值有类型。 例如整数、字符串、奇怪的耳机等

接下来,让我们看一下如何使用json保存value。 代码如下所示。

//*

在redis数据库中插入密钥和值,并设置有效期限

*

* * @ param密钥k

* * @参数值v

* @param exp有效期限s

* * @返回布尔值

*/

@Override

公共序列密钥(字符串密钥、v值、整数表达式) {

jedis jedis=空值;

将值转换为json对象

//stringjkey=JSON.tojsonstring (key;

stringjvalue=JSON.tojsonstring (值);

//操作成功了吗

布尔型对话=真;

if (字符串实用程序. isempty (密钥) )

log .信息(密钥完整性);

返回假;

}

特里

//获取客户端对象

jedis=redis cache.get资源(;

//执行插入

jedis.setex (密钥、扩展、j值);

缓存(执行) {

log .信息(客户端连接服务器);

is sucess=假;

if (空值!=jedis ) {

释放jedis对象

redis cache.broken资源(jedis );

}

返回假;

} finally {

if (国际货币基金组织)

//返回连接池

redis cache .返回资源(jedis;

}

}

返回真;

}

代码中的redis value在保存之前进行了一次转换,然后将对象v转换为json对象进行了保存; 让我们看看redis值的格式。

如果你想学习Java工程,高性能,分布式,深入。 微服务、Spring、MyBatis、Netty源码分析的朋友可以添加我的Java高级交流: 854630135,群里免费分享阿里lmdcjl直播讲解技术,以及Java大型互联网技术的视频。

如上所述,在redis可视化工具RDM(redisdesktopmanager )中,与密钥对应的值在json中显示得非常清晰,因此浏览redis中存储的数据非常方便。

不知道您是否注意到了,上面的代码中有注释掉的行。 代码如下。

//stringjkey=JSON.tojsonstring (key;

这一行是key键也json化的意思,不是说json很友好吗? 那为什么要注释这一行呢? 让我解释一下为什么要这么做。

首先,所有使用json格式的数据都是josn格式的字符串。 例如,如果将此字符串另存为key,如“zhangsan”,则缺省情况下具有json特性。 也就是说,双引号“”也会被带到redis的密钥设置中,因此在rdm中看到的所有密钥值默认为“”。 这真的非常不重要

2、redis密钥格式

我们讨论了简单的密钥存储(如zhangsan ),但此时可以满足一般需求。 但是,在实际业务中,key密钥的存储往往变得非常复杂。 例如,我们

现在有一个需求:

需求:根据基础数据系统中的数据字典类型查询对应的字典集合

这时,我们需要关注的业务就变得复杂了,就不能使用常规的key键存储方式,上面的需求大致可以拆分为:

1.系统:基础数据系统 2.模块:数据字典 3.方法:根据数据字典类型查询 4.参数:字典类型

为什么要这样拆分呢?为了可读性;也为了抽象出key存储规则;因为业务复杂情况下,我们定义的key键太多时就不便于管理,也不便于查找,以 系统-模块-方法-参数 这样的规则定义,我们可以很清晰的了解redis key存储的值是做了什么事情,而且rdm中也可以以此来分组,后面会讲到。

下面贴上根据此规则定义抽象出的redis工具类:

package com.yclimb.mdm.redis; /** * Redis 工具类 * * @author yclimb * @date 2018/4/19 */ public class RedisUtils { /** * 主数据系统标识 */ public static final String KEY_PREFIX = "mdm"; /** * 分割字符,默认[:],使用:可用于rdm分组查看 */ private static final String KEY_SPLIT_CHAR = ":"; /** * redis的key键规则定义 * @param module 模块名称 * @param func 方法名称 * @param args 参数.. * @return key */ public static String keyBuilder(String module, String func, String... args) { return keyBuilder(null, module, func, args); } /** * redis的key键规则定义 * @param module 模块名称 * @param func 方法名称 * @param objStr 对象.toString() * @return key */ public static String keyBuilder(String module, String func, String objStr) { return keyBuilder(null, module, func, new String[]{objStr}); } /** * redis的key键规则定义 * @param prefix 项目前缀 * @param module 模块名称 * @param func 方法名称 * @param objStr 对象.toString() * @return key */ public static String keyBuilder(String prefix, String module, String func, String objStr) { return keyBuilder(prefix, module, func, new String[]{objStr}); } /** * redis的key键规则定义 * @param prefix 项目前缀 * @param module 模块名称 * @param func 方法名称 * @param args 参数.. * @return key */ public static String keyBuilder(String prefix, String module, String func, String... args) { // 项目前缀 if (prefix == null) { prefix = KEY_PREFIX; } StringBuilder key = new StringBuilder(prefix); // KEY_SPLIT_CHAR 为分割字符 key.append(KEY_SPLIT_CHAR).append(module).append(KEY_SPLIT_CHAR).append(func); for (String arg : args) { key.append(KEY_SPLIT_CHAR).append(arg); } return key.toString(); } /** * redis的key键规则定义 * @param redisEnum 枚举对象 * @param objStr 对象.toString() * @return key */ public static String keyBuilder(RedisEnum redisEnum, String objStr) { return keyBuilder(redisEnum.getKeyPrefix(), redisEnum.getModule(), redisEnum.getFunc(), objStr); } }

上面代码中有此文字描述 分割字符,默认[:],使用:可用于rdm分组查看 ;redis key默认使用冒号分割,好处在于可以在rdm中以文件夹的形式分组查看,如图:

3、使用枚举类来定义规则

上面的工具类中的有如下代码,使用了枚举的形式来赋值:

/** * redis的key键规则定义 * @param redisEnum 枚举对象 * @param objStr 对象.toString() * @return key */ public static String keyBuilder(RedisEnum redisEnum, String objStr) { return keyBuilder(redisEnum.getKeyPrefix(), redisEnum.getModule(), redisEnum.getFunc(), objStr); }

下面是枚举类代码:

如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里lmdcjl直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。

package com.yclimb.mdm.redis; /** * Redis 枚举类 * * @author yclimb * @date 2018/4/19 */ public enum RedisEnum { /** * 数据字典Service - 根据字典类型查询字典数据 */ MDM_MSTDATADICTIONARYSERVICE_QUERYLISTBYENTITYREDIS( RedisUtils.KEY_PREFIX, "MstDataDictionaryService", "queryListByEntityRedis", "数据字典Redis缓存"); /** * 系统标识 */ private String keyPrefix; /** * 模块名称 */ private String module; /** * 方法名称 */ private String func; /** * 描述 */ private String remark; RedisEnum(String keyPrefix, String module, String func, String remark) { this.keyPrefix = keyPrefix; this.module = module; this.func = func; this.remark = remark; } getter and setter.... }

使用上面的枚举类,可以根据模块和方法定义需要的枚举类型,便于管理和维护,使用起来也非常方便,使用代码如下:

@Override public List<MstDataDictionary> queryListByEntityRedis(MstDataDictionary mstDataDictionary) { // redis key 获取 String redisKey = RedisUtils.keyBuilder(RedisEnum.MDM_MSTDATADICTIONARYSERVICE_QUERYLISTBYENTITYREDIS, (null == mstDataDictionary ? "" : mstDataDictionary.toString())); // 查询redis缓存 List<MstDataDictionary> mstDataDictionaryList = (List<MstDataDictionary>) redisCacheService.get(redisKey); // 如果没有缓存则查询数据库后赋值 if (mstDataDictionaryList == null || mstDataDictionaryList.size() <= 0) { mstDataDictionaryList = mstDataDictionaryMapper.queryListByEntity(mstDataDictionary); redisCacheService.set(redisKey, mstDataDictionaryList); } return mstDataDictionaryList; }

OK,到这里就差不多讲完了,根据上面所说的分模块方式,自定义redis的key键名称,value值格式使用json来存储;

对于key键的规则定义也可以使用 Constants 常量类来实现,具体规则看个人爱好和需求。

如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里lmdcjl直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。