CN112035528B - 数据查询方法及装置 - Google Patents
数据查询方法及装置 Download PDFInfo
- Publication number
- CN112035528B CN112035528B CN202010954031.6A CN202010954031A CN112035528B CN 112035528 B CN112035528 B CN 112035528B CN 202010954031 A CN202010954031 A CN 202010954031A CN 112035528 B CN112035528 B CN 112035528B
- Authority
- CN
- China
- Prior art keywords
- data
- cache
- whole table
- query
- application
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 57
- 238000013500 data storage Methods 0.000 claims abstract description 35
- 238000004590 computer program Methods 0.000 claims description 16
- 230000008569 process Effects 0.000 claims description 14
- 230000008859 change Effects 0.000 claims description 10
- 238000012545 processing Methods 0.000 claims description 10
- 238000012544 monitoring process Methods 0.000 claims description 6
- 238000012546 transfer Methods 0.000 claims description 3
- 230000035515 penetration Effects 0.000 abstract description 15
- 238000010586 diagram Methods 0.000 description 18
- 230000007717 exclusion Effects 0.000 description 7
- 230000006870 function Effects 0.000 description 6
- 230000004044 response Effects 0.000 description 4
- 241000508269 Psidium Species 0.000 description 2
- 230000007246 mechanism Effects 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 238000006467 substitution reaction Methods 0.000 description 2
- 235000010627 Phaseolus vulgaris Nutrition 0.000 description 1
- 244000046052 Phaseolus vulgaris Species 0.000 description 1
- 238000013459 approach Methods 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000004364 calculation method Methods 0.000 description 1
- 101150066276 colC gene Proteins 0.000 description 1
- 238000012217 deletion Methods 0.000 description 1
- 230000037430 deletion Effects 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 230000003993 interaction Effects 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/245—Query processing
- G06F16/2455—Query execution
- G06F16/24552—Database cache management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/22—Indexing; Data structures therefor; Storage structures
- G06F16/2282—Tablespace storage structures; Management thereof
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/23—Updating
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/248—Presentation of query results
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/27—Replication, distribution or synchronisation of data between databases or within a distributed database system; Distributed database system architectures therefor
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Databases & Information Systems (AREA)
- Data Mining & Analysis (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computational Linguistics (AREA)
- Computing Systems (AREA)
- Software Systems (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供了一种数据查询方法及装置,涉及计算机技术领域,该方法包括:将整表数据从目标数据库加载至缓存数据存储区;获取整表数据的缓存状态数据以及缓存索引数据,将整表数据、缓存状态数据和缓存索引数据存储在缓存数据存储区;收到查询请求时,根据缓存状态数据在缓存索引数据中确定查询请求对应的目标缓存索引数据;按照目标缓存索引数据在整表数据中获取查询结果,将查询结果发送至访问模块。本发明在应用启动时将整表数据全部加载进本地内存,能让所有的查询操作都在内存中进行,查询效率大大提升,大大减少出现缓存访问毛刺的风险,同时也能避免极端情况下的缓存穿透与缓存雪崩风险,让系统具备更高的稳定性。
Description
技术领域
本发明涉及计算机技术领域,尤其是涉及一种数据查询方法及装置。
背景技术
数据库是保存数据的容器,应用系统需要频繁地访问数据库来获取系统运行所需的数据,数据库成为了系统性能的主要瓶颈之一。为了加快系统响应时间,技术人员采用缓存来存储一些被频繁访问的数据,缓解数据库访问压力。所有的缓存方式中,内存缓存是响应最快的。现有的缓存方式,比如常见的EhCache、Guava Cache、Memcached,当查询的键存在于缓存中时,能快速返回,效率高,但是当查询的键不存在于缓存中时,需要再去访问数据库获取数据,具有缓存访问毛刺,容易发生缓存穿透与缓存雪崩的风险。
发明内容
本发明提供了一种数据查询方法及装置,可以大大降低缓存访问毛刺、缓存穿透以及缓存雪崩的风险,进而提升数据查询的效率。
第一方面,本发明实施例提供了一种数据查询方法,该方法包括:将整表数据从目标数据库加载至缓存数据存储区;获取所述整表数据的缓存状态数据以及缓存索引数据,将所述整表数据、所述缓存状态数据和所述缓存索引数据存储在所述缓存数据存储区;收到查询请求时,根据所述缓存状态数据在所述缓存索引数据中确定所述查询请求对应的目标缓存索引数据;按照所述目标缓存索引数据在所述整表数据中获取查询结果,将所述查询结果发送至访问模块。
第二方面,本发明实施例还提供一种数据查询装置,该装置包括:初始化模块,用于将整表数据从目标数据库加载至缓存数据存储区;缓存数据模块,用于获取所述整表数据的缓存状态数据以及缓存索引数据,将所述整表数据、所述缓存状态数据和所述缓存索引数据存储在所述缓存数据存储区;数据处理模块,用于收到查询请求时,根据所述缓存状态数据在所述缓存索引数据中确定所述查询请求对应的目标缓存索引数据;缓存访问模块,用于按照所述目标缓存索引数据在所述整表数据中获取查询结果,将所述查询结果发送至访问模块。
第三方面,本发明实施例还提供一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述数据查询方法。
第四方面,本发明实施例还提供一种计算机可读存储介质,所述计算机可读存储介质存储有执行上述数据查询方法的计算机程序。
本发明实施例带来了以下有益效果:本发明实施例提供了一种数据查询方案,该方案首先将整表数据从目标数据库加载至缓存数据存储区,获取整表数据的缓存状态数据以及缓存索引数据,将整表数据、缓存状态数据和缓存索引数据存储在缓存数据存储区,收到查询请求时,根据缓存状态数据在缓存索引数据中确定查询请求对应的目标缓存索引数据,最后按照目标缓存索引数据在整表数据中获取查询结果,将查询结果发送至访问模块。本发明实施例在应用启动时将整表数据全部加载进本地内存,应用访问时不再访问数据库,这种方式能让所有的查询操作都在内存中进行,查询效率大大提升,大大减少出现缓存访问毛刺的风险,同时也能避免极端情况下的缓存穿透与缓存雪崩风险,让系统具备更高的稳定性。
本发明的其他特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本发明而了解。本发明的目的和其他优点在说明书、权利要求书以及附图中所特别指出的结构来实现和获得。
为使本发明的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。
附图说明
为了更清楚地说明本发明具体实施方式或现有技术中的技术方案,下面将对具体实施方式或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施方式,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的数据查询方法流程图;
图2为本发明实施例提供的组件关系示意图;
图3为本发明实施例提供的缓存存储结构示意图;
图4为本发明实施例提供的一种数据查询装置结构框图;
图5为本发明实施例提供的另一种数据查询装置结构框图;
图6为本发明实施例提供的计算机设备结构框图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合附图对本发明的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
银行海外业务系统是整个海外银行架构的核心,所有其他系统都需要来业务系统查询客户信息、账户信息、贷款信息、交易状态等内容,业务系统需要为这些系统提供高效、稳定的服务。缓存是加快系统响应速度的最佳手段。目前业务系统使用的有Ehcache、Redis(Remote Dictionary Server,远程字典服务)这些缓存方式。Ehcache这种基于内存的缓存方式具有缓存访问毛刺,容易发生缓存穿透与缓存雪崩的风险。Redis缓存使用单独的机器做缓存,数据存储在机器内存中,访问速度快,但是会有网络开销,当网络不稳定时会严重影响效率。这些缓存方式在某种程度上都对系统的高效性与稳定性产生一定的影响。
目前使用比较广泛的内存缓存有EhCache、Guava Cache、Memcached等,这些缓存方式都具备高效性、线程安全性,并且可以自动进行缓存清理。这些缓存方式都遵循这样的原则:当缓存中存在所需数据时,直接返回;当缓存中不存在所需数据时,会再去数据库中查询所需数据。这种原则会造成的问题是:当某个数据首次被访问时,需要先从数据库中读取到缓存中,后续再访问时,才能从缓存中读到。当数据被缓存自动清理掉后,下次再访问又需要从数据库中重新加载到缓存中,将这种偶发访问时长增大的情况称之为缓存的访问毛刺。同时这种原则也容易产生缓存穿透与缓存雪崩的风险。
另外系统日益复杂,很多应用系统使用了多个数据库具备多个数据源,当多个数据源下的同一个表数据都被加载进内存缓存里,目前的缓存方式不能很好地区分来源数据源,就容易造成数据混乱的问题。比如银行海外业务系统具有联机和批量两个数据库,两个数据库中都有银行汇率表,但是所存数据具有一天的时间差,如果使用目前的缓存方式缓存该表数据,应用在访问时就无法区分所获取的汇率数据是来自批量数据库还是联机数据库,容易造成金融数据计算错误。
基于此,本发明实施例提供的一种数据查询方法及装置,该方法当分布式应用启动时,加载不同数据源下的全表数据至各个应用内存中,让后续所有缓存访问全在应用内存中进行,响应速度最快且能避免缓存访问毛刺;当缓存未命中时,不需再访问数据库,避免缓存穿透与缓存雪崩。当表数据发生修改时,通过Zookeeper通知所有应用更新缓存,保证分布式服务数据一致性。
本发明提供一种基于JVM(Java Virtual Machine,Java虚拟机)分布式全量数据缓存实现,针对被频繁访问且数据量不是特别大的表,解决目前技术存在的缓存访问毛刺、缓存穿透、缓存雪崩以及多数据源下的数据混乱问题,保证数据查询的高效性和安全性。
为便于对本实施例进行理解,首先对本发明实施例所公开的一种数据查询方法进行详细介绍。
为了便于理解,首先,对涉及的技术术语进行解释。
缓存穿透:每个缓存都有一个缓存的值,当相同的键过来时,就直接取缓存中的数据返回给调用方,而不用去查数据库,如果调用方传来的永远都是缓存中不存在的键,这样每次都需要去数据库中查一次,就会导致数据库压力增大,缓存失去意义,这就是缓存穿透。其危害是:当大量的请求过来时,首先会从缓存中寻找数据,当缓存中没有对应的数据时又转到了数据库中去寻找,瞬时数据库的压力就会很大,相当于没有用到缓存,同时还增加了去缓存中查找数据的时间。
缓存雪崩:缓存雪崩就是在某一时刻,大量缓存同时失效导致所有请求都去查询数据库,导致数据库压力过大,然后挂掉的情况。缓存穿透比较严重的时候也会导致缓存雪崩的发生。
本发明实施例提供了一种数据查询方法,参见图1所示的一种数据查询方法流程图,该方法包括以下步骤:
步骤S102,将整表数据从目标数据库加载至缓存数据存储区。
在本发明实施例中,整表数据是指待访问的表的全部数据,将整表数据从目标数据库加载到缓存数据存储区,缓存数据存储区设置在内存中,从而实现将数据表中所有数据都存储至本地内存,减少与数据库交互的频率,提升查询效率。
步骤S104,获取整表数据的缓存状态数据以及缓存索引数据,将整表数据、缓存状态数据和缓存索引数据存储在缓存数据存储区。
在本发明实施例中,整表数据的缓存状态数据以及缓存索引数据可以预先进行设置,也可以根据整表数据的处理状态实时生成。其中,缓存状态数据用于描述整表数据的缓存状态,例如,整表数据是否完成加载以及数据是否有效等。为了减小存储空间的占用,利用缓存索引数据对整表数据存储情况进行描述。
需要说明的是,本发明实施例提供的数据查询方法,可以用于每个应用组件中的缓存访问处理器,在进行数据查询时,缓存访问处理器将整表数据从目标数据库加载至缓存数据存储区,缓存数据存储区以全表缓存的方式将整个表数据、缓存索引和缓存状态信息存储在应用组件的本地内存中。
步骤S106,收到查询请求时,根据缓存状态数据在缓存索引数据中确定查询请求对应的目标缓存索引数据。
在本发明实施例中,查询请求中包括想要查询表所属的数据库以及想要查询的表位置等查询请求信息。例如,查询请求信息可以是,查询交易数据库中的某表的包括表数据a的行数据。根据缓存状态数据可以确定整表数据是否有效,在表数据有效的情况下,由于整表数据的每行数据都有一个缓存索引数据,确定表数据a对应的缓存索引数据,得到目标缓存索引数据,
步骤S108,按照目标缓存索引数据在整表数据中获取查询结果,将查询结果发送至访问模块。
在本发明实施例中,在确定了目标缓存索引数据后,在整表数据中获取目标缓存索引数据对应的信息,得到查询结果,并将查询结果发送至访问模块,完成数据查询。
该方案首先将整表数据从目标数据库加载至缓存数据存储区,获取整表数据的缓存状态数据以及缓存索引数据,将整表数据、缓存状态数据和缓存索引数据存储在缓存数据存储区,收到查询请求时,根据缓存状态数据在缓存索引数据中确定查询请求对应的目标缓存索引数据,最后按照目标缓存索引数据在整表数据中获取查询结果,将查询结果发送至访问模块。本发明实施例在应用启动时将整表数据全部加载进本地内存,应用访问时不再访问数据库,这种方式能让所有的查询操作都在内存中进行,查询效率大大提升,大大减少出现缓存访问毛刺的风险,同时也能避免极端情况下的缓存穿透与缓存雪崩风险,让系统具备更高的稳定性。
为了保证应用组件与目标数据库的数据一致性,将整表数据从目标数据库加载至缓存数据存储区之前,还可以执行如下步骤:
监控目标数据库中整表数据的状态;若整表数据的状态改变,则利用消息组件向多个应用组件发送状态改变通知,以使多个应用组件按照状态改变通知调整整表数据。
在本发明实施例中,整表数据的状态改变包括数据新增、数据删除和数据更新,如果发现目标数据库中存在任一种方式的改变,则利用消息组件向所有的应用组件发送通知。
需要说明的是,参见图2所示的组件关系示意图,消息组件可以与每个应用组件进行信息传递,以保证每个应用组件中的数据与目标数据库中的数据保持一致。
消息组件为ZOOKEEPER组件。
在本发明实施例中,ZOOKEEPER集群,以订阅或发布模式处理分布式服务之间的消息,用于同步分布式集群数据。对于每一个缓存的数据块,在ZOOKEEPER集群上有一一对应的节点。
为了防止多线程并发时出现数据脏读问题,该方法还可以执行如下步骤:
生成整表数据的读写锁,以根据读写锁控制整表数据的查询过程或调整过程。
在本发明实施例中,读写锁能实现读读共享,读写互斥,写写互斥。针对每个整表数据生成一个读写锁,能够让多线程对不同整表数据进行操作时互不干扰,对同一个整表数据操作时能实现读读共享,读写互斥,写写互斥。当查询缓存时,先将对应整表数据加读锁,读取完成后释放读锁。当更新缓存时,先将对应的整表数据加写锁,更新完成后释放写锁。
考虑到很多应用系统使用了多个数据库具备多个数据源,当多个数据源下的同一个表数据都被加载进内存缓存里,目前的缓存方式不能很好地区分来源数据源,就容易造成数据混乱的问题,因此,整表数据还包括数据源标识;根据缓存状态数据在缓存索引数据中确定查询请求对应的目标缓存索引数据,可以按照如下步骤执行:
根据查询请求确定目标数据源;根据数据源标识和缓存状态数据在缓存索引数据中确定目标数据源对应的目标缓存索引数据。
在本发明实施例中,对于存储项目相同的数据表A,可能来源于不同的数据库,或者可能存储的数据属于不同的时刻,因此,为了区分数据源,整表数据包括数据源标识,例如,“DataSourceOnline_TableA”与“DataSourceBatch_TableA”可以用于表示来源于不同数据源的数据表A。根据查询请求可以确定用户想要查询的目标数据源,根据数据源标识和缓存状态数据在缓存索引数据中可以确定与目标数据源对应的目标缓存索引数据。
参见图2所示的组件关系示意图,下面以一个具体实施例对该方案进行说明。
首先,对图中的内容进行解释。
CAH(Cache Access Handler,缓存访问处理器),提供缓存注解(@CacheAccess)及缓存访问接口、缓存数据源获取接口,解析数据访问请求,构建并使用FDCA的缓存数据。
ZOOKEEPER:ZOOKEEPER集群,以订阅/发布模式处理分布式服务之间的消息,用于同步分布式集群数据。对于每一个缓存的数据块,在ZOOKEEPER集群上有一一对应的节点。
FDCA(Full Data Cache Area,缓存数据存储区),以全表缓存的方式存储整个表数据、缓存索引、缓存状态信息。
DaoImpl1:访问类1。
DaoImpl2:访问类2。
1.缓存数据存储区FDCA。
FDCA使用线程安全的ConcurrentHashMap作为存储容器。对于这种键-值形式的存储,本发明使用的键的组成规则为:数据源标识+下划线_+表名。这种规则能满足系统访问多个数据源的缓存需求。FDCA中的Value为一个自定义类CacheItem,参见表1,包含以下三个成员变量:成员变量1:isExpired,成员变量2:allRecords,以及成员变量3:index。
表1
例如,参见表2,存在数据表TableA,TableA具有ColA、ColB、ColC三列:其中ColA列包括数据“ValX”和数据“ValM”,ColB列包括数据“ValY”和数据“ValN”,ColC列包括数据“ValZ”和“ValP”。
ColA | ColB | ColC |
ValX | ValY | ValZ |
ValM | ValN | ValP |
表2
如果其当前使用的数据源为DataSourceOnline,当应用使用ColA或者ColA+ColC作为条件访问数据库时,为其建立的缓存存储结构,参见图3所示的缓存存储结构示意图,其中“0”、“1”和“null”为索引值,根据缓存索引数据可以确定索引值与整表数据之间的对应关系,也就是说,在拿到索引值后,根据该对应关系可以在整表数据中确定与索引值相关的查询结果。
2.缓存访问处理器CAH。
CAH主要负责缓存初始化、数据源获取、缓存访问、缓存更新、线程安全几个功能的实现。
CAH提供缓存访问接口CacheAccessInterface、数据源获取接口CacheDataSourceInterface、注解@CacheAccess、应用参数multiDataSourceEnabled(是否使用多数据源,默认值为false不使用,需要使用多数据源时在应用的配置文件中将其配置成true)。开发人员在使用本发明提供的缓存方式时,需要让数据访问实现类DaoImpl需要实现CacheAccessInterface接口,重写其selectAll()方法,并在需要使用缓存的查询方法上增加@CacheAccess注解,通过value属性指定访问键值列。比如,对于TableADaoImpl:
@CacheAccess(value={“colA”,”colB”})
public XXXObject selectByExample(String colA,String colB){...}
缓存初始化:在应用启动时,CAH调用数据表访问类(XXXDaoImpl)重写的查询全表数据方法selectAll()将全表数据加载进FDCA中。如果multiDataSourceEnabled的值配置成true,需要让应用的多个数据源实现类调用selectAll()方法加载各个数据源下的全表数据。除了加载数据,还需要在应用启动时为各个缓存键在ZOOKEEPER服务器上建立对应的节点,用于接收和发送应用更新缓存消息,实现分布式服务间的缓存同步。
数据源获取:使用本发明的缓存方式需要实现CacheDataSourceInterface接口,该接口提供两个方法:一是返回当前应用的所有数据源信息,数据源信息根据当前Spring容器中初始化的Bean获取。二是返回当前应用正在使用的数据源信息,当应用参数multiDataSourceEnabled值为true时,表示当前应用需要使用多数据源,在拦截到数据访问请求后,可以拿到运行时参数,此时可以通过Spring的反射机制获取当前请求所使用的数据源标识。当应用参数multiDataSourceEnabled值为false时,表示当前应用不需要使用多数据源,不需要使用反射获取当前请求的数据源信息,直接返回默认数据源信息即可,加快缓存响应速度。
缓存访问:本发明的缓存方式通过Spring切面的@Before通知来处理数据查询请求。当应用调用XXXDaoImpl中使用了缓存的查询方法时,CAH首先会调用CacheDataSourceInterface接口获取数据源标识及并根据请求参数获得表名,根据这两样得到当前的缓存键。然后判断FDCA中是否存在键以及其CacheItem中isExpired的值是否为false。如果FDCA中不存在键或者isExpired值为true,表示缓存不存在或者缓存已失效,CAH会先重新加载全表数据进FDCA中,并将isExpired值设置为false,然后开始匹配缓存键值。如果FDCA中存在键且isExpired值为false,则直接开始匹配缓存键值。匹配缓存键值,即在当前键对应的CacheItem中,判断其index是否包含当前查询请求中指定的字段名组合和字段值组合对应的下标数据。如果index中存在以当前字段名组合和字段值组合为键值对应的数据,直接获取下标数组。若没有,根据当前字段名组合建立索引,遍历allRecords,将所有字段值的组合更新进index中。完成后获取字段名组合和字段值组合对应的值,得到index里存储的下标数组。如果获取的下标数组数据不为空,从allRecords中取出具体的数据库记录返回给应用。如果下标数组结果为空,则直接返回空结果,不再访问数据库。
缓存更新:本发明的缓存实现提供的缓存更新模式为:先更新数据库,再更新缓存。线程A修改数据库中被缓存的tableA的数据,数据库事务成功提交后,线程A会根据当前数据源和表名得到缓存键,并向ZOOKEEPER集群上键对应的节点发送数据更新消息。ZOOKEEPER集群接收到消息后,会向所有订阅了该节点数据变化事件的应用服务发送数据更新消息,接收到消息的应用服务会先将键对应的CacheItem中isExpired的值设置成true,避免其他线程访问到未更新的数据,然后从数据库重新加载全表数据到allRecords中,最后重建缓存索引index,并将isExpired的值设置为false。如果线程A修改TableA数据失败,数据库回滚,则不对缓存做更新。
线程安全:本发明的缓存实现具备访问高效性与线程安全性。为了防止多线程并发时出现数据脏读问题,本发明使用ReentrantReadWriteLock读写锁,该锁具有读和读共享,读和写互斥,写和写互斥特性。创建一个缓存锁的HashMap,对缓存的每一个键,为其创建一个ReentrantReadWriteLock读写锁。当查询缓存时,先将对应键加读锁,读取完成后释放读锁。当更新缓存时,先将对应的键加写锁,更新完成后释放写锁。针对每一个缓存键建立各自的ReentrantReadWriteLock读写锁能够让多线程对不同键进行操作时互不干扰,对同一个键操作时能实现读读共享,读写互斥,写写互斥。对于读操作远大于写操作的缓存访问,这种机制能最大限度的让缓存并发访问,效率大大提升。同时,对于相同的键,ReentrantReadWriteLock的读和写互斥,写和写互斥特性也能够保证缓存不会读取到脏数据,这样就解决了高并发访问下的线程安全问题。
需要说明的是,数据源的动态获取只有在应用具有多数据源访问需求的情况下才需要做的步骤,如果应用没有这种特殊需求,可以将multiDataSourceEnabled参数配置成false,表示不使用多数据源功能。
FDCA这种数据存储方式能够最小化数据存储容量,它的全表缓存特性让应用在访问不到数据时不需再访问数据库,能够避免缓存访问毛刺、缓存穿透与缓存雪崩,保证缓存访问速度的同时也大大提高了应用的稳定性。CAH模块针对每个键建立ReentrantReadWriteLock读写锁这种设计能让多线程对不同的缓存键在读取和修改时互不影响,对同一个键的读取互不干扰和修改互斥,既保证了多线程的访问安全性,同时也让多线程的并发读取效率最优化。同时CAH支持多数据源缓存,能解决应用在使用多数据源下的可能出现的数据混乱问题。
该方案中,FDCA存储结构的设计,访问效率高,且能避免缓存访问毛刺、缓存穿透与缓存雪崩;CAH的多线程安全实现,既保证缓存并发访问安全性,又能最大化缓存访问吞吐量;CAH的多数据源支持,能解决应用在使用多数据源下的可能出现的数据混乱问题。
本发明实施例提供了一种数据查询方法及装置,该方法针对被频繁访问且数据量不是特别大的表,在应用启动时将表数据全部加载进本地内存,应用访问时不再访问数据库,这种方式能让所有的查询操作都在内存中进行,效率大大提升,不会出现缓存访问毛刺,同时也避免极端情况下的缓存穿透与缓存雪崩风险,让系统具备更高的稳定性。同时它还支持多数据源缓存,能解决应用在使用多数据源下的可能出现的数据混乱问题。
本发明实施例中还提供了一种数据查询装置,如下面的实施例所述。由于该装置解决问题的原理与数据查询方法相似,因此该装置的实施可以参见数据查询方法的实施,重复之处不再赘述。参见图4所示的数据查询装置结构框图,该装置包括:
初始化模块71,用于将整表数据从目标数据库加载至缓存数据存储区;缓存数据模块72,用于获取所述整表数据的缓存状态数据以及缓存索引数据,将所述整表数据、所述缓存状态数据和所述缓存索引数据存储在所述缓存数据存储区;数据处理模块73,用于收到查询请求时,根据缓存状态数据在缓存索引数据中确定查询请求对应的目标缓存索引数据;缓存访问模块74,用于按照目标缓存索引数据在整表数据中获取查询结果,将查询结果发送至访问模块。
在一个实施例中,参见图5所示的数据查询装置结构框图,该装置还包括监控模块75,用于:监控目标数据库中整表数据的状态;若整表数据的状态改变,则利用消息组件向多个应用组件发送状态改变通知,以使多个应用组件按照状态改变通知调整整表数据。
在一个实施例中,参见图5所示的数据查询装置结构框图,该装置还包括安全模块76,用于:生成整表数据的读写锁,以根据读写锁控制整表数据的查询过程或调整过程。
在一个实施例中,消息组件为ZOOKEEPER组件。
在一个实施例中,整表数据还包括数据源标识;数据处理模块,具体用于:根据查询请求确定目标数据源;根据数据源标识和缓存状态数据在缓存索引数据中确定目标数据源对应的目标缓存索引数据。
本发明实施例还提供一种计算机设备,参见图6所示的计算机设备结构示意框图,该计算机设备包括存储器81、处理器82及存储在存储器上并可在处理器上运行的计算机程序,处理器执行计算机程序时实现上述任一种数据查询方法的步骤。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的计算机设备的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
本发明实施例还提供一种计算机可读存储介质,计算机可读存储介质存储有执行上述任一种数据查询方法的计算机程序。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
最后应说明的是:以上所述实施例,仅为本发明的具体实施方式,用以说明本发明的技术方案,而非对其限制,本发明的保护范围并不局限于此,尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行修改或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些修改、变化或者替换,并不使相应技术方案的本质脱离本发明实施例技术方案的精神和范围,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。
Claims (6)
1.一种数据查询方法,其特征在于,该数据查询方法基于Java虚拟机分布式全量数据缓存实现,该方法包括:
将整表数据从目标数据库加载至缓存数据存储区;所述缓存数据存储区存在于应用组件中,其中,应用组件中缓存访问处理器CAH提供缓存注解、缓存访问接口、缓存数据源获取接口,解析数据访问请求,构建并使用缓存数据存储区的缓存数据,应用组件的Spring容器获取当前应用的所有数据源信息和当前应用正在使用的数据源信息;
获取所述整表数据的缓存状态数据以及缓存索引数据,将所述整表数据、所述缓存状态数据和所述缓存索引数据存储在所述缓存数据存储区;所述缓存状态数据包括整表数据是否完成加载以及数据是否有效,缓存数据存储区采用键值形式存储,键包括数据源标识、表名;其中,在应用启动时为各个键在消息组件上建立对应的节点,用于接收和发送应用更新缓存消息,消息组件与每个应用组件进行信息传递,以订阅、发布模式处理分布式服务之间的消息;消息组件为ZOOKEEPER组件;
收到查询请求时,根据所述缓存状态数据在所述缓存索引数据中确定所述查询请求对应的目标缓存索引数据;
按照所述目标缓存索引数据在所述整表数据中获取查询结果,将所述查询结果发送至访问模块;
将整表数据从目标数据库加载至缓存数据存储区之前,还包括:
监控目标数据库中整表数据的状态;
若所述整表数据的状态改变,则利用消息组件向多个应用组件发送状态改变通知,以使所述多个应用组件按照所述状态改变通知调整所述整表数据;
生成所述整表数据的读写锁,以根据所述读写锁控制所述整表数据的查询过程或调整过程。
2.根据权利要求1所述的方法,其特征在于,所述整表数据还包括数据源标识;
根据所述缓存状态数据在所述缓存索引数据中确定所述查询请求对应的目标缓存索引数据,包括:
根据所述查询请求确定目标数据源;
根据所述数据源标识和所述缓存状态数据在所述缓存索引数据中确定所述目标数据源对应的目标缓存索引数据。
3.一种数据查询装置,其特征在于,该数据查询装置基于Java虚拟机分布式全量数据缓存实现,该装置包括:
初始化模块,用于将整表数据从目标数据库加载至缓存数据存储区;所述缓存数据存储区存在于应用组件中,其中,应用组件中缓存访问处理器CAH提供缓存注解、缓存访问接口、缓存数据源获取接口,解析数据访问请求,构建并使用缓存数据存储区的缓存数据,应用组件的Spring容器获取当前应用的所有数据源信息和当前应用正在使用的数据源信息;
缓存数据模块,用于获取所述整表数据的缓存状态数据以及缓存索引数据,将所述整表数据、所述缓存状态数据和所述缓存索引数据存储在所述缓存数据存储区;所述缓存状态数据包括整表数据是否完成加载以及数据是否有效,缓存数据存储区采用键值形式存储,键包括数据源标识、表名;其中,在应用启动时为各个键在消息组件上建立对应的节点,用于接收和发送应用更新缓存消息,消息组件与每个应用组件进行信息传递,以订阅、发布模式处理分布式服务之间的消息;消息组件为ZOOKEEPER组件;
数据处理模块,用于收到查询请求时,根据所述缓存状态数据在所述缓存索引数据中确定所述查询请求对应的目标缓存索引数据;
缓存访问模块,用于按照所述目标缓存索引数据在所述整表数据中获取查询结果,将所述查询结果发送至访问模块;
还包括监控模块,用于:
监控目标数据库中整表数据的状态;
若所述整表数据的状态改变,则利用消息组件向多个应用组件发送状态改变通知,以使所述多个应用组件按照所述状态改变通知调整所述整表数据;
包括安全模块,用于:
生成所述整表数据的读写锁,以根据所述读写锁控制所述整表数据的查询过程或调整过程。
4.根据权利要求3所述的装置,其特征在于,所述整表数据还包括数据源标识;所述数据处理模块,具体用于:
根据所述查询请求确定目标数据源;
根据所述数据源标识和所述缓存状态数据在所述缓存索引数据中确定所述目标数据源对应的目标缓存索引数据。
5.一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至2任一所述方法。
6.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现权利要求1至2任一所述方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010954031.6A CN112035528B (zh) | 2020-09-11 | 2020-09-11 | 数据查询方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010954031.6A CN112035528B (zh) | 2020-09-11 | 2020-09-11 | 数据查询方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112035528A CN112035528A (zh) | 2020-12-04 |
CN112035528B true CN112035528B (zh) | 2024-04-16 |
Family
ID=73588790
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010954031.6A Active CN112035528B (zh) | 2020-09-11 | 2020-09-11 | 数据查询方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112035528B (zh) |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112632130A (zh) * | 2020-12-30 | 2021-04-09 | 中国农业银行股份有限公司 | 一种数据管理的方法、装置、设备及介质 |
CN113032392B (zh) * | 2021-02-26 | 2023-06-23 | 广东核电合营有限公司 | 标牌数据获取方法、装置、计算机设备和存储介质 |
CN113111088A (zh) * | 2021-04-13 | 2021-07-13 | 北京沃东天骏信息技术有限公司 | 数据抽取方法、装置、计算机设备和存储介质 |
CN113420052B (zh) * | 2021-07-08 | 2023-02-17 | 上海浦东发展银行股份有限公司 | 一种多级分布式缓存系统及方法 |
CN113609137B (zh) * | 2021-08-27 | 2023-06-02 | 四川中电启明星信息技术有限公司 | 一种基于反射的内外网穿透方法 |
CN113806651B (zh) * | 2021-09-18 | 2024-05-24 | 深圳市酷开网络科技股份有限公司 | 一种数据缓存方法、装置、服务器及存储介质 |
CN114647667A (zh) * | 2022-03-21 | 2022-06-21 | 北京感易智能科技有限公司 | 基于配置的搜索方法和基于配置的搜索装置 |
CN114756469A (zh) * | 2022-04-24 | 2022-07-15 | 阿里巴巴(中国)有限公司 | 数据关系分析方法、装置及电子设备 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103853766A (zh) * | 2012-12-03 | 2014-06-11 | 中国科学院计算技术研究所 | 一种面向流式数据的在线处理方法及系统 |
CN105159845A (zh) * | 2015-09-07 | 2015-12-16 | 四川神琥科技有限公司 | 存储器读取方法 |
CN105468541A (zh) * | 2015-12-11 | 2016-04-06 | 中南大学 | 一种面向透明计算智能终端的缓存管理方法 |
CN109885589A (zh) * | 2017-12-06 | 2019-06-14 | 腾讯科技(深圳)有限公司 | 数据查询方法、装置、计算机设备及存储介质 |
-
2020
- 2020-09-11 CN CN202010954031.6A patent/CN112035528B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103853766A (zh) * | 2012-12-03 | 2014-06-11 | 中国科学院计算技术研究所 | 一种面向流式数据的在线处理方法及系统 |
CN105159845A (zh) * | 2015-09-07 | 2015-12-16 | 四川神琥科技有限公司 | 存储器读取方法 |
CN105468541A (zh) * | 2015-12-11 | 2016-04-06 | 中南大学 | 一种面向透明计算智能终端的缓存管理方法 |
CN109885589A (zh) * | 2017-12-06 | 2019-06-14 | 腾讯科技(深圳)有限公司 | 数据查询方法、装置、计算机设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN112035528A (zh) | 2020-12-04 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112035528B (zh) | 数据查询方法及装置 | |
US10803047B2 (en) | Accessing data entities | |
CN101221538B (zh) | 实现对缓存中数据快速查找的系统和方法 | |
CN100437590C (zh) | 预取对象的方法 | |
US10853193B2 (en) | Database system recovery using non-volatile system memory | |
CN109977129A (zh) | 多级数据缓存方法及设备 | |
US20210158310A1 (en) | Blockchain-based transaction processing methods and apparatuses and electronic devices | |
CA2626849C (en) | Method and mechanism for loading xml documents into memory | |
CN107888687B (zh) | 一种基于分布式存储系统的代理客户端存储加速方法及系统 | |
US11288254B2 (en) | Method of and system for processing request in distributed database | |
CN109690522B (zh) | 一种基于b+树索引的数据更新方法、装置及存储装置 | |
CN109358874B (zh) | 业务规则更新方法、装置、计算机设备和存储介质 | |
CN105354046B (zh) | 基于共享磁盘的数据库更新处理方法及系统 | |
US11983169B2 (en) | Optimization of database write operations by combining and parallelizing operations based on a hash value of primary keys | |
US10013353B2 (en) | Adaptive optimization of second level cache | |
CN111221857B (zh) | 从分布式系统中读数据记录的方法和装置 | |
CN109408497B (zh) | 一种数据的渲染方法、装置及设备 | |
CN110096334B (zh) | 缓存处理方法、装置、设备及计算机可读存储介质 | |
US11556540B1 (en) | Transmission format cache for database reads | |
CN111737298B (zh) | 基于分布式存储的缓存数据管控方法及装置 | |
CN113590661A (zh) | 数据缓存方法、装置、服务器和计算机可读存储介质 | |
CN109791521B (zh) | 提供数据访问的原子集的装置及方法 | |
WO2020211570A1 (zh) | 缓存处理方法、装置、设备及计算机可读存储介质 | |
CN117131088A (zh) | 一种基于多级分布式缓存的菜单权限查询方法和装置 | |
CN114116786A (zh) | 一种数据处理方法和装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |