本发明专利技术公开了一种基于缓冲区的异步更新的方法,包括:提交更新请求;判断队列是否为空;如果所述队列不为空,则取出队列元素,以准备处理所述更新请求;计算出最新的更新阈值;将所述更新请求更新到本地;检查所述更新是否触发了更新策略;以及如果触发了所述更新策略,则更新分布式缓存或者数据库。
【技术实现步骤摘要】
本专利技术涉及数据的更新,更具体地,本专利技术涉及。
技术介绍
如果想将某个值更新到分布式缓存服务器或者数据库中,只能直接更新数据库或者分布式缓存。然而,因为代码通常被部署在多台服务器上,每台服务器上又有多个程序实例运行,所以同一时间很有可能会有两个或者两个以上的更新请求到达分布式缓存或者数据库。 特别对于更新某个数值的情况。图1示出了现有技术中更新某个数值的示意图。如图1所示,例如:分布式缓存中有数据A,值为1,有两个(或者两个以上)程序实例希望将A的值+1 (每个实例更新一次,理想的更新结果应该为3),程序实例同一时刻从分布式缓存中获取A的值为1,并且在程序实例本地更新为2,同一时刻将请求发送到分布式缓存中,执行更新操作(将1更新为2)。这时,虽然有两个程序实例发出了更新请求,但更新的结果却是2,而不是3,从而很容易产生脏写。其根本原因是两个程序实例都以为只有自己在更新这个值,因为都是在1的基础上+1,等到期待更新结果为2,并在同一时刻更新。 可以看出,更新越频繁的场景,产生脏写的频率越高(因为同一时刻发出更新请求的几率越高)。而且,整个获取、更新操作是同步执行的,这意味着每次更新都要至少和分布式缓存交互三次才能更新值。另外,在交互过程中,执行的线程只能等待,降低了线程的处理效率。 因此,需要一种能够克服以上问题的。
技术实现思路
针对现有处理方法的以下问题:每次更新都要等待更新结果,线程才能继续执行;针对更新频繁的场景,不仅对分布式缓存或者数据库产生很大的压力,并且产生脏写的几率越高,本专利技术提出了一种异步的、对使用者透明的更新分布式缓存或数据库的方法,以便提高发出更新请求线程的执行效率以及在高并发场景下对数据库可用性的提升。 根据本专利技术的一个实施例,提供了一种,包括:提交更新请求;判断队列是否为空;如果所述队列不为空,则取出队列元素,以准备处理所述更新请求;计算出最新的更新阈值;将所述更新请求更新到本地;检查所述更新是否触发了更新策略;以及如果触发了所述更新策略,则更新分布式缓存或者数据库。 优选地,所述提交更新请求的步骤进一步包括:通过所述更新请求中的密钥计算出散列码的值;通过用所述散列码与处理线程的个数取模,计算出偏移量,以找到相应的处理线程;以及将所述更新请求封装后放入所述相应的处理线程的处理队列中,以供线程获取。 优选地,将所述更新请求封装后放入所述相应的处理线程的处理队列中的步骤进一步包括:将同一类型的所述更新请求指向同一个处理线程,并放入同一个处理队列。 优选地,如果所述队列为空,则当前线程沉睡,等待提交更新请求的线程放入更新请求后恢复执行。 优选地,所述计算出最新的更新阈值的步骤进一步包括:每次更新请求计算前设定保护阀值,获取当前线程处理队列的大小,a)如果当前线程处理队列的大小小于保护阀值,则将当前更新请求的更新阀值设置为所述保护阀值山)如果当前线程处理队列的大小大于保护阀值,则直接采用当前队列的大小作为当前的更新阀值。 优选地,触发更新策略包括更新次数达到所述最新的更新阀值、或者本次更新在更新周期内。 本专利技术判断请求由哪个线程计算的方式,实现了每个更新请求被固定线程处理,从而线程处理更新时,不需要任何加锁,有很好的执行效率。而且本专利技术对更新请求提出了一种异步更新的方式,提高更新效率的同时,起到了缓冲区的作用,在突然大量请求达到时对分布式缓存或者数据库有保护作用。 根据本公开和附图的下面的详细描述,对本领域的普通技术人员来说其它的目的、特征、以及优点将是显而易见的。 【附图说明】 附图图示了本专利技术的实施例,并与说明书一起用于解释本专利技术的原理。在附图中: 图1示出了现有技术中更新某个数值的示意图。 图2是根据本专利技术的实施例的用于提交更新请求的线程的示意图。 图3是根据本专利技术的实施例的更新缓冲区的内存结构示意图。 图4是根据本专利技术的实施例的的流程图。 【具体实施方式】 根据本专利技术的实施例公开了一种。在以下描述中,为了说明的目的,阐述了多个具体细节以提供对本专利技术的实施例的全面理解。然而,对于本领域人员显而易见的是,本专利技术的实施例可以在没有这些具体细节的情况下实现。 如在此所使用的“线程池”是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。在Java中常使用线程池在多线程环境下执行任务,用于处理多个文件的读写,分析等功能。 如在此所使用的“锁”是在多线程环境下一个常用的工具类,用于在代码块间做同步操作,保证在锁覆盖的范围内,代码的串行执行,常用于解决并发问题。 如在此所使用的“线程”指的是Java中的线程,它是执行代码的最小单元。通常在线程池的统一管理下,执行各类代码。 如在此使用的“分布式存储系统”是指将数据分散存储在多台独立的设备上。传统的网络存储系统采用集中的存储服务器存放所有数据,存储服务器成为系统性能的瓶颈,也是可靠性和安全性的焦点,不能满足大规模存储应用的需要。分布式网络存储系统采用可扩展的系统结构,利用多台存储服务器分担存储负荷,利用位置服务器定位存储信息,它不但提高了系统的可靠性、可用性和存取效率,还易于扩展。 根据本专利技术解决其技术问题所采用的技术方案,在接受更新请求时仅将更新结果缓存在程序本地,当更新次数达到用户设定的阀值或者周期性的间隔某个时间段后再向分布式缓存或者数据库中发出更新请求,以便实现更新请求在程序本地的缓冲,减少分布式缓存或者数据库的服务压力,同时减少向分布式缓存或者数据库发送的请求量。同时,在使用更新阀值这种更新策略时,根据更新的频繁程度,动态的调整更新阀值,以实现在应对突然到来的大量更新请求时,起到请求在程序本地缓冲的作用,以减少对分布式缓存或者数据库的压力。 值得注意的是,本专利技术提供了一种非常好的解决方案并提供了一些默认实现方式,并且有很好的扩展性,除了默认的执行方式,还提供了触发策略和持久化策略的接口供使用者自行实现“什么时候触发更新”,“更新到分布式缓存中还是数据库中”,有很强的灵活性。 图2是根据本专利技术的实施例的用于提交更新请求的线程的示意图。如图2所示,对于提交更新请求的线程,具体实现步骤如下: 1.当有更新请求产生时,调用本专利技术的更新接口,提交更新请求; 2.本专利技术通过更新请求中的密钥(key),计算出散列码(hashcode)的值,并用hashcode与处理线程的个数取摸,计算出偏移量,从而找到相应的处理线程; 3.将更新请求封装后放到处理线程的处理队列中,供线程获取。 hashcode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值。取模(Mod)运算的含义为求余。例如llMod 2,值为1,并且任何数与2取模,结果只可能为0或者1,即求余数的结果只能为小于被余数到大于等于0之间的整数。 根据本专利技术的实施例,通过hashcode与处理线程数取模的计算使得某个线程只处理一定数量的更新请求,并且因为每次更新请求的key值不变,hashcode就不会变,余数也不会变,从而每次该key的更新请求都有固定本文档来自技高网...
【技术保护点】
一种基于缓冲区的异步更新的方法,包括:提交更新请求;判断队列是否为空;如果所述队列不为空,则取出队列元素,以准备处理所述更新请求;计算出最新的更新阈值;将所述更新请求更新到本地;检查所述更新是否触发了更新策略;以及如果触发了所述更新策略,则更新分布式缓存或者数据库。
【技术特征摘要】
1.一种基于缓冲区的异步更新的方法,包括: 提交更新请求; 判断队列是否为空; 如果所述队列不为空,则取出队列元素,以准备处理所述更新请求; 计算出最新的更新阈值; 将所述更新请求更新到本地; 检查所述更新是否触发了更新策略;以及 如果触发了所述更新策略,则更新分布式缓存或者数据库。2.根据权利要求1所述的方法,其中,所述提交更新请求的步骤进一步包括: 通过所述更新请求中的密钥计算出散列码的值; 通过用所述散列码与处理线程的个数取模,计算出偏移量,以找到相应的处理线程;以及 将所述更新请求封装后放入所述相应的处理线程的处理队列中,以供线程获取。3.根据权利要求2所述的方法,其中将所述更新请求封装后放入所述相应的处理线程的处理队...
【专利技术属性】
技术研发人员:刘锟洋,
申请(专利权)人:北京京东尚科信息技术有限公司,北京京东世纪贸易有限公司,
类型:发明
国别省市:北京;11
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。