很多情况下,不是使用单机redis,而是使用集群,在集群模式下,如何存储对象呢,我们通过这篇文章一一介绍。
创建工程
先在网站上https://start.spring.io/创建一个Gradle工程,相关依赖导入如下:
dependencies {
compile('org.springframework.boot:spring-boot-starter-data-redis')
compile('org.springframework.boot:spring-boot-configuration-processor')
compile('redis.clients:jedis')
compile('org.projectlombok:lombok')
compile('com.alibaba:fastjson:1.2.47')
compile('org.springframework.boot:spring-boot-starter-web')
compile('org.springframework.boot:spring-boot-starter-test')
}
application.yml配置
server:
port: 8081
spring:
redis:
host: 127.0.0.1
#password:
timeout: 1000
database: 0 #默认有16个db(集群模式下无多db概念,取而代之是hash槽),默认是第0个
lettuce:
pool:
max-active: 8 #最大连接数(使用负值表示没有限制) 默认 8
max-wait: -1 #最大阻塞等待时间(使用负值表示没有限制) 默认 -1
max-idle: 8 #最大空闲连接 默认 8
min-idle: 0
cluster:
nodes:
- 172.19.165.222:9001
- 172.19.165.222:9002
- 172.19.165.222:9003
- 172.19.165.222:9004
- 172.19.165.222:9005
- 172.19.165.222:9006
RedisCluster
从配置文件获取nodes信息,如下:
RedisClusterProperties.java
@Configuration
@ConfigurationProperties(prefix = "spring.redis.cluster")
public class RedisClusterProperties {
//cluster nodes
private List<String> nodes=new ArrayList<>();
public List<String> getNodes() {
return nodes;
}
public void setNodes(List<String> nodes) {
this.nodes = nodes;
}
}
接着从获取的nodes信息中配置JedisCluster实例
@Configuration
@ConditionalOnClass(RedisClusterConfig.class)
@EnableConfigurationProperties(RedisClusterProperties.class)
public class RedisClusterConfig {
@Resource
private RedisClusterProperties redisClusterProperties;
@Bean
public JedisCluster redisCluster(){
Set<HostAndPort> nodes = new HashSet<>();
for (String node:redisClusterProperties.getNodes()){
String[] parts= StringUtils.split(node,":");
Assert.state(parts.length==2, "redis node shoule be defined as 'host:port', not '" + Arrays.toString(parts) + "'");
nodes.add(new HostAndPort(parts[0], Integer.valueOf(parts[1])));
}
return new JedisCluster(nodes);
}
}
配置完成后,就可以注入并使用JedisCluster实例了。
下面编写序列化的工具类,可以以json字符串或二进制方式存储,如下:
public class SerializeUtil {
/*
* 序列化
* */
public static byte[] serizlize(Object object) {
try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);) {
oos.writeObject(object);
byte[] bytes = baos.toByteArray();
return bytes;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/*
* 反序列化
* */
public static Object deserialize(byte[] bytes) {
try (ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bais);) {
return ois.readObject();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* json序列化
* @param object
* @return
*/
public static String serizlizeJson(Object object) {
return JSON.toJSONString(object);
}
/**
* json反序列化-简单类型
* @param jsonstr
* @return
*/
public static <T> T deserialize(String jsonstr, Class<T> klass) {
T t = JSON.parseObject(jsonstr, klass);
return t;
}
/**
* json反序列化-复杂类型
* @param jsonstr
* @return
*/
public static <T> T deserialize(String jsonstr, TypeReference<T> typeReference) {
T t = JSON.parseObject(jsonstr, typeReference);
return t;
}
}
下面编写测试类
@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisClusterApplicationTests {
@Autowired
private JedisCluster jedisCluster;
@Test
public void set_get() {
jedisCluster.set("testkey", "testvalue");
Assert.assertEquals("testvalue", jedisCluster.get("testkey"));
jedisCluster.del("testkey");
}
@Test
public void hset_hget() {
jedisCluster.hset("webside", "google", "www.google.com");
Assert.assertEquals("www.google.com", jedisCluster.hget("webside", "google"));
jedisCluster.del("webside");
}
@Test
public void hmset_hmget() {
Map<String, String> map = new HashMap<>();
map.put("google", "www.google.com");
map.put("baidu", "www.baidu.com");
jedisCluster.hmset("webside", map);
Assert.assertEquals("www.google.com", jedisCluster.hget("webside", "google"));
Assert.assertEquals(2, jedisCluster.hmget("webside", "google", "baidu").size());
jedisCluster.del("webside");
}
@Test
public void hset_json_obj() {
// 非格式化
String s = JSON.toJSONString(getStudent(),false);
jedisCluster.hset("jsonObject", "student", s);
//Student stu = JSON.parseObject(jedisCluster.hget("jsonObject", "student"), Student.class);
Student stu = SerializeUtil.deserialize(jedisCluster.hget("jsonObject", "student"), Student.class);
Assert.assertEquals("张三", stu.getName());
jedisCluster.del("jsonObject");
}
@Test
public void hset_json_obj_byte() {
jedisCluster.hset("jsonObject".getBytes(), "student".getBytes(), SerializeUtil.serizlize(getStudent()));
Student stu = (Student) SerializeUtil.deserialize(jedisCluster.hget("jsonObject".getBytes(), "student".getBytes()));
Assert.assertEquals("张三", stu.getName());
jedisCluster.del("jsonObject");
}
@Test
public void hset_json_list() {
// 非格式化
String s = JSON.toJSONString(getStudentList());
System.out.println(s);
jedisCluster.hset("jsonObjectList", "student", s);
//List<Student> stus = JSON.parseObject(jedisCluster.hget("jsonObjectList", "student"), new TypeReference<List<Student>>(){});
List<Student> stus = SerializeUtil.deserialize(jedisCluster.hget("jsonObjectList", "student"), new TypeReference<List<Student>>(){});
Assert.assertEquals(2, stus.size());
Assert.assertEquals("张三", stus.get(0).getName());
//jedisCluster.del("jsonObjectList");
}
@Test
public void hset_json_map() {
Map<String, String> map = new HashMap<>();
map.put("k1", "v1");
map.put("k2", "v2");
map.put("k3", "v3");
List<Map<String, String>> list = new ArrayList<>();
list.add(map);
// 非格式化
String s = JSON.toJSONString(list,false);
System.out.println(s);
jedisCluster.hset("jsonObjectMap", "student", s);
List<Map<String, String>> stus = JSON.parseObject(jedisCluster.hget("jsonObjectMap", "student"), new TypeReference<List<Map<String, String>>>(){});
Assert.assertEquals(1, stus.size());
Assert.assertEquals("v1", stus.get(0).get("k1"));
jedisCluster.del("jsonObjectMap");
}
private Student getStudent() {
Student student = new Student();
student.setName("张三");
student.setAge(22);
student.setSex("男");
student.setAddress("武汉");
return student;
}
private List<Student> getStudentList() {
List<Student> list = new ArrayList<>();
Student student = new Student();
student.setName("张三");
student.setAge(22);
student.setSex("男");
student.setAddress("武汉");
list.add(student);
Student student2 = new Student();
student2.setName("李四");
student2.setAge(23);
student2.setSex("男");
student2.setAddress("北京");
list.add(student2);
return list;
}
}
通过此方式可以方便的将对象存储到rediscluster,对于一些需要高效访问的系统非常有用。
网友评论