spring-data-redis RedisTemplate操作
使用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操作的更多相关文章
- spring data redis RedisTemplate操作redis相关用法
http://blog.mkfree.com/posts/515835d1975a30cc561dc35d spring-data-redis API:http://docs.spring.io/sp ...
- spring mvc Spring Data Redis RedisTemplate [转]
http://maven.springframework.org/release/org/springframework/data/spring-data-redis/(spring-data包下载) ...
- Spring Data Redis简介以及项目Demo,RedisTemplate和 Serializer详解
一.概念简介: Redis: Redis是一款开源的Key-Value数据库,运行在内存中,由ANSI C编写,详细的信息在Redis官网上面有,因为我自己通过google等各种渠道去学习Redis, ...
- Spring Data Redis入门示例:字符串操作(六)
Spring Data Redis对字符串的操作,封装在了ValueOperations和BoundValueOperations中,在集成好了SPD之后,在需要的地方引入: // 注入模板操作实例 ...
- Spring Boot使用Spring Data Redis操作Redis(单机/集群)
说明:Spring Boot简化了Spring Data Redis的引入,只要引入spring-boot-starter-data-redis之后会自动下载相应的Spring Data Redis和 ...
- 使用Spring Data Redis操作Redis(集群版)
说明:请注意Spring Data Redis的版本以及Spring的版本!最新版本的Spring Data Redis已经去除Jedis的依赖包,需要自行引入,这个是个坑点.并且会与一些低版本的Sp ...
- 使用Spring Data Redis操作Redis(单机版)
说明:请注意Spring Data Redis的版本以及Spring的版本!最新版本的Spring Data Redis已经去除Jedis的依赖包,需要自行引入,这个是个坑点.并且会与一些低版本的Sp ...
- Spring Data Redis入门示例:Hash操作(七)
将对象存为Redis中的hash类型,可以有两种方式,将每个对象实例作为一个hash进行存储,则实例的每个属性作为hash的field:同种类型的对象实例存储为一个hash,每个实例分配一个field ...
- spring data redis 理解
前言 Spring Data Redis project,应用了Spring概念来开发使用键值形式的数据存储的解决方案.我们(官方)提供了一个 "template" ,这是一个高级 ...
- Spring Data Redis 详解及实战一文搞定
SDR - Spring Data Redis的简称. Spring Data Redis提供了从Spring应用程序轻松配置和访问Redis的功能.它提供了与商店互动的低级别和高级别抽象,使用户免受 ...
随机推荐
- Iosapp升级版本步骤
1.打开地址https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa,登录进入 2.选择ManageYour App,选中你要升级的那个 ...
- Android内存泄露自动检测神器LeakCanary
经典的面试题: a.怎样在coding过程中避免内存泄露? b.怎样检测内存泄露? 这两个问题我想大部分Android 职位面试时都会被问到吧. 怎样避免就不赘述了,网上很多答案. 工具呢,当然也有很 ...
- DIV相对于父DIV底部对齐的实现方法
代码如下 <style type="text/css"> .box1 {border:1px #cccccc solid; width:500px; height:60 ...
- 【GLSL教程】(七)逐像素的光照 【转】
http://blog.csdn.net/racehorse/article/details/6662540 逐像素的方向光(Directional Light per Pixel) 这一节将把前面的 ...
- MFC 文档视图关系
参考:http://www.360doc.com/content/11/1102/09/3054335_160991088.shtml 写的很详细可以看看 IDC_:控件的ID命名前缀(Control ...
- 关于 Shiro 的权限匹配器和过滤器
项目源码:https://github.com/weimingge14/Shiro-project演示地址:http://liweiblog.duapp.com/Shiro-project/login ...
- 2016.7.12 Table configuration with catalog null, schema public, and table globalpage did not resolve to any tables(疑)
在eclipse中运行mybatis的generator插件时,出现如下错误提示: Generation Warnings Occured:Table configuration with catal ...
- c语言单链表实现
/************************************************************************* > File Name: singleLin ...
- AngularJS的添加操作和列表操作
代码下载:https://files.cnblogs.com/files/xiandedanteng/agsAddList.rar 添加成员页面图示: 添加成员页面代码: <%@ page la ...
- 微信小程序-wxs
你想在页面上使用JavaScript代码吗? 对不起,小程序不支持! 最近,一个项目就有这样的需求,我也就用上了wxs 使用方法很简单: 项目中用的是取小数点2位以及5位 具体请看官方API:WXS