javascript
redis存储java对象存储_Spring-Data-Redis存储对象(redisTemplate)
先看實例:
...
@Autowired
RedisTemplate redisTemplate;
public void testGetUserByName(){
User user = new User();
user.setUserName("用戶1");
redisTemplate.opsForValue().set("user1", user);
Assert.assertEquals(user.getUserName(), ((User) jedisClient.get("user1")).getUserName());
}
//User已經(jīng)實現(xiàn)了Serializable接口
//配置的是org.springframework.data.redis.serializer.StringRedisSerializer
...
使用StringRedisSerializer直接緩存Object會出現(xiàn)轉(zhuǎn)換錯誤:
java.lang.ClassCastException: dev.entity.User cannot be cast to java.lang.String
at org.springframework.data.redis.serializer.StringRedisSerializer.serialize(StringRedisSerializer.java:32)
at org.springframework.data.redis.core.AbstractOperations.rawValue(AbstractOperations.java:112)
at org.springframework.data.redis.core.DefaultValueOperations.set(DefaultValueOperations.java:168)
at dev.dao.RedisTest.testGetUserByName(RedisTest.java:22)
...
解決方法
StringRedisTemplate相當于RedisTemplate的實現(xiàn)。
緩存時需要把Object類轉(zhuǎn)為byte[]再存到redis中,反之要從redis中獲取byte[]再轉(zhuǎn)成Object。
看了很多人的實現(xiàn)方法,感覺這個實現(xiàn)最優(yōu)雅便捷。最主要的轉(zhuǎn)換代碼如下:
/**
* 描述 : .
*
*
*
*
* @param bytes
* @return
*/
private Object toObject(byte[] bytes) {
Object obj = null;
try {
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bis);
obj = ois.readObject();
ois.close();
bis.close();
} catch (IOException ex) {
ex.printStackTrace();
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
return obj;
}
private byte[] toByteArray(Object obj) {
byte[] bytes = null;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(obj);
oos.flush();
bytes = bos.toByteArray();
oos.close();
bos.close();
} catch (IOException ex) {
ex.printStackTrace();
}
return bytes;
}
}
相當于封裝了一個處理Object緩存的類,之后用這個類與redis做交流。
package dev.dao;
import dev.cache.JedisClient;
import dev.entity.User;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:/spring/spring-redis.xml")
public class RedisTest {
@Autowired
JedisClient jedisClient;
@Test
public void testGetUserByName(){
User user = new User();
user.setUserName("用戶1");
jedisClient.put("user1", user);
Assert.assertEquals(user.getUserName(), ((User) jedisClient.get("user1")).getUserName());
}
}
//測試成功
總結(jié)
以上是生活随笔為你收集整理的redis存储java对象存储_Spring-Data-Redis存储对象(redisTemplate)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python的高级函数_Python的高
- 下一篇: java 内部类异常_Java笔记(三