1.引入Redis依赖包
<!-- Redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
2.在配置文件中配置redis相关参数
spring:
redis:
host: ip
port: port
password: password
jedis:
pool:
max-active: 100
max-idle: 10
max-wait: 100000
timeout: 5000
3.自定义实现RedisSerializer
package com.lemonzuo.redis;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException;
import java.io.*;
/**
* @author LemonZuo
* @create 2020-04-28 21:38
*/
public class LemonRedisSerializer implements RedisSerializer {
@Override
public byte[] serialize(Object o) throws SerializationException {
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
ObjectOutputStream objOut;
try {
objOut = new ObjectOutputStream(byteOut);
objOut.writeObject(o);
} catch (IOException e) {
e.printStackTrace();
}
return byteOut.toByteArray();
}
@Override
public Object deserialize(byte[] bytes) throws SerializationException {
if(bytes == null) {
return null;
}
ByteArrayInputStream byteIn = new ByteArrayInputStream(bytes);
ObjectInputStream objIn;
Object obj;
try {
objIn = new ObjectInputStream(byteIn);
obj =objIn.readObject();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
return null;
}
return obj;
}
}
4.RedisConf配置类
package com.lemonzuo.config;
import com.lemonzuo.redis.LemonRedisSerializer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.lang.reflect.Method;
/**
* @author LemonZuo
* @create 2020-01-12 16:45
* <p>
* Redis配置类
*/
@Configuration
@EnableCaching
@Slf4j
public class RedisConf extends CachingConfigurerSupport {
/**
* 自定义生成key
*
* @return
*/
@Override
public KeyGenerator keyGenerator() {
return new KeyGenerator() {
@Override
public Object generate(Object o, Method method, Object... objects) {
//格式化缓存key字符串
StringBuilder sb = new StringBuilder();
//追加类名
sb.append(o.getClass().getName());
//追加方法名
sb.append(method.getName());
//遍历参数并且追加
for (Object obj : objects) {
sb.append(obj.toString());
}
log.info("调用Redis缓存Key : {}", sb.toString());
return sb.toString();
}
};
}
/**
* 采用RedisCacheManager作为缓存管理器
*
* @param connectionFactory
*/
@Bean
public CacheManager cacheManager(RedisConnectionFactory connectionFactory) {
RedisCacheManager redisCacheManager = RedisCacheManager.create(connectionFactory);
return redisCacheManager;
}
@Bean(name = "redisTemplate")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
// 1.创建 redisTemplate 模版
RedisTemplate<String, Object> template = new RedisTemplate<>();
// 2.关联 redisConnectionFactory
template.setConnectionFactory(factory);
// 3.创建 自定义序列化类
LemonRedisSerializer myRedisSerializer = new LemonRedisSerializer();
// 7.设置 value 的转化格式
template.setValueSerializer(myRedisSerializer);
template.setHashValueSerializer(myRedisSerializer);
// 设置键(key)的序列化采用StringRedisSerializer。
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.afterPropertiesSet();
return template;
}
}
5、RedisUtil
package com.lemonzuo.util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.RedisTemplate;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
/**
* @author LemonZuo
* @create 2020-01-12 17:23
*/
public class RedisUtil {
private static Logger log = LoggerFactory.getLogger(RedisUtil.class);
private static RedisTemplate redisTemplate = SpringUtil.getBean("redisTemplate", RedisTemplate.class);
/**
* 移除键
*
* @param key
*/
public static void remove(String key) {
redisTemplate.delete(key);
}
/**
* 键是否存在
*
* @param key
* @return
*/
public static boolean hasKey(String key) {
return redisTemplate.hasKey(key);
}
/**
* 设置过期时间(毫秒)
*
* @param key
* @param time
*/
public static void expire(String key, long time) {
redisTemplate.expire(key, time, TimeUnit.MILLISECONDS);
}
public static long getExpire(String key) {
return redisTemplate.getExpire(key, TimeUnit.MILLISECONDS);
}
/**
* 设置字符串类型
*
* @param key
* @param value
*/
public static void set(String key, String value) {
try {
redisTemplate.opsForValue().set(key, value);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
public static void set(String key, Object value) {
try {
redisTemplate.opsForValue().set(key, value);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
/**
* 设置字符串类型带过期时间
*
* @param key
* @param value
* @param time
*/
public static void set(String key, String value, long time) {
try {
redisTemplate.opsForValue().set(key, value, time, TimeUnit.MILLISECONDS);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
public static void set(String key, Object value, long time) {
try {
redisTemplate.opsForValue().set(key, value, time, TimeUnit.MILLISECONDS);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
/**
* 获取字符串类型数据
*
* @param key
* @return
*/
public static Object get(String key) {
return redisTemplate.opsForValue().get(key);
}
public static Set<String> keys(String keys) {
Set keySet = redisTemplate.keys(keys);
if (keySet == null) {
return new HashSet();
} else {
return keySet;
}
}
public static void leftPushAll(String key, List<Object> list) {
redisTemplate.opsForList().leftPushAll(key, list);
}
}