Springboot如何使用多个Redis连接

it2023-06-29  68

1、引入POM包

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency>

2、yml中添加连接信息

spring: redis: database: 0 host: 127.0.0.1 port: 6379 password: # 密码(默认为空) timeout: 6000 # 连接超时时长(毫秒) pool: max-active: 1000 # 连接池最大连接数(使用负值表示没有限制) max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制) max-idle: 10 # 连接池中的最大空闲连接 min-idle: 5 # 连接池中的最小空闲连接 order: host: 127.0.0.1 port: 6379 password: database: 1

3、增加Redis连接工厂

package com.tyteam.base.config; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import redis.clients.jedis.JedisPoolConfig; @Configuration public class RedisConfig { //order @Value("${spring.redis.order.host}") private String orderHost; @Value("${spring.redis.order.port}") private String orderPort; @Value("${spring.redis.order.password}") private String orderPassword; @Value("${spring.redis.order.database}") private Integer orderDatabase; private static final int MAX_IDLE = 200; //最大空闲连接数 private static final int MAX_TOTAL = 1024; //最大连接数 private static final long MAX_WAIT_MILLIS = 10000; //建立连接最长等待时间 //配置工厂 public RedisConnectionFactory connectionFactory(String host, int port, String password, int maxIdle, int maxTotal, long maxWaitMillis, int index) { JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(); jedisConnectionFactory.setHostName(host); jedisConnectionFactory.setPort(port); if (!StringUtils.isEmpty(password)) { jedisConnectionFactory.setPassword(password); } if (index != 0) { jedisConnectionFactory.setDatabase(index); } jedisConnectionFactory.setPoolConfig(poolConfig(maxIdle, maxTotal, maxWaitMillis, false)); jedisConnectionFactory.afterPropertiesSet(); return jedisConnectionFactory; } //连接池配置 public JedisPoolConfig poolConfig(int maxIdle, int maxTotal, long maxWaitMillis, boolean testOnBorrow) { JedisPoolConfig poolConfig = new JedisPoolConfig(); poolConfig.setMaxIdle(maxIdle); poolConfig.setMaxTotal(maxTotal); poolConfig.setMaxWaitMillis(maxWaitMillis); poolConfig.setTestOnBorrow(testOnBorrow); return poolConfig; } @Bean(name = "orderRedisTemplate") public RedisTemplate<String, Object> redisOrderTemplate() { RedisTemplate<String, Object> template = new RedisTemplate<String, Object>(); template.setConnectionFactory( connectionFactory(orderHost, Integer.parseInt(orderPort), orderPassword, MAX_IDLE, MAX_TOTAL, MAX_WAIT_MILLIS, orderDatabase)); //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式) Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常 om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jacksonSeial.setObjectMapper(om); // 值采用json序列化 template.setValueSerializer(jacksonSeial); //使用StringRedisSerializer来序列化和反序列化redis的key值 template.setKeySerializer(new StringRedisSerializer()); // 设置hash key 和value序列化模式 template.setHashKeySerializer(new StringRedisSerializer()); template.setHashValueSerializer(jacksonSeial); template.afterPropertiesSet(); return template; } }

4、使用2个Redis进行操作

我们在设置session时使用了2个Redis分别存储在了数据库1和数据库2上。

package com.kingteam.session; import java.util.UUID; import java.util.concurrent.TimeUnit; import javax.annotation.Resource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; /** * kingteam Session 管理类:负责session的注册、及使用 * @author 秦晓宇 * @date: 2020年10月15日 下午6:20:14 * @record: */ @Service public class KtSessionService { @Autowired @Qualifier("redisTemplate") protected RedisTemplate<String, Object> redisTemplate; @Autowired @Resource(name = "orderRedisTemplate") RedisTemplate<String, Object> orderRedisTemplate; /** * @Description: session 过期时间:-1,永久不过期,其他:xxx秒 * @author: qin * @date: 2020年10月18日 上午11:35:48 */ public static final long sessionExpires = 60*60*24*30; public enum SessionStatus { NoToken, }; /** * @Description: 为登录的用户产生UUID token令牌 并以userId作为主键,将token存储到Redis中 * @Title: setSession * @param Session void * @author qin * @date 2020年10月16日上午12:16:12 */ public Session setSession(Session session) { String token = UUID.randomUUID().toString(); session.setToken(token); redisTemplate.opsForValue().set( token, //令牌token session, //用户上下文信息 sessionExpires, //超时时间 TimeUnit.SECONDS //超时的单位定义 ); orderRedisTemplate.opsForValue().set(token, // 令牌token session, // 用户上下文信息 sessionExpires, // 超时时间 TimeUnit.SECONDS // 超时的单位定义 ); return session; } /** * @Description: 使对应的令牌失效 * @Title: removeSession * @param token void * @author qin * @date 2020年10月16日上午12:41:45 */ public void removeSession(String token) { redisTemplate.delete(token); } /** * @Description: 获得用户session * @Title: getSession * @param token * @return Session * @author qin * @date 2020年10月16日上午12:48:09 */ public Session getSession(String token) { return (Session) redisTemplate.opsForValue().get(token); } /** * @Description: 刷新token的时间 * @Title: refreshToken * @param token void * @author qin * @date 2020年10月16日下午3:14:14 */ public void refreshToken(String token) { //System.out.println("KtSessionService:refreshToken = "+token); //若传入的token不合法,则不进行token续租 if(token == null || token.length()!= 36) return; try { redisTemplate.expire(token,sessionExpires,TimeUnit.SECONDS); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } }

5、实操效果

我们在Reids中看到了2条一样的数据,存储成功。

6、如何驱动更多张数据表

在yml文件中配置其他想写入的表

在如下位置添加新的连接的信息

如下位置添加新的连接工厂,把redisOrderTemplate拷贝下来,改改Bean注解,改改连接的host、port、数据库就行了。该改的地方都用红框画出来了。

在想使用的地方引入

在想使用的地方调用一下

最新回复(0)