springboot集成redis
1、springboot集成redis
1、依赖
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
2、配置
spring: redis: host: 192.168.0.100 port: 16379 password: ba2020 database: 0
3、自定义bean
package com.baian.yeyingcloudredis.config; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator; import org.springframework.beans.factory.annotation.Autowired; 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.lettuce.LettuceConnectionFactory; import org.springframework.data.redis.core.*; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; /** * @author lin * @version 1.0 * @date 2020-05-12 8:48 * @Description TODO */ @Configuration public class RedisConfig { // 自己定义了一个 RedisTemplate @Bean public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory factory) { // 我们为了自己开发方便,一般直接使用 <String, Object> RedisTemplate<String, Object> template = new RedisTemplate<String, Object>(); //关闭共享连接 factory.setShareNativeConnection(false); template.setConnectionFactory(factory); // Json序列化配置 Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); // 会出现警告enableDefaultTyping // om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); // enableDefaultTyping()过期 使用以下的 spring boot 2.x 以后使用 om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); // String 的序列化 StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); // key采用String的序列化方式 template.setKeySerializer(stringRedisSerializer); // hash的key也采用String的序列化方式 template.setHashKeySerializer(stringRedisSerializer); // value序列化方式采用jackson template.setValueSerializer(jackson2JsonRedisSerializer); // hash的value序列化方式采用jackson template.setHashValueSerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet(); return template; } @Bean public HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) { return redisTemplate.opsForHash(); } @Bean public ValueOperations<String, String> valueOperations(RedisTemplate<String, String> redisTemplate) { return redisTemplate.opsForValue(); } @Bean public ListOperations<String, Object> listOperations(RedisTemplate<String, Object> redisTemplate) { return redisTemplate.opsForList(); } @Bean public SetOperations<String, Object> setOperations(RedisTemplate<String, Object> redisTemplate) { return redisTemplate.opsForSet(); } @Bean public ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) { return redisTemplate.opsForZSet(); } }
4、使用、判断key是否存在
@Autowired private RedisTemplate<String, Object> redisTemplate; /** * 判断key是否存在 * * @param key 键 * @return true 存在 false不存在 */ public boolean hasKey(String key, Integer dbIndex) { setDbIndex(dbIndex); try { return redisTemplate.hasKey(key); } catch (Exception e) { e.printStackTrace(); return false; } }
每个人可以自定义一个通用方法
2、动态切换数据库
1、使用
/** * Redis工具类 * <p> * 封装了对象和字符串的存,取,删除,设置过期时间操作. 所有操作可以指定数据库索引. 存,取可以设置过期时间. 没有设置默认过期时间,存值时尽量设置过期时间 * * @author chunhui.tan * @version 创建时间:2018年10月8日 下午3:31:00 */ @Component public class RedisUtils { @Autowired private RedisTemplate<String, Object> redisTemplate; @Autowired private ValueOperations<String, String> valueOperations; @Autowired private HashOperations<String, String, Object> hashOperations; @Autowired private ListOperations<String, Object> listOperations; @Autowired private SetOperations<String, Object> setOperations; @Autowired private ZSetOperations<String, Object> zSetOperations; /** 默认过期时长,单位:秒 */ //public final static long DEFAULT_EXPIRE = 60 * 60 * 24; /** * 不设置过期时长 */ public final static long NOT_EXPIRE = -1; private final static Gson gson = new Gson(); public RedisTemplate<String, Object> getRedisTemplate() { return redisTemplate; } /** * 判断key是否存在 * * @param key 键 * @return true 存在 false不存在 */ public boolean hasKey(String key, Integer dbIndex) { setDbIndex(dbIndex); try { return redisTemplate.hasKey(key); } catch (Exception e) { e.printStackTrace(); return false; } } /** * 插入值-对象,指定数据库索引,指定过期时间 * * @param key 键 * @param value 值 * @param dbIndex 数据库索引 范围 0-15 默认0 * @param expire 过期时间 单位:秒 */ public void set(String key, Object value, Integer dbIndex, long expire) { // 选择数据库 setDbIndex(dbIndex); valueOperations.set(key, toJson(value)); if (expire != NOT_EXPIRE) { redisTemplate.expire(key, expire, TimeUnit.SECONDS); } } }
2、自定义切库方法
/** * 设置数据库索引 * * @param dbIndex */ private void setDbIndex(Integer dbIndex) { if (dbIndex == null || dbIndex > 15 || dbIndex < 0) { dbIndex = 0; } LettuceConnectionFactory redisConnectionFactory = (LettuceConnectionFactory) redisTemplate .getConnectionFactory(); if (redisConnectionFactory == null) { return; } redisConnectionFactory.setDatabase(dbIndex); redisTemplate.setConnectionFactory(redisConnectionFactory); redisConnectionFactory.afterPropertiesSet(); redisConnectionFactory.resetConnection(); }
3、测试
@Resource RedisUtils redisUtils; @Test void contextLoads() { int dbIndex = 14; String key = "ttttt"; final String s1 = redisUtils.get(key, dbIndex); System.out.println("s1 = " + s1); redisUtils.set(key, "test", 14, 20); System.out.println(redisUtils.get(key, dbIndex)); redisUtils.set(key + "1", key, 4, 60 * 3); }
结果:
s1 = nulltest
源码: https://gitee.com/naimaohome/frames.git
公众号: