
利用Redis消息队列提升服务可达性
随着互联网应用的不断发展,应用服务的可达性成为越来越重要的考虑因素。如何保证服务的可达性,降低服务宕机的风险,已经成为每一个应用服务负责人的必修课程。利用Redis消息队列可以提升服务的可达性,减少不必要的服务宕机风险,本文将详细介绍利用Redis消息队列实现服务的可靠性。
1、什么是Redis消息队列?
Redis是一款开源的、内存中的数据存储系统,它支持多种数据结构和高级功能。Redis消息队列是Redis中的一种数据结构,与其他消息队列系统类似,它提供了一种异步通信机制,让不同的进程或线程可以通过消息来协作工作。使用Redis作为消息队列的实现,可以实现高效、高可靠性的任务进程。
2、Redis消息队列工作原理

Redis消息队列以list类型的数据结构为基础,通过lpush和rpop命令实现队列消息的生产和消费。生产者可以将消息放入队列中,消费者从队列中取出消息进行处理。Redis为每个list设置一个唯一的key,例如myqueue:lpush myqueue value就是将value放入myqueue队列中。
3、利用Redis消息队列提升服务可达性的例子

以下是一个简单的例子,利用Redis消息队列实现高并发下的邮件发送服务。
设置list类型的数据结构作为Redis消息队列:
redis.lpush(‘eml_queue’, eml_dict)
这条命令将将邮件信息添加到eml_queue队列中。此时,邮件服务只需要从邮件队列中取出消息进行处理即可:
while True:eml_dict = redis.rpop(‘eml_queue’)if eml_dict:send_eml(eml_dict)
send_eml在此处是一个协程,它可以实现高并发下的邮件发送服务。每当有新的邮件信息添加到队列中时,该协程会立即开始处理该信息。
利用Redis消息队列可以实现异步的邮件发送服务,降低邮件服务宕机的风险。同时,由于Redis消息队列自身的高可靠性,即使邮件 服务器 突然宕机,也不会影响待发送的邮件信息,再次启动邮件服务时可以从邮件队列中取出未发送的邮件信息进行重新发送。
4、总结
利用Redis消息队列可以实现高可靠、高并发的异步任务处理。在服务设计中,应该考虑利用消息队列来实现异步任务,降低服务宕机的风险,提升服务可达性。使用Redis作为消息队列的实现,有助于减少服务宕机的概率,提升应用的稳定性和可靠性。
香港服务器首选树叶云,2H2G首月10元开通。树叶云(www.IDC.Net)提供简单好用,价格厚道的香港/美国云服务器和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。
Redis有哪些数据结构?
Redis有五种结构:1、String可以是字符串,整数或者浮点数,对整个字符串或者字符串中的一部分执行操作,对整个整数或者浮点执行自增(increment)或者自减(decrement)操作。 字符串命令:①get、获取存储在指定键中的值②set、设置存储在指定键中的值③del、删除存储在指定键中的值(这个命令可以用于所有的类型)2、list一个链表,链表上的每个节点都包含了一个字符串,虫链表的两端推入或者弹出元素,根据偏移量对链表进行修剪(trim),读取单个或者多个元素,根据值查找或者移除元素。 列表命令:①rpush、将给定值推入列表的右端②lrange、获取列表在指定范围上的所有值③lindex、获取列表在指定范围上的单个元素④lpop、从列表的左端弹出一个值,并返回被弹出的值3、set包含字符串的无序收集器(unordered collection)、并且被包含的每个字符串都是独一无二的。 添加,获取,移除单个元素,检查一个元素是否存在于集合中,计算交集,并集,差集,从集合里面随机获取元素。 集合命令:①sadd、将给定元素添加到集合②smembers、返回集合包含的所有元素③sismember、检查指定元素是否存在于集合中④srem、检查指定元素是否存在于集合中,那么移除这个元素4、hash包含键值对无序散列表,添加,获取,移除当键值对,获取所有键值对。 散列命令:①hset、在散列里面关联起指定的键值对②hget、获取指定散列键的值③hgetall、获取散列包含的所有键值对④hdel、如果给定键存在于散列里面,那么移除这个键5、zset字符串成员(member)与浮点数分值(score)之间的有序映射,元素的排列顺序由分值的大小决定。 添加,获取,删除单个元素,根据分值范围(range)或者成员来获取元素。 有序集合命令:①zadd、将一个带有给定分值的成员添加到有序集合里面②zrange、根据元素在有序排列中所处的位置,从有序集合里面获取多个元素③zrangebyscore、获取有序集合在给定分值范围内的所有元素④zrem、如果指定成员存在于有序集合中,那么移除这个成员
java架构师主要是干什么的?
想成为java架构师,首先你自身得是一个高级java攻城狮,会使用各种框架并且很熟练,且知晓框架实现的原理。比如,你要知道,jvm虚拟机原理、调优;懂得jvm能让你写出的代码性能更优化;还有池技术:什么对象池、连接池、线程池等等。还有java反射技术,虽然是写框架必备的技术,但有严重的性能问题,替代方案java字节码技术,nio 这说不说无所谓,需要注意的是直接内存的特点,使用场景;java多线程同步异步;java各种集合对象的实现原理,了解这些可以让你在解决问题时选择合适的数据结构,高效的解决问题,比如hashmap的实现原理,甚至许多五年以上经验的人都弄不清楚!还有很多,比如,为什扩容时有性能问题?不弄清楚这些原理,不知道问题根本,你就就写不出高效的代码!还会很傻很天真的认为自己是对的,殊不知是孤芳自赏,自命不凡而已;总而验资,言而总之,越基础的东西越重要!许多工作了很多年的程序猿认为自己会用它们写代码了,其实仅仅是知其实仅仅是知道如何调用api而已,知其然不知其所以然,离会用还差的远。关于技能的提升给一些建议1.提升自己的英语水平,此重要性是不言而喻的,现在很多的新技术中文档少之又少,作为一名架构师总不能去看翻译文吧。2.多看一些沟通方面的数据,流畅的沟通利用你成为一名成功的架构师。3.有机会参加PMP考试并取得证书,拥有项目管理方向的优势就是你作为一名架构师的优势。架构师其实从某种意义上就是一种角色,而不是一种职位。一定要时时刻刻保持空杯心态。一定要有一颗保持饥渴学习和耐得住寂寞的赤子之心。4.我们知道当前的技术节奏非常的快,一定要好好的利用自己的碎片时间去学习,去了解新技术,千万不要让自己技术落伍。5.多锻炼自己在大众环境下的演讲和PTT的能力。6.与不同的技术、编程语言、设计模式和结构等(甚至是它并没有在日常中给予你直接的帮助)打交道。你永远都不知道这些知识是否会在未来派上用场,但是对你绝对是有益无害。7.有机会多做知识分享,因为你一旦分享了知识,你就会对这门技术有深刻的印象,同时也能树立在同事中的良好的技术形象,从而赢得更多的专家影响力而不是职位影响力。规划了几张体系图,可以了解一下。一:工程协作专题二、源码分析专题三、分布式专题四、微服务专题五、性能优化专题六、并发编程专题七、项目实战!java架构师课程体系完整页面架构师常用技术:
关于wParam和lParam的问题
WPARAM 和 LPARAM,消息响应机制 wParam和lParam 这两个是Win16系统遗留下来的产物,在Win16API中WndProc有两个参数: 一个是WORD类型的16位整型变量;另一个是LONG类型的32位整型变量。 因此根据匈牙利命名法,16位的变量就被命名为wParam, 32位的变量就被命名为lParam。 到了Win32API中,原来的16位变量也被扩展为32位,因此此时wParam和lParam的大小完全相同。 在Win32API的早期,为了保证和Win16API的代码可移植性MS定义了WPARAM和LPARAM两个宏。 当时保留了w前缀的原因一方面是由于WPARAM宏也已W开头,还有也因为要提醒程序员注意到可移植性,当然到了现在Win16早已退出历史舞台,这个前缀也就约定俗成的沿用下来了。 例如:主程序 1.自定义消息:#define WM_TRAY WM_USER 100 2.函数原形:afx_msg LRESULT OnTrayNotify(WPARAM wParam,LPARAM lParam); 3.消息映射:ON_MESSAGE(WM_TRAY,OnTrayNotify) 4.原函数: LRESULT CMyDlg::OnTrayNotify(WPARAM wParam,LPARAM lParam) { return m_(wParam,lParam); } 托盘类的实现程序 成员函数: int OnTrayNotify(WPARAM wID,LPARAM lEvent) { if(wID == ) return 0; if(lEvent == WM_LBUTTONDOWN){ 处理代码 } else if(lEvent == WM_RBUTTONDOWN){ 处理代码 } return 0; } WPARAM 和 LPARAM 本质上没有什么区别:都是32位数, 但是区别也还是有的:除了上面几位若仁兄说的关于16位的的历史问题外,MICROSOFT在使用时两种参数分别代表不同的含义和内容,WPARAM常常代表一些控件的ID或者高位底位组合起来分别表示鼠标的位置,如果消息的发送者需要将某种结构的指针或者是某种类型的句柄时,习惯上用LPARAM来传递,可以参考各种控件的通知消息:可以查看:EN_CHANGE (EDIT控件的一个通知消息),CBEM_INSERTITEM(可扩展组合框的可接受消息)等等来加以领会。 理论上在使用自定义消息时,WPARAM LPARAM的含义可以程序员任意指定的,但是最好遵从MFC中的习惯。 在调用SendMessage()函数时,第二个参数是WPARAM,第三个参数是这个消息的LPARAM,但是你在程序中某个类中写下ON_MESSAGE()宏来处理这个消息时,处理函数SomeHandler(WPARAM,LPRAM(默认是0))中解释这两个参数时必须按照SendMessage调用中的意义来进行。 消息响应机制 1、消息的组成:一个消息由一个消息名称(UINT),和两个参数(WPARAM,LPARAM)。 当用户进行了输入或是窗口的状态发生改变时系统都会发送消息到某一个窗口。 例如当菜单转中之后会有WM_COMMAND消息发送,WPARAM的高字中(HIWORD(wParam))是命令的ID号,对菜单来讲就是菜单ID。 当然用户也可以定义自己的消息名称,也可以利用自定义消息来发送通知和传送数据。 2、谁将收到消息:一个消息必须由一个窗口接收。 在窗口的过程(WNDPROC)中可以对消息进行分析,对自己感兴趣的消息进行处理。 例如你希望对菜单选择进行处理那么你可以定义对WM_COMMAND进行处理的代码,如果希望在窗口中进行图形输出就必须对WM_PAINT进行处理。 3、未处理的消息到那里去了:M$为窗口编写了默认的窗口过程,这个窗口过程将负责处理那些你不处理消息。 正因为有了这个默认窗口过程我们才可以利用Windows的窗口进行开发而不必过多关注窗口各种消息的处理。 例如窗口在被拖动时会有很多消息发送,而我们都可以不予理睬让系统自己去处理。 4、窗口句柄:说到消息就不能不说窗口句柄,系统通过窗口句柄来在整个系统中唯一标识一个窗口,发送一个消息时必须指定一个窗口句柄表明该消息由那个窗口接收。 而每个窗口都会有自己的窗口过程,所以用户的输入就会被正确的处理。 例如有两个窗口共用一个窗口过程代码,你在窗口一上按下鼠标时消息就会通过窗口一的句柄被发送到窗口一而不是窗口二。 5、示例:下面有一段伪代码演示如何在窗口过程中处理消息 LONG yourWndProc(HWND hWnd,UINT uMessageType,WPARAM wP,LPARAM) {switch(uMessageType){//使用SWITCH语句将各种消息分开case(WM_PAINT):doYourWindow(...);//在窗口需要重新绘制时进行输出break;case(WM_LBUTTONDOWN):doYourWork(...);//在鼠标左键被按下时进行处理break;default:callDefaultWndProc(...);//对于其它情况就让系统自己处理break;} } 接下来谈谈什么是消息机制:系统将会维护一个或多个消息队列,所有产生的消息都回被放入或是插入队列中。 系统会在队列中取出每一条消息,根据消息的接收句柄而将该消息发送给拥有该窗口的程序的消息循环。 每一个运行的程序都有自己的消息循环,在循环中得到属于自己的消息并根据接收窗口的句柄调用相应的窗口过程。 而在没有消息时消息循环就将控制权交给系统所以Windows可以同时进行多个任务。 下面的伪代码演示了消息循环的用法: while(1) {id=getMessage(...);if(id == quit)break;translateMessage(...); } 当该程序没有消息通知时getMessage就不会返回,也就不会占用系统的CPU时间。
发表评论