从redis中获取各个属性值拼装成对象列表的优化

2023-11-25 01:45

本文主要是介绍从redis中获取各个属性值拼装成对象列表的优化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我的目标是根据名称,从Redis缓存中获取一些值,并将它们封装到KnowBaseArgDto对象中,然后将这些对象添加到一个列表中返回给前端。

这是直来直去,通俗易懂,优化之前的代码:

List<KnowBaseArgDto> list = new ArrayList<>();AppKnowledgeRequestBody requestBody = new AppKnowledgeRequestBody();String key_prefix = CacheConsts.REDIS_CACHE_PREFIX + CacheConsts.APP_USERTOKEN_KNOW_KEY_PREFIX;String[] baseNameArray = (null != baseNames && baseNames.length() > 0) ? baseNames.split(",") : null;if(baseNameArray == null) {return list;}for(String baseName : baseNameArray) {String temperature = redisTemplate.opsForValue().get(key_prefix + baseName + ":USED:temperature");String top_k = redisTemplate.opsForValue().get(key_prefix + baseName  + ":USED:top_k");String score_threshold = redisTemplate.opsForValue().get(key_prefix + baseName  + ":USED:score_threshold");KnowBaseArgDto baseArgDto = new KnowBaseArgDto();baseArgDto.setBaseName(baseName);baseArgDto.setTemperature(temperature==null?Float.toString(requestBody.getTemperature()):temperature);baseArgDto.setTop_k(top_k==null?requestBody.getTop_k().toString():top_k);baseArgDto.setScore_threshold(score_threshold==null?Float.toString(requestBody.getScore_threshold()):score_threshold);list.add(baseArgDto);}return list;

针对代码可以进行如下方式的优化:

  • 减少Redis调用:Redis的pipeline功能来一次性获取所有的键值对,而不是为每个键分别调用get,这将减少与Redis的通信次数,从而提高性能;
  • 优化缓存键的组装:可以考虑使用一个循环来组装和获取所有的值,而不是为每个属性写单独的代码;

优化后的代码:

List<KnowBaseArgDto> list = new ArrayList<>();AppKnowledgeRequestBody requestBody = new AppKnowledgeRequestBody();String key_prefix = CacheConsts.REDIS_CACHE_PREFIX + CacheConsts.APP_USERTOKEN_KNOW_KEY_PREFIX;String[] baseNameArray = (null != baseNames && baseNames.length() > 0) ? baseNames.split(",") : null;if (baseNameArray == null) {return list;}// 准备要获取的Redis键列表List<String> keys = new ArrayList<>();for (String baseName : baseNameArray) {keys.add(key_prefix + baseName + ":USED:temperature");keys.add(key_prefix + baseName + ":USED:top_k");keys.add(key_prefix + baseName + ":USED:score_threshold");}// 使用pipeline一次性获取所有的值List<String> values = redisTemplate.opsForValue().multiGet(keys);for (int i = 0; i < baseNameArray.length; i++) {String baseName = baseNameArray[i];KnowBaseArgDto baseArgDto = new KnowBaseArgDto();baseArgDto.setBaseName(baseName);int index = i * 3; // 因为我们每次添加了三个键baseArgDto.setTemperature(values.get(index) == null ? Float.toString(requestBody.getTemperature()) : values.get(index));baseArgDto.setTop_k(values.get(index + 1) == null ? requestBody.getTop_k().toString() : values.get(index + 1));baseArgDto.setScore_threshold(values.get(index + 2) == null ? Float.toString(requestBody.getScore_threshold()) : values.get(index + 2));list.add(baseArgDto);}return list;}

这篇关于从redis中获取各个属性值拼装成对象列表的优化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/422930

相关文章

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Redis 热 key 和大 key 问题小结

《Redis热key和大key问题小结》:本文主要介绍Redis热key和大key问题小结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、什么是 Redis 热 key?热 key(Hot Key)定义: 热 key 常见表现:热 key 的风险:二、

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

SpringBoot整合mybatisPlus实现批量插入并获取ID详解

《SpringBoot整合mybatisPlus实现批量插入并获取ID详解》这篇文章主要为大家详细介绍了SpringBoot如何整合mybatisPlus实现批量插入并获取ID,文中的示例代码讲解详细... 目录【1】saveBATch(一万条数据总耗时:2478ms)【2】集合方式foreach(一万条数

python获取网页表格的多种方法汇总

《python获取网页表格的多种方法汇总》我们在网页上看到很多的表格,如果要获取里面的数据或者转化成其他格式,就需要将表格获取下来并进行整理,在Python中,获取网页表格的方法有多种,下面就跟随小编... 目录1. 使用Pandas的read_html2. 使用BeautifulSoup和pandas3.

SpringBoot UserAgentUtils获取用户浏览器的用法

《SpringBootUserAgentUtils获取用户浏览器的用法》UserAgentUtils是于处理用户代理(User-Agent)字符串的工具类,一般用于解析和处理浏览器、操作系统以及设备... 目录介绍效果图依赖封装客户端工具封装IP工具实体类获取设备信息入库介绍UserAgentUtils

Java对象转换的实现方式汇总

《Java对象转换的实现方式汇总》:本文主要介绍Java对象转换的多种实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java对象转换的多种实现方式1. 手动映射(Manual Mapping)2. Builder模式3. 工具类辅助映

Redis Pipeline(管道) 详解

《RedisPipeline(管道)详解》Pipeline管道是Redis提供的一种批量执行命令的机制,通过将多个命令一次性发送到服务器并统一接收响应,减少网络往返次数(RTT),显著提升执行效率... 目录Redis Pipeline 详解1. Pipeline 的核心概念2. 工作原理与性能提升3. 核

redis过期key的删除策略介绍

《redis过期key的删除策略介绍》:本文主要介绍redis过期key的删除策略,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录第一种策略:被动删除第二种策略:定期删除第三种策略:强制删除关于big key的清理UNLINK命令FLUSHALL/FLUSHDB命

C# foreach 循环中获取索引的实现方式

《C#foreach循环中获取索引的实现方式》:本文主要介绍C#foreach循环中获取索引的实现方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、手动维护索引变量二、LINQ Select + 元组解构三、扩展方法封装索引四、使用 for 循环替代