Spring Boot Redis 集成配置详解
时间:2019-03-30
本文章向大家介绍Spring Boot Redis 集成配置详解,主要包括Spring Boot Redis 集成配置详解使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
spring Boot 熟悉后,集成一个外部扩展是一件很容易的事,集成Redis也很简单,看下面步骤配置:
一、添加pom依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> </dependency>
二、创建 RedisClient.java
注意该类存放的package
package org.springframework.data.redis.connection.jedis; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.UnsupportedEncodingException; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import redis.clients.jedis.Jedis; import redis.clients.jedis.Protocol; import redis.clients.jedis.exceptions.JedisException; /** * 工具类 RedisClient * 因为本类中获取JedisPool调用的是JedisConnectionFactory中protected修饰的方法fetchJedisConnector() * 所以该类需要与JedisConnectionFactory在同一个package中 * * @author 单红宇(CSDN CATOOP) * @create 2017年4月9日 */ public class RedisClient { private static Logger logger = LoggerFactory.getLogger(RedisClient.class); private JedisConnectionFactory factory; public RedisClient(JedisConnectionFactory factory) { super(); this.factory = factory; } /** * put操作(存储序列化对象)+ 生效时间 * * @param key * @param value * @return */ public void putObject(final String key, final Object value, final int cacheSeconds) { if (StringUtils.isNotBlank(key)) { redisTemplete(key, new RedisExecute<Object>() { @Override public Object doInvoker(Jedis jedis) { try { jedis.setex(key.getBytes(Protocol.CHARSET), cacheSeconds, serialize(value)); } catch (UnsupportedEncodingException e) { } return null; } }); } } /** * get操作(获取序列化对象) * * @param key * @return */ public Object getObject(final String key) { return redisTemplete(key, new RedisExecute<Object>() { @Override public Object doInvoker(Jedis jedis) { try { byte[] byteKey = key.getBytes(Protocol.CHARSET); byte[] byteValue = jedis.get(byteKey); if (byteValue != null) { return deserialize(byteValue); } } catch (UnsupportedEncodingException e) { return null; } return null; } }); } /** * setex操作 * * @param key * 键 * @param value * 值 * @param cacheSeconds * 超时时间,0为不超时 * @return */ public String set(final String key, final String value, final int cacheSeconds) { return redisTemplete(key, new RedisExecute<String>() { @Override public String doInvoker(Jedis jedis) { if (cacheSeconds == 0) { return jedis.set(key, value); } return jedis.setex(key, cacheSeconds, value); } }); } /** * get操作 * * @param key * 键 * @return 值 */ public String get(final String key) { return redisTemplete(key, new RedisExecute<String>() { @Override public String doInvoker(Jedis jedis) { String value = jedis.get(key); return StringUtils.isNotBlank(value) && !"nil".equalsIgnoreCase(value) ? value : null; } }); } /** * del操作 * * @param key * 键 * @return */ public long del(final String key) { return redisTemplete(key, new RedisExecute<Long>() { @Override public Long doInvoker(Jedis jedis) { return jedis.del(key); } }); } /** * 获取资源 * * @return * @throws JedisException */ public Jedis getResource() throws JedisException { Jedis jedis = null; try { jedis = factory.fetchJedisConnector(); } catch (JedisException e) { logger.error("getResource.", e); returnBrokenResource(jedis); throw e; } return jedis; } /** * 获取资源 * * @return * @throws JedisException */ public Jedis getJedis() throws JedisException { return getResource(); } /** * 归还资源 * * @param jedis * @param isBroken */ public void returnBrokenResource(Jedis jedis) { if (jedis != null) { jedis.close(); } } /** * 释放资源 * * @param jedis * @param isBroken */ public void returnResource(Jedis jedis) { if (jedis != null) { jedis.close(); } } /** * 操作jedis客户端模板 * * @param key * @param execute * @return */ public <R> R redisTemplete(String key, RedisExecute<R> execute) { Jedis jedis = null; try { jedis = getResource(); if (jedis == null) { return null; } return execute.doInvoker(jedis); } catch (Exception e) { logger.error("operator redis api fail,{}", key, e); } finally { returnResource(jedis); } return null; } /** * 功能简述: 对实体Bean进行序列化操作. * * @param source * 待转换的实体 * @return 转换之后的字节数组 * @throws Exception */ public static byte[] serialize(Object source) { ByteArrayOutputStream byteOut = null; ObjectOutputStream ObjOut = null; try { byteOut = new ByteArrayOutputStream(); ObjOut = new ObjectOutputStream(byteOut); ObjOut.writeObject(source); ObjOut.flush(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (null != ObjOut) { ObjOut.close(); } } catch (IOException e) { ObjOut = null; } } return byteOut.toByteArray(); } /** * 功能简述: 将字节数组反序列化为实体Bean. * * @param source * 需要进行反序列化的字节数组 * @return 反序列化后的实体Bean * @throws Exception */ public static Object deserialize(byte[] source) { ObjectInputStream ObjIn = null; Object retVal = null; try { ByteArrayInputStream byteIn = new ByteArrayInputStream(source); ObjIn = new ObjectInputStream(byteIn); retVal = ObjIn.readObject(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (null != ObjIn) { ObjIn.close(); } } catch (IOException e) { ObjIn = null; } } return retVal; } interface RedisExecute<T> { T doInvoker(Jedis jedis); } }
三、创建Redis配置类
RedisConfig.Java
package com.shanhy.example.redis; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import org.springframework.data.redis.connection.jedis.RedisClient; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.StringRedisSerializer; /** * Redis配置 * * @author 单红宇(CSDN catoop) * @create 2016年9月12日 */ @Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(JedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<String, Object>(); template.setConnectionFactory(factory); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new RedisObjectSerializer()); template.afterPropertiesSet(); return template; } @Bean public RedisClient redisClient(JedisConnectionFactory factory){ return new RedisClient(factory); } }
RedisObjectSerializer.java
package com.shanhy.example.redis; import org.springframework.core.convert.converter.Converter; import org.springframework.core.serializer.support.DeserializingConverter; import org.springframework.core.serializer.support.SerializingConverter; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.SerializationException; /** * 实现对象的序列化接口 * @author 单红宇(365384722) * @create 2017年4月9日 */ 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; } try { return deserializer.convert(bytes); } catch (Exception ex) { throw new SerializationException("Cannot deserialize", ex); } } @Override 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); } }
四、创建测试方法
下面代码随便放一个Controller里
@Autowired private RedisTemplate<String, Object> redisTemplate; /** * 缓存测试 * * @return * @author SHANHY * @create 2016年9月12日 */ @RequestMapping("/redisTest") public String redisTest() { try { redisTemplate.opsForValue().set("test-key", "redis测试内容", 2, TimeUnit.SECONDS);// 缓存有效期2秒 logger.info("从Redis中读取数据:" + redisTemplate.opsForValue().get("test-key").toString()); TimeUnit.SECONDS.sleep(3); logger.info("等待3秒后尝试读取过期的数据:" + redisTemplate.opsForValue().get("test-key")); } catch (InterruptedException e) { e.printStackTrace(); } return "OK"; }
五、配置文件配置Redis
application.yml
spring: # Redis配置 redis: host: 192.168.1.101 port: 6379 password: # 连接超时时间(毫秒) timeout: 10000 pool: max-idle: 20 min-idle: 5 max-active: 20 max-wait: 2
这样就完成了Redis的配置,可以正常使用 redisTemplate 了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
- linq to sql的多条件动态查询(下)
- iptables网络安全服务详细使用
- iptables网络安全服务详细使用
- linq to sql的多条件动态查询(上)
- 极简区块链手册:什么是区块链?什么是比特币?
- Nginx+keepalived实现高可用
- 来一波Linux中查看cpu、磁盘、内存、网络的命令
- PXE+kickstart网络安装CentOS7.4系统及过程中各种报错
- [MSDN]通过避免下列 10 个常见 ASP.NET 缺陷使网站平稳运行
- Flask-配置与调试
- PXE+kickstart网络安装CentOS7.4系统及过程中各种报错
- MSDN官方的ASP.Net异步页面的经典示例代码
- Nginx反向代理、负载均衡功能
- 2018即将面临的12个云安全风险
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- SpringMVC中传参date类型失败,需要@DateTimeFormat(““)
- new ScalarHandler()-->返回值为long,不能用int接收!!!
- JavaWeb使用德鲁伊(略)实现登录、激活码注册(发送激活码到邮箱,点击激活链接后,才能正常登陆)、注册界面
- 转发的两种方式与重定向
- 关于监控、链路追踪、日志三者的区别
- 10.12面试:SpringMVC静态资源放行+如何实现转发和重定向+如何支持json+设置时间格式+设置json的key+对json的value序列化
- 10.13面试:什么是跨域?如何解决跨域问题+springMVC如何处理文件上传和下载+ssm整合思路 (待完善)
- 查找jar地址
- shiro篇:缓存配置
- 定时器篇:定时任务入门小案例
- 设置SSH + 远程仓库操作
- SSM整合:商城小项目001(配置SSM环境+查询所有操作+添加操作)
- 在MyBatis中参数的传递4种方式+代码示例
- MySQL篇:MySQL5.5和 MySQL5.7.x 版本安装和卸载《从入门到入狱,删库--->你值得拥有》
- 1016面试:quartz的核心组件+cron表达式语法+如何实现一个每天中午12点备份的数据库?写伪代码