话不多说直接开始:
首先,引入 maven依赖:
<!-- redis依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
yml 文件:
这里有 mysql 和 redis 的,需要写上host,端口,密码和默认数据库
spring: redis: host: 8.140.xx.xxx port: 6379 database: 0 password: xxxx datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://8.xxxxx55/qingxxxxxxxxmuity?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8 username: roxxxxx password: Txxxxxx
开始编写redis的配置类:
@Component @EnableCaching @EnableAutoConfiguration @Configuration public class RedisConfig extends CachingConfigurerSupport { private static final long DEFAULT_TTL = 999999L; @Value("${spring.redis.host}") private String host; @Value("${spring.redis.port}") private int port; @Value("${spring.redis.database}") private int database; @Value("${spring.redis.password}") private String password; /** * 连接redis的工厂类 * @return */ @Bean public JedisConnectionFactory jedisConnectionFactory() { JedisConnectionFactory factory = new JedisConnectionFactory(); factory.setHostName(host); factory.setPort(port); factory.setPassword(password); factory.setDatabase(database); return factory; } /** * 配置RedisTemplate * 设置添加序列化器 * key 使用string序列化器 * value 使用Json序列化器 * 还有一种简答的设置方式,改变defaultSerializer对象的实现。 * @return */ @Bean public RedisTemplate<String, Object> redisTemplate() { RedisTemplate<String, Object> template = new RedisTemplate<>(); RedisSerializer stringSerializer = new StringRedisSerializer();//序列化为String Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);//序列化为Json template.setKeySerializer(stringSerializer); template.setValueSerializer(jackson2JsonRedisSerializer); template.setHashKeySerializer(stringSerializer); template.setHashValueSerializer(jackson2JsonRedisSerializer); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(objectMapper); //set value serializer template.setDefaultSerializer(jackson2JsonRedisSerializer); template.setConnectionFactory(jedisConnectionFactory()); template.afterPropertiesSet(); return template; } @Bean public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) { //初始化一个RedisCacheWriter RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory); //自定义key前缀 CacheKeyPrefix cacheKeyPrefix = new CacheKeyPrefix() { @Override public String compute(String cacheName) { return cacheName+":"; } }; //设置CacheManager的值序列化方式为json序列化 RedisSerializer<Object> jsonSerializer = new GenericJackson2JsonRedisSerializer(); RedisSerializationContext.SerializationPair<Object> pair = RedisSerializationContext.SerializationPair .fromSerializer(jsonSerializer); //生成RedisCacheConfiguration配置 RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig() .computePrefixWith(cacheKeyPrefix) .serializeValuesWith(pair); //设置默认超过期时间是30秒 defaultCacheConfig.entryTtl(Duration.ofSeconds(DEFAULT_TTL)); //初始化RedisCacheManager return new RedisCacheManager(redisCacheWriter, defaultCacheConfig); } }
配置类整合好,建立一个 redis 的工具类:(便于操作)
package com.community.util; /** * @Classname RedisUtil * @Description redis工具类 * @Date 2021/10/10 16:15 * @Created by thx */ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import java.util.Collection; import java.util.concurrent.TimeUnit; /** * @ClassName RedisUtil * @Description TODO * @Author 华达州 * @Date 2021/8/6 13:54 * @Version 1.0 **/ @Component public class RedisUtil { @Autowired private RedisTemplate redisTemplate; public Object get(String key) { return key == null ? null : redisTemplate.opsForValue().get(key); } /** * 本来只可以放入string类型,但是配置了自动序列化所以这儿可以传入object */ public boolean set(String key, Object value) { try { redisTemplate.opsForValue().set(key, value); return true; } catch (Exception e) { return false; } } /** * 原子操作 * * @param key * @param value * @param expire 过期时间 秒 * @return */ public boolean setExpire(String key, Object value, long expire) { try { //TimeUnit.SECONDS指定类型为秒 redisTemplate.opsForValue().set(key, value, expire, TimeUnit.SECONDS); return true; } catch (Exception e) { return false; } } /** * 非原子操作 * * @param key * @param expire * @return */ public boolean expire(String key, long expire) { try { redisTemplate.expire(key, expire, TimeUnit.SECONDS); return true; } catch (Exception e) { return false; } } /** * @param key * @return 获取key的过期时间 */ public long ttl(String key) { return redisTemplate.getExpire(key); } /** * @param keys 删除key 可变参数 */ public void del(String... keys) { if (keys != null && keys.length > 0) { redisTemplate.delete((Collection<String>) CollectionUtils.arrayToList(keys)); } } /** * @param key * @param step 传入正数 就是加多少 传入负数就是减多少 * @return */ public long incrBy(String key, long step) { return redisTemplate.opsForValue().increment(key, step); } /** * @param key * @param value * @return 如果该key存在就返回false 设置不成功 key不存在就返回ture设置成功 * 如果不存在的话再 set,如果存在,不改变值: */ public boolean setNx(String key, Object value) { return redisTemplate.opsForValue().setIfAbsent(key, value); } /** * 原子操作 * * @param key * @param value * @param expire 在上面方法加上过期时间设置 * @return */ public boolean setNxAndExpire(String key, Object value, long expire) { return redisTemplate.opsForValue().setIfAbsent(key, value, expire, TimeUnit.SECONDS); } /** * @param key * @return 判断key是否存在 */ public boolean hasKey(String key) { return redisTemplate.hasKey(key); } }
配置完成,开始测试!
在 controller 层里写一个 demo 进行测试
@Resource private RedisUtil redisUtil; @RequestMapping("demo") public ResultJson test() { redisUtil.set("thx", "123"); System.out.println(redisUtil.get("thx")); return null; }
去 redis 查看数据,如果发现有 thx 的键值,说明测试成功,完成闭环