使用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. Python那些事

    Python这几年很火,在这里我用问答的方式来总结一下使用python的一些常见问题,对自己是个总结,也希望对有同样问题的朋友有帮助.   Q:Python为什么流行? A:Python是一个比较方便 ...

  2. Using CLEAR_BLOCK To Prevent Save Confirmation Dialogs In Oracle Forms

    Clear_Block built-in clears all records from the current data block and if the user had made some ch ...

  3. ORACLE中SID和SERVICE_NAME的区别

      先来讲一个小故事,2015年6月份,有个客户迁移了数据库,由单实例数据库变成了RAC.JAVA应用程序出现了无法连接数据库的情况,但是PL/SQL能连接上数据库.由于项目比较庞大,虽然在半夜切换的 ...

  4. 规划设计系列3 | SketchUp+实景三维,方案现状一起看

    将SketchUp中建立的模型与实景三维模型进行集成,既可以充分发挥实景三维在地理空间记录方面的优势,又可以去除SketchUp在周边环境设计上的不足. 同时借助Wish3D Earth丰富的场景浏览 ...

  5. 优化算法——拟牛顿法之L-BFGS算法

    一.BFGS算法 在"优化算法--拟牛顿法之BFGS算法"中,我们得到了BFGS算法的校正公式: 利用Sherman-Morrison公式可对上式进行变换,得到 令,则得到: 二. ...

  6. BEGINNING SHAREPOINT&#174; 2013 DEVELOPMENT 第9章节--client对象模型和REST APIs概览 client对象模型(CSOM)基础

    BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第9章节--client对象模型和REST APIs概览  client对象模型(CSOM)基础         在SP2 ...

  7. 手动脱Mole Box壳实战总结

    作者:Fly2015 这个程序是吾爱破解脱壳练习第8期的加壳程序,该程序的壳是MoleBox V2.6.5壳,这些都是广告,能够直接无视了.前面的博客手动脱Mole Box V2.6.5壳实战中已经给 ...

  8. mongodb模拟生产环境的分片集群

       分片是指数据拆分 将其分散在不同的机器上的过程,有时候也叫分区来表示这个概念.将数据分散到不同机器上 不需要功能强大的计算机就可以储存更多的数据,处理更大的负载.        几乎所有的数据库 ...

  9. vue2.0 引用qrcode.js实现获取改变二维码的样式

    vue代码 <template> <div class="qart"> <div id="qrcode" ref="qr ...

  10. 《C陷阱与缺陷》学习笔记(一)

    前言和导读 "得心应手的工具在初学时的困难程度往往超过那些easy上手的工具."比較认同这句话. 我至今认为自己事实上还是个刚入了门的刚開始学习的人. 第一章 "词法&q ...