【Redis】解析Redis和Java传递数据

在Java中使用Redis之前需要导入 jedis.jar 包,由于Redis是基于key-value进行数据存储,java中的数据存储到Redis中有许多方式,这里笔者介绍采用JSON字符串和对象序列化两种方式。

1,使用JSON方式

  • 首先将Java对象转化为JSON字符串

  • 然后将JSON字符串存储到Redis中

  • 最后把JSON字符串从Redis中取出来,并且转化为Java对象

首先导入和JSON使用相关的包: gson.jar

实体类Person的代码如下:

package cn.wxg.person;import java.io.Serializable;public class Person{private String name;private int age;public Person(String name, int age) {super();this.name = name;this.age = age;}public Person() {super();}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Person [name=" + name + ", age=" + age + "]";}}
Person.java

(1).将Java对象通过JSON存储到Redis中

        //创建Jedis对象Jedis jedis=new Jedis("127.0.0.1");//添加需要存储的数据Person person=new Person();List<Person> persons=new ArrayList<Person>();persons.add(new Person("jame",3));persons.add(new Person("james",3));persons.add(new Person("ja",3));//将数据转化为JSON字符串,存储到Redis中jedis.set("person",new Gson().toJson(persons));

(2).将Redis中的JSON字符串读取出,然后转化为Java对象

        //创建Jedis对象Jedis jedis=new Jedis("127.0.0.1");//读取数据String str = jedis.get("person");//再将数据转化为Java对象List<Person> fj = new Gson().fromJson(str, List.class);//输出数据Iterator<Person> iterator = fj.iterator();while(iterator.hasNext()){System.out.println(iterator.next());}

这种通过Json的方式比较好理解,关于这种方式的更多信息还可以参见详解JAVA对象JSON的解析

2,使用对象序列化方式

在使用这种方式之前,需要存储到实体类需要序列化,否则就不能存储。

实体类Person的代码如下:

package cn.wxg.person;import java.io.Serializable;public class Person implements Serializable{private static final long serialVersionUID = 1L;private String name;private int age;public Person(String name, int age) {super();this.name = name;this.age = age;}public Person() {super();}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Person [name=" + name + ", age=" + age + "]";}}
Person.java

工具类的方法SerializeUtil如下:

package cn.wxg.util;import java.io.*;public class SerializeUtil {public static byte[] serialize(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();return null;}}public static Object unserialize(byte[] bytes) {ByteArrayInputStream bais = null;try {// 反序列化bais = new ByteArrayInputStream(bytes);ObjectInputStream ois = new ObjectInputStream(bais);return ois.readObject();} catch (Exception e) {e.printStackTrace();return null;}}
}
SerializeUtil.java

(1)将对象序列化,并且存储到Redis中

        //创建Jedis对象Jedis jedis=new Jedis("127.0.0.1");//需要存储的数据Person person=new Person();List<Person> persons=new ArrayList<Person>();persons.add(new Person("jame",3));persons.add(new Person("james",3));persons.add(new Person("ja",3));//对存储的数据序列化byte[] bt = SerializeUtil.serialize(persons);//将字节数据存储到Redis中jedis.set("persons".getBytes(),bt);

(2)从Redis中读取数据,然后反序列化,得到Java对象

        //创建Jedis对象Jedis jedis=new Jedis("127.0.0.1");//需要存储的数据Person person=new Person();List<Person> persons=new ArrayList<Person>();persons.add(new Person("jame",3));persons.add(new Person("james",3));persons.add(new Person("ja",3));//对存储的数据序列化byte[] bt = SerializeUtil.serialize(persons);//将字节数据存储到Redis中jedis.set("persons".getBytes(),bt);

这种方式效率比第一种高,推荐第二种。

3,Redis的使用地方

Redis可以用于性能优化,在这篇文章中SpringMVC详解AOP中,说到了如何进行程序性能监听。如果我们发现程序的速度表较慢的话,可以尝试使用Redis进行缓存优化。
使用Redis缓存的思路为:

    @RequestMapping("querybook.do")public ModelAndView querybook(Integer bookId){//查看在Redis中是否有该书籍的信息Jedis jedis=new Jedis();Book book=jedis.get(bookId.toString());if(book!=null){//直接把Redis读取的数据返回return book;}else{//从数据库中读取数据book=Database.query(bookId);//将数据存储到Redis中jedis.set("book".getBytes(),SerializeUtil.serialize(book));//将数据返回return book;}}

这里笔者再总结一下,就是在用户请求的时候,首先查看Redis中是否有该数据(因为从Redis中取数据的速度比从关系型数据库中取要快得多),如果有就直接从Redis中取,如果没有就从数据库中取,然后再把取出来的数据放到Redis中,这样的话下次用户请求的时候就可以直接从Redis中读取数据了。

使用Redis作为中间缓存,会增加很多逻辑控制代码。比如使用Oracle作为关系型数据库,Redis作为中间缓存,那么Oracle和Redis的数据是不同步的,这时候对用户的一些基本操作(增、删、改、查)就会添加很多控制代码,以保证Oracle和Redis中的数据一致性。

转载于:https://www.cnblogs.com/HDK2016/p/7235919.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429033.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sql查询php,SQL查询或PHP?

我想看看哪里做错了&#xff0c;但我不能找到问题&#xff0c;我不能更新我的数据库&#xff0c;有人可以看到我的代码什么是缺少的&#xff1f;总是说我“数据库错误”码&#xff1a;if(isset($_POST[enviar])) {$types"";for ($i0; $i$types$types.$_POST[texames]…

C#带按钮的文本框TextBoxContainButton

经常需要用到各种组合控件&#xff0c;每次组合太麻烦&#xff0c;通过打包成自定义控件&#xff0c;方便调用。 带按钮的文本框&#xff0c;如下图&#xff1a; 文本框内可以输入文本&#xff0c;响应文本框内容变化事件&#xff0c;按钮可以设置点击事件&#xff0c;图标 通过…

PHP用gd库给图片添加水印,php用GD库给图片添加水印

php用GD库给图片添加文字水印&#xff0c;整个代码比较简单&#xff0c;DEMO如下&#xff1a;/*打开图片*///1、配置图片路径$src "aeroplane.jpg";//2、获取图片信息$info getimagesize($src);//3、获取图片类型$type image_type_to_extension($info[2], false);…

Windows单机配置Zookeeper环境

转自&#xff1a;http://www.jianshu.com/p/f7037105db46 首先要确保机器已经安装好java环境&#xff0c;并且配置好环境变量 http://apache.fayea.com/zookeeper/current/ 下载后&#xff0c;解压缩到硬盘&#xff0c;我这里解压到了 D:\WorkSoftware\zookeeper_3.4.9 解压缩在…

php 方法里用外部变量的值,PHP实现函数内修改外部变量值的方法示例

本文实例讲述了PHP实现函数内修改外部变量值的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;直接上代码&#xff0c;如下&#xff1a;$a_str ab;function change_val(){global $a_str; // 通过设置全局变量&#xff0c;修改变量值//$a_str abc;$a_str $a_str…

三层架构—简析

三层学习完了&#xff0c;第一次验收的时候&#xff0c;自己理解的也不是非常到位&#xff0c;后来又又一次敲了一遍登陆样例&#xff0c;查阅了一些资料 进行第二次验收才感觉清晰了很多。之前画时序图时我就想过时序图基本上也是非常好的体现了三层&#xff0c;当时也和别人讨…

php配置文件加载顺序,php extension 加载顺序问题

有的php扩展&#xff0c;加载是有先后顺序的&#xff0c;如果搞错了&#xff0c;会导致扩展无法加载。1&#xff0c;pdo_sqlsrv是sqlserver扩展&#xff0c;如果在pdo扩展之前加载就会报以下错误PHP Warning: PHP Startup: Unable to load dynamic library pdo_sqlsrv.so (trie…

机房收费系统之结账

其实&#xff0c;我认为机房收费系统中结账的部分是耗我精力最多的。首先我就不明确结账是干嘛的&#xff0c;所以一上来就晕乎乎。后来看了一篇博客说结账方便老板管理的才明确了为什么是“操作员”。这里面要理清的一点&#xff0c;结账的内容是未结账的。 暂时汇总的信息&am…

linux php oauth安装,php – 无法在Linux上安装OAuth

我正在尝试在Linux上安装OAuth,但它无法正常工作.我正在运行此命令&#xff1a;yum install php-devel然后pecl install oauth然后我得到这个输出&#xff1a;downloading oauth-1.2.2.tgz ...Starting to download oauth-1.2.2.tgz (45,348 bytes).............done: 45,348 b…

[NOIP2010提高组]关押罪犯

题目&#xff1a;洛谷P1525、Vijos P1776、codevs1069。 题目大意&#xff1a;有一些罪犯&#xff0c;两个罪犯之间可能会发生冲突&#xff0c;冲突有个影响力&#xff0c;而如果两个罪犯在不同监狱里&#xff0c;就可以避免冲突。现在有两个监狱&#xff0c;要你安排一种关押罪…

java一元二次方程面向对象,求解一元二次方程(面向对象设计的),跪求

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼头文件#if! defined(EQUATION_H)#define EQUATION_H#include #include using namespace std;class FindRoot{private:float a,b,c,d;double x1,x2;public:FindRoot(float x,float y,float z);void Find();void Display();};#endif实…

Java线上应用故障排查之一:高CPU占用

一个应用占用CPU很高&#xff0c;除了确实是计算密集型应用之外&#xff0c;通常原因都是出现了死循环。 以我们最近出现的一个实际故障为例&#xff0c;介绍怎么定位和解决这类问题。 根据top命令&#xff0c;发现PID为28555的Java进程占用CPU高达200%&#xff0c;出现故障。 …

Java并发编程实战 代码bug,Java并发编程实战(1)- 并发程序的bug源头

概述并发编程一般属于编程进阶部分的知识&#xff0c;它会涉及到很多底层知识&#xff0c;包括操作系统。编写正确的并发程序是一件很困难的事情&#xff0c;由并发导致的bug&#xff0c;有时很难排查或者重现&#xff0c;这需要我们理解并发的本质&#xff0c;深入分析Bug的源…

ajax小结

转载于:https://www.cnblogs.com/infernoyy/p/7250548.html

linux mysql迁移,Linux 下安装MySQL并迁移备份

简单记录下在centOS上安装MySQL(MariaDB)的过程。这里我并没有选择特定的MySQL版本&#xff0c;使用的是源默认提供的版本。1. 执行安装命令&#xff1a;执行如下指令安装MySQL数据库。1yuminstall-ymysqlmysql-server注意这里同时安装了mysql和mysql-server。在输出一长串信息…

Asp.net--DropDownList控件绑定数据库数据

DropDownList控件绑定数据库数据&#xff1a;DB是公共类&#xff0c;reDt是公共类中的方法 放在Page_Load事件中 if (!IsPostBack){DB db new DB();DataTable dt db.reDt("select * from provinceInfo order by provinceid asc");ddlsmprovince.DataSource dt;ddl…

app推送以及提示音java,springboot 整合 Jpush 极光推送

产品简介&#xff1a;JPush 是经过考验的大规模 App 推送平台&#xff0c;每天推送消息数超过 5 亿条。 开发者集成 SDK 后&#xff0c;可以通过调用 API 推送消息。同时&#xff0c;JPush 提供可视化的 web 端控制台发送通知&#xff0c;统计分析推送效果。 JPush 全面支持 An…

C++游戏系列2:角色装备武器

很多其它见&#xff1a;C游戏系列文件夹 知识点&#xff1a;类的组合&#xff0c;A类的数据成员。是B类的对象&#xff0c;或B类的对象。做A类的数据成员    【项目-带武器的游戏角色】   设计一个武器类&#xff0c;其数据成员至少要有武器名、威力&#xff0c;还能够…

php 显示当前年月日时分秒,php 获取当前前后年、月、星期、日、时分秒的时间...

php 获取今天前后年、月、星期、日、时分秒的时间。通过设置时间戳函数strtotime()的参数获取时间。//获取当前时间echo date(Y-m-d H:i:s,strtotime(now));echo date(Y-m-d H:i:s);echo date(Y-m-d H:i:s,time());//获取5天前的时间echo date(Y-m-d H:i:s,strtotime("-5 …

Lydsy2017年4月月赛 抵制克苏恩

Description小Q同学现在沉迷炉石传说不能自拔。他发现一张名为克苏恩的牌很不公平。如果你不玩炉石传说&#xff0c;不必担心&#xff0c;小Q同学会告诉你所有相关的细节。炉石传说是这样的一个游戏&#xff0c;每个玩家拥有一个30 点血量的英雄&#xff0c;并且可以用牌召唤至…