CN111026771A - 一种保证缓存与数据库数据一致的方法 - Google Patents
一种保证缓存与数据库数据一致的方法 Download PDFInfo
- Publication number
- CN111026771A CN111026771A CN201911133028.1A CN201911133028A CN111026771A CN 111026771 A CN111026771 A CN 111026771A CN 201911133028 A CN201911133028 A CN 201911133028A CN 111026771 A CN111026771 A CN 111026771A
- Authority
- CN
- China
- Prior art keywords
- cache
- data
- database
- application program
- api
- 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.)
- Granted
Links
- 238000000034 method Methods 0.000 title claims abstract description 32
- 230000004048 modification Effects 0.000 claims description 8
- 238000012986 modification Methods 0.000 claims description 8
- 230000007717 exclusion Effects 0.000 claims description 4
- 230000002688 persistence Effects 0.000 claims description 3
- 230000008030 elimination Effects 0.000 description 4
- 238000003379 elimination reaction Methods 0.000 description 4
- 230000008569 process Effects 0.000 description 3
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000015556 catabolic process Effects 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 230000003111 delayed effect Effects 0.000 description 1
- 238000010586 diagram Methods 0.000 description 1
- 230000014759 maintenance of location Effects 0.000 description 1
- 238000011084 recovery Methods 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
Images
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/23—Updating
- G06F16/2365—Ensuring data consistency and integrity
-
- 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)
- Computer Security & Cryptography (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种保证缓存与数据库数据一致的方法,包括如下步骤:应用程序通过API接口将数据写入数据库;将对数据库的执行操作异步写入二进制日志文件binlog;通过从二进制日志文件binlog读取日志后更新缓存;应用程序通过API接口从缓存中读取数据。本发明通过采用二进制日志文件binlog结合异步Asynchronous更新缓存,可以保证缓存与数据库数据一致。
Description
技术领域
本发明涉及数据库在高并发的系统中的数据处理技术领域,尤其是一种保证缓存与数据库数据一致的方法。
背景技术
在高并发的系统中关于缓存的重要性不言而喻,缓存在项目当中大量使用,扛住了大部分的查询流量,但也有很多点需要注意,最为典型的例子就是数据一致性问题,缓存击穿问题,缓存高可用问题等等。
关于数据一致性的问题:
缓存一致性就是说DB的数据与缓存的数据保持一致,理论上同一瞬间去变更两个值是最理想的,访问缓存跟DB是一致的。
在分布式的情况下,无论如何操作,更新DB与缓存是存在间隙的。并且在结合实际情况下的多线程环境,那问题将更加复杂。
更新缓存的策略:
先更新DB再更新缓存,此方案线程T1更新数据库数据D1->D2,还没更新缓存,线程T2更新数据D2->D3,由于线程T2可能比较快,直接更新缓存为D2,此时运行“缓慢”的T1才更新缓存为D2。结果为DB的数据为D3,缓存的数据为D2。
先更新缓存再更新DB,线程T1更新完缓存还没更新DB,线程T2很快更新完缓存立马T2更新DB为D2,这个时候T1才更新DB为D1,数据库为D1,缓存为D2。
发明内容
本发明所要解决的技术问题是:针对在高并发的系统中缓存与数据库数据不一致的问题,提供一种保证缓存与数据库数据一致的方法。
本发明采用的技术方案如下:
一种保证缓存与数据库数据一致的方法,其特征在于,包括如下步骤:
应用程序通过API接口将数据写入数据库;
将对数据库的执行操作异步写入二进制日志文件binlog;
通过从二进制日志文件binlog读取日志后更新缓存;
应用程序通过API接口从缓存中读取数据。
其中,在应用程序通过API接口将数据写入数据库前先淘汰缓存。
其中,当缓存过期时建立互斥锁,在更新缓存后再释放互斥锁。
其中,通过设置一个小于缓存过期时间的超时值,使所述互斥锁提前使用。
其中,当缓存过期时通过异步线程进行缓存的构建。
其中,若对脏数据保证缓存与数据库数据一致时,在应用程序通过API接口将数据写入数据库后再淘汰缓存。
其中,所述数据库在更新和读取的地方使用同样key的分布式锁。
其中,通过从二进制日志文件binlog读取日志后更新缓存的方法为:在读取的日志中扫描二进制日志文件binlog的修改记录,根据扫描出的修改记录去更新缓存。
其中,应用程序通过API接口从缓存中读取数据的方法为:为缓存中每条库存记录配置一个递增的版本号,每次应用程序通过API接口从缓存中读取数据时,比较消息的版本号与当前缓存的版本号的大小,将小于消息的版本号的数据丢弃。
其中,采用LRU算法策略处理缓存溢出,并采用Redis的RDB和AOF持久化策略处理缓存数据丢失。
综上所述,由于采用了上述技术方案,本发明的有益效果是:
本发明通过采用二进制日志文件binlog结合异步Asynchronous更新缓存,可以保证缓存与数据库数据一致。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本发明的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
图1为本发明的保证缓存与数据库数据一致的方法的原理框图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明,即所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本发明实施例的组件可以以各种不同的配置来布置和设计。因此,以下对在附图中提供的本发明的实施例的详细描述并非旨在限制要求保护的本发明的范围,而是仅仅表示本发明的选定实施例。基于本发明的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。
二进制日志文件binlog主要用来记录Mysql内部对数据库的改动(只记录对数据的修改操作),主要用于数据库的主从复制以及增量恢复等等操作的用途,另外还可以应用在一些其他的场景,缓存就是其中的一个场景,可以用来异步做很多解耦的事情。由此,本发明采用二进制日志文件binlog结合异步Asynchronous更新缓存,来解决在高并发系统中缓存与数据库数据的一致性问题。
以下结合实施例对本发明的特征和性能作进一步的详细描述。
实施例1
如图1所示,本实施例提供的一种保证缓存与数据库数据一致的方法,包括如下步骤:
应用程序通过API接口将数据写入数据库;
将对数据库的执行操作异步写入二进制日志文件binlog;
通过从二进制日志文件binlog读取日志后更新缓存;
应用程序通过API接口从缓存中读取数据。
其中,应用程序通过API接口将数据写入数据库时,可以采用JDBC将数据源的数据写入数据库。
其中,更新缓存时,修改缓存很直接,但是涉及到本次更新的数据结果需要一堆数据运算,复杂度就增加了。而淘汰缓存仅仅会增加一次cache miss,代价可以忽略,所以优选淘汰缓存。若先写入数据库后淘汰缓存,如果淘汰失败,缓存里会一直是脏数据;若先淘汰缓存后写入数据库,下次请求的时候缓存就会miss hit一次,这个代价是可以忽略的(如果淘汰失败return false),综合比较统,推荐先淘汰缓存再写数据库。由此,在本发明中,在应用程序通过API接口将数据写入数据库前先淘汰缓存。
其中,当缓存过期时建立互斥锁,在更新缓存后再释放互斥锁,通过这样的方式,在缓存过期时等待一定的时间后就可以从缓存中继续获取数据。具体地,当缓存过期时,不是立即去加载数据库(load db),而是先使用缓存工具的某些成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去建立一个互斥锁,当操作返回成功时,再进行加载数据库(load db)的操作并回设缓存;否则就重试整个获取缓存值的方法。该过程的代码表达如下:
进一步,通过设置一个小于缓存过期时间(memcache timeout)的超时值,使所述互斥锁提前使用。具体地,在缓存值内部设置一个超时值(timeout1),超时值(timeout1)比实际的缓存过期时间(timeout2)小;当从缓存读取到超时值(timeout1)发现它已经过期时候,立即延长超时值(timeout1)并重新设置到缓存;然后再从数据库加载数据并设置到缓存中。该过程的代码表达如下:
对于缓存过期的处理,从redis上看,没有设置过期时间,这就保证了不会出现缓存的热点key过期问题,也就是“物理”不过期。从功能上看,如果缓存不过期,那就成静态的了,所以我们把缓存过期时间存在热点key对应的缓存值(value)里,当缓存过期时通过异步线程进行缓存的构建,也就是“逻辑”过期。这种方法对于性能非常友好,唯一不足的就是构建缓存时候,其余线程(非构建缓存的线程)可能访问的是老数据,但是对于一般的互联网功能来说这个还是可以忍受。该过程的代码表达如下:
其中,应用程序通过API接口从缓存中读取数据的方法为:为缓存中每条库存记录配置一个递增的版本号,每次应用程序通过API接口从缓存中读取数据时,比较消息的版本号与当前缓存的版本号的大小,将小于消息的版本号的数据丢弃。进一步,在更新缓存之前可能当前消息可能是延迟消息,因此需要在更新缓存之前做二次判断,保证数据一致性,然后再通过API接口从缓存中读取数据。
在保证缓存与数据库数据一致时,难以避免还涉及到脏数据,在对脏数据需要进行保证缓存与数据库数据一致时,通过下述方法进行:
其中,若对脏数据保证缓存与数据库数据一致时,在应用程序通过API接口将数据写入数据库后再淘汰缓存,可以尽量减少脏数据的留存时间。
其中,所述数据库在更新和读取的地方使用同样key的分布式锁,这样就能保证,先操作(或读或写)数据的先获得结果。
其中,若数据都已缓存,绝大部分数据都不要求强一致性,为了尽可能的缩短一致性的时间,通过从二进制日志文件binlog读取日志后更新缓存的方法可以是:异步binlog扫描更新法,即在读取的日志中扫描二进制日志文件binlog的修改记录,根据扫描出的修改记录去更新缓存。或者也可以采用异步消息总线esb更新法,即:修改数据库时往消息总线里发送一个消息,在接收端去处理这个消息候更新缓存,该方法缺点是有代码入侵。
最后,对于缓存系统常见的缓存满了和数据丢失问题,需要根据具体业务分析,采用LRU算法策略处理缓存溢出,并采用Redis的RDB和AOF持久化策略处理缓存数据丢失,来保证一定情况下的数据安全。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
Claims (10)
1.一种保证缓存与数据库数据一致的方法,其特征在于,包括如下步骤:
应用程序通过API接口将数据写入数据库;
将对数据库的执行操作异步写入二进制日志文件binlog;
通过从二进制日志文件binlog读取日志后更新缓存;
应用程序通过API接口从缓存中读取数据。
2.根据权利要求1所述的保证缓存与数据库数据一致的方法,其特征在于,在应用程序通过API接口将数据写入数据库前先淘汰缓存。
3.根据权利要求1所述的保证缓存与数据库数据一致的方法,其特征在于,当缓存过期时建立互斥锁,在更新缓存后再释放互斥锁。
4.根据权利要求3所述的保证缓存与数据库数据一致的方法,其特征在于,通过设置一个小于缓存过期时间的超时值,使所述互斥锁提前使用。
5.根据权利要求4所述的保证缓存与数据库数据一致的方法,其特征在于,当缓存过期时通过异步线程进行缓存的构建。
6.根据权利要求1所述的保证缓存与数据库数据一致的方法,其特征在于,若对脏数据保证缓存与数据库数据一致时,在应用程序通过API接口将数据写入数据库后再淘汰缓存。
7.根据权利要求1所述的保证缓存与数据库数据一致的方法,其特征在于,所述数据库在更新和读取的地方使用同样key的分布式锁。
8.根据权利要求1所述的保证缓存与数据库数据一致的方法,其特征在于,通过从二进制日志文件binlog读取日志后更新缓存的方法为:在读取的日志中扫描二进制日志文件binlog的修改记录,根据扫描出的修改记录去更新缓存。
9.根据权利要求1所述的保证缓存与数据库数据一致的方法,其特征在于,应用程序通过API接口从缓存中读取数据的方法为:为缓存中每条库存记录配置一个递增的版本号,每次应用程序通过API接口从缓存中读取数据时,比较消息的版本号与当前缓存的版本号的大小,将小于消息的版本号的数据丢弃。
10.根据权利要求1-9任一项所述的保证缓存与数据库数据一致的方法,其特征在于,采用LRU算法策略处理缓存溢出,并采用Redis的RDB和AOF持久化策略处理缓存数据丢失。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911133028.1A CN111026771B (zh) | 2019-11-19 | 2019-11-19 | 一种保证缓存与数据库数据一致的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911133028.1A CN111026771B (zh) | 2019-11-19 | 2019-11-19 | 一种保证缓存与数据库数据一致的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111026771A true CN111026771A (zh) | 2020-04-17 |
CN111026771B CN111026771B (zh) | 2023-11-07 |
Family
ID=70200558
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201911133028.1A Active CN111026771B (zh) | 2019-11-19 | 2019-11-19 | 一种保证缓存与数据库数据一致的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111026771B (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111813792A (zh) * | 2020-06-22 | 2020-10-23 | 上海悦易网络信息技术有限公司 | 一种用于分布式缓存系统中缓存数据更新的方法与设备 |
CN112035509A (zh) * | 2020-08-28 | 2020-12-04 | 康键信息技术(深圳)有限公司 | 医疗缓存数据的查询方法、装置、设备及存储介质 |
CN112685431A (zh) * | 2020-12-29 | 2021-04-20 | 京东数字科技控股股份有限公司 | 异步缓存方法、装置、系统、电子设备和存储介质 |
CN113761049A (zh) * | 2020-05-27 | 2021-12-07 | 北京沃东天骏信息技术有限公司 | 读写分离下的数据同步方法和装置 |
Citations (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101110088A (zh) * | 2007-04-17 | 2008-01-23 | 南京中兴软创科技有限责任公司 | 基于缓存技术的数据库访问接口方法 |
US20090240664A1 (en) * | 2008-03-20 | 2009-09-24 | Schooner Information Technology, Inc. | Scalable Database Management Software on a Cluster of Nodes Using a Shared-Distributed Flash Memory |
US20110218971A1 (en) * | 2010-03-08 | 2011-09-08 | Yahoo! Inc. | System, Method And Computer Program Product For Managing Caches |
CN104537119A (zh) * | 2015-01-26 | 2015-04-22 | 浪潮通信信息系统有限公司 | 一种缓存数据的更新方法、数据使用端和系统 |
US20150278282A1 (en) * | 2014-03-31 | 2015-10-01 | Wal-Mart Stores, Inc. | Integrating database management system and external cache |
CN106446037A (zh) * | 2016-08-31 | 2017-02-22 | 南威软件股份有限公司 | 一种基于分布式锁实现Redis与MYSQL数据一致性的方法 |
CN106484869A (zh) * | 2016-10-12 | 2017-03-08 | 北京集奥聚合科技有限公司 | 一种基于mysql binlog的分布式缓存方法及系统 |
CN107341212A (zh) * | 2017-06-26 | 2017-11-10 | 努比亚技术有限公司 | 一种缓存更新方法及设备 |
CN107562829A (zh) * | 2017-08-22 | 2018-01-09 | 上海幻电信息科技有限公司 | 数据访问方法及设备 |
US20190102408A1 (en) * | 2017-09-29 | 2019-04-04 | Oracle International Corporation | Routing requests in shared-storage database systems |
-
2019
- 2019-11-19 CN CN201911133028.1A patent/CN111026771B/zh active Active
Patent Citations (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101110088A (zh) * | 2007-04-17 | 2008-01-23 | 南京中兴软创科技有限责任公司 | 基于缓存技术的数据库访问接口方法 |
US20090240664A1 (en) * | 2008-03-20 | 2009-09-24 | Schooner Information Technology, Inc. | Scalable Database Management Software on a Cluster of Nodes Using a Shared-Distributed Flash Memory |
US20110218971A1 (en) * | 2010-03-08 | 2011-09-08 | Yahoo! Inc. | System, Method And Computer Program Product For Managing Caches |
US20150278282A1 (en) * | 2014-03-31 | 2015-10-01 | Wal-Mart Stores, Inc. | Integrating database management system and external cache |
CN104537119A (zh) * | 2015-01-26 | 2015-04-22 | 浪潮通信信息系统有限公司 | 一种缓存数据的更新方法、数据使用端和系统 |
CN106446037A (zh) * | 2016-08-31 | 2017-02-22 | 南威软件股份有限公司 | 一种基于分布式锁实现Redis与MYSQL数据一致性的方法 |
CN106484869A (zh) * | 2016-10-12 | 2017-03-08 | 北京集奥聚合科技有限公司 | 一种基于mysql binlog的分布式缓存方法及系统 |
CN107341212A (zh) * | 2017-06-26 | 2017-11-10 | 努比亚技术有限公司 | 一种缓存更新方法及设备 |
CN107562829A (zh) * | 2017-08-22 | 2018-01-09 | 上海幻电信息科技有限公司 | 数据访问方法及设备 |
US20190102408A1 (en) * | 2017-09-29 | 2019-04-04 | Oracle International Corporation | Routing requests in shared-storage database systems |
Non-Patent Citations (6)
Title |
---|
BUSYMONKEY的博客: "缓存和数据库一致性解决方案", pages 1, Retrieved from the Internet <URL:https://blog.csdn.net/Dopamy_BusyMonkey/article/details/94733699?ops_request_misc> * |
IBRAHIM JALUTA: "Cache consistency in adaptive page-server database systems", 《2014 GLOBAL SUMMIT ON COMPUTER & INFORMATION TECHNOLOGY (GSCIT)》 * |
姚念民,舒继武,郑纬民: "SAN中的分布式锁机制", no. 02 * |
张慧宁;李拥军;王绍东;: "Redis压缩列表研究与优化设计", no. 18 * |
架构师之路: "究竟先操作缓存,还是数据库?", Retrieved from the Internet <URL:https://blog.csdn.net/z50L2O08e2u4afToR9A/article/details/80976862> * |
王念滨;宋益波;姚念民;赵志强;: "一种数据处理中间件系统语义缓存技术", no. 12 * |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113761049A (zh) * | 2020-05-27 | 2021-12-07 | 北京沃东天骏信息技术有限公司 | 读写分离下的数据同步方法和装置 |
CN111813792A (zh) * | 2020-06-22 | 2020-10-23 | 上海悦易网络信息技术有限公司 | 一种用于分布式缓存系统中缓存数据更新的方法与设备 |
CN112035509A (zh) * | 2020-08-28 | 2020-12-04 | 康键信息技术(深圳)有限公司 | 医疗缓存数据的查询方法、装置、设备及存储介质 |
CN112685431A (zh) * | 2020-12-29 | 2021-04-20 | 京东数字科技控股股份有限公司 | 异步缓存方法、装置、系统、电子设备和存储介质 |
CN112685431B (zh) * | 2020-12-29 | 2024-05-17 | 京东科技控股股份有限公司 | 异步缓存方法、装置、系统、电子设备和存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN111026771B (zh) | 2023-11-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111026771A (zh) | 一种保证缓存与数据库数据一致的方法 | |
CN108363806B (zh) | 数据库的多版本并发控制方法、装置、服务器及存储介质 | |
EP3467668B1 (en) | Method for processing database transaction, client and server | |
US11321299B2 (en) | Scalable conflict detection in transaction management | |
US9946745B2 (en) | Lock-free transactional support for large-scale storage systems | |
US7761434B2 (en) | Multiversion concurrency control in in-memory tree-based data structures | |
US8548945B2 (en) | Database caching utilizing asynchronous log-based replication | |
US7996360B2 (en) | Coordinating updates to replicated data | |
AU2002303900B2 (en) | Consistent read in a distributed database environment | |
CN110727675B (zh) | 一种链表的处理方法及装置 | |
EP0490525A2 (en) | Removal of data from a shared cache | |
CN111090663B (zh) | 事务并发控制方法、装置、终端设备及介质 | |
KR20030075854A (ko) | 공유 디스크 파일 시스템의 저널링 및 회복 방법 | |
US8103838B2 (en) | System and method for transactional locking using reader-lists | |
CN110309122B (zh) | 获取增量数据的方法、装置、服务器和存储介质 | |
CN109933606B (zh) | 一种数据库修改方法、装置、设备及存储介质 | |
CN111125040A (zh) | 管理重做日志的方法、装置及存储介质 | |
CN118140217A (zh) | 经由用于弹性缓冲池扩展的预暂存缓冲区进行本地页写入 | |
CN113220490A (zh) | 异步写回持久化内存的事务持久化方法及系统 | |
CN113010533B (zh) | 基于加锁限制的数据库访问方法、系统、终端及存储介质 | |
CN115469810A (zh) | 一种数据获取方法、装置、设备及存储介质 | |
CN115374133A (zh) | 数据处理方法、装置、电子设备和计算机可读存储介质 | |
CN110083549B (zh) | 一种缓存读写的方法及终端 | |
CN116775565B (zh) | 高性能存储引擎的快照隔离管理方法 | |
CN116244041B (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 |