缓存及其设计方法以及利用该缓存的调度方法和调度装置的制造方法

文档序号:9910835阅读:306来源:国知局
缓存及其设计方法以及利用该缓存的调度方法和调度装置的制造方法
【技术领域】
[0001]本发明涉及任务调度领域,具体涉及一种缓存及其设计方法以及利用该缓存的调度方法和调度装置。
【背景技术】
[0002]目前的定时任务调度,无论是通过Spring配置还是通过java硬编码来实现定时任务的调度,它们有一个共同的特点就是在对具体业务处理的时候,必须保证单线程运行。目前处理定时调度任务调度方法主要是以下几种:
[0003](I)Spring配置Quartz定时器。Quartz可以通过cron表达式精确到特定时间单线程执行调度任务。在Quartz方案中,Quartz定时任务默认都是并发执行的,不会等待上一次任务执行完毕,只要间隔时间到就会执行。但是定时任执行太长,会长时间占用资源,导致其它任务堵塞。因此在Spring中这时需要设置concurrent的值为false,禁止并发执行。
[0004](2)普通thread。这是最常见的,创建一个thread,然后让它在while循环里一直运行着,通过sleep方法来达到定时任务的效果。该方案单线程控制调度,这种情况下必须保证单实例部署调度。
[0005](3)通过Timer和TimerTask。在实现时,Timer类可以调度任务,TimerTask则是通过在run()方法里实现具体任务。Timer实例可以调度多任务,它是线程安全的。然而,尽管Timer实例可以调度多任务,但是当Timer的构造器被调用时,它创建了一个单线程,这个线程可以用来调度任务。多实例部署会导致多个线程调度同一任务,任务数据一致性无法保证。
[0006](4)ScheduledExecutorService实现。ScheduledExecutorService是从Java SE 5的java.util.concurrent里作为并发工具类被引进的,提供了一个定时任务实现工具类。相比于Timer的单线程,它是通过线程池的方式来执行任务的。但是在提交定时调度任务时其具体执行的是newSingleThreadScheduledExecutor,因此该方式提交的也是一个单线程的Executor,无法进行多实例的部署实现
[0007]因此需要一种实现多实例部署的方法和/或装置。

【发明内容】

[0008]为了解决上述问题,本发明实施例提供了一种缓存及其设计方法以及利用该缓存的调度方法和调度装置。
[0009]根据本发明的一个方案,提供了一种缓存设计方法,包括:将缓存的存储空间划分为多个片;以及将所述多个片中的每个片划分为主节点和从节点;其中,在将数据存入所述缓存时,将所述数据分布是所述多个片上,且对于所述多个片中的每个片,将所分布的数据同步写入所述主节点和所述从节点,以及在从所述缓存读取数据时,仅从所述多个片中每个片的主节点读取数据。
[0010]根据本发明的第二方案,提供了一种缓存,包括:被划分为多个片的存储空间,其中,所述多个片中的每个片被划分为主节点和从节点,在将数据存入所述缓存时,将所述数据分布是所述多个片上,且对于所述多个片中的每个片,将所分布的数据同步写入所述主节点和所述从节点,以及在从所述缓存读取数据时,仅从所述多个片中每个片的主节点读取数据。
[0011 ]根据本发明的三个方案,提供了一种调度方法,包括:获取多个实例的定时调度任务的调度钥匙;根据所获取的调度钥匙获取针对所述多个实例的定时调度任务的锁;以及执行所述多个实例中获取到锁的实例的定时调度任务。
[0012]根据本发明的第四方案,提供了一种调度装置,包括:调度钥匙获取模块,用于获取多个实例的定时调度任务的调度钥匙;锁获取模块,用于根据所获取的调度钥匙获取针对所述多个实例的定时调度任务的锁;以及调度任务执行模块,用于执行所述多个实例中获取到锁的实例的定时调度任务。
[0013]基于上述缓存及其设计方法,可以保证获取分布式锁数据源的唯一性。
[0014]基于上述调度方法和装置,可以不考虑具体定时调度的单实例单线程属性,实现多个实例部署,保证调度的任务在一个时间点有且仅有被调度一次。
【附图说明】
[0015]通过下面结合附图对发明进行的详细描述,将使本发明的上述特征和优点更加明显,其中:
[0016]图1是示出根据本发明实施例的多实例调度方案的整体描述示意图;
[0017]图2是示出根据本发明的实施例的缓存设计方法的流程图;
[0018]图3是示出根据图2中的方法设计/部署的缓存集群分片的一个示意图;
[0019]图4是示出根据发明的实施例的调度方法的流程图;以及
[0020]图5是示出根据发明的实施例的调度装置的示意性框图。
【具体实施方式】
[0021]下面,参考附图详细说明本发明的优选实施方式。在附图中,虽然示于不同的附图中,但相同的附图标记用于表示相同的或相似的组件。为了清楚和简明,包含在这里的已知的功能和结构的详细描述将被省略,以避免使本发明的主题不清楚。
[0022]图1示出了根据本发明实施例的多实例调度方案的整体描述示意图。如图1所示,多个实例A至N的调度任务在缓存(例如,redis缓存)中获取分布式锁,而抢占到分布式锁的实例(图中示出为实例B)的调度任务可被执行。需要注意的是,图1中的所有实例都具有同样的调度任务A。然而这仅是为了更清楚地说明本发明的技术方案的一个示例。在一般性的示例中,可存在多组各自具有同样调度任务的实例。
[0023]图2示出了根据本发明的实施例的缓存设计方法。该方法包括步骤110,将缓存的存储空间划分为多个片;以及步骤120,将该多个片中的每个片划分为主节点和从节点。其中,在将数据存入缓存时,将所述数据分布是所述多个片上,且对于多个片中的每个片,将所分布的数据同步写入主节点和从节点,以及在从缓存读取数据时,仅从多个片中每个片的主节点读取数据。
[0024]在图2所示的方法中,缓存可以是redis缓存。
[0025]具体地,缓存集群分片采用的技术可被称为“pre-Sharding”(预分片)。该技术将缓存数据分摊到多个分片(每个分片上具有相同的构成,即主(Master)-从(Slave)两个节点。使用同步写入(SyncMaster)的写策略,以主为读(MasterOnly)的读策略。
[0026]本发明中的缓存集群分片技术还采用了Redis数据容灾策略:服务器端配置Master-Slave模式来实现,而在分布式集群方面通过客户端工具来实现一致性哈希分布存储,即钥匙的分片存储。
[0027]图3示出了根据图2中的方法设计/部署的缓存集群分片的一个示意图。如图3所示,该缓存包括被划分为多个片的存储空间。其中,所述多个片中的每个片被划分为主节点和从节点,在将数据存入缓存时,将数据分布是所述多个片上,且对于多个片中的每个片,将所分布的数据同步写入主节点和从节点,以及在从缓存读取数据时,仅从所述多个片中每个片的主节点读取数据。
[0028]图3中示出的缓存可以是redis缓存。
[0029]图2和图3所示的方案保证了获取分布式锁时数据源的唯一性。
[0030]图4示出了根据发明的实施例的调度方法。该方法包括:步骤310获取多个实例的定时调度任务的调度钥匙;步骤320根据所获取的调度钥匙获取针对所述多个实例的定时调度任务的锁;以及步骤330执行所述多个实例中获取到锁的实例的定时调度任务。
[0031]在本发明的一些示例中,获取多个实例的定时调度任务的调度钥匙包括:获取所述定时调度任务所属的类的名称,作为所述定时调度任务的调度钥匙。
[0032]在本发明的一些示例中,根据所获取的调度钥匙获取针对所述多个实例的定时调度任务的锁包括:针对所述多个实例中每个实例的定时调度任务,如果所述定时调度任务的调度钥匙与之前已获得锁但并未释放锁的定时调度任务的调度钥匙不同,则具有不同调度钥匙的所述定时调度任务获取锁成功,以及如果所述定时调度任务的调度钥匙与之前已获得锁但并未释放锁的定时调度任务的调度钥匙相同,则具有相同调度钥匙的所述定时调度任务获取锁失败。<
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1