RedisUtil工具类
简单写了一个RedisUtil工具类,供大家参考
package com.ssm.service;
import com.alibaba.fastjson.JSON;
import com.ssm.entity.LoanInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Component;
import java.util.Set;
import java.util.concurrent.TimeUnit;
@Component
public class RedisUtil {
private static RedisTemplate<String,Object> redisTemplate;
@Autowired
public void setRedisTemplate(RedisTemplate<String,Object> redisTemplate){
this.redisTemplate = redisTemplate;
}
/**
* 存单个实体
* @param key
* @param object
*/
public static void addToRedis(String key,Object object){
// redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
//没有设置过期时间
redisTemplate.opsForValue().set(key,object);
}
/**
* redis中是否存在key
* @param key 需要查找的key
* @return
*/
public static boolean hasKey(String key){
return redisTemplate.hasKey(key);
}
/**
* 删除redis中指定的键值对
* @param key
*/
public static void deleteKey(String key){
redisTemplate.delete(key);
}
/**
* 模糊删除键值对
* @param patternKey
*/
public static void batchDeletekey(String patternKey){
Set<String> set = redisTemplate.keys(patternKey);
redisTemplate.delete(set);
//redisTemplate.expire()
//redisTemplate.execute() 这两个的用法
}
/**
* 通过key获取value(list)
* @param key
* @return 返回的list集合
*/
public static Object getValue(String key){
/**
* 也可以使用Jackson2JsonRedisSerializer进行序列化,需要提供一个实体类参数
* 需要注意几点:
* 1.序列化和反序列化需要使用同一种序列化器
* 2.使用Jackson2JsonRedisSerializer存带泛型的list时,是以map的结构存的,取的时候不能直接转换为实体对象,否则
* 会报类型转换异常,对此有两种解决方案:
* (1)直接存list<T>类型,取的时候若需要遍历每一个对象,则先将对象转为json字符串,再将json字符串转为实体对象
* (2)存的时候讲list<T>转为json字符串进行存储,取的时候再讲json字符串转为list
* 3.任何类型都可以转为Object类型,Object类型也可以强制转为任何类型,但是强制转换,工具在编译的时候会提示类型不安全,此时需要用
* instance of 来进行类型校验
* 4.Jackson2JsonRedisSerializer和GenericJackson2JsonRedisSerializer的区别
* 相同点:在redis中都是以json格式存储,直观好看
* 不同点:GenericJackson2JsonRedisSerializer存储时保存了实体类的包名和类目,这也是为什么这种序列化方式可以直接转换实体对象的原因
* 相比较而言,Jackson2JsonRedisSerializer的效率更高,因为存储的内容要少
*/
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
Object object = redisTemplate.opsForValue().get(key);
return object;
}
/**
* 模糊查找key
* @param pattern
* @return
*/
public static Set<String> getKeys(String pattern){
return redisTemplate.keys(pattern);
}
}
应用:
String key = idCard + "AllLoanInfo";
if(redisUtil.hasKey(key)){
//redis中有,就去redis中取
infos = (List<LoanInfo>)redisUtil.getValue(key);
}else{
//没有则去数据库查,查完有值再放入redis
infos = userService.queryLoanInfoByIdCard(idCard);
if(infos != null && infos.size()>0){
redisUtil.addToRedis(key,infos);
}
}