运行环境:

JDK1.7.

SpringBoot1.4.7

redis3.0.4

1.生成Springboot项目,分别添加web,redis依赖,具体的maven依赖如下

      <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

数据源

使用spring的默认配置

在 src/main/resources/application.properties 中配置数据源信息。

 server.context-path=/redis
server.port=9099 # REDIS (RedisProperties)
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=192.168.0.106
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
#Sspring.redis.password=
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.timeout=10

然后我们需要一个配置类,将配置文件与对象进行关联

新建一个RedisConfig类

@Configuration
@EnableAutoConfiguration
public class RedisConfig extends CachingConfigurerSupport {}

通过

@ConfigurationProperties

注解,将属性文件注入进来

@Bean
@ConfigurationProperties(prefix = "spring.redis")
public JedisPoolConfig getRedisConfig() {
JedisPoolConfig config = new JedisPoolConfig();
//System.out.println(config.getMaxWaitMillis());
return config;
}

这里需要注意的是,我们的属性文件并没有全部的注入进来,这里只是配置连接池的属性

我们还需要将redis的host,port等信息也注入进来

 @Autowired
private Environment env; @Bean
@ConfigurationProperties(prefix = "spring.redis")
public JedisConnectionFactory getConnectionFactory() {
JedisConnectionFactory factory = new JedisConnectionFactory();
JedisPoolConfig config = getRedisConfig();
factory.setPoolConfig(config);
factory.setHostName(env.getProperty("spring.redis.host"));
factory.setPort(Integer.parseInt(env.getProperty("spring.redis.port").trim()));
factory.setDatabase(Integer.parseInt(env.getProperty("spring.redis.database").trim()));
logger.info("JedisConnectionFactory bean init success.");
return factory;
}

这样我们的属性信息就都配置好了

我们就要开始连接redis服务器,实现我们的业务了,这里我们先介绍下 RedisTemplate

spring 封装了 RedisTemplate 对象来进行对redis的各种操作,它支持所有的 redis 原生的 api。

RedisTemplate中定义了对5种数据结构操作

 redisTemplate.opsForValue();//操作字符串
redisTemplate.opsForHash();//操作hash
redisTemplate.opsForList();//操作list
redisTemplate.opsForSet();//操作set
redisTemplate.opsForZSet();//操作有序set

StringRedisTemplate与RedisTemplate

  • 两者的关系是StringRedisTemplate继承RedisTemplate。

  • 两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。

  • SDR默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略。

    StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。

    RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。

我们先来写一个简单的例子,来看看RedisTemplate是怎么操作的

还是在RedisConfig类里面

 @Bean
public RedisTemplate<String, ?> getRedisTemplate() {
RedisTemplate<String, ?> template = new RedisTemplate();
template.setConnectionFactory(getConnectionFactory()); return template;
}

然后我们新建一个service类,注入redisTemplate,操作相关的api,将键值对写入到redis服务器

 @Autowired
private RedisTemplate<String, Object> redisTemplate;
public void setKey(Map<String, Map<?, ?>> map) {
ValueOperations<String, Object> opsForValue = redisTemplate.opsForValue();
for (Map.Entry<String, Map<?, ?>> entry : map.entrySet()) {
String jsonStringFromMap = JsonUtils.getJsonStringFromMap(entry.getValue());
opsForValue.set(entry.getKey(), jsonStringFromMap);
}
}

再写一个controller类,注入service

@RequestMapping(value = "set")
public ResponseVo setKey() {
ResponseVo responseVo = new ResponseVo();
try {
Map<String, Map<?, ?>> map = new HashMap<String, Map<?, ?>>();
Map<String, String> map2 = new HashMap<>();
map2.put("value", "2");
map.put("boxUid", map2);
demoService.setKey(map);
responseVo.setInfo("操作成功");
responseVo.setData(map);
} catch (Exception e) {
responseVo.setInfo("操作失败");
responseVo.setData(e.getMessage());
} return responseVo;
}

请求:http://localhost:9099/redis/demo/set

数据就写到redis数据库了。


序列化

RedisTemplate对象默认使用jdkSerializer实现序列化,如果想要更换序列化的实现方式,例如使用json实现value的序列化,可以进行如下配置

 @Bean
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer(ObjectMapper objectMapper) {
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(
Object.class);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
return jackson2JsonRedisSerializer;
} @Bean
RedisTemplate<String, Object> objRedisTemplate(JedisConnectionFactory connectionFactory,
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
redisTemplate.setConnectionFactory(getConnectionFactory());
redisTemplate.setDefaultSerializer(jackson2JsonRedisSerializer);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringRedisSerializer);
redisTemplate.setHashKeySerializer(stringRedisSerializer);
return redisTemplate;
}

redis的value将会以jason形式保存

对象序列化

除了String类型,实战中我们还经常会在Redis中存储对象,这时候我们就会想是否可以使用类似RedisTemplate<String, User>来初始化并进行操作。但是Spring Boot并不支持直接使用,需要我们自己实现RedisSerializer<T>接口来对传入对象进行序列化和反序列化,下面我们通过一个实例来完成对象的读写操作。

  • 创建要存储的对象:User
 public class User implements Serializable {

     /**
*
*/
private static final long serialVersionUID = -8289770787953160443L; private String username;
private Integer age; public User() {
super();
// TODO Auto-generated constructor stub
} public User(String username, Integer age) {
this.username = username;
this.age = age;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} }
  • 实现对象的序列化接口
 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]; @Override
public Object deserialize(byte[] bytes) {
if (isEmpty(bytes)) {
return null;
}
ObjectInputStream oii = null;
ByteArrayInputStream bis = null;
bis = new ByteArrayInputStream(bytes);
try {
oii = new ObjectInputStream(bis);
Object obj = oii.readObject();
return obj;
} catch (Exception e) { e.printStackTrace();
}
return null;
} @Override
public byte[] serialize(Object object) {
if (object == null) {
return EMPTY_ARRAY;
}
ObjectOutputStream obi = null;
ByteArrayOutputStream bai = null;
try {
bai = new ByteArrayOutputStream();
obi = new ObjectOutputStream(bai);
obi.writeObject(object);
byte[] byt = bai.toByteArray();
return byt;
} catch (IOException e) {
e.printStackTrace();
}
return null;
} private boolean isEmpty(byte[] data) {
return (data == null || data.length == 0);
}
}
  • 配置针对User的RedisTemplate实例
@Bean
public RedisTemplate<String, User> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, User> template = new RedisTemplate<String, User>();
template.setConnectionFactory(getConnectionFactory());
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new RedisObjectSerializer());
return template;
}
  • 完成了配置工作后,编写测试用例实验效果
@Autowired
private RedisTemplate<String, User> redisUserTemplate; public void setUser(User user) {
ValueOperations<String, User> opsForValue = redisUserTemplate.opsForValue();
opsForValue.set(user.getUsername(), user);
Integer age = opsForValue.get(user.getUsername()).getAge();
String username = opsForValue.get(user.getUsername()).getUsername();
System.out.println(age + " " + username);
}

最后的结果是会输出年龄和姓名。

源代码

相关示例代码在redisBoot

Springboot+redis 整合的更多相关文章

  1. SpringBoot+Redis整合

    SpringBoot+Redis整合 1.在pom.xml添加Redis依赖 <!--整合Redis--> <dependency> <groupId>org.sp ...

  2. 补习系列(14)-springboot redis 整合-数据读写

    目录 一.简介 二.SpringBoot Redis 读写 A. 引入 spring-data-redis B. 序列化 C. 读写样例 三.方法级缓存 四.连接池 小结 一.简介 在 补习系列(A3 ...

  3. SpringBoot日记——Redis整合

    上一篇文章,简单记录了一下缓存的使用方法,这篇文章将把我们熟悉的redis整合进来. 那么如何去整合呢?首先需要下载和安装,为了使用方便,也可以做环境变量的配置. 下载和安装的方法,之前有介绍,在do ...

  4. springBoot 官方整合的redis 使用教程:(StringRedisTemplate 方式存储 Object类型value)

    前言:最近新项目准备用 redis 简单的缓存 一些查询信息,以便第二次查询效率高一点. 项目框架:springBoot.java.maven  说明:edis存储的数据类型,key一般都是Strin ...

  5. springboot和Redis整合

    springboot简化了许多的配置,大大提高了使用效率.下面介绍一下和Redis整合的一些注意事项. 首先介绍单机版的redis整合. 1.第一步当然是导入依赖 <dependency> ...

  6. redis(七)---- SpringBoot和redis整合

    SpringBoot和Redis整合非常简单 添加pom依赖 <dependency> <groupId>org.springframework.boot</groupI ...

  7. SpringBoot简单整合redis

    Jedis和Lettuce Lettuce 和 Jedis 的定位都是Redis的client,所以他们当然可以直接连接redis server. Jedis在实现上是直接连接的redis serve ...

  8. Redis的安装、基本使用以及与SpringBoot的整合

    1.概述 Redis 是现在很流行的一个 NoSql 数据库,每秒读取可以达到10万次,能够将数据持久化,支持多种数据结构,容灾性强,易扩展,常用于项目的缓存中间件. 今天我们就来聊聊关于Redis的 ...

  9. Redis哨兵机制的实现及与SpringBoot的整合

    1. 概述 前面我们聊过Redis的读写分离机制,这个机制有个致命的弱点,就是主节点(Master)是个单点,如果主节点宕掉,整个Redis的写操作就无法进行服务了. 为了解决这个问题,就需要依靠&q ...

随机推荐

  1. CentOS下安装php的mbstring扩展

    php的mbstring扩展如果没有安装会导致一些问题: 例1:登陆phpMyAdmin的时候会提示没字符串编码和字符串处理库 php_mbstring,有些程序中会用到mb_substr函数没有ph ...

  2. mysql 修改表结构的字段名

    alter table domains  change STATUS  status  tinyint(1)  not null;

  3. OpenCV探索之路(十八):使用imwrite调整保存的图片质量

    近日在用opencv做一些图像处理的操作时,需要对一些高分辨率的图像进行保存.比如,在操作一个容量为230M的图像后,并对该图像保存为JPG格式后,发现图像容量变为80M了!针对这个问题,忙了大半天, ...

  4. LRU算法总结

    LRU算法总结 无论是哪一层次的缓存都面临一个同样的问题:当容量有限的缓存的空闲空间全部用完后,又有新的内容需要添加进缓存时,如何挑选并舍弃原有的部分内容,从而腾出空间放入这些新的内容.解决这个问题的 ...

  5. Matlab: 白噪声与曲线拟合

    在信号处理中常常需要用到曲线拟合,这里介绍一下利用最小二乘拟合一般曲线的方法,并对滤掉信号中白噪声的方法作些介绍. 为了测试拟合算法的好坏,先模拟出一个信号作为检验算法的例子: 用白噪声产生模拟信号: ...

  6. 在Linux环境如何在不解压情况下搜索多个zip包中匹配的字符串内容

    今天有个生产文件需要查日志,但因为是比较久远的故障,日志已经被归档为zip包放到某个目录下了,在不知道具体日期时间的情况下,总不能一个一个解压搜索吧.于是就研究一下怎么在多个压缩包里搜索字符串了.目前 ...

  7. TCP错误恢复特性之一TCP重传

    TCP的错误恢复特性是我们用来定位.诊断并最终修复网络高延迟的最好工具. 常见的TCP错误恢复特性有:TCP重传.TCP重复确认和快速重传 1. TCP重传: 重传数据包是TCP最基本的错误恢复特性之 ...

  8. 面向对象15.2String类-构造函数

    public class String_Constructor { //快捷键小方法: Ctrl+d,删除整行,选中几行删除几行 public static void main(String[] ar ...

  9. 腾讯云centos7服务器环境搭建,tomcat+jdk+mysql+nginx

    软件:jdk 1.8.0_45 tomcat 8.5.8 mysql 5.6.36 nginx 1.10.x或以上 其中tomcat在centos6.8中没问题,centos7中会出现卡在启动那里 I ...

  10. MySQL后台线程的清理工作

    后台清理工作:脏页刷盘.undo回收 1.page cleaner thread:刷新脏页 2.purge thread:清空undo页.清理“deleted”page 一.innodb_page_c ...