如何使用redis实现消息的订阅与发布
测试类
- /**
*redis消息订阅发布测试类
*/
@Controller
@RequestMapping(value="/queue")
publicclassTestControlller{
@Autowired
privateRedisTemplate redisService;
static{
newTestControlller().initThread("msgQueue");
}
/**订阅消息-启动消费队列数据线程**/
public void initThread(String key){
newThread(new blpopMessageHandler(key)).start();
}
/**发布消息--往队列里写数据**/
@RequestMapping(value="/brpush")
@UnSession
@ResponseBody
publicboolean brpush(String key,String name,int age)throwsException{
boolean flag = redisService.rpush(key,JSON.toJSONString(newEdu(name,age)));
return flag;
}
/**线程实时监听获取数据**/
class blpopMessageHandler implementsRunnable{
privateString key;
privateRedisTemplate redisTemplate=(RedisTemplate)SpringContextUtil.getBean("redisTemplate");
publicString getKey(){
return key;
}
publicvoid setKey(String key){
this.key = key;
}
public blpopMessageHandler(String key){
this.key = key;
}
@Override
publicvoid run(){
do{
//获取到数据
String result = redisTemplate.blpop(1000,key);
if(EmptyUtil.isNotEmpty(result)){
//do something
Edu edu = JSON.parseObject(result,Edu.class);
System.out.println("【线程一】"+edu.getName()+"---->"+edu.getAge());
}
}while(true);
}
}
}
model类
publicclassEduimplementsSerializable{
privatestaticfinallong serialVersionUID =-6336530413316596246L;
privateString name;
privateint age;
publicString getName(){
return name;
}
publicvoid setName(String name){
this.name = name;
}
publicint getAge(){
return age;
}
publicvoid setAge(int age){
this.age = age;
}
publicEdu(String name,int age){
this.name = name;
this.age = age;
}
@Override
publicString toString(){
return"Edu{"+
"name='"+ name +'\''+
", age="+ age +
'}';
}
}
操作redis类
/**
* 实现Jedis对象的封装,实现操作
*/
@Component
publicclassRedisTemplate{
privatestaticLogger logger =LoggerFactory.getLogger(RedisTemplate.class);
// 封装一个pool池用于jedis对象的管理
privatePool<Jedis> jedisPool;
publicRedisTemplate(Pool<Jedis> jedisPool){
this.jedisPool = jedisPool;
}
/**
* 存储REDIS队列 顺序存储
* @param key reids键名
* @param value 键值
*/
publicboolean rpush(String key,String value){
Jedis jedis =null;
boolean flag =false;
try{
jedis = jedisPool.getResource();
jedis.rpush(key.getBytes("utf-8"),value.getBytes("utf-8"));
flag =true;
}catch(Exception e){
//释放redis对象
jedisPool.returnBrokenResource(jedis);
e.printStackTrace();
}finally{
//返还到连接池
close(jedis);
}
return flag;
}
/**
* 获取队列数据
* @param key 键名
* @return
*/
publicString lpop(String key){
byte[] bytes =null;
Jedis jedis =null;
try{
jedis = jedisPool.getResource();
bytes = jedis.lpop(key.getBytes("utf-8"));
}catch(Exception e){
//释放redis对象
jedisPool.returnBrokenResource(jedis);
e.printStackTrace();
}finally{
//返还到连接池
close(jedis);
}
if(EmptyUtil.isNotEmpty(bytes)){
try{
returnnewString(bytes,"utf-8");
}catch(UnsupportedEncodingException e){
e.printStackTrace();
}
}
returnnull;
}
/**
* 获取阻塞list中的数据
* @param timeout
* @param key
* @return
*/
publicString blpop(int timeout,String key){
List<String> list =newArrayList<>();
Jedis jedis =null;
try{
jedis = jedisPool.getResource();
list = jedis.blpop(timeout,key);
}catch(Exception e){
//释放redis对象
jedisPool.returnBrokenResource(jedis);
e.printStackTrace();
}finally{
//返还到连接池
close(jedis);
}
returnEmptyUtil.isNotEmpty(list)&& list.size()>1? list.get(1):null;
}
privatevoid close(Jedis jedis){
try{
jedisPool.returnResource(jedis);
}catch(Exception e){
if(jedis.isConnected()){
jedis.quit();
jedis.disconnect();
}
}
}
}
相关推荐
消息队列:Redis支持发布/订阅模式,可用于事件驱动架构,实现异步消息传递。 缺点 复杂性:引入Redis增加了系统的复杂性,需要考虑数据一致性、部署维护等问题。 成本:部署和维护Redis需要额外的成本和资源。 无...
线索/ reactphp-redis 基于异步客户端实现。 是一个开源的高级内存中键值数据库。 它提供了一组简单的原子操作,以便使用其原始数据类型。 其轻巧的设计和快速的操作使其成为现代应用程序堆栈的理想选择。 该库为您...
把瞬间服务器的请求处理换成异步处理,缓解服务器的压力 实现数据顺序排列获取 redis实现消息队列步骤如下: 1).redis函数rpush,lpop 2).建议定时任务入队列 3)创建定时任务出队列 文件:demo.php插入数据到redis...
1、异步队列处理 2、redis 过滤(就是只处理当天第一次请求) 3、redis 辅助存储app名称(验证过后批量插入数据app名称表中) 4、拼接插入的以及新增的如详细表中 解决办法: 1、接口修改 redis 过滤 + 如l
cpp_redis cpp_redis是C ++ 11异步多平台轻量级Redis客户端,支持同步操作,流水线,标记和高可用性。需求cpp_redis没有依赖项。 它唯一的要求是C++11 。 它没有网络模块,因此您可以自由配置自己的模块,也可以使用...
使用者只是一个类,它定义了它将要侦听的mssages的结构,并且是一个实现用于处理该消息的逻辑的函数。出版您定义的每个使用者都将为您提供一种易于publish方法,您可以使用该方法将消息排队。 因为我们使用P
但消息队列可以做的不止是这一类场景,它在解耦、消峰、异步、一致性等方面都有很大的用武之地。因此如何合理使用消息队列来处理一些特殊的业务需求,这就是我们这节课要解决的内容。 【课程目录】 第1章 消息队列...
30道Redis经典面试题,学会拿高薪...Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB,不像 memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能。
Redis可以用来实现很多有用的功能,比方说用他的List来做FIFO双向链表,实现-个轻量 级的高性能消息队列服务,用他的Set可以做高性能的tag系统等等。另外Redis也可以对存 入的Key-Value设置expire时间,因此也可以被...
业务和异常因为时间关系就直接写在了controller,根据需要修改位置,另外RabbitMq的异步处理和多线程业务,看需要也可以开启。秒杀系统(SpringBoot + Redis + RabbitMq)
一般使用更专业的消息队列来处理这种业务场景,因此这里就略过了。三种命令模式Sync vs Async vs Fire-and-Forget最后,这里有三种命令模式分别对应 StackExchange.Redis的三类不同的使用场景。Sync,同步模式会直接...
发布/订阅:Redis提供了发布/订阅功能,能够实现消息的异步发布和订阅,适用于实时通知、事件驱动等场景。 分布式支持:Redis提供了分布式部署和数据分片功能,能够构建高可用性、可扩展性的分布式系统。 高性能:...
Java实现消息队列,异步队列、延迟队列、死信队列、各种异常逻辑处理。 完全开源、自主研发,实际项目中使用验证,功能稳定,性能优,部署时集成Redis即可。 基于springboot框架,启动快,各种容错,占用内存资源少
异步:将同步请求转换为异步请求,来提高并发量,本质也是削峰处理 利用缓存:创建订单时,每次都需要先查询判断库存,只有少部分成功的请求才会创建订单,因此可以将商品信息放在缓存中,减少数据库查询 负载均衡:...
比方说用他的 List 来做 FIFO 双向链表,实现一个轻量级的高性 能消息队列服务,用他的 Set 可以做高性能的 tag 系统等等。 另外 Redis 也可以对存入的 Key-Value 设置 expire 时间,因此也可以被当作一 个功能加强...
消息队列:使用RabbitMQ进行异步消息处理。 构建工具:使用Maven进行项目构建。 3. 系统设计 数据库设计:设计数据库模型,包括用户、预约记录、就诊记录、药品等实体。 用户界面设计:设计用户友好的界面,确保良好...
任务队列用到分布式锁的情况比较多,在将业务逻辑中可以异步处理的操作放入队列,在其他线程中处理后出队,此时队列中使用了分布式锁,保证入队和出队的一致性。关于redis队列这块的逻辑分析,我将在下一次对其进行...
存储过程等),用Redis做中间缓存,缓存数据 实现异步处理,定时任务,整合Quartz Job以及Spring Task 邮件管理功能, 整合spring-boot-starter-mail发送邮件等, 数据源:druid 用户管理,菜单管理,角色管理,代码...
实现异步处理,定时任务,整合Quartz Job以及Spring Task 邮件管理功能, 整合spring-boot-starter-mail发送邮件等, 数据源:druid 用户管理,菜单管理,角色管理,代码生成 运行环境 jdk8+oracle+redis+...
本译文结合Django+Celery+Redis实现一个定期从Flickr获取图片并展示的简单案例,方便大家理解实现异步对列任务的过程。刚接触django的时候,我经历过的最让人沮丧的事情是需要定期运行一段代码。我写了一个需要每天...