文章目录
SpringBoot 结合redis写的小测试,记录一下。
首先SpringBoot 项目里添加redis依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
在application.yml
里简单配置一下:
spring:
redis:
host: localhost
port: 6379
password:
定义了一个实体类,记录缓存数据:
import org.springframework.data.redis.connection.DataType;
/**
* 封装的redis数据对象
*/
public class RedisDO {
private String key; // 键
private Object value; // 值
private DataType dataType; // 值的类型
private Long expire; // 过期时间,以秒为单位
public RedisDO() {
super();
}
public RedisDO(String key, Object value, DataType dataType, Long expire) {
super();
this.key = key;
this.value = value;
this.dataType = dataType;
this.expire = expire;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
public DataType getDataType() {
return dataType;
}
public void setDataType(DataType dataType) {
this.dataType = dataType;
}
public Long getExpire() {
return expire;
}
public void setExpire(Long expire) {
this.expire = expire;
}
@Override
public String toString() {
return "RedisDO [key=" + key + ", value=" + value + ", dataType=" + dataType + ", expire=" + expire + "]";
}
}
redis保存的数据类型有string,list,set,zset,hash等,不同类型赋值取值方法是不同,所以封装到了一个service里。
import java.util.Set;
public interface RedisService {
void set(RedisDO redisDO);
RedisDO get(String key);
/**
* 模糊匹配返回符合的key
*/
Set<String> scan(String pattern);
}
下面是实现类,有点长
@Service
public class RedisServiceImpl implements RedisService {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@SuppressWarnings("unchecked")
@Override
public void set(RedisDO redisDO) {
String key = redisDO.getKey();
Object value = redisDO.getValue();
Long expire = redisDO.getExpire();
switch (redisDO.getDataType()) {
case STRING:
// 这种方法保存String,value会有乱码\x00
// stringRedisTemplate.opsForValue().set(key,value.toString(),expire);
// 这种方法value不会乱码,顺便设置了expire,但expire是负数会抛异常
// stringRedisTemplate.opsForValue().set(key,value.toString(),expire,TimeUnit.SECONDS);
// 这种方法可以,但需要额外设置expire
BoundValueOperations<String, String> boundValueOps = stringRedisTemplate.boundValueOps(key);
boundValueOps.set(value.toString());
break;
case LIST:
BoundListOperations<String, String> boundListOps = stringRedisTemplate.boundListOps(key);
List<String> list = (List