使用RedisTemplate来对对象、String等做缓存处理

  首先定义一个对象并重写toString方法

public class UserInfo implements Serializable{

    private int id;

    private String name;

    private String password;

    private String salt;

    private String role;

    public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public String getSalt() {
return salt;
} public void setSalt(String salt) {
this.salt = salt;
} public String getRole() {
return role;
} public void setRole(String role) {
this.role = role;
} @Override
public String toString(){
return "name="+name+", password="+password+", salt="+salt+", role="+role;
}
}
  自定义RedisConfig文件,自定义RedisTemplate,设定相应的序列化方式 Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport{
public RedisConfig() {
super();
} @Bean
public CacheManager cacheManager(RedisTemplate<?,?> redisTemplate) {
RedisCacheManager rcm = new RedisCacheManager(redisTemplate);
return rcm;
} @Override
public KeyGenerator keyGenerator() {
KeyGenerator keyGenerator = new KeyGenerator() {
@Override
public Object generate(Object o, Method method, Object... objects) {
StringBuilder sb = new StringBuilder();
sb.append(o.getClass().getName());
sb.append(method.getName());
for (Object obj : objects) {
sb.append(obj.toString());
}
return sb.toString();
}
};
return keyGenerator;
} @Override
public CacheResolver cacheResolver() {
return super.cacheResolver();
} @Override
public CacheErrorHandler errorHandler() {
return super.errorHandler();
} /**
* redis 序列化策略 ,通常情况下key值采用String序列化策略
* StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。StringRedisSerializer
* RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。JdkSerializationRedisSerializer
* @param factory
* @return
*/
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory factory){
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(factory); // 使用Jackson2JsonRedisSerialize 替换默认序列化
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om); //设置value的序列化方式
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
//设置key的序列化方式
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet(); return redisTemplate; } }

  对各种RedisTemplate进行操作测试

 @Test
public void getUser() throws Exception {
UserInfo userInfo = new UserInfo();
userInfo.setId(4);
userInfo.setName("1");
userInfo.setSalt("1");
userInfo.setRole("1");
userInfo.setPassword("1");
UserInfo userInfo1 = new UserInfo();
userInfo.setId(6);
userInfo1.setName("2");
userInfo1.setSalt("2");
userInfo1.setRole("2");
userInfo1.setPassword("2");
ArrayList<UserInfo> list = new ArrayList<>();
list.add(userInfo);
list.add(userInfo1); //redis 基本的key value
ValueOperations<String, UserInfo> valueOperations = redisTemplate.opsForValue();
valueOperations.set(String.valueOf(17), userInfo); /**
* ["java.util.ArrayList",[["com.redistest.domain.UserInfo",{"id":6,"name":"1","password":"1","salt":"1","role":"1"}],["com.redistest.domain.UserInfo",{"id":0,"name":"2","password":"2","salt":"2","role":"2"}]]]
*/
//redis list对象保存, 会存bean的名字
ValueOperations<String, List> valueOperations1 = redisTemplate.opsForValue();
valueOperations1.set(String.valueOf(18), list); //redisTemplate.setDefaultSerializer(new Jackson2JsonRedisSerializer<UserInfo>(UserInfo.class)); //如果用Jackson2JsonRedisSerializer ,存储的有bean的名字,则能直接转换为相应的对象,不需要再做转换
//如果存储的string里面没有bean的名字则返回的arrayList里面是 LinkedHasMap, 需要用Jsos转为String再转为Bean
ArrayList<UserInfo> arrayList = (ArrayList<UserInfo>) redisTemplate.opsForValue().get(18+"");
for (UserInfo o :arrayList){
// JSONObject userInfo = JSONObject.parseObject(JSONObject.toJSONString(o));
// UserInfo userInfo1 = userInfo.toJavaObject(UserInfo.class);
System.out.println(o.toString());
} // redisTemplate.opsForValue();
// Object o = redisTemplate.opsForValue().get(6+"");
// redisTestController.getUser(6);
}

  不适用RedisTemplate的序列化方式,使用fastJson首先对对象转换为相应的String再进行存储


@Test
public void testGson(){
UserInfo userInfo = new UserInfo();
userInfo.setPassword("g");
userInfo.setRole("g");
userInfo.setName("g");
userInfo.setSalt("g");
userInfo.setId(1);
//将java的bean作为一个json的字符串存储到redis中
String str = JSONObject.toJSONString(userInfo);
redisTemplate.opsForValue().set("g", str); //取出redis的string,转换为UserInfo bean
String s = (String) redisTemplate.opsForValue().get("g");
UserInfo userInfo1 = JSONObject.parseObject(s).toJavaObject(UserInfo.class);
System.out.println(userInfo1.toString()); }

使用RedisTemplate。fastJson 来对ArrayList对象进行存储

 @Test
public void testGson(){
UserInfo userInfo = new UserInfo();
userInfo.setPassword("g");
userInfo.setRole("g");
userInfo.setName("g");
userInfo.setSalt("g");
userInfo.setId(1);
//将java的bean作为一个json的字符串存储到redis中
String str = JSONObject.toJSONString(userInfo);
redisTemplate.opsForValue().set("g", str); //取出redis的string,转换为UserInfo bean
String s = (String) redisTemplate.opsForValue().get("g");
UserInfo userInfo1 = JSONObject.parseObject(s).toJavaObject(UserInfo.class);
System.out.println(userInfo1.toString()); //测试arrayList对象
ArrayList<UserInfo> arrayList = new ArrayList<>();
UserInfo userInfo2 = new UserInfo();
userInfo2.setPassword("gg");
userInfo2.setRole("ggg");
userInfo2.setName("gg");
userInfo2.setSalt("ggg");
userInfo2.setId(2);
arrayList.add(userInfo);
arrayList.add(userInfo1);
arrayList.add(userInfo2);
String s1 = JSON.toJSONString(arrayList);
redisTemplate.opsForValue().set("gg", s1);
//测试取出对象
String ss = (String) redisTemplate.opsForValue().get("gg");
System.out.println("存储的原始的String字符串");
//[{"id":1,"name":"g","password":"g","role":"g","salt":"g"},{"id":1,"name":"g","password":"g","role":"g","salt":"g"},{"id":2,"name":"gg","password":"gg","role":"ggg","salt":"ggg"}]
System.out.println(ss);
ArrayList<UserInfo> arrayList1 = JSON.parseObject(ss, new TypeReference<ArrayList<UserInfo>>(){}); System.out.println("转换后单个UserInfo");
for (UserInfo userInfo3 : arrayList1){
System.out.println(userInfo3.toString());
}
//ArrayList<UserInfo> arrayList1 = JSONObject.parseObject(ss); }

以下使用FastJson的GenericFastJsonRedisSerializer 对RedisTemplate序列化

//使用fastJson作为默认的序列化方式
GenericFastJsonRedisSerializer genericFastJsonRedisSerializer = new GenericFastJsonRedisSerializer();
redisTemplate.setDefaultSerializer(genericFastJsonRedisSerializer);
 @Test
public void testFastJsonSerializer(){
UserInfo userInfo = new UserInfo();
userInfo.setId(4);
userInfo.setName("1");
userInfo.setSalt("1");
userInfo.setRole("1");
userInfo.setPassword("1");
redisTemplate.opsForValue().set("121", userInfo);
//存储到redis的数据将bean的名字作为一个type存储
/**
* {
"@type": "com.redistest.domain.UserInfo",
"id": 4,
"name": "1",
"password": "1",
"role": "1",
"salt": "1"
}
*/
System.out.println("获取输出");
UserInfo userInfo1 = (UserInfo) redisTemplate.opsForValue().get("121");
System.out.println(userInfo1.toString()); //测试list
/**
* [
{
"@type": "com.redistest.domain.UserInfo",
"id": 4,
"name": "1",
"password": "1",
"role": "1",
"salt": "1"
},
{
"@type": "com.redistest.domain.UserInfo",
"id": 4,
"name": "1",
"password": "1",
"role": "1",
"salt": "1"
}
]
*/
ArrayList<UserInfo> arrayList1 = new ArrayList<>();
arrayList1.add(userInfo);
arrayList1.add(userInfo1);
redisTemplate.opsForValue().set("1212", arrayList1);
System.out.println("获取arrayList输出");
JSONArray jsonArray = (JSONArray) redisTemplate.opsForValue().get("1212");
ArrayList<UserInfo> arrayList11 = jsonArray.toJavaObject(new TypeReference<ArrayList<UserInfo>>(){});
for (UserInfo userInfo2 : arrayList11){
System.out.println(userInfo2);
} }

  

spring-data-redis RedisTemplate操作的更多相关文章

  1. spring data redis RedisTemplate操作redis相关用法

    http://blog.mkfree.com/posts/515835d1975a30cc561dc35d spring-data-redis API:http://docs.spring.io/sp ...

  2. spring mvc Spring Data Redis RedisTemplate [转]

    http://maven.springframework.org/release/org/springframework/data/spring-data-redis/(spring-data包下载) ...

  3. Spring Data Redis简介以及项目Demo,RedisTemplate和 Serializer详解

    一.概念简介: Redis: Redis是一款开源的Key-Value数据库,运行在内存中,由ANSI C编写,详细的信息在Redis官网上面有,因为我自己通过google等各种渠道去学习Redis, ...

  4. Spring Data Redis入门示例:字符串操作(六)

    Spring Data Redis对字符串的操作,封装在了ValueOperations和BoundValueOperations中,在集成好了SPD之后,在需要的地方引入: // 注入模板操作实例 ...

  5. Spring Boot使用Spring Data Redis操作Redis(单机/集群)

    说明:Spring Boot简化了Spring Data Redis的引入,只要引入spring-boot-starter-data-redis之后会自动下载相应的Spring Data Redis和 ...

  6. 使用Spring Data Redis操作Redis(集群版)

    说明:请注意Spring Data Redis的版本以及Spring的版本!最新版本的Spring Data Redis已经去除Jedis的依赖包,需要自行引入,这个是个坑点.并且会与一些低版本的Sp ...

  7. 使用Spring Data Redis操作Redis(单机版)

    说明:请注意Spring Data Redis的版本以及Spring的版本!最新版本的Spring Data Redis已经去除Jedis的依赖包,需要自行引入,这个是个坑点.并且会与一些低版本的Sp ...

  8. Spring Data Redis入门示例:Hash操作(七)

    将对象存为Redis中的hash类型,可以有两种方式,将每个对象实例作为一个hash进行存储,则实例的每个属性作为hash的field:同种类型的对象实例存储为一个hash,每个实例分配一个field ...

  9. spring data redis 理解

    前言 Spring Data Redis project,应用了Spring概念来开发使用键值形式的数据存储的解决方案.我们(官方)提供了一个 "template" ,这是一个高级 ...

  10. Spring Data Redis 详解及实战一文搞定

    SDR - Spring Data Redis的简称. Spring Data Redis提供了从Spring应用程序轻松配置和访问Redis的功能.它提供了与商店互动的低级别和高级别抽象,使用户免受 ...

随机推荐

  1. Visual Studio开启SSL的支持

    前提: 请确保已经安装了IIS Express 具体操作: 1.web项目->[右键]->[使用IIS Express]转换工程的Web服务器. 2.点击web项目,按[ctrl]+[w] ...

  2. 鸟哥的linux私房菜服务器架设篇之准备工作和网络基础

    架设服务器的基本功课 1基础网络的基本概念,以方便进行联网和设定及除错 2熟悉操作系统的简易操作:包括登录分析,账号管理,文本编辑器的使用等等的技巧 3信息安全方面:包括防火墙与软件更新方面的相关知识 ...

  3. glsl镜面水倒影的实现[转]

    http://blog.sina.com.cn/s/blog_78ea87380101ejbf.html 使用两相机,一个master相机, 主要负责场景的渲染, 另一个rtt相机, 和master相 ...

  4. 亿图图示专家V7破解版

    “破解文件”目录下的三个文件拷贝出来复制到安装目录下即可: 下载链接地址: http://cloud.suning.com/cloud-web/share/link.htm?sk=718100ef90 ...

  5. 2016.7.12 去除mybatis-generator生成的class里的注释

    用mybatis-generator自动生成代码会出现很多没必要的注释.     在配置文件里加上: 是否去除所有自动生成的文件的时间戳: 是否去除所有自动生成文件的注释: <commentGe ...

  6. Notification(二)——PendingIntent的flag导致数据同样的问题

    MainActivity例如以下: package cc.cu; import android.os.Bundle; import android.view.View; import android. ...

  7. UVA12096 - The SetStack Computer(set + map映射)

    UVA12096 - The SetStack Computer(set + map映射) 题目链接 题目大意:有五个动作: push : 把一个空集合{}放到栈顶. dup : 把栈顶的集合取出来, ...

  8. 【Python】切片

    处理Python的部分元素,称之为切片. 创建切片 指定要是用的第一个元素和最后一个元素的索引,与range()函数一样,Python在到达你指定的第二个索引前面的元素后停止. 先定义一个列表vege ...

  9. jenkins构建一个go项目

    Jenkins安装   最低配置: 不少于256M内存,不低于1G磁盘,jdk版本>=8 安装jdk1.8 yum install -y java-1.8.0-openjdk wget -O / ...

  10. setTimeout()基础/setInterval()基础

    JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成.它们向任务队列添加定时任务.初始接触它的人都觉得好简单 ...