在 Spring boot 项目中引入了 Redis 和 Redisson之后,就可以通过 Redisson提供的客户端来操作 Redis数据了。
Redisson 是一个 Java 操作 Redis 的客户端:
有 Redis 操作基础的都了解,定义 ValueOperations valueOperations = redisTemplate.opsForValue();
之后,可以通过set
、get
方法来设置和获取 redis 的 key-value。
自定义RedisTemplate,配置类
@Configuration
public class RedisTemplateConfig {
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) {
// 指定RedisTemplate泛型中,k-v 的数据结构 String-object
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
// 必须指定 redis 连接器,构造工厂
redisTemplate.setConnectionFactory(connectionFactory);
// 指定 key 的序列化器 RedisSerializer.string(),以utf8的字符编码格式
redisTemplate.setKeySerializer(RedisSerializer.string());
return redisTemplate;
}
}
测试类
@SpringBootTest
public class RedisTest {
@Resource
private RedisTemplate redisTemplate;
@Test
void test() {
// 操作redis,增删改查
ValueOperations valueOperations = redisTemplate.opsForValue();
valueOperations.set("mingString", "dong", 10, TimeUnit.SECONDS);
valueOperations.set("mingInt", 1);
valueOperations.set("mingDouble", 2.1);
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
valueOperations.set("list1", list, 10, TimeUnit.SECONDS);
User user = new User();
user.setId(1L);
user.setUserName("mingdongdong");
valueOperations.set("mingUser", user);
// 查
String mingString = (String) valueOperations.get("mingString");
int mingInt = (Integer)valueOperations.get("mingInt");
Object mingDouble = valueOperations.get("mingDouble");
System.out.println(valueOperations.get("mingUser"));
System.out.println(mingString);
System.out.println(mingInt);
System.out.println(mingDouble);
}
}
以上是 redis 操作数据的基本代码,那 Redisson呢?
1.Redisson 配置相关信息
@Configuration
@ConfigurationProperties(prefix = "spring.redis")
@Data
public class RedissonConfig {
/**
* 定义redis连接地址
*/
private String host;
/**
*定义redis连接端口号
*/
private String port;
@Bean
public RedissonClient redissonClient() {
// 1. 创建配置
Config config = new Config();
/**
* String redissonAddress = "redis:127.0.0.1:6379";
* 这里可以不写死,用在yml配置文件的配置,动态读取redis配置
* @ConfigurationProperties(prefix = "spring.redis") prefix 添加读取的前缀
*/
String redissonAddress = String.format("redis://%s:%s", host, port);
config.useSingleServer()
.setAddress(redissonAddress)
// 分布式锁的存储可以和其他的缓存数据隔开,选择其他的库
.setDatabase(1);
// 2. 创建实例
RedissonClient redisson = Redisson.create(config);
return redisson;
}
}
Redisson 测试类
@SpringBootTest
public class RedissonTest {
@Resource
private RedissonClient redissonClient;
@Test
void test() {
// list jvm
List<String> list = new ArrayList<>();
list.add("ming");
System.out.println(list.get(0));
list.remove(0);
// redis
RList<String> rList = redissonClient.getList("test-list");
rList.add("mmm");
System.out.println(rList.get(0));
// Duration 更灵活的时间控制,可以选择使用相对时间 比如单纯的设置 10 秒后过期
rList.expire(Duration.ofMillis(10));
// Instance 绝对时间,精确控制过期时间,可以选择使用绝对时间
// rList.expire(Instant.ofEpochMilli(100));
// rList.remove(0);
// map
Map<String, Integer> map = new HashMap<>();
map.put("ming", 12);
map.get("ming");
RMap<Object, Object> rMap = redissonClient.getMap("test-map");
rMap.put("ming", 12);
// set
}
}
根据代码可以看出,Redisson 往 Redis 中添加数据的方式确实可以像 Java中操作 List、Map、Set集合一样操作。
这和 Redis 直接操作数据的方式有些区别:
Redis 可以在 set 的同时指定key的过期时间,而 Redisson 不是。
Redisson 操作 Redis 数据是通过集合的方式,和 Redis 对比有些区别
Redisson 给存储的数据设置过期的语法有不同
@Deprecated
boolean expire(long timeToLive, TimeUnit timeUnit);
@Deprecated
boolean expireAt(long timestamp);
@Deprecated
boolean expireAt(Date timestamp);
// 类似指定的是相对时间
boolean expire(Duration duration);
// 类似指定的是绝对时间,侧重点在于某个时间点
boolean expire(Instant time)
用 @Deprecated
标记的方法是早期版本提供的,仍然可以用,只是在往后升级的版本中会更推荐expire(Duration duration)
和expire(Instant time)
这两类。
介绍了Redisson如何往Redis中操作数据、给数据设置过期时间。