话不多说直接开始:
如果没有安装 redis 或者 没有在服务器安装 redis 的,建议看一下这个课程,很详细
https://www.bilibili.com/video/BV1S54y1R7SB?p=11&spm_id_from=pageDriver
不会用基本 API 的:
redis:list 和 set 和 zset 类型的简单学习
都差不都了以后,(使用 RedisDesktopManager 或其他能够连接远程 redis 后),开始整合 SpringBoot
首先,引入 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 的键值,说明测试成功,完成闭环