jedis实现redis的消息队列、发布对象消息、字节数组与字符串相互转换

本文介绍了如何利用jedis实现redis的消息队列功能,包括发布和订阅操作。通过序列化对象并将其转换为字符串进行传输,详细讨论了在jedis中处理字节数组和字符串转换的技巧,并提供了相关的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    redis支持发布/订阅的消息队列机制,jedis提供了java访问redis的客户端,本文将描述如何用jedis实现简单的消息队列,并传输对象。

    redis支持发布、订阅的功能,基本的命令有publish、subscribe等。在jedis中,有对应的java方法,并且只能发布字符串消息。为了传输对象,需要将对象进行序列化,并封装成字符串进行处理。将对象序列化后,只能成为字节流,如何封装成字符串是一个难点,具体可参考下面的代码。

    实现三个类,一个对应publish、一个对应subscribe、一个对应要传递的对象实体类。

    实体类:

public class Bean implements Serializable {//需要实现序列化接口
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

    publish类:

public class TestPub {
	public static void main(String[] args) {
		Jedis jedis = new Jedis("127.0.0.1");
		try {
			Bean bean = new Bean();
			bean.setName("test");
                        //使用ObjectOutputStream和ByteArrayOutputStream将对象转换成字节流
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			ObjectOutputStream oos = new ObjectOutputStream(baos);
			oos.writeObject(bean);
			String msg1 = baos.toString("ISO-8859-1");//指定字符集将字节流解码成字符串,否则在订阅时,转换会有问题。
			// msg1 = URLEncoder.encode(msg1, "UTF-8");
			jedis.publish("foo", msg1);
		} catch (Exception e) {

		}
	}
}

    subscribe类:

public class TestSub {
	public static void main(String[] args) {
		Jedis jedis = new Jedis("127.0.0.1");
		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);
					Bean bean = (Bean) ois.readObject();
					System.out.println(bean.getName());
				} catch (Exception e) {
					e.printStackTrace();
				} finally {

				}
			}
		};
		jedis.subscribe(jedisPubSub, "foo");
	}
}




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值