1.配置文件
#redis默认数据库索引
spring.redis.database=0
#redis服务器地址
spring.redis.host=localhost
#redis服务器连接端口
spring.redis.port=6379
#redis服务器连接密码
spring.redis.password=
2.redis的配置类
Springboot中,配置类前需加上@Configuration和@Enablecaching
/**
设置数据存入redis的序列化方式
@Param redisTemplate
@Param RedisConnectionfactory
*/
private void initDomainRedisTemplate(RedisTemplate<String, Object> redisTemplate, RedisConnectionFactory factory) {
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer());
redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
redisTemplate.setConnectionFactory(factory);
}
/**
注入RedisConnectFactory
*/
@Autowired
RedisConnectionFactory factory;
/**
实例化RedisTemplate对象
*/
@Bean
public RedisTemplate<String,Object> functionDomainRedisTemplate(){
RedisTemplate<String,Object> redisTemplate=new RedisTemplate<>();
initDomainRedisTemplate(redisTemplate,factory);
return redisTemplate;
}
/*
创建Hash键值对的bean使spring能控制对象
*/
@Bean
public HashOperations<String,String,Object> hashOperations(RedisTemplate<String,Object> redisTemplate){
return redisTemplate.opsForHash();
}
/*
创建Value的bean
*/
@Bean
public ValueOperations<String,Object> valueOperations(RedisTemplate<String,Object> redisTemplate){
return redisTemplate.opsForValue();
}
/*
创建List的bean,可以进行list一系列操作
*/
@Bean
public ListOperations<String,Object> listOperations(RedisTemplate<String,Object> redisTemplate){
return redisTemplate.opsForList();
}
/*
创建Set的bean,可以进行Set的操作
*/
@Bean
public SetOperations<String,Object> setOperations(RedisTemplate<String,Object> redisTemplate){
return redisTemplate.opsForSet();
}
/*
创建zset的bean,可以进行排序集合的操作
*/
@Bean
public ZSetOperations<String,Object> zSetOperations(RedisTemplate<String,Object> redisTemplate){
return redisTemplate.opsForZSet();
}
3.创建缓存对象实例,这里以hash类型为例,属性为redisKey,name,tel,address;redisKey为key名,整体实例的后三个属性为value值,实例类继承Serializable接口,可以序列化为流对象进行读写操作
public class RedisModel implements Serializable {
private String redisKey;
private String name;
private String tel;
private String address;
/*
getter and setter
*/
public String getRedisKey() {
return redisKey;
}
public void setRedisKey(String redisKey) {
this.redisKey = redisKey;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
4.IRedisService抽象类,对需要用到的服务进行封装
public abstract class IRedisService<T> {
@Autowired
RedisTemplate<String,Object> redisTemplate;
@Resource
HashOperations<String,String,T> hashOperations;
/**
获取存入redis中的key
*/
protected abstract String getRedisKey();
/**
添加键值对信息进hash中
@Param key hash键名
@Param domain 对象,类型为Object
@Param expire 过期时间,若为-1则表示不设置时间
*/
public void put(String key,T domain,long expire){
hashOperations.put(getRedisKey(),key,domain);
if(expire!=-1){
redisTemplate.expire(key,expire,TimeUnit.SECONDS);
}
}
/**
删除对应键名的hash
@Param key
*/
public void delete(String key){
hashOperations.delete(getRedisKey(),key);
}
/**
根据键名key查询redis中该hash中的值
*/
public T get(String key){
return hashOperations.get(getRedisKey(),key);
}
/*
获取当前redis库中所有对象
*/
public List<T> getAll(){
return hashOperations.values(getRedisKey());
}
/**
* 查询查询当前redis库下所有key
*
* @return
*/
public Set<String> getKeys(){
return hashOperations.keys(getRedisKey());
}
/**
* 判断key是否存在redis中
*
* @param key 传入key的名称
* @return
*/
public boolean isKeyExists(String key){
return hashOperations.hasKey(getRedisKey(),key);
}
/**
* 查询当前key下缓存数量
* 即当前hash下面的键值对数量
* @return
*/
public long count(){
return hashOperations.size(getRedisKey());
}
/**
* 清空redis中当前hash的所有键值对
*/
public void empty(){
Set<String> set=getKeys();
for(String s:set){
delete(s);
}
}
}
5.实现抽象类中的getRedisKey方法
@Service
public class IRedisServiceImpl extends IRedisService<RedisModel> {
private static final String REDIS_KEY="TEST_REDIS_KEY";
@Override
public String getRedisKey(){
return REDIS_KEY;
}
}
6.在controller中进行测试
@Controller
public class TestController {
@Autowired
IRedisService<RedisModel> service;
//添加
@RequestMapping(value = "/add", method = RequestMethod.GET)
@ResponseBody
public void test() {
System.out.println("start.....");
RedisModel m = new RedisModel();
m.setName("张三");
m.setTel("1111");
m.setAddress("深圳1");
m.setRedisKey("zhangsanKey01");
service.put(m.getRedisKey(), m, -1);
RedisModel m2 = new RedisModel();
m2.setName("张三2");
m2.setTel("2222");
m2.setAddress("深圳2");
m2.setRedisKey("zhangsanKey02");
service.put(m2.getRedisKey(), m2, -1);
RedisModel m3 = new RedisModel();
m3.setName("张三3");
m3.setTel("2222");
m3.setAddress("深圳2");
m3.setRedisKey("zhangsanKey03");
service.put(m3.getRedisKey(), m3, -1);
System.out.println("add success end...");
}
//查询所有对象
@RequestMapping(value = "/getAll", method = RequestMethod.GET)
@ResponseBody
public Object getAll() {
return service.getAll();
}
//查询所有key
@RequestMapping(value = "/getKeys", method = RequestMethod.GET)
@ResponseBody
public Object getKeys() {
return service.getKeys();
}
//根据key查询
@RequestMapping(value = "/get", method = RequestMethod.GET)
@ResponseBody
public Object get() {
RedisModel m = new RedisModel();
m.setRedisKey("zhangsanKey02");
return service.get(m.getRedisKey());
}
//删除
@RequestMapping(value = "/remove", method = RequestMethod.GET)
@ResponseBody
public void remove() {
RedisModel m = new RedisModel();
m.setRedisKey("zhangsanKey01");
service.delete(m.getRedisKey());
}
//判断key是否存在
@RequestMapping(value = "/isKeyExists", method = RequestMethod.GET)
@ResponseBody
public void isKeyExists() {
RedisModel m = new RedisModel();
m.setRedisKey("zhangsanKey01");
boolean flag = service.isKeyExists(m.getRedisKey());
System.out.println("zhangsanKey01 是否存在: "+flag);
}
//查询当前缓存的数量
@RequestMapping(value = "/count", method = RequestMethod.GET)
@ResponseBody
public Object count() {
return service.count();
}
//清空所有key
@RequestMapping(value = "/empty", method = RequestMethod.GET)
@ResponseBody
public void empty() {
service.empty();
}
}