|
redis现在比较长用做缓存服务器,nosql数据库,同时它还具有实现消息的发布订阅的功能。本篇文章将会实现一个用redis实现发布订阅功能的一个demo
首先用一个实体对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| package com.wtf.demo.redis;
import java.io.Serializable;
public class UserBean implements Serializable {
private String username;
private String address;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
|
我们会发布这个对象,当这个对象,并且可以更改这个对象 的属性,发布的代码 如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| package com.wtf.demo.redis;
import redis.clients.jedis.Jedis;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class TestPub {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
Jedis jedis = new Jedis("127.0.0.1",6379);
UserBean ub = new UserBean();
ub.setUsername("张三");
ub.setAddress("上海市");
ByteArrayOutputStream os = new ByteArrayOutputStream();
ObjectOutputStream op = new ObjectOutputStream(os);
op.writeObject(ub);
String msg1 = os.toString("ISO-8859-1");
jedis.publish("ub", msg1);
}
}
|
发布完成以后,我们建立一个订阅的类,以上发布了ub这个对象,在订阅类中,我们需要JedisPubSub这个对象,并且实现里面的相关方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
| package com.wtf.demo.redis;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;
import java.io.ByteArrayInputStream;
import java.io.ObjectInputStream;
public class TestSub {
public static void main(String[] args) {
Jedis jedis = new Jedis("uat.www.nanapanda.cn",6379);
JedisPubSub jedisPubSub = new JedisPubSub() {
@Override
public void onUnsubscribe(String channel, int subscribedChannels) {
}
@Override
public void onSubscribe(String channel, int subscribedChannels) {
}
@Override
public void onPUnsubscribe(String pattern, int subscribedChannels) {
}
@Override
public void onPSubscribe(String pattern, int subscribedChannels) {
}
@Override
public void onPMessage(String pattern, String channel,
String message) {
}
@Override
public void onMessage(String channel, String message) {
try {
ByteArrayInputStream bis = new ByteArrayInputStream(
message.getBytes("ISO-8859-1"));//此处指定字符集将字符串编码成字节数组,此处的字符集需要与发布时的字符集保持一致
ObjectInputStream ois = new ObjectInputStream(bis);
UserBean bean = (UserBean) ois.readObject();
System.out.println(bean.getUsername());
System.out.println(bean.getAddress());
} catch (Exception e) {
e.printStackTrace();
} finally {
}
}
};
jedis.subscribe(jedisPubSub, "ub");
}
}
|
这样在运行 了TestPub类以后,再运行TestSub类,将会有如下输出
--------------------
张三
上海市
在TestPub中更改UserBean 的属性,把地址更改为北京,在订阅窗口将会得到如下值
------------------
张三
北京
|
|
|