阿帕奇骆驼遇见Redis

键值商店的兰博基尼

Camel是最好的面包集成框架,在本文中,我将向您展示如何通过利用另一个出色的项目Redis使它更加强大。

Camel 2.11即将发布,具有许多新功能,错误修复和组件。 这些新组件中的几个是我创作的, redis-component是我最喜欢的组件 。 Redis – ligth键/值存储区是一款出色的意大利软件,专为提高速度而设计(与Lamborghini相同– Lamborghini –这是一款两人座的意大利汽车,专为 速度)。 Redis用C语言编写,并且具有接近金属的内存,Redis的表现非常出色(Lamborgini的座右铭是“ Closer to the Road”)。 Redis通常被称为数据结构服务器,因为键可以包含字符串,哈希,列表和排序集。 快速,轻便的数据结构服务器对于软件工程师来说就像是一辆超级跑车,它只是飞行而已。 如果您想了解有关Redis和兰博基尼独特性能特征的更多信息,可以在Google周围找到自己。

Redis入门很容易:下载,制作和启动Redis服务器。 完成这些步骤之后,您就可以从Camel应用程序中使用它了。 该组件在内部使用Spring Data ,该数据又使用Jedis驱动程序,但有可能切换到其他Redis驱动程序。 以下是一些适合使用camel-redis组件的用例:

幂等存储库

幂等一词在数学中用于描述一个函数,如果将其应用到其自身上,将产生相同的结果。 在“消息传递”中,无论是一次还是多次接收,此概念都将转换为具有相同效果的消息。 在Camel中,此模式是使用IdempotentConsumer类实现的,该类使用一个Expression计算给定消息交换的唯一消息ID字符串。 然后可以在IdempotentRepository中查找此ID,以查看是否以前已看到过该ID; 如果消息已消耗; 如果不是,则处理该消息并将ID添加到存储库。 RedisIdempotentRepository使用集合结构来存储和检查现有ID。

<bean id="idempotentRepository" class="org.apache.camel.component.redis.processor.idempotent.RedisIdempotentRepository">
<constructor-arg value="test-repo"/>
</bean><route>
<from uri="direct:start"/>
<idempotentConsumer messageIdRepositoryRef="idempotentRepository">
<simple>${in.body.id}</simple>
<to uri="mock:result"/>
</idempotentConsumer>
</route>

快取

Redis的主要用途之一是作为LRU缓存 。 它可以将内存中的数据存储为Memcached,或者可以调整为持久刷新数据到日志文件,如果节点重新启动则可以重播。达到maxmemory时可以使用多种策略来创建满足特定需求的缓存:

  • volatile-lru删除具有过期集的密钥中的一个,以尝试删除最近未使用的密钥。
  • volatile-ttl删除具有过期集的密钥,并尝试删除剩余生存时间短的密钥。
  • volatile-random从具有到期集的密钥中删除一个随机密钥。
  • allkeys-lru类似于volatile-lru,但是将删除每种密钥,包括普通密钥或具有过期集的密钥。
  • allkeys-random和volatile-random一样,但是将删除所有类型的键,包括普通键和具有过期集的键。

一旦您的Redis服务器配置了正确的策略并正在运行,您需要执行的操作是SET和GET:

<?xml version="1.0" encoding="UTF-8"?>
<route>
<from uri="direct:start"/>
<setHeader headerName="CamelRedis.Command">
<constant>SET</constant>
</setHeader>
<setHeader headerName="CamelRedis.Key">
<constant>keyOne</constant>
</setHeader>
<setHeader headerName="CamelRedis.Value">
<constant>valueOne</constant>
</setHeader>
<to uri="redis://localhost:6379"/>
</route>

与Redis的Interap发布/订阅

骆驼具有在路线之间进行交互的各种组件:

direct :在同一骆驼上下文中提供直接,同步的调用。
seda :异步行为,再次在同一骆驼上下文中在BlockingQueue上交换消息。
vm :类似于seda的异步行为,但只要它们在同一个JVM中,它还支持跨CamelContext的通信。 复杂的应用程序通常包括在单独的计算机上运行的多个独立的Camel实例。 对于这种情况,Camel提供了jms,activemq以及AWS SNS与SQS的组合,用于实例之间的消息传递。 Redis为发布/订阅消息范式提供了一个更简单的解决方案。 订阅者通过指定频道名称或使用模式匹配从多个频道接收消息来订阅一个或多个频道。 然后,发布者将消息发布到频道,然后Redis确保它到达所有匹配的订阅者。

<?xml version="1.0" encoding="UTF-8"?>
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
<route startupOrder="1">
<from uri="redis://localhost:6379?command=SUBSCRIBE&channels=testChannel"/>
<to uri="mock:result"/>
</route><route startupOrder="2">
<from uri="direct:start"/>
<setHeader headerName="CamelRedis.Command">
<constant>PUBLISH</constant>
</setHeader>
<setHeader headerName="CamelRedis.CHANNEL">
<constant>testChannel</constant>
</setHeader>
<setHeader headerName="CamelRedis.MESSAGE">
<constant>Test Message</constant>
</setHeader>
<to uri="redis://localhost:6379"/>
</route>
</camelContext>

其他用法

保证的交付 :骆驼使用JMS,File,JPA和一些其他组件来支持此EIP。 Redis可以通过其事务支持用作轻量级键值持久存储。

通过EIP模式中的“ 声明检查” ,您可以用声明检查(唯一密钥)替换消息内容,该声明检查可在以后用于检索消息内容。 消息内容可以临时存储在Redis中。

Redis在实现计数器,排行榜,标签系统和更多功能方面也非常受欢迎。 现在,有了两把瑞士军刀,您所做的整合仅受您的想象力限制。

参考: Apache Camel在OFBIZian博客上会见了我们的JCG合作伙伴 Bilgin Ibryam的Redis 。

翻译自: https://www.javacodegeeks.com/2013/03/apache-camel-meets-redis.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/369578.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php 数字加逗号,php数字满三位添加一逗号

//数字满三位添加一逗号&#xff1a;$s_money1 1000000;$s_money2 number_format($s_money1);echo $s_money1;//1000000echo "";echo $s_money2;//1,000,000PHP number_format() 函数number_format() 函数通过千位分组来格式化数字。注释&#xff1a;该函数支持一个…

HTML 教程- (HTML5 标准)摘抄笔记

HTML 教程- (HTML5 标准) 教程网址&#xff1a;http://www.runoob.com/html/html-tutorial.html http://blog.csdn.net/ljfbest/article/details/6700148 HTML版本 从初期的网络诞生后&#xff0c;已经出现了许多HTML版本: 版本发布时间HTML1991HTML 1993HTML 2.01995HTML 3…

spring 隔离级别 测试代码

Controller RequestMapping("/test") Api(value "测试", description "测试") public class TestController {Autowiredprivate TestService testService;RequestMapping(value "listForDirtyRead", method RequestMethod.GET)Res…

他人的一些2017年度总结

闭环思维&#xff1a;自己在做工作的时候&#xff0c;以及在做事情的时候&#xff0c;逐渐养成了闭环思考模式。一个新的东西&#xff0c;一个新的方案&#xff0c;从场景开始梳理&#xff0c;一步步的梳理流程和方案&#xff0c;然后到最终的方案落地&#xff0c;所有的一套流…

Java EE CDI ConversationScoped示例

在本教程中&#xff0c;我们将向您展示如何在Web应用程序中创建和使用ConversationScoped Bean。 在CDI中&#xff0c;bean是定义应用程序状态和/或逻辑的上下文对象的源。 如果容器可以根据CDI规范中定义的生命周期上下文模型来管理其实例的生命周期&#xff0c;则Java EE组件…

block与inline,inline和inline-block,块级和行内元素,行内替换和行内非替换元素

block:块级元素默认display属性为block&#xff1b;无论块内内容有多少&#xff0c;总是占满一行&#xff1b; inline:行内元素默认display属性为inline&#xff1b;只占据块内的内容的大小&#xff0c;不会占满一整行&#xff1b; inline-block:将行内元素的display属性改为…

mybatis深入理解之 # 与 $ 区别以及 sql 预编译

mybatis 中使用 sqlMap 进行 sql 查询时&#xff0c;经常需要动态传递参数&#xff0c;例如我们需要根据用户的姓名来筛选用户时&#xff0c;sql 如下&#xff1a; select * from user where name "ruhua"; 上述 sql 中&#xff0c;我们希望 name 后的参数 "ru…

Git 中文教程

以下内容转载自&#xff1a;http://www.open-open.com/lib/view/open1328928294702.html Git是一个分布式的版本控制工具&#xff0c;本篇文章从介绍Git开始&#xff0c;重点 在于介绍Git的基本命令和使用技巧&#xff0c;让你尝试使用Git的同时&#xff0c;体验到原来一个版本…

php markdown的转化函数,markdown公式转为知乎格式

在知乎中写技术类文章&#xff0c;经常会用到markdown知乎文章可以导入markdown格式&#xff0c;但是不支持Latex公式。知乎大神提供了替代方案&#xff1a; https://zhuanlan.zhihu.com/p/69142198为实现自动化&#xff0c;用python将其简易实现&#xff0c;代码如下&#xff…

Java EE CDI Producer方法教程

这是CDI Producer方法的教程。 在CDI中&#xff0c;生产者方法生成一个可以注入的对象。 当我们要注入本身不是bean的对象&#xff0c;要注入的对象的具体类型在运行时可能有所不同&#xff0c;或者当对象需要一些bean构造函数不执行的自定义初始化时&#xff0c;可以使用生产者…

CSS的常用属性(二)

盒子模型之边框 border-(top/bottom/left/right)-style: solid 边框的风格 如(solid 实线&#xff0c;dotted 点线&#xff0c;dashed 虚线) border-top-color: #aaa 边框颜色 border-top-width: 20px 边框粗细 边框四个方向连写&#xff1a; 如 border-color: #000 边框属…

牛客网Java刷题知识点之方法覆盖(方法重写)和方法重载的区别

不多说&#xff0c;直接上干货&#xff01; https://www.nowcoder.com/ta/review-java/review?query&asctrue&order&page6 方法重写的原则&#xff1a; 重写方法的方法名称、参数列表必须与原方法的相同&#xff0c;返回类型可以相同也可以是原类型的子类型(从Jav…

7-26 Windows消息队列

7-26 Windows消息队列&#xff08;25 分&#xff09; 消息队列是Windows系统的基础。对于每个进程&#xff0c;系统维护一个消息队列。如果在进程中有特定事件发生&#xff0c;如点击鼠标、文字改变等&#xff0c;系统将把这个消息加到队列当中。同时&#xff0c;如果队列不是空…

java for循环遍历解释,三种for循环遍历

import java.util.ArrayList;import java.util.Iterator;import java.util.List;public class For{public static void main(String[]args) {//new一个集合对象List alListnew ArrayList();alList.add(1);//自动转成IntegeralList.add("abc");alList.add(a);//一般f…

AngularJS的ng-repeat显示属性名和属性值

代码下载&#xff1a;https://files.cnblogs.com/files/xiandedanteng/AngularJSAuthorRepeat.rar 代码&#xff1a; <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html ng-app&qu…

最小的JavaFX演示文稿(在JavaFX中)

如果您想进行有关JavaFX的演示&#xff0c;那么使用JavaFX本身进行演示非常方便。 这样&#xff0c;您无需离开演示文稿就可以轻松显示示例。 这是一个非常简单的示例。 在NetBeans中&#xff0c;设置一个新的JavaFX项目“ New Project”->“ JavaFX”->“ JavaFX Applic…

2018.2.28(延迟加载和缓存)

1.延迟加载 编写配置 测试类 2.侵入式延迟 3.深度延迟 4.一级缓存 5.二级缓存 配置 测试类 转载于:https://www.cnblogs.com/xu06123/p/8483245.html

java 加密解密编程,java 加密解密容易实现

当前位置:我的异常网 编程 java 加密解密容易实现java 加密解密容易实现www.myexceptions.net 网友分享于&#xff1a;2013-10-27 浏览&#xff1a;3次java 加密解密简单实现加密算法有很多种&#xff1a;这里只大约列举几例&#xff1a;1:消息摘要&#xff1a;(数字指纹)&a…

小爬麦子学院教师

任务描述&#xff1a;将麦子学院指定网页下教师信息&#xff08;姓名&#xff0c;职称&#xff0c;介绍信息&#xff09;爬取下来并保存到数据库。 1.页面分析&#xff1a; 2.代码&#xff1a; mydb.py: #!/usr/bin/env/python #coding:utf-8 操作数据库import MySQLdb as dbcl…

MongoDB:使用Spring数据添加计数器

在我的博客应用程序中&#xff0c;您可以查看任何用户的个人资料&#xff0c;例如&#xff0c;我的个人资料页面将为http://www.jiwhiz.com/profile/user1&#xff0c;“user1”是我在系统中的用户ID。 在MongoDB中&#xff0c;每个文档对象都会有一个唯一的标识符&#xff0c;…