在上一篇文章中已经讲了redis的spring配置,这篇将会描述redis在java项目中的使用。

redis存储形式都是key-value(键值对),按照存储的内容分为两种,一种是存简单数据,即数字,字符串等,可以用string-value的形式存储;另一种是存对象、集合等,最好用序列化的方式来存储。

1、存储简单数据

try {
Jedis jedis = new Jedis();
jedis.set("name", "JackGSmith");
} catch (Exception e) {
//如果缓存连不上,则不处理
System.out.println("登录无法更新该用户缓存");
}

从redis缓存中获取key为“name”的值,使用jedis.get("name"),用一个String变量接收即可。

2、存储对象、集合

存对象集合用序列化的方式存储,用反序列化的方式取值。存储的key和value都是转化成字节码的形式。

先定义一个抽象类:SerializeTranscoder.java,代码如下:

package cn.com.taiji.sample.utils;

import java.io.Closeable;
import java.io.IOException; public abstract class SerializeTranscoder { public abstract byte[] serialize(Object value); public abstract Object deserialize(byte[] in) throws IOException; public void close(Closeable closeable) {
if (closeable != null) {
try {
closeable.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

再建一个序列化的类,ObjectTranscoder.java,继承上面这个抽象类,该类是用来序列化存储对象用的,代码如下:

package cn.com.taiji.sample.utils;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable; public class ObjectTranscoder<M extends Serializable> extends SerializeTranscoder{ @SuppressWarnings("unchecked")
@Override
public byte[] serialize(Object value) {
if (value == null) {
throw new NullPointerException("Can't serialize null");
}
byte[] result = null;
ByteArrayOutputStream bos = null;
ObjectOutputStream os = null;
try {
bos = new ByteArrayOutputStream();
os = new ObjectOutputStream(bos);
M m = (M) value;
os.writeObject(m);
os.close();
bos.close();
result = bos.toByteArray();
} catch (IOException e) {
throw new IllegalArgumentException("Non-serializable object", e);
} finally {
close(os);
close(bos);
}
return result;
} @SuppressWarnings("unchecked")
@Override
public M deserialize(byte[] in) {
M result = null;
ByteArrayInputStream bis = null;
ObjectInputStream is = null;
try {
if (in != null) {
bis = new ByteArrayInputStream(in);
is = new ObjectInputStream(bis);
result = (M) is.readObject();
is.close();
bis.close();
}
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
close(is);
close(bis);
}
return result;
}
}

接着在新建一个ListTranscoder.java文件,用来序列化存储List(集合)对象,基本同上,代码如下:

package cn.com.taiji.sample.utils;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List; public class ListTranscoder<M extends Serializable> extends SerializeTranscoder { @SuppressWarnings("unchecked")
public List<M> deserialize(byte[] in) throws IOException {
List<M> list = new ArrayList<>();
ByteArrayInputStream bis = null;
ObjectInputStream is = null;
try {
if (in != null) {
bis = new ByteArrayInputStream(in);
is = new ObjectInputStream(bis);
while (true) {
M m = (M)is.readObject();
if (m == null) {
break;
}
list.add(m);
}
is.close();
bis.close();
}
} catch (Exception e) {
// e.printStackTrace();
} finally {
is.close();
bis.close();
}
return list;
} @SuppressWarnings("unchecked")
@Override
public byte[] serialize(Object value) {
if (value == null)
throw new NullPointerException("Can't serialize null"); List<M> values = (List<M>) value;
byte[] results = null;
ByteArrayOutputStream bos = null;
ObjectOutputStream os = null; try {
bos = new ByteArrayOutputStream();
os = new ObjectOutputStream(bos);
for (M m : values) {
os.writeObject(m);
}
results = bos.toByteArray();
os.close();
bos.close();
} catch (IOException e) {
throw new IllegalArgumentException("Non-serializable object", e);
} finally {
close(os);
close(bos);
}
return results;
}
}

现在,就可以用序列化的方式存储对象或集合了:

try {
Jedis jedis = new Jedis();
List<SystemNotice> noticeList = systemNoticeManager.listQuery(noticeQModel);
if(noticeList.size()>0 && noticeList != null){
ListTranscoder<SystemNotice> listTranscoder = new ListTranscoder<SystemNotice>();
jedis.set(loginUser.getId().getBytes(), listTranscoder.serialize(noticeList));
}
} catch (Exception e) {
//如果缓存连不上,则不处理
System.out.println("登录无法更新该用户缓存");
}

存的key使用用户id,所以取出list就很简单了:

try {
Jedis jedis = new Jedis();
byte[] list = jedis.get(loginUser.getId().getBytes());
ListTranscoder<SystemNotice> listTranscoder = new ListTranscoder<SystemNotice>();
List<SystemNotice> newList = listTranscoder.deserialize(list);try {
  responseJson(JsonTools.toJsonStr(newList), response);
} catch (IOException e) {
e.printStackTrace();
}
}

至此,redis在java项目中的使用就到此结束了。关于redis的其他命令,可以自己去百度下。

redis在java项目中的使用的更多相关文章

  1. Redis学习笔记之二 :在Java项目中使用Redis

    成功配置redis之后,便来学习使用redis.首先了解下redis的数据类型. Redis的数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set( ...

  2. Redis(十四)Redis 在Java Web 中的应用

    在传统的 Java Web 项目中,使用数据库进行存储数据,但是有一些致命的弊端,这些弊端主要来自于性能方面. 由于数据库持久化数据主要是面向磁盘,而磁盘的读/写比较慢,在一般管理系统中,由于不存在高 ...

  3. 实战派 | Java项目中玩转Redis6.0客户端缓存!

    原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 哈喽大家好啊,我是Hydra. 在前面的文章中,我们介绍了Redis6.0中的新特性客户端缓存client-side caching,通过tel ...

  4. eclipse java项目中明明引入了jar包 为什么项目启动的时候不能找到jar包 项目中已经 引入了 com.branchitech.app 包 ,但时tomcat启动的时候还是报错? java.lang.ClassNotFoundException: com.branchitech.app.startup.AppStartupContextListener java.lang.ClassN

    eclipse java项目中明明引入了jar包 为什么项目启动的时候不能找到jar包 项目中已经 引入了 com.branchitech.app 包 ,但时tomcat启动的时候还是报错?java. ...

  5. java项目中build path的设置

    右键点击项目新建文件libs 添加jtds  jar包引用本地动态链接库(dll)的设置方法 配置LibraryJRE的添加和更换  Java项目中build path的设置总结,包括JRE的添加和更 ...

  6. 在Java项目中整合Scala

    Scala是一个运行在Java JVM上的面向对象的语言.它支持函数编程,在语法上比Java更加灵活,同时通过Akka库,Scala支持强大的基于Actor的多线程编程.具有这些优势,使得我最近很想在 ...

  7. XML在JAVA项目中的作用

    java项目中,xml文件一般都是用来存储一些配置信息 一般的编程, 多数用来存储配置信息 . 拿JDBC来说,可以把数据库连接字符串写到xml,如果要修改数据源,只需要改xml就可以了,没必要再去重 ...

  8. ckeditor编辑器在java项目中配置

    一.基本使用: 1.所需文件架包 A. Ckeditor基本文件包,比如:ckeditor_3.6.2.zip 下载地址:http://ckeditor.com/download 2.配置使用 A.将 ...

  9. SuperDiamond在JAVA项目中的三种应用方法实践总结

    SuperDiamond在JAVA项目中的三种应用方法实践总结 1.直接读取如下: @Test public static void test_simple(){ PropertiesConfigur ...

随机推荐

  1. Andrew Ng Machine learning Introduction

    1. 机器学习的定义:Machine learning is programming computers to optimize a performance criterion(优化性能标准) usi ...

  2. Largest Submatrix(动态规划)

    Largest Submatrix Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  3. Lua学习2 Lua小框架的搭建

    看了上一篇Lua环境搭建具体http://blog.csdn.net/liuwumiyuhuiping/article/details/9196435 为了方便学习. 具体新开始搭建一下学习的小框架. ...

  4. .Net C# ASP.Net和ADO.Net

    1.NET是一个平台,一个抽象的平台的概念. .NET平台其本身实现的方式其实还是库,抽象层面上来看是一个平台. .NET Framework包括两个关键组成元素: a.Common Language ...

  5. C#文件压缩

    /// <summary> /// 文件压缩 /// </summary> /// <param name="filesUrl">多个文件路径& ...

  6. 怎样在UICollectionView中添加Header和footer

    ---恢复内容开始--- 怎样在UICollectionView中添加Header和footer 转载于http://my.oschina.net/zboy/blog/221525 摘要 来自-htt ...

  7. C++_知识点_结构体/枚举/联合

    //C++中结构体的不同之处 #include <iostream> #include <string> using namespace std; int main(void) ...

  8. Oracle游标

    转自:http://www.cnblogs.com/fjfzhkb/archive/2007/09/12/891031.html 游标-----内存中的一块区域,存放的是select 的结果      ...

  9. R与数据分析旧笔记(四)画地图练习

    > library(maps) > library(geosphere) 载入需要的程辑包:sp > map("state")#画美国地图 > map(&q ...

  10. 【LeetCode题意分析&解答】37. Sudoku Solver

    Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by th ...