博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring-Data-Redis存储对象(redisTemplate)
阅读量:6451 次
发布时间:2019-06-23

本文共 5395 字,大约阅读时间需要 17 分钟。

hot3.png

先给出配置,由于版本不同jedis的api不同,这里比较坑人,常常发生错误无从下手,如果是maven项目还好查看源码,如果是web项目那么就很麻烦,

redis.clients
jedis
2.0.0
org.springframework.data
spring-data-redis
1.0.0.RELEASE

整个目录结构,

204843_A7U4_555061.png

然后给出本人利用spring-data-redis封装的redis操作工具,原理就是对象转byte[],然后利用spring-data-redis进行存储,所以save形式为key(String->byte[])-value(Object->byte[]),get形式为key(byte[]->String)-value(byte[]->Object)

package com.zhxjz.framework.util.redis;import java.io.Serializable;import org.springframework.dao.DataAccessException;import org.springframework.data.redis.connection.RedisConnection;import org.springframework.data.redis.core.RedisCallback;import org.springframework.data.redis.core.RedisTemplate;import com.zhxjz.framework.util.ApplicationContextUtil;import com.zhxjz.framework.util.common.SerializeUtil;public class SpringRedisUtil {	@SuppressWarnings("unchecked")	private static RedisTemplate
 redisTemplate =  (RedisTemplate
) ApplicationContextUtil .getBean("redisTemplate"); public static void save(final String key, Object value) { final byte[] vbytes = SerializeUtil.serialize(value); redisTemplate.execute(new RedisCallback
() { @Override public Object doInRedis(RedisConnection connection) throws DataAccessException { connection.set(redisTemplate.getStringSerializer().serialize(key), vbytes); return null; } }); } public static 
 T get(final String key, Class
 elementType) { return redisTemplate.execute(new RedisCallback
() { @Override public T doInRedis(RedisConnection connection) throws DataAccessException { byte[] keybytes = redisTemplate.getStringSerializer().serialize(key); if (connection.exists(keybytes)) { byte[] valuebytes = connection.get(keybytes); @SuppressWarnings("unchecked") T value = (T) SerializeUtil.unserialize(valuebytes); return value; } return null; } }); }}

其中用到ApplicationContextUtil和SerializeUtil另外2个工具,

package com.zhxjz.framework.util;import org.springframework.beans.BeansException;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;import org.springframework.stereotype.Component;@Componentpublic class ApplicationContextUtil implements ApplicationContextAware {	private static ApplicationContext context;	@Override	public void setApplicationContext(ApplicationContext context) throws BeansException {		ApplicationContextUtil.context = context;	}	public static ApplicationContext getContext() {		return context;	}	public static Object getBean(String beanName) {		return context.getBean(beanName);	}}
package com.zhxjz.framework.util.common;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;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) {			throw new RuntimeException(e.getMessage(), e);		}	}	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) {			throw new RuntimeException(e.getMessage(), e);		}	}}

然后再给出SpringRedis.xml配置,

记得<import resource="classpath:/SpringRedis.xml" />

下面是redis.properties

#redis configredis.pool.maxActive=100redis.pool.maxIdle=20redis.pool.maxWait=1000redis.pool.testOnBorrow=trueredis.hostname=127.0.0.1redis.port=6379redis.password=

记得注册这个properties文件到PropertyPlaceholderConfigurer

用法:

写一个Controller进行测试:

package com.zhxjz.controller.testredis;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import com.zhxjz.framework.util.redis.SpringRedisUtil;import com.zhxjz.model.testredis.TESTREDIS;@Controller@RequestMapping("/testredis")public class TESTREDISController {		@RequestMapping("/test.do")	@ResponseBody	public String test(TESTREDIS testredis) {		SpringRedisUtil.save("mystr", testredis);		return SpringRedisUtil.get("mystr", TESTREDIS.class).toString();	}	}

最后把model都给出来

package com.zhxjz.model.testredis;public class TESTREDIS implements java.io.Serializable {	private static final long serialVersionUID = 1L;	String testStr;	int testInt;	boolean testBool;	public String getTestStr() {		return testStr;	}	public void setTestStr(String testStr) {		this.testStr = testStr;	}	public int getTestInt() {		return testInt;	}	public void setTestInt(int testInt) {		this.testInt = testInt;	}	public boolean isTestBool() {		return testBool;	}	public void setTestBool(boolean testBool) {		this.testBool = testBool;	}	public String toString() {		return this.testStr + "|" + this.testInt + "|" + this.testBool;	}}

访问:

205149_viZq_555061.png

查看client:

205304_cFsQ_555061.png

注意:

由于model需要转换为byte[],这里要求model必须implements java.io.Serializable,否则会报错。

转载于:https://my.oschina.net/u/555061/blog/504658

你可能感兴趣的文章
Shell编程学习总结
查看>>
070、如何定制Calico 网络policy(2019-04-15 周一)
查看>>
构建之法阅读笔记02
查看>>
Webstorm常用快捷键备忘
查看>>
js滚动加载到底部
查看>>
关于mac远程链接window服务器以及实现共享文件
查看>>
Redis慢查询,redis-cli,redis-benchmark,info
查看>>
Virtualbox 虚拟机网络不通
查看>>
java概念基础笔记整理
查看>>
self parent $this关键字分析--PHP
查看>>
CC_UNUSED_PARAM 宏含义的解释
查看>>
leetcode124二叉树最大路径和
查看>>
AngularJS笔记整理 内置指令与自定义指令
查看>>
shell与正则表达式
查看>>
第三篇:白话tornado源码之请求来了
查看>>
10分钟搞定支付宝和微信支付的各种填坑
查看>>
表示数值的字符串
查看>>
JQUERY AJAX请求
查看>>
html css 伪样式
查看>>
超级账本Fabric区块链用弹珠游戏Marbles 部署
查看>>