Spring|Spring Boot 项目集成Redis的方式详解
集成方式
使用Jedis
Jedis是Redis官方推荐的面向Java的操作Redis的客户端,是对服务端直连后进行操作。如果直接使用Jedis进行连接,多线程环境下是非线程安全的,正式生产环境一般使用连接池进行连接。
redis.clients jedis2.9.0
使用spring-data-redis
【Spring|Spring Boot 项目集成Redis的方式详解】由Spring 框架提供,是对Redis客户端的进一步封装,屏蔽了不同客户端的不同实现方式,让服务端和客户端进一步解耦;也就是你可以切换不同的客户端实现,比如Jedis或Lettuce(Redis客户端实现之一),而不影响你的业务逻辑。
类似于的SpringCloud的服务治理框架对不同服务治理组件的适配,或是AMQP
它利用RedisTemplate对JedisApi进行高度封装。使用的依赖如下:
org.springframework.boot spring-boot-starter-data-redis
Redis的安装 ?收先要安装Redis服务端,Redis官方提供的是Linux安装包。网上有很多详细的安装教程,这里不做展开。关于Windows下的安装,可参考我的另一篇博文windows下Redis的安装和使用
绑定配置 ?完成Redis服务端的安装之后,我们开始在项目中进行集成。这里我们先介绍使用Jedis的方式进行的集成。先按上面的提及的方式进行依赖的引入。然后将Redis的相关信息配置到配置文件中去。我们可以的新建一个配置文件
redis.properties
,内容如下:# Redis数据库索引(默认为0)spring.redis.database=0# Redis服务器地址spring.redis.host=127.0.0.1# Redis服务器连接端口spring.redis.port=6379# Redis服务器连接密码(默认为空)spring.redis.password=# 连接超时时间(毫秒)spring.redis.timeout=0
?接下来我们要为Redis客户端连接绑定上面的配置,创建出来的客户端实例才能够连接到我们的想连的Redis服务端。你可以使用
@Value
注解或@ConfigurationProperties
注解的方式,本文采用的是后者,如果还不清楚的该注解的用法,可以移步我的另一篇博文@ConfigurationProperties实现自定义配置绑定查看,这里不做展开。?以下是Redis服务端信息配置的接收类:
MyRedisProperties.java
@ConfigurationProperties(prefix = "spring.redis")@Component@Data@PropertySource("classpath:/redis.properties")public class MyRedisProperties {private String database; private String host; private Integer port; private String password; private Integer timeOut; }
由于我们正式生产环境一般都是采用连接池方式实现,所以我们还需要关于连接池的配置如下:
# 连接池最大连接数(使用负值表示没有限制)spring.redis.pool.max-active=8# 连接池最大阻塞等待时间(使用负值表示没有限制)spring.redis.pool.max-wait=-1# 连接池中的最大空闲连接spring.redis.pool.max-idle=8# 连接池中的最小空闲连接spring.redis.pool.min-idle=0
对应的接收类如下:
@ConfigurationProperties(prefix = "spring.redis.pool")@Data@Component@PropertySource("classpath:/redis.properties")public class RedisPoolProperties {private Integer maxActive; private Integer maxWait; private Integer maxIdle; private Integer minIdle; }
然后向Spring容器装配客户端实例,分为单个客户端和连接池两种实现,如下代码:
@Configurationpublic class RedisConfig {@Autowiredprivate RedisPoolProperties redisPoolProperties; @Autowiredprivate MyRedisProperties myRedisProperties; @Beanpublic Jedis singleJedis(){return new Jedis(myRedisProperties.getHost(),myRedisProperties.getPort()); }@Beanpublic JedisPool jedisPool(){ JedisPoolConfig poolConfig = new JedisPoolConfig(); poolConfig.setMaxIdle(redisPoolProperties.getMaxIdle()); poolConfig.setMaxTotal(redisPoolProperties.getMaxActive()); poolConfig.setMaxWaitMillis(redisPoolProperties.getMaxWait() * 1000); JedisPool jp = new JedisPool(poolConfig, myRedisProperties.getHost(), myRedisProperties.getPort(),myRedisProperties.getTimeOut()*1000, myRedisProperties.getPassword(), 0); return jp; }}
获取Redis客户端 进行相关配置的绑定之后,意味着我们程序可以拿到Redis和连接池的相关信息,然后进行客户端的创建和连接了。所以我们要向Spring容器装配客户端实例,分为单个客户端和连接池两种实现,如下代码:
@Configurationpublic class RedisConfig {@Autowiredprivate RedisPoolProperties redisPoolProperties; @Autowiredprivate MyRedisProperties myRedisProperties; @Beanpublic Jedis singleJedis(){return new Jedis(myRedisProperties.getHost(),myRedisProperties.getPort()); }@Beanpublic JedisPool jedisPool(){ JedisPoolConfig poolConfig = new JedisPoolConfig(); poolConfig.setMaxIdle(redisPoolProperties.getMaxIdle()); poolConfig.setMaxTotal(redisPoolProperties.getMaxActive()); poolConfig.setMaxWaitMillis(redisPoolProperties.getMaxWait() * 1000); JedisPool jp = new JedisPool(poolConfig, myRedisProperties.getHost(), myRedisProperties.getPort(),myRedisProperties.getTimeOut()*1000, myRedisProperties.getPassword(), 0); return jp; }}
Redis工具的编写 装配好客户端实例后,我们就可以通过@Autowired的方式进行注入使用了。我们都知道,Redis有5中数据类型,分别是:
- string(字符串)
- hash(哈希)
- list(列表)
- set(集合)
- zset(sorted set:有序集合)
@Servicepublic class RedisService {@Autowiredprivate JedisPool jedisPool; // 连接池方式@Autowiredprivate Jedis myJedis; // 单个客户端publicT get(String key, Class clazz) {Jedis jedis = null; try {jedis = jedisPool.getResource(); String str = jedis.get(key); return stringToBean(str,clazz); } finally {close(jedis); }}public void set(String key, T value) {try {String str = value.toString(); if (str == null || str.length() <= 0) {return; }myJedis.set(key, str); } finally {close(myJedis); }}private void close(Jedis jedis) {if (jedis != null) {jedis.close(); }}/*** 把一个字符串转换成bean对象* @param str* @param * @return*/public static T stringToBean(String str, Class clazz) {if(str == null || str.length() <= 0 || clazz == null) {return null; }if(clazz == int.class || clazz == Integer.class) {return (T)Integer.valueOf(str); }else if(clazz == String.class) {return (T)str; }else if(clazz == long.class || clazz == Long.class) {return(T)Long.valueOf(str); }else {return JSON.toJavaObject(JSON.parseObject(str), clazz); }}}
其中
get
方法使用连接池中的客户端实例,set
方法用到的是非连接池的实例,以区分两种不同的使用方式使用 封装好的Redis的操作工具类后,我们就可以直接使用该工具类来进行对Redis的各种操作 。如下,直接注入即可。
@RestControllerpublic class TestController {@Autowiredprivate RedisService redisService; ......}
到此这篇关于Spring Boot 项目集成Redis的文章就介绍到这了,更多相关Spring Boot 项目集成Redis内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- Activiti(一)SpringBoot2集成Activiti6
- SpringBoot调用公共模块的自定义注解失效的解决
- 解决SpringBoot引用别的模块无法注入的问题
- 2018-07-09|2018-07-09 Spring 的DBCP,c3p0
- 17|17 关山松 第二课作业#公众号项目# D20
- RxJava|RxJava 在Android项目中的使用(一)
- Hacking|Hacking with iOS: SwiftUI Edition - SnowSeeker 项目(一)
- 靠QQ月入上万灰色暴利偏门的项目
- spring|spring boot项目启动websocket
- Spring|Spring Boot 整合 Activiti6.0.0