电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java 實(shí)現(xiàn)Redis存儲(chǔ)復(fù)雜json格式數(shù)據(jù)并返回給前端

瀏覽:82日期:2022-08-29 09:13:18

問(wèn)題背景

在Java Web項(xiàng)目中,經(jīng)常需要前端請(qǐng)求數(shù)據(jù),后臺(tái)從數(shù)據(jù)庫(kù)中查詢并計(jì)算最后返回json格式數(shù)據(jù)給前端。

而每次請(qǐng)求都需要計(jì)算一次可能比較浪費(fèi)時(shí)間,這時(shí)我們可以將計(jì)算好的結(jié)果保存在redis中,下次請(qǐng)求時(shí)先判斷redis中是否已經(jīng)存在,如果是則直接從redis里取出返回,因?yàn)槭窃趦?nèi)存中,所以比較快。

而自己在項(xiàng)目中遇到的json格式數(shù)據(jù)比較復(fù)雜,下面記錄一下redis存儲(chǔ)對(duì)象和json格式數(shù)據(jù)的幾種方式以及遇到的問(wèn)題。

存儲(chǔ)方式

1. 直接使用String存儲(chǔ)

String類型是Redis中最簡(jiǎn)單的類型了,每個(gè)key對(duì)應(yīng)一個(gè)String,我們可以直接將要存儲(chǔ)的對(duì)象轉(zhuǎn)換成json字符串,代碼如下:

//存儲(chǔ) public static void setJsonString(String key, Object obj) { Jedis jedis = RedisConnection.getJedis(); jedis.set(key, JSON.toJSONString(obj)); jedis.close(); } //獲取 public static String getJsonString(String key) { Jedis jedis = RedisConnection.getJedis(); String value = jedis.get(key); jedis.close(); return value; }

這里是使用fastjson的相關(guān)函數(shù)toJSONString將對(duì)象轉(zhuǎn)換為字符串進(jìn)行存儲(chǔ)。獲取的時(shí)候直接返回json字符串給前端就可以了。使用這種方式可能只能存儲(chǔ)簡(jiǎn)單的json字符串,對(duì)于復(fù)雜格式的可能會(huì)解析錯(cuò)誤。

2. 使用對(duì)象序列化方式存儲(chǔ)

先將對(duì)象以字節(jié)序列化存儲(chǔ),然后再反序列化得到對(duì)象,這里可以封裝一個(gè)序列化和反序列化的工具類:

import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;public class SerializeUtil { /* * 序列化 * */ public static byte[] serizlize(Object object){ ObjectOutputStream oos = null; ByteArrayOutputStream baos = null; try { baos = new ByteArrayOutputStream(); oos = new ObjectOutputStream(baos); oos.writeObject(object); byte[] bytes = baos.toByteArray(); return bytes; } catch (Exception e) { e.printStackTrace(); }finally { try {if(baos != null){ baos.close();}if (oos != null) { oos.close();} } catch (Exception e2) {e2.printStackTrace(); } } return null; } /* * 反序列化 * */ public static Object deserialize(byte[] bytes){ ByteArrayInputStream bais = null; ObjectInputStream ois = null; try{ bais = new ByteArrayInputStream(bytes); ois = new ObjectInputStream(bais); return ois.readObject(); }catch(Exception e){ e.printStackTrace(); }finally { try { } catch (Exception e2) {e2.printStackTrace(); } } return null; }}

相應(yīng)存儲(chǔ)和獲取代碼如下:

public static void setObject(String key,Object object){ Jedis jedis = RedisConnection.getJedis(); jedis.set(key.getBytes(), SerializeUtil.serizlize(object)); jedis.close(); } public static Object getObject(String key){ Jedis jedis = RedisConnection.getJedis(); byte[] bytes = jedis.get(key.getBytes()); jedis.close(); return SerializeUtil.deserialize(bytes); }

使用這種方式可能遇到嵌套的對(duì)象或者json數(shù)組等不太好解決。

3. 使用hash存儲(chǔ)

第三種方式也是解決我問(wèn)題的一種方式,由于我的json格式數(shù)據(jù)比較復(fù)雜,形如:

{ 'cd': [{'Condition': {...}, segs:[1,2,3]}, { }, ...] 'rs': {'way': '休寧路', 'road':[{},{},..], 'segList': [{object}, {}, ...] }}

我剛開(kāi)始是直接使用fastjson將其轉(zhuǎn)換為字符串進(jìn)行存儲(chǔ),但在返回解析時(shí)發(fā)現(xiàn)格式不太對(duì)了。分析其原因可能是json格式太復(fù)雜,然后使用redis中hash方式將數(shù)據(jù)進(jìn)行分割存儲(chǔ),即cd對(duì)應(yīng)一個(gè)key存儲(chǔ),rs為一個(gè)key進(jìn)行存儲(chǔ),將這兩部分都放入一個(gè)hash中。

相應(yīng)代碼如下:

Jedis jedis = RedisConnection.getJedis();JSONObject res = new JSONObject(); //最終結(jié)果//如果redis中存在,則直接從redis中取,否則計(jì)算并存儲(chǔ)至redisif(jedis.exists(lm)) { String rs_value = jedis.hget(lm, 'rs'); String cd_value = jedis.hget(lm, 'cd'); res.put('cd', JSONArray.parseArray(cd_value)); res.put('rs', JSONObject.parseObject(rs_value)); System.out.println('redis get success');} else { res = computeRes(lm); //更新redis jedis.hset(lm, 'cd', res.getJSONArray('cd').toJSONString()); jedis.hset(lm, 'rs', JSON.toJSONString(res.getJSONObject('rs'))); System.out.println('redis set success');}jedis.close(); //候選結(jié)果集轉(zhuǎn)json字符串String jsonStr = JSON.toJSONString(res, SerializerFeature.DisableCircularReferenceDetect);//返回給前端System.out.println('json string: ' + jsonStr);response.setContentType('text/html;charset=utf-8'); //解決前端中文亂碼PrintWriter out = response.getWriter();out.print(jsonStr);

我是以路名(lm)作為hash的key,首先判斷是否存在該key,不存在的話先進(jìn)行計(jì)算res = computeRes(lm);,得到上述的json格式數(shù)據(jù),然后使用hset方法將其分別作為兩個(gè)key進(jìn)行存儲(chǔ)。注意上述cd為一個(gè)JSONArray對(duì)象,需要使用調(diào)用toJSONString()方法轉(zhuǎn)換成字符串,而rs為一個(gè)JSONObject對(duì)象,使用的是JSON.toJSONString。

在獲取時(shí)首先分別獲取其字符串形式,然后分別轉(zhuǎn)換成相應(yīng)的類型JSONArray.parseArray(cd_value)和JSONObject.parseObject(rs_value),最終包裹在一個(gè)JSONObject中。

以上這篇Java 實(shí)現(xiàn)Redis存儲(chǔ)復(fù)雜json格式數(shù)據(jù)并返回給前端就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: UV固化机_UVLED光固化机_UV干燥机生产厂家-上海冠顶公司专业生产UV固化机设备 | 微波消解仪器_智能微波消解仪报价_高压微波消解仪厂家_那艾 | 医院专用门厂家报价-医用病房门尺寸大全-抗菌木门品牌推荐 | 铝镁锰板_铝镁锰合金板_铝镁锰板厂家_铝镁锰金属屋面板_安徽建科 | 阿尔法-MDR2000无转子硫化仪-STM566 SATRA拉力试验机-青岛阿尔法仪器有限公司 | 精雕机-火花机-精雕机 cnc-高速精雕机-电火花机-广东鼎拓机械科技有限公司 | 根系分析仪,大米外观品质检测仪,考种仪,藻类鉴定计数仪,叶面积仪,菌落计数仪,抑菌圈测量仪,抗生素效价测定仪,植物表型仪,冠层分析仪-杭州万深检测仪器网 | 档案密集架_电动密集架_移动密集架_辽宁档案密集架-盛隆柜业厂家现货批发销售价格公道 | 校园文化空间设计-数字化|中医文化空间设计-党建|法治廉政主题文化空间施工-山东锐尚文化传播公司 | 超细|超微气流粉碎机|气流磨|气流分级机|粉体改性机|磨粉机|粉碎设备-山东埃尔派粉体科技 | 辐射色度计-字符亮度测试-反射式膜厚仪-苏州瑞格谱光电科技有限公司 | 污水处理设备维修_污水处理工程改造_机械格栅_过滤设备_气浮设备_刮吸泥机_污泥浓缩罐_污水处理设备_污水处理工程-北京龙泉新禹科技有限公司 | 品牌策划-品牌设计-济南之式传媒广告有限公司官网-提供品牌整合丨影视创意丨公关活动丨数字营销丨自媒体运营丨数字营销 | 浙江工业冷却塔-菱电冷却塔厂家 - 浙江菱电冷却设备有限公司 | 玻璃瓶厂家_酱菜瓶厂家_饮料瓶厂家_酒瓶厂家_玻璃杯厂家_徐州东明玻璃制品有限公司 | 气动隔膜泵厂家-温州永嘉定远泵阀有限公司| 大鼠骨髓内皮祖细胞-小鼠神经元-无锡欣润生物科技有限公司 | 干粉砂浆设备-干粉砂浆生产线-干混-石膏-保温砂浆设备生产线-腻子粉设备厂家-国恒机械 | 菲希尔FISCHER测厚仪-铁素体检测仪-上海吉馨实业发展有限公司 | 苏州工作服定做-工作服定制-工作服厂家网站-尺品服饰科技(苏州)有限公司 | 硬质合金模具_硬质合金非标定制_硬面加工「生产厂家」-西迪技术股份有限公司 | 云南丰泰挖掘机修理厂-挖掘机维修,翻新,再制造的大型企业-云南丰泰工程机械维修有限公司 | 不锈钢监控杆_监控立杆厂家-廊坊耀星光电科技有限公司 | 120kv/2mA直流高压发生器-60kv/2mA-30kva/50kv工频耐压试验装置-旭明电工 | 龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司_龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司 | 箱式破碎机_移动方箱式破碎机/价格/厂家_【华盛铭重工】 | 密度电子天平-内校-外校电子天平-沈阳龙腾电子有限公司 | 瑞典Blueair空气净化器租赁服务中心-专注新装修办公室除醛去异味服务! | 深圳天际源广告-形象堆头,企业文化墙,喷绘,门头招牌设计制作专家 | 恒温槽_恒温水槽_恒温水浴槽-上海方瑞仪器有限公司 | 政府回应:200块在义乌小巷能买到爱情吗?——揭秘打工族省钱约会的生存智慧 | 硬质合金模具_硬质合金非标定制_硬面加工「生产厂家」-西迪技术股份有限公司 | 网络推广公司_网络营销方案策划_企业网络推广外包平台-上海澜推网络 | 喷漆房_废气处理设备-湖北天地鑫环保设备有限公司 | SMN-1/SMN-A ABB抽屉开关柜触头夹紧力检测仪-SMN-B/SMN-C-上海徐吉 | 三价铬_环保铬_环保电镀_东莞共盈新材料贸易有限公司 | 信阳市建筑勘察设计研究院有限公司 | 物联网卡_物联网卡购买平台_移动物联网卡办理_移动联通电信流量卡通信模组采购平台? | 智能型高压核相仪-自动开口闪点测试仪-QJ41A电雷管测试仪|上海妙定 | 济南侦探调查-济南调查取证-山东私家侦探-山东白豹调查咨询公司 密集架|电动密集架|移动密集架|黑龙江档案密集架-大量现货厂家销售 | 体检车_移动CT车_CT检查车_CT车_深圳市艾克瑞电气有限公司移动CT体检车厂家-深圳市艾克瑞电气有限公司 |