1、yml配置
spring:
redis:
database: 0 #redis服务器数据库
host: 127.0.0.1
port: 6379
password:
timeout: 5000
lettuce:
pool:
max-active: 200 #最大连接数据
max-wait: -1 #最大阻塞时间
max-idle: 8 #最大空闲时间
min-idle: 0 #最小空闲时间
2、Redis配置
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
@Bean
public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
// 配置连接工厂
template.setConnectionFactory(factory);
//使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = 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.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
// 值采用json序列化
template.setValueSerializer(jackson2JsonRedisSerializer);
//使用StringRedisSerializer来序列化和反序列化redis的key值
template.setKeySerializer(new StringRedisSerializer());
// 设置hash key 和value序列化模式
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
3、redis工具类
@Slf4j
@Component
public class RedisUtil {
@Resource
private RedisTemplate<String, Object> redisTemplate;
/**
* 缓存失效时间
*
* @param key
* @param time
* @return
*/
public boolean expire(String key, long time, TimeUnit timeUnit) {
try {
if (time > 0) {
redisTemplate.expire(key, time, timeUnit);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public void clear() {
try {
Set<String> keys = redisTemplate.keys("*");
redisTemplate.delete(keys);
} catch (Exception e) {
e.printStackTrace();
}
}
public List<String> getKeys(String key) {
Set<String> sets = redisTemplate.keys(key);
return new ArrayList<>(sets);
}
/**
* 判断key是否存在
*
* @param key 键
* @return true 存在 false不存在
*/
public boolean hasKey(String key) {
try {
return Boolean.TRUE.equals(redisTemplate.hasKey(key));
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 删除缓存
*
* @param key 一个、多个
*/
@SuppressWarnings("unchecked")
public boolean del(String... key) {
Boolean del = false;
if (key != null && key.length > 0) {
if (key.length == 1) {
del = redisTemplate.delete(key[0]);
} else {
Long count = redisTemplate.delete(CollUtil.toList(key));
if (count != null && count > 0) {
del = true;
}
}
}
if (del == null) {
del = false;
}
return del;
}
public void delByLikeKeys(String key) {
if (StrUtil.isNotBlank(key)) {
redisTemplate.delete(Objects.requireNonNull(redisTemplate.keys(key + "*")));
}
}
/**
* 普通缓存获取
*
* @param key 键
* @return 值
*/
public Object get(String key) {
return key == null ? null : redisTemplate.opsForValue().get(key);
}
/**
* 模糊查询
*
* @param key
* @return
*/
public List<Object> getByLike(String key) {
if (key == null) {
return null;
}
Set<String> set = redisTemplate.keys(key + "*");
if (set == null){
return null;
}
List<Object> objectList = redisTemplate.opsForValue().multiGet(set);
return objectList;
}
public List<Object> getByKes(Set<String> set){
if (CollUtil.isEmpty(set)){
return null;
}
List<Object> objectList = redisTemplate.opsForValue().multiGet(set);
if (CollUtil.isEmpty(objectList)){
return null;
}
List<Object> collect = objectList.stream().filter(Objects::nonNull).collect(Collectors.toList());
return collect;
}
/**
* 普通缓存放入
*
* @param key 键
* @param value 值
* @return true成功 false失败
* 96
*/
public boolean set(String key, Object value) {
try {
redisTemplate.opsForValue().set(key, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 普通缓存放入并设置时间
*
* @param key 键
* @param value 值
* @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期
* @return true成功 false 失败
*/
public boolean set(String key, Object value, long time, TimeUnit timeUnit) {
try {
if (time > 0) {
redisTemplate.opsForValue().set(key, value, time, timeUnit);
} else {
set(key, value);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 将list放入缓存
*
* @param key 键
* @param value 值
* @return
*/
public boolean lSet(String key, List<Object> value) {
try {
redisTemplate.opsForList().rightPushAll(key, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 将list放入缓存
*
* @param key 键
* @param value 值
* @param time 时间(秒)
*/
public boolean lSet(String key, List<Object> value, long time) {
try {
redisTemplate.opsForList().rightPushAll(key, value);
if (time > 0){
expire(key, time, TimeUnit.SECONDS);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* zSet 管道存储
* @param key
* @param map
*/
public void zSetPipelined(String key, Map<Integer, String> map){
redisTemplate.executePipelined(new RedisCallback<Object>() {
@Override
public Object doInRedis(RedisConnection redisConnection) throws DataAccessException {
map.forEach((score, value) -> {
redisConnection.zSetCommands().zAdd(key.getBytes(), score, value.getBytes());
});
return null;
}
});
}
/**
* zSet 分页取值
* @param key
* @param pageNum
* @param pageSize
* @return
*/
public Set zSetGetByPage(String key, long pageNum, long pageSize){
if (Boolean.TRUE.equals(redisTemplate.hasKey(key))){
long start = (pageNum - 1) * pageSize;
long end = pageNum * pageSize - 1;
Long size = redisTemplate.opsForZSet().size(key);
if (size == null){
end = -1;
}else {
if (end > size) {
end = -1;
}
}
return redisTemplate.opsForZSet().range(key, start, end);
}
return null;
}
public Set getZSet(String key, long start, long end){
return redisTemplate.opsForZSet().range(key, start, end);
}
/**
* zSet 获取总条数
* @param key
* @return
*/
public Long zSetTotal(String key){
Long count = redisTemplate.opsForZSet().size(key);
return count;
}
}
4、存储【zSet】
Map<Integer, String> zsetMap = new HashMap<>(1);
zsetMap.put(student.getRow(), JSONUtil.toJsonStr(student));
redisUtil.zSetPipelined(redisKey, zsetMap);
5、分页
@ApiOperation(value = "redis分页")
@PostMapping("/redisPage")
public ResultData getRedisZsetPage(@Validated @RequestBody StudentQuery query){
List<Student> list = new ArrayList<>();
Long total = redisUtil.zSetTotal(query.getRedisKey());
if (total == null || total == 0){
return ResultData.error().message("无数据!");
}else {
Set objects = redisUtil.zSetGetByPage(query.getRedisKey(), query.getPageNo(), query.getPageSize());
if (objects != null){
Student bean;
for (Object object : objects) {
bean = JSONUtil.toBean(JSONUtil.toJsonStr(object), Student.class);
list.add(bean);
}
}
return ResultData.success().data("total", total).data("rows", list);
}
}