使用Redis数据库(2)(三十四)
除了String类型,实战中我们还经常会在Redis中存储对象,这时候我们就会想是否可以使用类似RedisTemplate<String, User>
来初始化并进行操作。但是Spring Boot并不支持直接使用,需要我们自己实现RedisSerializer<T>
接口来对传入对象进行序列化和反序列化,下面我们通过一个实例来完成对象的读写操作。
- 创建要存储的对象:User
123456789101112131415
public
class
User
implements
Serializable {
private
static
final
long
serialVersionUID = -1L;
private
String username;
private
Integer age;
public
User(String username, Integer age) {
this
.username = username;
this
.age = age;
}
// 省略getter和setter
}
- 实现对象的序列化接口
123456789101112131415161718192021222324252627282930313233343536
public
class
RedisObjectSerializer
implements
RedisSerializer<Object> {
private
Converter<Object,
byte
[]> serializer =
new
SerializingConverter();
private
Converter<
byte
[], Object> deserializer =
new
DeserializingConverter();
static
final
byte
[] EMPTY_ARRAY =
new
byte
[
0
];
public
Object deserialize(
byte
[] bytes) {
if
(isEmpty(bytes)) {
return
null
;
}
try
{
return
deserializer.convert(bytes);
}
catch
(Exception ex) {
throw
new
SerializationException(
"Cannot deserialize"
, ex);
}
}
public
byte
[] serialize(Object object) {
if
(object ==
null
) {
return
EMPTY_ARRAY;
}
try
{
return
serializer.convert(object);
}
catch
(Exception ex) {
return
EMPTY_ARRAY;
}
}
private
boolean
isEmpty(
byte
[] data) {
return
(data ==
null
|| data.length ==
0
);
}
}
- 配置针对User的RedisTemplate实例
1234567891011121314151617181920
@Configuration
public
class
RedisConfig {
@Bean
JedisConnectionFactory jedisConnectionFactory() {
return
new
JedisConnectionFactory();
}
@Bean
public
RedisTemplate<String, User> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, User> template =
new
RedisTemplate<String, User>();
template.setConnectionFactory(jedisConnectionFactory());
template.setKeySerializer(
new
StringRedisSerializer());
template.setValueSerializer(
new
RedisObjectSerializer());
return
template;
}
}
- 完成了配置工作后,编写测试用例实验效果
123456789101112131415161718192021222324252627
@RunWith
(SpringJUnit4ClassRunner.
class
)
@SpringApplicationConfiguration
(Application.
class
)
public
class
ApplicationTests {
@Autowired
private
RedisTemplate<String, User> redisTemplate;
@Test
public
void
test()
throws
Exception {
// 保存对象
User user =
new
User(
"超人"
,
20
);
redisTemplate.opsForValue().set(user.getUsername(), user);
user =
new
User(
"蝙蝠侠"
,
30
);
redisTemplate.opsForValue().set(user.getUsername(), user);
user =
new
User(
"蜘蛛侠"
,
40
);
redisTemplate.opsForValue().set(user.getUsername(), user);
Assert.assertEquals(
20
, redisTemplate.opsForValue().get(
"超人"
).getAge().longValue());
Assert.assertEquals(
30
, redisTemplate.opsForValue().get(
"蝙蝠侠"
).getAge().longValue());
Assert.assertEquals(
40
, redisTemplate.opsForValue().get(
"蜘蛛侠"
).getAge().longValue());
}
}
当然spring-data-redis中提供的数据操作远不止这些,本文仅作为在Spring Boot中使用redis时的配置参考,更多对于redis的操作使用,请参考Spring-data-redis Reference。
使用Redis数据库(2)(三十四)的更多相关文章
- spring boot 常见三十四问
Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一名 Spring Boot 的专家. 问题一 Spring Boot.Spring MVC 和 Spring 有什么区别 ...
- FreeSql (三十四)CodeFirst 迁移说明
FreeSql 支持 CodeFirst 迁移结构至数据库,这应该是(O/RM)必须标配的一个功能. 与其他(O/RM)不同FreeSql支持更多的数据库特性,而不只是支持基础的数据类型,这既是优点也 ...
- COJ966 WZJ的数据结构(负三十四)
WZJ的数据结构(负三十四) 难度级别:C: 运行时间限制:20000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给一棵n个节点的树,请对于形如"u ...
- NeHe OpenGL教程 第三十四课:地形
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- JAVA之旅(三十四)——自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫
JAVA之旅(三十四)--自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫 我们接着来说网络编程,TCP 一.自定义服务端 我们直接写一个服务端,让本机去连接 ...
- Java进阶(三十四)Integer与int的种种比较你知道多少?
Java进阶(三十四)Integer与int的种种比较你知道多少? 前言 如果面试官问Integer与int的区别:估计大多数人只会说到两点:Ingeter是int的包装类,注意是一个类:int的初值 ...
- Gradle 1.12用户指南翻译——第三十四章. JaCoCo 插件
本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- SQL注入之Sqli-labs系列第三十四关(基于宽字符逃逸POST注入)和三十五关
开始挑战第三十四关和第三十五关(Bypass add addslashes) 0x1查看源码 本关是post型的注入漏洞,同样的也是将post过来的内容进行了 ' \ 的处理. if(isset($_ ...
- “全栈2019”Java多线程第三十四章:超时自动唤醒被等待的线程
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- 第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息
第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息 crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻rul地址 有多 ...
随机推荐
- JS字典 Dictionary类
字典 Dictionary类 /*字典 Dictionary类*/ function Dictionary() { this.add = add; this.datastore = new Array ...
- 字符串函数 mysql 和sqlserver 中对于字符串的常用函数和区别
1. 对于字符串大小写的统一 mysql和sqlserver中都有同名函数lower()和upper(),但是mysql中还有另外一对函数,达到同样的目的,lcase()和ucase(),也就是英文中 ...
- 设计模式(五)Builder Pattern建造者模式
在我们日常生活中,如构建一个飞船,一个手机,一栋建筑,都会有非常复杂的组装,这时候应该用到建造者模式 以建造一个飞船为例 案例:造小页飞船 1.飞船各部分元件 package com.littlepa ...
- linux例行性任务(定时作业)
linux定时作业(例行性任务) linux有两种定时作业方式: • at : 这个工作仅执行一次就从 Linux 系统中的排程中取消: • cron : 这个工作将持续例行性的作下去! at仅执行一 ...
- MySQL学习(六)
1 注意 select cout(*) from 表名: 查询的就是绝对的行数,哪怕某一列所有字段全部为NULL,也计算在内.而select cout(列名) form 表名:查询的是该列不为null ...
- easyUI tree 自定义图标
文章转载自: https://blog.csdn.net/zhlantian/article/details/52913115 近期由于项目中需要使用easyui tree树形列表,并在系统中动态配置 ...
- SVN下载项目导入到eclipse中出现错误解决办法:
首先要确定settings.xml配置路径正确 (下面是我自己的路径,设置自己的路径) 用客户端暴力解决方法: 1)把本地中工作空间中内容删除重新下载 2)导入到eclipse中 会出现一些问题 右键 ...
- lua --- 函数的可变参数
主要掌握: 1>虚变量 --- 一个下划线 2>lua将函数的可变参数放在一个叫 arg 的表中,除了参数以外,arg表中还有一个域n表示参数的个数. do function fun(x, ...
- 图片路径转base64字节码
package product; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOE ...
- ubuntu 安装 firefox 的 jre plugin
https://www.java.com/en/download/help/enable_browser_ubuntu.xml Mozilla Firefox Become the root user ...