使用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. Mac 奇淫巧技 哈哈

    1. 设置别名 sudo vim ~/.bash_profile alias ll='ls -lhF' alias la='ls -hlAF' alias c='clear' alias rm='ls ...

  2. weblogic的集群与配置图文方法

      一.Weblogic的集群 还记得我们在第五天教程中讲到的关于Tomcat的集群吗? 两个tomcat做node即tomcat1, tomcat2,使用Apache HttpServer做请求派发 ...

  3. java 几个线程池的理解

    http://www.cnblogs.com/dolphin0520/p/3932921.html 这个文章写的很好

  4. 2017.2.13 开涛shiro教程-第十二章-与Spring集成(二)shiro权限注解

    原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. 第十二章-与Spring集成(二)shiro权限注解 shiro注 ...

  5. UNP学习笔记(第十五章 UNIX域协议)

    UNIX域协议是在单个主机上执行客户/服务器通信的一种方法 使用UNIX域套接字有以下3个理由: 1.UNIX域套接字往往比通信两端位于同一个主机的TCP套接字快出一倍 2.UNIX域套接字可用于在同 ...

  6. 【Python】Python中in与not in

    在python中,要判断特定的值是否存在列表中,可使用关键字in,判断特定的值不存在列表中,可使用关键字not in letters = ['A','B','C','D','E','F','G'] i ...

  7. GroupBox与Panel控件

    1.GroupBox控件常常用于逻辑地组合一组控件,如RadioButton 及 CheckBox控件,显示一个框架,其上有一个标题. 2.Panel 可以包含多个控件,以便将这些控件编为一组,以便方 ...

  8. 为什么我们有时不用配置java环境变量?

    答案都在这个图中 完毕,如果还不懂请自行查询注册表相关内容学习.

  9. 笔记本中G-Sensor(加速计) M-Sensor 陀螺仪等传感器的区别

    1.G-sensor重力传感器 作用 G-sensor中文是加速度传感器的意思(英文全称是Accelerometer-sensor),它能够感知到加速力的变化,加速力就是当物体在加速过程中作用在物体上 ...

  10. Hibernate学习一----------Hibernate初实现

    © 版权声明:本文为博主原创文章,转载请注明出处 ORM(Object/Relationship Mapping):对象/关系映射 - 利用面向对象思想编写的数据库应用程序最终都是把对象信息保存在关系 ...