上一节 简单介绍了SpringBoot如何使用Redis。使用的是单机版,但在实际应用中,为了性能的更稳定、响应速度更快,以及分布式的使用,更多的是倾向于Redis集群模式。凡事先简后难,使用一个东西,首先必须保证在这上面的初期你会得到小的满足感,也就是说,你能感觉到有所谓的成就感。掌握了常规的Redis的使用,了解后你才有兴趣去探索和完成集群又是个什么东东吧。说实话,集群还真不是个人开发能轻易达到的标准。首先要明白的是,实操就得6台电脑才能完成,个人用户怎么可能有6台电脑来搞嘛,对吧。但也有方法,现在各大云服务器都有免费试用版,一个月的期限。反正闲置也是闲置,花点功夫,实名认证一下,也可以搞到少说七八台吧。搞到了就开始实操吧。
看了很多帖子都有关Redis如何搭建集群的,但总感觉少了点什么,因为大多都是在同一台电脑上分配6个节点来进行集群创建,并不是理想的状态,所以自己就搞了6台服务器,来体验一下这种不一样的感觉吧。首先来看下集群的启动状态:
创建SpringBoot项目后,打开application.properties进行配置:
# 配置启动默认端口
server.port=8080
# 单机模式
# spring.redis.host=127.0.0.1
# 端口
# spring.redis.port=6379
# 集群模式
spring.redis.cluster.nodes=39.107.65.223:6379,154.8.183.144:6379,124.71.148.52:6379,183.60.104.198:6379,42.193.5.237:6379,8.135.26.156:6379
# 密码
spring.redis.password=123@56
创建简单测试类Book,这里继续简单说明下:继承 Serializable 是为了使用@ResponseBody返回对象的时候能够对其进行json序列化,从而返回对应的json数据格式。
package com.redis.pojo;
import java.io.Serializable;
public class Book implements Serializable {
private String ID;
private String Name;
private String Author;
private String Press;
private String Key;
public String getID() {
return ID;
}
public void setID(String ID) {
this.ID = ID;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public String getAuthor() {
return Author;
}
public void setAuthor(String author) {
Author = author;
}
public String getPress() {
return Press;
}
public void setPress(String press) {
Press = press;
}
public String getKey() {
return Key;
}
public void setKey(String key) {
Key = key;
}
}
编写一个Controller进行Redis集群验证和使用,并设置过期时间:Java好处就是使用Redis的时候,永远比.NET Core方便。就比如我在整理给Redis设置过期时间的时候,.NET Core还得实例化另一个对象才能对其才能设置过期时间,在我的另一篇博文ASP.NET Core使用Redis有详细介绍。
//设置过期时间
var options = new DistributedCacheEntryOptions()
.SetSlidingExpiration(TimeSpan.FromSeconds(30));
//使用Set存储Redis对象
distributed.Set("timeout", bytes, options);
而在Java中就相当简单了,只需在Set<key,value,long,time>加上相应的属性即可,使用起来可谓相当舒服了!
ValueOperations opsis=redisTemplate.opsForValue();
//opsis.set("book"+i,book);
opsis.set("book"+i,book,10, TimeUnit.HOURS);
以下是完整的SpringBoot使用Redis集群的Controller完整示例代码:
package com.redis.controller;
import com.redis.pojo.Book;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
@Controller
@RequestMapping("/home")
public class HomeController {
@Autowired
RedisTemplate redisTemplate;
@Autowired
StringRedisTemplate stringRedisTemplate;
@RequestMapping("/redis")
@ResponseBody
public List<Book> Test(){
List<Book> books=new ArrayList<>();
for (int i=0;i<1000;i++){
//存储String
ValueOperations<String,String> opsi=stringRedisTemplate.opsForValue();
opsi.set("key"+i,"SpringBoot中使用StringRedisTemplate存储字符串,RedisTemplate存储对象",10,TimeUnit.HOURS);
Book book=new Book();
book.setID(UUID.randomUUID().toString().replace("-",""));
book.setName("日出东方");
book.setAuthor("东方不败");
book.setPress("贵大出版社");
book.setKey(opsi.get("key"+i));
books.add(book);
}
//存储对象
ValueOperations ops=redisTemplate.opsForValue();
ops.set("books",books,2, TimeUnit.HOURS);
List<Book> list=(List<Book>)ops.get("books");
return list;
}
}
最后的运行结果: