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

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");
	}
}



时间: 2024-10-18 03:53:40

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

消息队列及常见消息队列介绍

原文链接:https://cloud.tencent.com/community/article/129032 一.消息队列(MQ)概述 消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以简单地描述为: 当不需要立即获得结果,但是并发量又需要进行控制的时候,差不多就是需要使用消息队列的时候. 消息队列主要解决了应用耦合.异步处理.流量削锋等问题. 当前使用较多的消息队列有RabbitMQ.RocketMQ.ActiveMQ.Kafka.ZeroMQ.MetaM

用STL设计消息队列、优先级消息队列、资源分配管理器

STL库老早已经成为C++的一部分,在使用C++开发项目的过程中,很多人还在犹豫要不要使用STL库,觉得STL库很难,其实不然.我工作的项目中现在大量使用STL库,STL使用调试简单,高效,可以减少很多重复的代码. 本文的主要目的是使用STL的queue 和 priority queue来阐述下项目中经常使用的消息队列以及资源分配模式.本文的例子主要如下: 消息队列 带优先级的消息队列 资源分配管理器 STL容器 我们将使用下面的容器来实现本文的例子: queue 队列容器支持添加一个元素,并且

PHP下使用Redis消息队列发布微博

phpRedisAdmin :github地址  图形化管理界面 git clone https://github.com/ErikDubbelboer/phpRedisAdmin.git cd phpRedisAdmin git clone https://github.com/nrk/predis.git vendor 首先安装上述的Redis图形化管理界面,能够方便的管理Redis数据 为了降低Mysql的并发数,先把用户的微博存在Redis中 假设用户发布的时候需要三个字段,uid(用户

PHP下使用Redis消息队列发布微博(复制)

phpRedisAdmin :github地址  图形化管理界面 git clone https://github.com/ErikDubbelboer/phpRedisAdmin.git cd phpRedisAdmin git clone https://github.com/nrk/predis.git vendor 首先安装上述的Redis图形化管理界面,能够方便的管理Redis数据 为了降低Mysql的并发数,先把用户的微博存在Redis中 假设用户发布的时候需要三个字段,uid(用户

使用消息队列发布微博

在一些用户发布内容应用中,可能出现1秒上万个用户同时发布消息的情况,此时使用mysql可能会出现" too many connections"错误,当然把Mysql的max_connections参数设置为更大数,不过这是一个治标不治本的方法.而使用redis的消息队列,把用户发布的消息暂时存储在消息队列中,然后使用多个cron程序把消息队列中的数据插入到Mysql.这样就有效的降低了Mysql的高并发.具体实现原理如下: 现有微博发布接口: $weibo = new Weibo();

消息队列_RabbitMQ-0001.RabbitMQ消息代理/队列服务器快速安全部署?

简单介绍: 说明: RabbitMQ是最先支持AMQP标准的高级消息队列协议,是一个开源的消息代理和队列服务器,主要用于不同应用之间共享数据以及为分布式服务器进行任务编排,可有效应对大流量,高负载系统通信. 相关网址: 官方下载: http://www.rabbitmq.com/ 依赖下载: http://www.erlang.org/ 快速安装: yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-deve

强化一下概念:程序自己不去取消息,消息不会自己跑过来运行(针对线程消息队列里的消息,也是绝大多数消息)

刚才看这段代码的时候: procedure TControl.SetBounds(ALeft, ATop, AWidth, AHeight: Integer); begin if CheckNewSize(AWidth, AHeight) and ((ALeft <> FLeft) or (ATop <> FTop) or (AWidth <> FWidth) or (AHeight <> FHeight)) then begin InvalidateCon

Android学习之Bitmap对象与字节数组相互转换

1.将Bitmap对象读到字节数组中 ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); byte[] datas = baos.toByteArray(); 2.将字节数组转为Bitmap对象 byte[] b = getIntent().getByteArrayExtra("bitmap"); Bitmap

消息队列如何处理重复消息

一.消息重复现象 在 MQTT 协议中,给出了三种传递消息时能够提供的服务质量标准: At most once:最多一次,这种情况会丢失部分数据,一般日志收集这种对数据不严格的可以使用 At least once:最少一次,这种会导致一条消息重复发送 Exactly once:正好一次,一条消息只会被消费一次 RocketMQ,Rabbit MQ,Kafka都是使用的At least once,虽然消息会重复,但不会丢失.不使用Exactly once这种呢,是因为这种每次发送前发送都要检查这条