diff --git a/.docusaurus/client-manifest.json b/.docusaurus/client-manifest.json new file mode 100644 index 0000000..cd3caa6 --- /dev/null +++ b/.docusaurus/client-manifest.json @@ -0,0 +1,1133 @@ +{ + "entrypoints": [ + "main" + ], + "origins": { + "2237": [ + 2237 + ], + "3834": [ + 1869, + 3249, + 7643, + 8554, + 3834 + ], + "8554": [ + 1869, + 3249, + 3834, + 7643, + 8401, + 8554 + ], + "17896441": [ + 1869, + 8554, + 8401 + ], + "87292243": [ + 9800 + ], + "94717405": [ + 6824 + ], + "main": [ + 1869, + 5354, + 8792 + ], + "runtime~main": [ + 1869, + 8792, + 5354 + ], + "0058b4c6": [ + 849 + ], + "03ab4acf": [ + 1903 + ], + "063090b1": [ + 4624 + ], + "06983a96": [ + 2891 + ], + "07f9788a": [ + 9315 + ], + "107669ab": [ + 2001 + ], + "1174a4a6": [ + 3934 + ], + "14c2ce36": [ + 7472 + ], + "15d8eb8d": [ + 736 + ], + "1845589b": [ + 1571 + ], + "1b3a196b": [ + 8140 + ], + "2571fc76": [ + 9974 + ], + "2859d2fb": [ + 2941 + ], + "29ba892c": [ + 2767 + ], + "2c217be1": [ + 4700 + ], + "2fcac357": [ + 2885 + ], + "30dc2be3": [ + 3717 + ], + "36994c47": [ + 9858 + ], + "38236c5e": [ + 3780 + ], + "4061d127": [ + 4292 + ], + "43fd4db6": [ + 1398 + ], + "49fb2c28": [ + 7765 + ], + "569b9636": [ + 3805 + ], + "56a9bc23": [ + 9460 + ], + "5845532a": [ + 1970 + ], + "5e95c892": [ + 9647 + ], + "6533aa10": [ + 5491 + ], + "65ee69ef": [ + 8184 + ], + "6edb4994": [ + 72 + ], + "7074118c": [ + 4674 + ], + "70e8c784": [ + 7191 + ], + "7777193d": [ + 6284 + ], + "814f3328": [ + 5091 + ], + "82bececd": [ + 9595 + ], + "878f190b": [ + 154 + ], + "8ad00878": [ + 9419 + ], + "8cf6d7a7": [ + 6871 + ], + "8d7aab24": [ + 5496 + ], + "937cdc77": [ + 9044 + ], + "9805f35a": [ + 4538 + ], + "9994e0b3": [ + 7084 + ], + "9b4df08c": [ + 3215 + ], + "9e4087bc": [ + 2711 + ], + "a3821efb": [ + 2995 + ], + "a5dfed40": [ + 4196 + ], + "a605574d": [ + 4487 + ], + "a6aa9e1f": [ + 1869, + 3834, + 8554, + 7643 + ], + "a7456010": [ + 1235 + ], + "a74ce679": [ + 7257 + ], + "a7776ad8": [ + 6230 + ], + "a7bd4aaa": [ + 7098 + ], + "a94703ab": [ + 1869, + 9048 + ], + "a950bb08": [ + 2978 + ], + "ab946cbc": [ + 5533 + ], + "aba21aa0": [ + 5742 + ], + "acecf23e": [ + 4284 + ], + "adc1ab20": [ + 539 + ], + "ae7197e3": [ + 3365 + ], + "affdd1e0": [ + 7938 + ], + "b50c085f": [ + 4434 + ], + "bb6459ea": [ + 1169 + ], + "bbb97d2b": [ + 7381 + ], + "c15d9823": [ + 8146 + ], + "c3d344d9": [ + 7043 + ], + "c4f5d8e4": [ + 1869, + 2634 + ], + "c6bc127f": [ + 8183 + ], + "c823c29b": [ + 321 + ], + "c8b8756d": [ + 5970 + ], + "ccc49370": [ + 1869, + 3834, + 8554, + 3249 + ], + "d049632c": [ + 902 + ], + "d126de26": [ + 2439 + ], + "e13eafd3": [ + 7963 + ], + "e60cd9a4": [ + 935 + ], + "e85952ae": [ + 9145 + ], + "ea50f5f5": [ + 2526 + ], + "eb808821": [ + 1661 + ], + "f7836a87": [ + 3053 + ], + "f81c1134": [ + 8130 + ], + "fac0ae3c": [ + 1173 + ], + "fdbae498": [ + 1742 + ], + "fdc83c8b": [ + 2516 + ], + "ffc6e5ef": [ + 24 + ], + "styles": [ + 2634, + 3249, + 3834, + 5354, + 7643, + 8401, + 8554, + 8792, + 9048, + 1869 + ] + }, + "assets": { + "24": { + "js": [ + { + "file": "assets/js/ffc6e5ef.e44305e4.js", + "hash": "4b0bf05dec256114", + "publicPath": "/assets/js/ffc6e5ef.e44305e4.js" + } + ] + }, + "72": { + "js": [ + { + "file": "assets/js/6edb4994.49230d1c.js", + "hash": "d2b4e130ac7b39cb", + "publicPath": "/assets/js/6edb4994.49230d1c.js" + } + ] + }, + "154": { + "js": [ + { + "file": "assets/js/878f190b.3d1a7843.js", + "hash": "4dc0a5ad41bd239a", + "publicPath": "/assets/js/878f190b.3d1a7843.js" + } + ] + }, + "321": { + "js": [ + { + "file": "assets/js/c823c29b.818d0605.js", + "hash": "10a2192ed2ed6f55", + "publicPath": "/assets/js/c823c29b.818d0605.js" + } + ] + }, + "539": { + "js": [ + { + "file": "assets/js/adc1ab20.088767d8.js", + "hash": "983d265135869db4", + "publicPath": "/assets/js/adc1ab20.088767d8.js" + } + ] + }, + "736": { + "js": [ + { + "file": "assets/js/15d8eb8d.f7365b8e.js", + "hash": "da08d01a9e20ee4a", + "publicPath": "/assets/js/15d8eb8d.f7365b8e.js" + } + ] + }, + "849": { + "js": [ + { + "file": "assets/js/0058b4c6.1e250fdb.js", + "hash": "cebd20c3cfa74dac", + "publicPath": "/assets/js/0058b4c6.1e250fdb.js" + } + ] + }, + "902": { + "js": [ + { + "file": "assets/js/d049632c.b3b21402.js", + "hash": "206067238e527b4b", + "publicPath": "/assets/js/d049632c.b3b21402.js" + } + ] + }, + "935": { + "js": [ + { + "file": "assets/js/e60cd9a4.0742af8f.js", + "hash": "68fb6e24205ad613", + "publicPath": "/assets/js/e60cd9a4.0742af8f.js" + } + ] + }, + "1169": { + "js": [ + { + "file": "assets/js/bb6459ea.8bfab866.js", + "hash": "2f721a56356f4d4f", + "publicPath": "/assets/js/bb6459ea.8bfab866.js" + } + ] + }, + "1173": { + "js": [ + { + "file": "assets/js/fac0ae3c.a652baa1.js", + "hash": "d1efbe65dd1a00fe", + "publicPath": "/assets/js/fac0ae3c.a652baa1.js" + } + ] + }, + "1235": { + "js": [ + { + "file": "assets/js/a7456010.2a0622b5.js", + "hash": "381b4777e7c07c92", + "publicPath": "/assets/js/a7456010.2a0622b5.js" + } + ] + }, + "1398": { + "js": [ + { + "file": "assets/js/43fd4db6.091730e4.js", + "hash": "10dab45bdbb08c3e", + "publicPath": "/assets/js/43fd4db6.091730e4.js" + } + ] + }, + "1571": { + "js": [ + { + "file": "assets/js/1845589b.788a4462.js", + "hash": "9b2ae185dc92f81a", + "publicPath": "/assets/js/1845589b.788a4462.js" + } + ] + }, + "1661": { + "js": [ + { + "file": "assets/js/eb808821.b43bbd7d.js", + "hash": "8acd5f19674f2a84", + "publicPath": "/assets/js/eb808821.b43bbd7d.js" + } + ] + }, + "1742": { + "js": [ + { + "file": "assets/js/fdbae498.94d380c6.js", + "hash": "e7ed4ed31fa8ef30", + "publicPath": "/assets/js/fdbae498.94d380c6.js" + } + ] + }, + "1869": { + "css": [ + { + "file": "assets/css/styles.bf00f426.css", + "hash": "99888eb2ca34b740", + "publicPath": "/assets/css/styles.bf00f426.css" + } + ] + }, + "1903": { + "js": [ + { + "file": "assets/js/03ab4acf.473ee52d.js", + "hash": "5e4daf02a3cd6bb1", + "publicPath": "/assets/js/03ab4acf.473ee52d.js" + } + ] + }, + "1970": { + "js": [ + { + "file": "assets/js/5845532a.247425f5.js", + "hash": "8bbdb2ca0d4e2b54", + "publicPath": "/assets/js/5845532a.247425f5.js" + } + ] + }, + "2001": { + "js": [ + { + "file": "assets/js/107669ab.f44b5cb6.js", + "hash": "48fe0981ada85f3b", + "publicPath": "/assets/js/107669ab.f44b5cb6.js" + } + ] + }, + "2237": { + "js": [ + { + "file": "assets/js/2237.be965d46.js", + "hash": "95d3ee7fd6ac38e9", + "publicPath": "/assets/js/2237.be965d46.js" + } + ] + }, + "2439": { + "js": [ + { + "file": "assets/js/d126de26.6561c01d.js", + "hash": "f961c538421ef8bd", + "publicPath": "/assets/js/d126de26.6561c01d.js" + } + ] + }, + "2516": { + "js": [ + { + "file": "assets/js/fdc83c8b.e95e7c72.js", + "hash": "05beeff1852117a0", + "publicPath": "/assets/js/fdc83c8b.e95e7c72.js" + } + ] + }, + "2526": { + "js": [ + { + "file": "assets/js/ea50f5f5.25d05aae.js", + "hash": "4273beba51318751", + "publicPath": "/assets/js/ea50f5f5.25d05aae.js" + } + ] + }, + "2634": { + "js": [ + { + "file": "assets/js/c4f5d8e4.af8bc74d.js", + "hash": "38d7700742467638", + "publicPath": "/assets/js/c4f5d8e4.af8bc74d.js" + } + ] + }, + "2711": { + "js": [ + { + "file": "assets/js/9e4087bc.59edf690.js", + "hash": "a0f858b8c2dbcb0b", + "publicPath": "/assets/js/9e4087bc.59edf690.js" + } + ] + }, + "2767": { + "js": [ + { + "file": "assets/js/29ba892c.45b425a1.js", + "hash": "60a53c2d49cc60cf", + "publicPath": "/assets/js/29ba892c.45b425a1.js" + } + ] + }, + "2885": { + "js": [ + { + "file": "assets/js/2fcac357.f2526d07.js", + "hash": "9160680e29a2fe98", + "publicPath": "/assets/js/2fcac357.f2526d07.js" + } + ] + }, + "2891": { + "js": [ + { + "file": "assets/js/06983a96.64bb3f34.js", + "hash": "cc2400ed8549500f", + "publicPath": "/assets/js/06983a96.64bb3f34.js" + } + ] + }, + "2941": { + "js": [ + { + "file": "assets/js/2859d2fb.b7b079cf.js", + "hash": "c4859748ecb514dd", + "publicPath": "/assets/js/2859d2fb.b7b079cf.js" + } + ] + }, + "2978": { + "js": [ + { + "file": "assets/js/a950bb08.7dd7756a.js", + "hash": "a539a07e43e51f4c", + "publicPath": "/assets/js/a950bb08.7dd7756a.js" + } + ] + }, + "2995": { + "js": [ + { + "file": "assets/js/a3821efb.66699296.js", + "hash": "67ccec42dbb99f6e", + "publicPath": "/assets/js/a3821efb.66699296.js" + } + ] + }, + "3053": { + "js": [ + { + "file": "assets/js/f7836a87.0e0f687b.js", + "hash": "499036aea97d7d18", + "publicPath": "/assets/js/f7836a87.0e0f687b.js" + } + ] + }, + "3215": { + "js": [ + { + "file": "assets/js/9b4df08c.2ee68b93.js", + "hash": "f148195248399b1d", + "publicPath": "/assets/js/9b4df08c.2ee68b93.js" + } + ] + }, + "3249": { + "js": [ + { + "file": "assets/js/ccc49370.9149b5a4.js", + "hash": "2219819bca857f79", + "publicPath": "/assets/js/ccc49370.9149b5a4.js" + } + ] + }, + "3365": { + "js": [ + { + "file": "assets/js/ae7197e3.0752e912.js", + "hash": "75c9f65e9a4f94bd", + "publicPath": "/assets/js/ae7197e3.0752e912.js" + } + ] + }, + "3717": { + "js": [ + { + "file": "assets/js/30dc2be3.63f16889.js", + "hash": "355a934fcaa236e4", + "publicPath": "/assets/js/30dc2be3.63f16889.js" + } + ] + }, + "3780": { + "js": [ + { + "file": "assets/js/38236c5e.89df4baf.js", + "hash": "422fd7620091766b", + "publicPath": "/assets/js/38236c5e.89df4baf.js" + } + ] + }, + "3805": { + "js": [ + { + "file": "assets/js/569b9636.d0a44d1b.js", + "hash": "74396d4ff2f0cacd", + "publicPath": "/assets/js/569b9636.d0a44d1b.js" + } + ] + }, + "3834": { + "js": [ + { + "file": "assets/js/3834.d9ccb168.js", + "hash": "ba864be12912a2dd", + "publicPath": "/assets/js/3834.d9ccb168.js" + } + ] + }, + "3934": { + "js": [ + { + "file": "assets/js/1174a4a6.952832c1.js", + "hash": "fbef283df68ec4eb", + "publicPath": "/assets/js/1174a4a6.952832c1.js" + } + ] + }, + "4196": { + "js": [ + { + "file": "assets/js/a5dfed40.a6c5c98b.js", + "hash": "433d738ad5c1d969", + "publicPath": "/assets/js/a5dfed40.a6c5c98b.js" + } + ] + }, + "4284": { + "js": [ + { + "file": "assets/js/acecf23e.0e0d3ee9.js", + "hash": "b90d1904c01d468e", + "publicPath": "/assets/js/acecf23e.0e0d3ee9.js" + } + ] + }, + "4292": { + "js": [ + { + "file": "assets/js/4061d127.59241894.js", + "hash": "04ffaed83b4f4f16", + "publicPath": "/assets/js/4061d127.59241894.js" + } + ] + }, + "4434": { + "js": [ + { + "file": "assets/js/b50c085f.4327eff2.js", + "hash": "e0f50dc6fb62d6bc", + "publicPath": "/assets/js/b50c085f.4327eff2.js" + } + ] + }, + "4487": { + "js": [ + { + "file": "assets/js/a605574d.4eb228bb.js", + "hash": "7a1ef011c4fd182b", + "publicPath": "/assets/js/a605574d.4eb228bb.js" + } + ] + }, + "4538": { + "js": [ + { + "file": "assets/js/9805f35a.e06ac37e.js", + "hash": "aa2bacde6c05d4c3", + "publicPath": "/assets/js/9805f35a.e06ac37e.js" + } + ] + }, + "4624": { + "js": [ + { + "file": "assets/js/063090b1.288e2721.js", + "hash": "7fb8ee7477471bc6", + "publicPath": "/assets/js/063090b1.288e2721.js" + } + ] + }, + "4674": { + "js": [ + { + "file": "assets/js/7074118c.fde43517.js", + "hash": "e95002ab3b8f2cae", + "publicPath": "/assets/js/7074118c.fde43517.js" + } + ] + }, + "4700": { + "js": [ + { + "file": "assets/js/2c217be1.4a8642f5.js", + "hash": "c4bc7185d2682cc8", + "publicPath": "/assets/js/2c217be1.4a8642f5.js" + } + ] + }, + "5091": { + "js": [ + { + "file": "assets/js/814f3328.29c9ae20.js", + "hash": "4fc0d562df37e42d", + "publicPath": "/assets/js/814f3328.29c9ae20.js" + } + ] + }, + "5354": { + "js": [ + { + "file": "assets/js/runtime~main.8cd2d291.js", + "hash": "64061727c451ac26", + "publicPath": "/assets/js/runtime~main.8cd2d291.js" + } + ] + }, + "5491": { + "js": [ + { + "file": "assets/js/6533aa10.2ec72a61.js", + "hash": "17ad0b215c62c8cb", + "publicPath": "/assets/js/6533aa10.2ec72a61.js" + } + ] + }, + "5496": { + "js": [ + { + "file": "assets/js/8d7aab24.d707aca5.js", + "hash": "e6b0247e630e53a9", + "publicPath": "/assets/js/8d7aab24.d707aca5.js" + } + ] + }, + "5533": { + "js": [ + { + "file": "assets/js/ab946cbc.1916eb51.js", + "hash": "b53750448d145a48", + "publicPath": "/assets/js/ab946cbc.1916eb51.js" + } + ] + }, + "5742": { + "js": [ + { + "file": "assets/js/aba21aa0.1ad3e19a.js", + "hash": "cb7509cbaa5382b0", + "publicPath": "/assets/js/aba21aa0.1ad3e19a.js" + } + ] + }, + "5970": { + "js": [ + { + "file": "assets/js/c8b8756d.9cc0a977.js", + "hash": "cc9b6fcdb0c0f0db", + "publicPath": "/assets/js/c8b8756d.9cc0a977.js" + } + ] + }, + "6230": { + "js": [ + { + "file": "assets/js/a7776ad8.cf330829.js", + "hash": "12772998a972f52c", + "publicPath": "/assets/js/a7776ad8.cf330829.js" + } + ] + }, + "6284": { + "js": [ + { + "file": "assets/js/7777193d.ef00cbf7.js", + "hash": "cc9836e02cf73a7d", + "publicPath": "/assets/js/7777193d.ef00cbf7.js" + } + ] + }, + "6824": { + "js": [ + { + "file": "assets/js/94717405.3af1cfa9.js", + "hash": "7efcd5d71280bf56", + "publicPath": "/assets/js/94717405.3af1cfa9.js" + } + ] + }, + "6871": { + "js": [ + { + "file": "assets/js/8cf6d7a7.10b5258b.js", + "hash": "75c1913fc1941d6f", + "publicPath": "/assets/js/8cf6d7a7.10b5258b.js" + } + ] + }, + "7043": { + "js": [ + { + "file": "assets/js/c3d344d9.92c897fc.js", + "hash": "fc19dfb80fa54e99", + "publicPath": "/assets/js/c3d344d9.92c897fc.js" + } + ] + }, + "7084": { + "js": [ + { + "file": "assets/js/9994e0b3.349859dc.js", + "hash": "94e978f9084df277", + "publicPath": "/assets/js/9994e0b3.349859dc.js" + } + ] + }, + "7098": { + "js": [ + { + "file": "assets/js/a7bd4aaa.b940ea01.js", + "hash": "43a9a25beddb33f5", + "publicPath": "/assets/js/a7bd4aaa.b940ea01.js" + } + ] + }, + "7191": { + "js": [ + { + "file": "assets/js/70e8c784.75d52a62.js", + "hash": "c9ee0d3d8f7651ca", + "publicPath": "/assets/js/70e8c784.75d52a62.js" + } + ] + }, + "7257": { + "js": [ + { + "file": "assets/js/a74ce679.5c25c20b.js", + "hash": "fb926dc3f701fc37", + "publicPath": "/assets/js/a74ce679.5c25c20b.js" + } + ] + }, + "7381": { + "js": [ + { + "file": "assets/js/bbb97d2b.7b5cadc5.js", + "hash": "34e9a8cc7de2c443", + "publicPath": "/assets/js/bbb97d2b.7b5cadc5.js" + } + ] + }, + "7472": { + "js": [ + { + "file": "assets/js/14c2ce36.f7eddbf1.js", + "hash": "c470044add966612", + "publicPath": "/assets/js/14c2ce36.f7eddbf1.js" + } + ] + }, + "7643": { + "js": [ + { + "file": "assets/js/a6aa9e1f.66477f6d.js", + "hash": "3b30427e8dda7b9c", + "publicPath": "/assets/js/a6aa9e1f.66477f6d.js" + } + ] + }, + "7765": { + "js": [ + { + "file": "assets/js/49fb2c28.1c1b9522.js", + "hash": "31a1b4c95b3485d3", + "publicPath": "/assets/js/49fb2c28.1c1b9522.js" + } + ] + }, + "7938": { + "js": [ + { + "file": "assets/js/affdd1e0.cf591274.js", + "hash": "9d9ade64884b792c", + "publicPath": "/assets/js/affdd1e0.cf591274.js" + } + ] + }, + "7963": { + "js": [ + { + "file": "assets/js/e13eafd3.b5e529e3.js", + "hash": "5288a6bfaeda1168", + "publicPath": "/assets/js/e13eafd3.b5e529e3.js" + } + ] + }, + "8130": { + "js": [ + { + "file": "assets/js/f81c1134.f506d7d6.js", + "hash": "d374a95117d15a67", + "publicPath": "/assets/js/f81c1134.f506d7d6.js" + } + ] + }, + "8140": { + "js": [ + { + "file": "assets/js/1b3a196b.557d332c.js", + "hash": "454eae366555089c", + "publicPath": "/assets/js/1b3a196b.557d332c.js" + } + ] + }, + "8146": { + "js": [ + { + "file": "assets/js/c15d9823.1bfda436.js", + "hash": "86044dff31b76ff0", + "publicPath": "/assets/js/c15d9823.1bfda436.js" + } + ] + }, + "8183": { + "js": [ + { + "file": "assets/js/c6bc127f.1e31d41b.js", + "hash": "724362bc108c776f", + "publicPath": "/assets/js/c6bc127f.1e31d41b.js" + } + ] + }, + "8184": { + "js": [ + { + "file": "assets/js/65ee69ef.ff80038c.js", + "hash": "c5ea3b9fd6f8bbef", + "publicPath": "/assets/js/65ee69ef.ff80038c.js" + } + ] + }, + "8401": { + "js": [ + { + "file": "assets/js/17896441.be2148b0.js", + "hash": "e8cc81e2b15c3f3f", + "publicPath": "/assets/js/17896441.be2148b0.js" + } + ] + }, + "8554": { + "js": [ + { + "file": "assets/js/8554.5845e862.js", + "hash": "7237dea11ab7fae8", + "publicPath": "/assets/js/8554.5845e862.js" + } + ] + }, + "8792": { + "js": [ + { + "file": "assets/js/main.6530b181.js", + "hash": "73db298b7cf2fd4c", + "publicPath": "/assets/js/main.6530b181.js" + } + ] + }, + "9044": { + "js": [ + { + "file": "assets/js/937cdc77.685ed5fa.js", + "hash": "dfcd67bf585d5e5f", + "publicPath": "/assets/js/937cdc77.685ed5fa.js" + } + ] + }, + "9048": { + "js": [ + { + "file": "assets/js/a94703ab.d79ecc22.js", + "hash": "20775bafff65b979", + "publicPath": "/assets/js/a94703ab.d79ecc22.js" + } + ] + }, + "9145": { + "js": [ + { + "file": "assets/js/e85952ae.8483bccd.js", + "hash": "bb82de21cf802a5b", + "publicPath": "/assets/js/e85952ae.8483bccd.js" + } + ] + }, + "9315": { + "js": [ + { + "file": "assets/js/07f9788a.452e6f40.js", + "hash": "598f0beab56a2e55", + "publicPath": "/assets/js/07f9788a.452e6f40.js" + } + ] + }, + "9419": { + "js": [ + { + "file": "assets/js/8ad00878.27a2486f.js", + "hash": "7e8bb81fd9dd9b24", + "publicPath": "/assets/js/8ad00878.27a2486f.js" + } + ] + }, + "9460": { + "js": [ + { + "file": "assets/js/56a9bc23.2d1645ba.js", + "hash": "447c49b244d79c86", + "publicPath": "/assets/js/56a9bc23.2d1645ba.js" + } + ] + }, + "9595": { + "js": [ + { + "file": "assets/js/82bececd.1c5cd812.js", + "hash": "c53a0b15bcae88d0", + "publicPath": "/assets/js/82bececd.1c5cd812.js" + } + ] + }, + "9647": { + "js": [ + { + "file": "assets/js/5e95c892.4ef812a6.js", + "hash": "9f696907e373efaa", + "publicPath": "/assets/js/5e95c892.4ef812a6.js" + } + ] + }, + "9800": { + "js": [ + { + "file": "assets/js/87292243.de647f30.js", + "hash": "b5adc47cd2598d8b", + "publicPath": "/assets/js/87292243.de647f30.js" + } + ] + }, + "9858": { + "js": [ + { + "file": "assets/js/36994c47.411c604c.js", + "hash": "42753b8ae2793469", + "publicPath": "/assets/js/36994c47.411c604c.js" + } + ] + }, + "9974": { + "js": [ + { + "file": "assets/js/2571fc76.ca7462da.js", + "hash": "3de54d33c5117841", + "publicPath": "/assets/js/2571fc76.ca7462da.js" + } + ] + } + } +} \ No newline at end of file diff --git a/.docusaurus/docusaurus-plugin-content-docs/default/p/docs-175.json b/.docusaurus/docusaurus-plugin-content-docs/default/p/docs-175.json index c8f24bf..4d02522 100644 --- a/.docusaurus/docusaurus-plugin-content-docs/default/p/docs-175.json +++ b/.docusaurus/docusaurus-plugin-content-docs/default/p/docs-175.json @@ -1 +1 @@ -{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"category","label":"序言","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"PikiwiDB(Pika) 简介","href":"/docs/序言/简介/","docId":"序言/简介/index","unlisted":false},{"type":"link","label":"支持的 Redis 接口与兼容情况","href":"/docs/序言/支持的 Redis 接口与兼容情况/","docId":"序言/支持的 Redis 接口与兼容情况/index","unlisted":false},{"type":"link","label":"FAQ","href":"/docs/序言/FAQ/","docId":"序言/FAQ/index","unlisted":false}],"href":"/docs/序言/"},{"type":"category","label":"使用与运维","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"配置文件说明","href":"/docs/使用与运维/配置文件说明/","docId":"使用与运维/配置文件说明/index","unlisted":false},{"type":"link","label":"page info 信息说明","href":"/docs/使用与运维/page info 信息说明/","docId":"使用与运维/page info 信息说明/index","unlisted":false},{"type":"link","label":"数据目录","href":"/docs/使用与运维/数据目录/","docId":"使用与运维/数据目录/index","unlisted":false},{"type":"link","label":"管理指令","href":"/docs/使用与运维/管理指令/","docId":"使用与运维/管理指令/index","unlisted":false},{"type":"link","label":"差异化命令","href":"/docs/使用与运维/差异化命令/","docId":"使用与运维/差异化命令/index","unlisted":false},{"type":"link","label":"订阅","href":"/docs/使用与运维/订阅/","docId":"使用与运维/订阅/index","unlisted":false},{"type":"link","label":"分布式模式简单教程","href":"/docs/使用与运维/分布式模式简单教程/","docId":"使用与运维/分布式模式简单教程/index","unlisted":false},{"type":"link","label":"自动容灾","href":"/docs/使用与运维/自动容灾/","docId":"使用与运维/自动容灾/index","unlisted":false},{"type":"link","label":"多库版命令","href":"/docs/使用与运维/多库版命令/","docId":"使用与运维/多库版命令/index","unlisted":false},{"type":"link","label":"服务器状态监控","href":"/docs/使用与运维/服务器状态监控/","docId":"使用与运维/服务器状态监控/index","unlisted":false},{"type":"link","label":"分片教程(3.1.2 ‐ 3.3.6)","href":"/docs/使用与运维/分片教程/","docId":"使用与运维/分片教程/index","unlisted":false},{"type":"link","label":"副本一致性(使用文档)","href":"/docs/使用与运维/副本一致性(使用文档)/","docId":"使用与运维/副本一致性(使用文档)/index","unlisted":false},{"type":"link","label":"安装使用","href":"/docs/使用与运维/安装使用/","docId":"使用与运维/安装使用/index","unlisted":false},{"type":"link","label":"副本一致性(设计文档)","href":"/docs/使用与运维/副本一致性(设计文档)/","docId":"使用与运维/副本一致性(设计文档)/index","unlisted":false},{"type":"link","label":"Pika 最佳实践","href":"/docs/使用与运维/Pika 最佳实践/","docId":"使用与运维/Pika 最佳实践/index","unlisted":false},{"type":"category","label":"升级指南","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"如何升级到 Pika 3.0","href":"/docs/使用与运维/升级指南/如何升级到 Pika 3.0/","docId":"使用与运维/升级指南/如何升级到 Pika 3.0/index","unlisted":false},{"type":"link","label":"如何升级到 Pika 3.1 或 3.2","href":"/docs/使用与运维/升级指南/如何升级到 Pika 3.1 或 3.2/","docId":"使用与运维/升级指南/如何升级到 Pika 3.1 或 3.2/index","unlisted":false},{"type":"link","label":"如何将 Pika 3.3.6 升级到 Pika 3.5","href":"/docs/使用与运维/升级指南/如何将 Pika 3.3.6 升级到 Pika 3.5/","docId":"使用与运维/升级指南/如何将 Pika 3.3.6 升级到 Pika 3.5/index","unlisted":false}],"href":"/docs/使用与运维/升级指南/"}],"href":"/docs/使用与运维/"},{"type":"category","label":"性能与优化","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"3.2.x 性能","href":"/docs/性能与优化/3.2.x 性能/","docId":"性能与优化/3.2.x 性能/index","unlisted":false},{"type":"link","label":"Pika 内存使用","href":"/docs/性能与优化/Pika 内存使用/","docId":"性能与优化/Pika 内存使用/index","unlisted":false},{"type":"link","label":"Redis 与 Pika scan 性能对比","href":"/docs/性能与优化/Redis 与 Pika scan 性能对比/","docId":"性能与优化/Redis 与 Pika scan 性能对比/index","unlisted":false},{"type":"link","label":"Pika 3.5 参数优化手册","href":"/docs/性能与优化/Pika 3.5 参数优化手册/","docId":"性能与优化/Pika 3.5 参数优化手册/index","unlisted":false},{"type":"category","label":"Pika 优化案例","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"喜马拉雅 Redis 与 Pika 缓存使用军规","href":"/docs/性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/","docId":"性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/index","unlisted":false},{"type":"link","label":"调整 max-write-buffer-size 优化 pika 性能10倍的案例","href":"/docs/性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/","docId":"性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/index","unlisted":false}],"href":"/docs/性能与优化/Pika 优化案例/"}],"href":"/docs/性能与优化/"},{"type":"category","label":"设计与实现","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"整体技术架构","href":"/docs/设计与实现/整体技术架构/","docId":"设计与实现/整体技术架构/index","unlisted":false},{"type":"link","label":"线程模型","href":"/docs/设计与实现/线程模型/","docId":"设计与实现/线程模型/index","unlisted":false},{"type":"link","label":"锁的应用","href":"/docs/设计与实现/锁的应用/","docId":"设计与实现/锁的应用/index","unlisted":false},{"type":"link","label":"全同步","href":"/docs/设计与实现/全同步/","docId":"设计与实现/全同步/index","unlisted":false},{"type":"link","label":"增量同步","href":"/docs/设计与实现/增量同步/","docId":"设计与实现/增量同步/index","unlisted":false},{"type":"link","label":"主从同步","href":"/docs/设计与实现/主从同步/","docId":"设计与实现/主从同步/index","unlisted":false},{"type":"link","label":"副本一致性","href":"/docs/设计与实现/副本一致性/","docId":"设计与实现/副本一致性/index","unlisted":false},{"type":"link","label":"Pika 与 Codis","href":"/docs/设计与实现/Pika 与 Codis/","docId":"设计与实现/Pika 与 Codis/index","unlisted":false},{"type":"link","label":"快照式备份","href":"/docs/设计与实现/快照式备份/","docId":"设计与实现/快照式备份/index","unlisted":false},{"type":"link","label":"NoSQL 原理概述","href":"/docs/设计与实现/NoSQL 原理概述/","docId":"设计与实现/NoSQL 原理概述/index","unlisted":false},{"type":"link","label":"旧存储结构","href":"/docs/设计与实现/旧存储结构/","docId":"设计与实现/旧存储结构/index","unlisted":false},{"type":"link","label":"新存储结构","href":"/docs/设计与实现/新存储结构/","docId":"设计与实现/新存储结构/index","unlisted":false},{"type":"link","label":"新存储结构:详细解析","href":"/docs/设计与实现/新存储方案:详细解析/","docId":"设计与实现/新存储方案:详细解析/index","unlisted":false},{"type":"category","label":"Pika 源码学习笔记","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"通信和线程模型","href":"/docs/设计与实现/Pika 源码学习笔记/通信和线程模型/","docId":"设计与实现/Pika 源码学习笔记/通信和线程模型/index","unlisted":false},{"type":"link","label":"Pubsub 机制","href":"/docs/设计与实现/Pika 源码学习笔记/PubSub 机制/","docId":"设计与实现/Pika 源码学习笔记/PubSub 机制/index","unlisted":false},{"type":"link","label":"Pika 的命令执行框架","href":"/docs/设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/","docId":"设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/index","unlisted":false},{"type":"link","label":"Pika 和 RockSDB 的对接","href":"/docs/设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/","docId":"设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/index","unlisted":false}],"href":"/docs/设计与实现/Pika 源码学习笔记/"},{"type":"category","label":"Pika 传火计划","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Pika 线程模型简介","href":"/docs/设计与实现/Pika 传火计划/线程模型/","docId":"设计与实现/Pika 传火计划/线程模型/index","unlisted":false},{"type":"link","label":"Pika 读写流程简介","href":"/docs/设计与实现/Pika 传火计划/读写流程/","docId":"设计与实现/Pika 传火计划/读写流程/index","unlisted":false},{"type":"link","label":"Pika 主从同比","href":"/docs/设计与实现/Pika 传火计划/主从同步/","docId":"设计与实现/Pika 传火计划/主从同步/index","unlisted":false}],"href":"/docs/设计与实现/Pika 传火计划/"}],"href":"/docs/设计与实现/"},{"type":"category","label":"编码规范","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"编码规范","href":"/docs/开发文档/编码规范/","docId":"开发文档/编码规范/index","unlisted":false},{"type":"link","label":"c++ coding style","href":"/docs/开发文档/coding-style/","docId":"开发文档/coding-style/index","unlisted":false}],"href":"/docs/开发文档/"}]},"docs":{"使用与运维/index":{"id":"使用与运维/index","title":"使用与运维","description":"","sidebar":"tutorialSidebar"},"使用与运维/page info 信息说明/index":{"id":"使用与运维/page info 信息说明/index","title":"page info 信息说明","description":"执行INFO命令","sidebar":"tutorialSidebar"},"使用与运维/Pika 最佳实践/index":{"id":"使用与运维/Pika 最佳实践/index","title":"Pika 最佳实践","description":"我们根据360内部的pika使用经验及社区用户的问题反馈,整理了如下文档并会不断更新","sidebar":"tutorialSidebar"},"使用与运维/分布式模式简单教程/index":{"id":"使用与运维/分布式模式简单教程/index","title":"分布式模式简单教程","description":"关于sharding mode,pika底层提供slot 的概念。Pika将key进行哈希取模之后散列到各个slot当中处理。sharding mode 根据线上的具体情况可以应用于单个pika,也可以应用到多个pika组成的pika cluster。这个tutorial主要介绍开启sharding mode 需要了解的一些概念,以及需要调整的一些配置参数。","sidebar":"tutorialSidebar"},"使用与运维/分片教程/index":{"id":"使用与运维/分片教程/index","title":"分片教程(3.1.2 ‐ 3.3.6)","description":"Pika自版本3.1.2起开始对分片做了一系列支持,为此我们为分片模式添加了一系列的命令.","sidebar":"tutorialSidebar"},"使用与运维/副本一致性(使用文档)/index":{"id":"使用与运维/副本一致性(使用文档)/index","title":"副本一致性(使用文档)","description":"简介","sidebar":"tutorialSidebar"},"使用与运维/副本一致性(设计文档)/index":{"id":"使用与运维/副本一致性(设计文档)/index","title":"副本一致性(设计文档)","description":"目前线程模型","sidebar":"tutorialSidebar"},"使用与运维/升级指南/index":{"id":"使用与运维/升级指南/index","title":"升级指南","description":"","sidebar":"tutorialSidebar"},"使用与运维/升级指南/如何升级到 Pika 3.0/index":{"id":"使用与运维/升级指南/如何升级到 Pika 3.0/index","title":"如何升级到 Pika 3.0","description":"升级准备工作:","sidebar":"tutorialSidebar"},"使用与运维/升级指南/如何升级到 Pika 3.1 或 3.2/index":{"id":"使用与运维/升级指南/如何升级到 Pika 3.1 或 3.2/index","title":"如何升级到 Pika 3.1 或 3.2","description":"manifest生成工具","sidebar":"tutorialSidebar"},"使用与运维/升级指南/如何将 Pika 3.3.6 升级到 Pika 3.5/index":{"id":"使用与运维/升级指南/如何将 Pika 3.3.6 升级到 Pika 3.5/index","title":"如何将 Pika 3.3.6 升级到 Pika 3.5","description":"Q:如何从 3.3.6 迁移数据到 3.5?","sidebar":"tutorialSidebar"},"使用与运维/多库版命令/index":{"id":"使用与运维/多库版命令/index","title":"多库版命令","description":"Pika自版本3.1.0起开始支持多db,为了兼容多db部分命令、配置参数发生了变化,具体变化如下:","sidebar":"tutorialSidebar"},"使用与运维/安装使用/index":{"id":"使用与运维/安装使用/index","title":"安装使用","description":"快速试用","sidebar":"tutorialSidebar"},"使用与运维/差异化命令/index":{"id":"使用与运维/差异化命令/index","title":"差异化命令","description":"config [get | set | rewrite]","sidebar":"tutorialSidebar"},"使用与运维/数据目录/index":{"id":"使用与运维/数据目录/index","title":"数据目录","description":"db目录","sidebar":"tutorialSidebar"},"使用与运维/服务器状态监控/index":{"id":"使用与运维/服务器状态监控/index","title":"服务器状态监控","description":"在pika的使用中,也为用户提供了丰富的info展示,用于监控服务器的运行状态。","sidebar":"tutorialSidebar"},"使用与运维/管理指令/index":{"id":"使用与运维/管理指令/index","title":"管理指令","description":"client kill all","sidebar":"tutorialSidebar"},"使用与运维/自动容灾/index":{"id":"使用与运维/自动容灾/index","title":"自动容灾","description":"pika能够配合Redis-sentinel(哨兵)实现自动容灾切主, 使用方式与redis完全一致","sidebar":"tutorialSidebar"},"使用与运维/订阅/index":{"id":"使用与运维/订阅/index","title":"订阅","description":"可用版本: >= 2.3.0","sidebar":"tutorialSidebar"},"使用与运维/配置文件说明/index":{"id":"使用与运维/配置文件说明/index","title":"配置文件说明","description":"","sidebar":"tutorialSidebar"},"序言/FAQ/index":{"id":"序言/FAQ/index","title":"FAQ","description":"1 编译安装","sidebar":"tutorialSidebar"},"序言/index":{"id":"序言/index","title":"序言","description":"欢迎来到 PikiwiDB(Pika) 的世界。接下来的篇章旨在于帮助你建立对 PikiwiDB 数据库的基本了解,你将会阅读到:","sidebar":"tutorialSidebar"},"序言/支持的 Redis 接口与兼容情况/index":{"id":"序言/支持的 Redis 接口与兼容情况/index","title":"支持的 Redis 接口与兼容情况","description":"pika支持redis五种类型(分别为string、hash、list、set、zset)的接口,先列出其对redis的五种数据结构兼容统计。","sidebar":"tutorialSidebar"},"序言/简介/index":{"id":"序言/简介/index","title":"PikiwiDB(Pika) 简介","description":"PikiwiDB(Pika)-Logo-Logo.png)","sidebar":"tutorialSidebar"},"开发文档/coding-style/index":{"id":"开发文档/coding-style/index","title":"c++ coding style","description":"header file","sidebar":"tutorialSidebar"},"开发文档/index":{"id":"开发文档/index","title":"编码规范","description":"","sidebar":"tutorialSidebar"},"开发文档/编码规范/index":{"id":"开发文档/编码规范/index","title":"编码规范","description":"c++ coding style","sidebar":"tutorialSidebar"},"性能与优化/3.2.x 性能/index":{"id":"性能与优化/3.2.x 性能/index","title":"3.2.x 性能","description":"Performance:","sidebar":"tutorialSidebar"},"性能与优化/index":{"id":"性能与优化/index","title":"性能与优化","description":"","sidebar":"tutorialSidebar"},"性能与优化/Pika 3.5 参数优化手册/index":{"id":"性能与优化/Pika 3.5 参数优化手册/index","title":"Pika 3.5 参数优化手册","description":"1970","sidebar":"tutorialSidebar"},"性能与优化/Pika 优化案例/index":{"id":"性能与优化/Pika 优化案例/index","title":"Pika 优化案例","description":"","sidebar":"tutorialSidebar"},"性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/index":{"id":"性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/index","title":"喜马拉雅 Redis 与 Pika 缓存使用军规","description":"宣言:缓存不是万金油,更不是垃圾桶!!!","sidebar":"tutorialSidebar"},"性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/index":{"id":"性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/index","title":"调整 max-write-buffer-size 优化 pika 性能10倍的案例","description":"现居珠海,先后担任专职 Oracle 和 MySQL DBA,现在主要负责 MySQL、mongoDB 和 Redis 维护工作。","sidebar":"tutorialSidebar"},"性能与优化/Pika 内存使用/index":{"id":"性能与优化/Pika 内存使用/index","title":"Pika 内存使用","description":"Pika内存占用","sidebar":"tutorialSidebar"},"性能与优化/Redis 与 Pika scan 性能对比/index":{"id":"性能与优化/Redis 与 Pika scan 性能对比/index","title":"Redis 与 Pika scan 性能对比","description":"Redis 是后端常用的键值数据库。Pika 是 360 出品的一款与 Redis 协议几乎兼容的数据库。与 Redis 不同的是,Pika 基于硬盘,使用 RocksDB 作为引擎,从容量上来说,比基于内存的 Redis 大了不少,而且在性能上也能满足一般需求。","sidebar":"tutorialSidebar"},"设计与实现/index":{"id":"设计与实现/index","title":"设计与实现","description":"","sidebar":"tutorialSidebar"},"设计与实现/NoSQL 原理概述/index":{"id":"设计与实现/NoSQL 原理概述/index","title":"NoSQL 原理概述","description":"pika 设计","sidebar":"tutorialSidebar"},"设计与实现/Pika 与 Codis/index":{"id":"设计与实现/Pika 与 Codis/index","title":"Pika 与 Codis","description":"背景","sidebar":"tutorialSidebar"},"设计与实现/Pika 传火计划/index":{"id":"设计与实现/Pika 传火计划/index","title":"Pika 传火计划","description":"为方便刚接触Pika的同学能够更快的上手提交第一个Pika PR。基于v3.3.4代码,从代码层面对Pika进行了全方面的梳理。这个想法叫传火计划,希望Pika星星之火可以燎原。","sidebar":"tutorialSidebar"},"设计与实现/Pika 传火计划/主从同步/index":{"id":"设计与实现/Pika 传火计划/主从同步/index","title":"Pika 主从同比","description":"alt text","sidebar":"tutorialSidebar"},"设计与实现/Pika 传火计划/线程模型/index":{"id":"设计与实现/Pika 传火计划/线程模型/index","title":"Pika 线程模型简介","description":"alt text","sidebar":"tutorialSidebar"},"设计与实现/Pika 传火计划/读写流程/index":{"id":"设计与实现/Pika 传火计划/读写流程/index","title":"Pika 读写流程简介","description":"alt text","sidebar":"tutorialSidebar"},"设计与实现/Pika 源码学习笔记/index":{"id":"设计与实现/Pika 源码学习笔记/index","title":"Pika 源码学习笔记","description":"","sidebar":"tutorialSidebar"},"设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/index":{"id":"设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/index","title":"Pika 和 RockSDB 的对接","description":"在《Pika源码学习--pika的命令执行框架》中我们了解了一个命令的执行流程,也知道了pika使用的是Blackwidow引擎,现在我们来看看pika是怎么和rocksdb对接的,Blackwidow具体怎么处理命令。","sidebar":"tutorialSidebar"},"设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/index":{"id":"设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/index","title":"Pika 的命令执行框架","description":"今天我们一起来看下pika收到一个命令后,是怎么处理这个命令的。","sidebar":"tutorialSidebar"},"设计与实现/Pika 源码学习笔记/PubSub 机制/index":{"id":"设计与实现/Pika 源码学习笔记/PubSub 机制/index","title":"Pubsub 机制","description":"前一篇《Pika源码学习--pika的通信和线程模型》里说到WorkerThread里面有两种处理命令的方式,一种是同步,一种是异步。那什么时候是同步处理,什么时候是异步处理呢?其实","sidebar":"tutorialSidebar"},"设计与实现/Pika 源码学习笔记/通信和线程模型/index":{"id":"设计与实现/Pika 源码学习笔记/通信和线程模型/index","title":"通信和线程模型","description":"pika的线程模型有官方的wiki介绍,这里主要介绍了pika都有哪些线程,这些线程用来干嘛。本篇文章主要涉及监听线程DispatchThread、IO工作线程WorkerThread和工作线程池ThreadPool,结合代码介绍里面实现的一些细节。","sidebar":"tutorialSidebar"},"设计与实现/主从同步/index":{"id":"设计与实现/主从同步/index","title":"主从同步","description":"pika主从同步","sidebar":"tutorialSidebar"},"设计与实现/全同步/index":{"id":"设计与实现/全同步/index","title":"全同步","description":"背景","sidebar":"tutorialSidebar"},"设计与实现/副本一致性/index":{"id":"设计与实现/副本一致性/index","title":"副本一致性","description":"目前线程模型","sidebar":"tutorialSidebar"},"设计与实现/增量同步/index":{"id":"设计与实现/增量同步/index","title":"增量同步","description":"背景","sidebar":"tutorialSidebar"},"设计与实现/快照式备份/index":{"id":"设计与实现/快照式备份/index","title":"快照式备份","description":"原理","sidebar":"tutorialSidebar"},"设计与实现/整体技术架构/index":{"id":"设计与实现/整体技术架构/index","title":"整体技术架构","description":"概述","sidebar":"tutorialSidebar"},"设计与实现/新存储方案:详细解析/index":{"id":"设计与实现/新存储方案:详细解析/index","title":"新存储结构:详细解析","description":"整体架构","sidebar":"tutorialSidebar"},"设计与实现/新存储结构/index":{"id":"设计与实现/新存储结构/index","title":"新存储结构","description":"整体架构","sidebar":"tutorialSidebar"},"设计与实现/旧存储结构/index":{"id":"设计与实现/旧存储结构/index","title":"旧存储结构","description":"Blackwidow 本质上是基于 rocksdb 的封装,使本身只支持 kv 存储的 rocksdb 能够支持多种数据结构, 目前 Blackwidow 支持五种数据结构的存储:String 结构(实际上就是存储 key, value), Hash 结构,List 结构,Set 结构和 ZSet 结构, 因为 Rocksdb 的存储方式只有 kv 一种, 所以上述五种数据结构最终都要落盘到 Rocksdb 的 kv 存储方式上,下面我们展示 Blackwidow 和 rocksdb 的关系并且说明我们是如何用 kv 来模拟多数据结构的。","sidebar":"tutorialSidebar"},"设计与实现/线程模型/index":{"id":"设计与实现/线程模型/index","title":"线程模型","description":"pika使用的是多线程模型,使用多个工作线程来进行读写操作,由底层blackwidow引擎来保证线程安全,线程分为12种:","sidebar":"tutorialSidebar"},"设计与实现/锁的应用/index":{"id":"设计与实现/锁的应用/index","title":"锁的应用","description":"pika作为类redis的存储系统,为了弥补在性能上的不足,在整个系统中大量使用多线程的结构,涉及到多线程编程,势必需要为线程加锁来保证数据访问的一致性和有效性。其中主要用到了三种锁","sidebar":"tutorialSidebar"}}}} \ No newline at end of file +{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"category","label":"序言","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"PikiwiDB(Pika) 简介","href":"/docs/序言/简介/","docId":"序言/简介/index","unlisted":false},{"type":"link","label":"支持的 Redis 接口与兼容情况","href":"/docs/序言/支持的 Redis 接口与兼容情况/","docId":"序言/支持的 Redis 接口与兼容情况/index","unlisted":false},{"type":"link","label":"FAQ","href":"/docs/序言/FAQ/","docId":"序言/FAQ/index","unlisted":false}],"href":"/docs/序言/"},{"type":"category","label":"使用与运维","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"配置文件说明","href":"/docs/使用与运维/配置文件说明/","docId":"使用与运维/配置文件说明/index","unlisted":false},{"type":"link","label":"page info 信息说明","href":"/docs/使用与运维/page info 信息说明/","docId":"使用与运维/page info 信息说明/index","unlisted":false},{"type":"link","label":"数据目录","href":"/docs/使用与运维/数据目录/","docId":"使用与运维/数据目录/index","unlisted":false},{"type":"link","label":"管理指令","href":"/docs/使用与运维/管理指令/","docId":"使用与运维/管理指令/index","unlisted":false},{"type":"link","label":"差异化命令","href":"/docs/使用与运维/差异化命令/","docId":"使用与运维/差异化命令/index","unlisted":false},{"type":"link","label":"订阅","href":"/docs/使用与运维/订阅/","docId":"使用与运维/订阅/index","unlisted":false},{"type":"link","label":"分布式模式简单教程","href":"/docs/使用与运维/分布式模式简单教程/","docId":"使用与运维/分布式模式简单教程/index","unlisted":false},{"type":"link","label":"自动容灾","href":"/docs/使用与运维/自动容灾/","docId":"使用与运维/自动容灾/index","unlisted":false},{"type":"link","label":"多库版命令","href":"/docs/使用与运维/多库版命令/","docId":"使用与运维/多库版命令/index","unlisted":false},{"type":"link","label":"服务器状态监控","href":"/docs/使用与运维/服务器状态监控/","docId":"使用与运维/服务器状态监控/index","unlisted":false},{"type":"link","label":"分片教程(3.1.2 ‐ 3.3.6)","href":"/docs/使用与运维/分片教程/","docId":"使用与运维/分片教程/index","unlisted":false},{"type":"link","label":"副本一致性(使用文档)","href":"/docs/使用与运维/副本一致性(使用文档)/","docId":"使用与运维/副本一致性(使用文档)/index","unlisted":false},{"type":"link","label":"安装使用","href":"/docs/使用与运维/安装使用/","docId":"使用与运维/安装使用/index","unlisted":false},{"type":"link","label":"副本一致性(设计文档)","href":"/docs/使用与运维/副本一致性(设计文档)/","docId":"使用与运维/副本一致性(设计文档)/index","unlisted":false},{"type":"link","label":"Pika 最佳实践","href":"/docs/使用与运维/Pika 最佳实践/","docId":"使用与运维/Pika 最佳实践/index","unlisted":false}],"href":"/docs/使用与运维/"},{"type":"category","label":"性能与优化","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"3.2.x 性能","href":"/docs/性能与优化/3.2.x 性能/","docId":"性能与优化/3.2.x 性能/index","unlisted":false},{"type":"link","label":"Pika 内存使用","href":"/docs/性能与优化/Pika 内存使用/","docId":"性能与优化/Pika 内存使用/index","unlisted":false},{"type":"link","label":"Redis 与 Pika scan 性能对比","href":"/docs/性能与优化/Redis 与 Pika scan 性能对比/","docId":"性能与优化/Redis 与 Pika scan 性能对比/index","unlisted":false},{"type":"link","label":"Pika 3.5 参数优化手册","href":"/docs/性能与优化/Pika 3.5 参数优化手册/","docId":"性能与优化/Pika 3.5 参数优化手册/index","unlisted":false},{"type":"category","label":"Pika 优化案例","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"喜马拉雅 Redis 与 Pika 缓存使用军规","href":"/docs/性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/","docId":"性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/index","unlisted":false},{"type":"link","label":"调整 max-write-buffer-size 优化 pika 性能10倍的案例","href":"/docs/性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/","docId":"性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/index","unlisted":false}],"href":"/docs/性能与优化/Pika 优化案例/"}],"href":"/docs/性能与优化/"},{"type":"category","label":"设计与实现","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"整体技术架构","href":"/docs/设计与实现/整体技术架构/","docId":"设计与实现/整体技术架构/index","unlisted":false},{"type":"link","label":"线程模型","href":"/docs/设计与实现/线程模型/","docId":"设计与实现/线程模型/index","unlisted":false},{"type":"link","label":"锁的应用","href":"/docs/设计与实现/锁的应用/","docId":"设计与实现/锁的应用/index","unlisted":false},{"type":"link","label":"全同步","href":"/docs/设计与实现/全同步/","docId":"设计与实现/全同步/index","unlisted":false},{"type":"link","label":"增量同步","href":"/docs/设计与实现/增量同步/","docId":"设计与实现/增量同步/index","unlisted":false},{"type":"link","label":"主从同步","href":"/docs/设计与实现/主从同步/","docId":"设计与实现/主从同步/index","unlisted":false},{"type":"link","label":"副本一致性","href":"/docs/设计与实现/副本一致性/","docId":"设计与实现/副本一致性/index","unlisted":false},{"type":"link","label":"Pika 与 Codis","href":"/docs/设计与实现/Pika 与 Codis/","docId":"设计与实现/Pika 与 Codis/index","unlisted":false},{"type":"link","label":"快照式备份","href":"/docs/设计与实现/快照式备份/","docId":"设计与实现/快照式备份/index","unlisted":false},{"type":"link","label":"NoSQL 原理概述","href":"/docs/设计与实现/NoSQL 原理概述/","docId":"设计与实现/NoSQL 原理概述/index","unlisted":false},{"type":"link","label":"旧存储结构","href":"/docs/设计与实现/旧存储结构/","docId":"设计与实现/旧存储结构/index","unlisted":false},{"type":"link","label":"新存储结构","href":"/docs/设计与实现/新存储结构/","docId":"设计与实现/新存储结构/index","unlisted":false},{"type":"link","label":"新存储结构:详细解析","href":"/docs/设计与实现/新存储方案:详细解析/","docId":"设计与实现/新存储方案:详细解析/index","unlisted":false},{"type":"category","label":"Pika 源码学习笔记","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"通信和线程模型","href":"/docs/设计与实现/Pika 源码学习笔记/通信和线程模型/","docId":"设计与实现/Pika 源码学习笔记/通信和线程模型/index","unlisted":false},{"type":"link","label":"Pubsub 机制","href":"/docs/设计与实现/Pika 源码学习笔记/PubSub 机制/","docId":"设计与实现/Pika 源码学习笔记/PubSub 机制/index","unlisted":false},{"type":"link","label":"Pika 的命令执行框架","href":"/docs/设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/","docId":"设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/index","unlisted":false},{"type":"link","label":"Pika 和 RockSDB 的对接","href":"/docs/设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/","docId":"设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/index","unlisted":false}],"href":"/docs/设计与实现/Pika 源码学习笔记/"},{"type":"category","label":"Pika 传火计划","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Pika 线程模型简介","href":"/docs/设计与实现/Pika 传火计划/线程模型/","docId":"设计与实现/Pika 传火计划/线程模型/index","unlisted":false},{"type":"link","label":"Pika 读写流程简介","href":"/docs/设计与实现/Pika 传火计划/读写流程/","docId":"设计与实现/Pika 传火计划/读写流程/index","unlisted":false},{"type":"link","label":"Pika 主从同比","href":"/docs/设计与实现/Pika 传火计划/主从同步/","docId":"设计与实现/Pika 传火计划/主从同步/index","unlisted":false}],"href":"/docs/设计与实现/Pika 传火计划/"}],"href":"/docs/设计与实现/"},{"type":"category","label":"编码规范","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"编码规范","href":"/docs/开发文档/编码规范/","docId":"开发文档/编码规范/index","unlisted":false},{"type":"link","label":"c++ coding style","href":"/docs/开发文档/coding-style/","docId":"开发文档/coding-style/index","unlisted":false}],"href":"/docs/开发文档/"}]},"docs":{"使用与运维/index":{"id":"使用与运维/index","title":"使用与运维","description":"","sidebar":"tutorialSidebar"},"使用与运维/page info 信息说明/index":{"id":"使用与运维/page info 信息说明/index","title":"page info 信息说明","description":"执行INFO命令","sidebar":"tutorialSidebar"},"使用与运维/Pika 最佳实践/index":{"id":"使用与运维/Pika 最佳实践/index","title":"Pika 最佳实践","description":"我们根据360内部的pika使用经验及社区用户的问题反馈,整理了如下文档并会不断更新","sidebar":"tutorialSidebar"},"使用与运维/分布式模式简单教程/index":{"id":"使用与运维/分布式模式简单教程/index","title":"分布式模式简单教程","description":"关于sharding mode,pika底层提供slot 的概念。Pika将key进行哈希取模之后散列到各个slot当中处理。sharding mode 根据线上的具体情况可以应用于单个pika,也可以应用到多个pika组成的pika cluster。这个tutorial主要介绍开启sharding mode 需要了解的一些概念,以及需要调整的一些配置参数。","sidebar":"tutorialSidebar"},"使用与运维/分片教程/index":{"id":"使用与运维/分片教程/index","title":"分片教程(3.1.2 ‐ 3.3.6)","description":"Pika自版本3.1.2起开始对分片做了一系列支持,为此我们为分片模式添加了一系列的命令.","sidebar":"tutorialSidebar"},"使用与运维/副本一致性(使用文档)/index":{"id":"使用与运维/副本一致性(使用文档)/index","title":"副本一致性(使用文档)","description":"简介","sidebar":"tutorialSidebar"},"使用与运维/副本一致性(设计文档)/index":{"id":"使用与运维/副本一致性(设计文档)/index","title":"副本一致性(设计文档)","description":"目前线程模型","sidebar":"tutorialSidebar"},"使用与运维/多库版命令/index":{"id":"使用与运维/多库版命令/index","title":"多库版命令","description":"Pika自版本3.1.0起开始支持多db,为了兼容多db部分命令、配置参数发生了变化,具体变化如下:","sidebar":"tutorialSidebar"},"使用与运维/安装使用/index":{"id":"使用与运维/安装使用/index","title":"安装使用","description":"快速试用","sidebar":"tutorialSidebar"},"使用与运维/差异化命令/index":{"id":"使用与运维/差异化命令/index","title":"差异化命令","description":"config [get | set | rewrite]","sidebar":"tutorialSidebar"},"使用与运维/数据目录/index":{"id":"使用与运维/数据目录/index","title":"数据目录","description":"db目录","sidebar":"tutorialSidebar"},"使用与运维/服务器状态监控/index":{"id":"使用与运维/服务器状态监控/index","title":"服务器状态监控","description":"在pika的使用中,也为用户提供了丰富的info展示,用于监控服务器的运行状态。","sidebar":"tutorialSidebar"},"使用与运维/管理指令/index":{"id":"使用与运维/管理指令/index","title":"管理指令","description":"client kill all","sidebar":"tutorialSidebar"},"使用与运维/自动容灾/index":{"id":"使用与运维/自动容灾/index","title":"自动容灾","description":"pika能够配合Redis-sentinel(哨兵)实现自动容灾切主, 使用方式与redis完全一致","sidebar":"tutorialSidebar"},"使用与运维/订阅/index":{"id":"使用与运维/订阅/index","title":"订阅","description":"可用版本: >= 2.3.0","sidebar":"tutorialSidebar"},"使用与运维/配置文件说明/index":{"id":"使用与运维/配置文件说明/index","title":"配置文件说明","description":"","sidebar":"tutorialSidebar"},"序言/FAQ/index":{"id":"序言/FAQ/index","title":"FAQ","description":"1 编译安装","sidebar":"tutorialSidebar"},"序言/index":{"id":"序言/index","title":"序言","description":"欢迎来到 PikiwiDB(Pika) 的世界。接下来的篇章旨在于帮助你建立对 PikiwiDB 数据库的基本了解,你将会阅读到:","sidebar":"tutorialSidebar"},"序言/支持的 Redis 接口与兼容情况/index":{"id":"序言/支持的 Redis 接口与兼容情况/index","title":"支持的 Redis 接口与兼容情况","description":"pika支持redis五种类型(分别为string、hash、list、set、zset)的接口,先列出其对redis的五种数据结构兼容统计。","sidebar":"tutorialSidebar"},"序言/简介/index":{"id":"序言/简介/index","title":"PikiwiDB(Pika) 简介","description":"PikiwiDB(Pika)-Logo-Logo.png)","sidebar":"tutorialSidebar"},"开发文档/coding-style/index":{"id":"开发文档/coding-style/index","title":"c++ coding style","description":"header file","sidebar":"tutorialSidebar"},"开发文档/index":{"id":"开发文档/index","title":"编码规范","description":"","sidebar":"tutorialSidebar"},"开发文档/编码规范/index":{"id":"开发文档/编码规范/index","title":"编码规范","description":"c++ coding style","sidebar":"tutorialSidebar"},"性能与优化/3.2.x 性能/index":{"id":"性能与优化/3.2.x 性能/index","title":"3.2.x 性能","description":"Performance:","sidebar":"tutorialSidebar"},"性能与优化/index":{"id":"性能与优化/index","title":"性能与优化","description":"","sidebar":"tutorialSidebar"},"性能与优化/Pika 3.5 参数优化手册/index":{"id":"性能与优化/Pika 3.5 参数优化手册/index","title":"Pika 3.5 参数优化手册","description":"1970","sidebar":"tutorialSidebar"},"性能与优化/Pika 优化案例/index":{"id":"性能与优化/Pika 优化案例/index","title":"Pika 优化案例","description":"","sidebar":"tutorialSidebar"},"性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/index":{"id":"性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/index","title":"喜马拉雅 Redis 与 Pika 缓存使用军规","description":"宣言:缓存不是万金油,更不是垃圾桶!!!","sidebar":"tutorialSidebar"},"性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/index":{"id":"性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/index","title":"调整 max-write-buffer-size 优化 pika 性能10倍的案例","description":"现居珠海,先后担任专职 Oracle 和 MySQL DBA,现在主要负责 MySQL、mongoDB 和 Redis 维护工作。","sidebar":"tutorialSidebar"},"性能与优化/Pika 内存使用/index":{"id":"性能与优化/Pika 内存使用/index","title":"Pika 内存使用","description":"Pika内存占用","sidebar":"tutorialSidebar"},"性能与优化/Redis 与 Pika scan 性能对比/index":{"id":"性能与优化/Redis 与 Pika scan 性能对比/index","title":"Redis 与 Pika scan 性能对比","description":"Redis 是后端常用的键值数据库。Pika 是 360 出品的一款与 Redis 协议几乎兼容的数据库。与 Redis 不同的是,Pika 基于硬盘,使用 RocksDB 作为引擎,从容量上来说,比基于内存的 Redis 大了不少,而且在性能上也能满足一般需求。","sidebar":"tutorialSidebar"},"设计与实现/index":{"id":"设计与实现/index","title":"设计与实现","description":"","sidebar":"tutorialSidebar"},"设计与实现/NoSQL 原理概述/index":{"id":"设计与实现/NoSQL 原理概述/index","title":"NoSQL 原理概述","description":"pika 设计","sidebar":"tutorialSidebar"},"设计与实现/Pika 与 Codis/index":{"id":"设计与实现/Pika 与 Codis/index","title":"Pika 与 Codis","description":"背景","sidebar":"tutorialSidebar"},"设计与实现/Pika 传火计划/index":{"id":"设计与实现/Pika 传火计划/index","title":"Pika 传火计划","description":"为方便刚接触Pika的同学能够更快的上手提交第一个Pika PR。基于v3.3.4代码,从代码层面对Pika进行了全方面的梳理。这个想法叫传火计划,希望Pika星星之火可以燎原。","sidebar":"tutorialSidebar"},"设计与实现/Pika 传火计划/主从同步/index":{"id":"设计与实现/Pika 传火计划/主从同步/index","title":"Pika 主从同比","description":"alt text","sidebar":"tutorialSidebar"},"设计与实现/Pika 传火计划/线程模型/index":{"id":"设计与实现/Pika 传火计划/线程模型/index","title":"Pika 线程模型简介","description":"alt text","sidebar":"tutorialSidebar"},"设计与实现/Pika 传火计划/读写流程/index":{"id":"设计与实现/Pika 传火计划/读写流程/index","title":"Pika 读写流程简介","description":"alt text","sidebar":"tutorialSidebar"},"设计与实现/Pika 源码学习笔记/index":{"id":"设计与实现/Pika 源码学习笔记/index","title":"Pika 源码学习笔记","description":"","sidebar":"tutorialSidebar"},"设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/index":{"id":"设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/index","title":"Pika 和 RockSDB 的对接","description":"在《Pika源码学习--pika的命令执行框架》中我们了解了一个命令的执行流程,也知道了pika使用的是Blackwidow引擎,现在我们来看看pika是怎么和rocksdb对接的,Blackwidow具体怎么处理命令。","sidebar":"tutorialSidebar"},"设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/index":{"id":"设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/index","title":"Pika 的命令执行框架","description":"今天我们一起来看下pika收到一个命令后,是怎么处理这个命令的。","sidebar":"tutorialSidebar"},"设计与实现/Pika 源码学习笔记/PubSub 机制/index":{"id":"设计与实现/Pika 源码学习笔记/PubSub 机制/index","title":"Pubsub 机制","description":"前一篇《Pika源码学习--pika的通信和线程模型》里说到WorkerThread里面有两种处理命令的方式,一种是同步,一种是异步。那什么时候是同步处理,什么时候是异步处理呢?其实","sidebar":"tutorialSidebar"},"设计与实现/Pika 源码学习笔记/通信和线程模型/index":{"id":"设计与实现/Pika 源码学习笔记/通信和线程模型/index","title":"通信和线程模型","description":"pika的线程模型有官方的wiki介绍,这里主要介绍了pika都有哪些线程,这些线程用来干嘛。本篇文章主要涉及监听线程DispatchThread、IO工作线程WorkerThread和工作线程池ThreadPool,结合代码介绍里面实现的一些细节。","sidebar":"tutorialSidebar"},"设计与实现/主从同步/index":{"id":"设计与实现/主从同步/index","title":"主从同步","description":"pika主从同步","sidebar":"tutorialSidebar"},"设计与实现/全同步/index":{"id":"设计与实现/全同步/index","title":"全同步","description":"背景","sidebar":"tutorialSidebar"},"设计与实现/副本一致性/index":{"id":"设计与实现/副本一致性/index","title":"副本一致性","description":"目前线程模型","sidebar":"tutorialSidebar"},"设计与实现/增量同步/index":{"id":"设计与实现/增量同步/index","title":"增量同步","description":"背景","sidebar":"tutorialSidebar"},"设计与实现/快照式备份/index":{"id":"设计与实现/快照式备份/index","title":"快照式备份","description":"原理","sidebar":"tutorialSidebar"},"设计与实现/整体技术架构/index":{"id":"设计与实现/整体技术架构/index","title":"整体技术架构","description":"概述","sidebar":"tutorialSidebar"},"设计与实现/新存储方案:详细解析/index":{"id":"设计与实现/新存储方案:详细解析/index","title":"新存储结构:详细解析","description":"整体架构","sidebar":"tutorialSidebar"},"设计与实现/新存储结构/index":{"id":"设计与实现/新存储结构/index","title":"新存储结构","description":"整体架构","sidebar":"tutorialSidebar"},"设计与实现/旧存储结构/index":{"id":"设计与实现/旧存储结构/index","title":"旧存储结构","description":"Blackwidow 本质上是基于 rocksdb 的封装,使本身只支持 kv 存储的 rocksdb 能够支持多种数据结构, 目前 Blackwidow 支持五种数据结构的存储:String 结构(实际上就是存储 key, value), Hash 结构,List 结构,Set 结构和 ZSet 结构, 因为 Rocksdb 的存储方式只有 kv 一种, 所以上述五种数据结构最终都要落盘到 Rocksdb 的 kv 存储方式上,下面我们展示 Blackwidow 和 rocksdb 的关系并且说明我们是如何用 kv 来模拟多数据结构的。","sidebar":"tutorialSidebar"},"设计与实现/线程模型/index":{"id":"设计与实现/线程模型/index","title":"线程模型","description":"pika使用的是多线程模型,使用多个工作线程来进行读写操作,由底层blackwidow引擎来保证线程安全,线程分为12种:","sidebar":"tutorialSidebar"},"设计与实现/锁的应用/index":{"id":"设计与实现/锁的应用/index","title":"锁的应用","description":"pika作为类redis的存储系统,为了弥补在性能上的不足,在整个系统中大量使用多线程的结构,涉及到多线程编程,势必需要为线程加锁来保证数据访问的一致性和有效性。其中主要用到了三种锁","sidebar":"tutorialSidebar"}}}} \ No newline at end of file diff --git "a/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264-pika-\346\234\200\344\275\263\345\256\236\350\267\265-index-md-03a.json" "b/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264-pika-\346\234\200\344\275\263\345\256\236\350\267\265-index-md-03a.json" index 3c6c413..ad6e7da 100644 --- "a/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264-pika-\346\234\200\344\275\263\345\256\236\350\267\265-index-md-03a.json" +++ "b/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264-pika-\346\234\200\344\275\263\345\256\236\350\267\265-index-md-03a.json" @@ -22,7 +22,7 @@ "permalink": "/docs/使用与运维/副本一致性(设计文档)/" }, "next": { - "title": "升级指南", - "permalink": "/docs/使用与运维/升级指南/" + "title": "性能与优化", + "permalink": "/docs/性能与优化/" } } \ No newline at end of file diff --git "a/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-\346\200\247\350\203\275\344\270\216\344\274\230\345\214\226-index-md-a74.json" "b/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-\346\200\247\350\203\275\344\270\216\344\274\230\345\214\226-index-md-a74.json" index 675cbec..ba241c1 100644 --- "a/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-\346\200\247\350\203\275\344\270\216\344\274\230\345\214\226-index-md-a74.json" +++ "b/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-\346\200\247\350\203\275\344\270\216\344\274\230\345\214\226-index-md-a74.json" @@ -18,8 +18,8 @@ }, "sidebar": "tutorialSidebar", "previous": { - "title": "如何将 Pika 3.3.6 升级到 Pika 3.5", - "permalink": "/docs/使用与运维/升级指南/如何将 Pika 3.3.6 升级到 Pika 3.5/" + "title": "Pika 最佳实践", + "permalink": "/docs/使用与运维/Pika 最佳实践/" }, "next": { "title": "3.2.x 性能", diff --git a/.docusaurus/globalData.json b/.docusaurus/globalData.json index 5c83072..f47193a 100644 --- a/.docusaurus/globalData.json +++ b/.docusaurus/globalData.json @@ -45,26 +45,6 @@ "path": "/docs/使用与运维/副本一致性(设计文档)/", "sidebar": "tutorialSidebar" }, - { - "id": "使用与运维/升级指南/index", - "path": "/docs/使用与运维/升级指南/", - "sidebar": "tutorialSidebar" - }, - { - "id": "使用与运维/升级指南/如何升级到 Pika 3.0/index", - "path": "/docs/使用与运维/升级指南/如何升级到 Pika 3.0/", - "sidebar": "tutorialSidebar" - }, - { - "id": "使用与运维/升级指南/如何升级到 Pika 3.1 或 3.2/index", - "path": "/docs/使用与运维/升级指南/如何升级到 Pika 3.1 或 3.2/", - "sidebar": "tutorialSidebar" - }, - { - "id": "使用与运维/升级指南/如何将 Pika 3.3.6 升级到 Pika 3.5/index", - "path": "/docs/使用与运维/升级指南/如何将 Pika 3.3.6 升级到 Pika 3.5/", - "sidebar": "tutorialSidebar" - }, { "id": "使用与运维/多库版命令/index", "path": "/docs/使用与运维/多库版命令/", diff --git a/.docusaurus/registry.js b/.docusaurus/registry.js index f8ca0fa..1a90b0d 100644 --- a/.docusaurus/registry.js +++ b/.docusaurus/registry.js @@ -1,99 +1,87 @@ export default { - "__comp---site-src-pages-index-jsc-4-f-f99": [() => import(/* webpackChunkName: "__comp---site-src-pages-index-jsc-4-f-f99" */ "@site/src/pages/index.js"), "@site/src/pages/index.js", require.resolveWeak("@site/src/pages/index.js")], - "__comp---theme-blog-archive-page-9-e-4-1d8": [() => import(/* webpackChunkName: "__comp---theme-blog-archive-page-9-e-4-1d8" */ "@theme/BlogArchivePage"), "@theme/BlogArchivePage", require.resolveWeak("@theme/BlogArchivePage")], - "__comp---theme-blog-list-pagea-6-a-7ba": [() => import(/* webpackChunkName: "__comp---theme-blog-list-pagea-6-a-7ba" */ "@theme/BlogListPage"), "@theme/BlogListPage", require.resolveWeak("@theme/BlogListPage")], - "__comp---theme-blog-post-pageccc-cab": [() => import(/* webpackChunkName: "__comp---theme-blog-post-pageccc-cab" */ "@theme/BlogPostPage"), "@theme/BlogPostPage", require.resolveWeak("@theme/BlogPostPage")], - "__comp---theme-debug-config-23-a-2ff": [() => import(/* webpackChunkName: "__comp---theme-debug-config-23-a-2ff" */ "@theme/DebugConfig"), "@theme/DebugConfig", require.resolveWeak("@theme/DebugConfig")], - "__comp---theme-debug-contentba-8-ce7": [() => import(/* webpackChunkName: "__comp---theme-debug-contentba-8-ce7" */ "@theme/DebugContent"), "@theme/DebugContent", require.resolveWeak("@theme/DebugContent")], - "__comp---theme-debug-global-dataede-0fa": [() => import(/* webpackChunkName: "__comp---theme-debug-global-dataede-0fa" */ "@theme/DebugGlobalData"), "@theme/DebugGlobalData", require.resolveWeak("@theme/DebugGlobalData")], - "__comp---theme-debug-registry-679-501": [() => import(/* webpackChunkName: "__comp---theme-debug-registry-679-501" */ "@theme/DebugRegistry"), "@theme/DebugRegistry", require.resolveWeak("@theme/DebugRegistry")], - "__comp---theme-debug-routes-946-699": [() => import(/* webpackChunkName: "__comp---theme-debug-routes-946-699" */ "@theme/DebugRoutes"), "@theme/DebugRoutes", require.resolveWeak("@theme/DebugRoutes")], - "__comp---theme-debug-site-metadata-68-e-3d4": [() => import(/* webpackChunkName: "__comp---theme-debug-site-metadata-68-e-3d4" */ "@theme/DebugSiteMetadata"), "@theme/DebugSiteMetadata", require.resolveWeak("@theme/DebugSiteMetadata")], - "__comp---theme-doc-item-178-a40": [() => import(/* webpackChunkName: "__comp---theme-doc-item-178-a40" */ "@theme/DocItem"), "@theme/DocItem", require.resolveWeak("@theme/DocItem")], - "__comp---theme-doc-roota-94-67a": [() => import(/* webpackChunkName: "__comp---theme-doc-roota-94-67a" */ "@theme/DocRoot"), "@theme/DocRoot", require.resolveWeak("@theme/DocRoot")], - "__comp---theme-doc-version-roota-7-b-5de": [() => import(/* webpackChunkName: "__comp---theme-doc-version-roota-7-b-5de" */ "@theme/DocVersionRoot"), "@theme/DocVersionRoot", require.resolveWeak("@theme/DocVersionRoot")], - "__comp---theme-docs-root-5-e-9-0b6": [() => import(/* webpackChunkName: "__comp---theme-docs-root-5-e-9-0b6" */ "@theme/DocsRoot"), "@theme/DocsRoot", require.resolveWeak("@theme/DocsRoot")], - "__props---blog-archivef-81-229": [() => import(/* webpackChunkName: "__props---blog-archivef-81-229" */ "@generated/docusaurus-plugin-content-blog/default/p/blog-archive-f05.json"), "@generated/docusaurus-plugin-content-blog/default/p/blog-archive-f05.json", require.resolveWeak("@generated/docusaurus-plugin-content-blog/default/p/blog-archive-f05.json")], - "__props---blogc-15-573": [() => import(/* webpackChunkName: "__props---blogc-15-573" */ "@generated/docusaurus-plugin-content-blog/default/p/blog-bd9.json"), "@generated/docusaurus-plugin-content-blog/default/p/blog-bd9.json", require.resolveWeak("@generated/docusaurus-plugin-content-blog/default/p/blog-bd9.json")], - "__props---docs-005-788": [() => import(/* webpackChunkName: "__props---docs-005-788" */ "@generated/docusaurus-plugin-content-docs/default/p/docs-175.json"), "@generated/docusaurus-plugin-content-docs/default/p/docs-175.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/docs-175.json")], - "__props---docusaurus-debug-content-3-c-0-be2": [() => import(/* webpackChunkName: "__props---docusaurus-debug-content-3-c-0-be2" */ "@generated/docusaurus-plugin-debug/default/p/docusaurus-debug-content-0d5.json"), "@generated/docusaurus-plugin-debug/default/p/docusaurus-debug-content-0d5.json", require.resolveWeak("@generated/docusaurus-plugin-debug/default/p/docusaurus-debug-content-0d5.json")], - "blogMetadata---blog-pika-3-5-0-ace-104": [() => import(/* webpackChunkName: "blogMetadata---blog-pika-3-5-0-ace-104" */ "~blog/default/blogMetadata-default.json"), "~blog/default/blogMetadata-default.json", require.resolveWeak("~blog/default/blogMetadata-default.json")], - "config---5-e-9-4f3": [() => import(/* webpackChunkName: "config---5-e-9-4f3" */ "@generated/docusaurus.config"), "@generated/docusaurus.config", require.resolveWeak("@generated/docusaurus.config")], - "content---blog-257-76c": [() => import(/* webpackChunkName: "content---blog-257-76c" */ "@site/blog/2023-08-25-Pika-3.5.0.md?truncated=true"), "@site/blog/2023-08-25-Pika-3.5.0.md?truncated=true", require.resolveWeak("@site/blog/2023-08-25-Pika-3.5.0.md?truncated=true")], - "content---blog-56-a-a4f": [() => import(/* webpackChunkName: "content---blog-56-a-a4f" */ "@site/blog/2024-05-16-Pika-3.5.4.md?truncated=true"), "@site/blog/2024-05-16-Pika-3.5.4.md?truncated=true", require.resolveWeak("@site/blog/2024-05-16-Pika-3.5.4.md?truncated=true")], - "content---blog-584-5d9": [() => import(/* webpackChunkName: "content---blog-584-5d9" */ "@site/blog/2024-07-08-PikiwiDB(Pika)-4.0.0.md?truncated=true"), "@site/blog/2024-07-08-PikiwiDB(Pika)-4.0.0.md?truncated=true", require.resolveWeak("@site/blog/2024-07-08-PikiwiDB(Pika)-4.0.0.md?truncated=true")], - "content---blog-pika-3-5-0-f-78-463": [() => import(/* webpackChunkName: "content---blog-pika-3-5-0-f-78-463" */ "@site/blog/2023-12-03-Pika-3.5.2.md"), "@site/blog/2023-12-03-Pika-3.5.2.md", require.resolveWeak("@site/blog/2023-12-03-Pika-3.5.2.md")], - "content---blog-pika-3-5-0285-851": [() => import(/* webpackChunkName: "content---blog-pika-3-5-0285-851" */ "@site/blog/2023-08-25-Pika-3.5.0.md"), "@site/blog/2023-08-25-Pika-3.5.0.md", require.resolveWeak("@site/blog/2023-08-25-Pika-3.5.0.md")], - "content---blog-pika-3-5-18-cf-c57": [() => import(/* webpackChunkName: "content---blog-pika-3-5-18-cf-c57" */ "@site/blog/2023-09-28-Pika-3.5.1.md"), "@site/blog/2023-09-28-Pika-3.5.1.md", require.resolveWeak("@site/blog/2023-09-28-Pika-3.5.1.md")], - "content---blog-pika-3-5-32-c-2-37d": [() => import(/* webpackChunkName: "content---blog-pika-3-5-32-c-2-37d" */ "@site/blog/2024-03-27-Pika-3.5.3.md"), "@site/blog/2024-03-27-Pika-3.5.3.md", require.resolveWeak("@site/blog/2024-03-27-Pika-3.5.3.md")], - "content---blog-pika-3-5-46-ed-a64": [() => import(/* webpackChunkName: "content---blog-pika-3-5-46-ed-a64" */ "@site/blog/2024-05-16-Pika-3.5.4.md"), "@site/blog/2024-05-16-Pika-3.5.4.md", require.resolveWeak("@site/blog/2024-05-16-Pika-3.5.4.md")], - "content---blog-pika-blackwidow-569-00a": [() => import(/* webpackChunkName: "content---blog-pika-blackwidow-569-00a" */ "@site/blog/2020-7-16-pika-blackwidow.md"), "@site/blog/2020-7-16-pika-blackwidow.md", require.resolveWeak("@site/blog/2020-7-16-pika-blackwidow.md")], - "content---blog-pika-tools-port-binfdb-f2f": [() => import(/* webpackChunkName: "content---blog-pika-tools-port-binfdb-f2f" */ "@site/blog/2020-04-26-Pika-Tools-Port-Bin.md"), "@site/blog/2020-04-26-Pika-Tools-Port-Bin.md", require.resolveWeak("@site/blog/2020-04-26-Pika-Tools-Port-Bin.md")], - "content---blog-pikiwi-db-pika-4-0-0878-7df": [() => import(/* webpackChunkName: "content---blog-pikiwi-db-pika-4-0-0878-7df" */ "@site/blog/2024-07-08-PikiwiDB(Pika)-4.0.0.md"), "@site/blog/2024-07-08-PikiwiDB(Pika)-4.0.0.md", require.resolveWeak("@site/blog/2024-07-08-PikiwiDB(Pika)-4.0.0.md")], - "content---bloga-5-d-ef5": [() => import(/* webpackChunkName: "content---bloga-5-d-ef5" */ "@site/blog/2024-03-27-Pika-3.5.3.md?truncated=true"), "@site/blog/2024-03-27-Pika-3.5.3.md?truncated=true", require.resolveWeak("@site/blog/2024-03-27-Pika-3.5.3.md?truncated=true")], - "content---blogc-8-b-001": [() => import(/* webpackChunkName: "content---blogc-8-b-001" */ "@site/blog/2020-7-16-pika-blackwidow.md?truncated=true"), "@site/blog/2020-7-16-pika-blackwidow.md?truncated=true", require.resolveWeak("@site/blog/2020-7-16-pika-blackwidow.md?truncated=true")], - "content---blogc-82-eb2": [() => import(/* webpackChunkName: "content---blogc-82-eb2" */ "@site/blog/2020-04-26-Pika-Tools-Port-Bin.md?truncated=true"), "@site/blog/2020-04-26-Pika-Tools-Port-Bin.md?truncated=true", require.resolveWeak("@site/blog/2020-04-26-Pika-Tools-Port-Bin.md?truncated=true")], - "content---blogea-5-4d3": [() => import(/* webpackChunkName: "content---blogea-5-4d3" */ "@site/blog/2023-09-28-Pika-3.5.1.md?truncated=true"), "@site/blog/2023-09-28-Pika-3.5.1.md?truncated=true", require.resolveWeak("@site/blog/2023-09-28-Pika-3.5.1.md?truncated=true")], - "content---docs-使用与运维-ffc-db3": [() => import(/* webpackChunkName: "content---docs-使用与运维-ffc-db3" */ "@site/docs/使用与运维/index.md"), "@site/docs/使用与运维/index.md", require.resolveWeak("@site/docs/使用与运维/index.md")], - "content---docs-使用与运维-page-info-信息说明-29-b-211": [() => import(/* webpackChunkName: "content---docs-使用与运维-page-info-信息说明-29-b-211" */ "@site/docs/使用与运维/page info 信息说明/index.md"), "@site/docs/使用与运维/page info 信息说明/index.md", require.resolveWeak("@site/docs/使用与运维/page info 信息说明/index.md")], - "content---docs-使用与运维-pika-最佳实践-03-a-1d2": [() => import(/* webpackChunkName: "content---docs-使用与运维-pika-最佳实践-03-a-1d2" */ "@site/docs/使用与运维/Pika 最佳实践/index.md"), "@site/docs/使用与运维/Pika 最佳实践/index.md", require.resolveWeak("@site/docs/使用与运维/Pika 最佳实践/index.md")], - "content---docs-使用与运维-分布式模式简单教程-14-c-ccb": [() => import(/* webpackChunkName: "content---docs-使用与运维-分布式模式简单教程-14-c-ccb" */ "@site/docs/使用与运维/分布式模式简单教程/index.md"), "@site/docs/使用与运维/分布式模式简单教程/index.md", require.resolveWeak("@site/docs/使用与运维/分布式模式简单教程/index.md")], - "content---docs-使用与运维-分片教程-a-77-8a8": [() => import(/* webpackChunkName: "content---docs-使用与运维-分片教程-a-77-8a8" */ "@site/docs/使用与运维/分片教程/index.md"), "@site/docs/使用与运维/分片教程/index.md", require.resolveWeak("@site/docs/使用与运维/分片教程/index.md")], - "content---docs-使用与运维-副本一致性(使用文档)-069-951": [() => import(/* webpackChunkName: "content---docs-使用与运维-副本一致性(使用文档)-069-951" */ "@site/docs/使用与运维/副本一致性(使用文档)/index.md"), "@site/docs/使用与运维/副本一致性(使用文档)/index.md", require.resolveWeak("@site/docs/使用与运维/副本一致性(使用文档)/index.md")], - "content---docs-使用与运维-副本一致性(设计文档)-777-06f": [() => import(/* webpackChunkName: "content---docs-使用与运维-副本一致性(设计文档)-777-06f" */ "@site/docs/使用与运维/副本一致性(设计文档)/index.md"), "@site/docs/使用与运维/副本一致性(设计文档)/index.md", require.resolveWeak("@site/docs/使用与运维/副本一致性(设计文档)/index.md")], - "content---docs-使用与运维-升级指南-169-a10": [() => import(/* webpackChunkName: "content---docs-使用与运维-升级指南-169-a10" */ "@site/docs/使用与运维/升级指南/index.md"), "@site/docs/使用与运维/升级指南/index.md", require.resolveWeak("@site/docs/使用与运维/升级指南/index.md")], - "content---docs-使用与运维-升级指南-如何升级到-pika-3-0-28-d-9db": [() => import(/* webpackChunkName: "content---docs-使用与运维-升级指南-如何升级到-pika-3-0-28-d-9db" */ "@site/docs/使用与运维/升级指南/如何升级到 Pika 3.0/index.md"), "@site/docs/使用与运维/升级指南/如何升级到 Pika 3.0/index.md", require.resolveWeak("@site/docs/使用与运维/升级指南/如何升级到 Pika 3.0/index.md")], - "content---docs-使用与运维-升级指南-如何升级到-pika-3-1-或-3-2-bd-3-67d": [() => import(/* webpackChunkName: "content---docs-使用与运维-升级指南-如何升级到-pika-3-1-或-3-2-bd-3-67d" */ "@site/docs/使用与运维/升级指南/如何升级到 Pika 3.1 或 3.2/index.md"), "@site/docs/使用与运维/升级指南/如何升级到 Pika 3.1 或 3.2/index.md", require.resolveWeak("@site/docs/使用与运维/升级指南/如何升级到 Pika 3.1 或 3.2/index.md")], - "content---docs-使用与运维-升级指南-如何将-pika-3-3-6-升级到-pika-3-5-7-bd-d98": [() => import(/* webpackChunkName: "content---docs-使用与运维-升级指南-如何将-pika-3-3-6-升级到-pika-3-5-7-bd-d98" */ "@site/docs/使用与运维/升级指南/如何将 Pika 3.3.6 升级到 Pika 3.5/index.md"), "@site/docs/使用与运维/升级指南/如何将 Pika 3.3.6 升级到 Pika 3.5/index.md", require.resolveWeak("@site/docs/使用与运维/升级指南/如何将 Pika 3.3.6 升级到 Pika 3.5/index.md")], - "content---docs-使用与运维-多库版命令-82-b-abe": [() => import(/* webpackChunkName: "content---docs-使用与运维-多库版命令-82-b-abe" */ "@site/docs/使用与运维/多库版命令/index.md"), "@site/docs/使用与运维/多库版命令/index.md", require.resolveWeak("@site/docs/使用与运维/多库版命令/index.md")], - "content---docs-使用与运维-安装使用-d-12-a8f": [() => import(/* webpackChunkName: "content---docs-使用与运维-安装使用-d-12-a8f" */ "@site/docs/使用与运维/安装使用/index.md"), "@site/docs/使用与运维/安装使用/index.md", require.resolveWeak("@site/docs/使用与运维/安装使用/index.md")], - "content---docs-使用与运维-差异化命令-ae-7-c24": [() => import(/* webpackChunkName: "content---docs-使用与运维-差异化命令-ae-7-c24" */ "@site/docs/使用与运维/差异化命令/index.md"), "@site/docs/使用与运维/差异化命令/index.md", require.resolveWeak("@site/docs/使用与运维/差异化命令/index.md")], - "content---docs-使用与运维-数据目录-1-b-3-f3a": [() => import(/* webpackChunkName: "content---docs-使用与运维-数据目录-1-b-3-f3a" */ "@site/docs/使用与运维/数据目录/index.md"), "@site/docs/使用与运维/数据目录/index.md", require.resolveWeak("@site/docs/使用与运维/数据目录/index.md")], - "content---docs-使用与运维-服务器状态监控-fdc-11a": [() => import(/* webpackChunkName: "content---docs-使用与运维-服务器状态监控-fdc-11a" */ "@site/docs/使用与运维/服务器状态监控/index.md"), "@site/docs/使用与运维/服务器状态监控/index.md", require.resolveWeak("@site/docs/使用与运维/服务器状态监控/index.md")], - "content---docs-使用与运维-管理指令-e-13-386": [() => import(/* webpackChunkName: "content---docs-使用与运维-管理指令-e-13-386" */ "@site/docs/使用与运维/管理指令/index.md"), "@site/docs/使用与运维/管理指令/index.md", require.resolveWeak("@site/docs/使用与运维/管理指令/index.md")], - "content---docs-使用与运维-自动容灾-063-450": [() => import(/* webpackChunkName: "content---docs-使用与运维-自动容灾-063-450" */ "@site/docs/使用与运维/自动容灾/index.md"), "@site/docs/使用与运维/自动容灾/index.md", require.resolveWeak("@site/docs/使用与运维/自动容灾/index.md")], - "content---docs-使用与运维-订阅-49-f-59e": [() => import(/* webpackChunkName: "content---docs-使用与运维-订阅-49-f-59e" */ "@site/docs/使用与运维/订阅/index.md"), "@site/docs/使用与运维/订阅/index.md", require.resolveWeak("@site/docs/使用与运维/订阅/index.md")], - "content---docs-使用与运维-配置文件说明-c-6-b-bc2": [() => import(/* webpackChunkName: "content---docs-使用与运维-配置文件说明-c-6-b-bc2" */ "@site/docs/使用与运维/配置文件说明/index.md"), "@site/docs/使用与运维/配置文件说明/index.md", require.resolveWeak("@site/docs/使用与运维/配置文件说明/index.md")], - "content---docs-序言-980-c58": [() => import(/* webpackChunkName: "content---docs-序言-980-c58" */ "@site/docs/序言/index.md"), "@site/docs/序言/index.md", require.resolveWeak("@site/docs/序言/index.md")], - "content---docs-序言-faq-947-fab": [() => import(/* webpackChunkName: "content---docs-序言-faq-947-fab" */ "@site/docs/序言/FAQ/index.md"), "@site/docs/序言/FAQ/index.md", require.resolveWeak("@site/docs/序言/FAQ/index.md")], - "content---docs-序言-支持的-redis-接口与兼容情况-07-f-422": [() => import(/* webpackChunkName: "content---docs-序言-支持的-redis-接口与兼容情况-07-f-422" */ "@site/docs/序言/支持的 Redis 接口与兼容情况/index.md"), "@site/docs/序言/支持的 Redis 接口与兼容情况/index.md", require.resolveWeak("@site/docs/序言/支持的 Redis 接口与兼容情况/index.md")], - "content---docs-序言-简介-382-f9d": [() => import(/* webpackChunkName: "content---docs-序言-简介-382-f9d" */ "@site/docs/序言/简介/index.md"), "@site/docs/序言/简介/index.md", require.resolveWeak("@site/docs/序言/简介/index.md")], - "content---docs-开发文档-coding-style-aff-bb3": [() => import(/* webpackChunkName: "content---docs-开发文档-coding-style-aff-bb3" */ "@site/docs/开发文档/coding-style/index.md"), "@site/docs/开发文档/coding-style/index.md", require.resolveWeak("@site/docs/开发文档/coding-style/index.md")], - "content---docs-开发文档-fac-613": [() => import(/* webpackChunkName: "content---docs-开发文档-fac-613" */ "@site/docs/开发文档/index.md"), "@site/docs/开发文档/index.md", require.resolveWeak("@site/docs/开发文档/index.md")], - "content---docs-开发文档-编码规范-e-60-647": [() => import(/* webpackChunkName: "content---docs-开发文档-编码规范-e-60-647" */ "@site/docs/开发文档/编码规范/index.md"), "@site/docs/开发文档/编码规范/index.md", require.resolveWeak("@site/docs/开发文档/编码规范/index.md")], - "content---docs-性能与优化-3-2-x-性能-adc-35c": [() => import(/* webpackChunkName: "content---docs-性能与优化-3-2-x-性能-adc-35c" */ "@site/docs/性能与优化/3.2.x 性能/index.md"), "@site/docs/性能与优化/3.2.x 性能/index.md", require.resolveWeak("@site/docs/性能与优化/3.2.x 性能/index.md")], - "content---docs-性能与优化-a-74-686": [() => import(/* webpackChunkName: "content---docs-性能与优化-a-74-686" */ "@site/docs/性能与优化/index.md"), "@site/docs/性能与优化/index.md", require.resolveWeak("@site/docs/性能与优化/index.md")], - "content---docs-性能与优化-pika-3-5-参数优化手册-30-d-264": [() => import(/* webpackChunkName: "content---docs-性能与优化-pika-3-5-参数优化手册-30-d-264" */ "@site/docs/性能与优化/Pika 3.5 参数优化手册/index.md"), "@site/docs/性能与优化/Pika 3.5 参数优化手册/index.md", require.resolveWeak("@site/docs/性能与优化/Pika 3.5 参数优化手册/index.md")], - "content---docs-性能与优化-pika-优化案例-bb-6-de3": [() => import(/* webpackChunkName: "content---docs-性能与优化-pika-优化案例-bb-6-de3" */ "@site/docs/性能与优化/Pika 优化案例/index.md"), "@site/docs/性能与优化/Pika 优化案例/index.md", require.resolveWeak("@site/docs/性能与优化/Pika 优化案例/index.md")], - "content---docs-性能与优化-pika-优化案例-喜马拉雅-redis-与-pika-缓存使用军规-117-154": [() => import(/* webpackChunkName: "content---docs-性能与优化-pika-优化案例-喜马拉雅-redis-与-pika-缓存使用军规-117-154" */ "@site/docs/性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/index.md"), "@site/docs/性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/index.md", require.resolveWeak("@site/docs/性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/index.md")], - "content---docs-性能与优化-pika-优化案例-调整-max-write-buffer-size-优化-pika-性能-10-倍的案例-707-20c": [() => import(/* webpackChunkName: "content---docs-性能与优化-pika-优化案例-调整-max-write-buffer-size-优化-pika-性能-10-倍的案例-707-20c" */ "@site/docs/性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/index.md"), "@site/docs/性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/index.md", require.resolveWeak("@site/docs/性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/index.md")], - "content---docs-性能与优化-pika-内存使用-bbb-e56": [() => import(/* webpackChunkName: "content---docs-性能与优化-pika-内存使用-bbb-e56" */ "@site/docs/性能与优化/Pika 内存使用/index.md"), "@site/docs/性能与优化/Pika 内存使用/index.md", require.resolveWeak("@site/docs/性能与优化/Pika 内存使用/index.md")], - "content---docs-性能与优化-redis-与-pika-scan-性能对比-eb-8-cb9": [() => import(/* webpackChunkName: "content---docs-性能与优化-redis-与-pika-scan-性能对比-eb-8-cb9" */ "@site/docs/性能与优化/Redis 与 Pika scan 性能对比/index.md"), "@site/docs/性能与优化/Redis 与 Pika scan 性能对比/index.md", require.resolveWeak("@site/docs/性能与优化/Redis 与 Pika scan 性能对比/index.md")], - "content---docs-设计与实现-999-d65": [() => import(/* webpackChunkName: "content---docs-设计与实现-999-d65" */ "@site/docs/设计与实现/index.md"), "@site/docs/设计与实现/index.md", require.resolveWeak("@site/docs/设计与实现/index.md")], - "content---docs-设计与实现-no-sql-原理概述-c-3-d-c60": [() => import(/* webpackChunkName: "content---docs-设计与实现-no-sql-原理概述-c-3-d-c60" */ "@site/docs/设计与实现/NoSQL 原理概述/index.md"), "@site/docs/设计与实现/NoSQL 原理概述/index.md", require.resolveWeak("@site/docs/设计与实现/NoSQL 原理概述/index.md")], - "content---docs-设计与实现-pika-与-codis-107-91d": [() => import(/* webpackChunkName: "content---docs-设计与实现-pika-与-codis-107-91d" */ "@site/docs/设计与实现/Pika 与 Codis/index.md"), "@site/docs/设计与实现/Pika 与 Codis/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 与 Codis/index.md")], - "content---docs-设计与实现-pika-传火计划-9-b-4-152": [() => import(/* webpackChunkName: "content---docs-设计与实现-pika-传火计划-9-b-4-152" */ "@site/docs/设计与实现/Pika 传火计划/index.md"), "@site/docs/设计与实现/Pika 传火计划/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 传火计划/index.md")], - "content---docs-设计与实现-pika-传火计划-主从同步-2-fc-1f3": [() => import(/* webpackChunkName: "content---docs-设计与实现-pika-传火计划-主从同步-2-fc-1f3" */ "@site/docs/设计与实现/Pika 传火计划/主从同步/index.md"), "@site/docs/设计与实现/Pika 传火计划/主从同步/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 传火计划/主从同步/index.md")], - "content---docs-设计与实现-pika-传火计划-线程模型-a-38-416": [() => import(/* webpackChunkName: "content---docs-设计与实现-pika-传火计划-线程模型-a-38-416" */ "@site/docs/设计与实现/Pika 传火计划/线程模型/index.md"), "@site/docs/设计与实现/Pika 传火计划/线程模型/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 传火计划/线程模型/index.md")], - "content---docs-设计与实现-pika-传火计划-读写流程-a-95-da7": [() => import(/* webpackChunkName: "content---docs-设计与实现-pika-传火计划-读写流程-a-95-da7" */ "@site/docs/设计与实现/Pika 传火计划/读写流程/index.md"), "@site/docs/设计与实现/Pika 传火计划/读写流程/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 传火计划/读写流程/index.md")], - "content---docs-设计与实现-pika-源码学习笔记-8-d-7-499": [() => import(/* webpackChunkName: "content---docs-设计与实现-pika-源码学习笔记-8-d-7-499" */ "@site/docs/设计与实现/Pika 源码学习笔记/index.md"), "@site/docs/设计与实现/Pika 源码学习笔记/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 源码学习笔记/index.md")], - "content---docs-设计与实现-pika-源码学习笔记-pika-和-rock-sdb-的对接-406-8c8": [() => import(/* webpackChunkName: "content---docs-设计与实现-pika-源码学习笔记-pika-和-rock-sdb-的对接-406-8c8" */ "@site/docs/设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/index.md"), "@site/docs/设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/index.md")], - "content---docs-设计与实现-pika-源码学习笔记-pika-的命令执行框架-872-9d4": [() => import(/* webpackChunkName: "content---docs-设计与实现-pika-源码学习笔记-pika-的命令执行框架-872-9d4" */ "@site/docs/设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/index.md"), "@site/docs/设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/index.md")], - "content---docs-设计与实现-pika-源码学习笔记-pub-sub-机制-a-60-6d4": [() => import(/* webpackChunkName: "content---docs-设计与实现-pika-源码学习笔记-pub-sub-机制-a-60-6d4" */ "@site/docs/设计与实现/Pika 源码学习笔记/PubSub 机制/index.md"), "@site/docs/设计与实现/Pika 源码学习笔记/PubSub 机制/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 源码学习笔记/PubSub 机制/index.md")], - "content---docs-设计与实现-pika-源码学习笔记-通信和线程模型-70-e-612": [() => import(/* webpackChunkName: "content---docs-设计与实现-pika-源码学习笔记-通信和线程模型-70-e-612" */ "@site/docs/设计与实现/Pika 源码学习笔记/通信和线程模型/index.md"), "@site/docs/设计与实现/Pika 源码学习笔记/通信和线程模型/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 源码学习笔记/通信和线程模型/index.md")], - "content---docs-设计与实现-主从同步-65-e-b7a": [() => import(/* webpackChunkName: "content---docs-设计与实现-主从同步-65-e-b7a" */ "@site/docs/设计与实现/主从同步/index.md"), "@site/docs/设计与实现/主从同步/index.md", require.resolveWeak("@site/docs/设计与实现/主从同步/index.md")], - "content---docs-设计与实现-全同步-43-f-30a": [() => import(/* webpackChunkName: "content---docs-设计与实现-全同步-43-f-30a" */ "@site/docs/设计与实现/全同步/index.md"), "@site/docs/设计与实现/全同步/index.md", require.resolveWeak("@site/docs/设计与实现/全同步/index.md")], - "content---docs-设计与实现-副本一致性-653-c24": [() => import(/* webpackChunkName: "content---docs-设计与实现-副本一致性-653-c24" */ "@site/docs/设计与实现/副本一致性/index.md"), "@site/docs/设计与实现/副本一致性/index.md", require.resolveWeak("@site/docs/设计与实现/副本一致性/index.md")], - "content---docs-设计与实现-增量同步-15-d-dd0": [() => import(/* webpackChunkName: "content---docs-设计与实现-增量同步-15-d-dd0" */ "@site/docs/设计与实现/增量同步/index.md"), "@site/docs/设计与实现/增量同步/index.md", require.resolveWeak("@site/docs/设计与实现/增量同步/index.md")], - "content---docs-设计与实现-快照式备份-937-ea0": [() => import(/* webpackChunkName: "content---docs-设计与实现-快照式备份-937-ea0" */ "@site/docs/设计与实现/快照式备份/index.md"), "@site/docs/设计与实现/快照式备份/index.md", require.resolveWeak("@site/docs/设计与实现/快照式备份/index.md")], - "content---docs-设计与实现-整体技术架构-184-c0e": [() => import(/* webpackChunkName: "content---docs-设计与实现-整体技术架构-184-c0e" */ "@site/docs/设计与实现/整体技术架构/index.md"), "@site/docs/设计与实现/整体技术架构/index.md", require.resolveWeak("@site/docs/设计与实现/整体技术架构/index.md")], - "content---docs-设计与实现-新存储方案:详细解析-d-04-e36": [() => import(/* webpackChunkName: "content---docs-设计与实现-新存储方案:详细解析-d-04-e36" */ "@site/docs/设计与实现/新存储方案:详细解析/index.md"), "@site/docs/设计与实现/新存储方案:详细解析/index.md", require.resolveWeak("@site/docs/设计与实现/新存储方案:详细解析/index.md")], - "content---docs-设计与实现-新存储结构-8-ad-f6a": [() => import(/* webpackChunkName: "content---docs-设计与实现-新存储结构-8-ad-f6a" */ "@site/docs/设计与实现/新存储结构/index.md"), "@site/docs/设计与实现/新存储结构/index.md", require.resolveWeak("@site/docs/设计与实现/新存储结构/index.md")], - "content---docs-设计与实现-旧存储结构-ab-9-b18": [() => import(/* webpackChunkName: "content---docs-设计与实现-旧存储结构-ab-9-b18" */ "@site/docs/设计与实现/旧存储结构/index.md"), "@site/docs/设计与实现/旧存储结构/index.md", require.resolveWeak("@site/docs/设计与实现/旧存储结构/index.md")], - "content---docs-设计与实现-线程模型-e-85-bf0": [() => import(/* webpackChunkName: "content---docs-设计与实现-线程模型-e-85-bf0" */ "@site/docs/设计与实现/线程模型/index.md"), "@site/docs/设计与实现/线程模型/index.md", require.resolveWeak("@site/docs/设计与实现/线程模型/index.md")], - "content---docs-设计与实现-锁的应用-b-50-0ea": [() => import(/* webpackChunkName: "content---docs-设计与实现-锁的应用-b-50-0ea" */ "@site/docs/设计与实现/锁的应用/index.md"), "@site/docs/设计与实现/锁的应用/index.md", require.resolveWeak("@site/docs/设计与实现/锁的应用/index.md")], - "plugin---a-74-9d6": [() => import(/* webpackChunkName: "plugin---a-74-9d6" */ "@generated/docusaurus-plugin-content-pages/default/__plugin.json"), "@generated/docusaurus-plugin-content-pages/default/__plugin.json", require.resolveWeak("@generated/docusaurus-plugin-content-pages/default/__plugin.json")], - "plugin---blog-369-22e": [() => import(/* webpackChunkName: "plugin---blog-369-22e" */ "@generated/docusaurus-plugin-content-blog/default/__plugin.json"), "@generated/docusaurus-plugin-content-blog/default/__plugin.json", require.resolveWeak("@generated/docusaurus-plugin-content-blog/default/__plugin.json")], - "plugin---docsaba-d7c": [() => import(/* webpackChunkName: "plugin---docsaba-d7c" */ "@generated/docusaurus-plugin-content-docs/default/__plugin.json"), "@generated/docusaurus-plugin-content-docs/default/__plugin.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/__plugin.json")], - "plugin---docusaurus-debugb-38-ad3": [() => import(/* webpackChunkName: "plugin---docusaurus-debugb-38-ad3" */ "@generated/docusaurus-plugin-debug/default/__plugin.json"), "@generated/docusaurus-plugin-debug/default/__plugin.json", require.resolveWeak("@generated/docusaurus-plugin-debug/default/__plugin.json")], - "sidebar---blog-814-8ac": [() => import(/* webpackChunkName: "sidebar---blog-814-8ac" */ "~blog/default/blog-post-list-prop-default.json"), "~blog/default/blog-post-list-prop-default.json", require.resolveWeak("~blog/default/blog-post-list-prop-default.json")],}; + "0058b4c6": [() => import(/* webpackChunkName: "0058b4c6" */ "@generated/docusaurus-plugin-content-docs/default/p/docs-175.json"), "@generated/docusaurus-plugin-content-docs/default/p/docs-175.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/docs-175.json")], + "03ab4acf": [() => import(/* webpackChunkName: "03ab4acf" */ "@site/docs/使用与运维/Pika 最佳实践/index.md"), "@site/docs/使用与运维/Pika 最佳实践/index.md", require.resolveWeak("@site/docs/使用与运维/Pika 最佳实践/index.md")], + "063090b1": [() => import(/* webpackChunkName: "063090b1" */ "@site/docs/使用与运维/自动容灾/index.md"), "@site/docs/使用与运维/自动容灾/index.md", require.resolveWeak("@site/docs/使用与运维/自动容灾/index.md")], + "06983a96": [() => import(/* webpackChunkName: "06983a96" */ "@site/docs/使用与运维/副本一致性(使用文档)/index.md"), "@site/docs/使用与运维/副本一致性(使用文档)/index.md", require.resolveWeak("@site/docs/使用与运维/副本一致性(使用文档)/index.md")], + "07f9788a": [() => import(/* webpackChunkName: "07f9788a" */ "@site/docs/序言/支持的 Redis 接口与兼容情况/index.md"), "@site/docs/序言/支持的 Redis 接口与兼容情况/index.md", require.resolveWeak("@site/docs/序言/支持的 Redis 接口与兼容情况/index.md")], + "107669ab": [() => import(/* webpackChunkName: "107669ab" */ "@site/docs/设计与实现/Pika 与 Codis/index.md"), "@site/docs/设计与实现/Pika 与 Codis/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 与 Codis/index.md")], + "1174a4a6": [() => import(/* webpackChunkName: "1174a4a6" */ "@site/docs/性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/index.md"), "@site/docs/性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/index.md", require.resolveWeak("@site/docs/性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/index.md")], + "14c2ce36": [() => import(/* webpackChunkName: "14c2ce36" */ "@site/docs/使用与运维/分布式模式简单教程/index.md"), "@site/docs/使用与运维/分布式模式简单教程/index.md", require.resolveWeak("@site/docs/使用与运维/分布式模式简单教程/index.md")], + "15d8eb8d": [() => import(/* webpackChunkName: "15d8eb8d" */ "@site/docs/设计与实现/增量同步/index.md"), "@site/docs/设计与实现/增量同步/index.md", require.resolveWeak("@site/docs/设计与实现/增量同步/index.md")], + "17896441": [() => import(/* webpackChunkName: "17896441" */ "@theme/DocItem"), "@theme/DocItem", require.resolveWeak("@theme/DocItem")], + "1845589b": [() => import(/* webpackChunkName: "1845589b" */ "@site/docs/设计与实现/整体技术架构/index.md"), "@site/docs/设计与实现/整体技术架构/index.md", require.resolveWeak("@site/docs/设计与实现/整体技术架构/index.md")], + "1b3a196b": [() => import(/* webpackChunkName: "1b3a196b" */ "@site/docs/使用与运维/数据目录/index.md"), "@site/docs/使用与运维/数据目录/index.md", require.resolveWeak("@site/docs/使用与运维/数据目录/index.md")], + "2571fc76": [() => import(/* webpackChunkName: "2571fc76" */ "@site/blog/2023-08-25-Pika-3.5.0.md?truncated=true"), "@site/blog/2023-08-25-Pika-3.5.0.md?truncated=true", require.resolveWeak("@site/blog/2023-08-25-Pika-3.5.0.md?truncated=true")], + "2859d2fb": [() => import(/* webpackChunkName: "2859d2fb" */ "@site/blog/2023-08-25-Pika-3.5.0.md"), "@site/blog/2023-08-25-Pika-3.5.0.md", require.resolveWeak("@site/blog/2023-08-25-Pika-3.5.0.md")], + "29ba892c": [() => import(/* webpackChunkName: "29ba892c" */ "@site/docs/使用与运维/page info 信息说明/index.md"), "@site/docs/使用与运维/page info 信息说明/index.md", require.resolveWeak("@site/docs/使用与运维/page info 信息说明/index.md")], + "2c217be1": [() => import(/* webpackChunkName: "2c217be1" */ "@site/blog/2024-03-27-Pika-3.5.3.md"), "@site/blog/2024-03-27-Pika-3.5.3.md", require.resolveWeak("@site/blog/2024-03-27-Pika-3.5.3.md")], + "2fcac357": [() => import(/* webpackChunkName: "2fcac357" */ "@site/docs/设计与实现/Pika 传火计划/主从同步/index.md"), "@site/docs/设计与实现/Pika 传火计划/主从同步/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 传火计划/主从同步/index.md")], + "30dc2be3": [() => import(/* webpackChunkName: "30dc2be3" */ "@site/docs/性能与优化/Pika 3.5 参数优化手册/index.md"), "@site/docs/性能与优化/Pika 3.5 参数优化手册/index.md", require.resolveWeak("@site/docs/性能与优化/Pika 3.5 参数优化手册/index.md")], + "36994c47": [() => import(/* webpackChunkName: "36994c47" */ "@generated/docusaurus-plugin-content-blog/default/__plugin.json"), "@generated/docusaurus-plugin-content-blog/default/__plugin.json", require.resolveWeak("@generated/docusaurus-plugin-content-blog/default/__plugin.json")], + "38236c5e": [() => import(/* webpackChunkName: "38236c5e" */ "@site/docs/序言/简介/index.md"), "@site/docs/序言/简介/index.md", require.resolveWeak("@site/docs/序言/简介/index.md")], + "4061d127": [() => import(/* webpackChunkName: "4061d127" */ "@site/docs/设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/index.md"), "@site/docs/设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/index.md")], + "43fd4db6": [() => import(/* webpackChunkName: "43fd4db6" */ "@site/docs/设计与实现/全同步/index.md"), "@site/docs/设计与实现/全同步/index.md", require.resolveWeak("@site/docs/设计与实现/全同步/index.md")], + "49fb2c28": [() => import(/* webpackChunkName: "49fb2c28" */ "@site/docs/使用与运维/订阅/index.md"), "@site/docs/使用与运维/订阅/index.md", require.resolveWeak("@site/docs/使用与运维/订阅/index.md")], + "569b9636": [() => import(/* webpackChunkName: "569b9636" */ "@site/blog/2020-7-16-pika-blackwidow.md"), "@site/blog/2020-7-16-pika-blackwidow.md", require.resolveWeak("@site/blog/2020-7-16-pika-blackwidow.md")], + "56a9bc23": [() => import(/* webpackChunkName: "56a9bc23" */ "@site/blog/2024-05-16-Pika-3.5.4.md?truncated=true"), "@site/blog/2024-05-16-Pika-3.5.4.md?truncated=true", require.resolveWeak("@site/blog/2024-05-16-Pika-3.5.4.md?truncated=true")], + "5845532a": [() => import(/* webpackChunkName: "5845532a" */ "@site/blog/2024-07-08-PikiwiDB(Pika)-4.0.0.md?truncated=true"), "@site/blog/2024-07-08-PikiwiDB(Pika)-4.0.0.md?truncated=true", require.resolveWeak("@site/blog/2024-07-08-PikiwiDB(Pika)-4.0.0.md?truncated=true")], + "5e95c892": [() => import(/* webpackChunkName: "5e95c892" */ "@theme/DocsRoot"), "@theme/DocsRoot", require.resolveWeak("@theme/DocsRoot")], + "5e9f5e1a": [() => import(/* webpackChunkName: "5e9f5e1a" */ "@generated/docusaurus.config"), "@generated/docusaurus.config", require.resolveWeak("@generated/docusaurus.config")], + "6533aa10": [() => import(/* webpackChunkName: "6533aa10" */ "@site/docs/设计与实现/副本一致性/index.md"), "@site/docs/设计与实现/副本一致性/index.md", require.resolveWeak("@site/docs/设计与实现/副本一致性/index.md")], + "65ee69ef": [() => import(/* webpackChunkName: "65ee69ef" */ "@site/docs/设计与实现/主从同步/index.md"), "@site/docs/设计与实现/主从同步/index.md", require.resolveWeak("@site/docs/设计与实现/主从同步/index.md")], + "6edb4994": [() => import(/* webpackChunkName: "6edb4994" */ "@site/blog/2024-05-16-Pika-3.5.4.md"), "@site/blog/2024-05-16-Pika-3.5.4.md", require.resolveWeak("@site/blog/2024-05-16-Pika-3.5.4.md")], + "7074118c": [() => import(/* webpackChunkName: "7074118c" */ "@site/docs/性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/index.md"), "@site/docs/性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/index.md", require.resolveWeak("@site/docs/性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/index.md")], + "70e8c784": [() => import(/* webpackChunkName: "70e8c784" */ "@site/docs/设计与实现/Pika 源码学习笔记/通信和线程模型/index.md"), "@site/docs/设计与实现/Pika 源码学习笔记/通信和线程模型/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 源码学习笔记/通信和线程模型/index.md")], + "7777193d": [() => import(/* webpackChunkName: "7777193d" */ "@site/docs/使用与运维/副本一致性(设计文档)/index.md"), "@site/docs/使用与运维/副本一致性(设计文档)/index.md", require.resolveWeak("@site/docs/使用与运维/副本一致性(设计文档)/index.md")], + "814f3328": [() => import(/* webpackChunkName: "814f3328" */ "~blog/default/blog-post-list-prop-default.json"), "~blog/default/blog-post-list-prop-default.json", require.resolveWeak("~blog/default/blog-post-list-prop-default.json")], + "82bececd": [() => import(/* webpackChunkName: "82bececd" */ "@site/docs/使用与运维/多库版命令/index.md"), "@site/docs/使用与运维/多库版命令/index.md", require.resolveWeak("@site/docs/使用与运维/多库版命令/index.md")], + "87292243": [() => import(/* webpackChunkName: "87292243" */ "@site/docs/设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/index.md"), "@site/docs/设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/index.md")], + "878f190b": [() => import(/* webpackChunkName: "878f190b" */ "@site/blog/2024-07-08-PikiwiDB(Pika)-4.0.0.md"), "@site/blog/2024-07-08-PikiwiDB(Pika)-4.0.0.md", require.resolveWeak("@site/blog/2024-07-08-PikiwiDB(Pika)-4.0.0.md")], + "8ad00878": [() => import(/* webpackChunkName: "8ad00878" */ "@site/docs/设计与实现/新存储结构/index.md"), "@site/docs/设计与实现/新存储结构/index.md", require.resolveWeak("@site/docs/设计与实现/新存储结构/index.md")], + "8cf6d7a7": [() => import(/* webpackChunkName: "8cf6d7a7" */ "@site/blog/2023-09-28-Pika-3.5.1.md"), "@site/blog/2023-09-28-Pika-3.5.1.md", require.resolveWeak("@site/blog/2023-09-28-Pika-3.5.1.md")], + "8d7aab24": [() => import(/* webpackChunkName: "8d7aab24" */ "@site/docs/设计与实现/Pika 源码学习笔记/index.md"), "@site/docs/设计与实现/Pika 源码学习笔记/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 源码学习笔记/index.md")], + "937cdc77": [() => import(/* webpackChunkName: "937cdc77" */ "@site/docs/设计与实现/快照式备份/index.md"), "@site/docs/设计与实现/快照式备份/index.md", require.resolveWeak("@site/docs/设计与实现/快照式备份/index.md")], + "94717405": [() => import(/* webpackChunkName: "94717405" */ "@site/docs/序言/FAQ/index.md"), "@site/docs/序言/FAQ/index.md", require.resolveWeak("@site/docs/序言/FAQ/index.md")], + "9805f35a": [() => import(/* webpackChunkName: "9805f35a" */ "@site/docs/序言/index.md"), "@site/docs/序言/index.md", require.resolveWeak("@site/docs/序言/index.md")], + "9994e0b3": [() => import(/* webpackChunkName: "9994e0b3" */ "@site/docs/设计与实现/index.md"), "@site/docs/设计与实现/index.md", require.resolveWeak("@site/docs/设计与实现/index.md")], + "9b4df08c": [() => import(/* webpackChunkName: "9b4df08c" */ "@site/docs/设计与实现/Pika 传火计划/index.md"), "@site/docs/设计与实现/Pika 传火计划/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 传火计划/index.md")], + "9e4087bc": [() => import(/* webpackChunkName: "9e4087bc" */ "@theme/BlogArchivePage"), "@theme/BlogArchivePage", require.resolveWeak("@theme/BlogArchivePage")], + "a3821efb": [() => import(/* webpackChunkName: "a3821efb" */ "@site/docs/设计与实现/Pika 传火计划/线程模型/index.md"), "@site/docs/设计与实现/Pika 传火计划/线程模型/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 传火计划/线程模型/index.md")], + "a5dfed40": [() => import(/* webpackChunkName: "a5dfed40" */ "@site/blog/2024-03-27-Pika-3.5.3.md?truncated=true"), "@site/blog/2024-03-27-Pika-3.5.3.md?truncated=true", require.resolveWeak("@site/blog/2024-03-27-Pika-3.5.3.md?truncated=true")], + "a605574d": [() => import(/* webpackChunkName: "a605574d" */ "@site/docs/设计与实现/Pika 源码学习笔记/PubSub 机制/index.md"), "@site/docs/设计与实现/Pika 源码学习笔记/PubSub 机制/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 源码学习笔记/PubSub 机制/index.md")], + "a6aa9e1f": [() => import(/* webpackChunkName: "a6aa9e1f" */ "@theme/BlogListPage"), "@theme/BlogListPage", require.resolveWeak("@theme/BlogListPage")], + "a7456010": [() => import(/* webpackChunkName: "a7456010" */ "@generated/docusaurus-plugin-content-pages/default/__plugin.json"), "@generated/docusaurus-plugin-content-pages/default/__plugin.json", require.resolveWeak("@generated/docusaurus-plugin-content-pages/default/__plugin.json")], + "a74ce679": [() => import(/* webpackChunkName: "a74ce679" */ "@site/docs/性能与优化/index.md"), "@site/docs/性能与优化/index.md", require.resolveWeak("@site/docs/性能与优化/index.md")], + "a7776ad8": [() => import(/* webpackChunkName: "a7776ad8" */ "@site/docs/使用与运维/分片教程/index.md"), "@site/docs/使用与运维/分片教程/index.md", require.resolveWeak("@site/docs/使用与运维/分片教程/index.md")], + "a7bd4aaa": [() => import(/* webpackChunkName: "a7bd4aaa" */ "@theme/DocVersionRoot"), "@theme/DocVersionRoot", require.resolveWeak("@theme/DocVersionRoot")], + "a94703ab": [() => import(/* webpackChunkName: "a94703ab" */ "@theme/DocRoot"), "@theme/DocRoot", require.resolveWeak("@theme/DocRoot")], + "a950bb08": [() => import(/* webpackChunkName: "a950bb08" */ "@site/docs/设计与实现/Pika 传火计划/读写流程/index.md"), "@site/docs/设计与实现/Pika 传火计划/读写流程/index.md", require.resolveWeak("@site/docs/设计与实现/Pika 传火计划/读写流程/index.md")], + "ab946cbc": [() => import(/* webpackChunkName: "ab946cbc" */ "@site/docs/设计与实现/旧存储结构/index.md"), "@site/docs/设计与实现/旧存储结构/index.md", require.resolveWeak("@site/docs/设计与实现/旧存储结构/index.md")], + "aba21aa0": [() => import(/* webpackChunkName: "aba21aa0" */ "@generated/docusaurus-plugin-content-docs/default/__plugin.json"), "@generated/docusaurus-plugin-content-docs/default/__plugin.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/__plugin.json")], + "acecf23e": [() => import(/* webpackChunkName: "acecf23e" */ "~blog/default/blogMetadata-default.json"), "~blog/default/blogMetadata-default.json", require.resolveWeak("~blog/default/blogMetadata-default.json")], + "adc1ab20": [() => import(/* webpackChunkName: "adc1ab20" */ "@site/docs/性能与优化/3.2.x 性能/index.md"), "@site/docs/性能与优化/3.2.x 性能/index.md", require.resolveWeak("@site/docs/性能与优化/3.2.x 性能/index.md")], + "ae7197e3": [() => import(/* webpackChunkName: "ae7197e3" */ "@site/docs/使用与运维/差异化命令/index.md"), "@site/docs/使用与运维/差异化命令/index.md", require.resolveWeak("@site/docs/使用与运维/差异化命令/index.md")], + "affdd1e0": [() => import(/* webpackChunkName: "affdd1e0" */ "@site/docs/开发文档/coding-style/index.md"), "@site/docs/开发文档/coding-style/index.md", require.resolveWeak("@site/docs/开发文档/coding-style/index.md")], + "b50c085f": [() => import(/* webpackChunkName: "b50c085f" */ "@site/docs/设计与实现/锁的应用/index.md"), "@site/docs/设计与实现/锁的应用/index.md", require.resolveWeak("@site/docs/设计与实现/锁的应用/index.md")], + "bb6459ea": [() => import(/* webpackChunkName: "bb6459ea" */ "@site/docs/性能与优化/Pika 优化案例/index.md"), "@site/docs/性能与优化/Pika 优化案例/index.md", require.resolveWeak("@site/docs/性能与优化/Pika 优化案例/index.md")], + "bbb97d2b": [() => import(/* webpackChunkName: "bbb97d2b" */ "@site/docs/性能与优化/Pika 内存使用/index.md"), "@site/docs/性能与优化/Pika 内存使用/index.md", require.resolveWeak("@site/docs/性能与优化/Pika 内存使用/index.md")], + "c15d9823": [() => import(/* webpackChunkName: "c15d9823" */ "@generated/docusaurus-plugin-content-blog/default/p/blog-bd9.json"), "@generated/docusaurus-plugin-content-blog/default/p/blog-bd9.json", require.resolveWeak("@generated/docusaurus-plugin-content-blog/default/p/blog-bd9.json")], + "c3d344d9": [() => import(/* webpackChunkName: "c3d344d9" */ "@site/docs/设计与实现/NoSQL 原理概述/index.md"), "@site/docs/设计与实现/NoSQL 原理概述/index.md", require.resolveWeak("@site/docs/设计与实现/NoSQL 原理概述/index.md")], + "c4f5d8e4": [() => import(/* webpackChunkName: "c4f5d8e4" */ "@site/src/pages/index.js"), "@site/src/pages/index.js", require.resolveWeak("@site/src/pages/index.js")], + "c6bc127f": [() => import(/* webpackChunkName: "c6bc127f" */ "@site/docs/使用与运维/配置文件说明/index.md"), "@site/docs/使用与运维/配置文件说明/index.md", require.resolveWeak("@site/docs/使用与运维/配置文件说明/index.md")], + "c823c29b": [() => import(/* webpackChunkName: "c823c29b" */ "@site/blog/2020-04-26-Pika-Tools-Port-Bin.md?truncated=true"), "@site/blog/2020-04-26-Pika-Tools-Port-Bin.md?truncated=true", require.resolveWeak("@site/blog/2020-04-26-Pika-Tools-Port-Bin.md?truncated=true")], + "c8b8756d": [() => import(/* webpackChunkName: "c8b8756d" */ "@site/blog/2020-7-16-pika-blackwidow.md?truncated=true"), "@site/blog/2020-7-16-pika-blackwidow.md?truncated=true", require.resolveWeak("@site/blog/2020-7-16-pika-blackwidow.md?truncated=true")], + "ccc49370": [() => import(/* webpackChunkName: "ccc49370" */ "@theme/BlogPostPage"), "@theme/BlogPostPage", require.resolveWeak("@theme/BlogPostPage")], + "d049632c": [() => import(/* webpackChunkName: "d049632c" */ "@site/docs/设计与实现/新存储方案:详细解析/index.md"), "@site/docs/设计与实现/新存储方案:详细解析/index.md", require.resolveWeak("@site/docs/设计与实现/新存储方案:详细解析/index.md")], + "d126de26": [() => import(/* webpackChunkName: "d126de26" */ "@site/docs/使用与运维/安装使用/index.md"), "@site/docs/使用与运维/安装使用/index.md", require.resolveWeak("@site/docs/使用与运维/安装使用/index.md")], + "e13eafd3": [() => import(/* webpackChunkName: "e13eafd3" */ "@site/docs/使用与运维/管理指令/index.md"), "@site/docs/使用与运维/管理指令/index.md", require.resolveWeak("@site/docs/使用与运维/管理指令/index.md")], + "e60cd9a4": [() => import(/* webpackChunkName: "e60cd9a4" */ "@site/docs/开发文档/编码规范/index.md"), "@site/docs/开发文档/编码规范/index.md", require.resolveWeak("@site/docs/开发文档/编码规范/index.md")], + "e85952ae": [() => import(/* webpackChunkName: "e85952ae" */ "@site/docs/设计与实现/线程模型/index.md"), "@site/docs/设计与实现/线程模型/index.md", require.resolveWeak("@site/docs/设计与实现/线程模型/index.md")], + "ea50f5f5": [() => import(/* webpackChunkName: "ea50f5f5" */ "@site/blog/2023-09-28-Pika-3.5.1.md?truncated=true"), "@site/blog/2023-09-28-Pika-3.5.1.md?truncated=true", require.resolveWeak("@site/blog/2023-09-28-Pika-3.5.1.md?truncated=true")], + "eb808821": [() => import(/* webpackChunkName: "eb808821" */ "@site/docs/性能与优化/Redis 与 Pika scan 性能对比/index.md"), "@site/docs/性能与优化/Redis 与 Pika scan 性能对比/index.md", require.resolveWeak("@site/docs/性能与优化/Redis 与 Pika scan 性能对比/index.md")], + "f7836a87": [() => import(/* webpackChunkName: "f7836a87" */ "@site/blog/2023-12-03-Pika-3.5.2.md"), "@site/blog/2023-12-03-Pika-3.5.2.md", require.resolveWeak("@site/blog/2023-12-03-Pika-3.5.2.md")], + "f81c1134": [() => import(/* webpackChunkName: "f81c1134" */ "@generated/docusaurus-plugin-content-blog/default/p/blog-archive-f05.json"), "@generated/docusaurus-plugin-content-blog/default/p/blog-archive-f05.json", require.resolveWeak("@generated/docusaurus-plugin-content-blog/default/p/blog-archive-f05.json")], + "fac0ae3c": [() => import(/* webpackChunkName: "fac0ae3c" */ "@site/docs/开发文档/index.md"), "@site/docs/开发文档/index.md", require.resolveWeak("@site/docs/开发文档/index.md")], + "fdbae498": [() => import(/* webpackChunkName: "fdbae498" */ "@site/blog/2020-04-26-Pika-Tools-Port-Bin.md"), "@site/blog/2020-04-26-Pika-Tools-Port-Bin.md", require.resolveWeak("@site/blog/2020-04-26-Pika-Tools-Port-Bin.md")], + "fdc83c8b": [() => import(/* webpackChunkName: "fdc83c8b" */ "@site/docs/使用与运维/服务器状态监控/index.md"), "@site/docs/使用与运维/服务器状态监控/index.md", require.resolveWeak("@site/docs/使用与运维/服务器状态监控/index.md")], + "ffc6e5ef": [() => import(/* webpackChunkName: "ffc6e5ef" */ "@site/docs/使用与运维/index.md"), "@site/docs/使用与运维/index.md", require.resolveWeak("@site/docs/使用与运维/index.md")],}; diff --git a/.docusaurus/routes.js b/.docusaurus/routes.js index 775f577..1f070df 100644 --- a/.docusaurus/routes.js +++ b/.docusaurus/routes.js @@ -2,41 +2,6 @@ import React from 'react'; import ComponentCreator from '@docusaurus/ComponentCreator'; export default [ - { - path: '/__docusaurus/debug', - component: ComponentCreator('/__docusaurus/debug', '5ff'), - exact: true - }, - { - path: '/__docusaurus/debug/config', - component: ComponentCreator('/__docusaurus/debug/config', '5ba'), - exact: true - }, - { - path: '/__docusaurus/debug/content', - component: ComponentCreator('/__docusaurus/debug/content', 'a2b'), - exact: true - }, - { - path: '/__docusaurus/debug/globalData', - component: ComponentCreator('/__docusaurus/debug/globalData', 'c3c'), - exact: true - }, - { - path: '/__docusaurus/debug/metadata', - component: ComponentCreator('/__docusaurus/debug/metadata', '156'), - exact: true - }, - { - path: '/__docusaurus/debug/registry', - component: ComponentCreator('/__docusaurus/debug/registry', '88c'), - exact: true - }, - { - path: '/__docusaurus/debug/routes', - component: ComponentCreator('/__docusaurus/debug/routes', '000'), - exact: true - }, { path: '/blog', component: ComponentCreator('/blog', 'b7e'), @@ -89,15 +54,15 @@ export default [ }, { path: '/docs', - component: ComponentCreator('/docs', '3c2'), + component: ComponentCreator('/docs', 'c12'), routes: [ { path: '/docs', - component: ComponentCreator('/docs', '708'), + component: ComponentCreator('/docs', 'fcc'), routes: [ { path: '/docs', - component: ComponentCreator('/docs', '7e3'), + component: ComponentCreator('/docs', '6ad'), routes: [ { path: '/docs/使用与运维/', @@ -141,30 +106,6 @@ export default [ exact: true, sidebar: "tutorialSidebar" }, - { - path: '/docs/使用与运维/升级指南/', - component: ComponentCreator('/docs/使用与运维/升级指南/', '9cf'), - exact: true, - sidebar: "tutorialSidebar" - }, - { - path: '/docs/使用与运维/升级指南/如何升级到 Pika 3.0/', - component: ComponentCreator('/docs/使用与运维/升级指南/如何升级到 Pika 3.0/', 'bc4'), - exact: true, - sidebar: "tutorialSidebar" - }, - { - path: '/docs/使用与运维/升级指南/如何升级到 Pika 3.1 或 3.2/', - component: ComponentCreator('/docs/使用与运维/升级指南/如何升级到 Pika 3.1 或 3.2/', 'f12'), - exact: true, - sidebar: "tutorialSidebar" - }, - { - path: '/docs/使用与运维/升级指南/如何将 Pika 3.3.6 升级到 Pika 3.5/', - component: ComponentCreator('/docs/使用与运维/升级指南/如何将 Pika 3.3.6 升级到 Pika 3.5/', 'b2f'), - exact: true, - sidebar: "tutorialSidebar" - }, { path: '/docs/使用与运维/多库版命令/', component: ComponentCreator('/docs/使用与运维/多库版命令/', '3c5'), diff --git a/.docusaurus/routesChunkNames.json b/.docusaurus/routesChunkNames.json index 7989c46..337fc27 100644 --- a/.docusaurus/routesChunkNames.json +++ b/.docusaurus/routesChunkNames.json @@ -1,426 +1,367 @@ { - "/__docusaurus/debug-5ff": { - "__comp": "__comp---theme-debug-config-23-a-2ff", - "__context": { - "plugin": "plugin---docusaurus-debugb-38-ad3" - } - }, - "/__docusaurus/debug/config-5ba": { - "__comp": "__comp---theme-debug-config-23-a-2ff", - "__context": { - "plugin": "plugin---docusaurus-debugb-38-ad3" - } - }, - "/__docusaurus/debug/content-a2b": { - "__comp": "__comp---theme-debug-contentba-8-ce7", - "__context": { - "plugin": "plugin---docusaurus-debugb-38-ad3" - }, - "__props": "__props---docusaurus-debug-content-3-c-0-be2" - }, - "/__docusaurus/debug/globalData-c3c": { - "__comp": "__comp---theme-debug-global-dataede-0fa", - "__context": { - "plugin": "plugin---docusaurus-debugb-38-ad3" - } - }, - "/__docusaurus/debug/metadata-156": { - "__comp": "__comp---theme-debug-site-metadata-68-e-3d4", - "__context": { - "plugin": "plugin---docusaurus-debugb-38-ad3" - } - }, - "/__docusaurus/debug/registry-88c": { - "__comp": "__comp---theme-debug-registry-679-501", - "__context": { - "plugin": "plugin---docusaurus-debugb-38-ad3" - } - }, - "/__docusaurus/debug/routes-000": { - "__comp": "__comp---theme-debug-routes-946-699", - "__context": { - "plugin": "plugin---docusaurus-debugb-38-ad3" - } - }, "/blog-b7e": { - "__comp": "__comp---theme-blog-list-pagea-6-a-7ba", + "__comp": "a6aa9e1f", "__context": { - "plugin": "plugin---blog-369-22e" + "plugin": "36994c47" }, - "sidebar": "sidebar---blog-814-8ac", + "sidebar": "814f3328", "items": [ { - "content": "content---blog-584-5d9" + "content": "5845532a" }, { - "content": "content---blog-56-a-a4f" + "content": "56a9bc23" }, { - "content": "content---bloga-5-d-ef5" + "content": "a5dfed40" }, { - "content": "content---blog-257-76c" + "content": "2571fc76" }, { - "content": "content---blogea-5-4d3" + "content": "ea50f5f5" }, { - "content": "content---blog-257-76c" + "content": "2571fc76" }, { - "content": "content---blogc-8-b-001" + "content": "c8b8756d" }, { - "content": "content---blogc-82-eb2" + "content": "c823c29b" } ], - "__props": "__props---blogc-15-573" + "__props": "c15d9823" }, "/blog/archive-182": { - "__comp": "__comp---theme-blog-archive-page-9-e-4-1d8", + "__comp": "9e4087bc", "__context": { - "plugin": "plugin---blog-369-22e" + "plugin": "36994c47" }, - "__props": "__props---blog-archivef-81-229" + "__props": "f81c1134" }, "/blog/Pika-3.5.0-eeb": { - "__comp": "__comp---theme-blog-post-pageccc-cab", + "__comp": "ccc49370", "__context": { "data": { - "blogMetadata": "blogMetadata---blog-pika-3-5-0-ace-104" + "blogMetadata": "acecf23e" }, - "plugin": "plugin---blog-369-22e" + "plugin": "36994c47" }, - "sidebar": "sidebar---blog-814-8ac", - "content": "content---blog-pika-3-5-0-f-78-463" + "sidebar": "814f3328", + "content": "f7836a87" }, "/blog/Pika-3.5.0-104": { - "__comp": "__comp---theme-blog-post-pageccc-cab", + "__comp": "ccc49370", "__context": { "data": { - "blogMetadata": "blogMetadata---blog-pika-3-5-0-ace-104" + "blogMetadata": "acecf23e" }, - "plugin": "plugin---blog-369-22e" + "plugin": "36994c47" }, - "sidebar": "sidebar---blog-814-8ac", - "content": "content---blog-pika-3-5-0285-851" + "sidebar": "814f3328", + "content": "2859d2fb" }, "/blog/Pika-3.5.1-780": { - "__comp": "__comp---theme-blog-post-pageccc-cab", + "__comp": "ccc49370", "__context": { "data": { - "blogMetadata": "blogMetadata---blog-pika-3-5-0-ace-104" + "blogMetadata": "acecf23e" }, - "plugin": "plugin---blog-369-22e" + "plugin": "36994c47" }, - "sidebar": "sidebar---blog-814-8ac", - "content": "content---blog-pika-3-5-18-cf-c57" + "sidebar": "814f3328", + "content": "8cf6d7a7" }, "/blog/Pika-3.5.3-f4a": { - "__comp": "__comp---theme-blog-post-pageccc-cab", + "__comp": "ccc49370", "__context": { "data": { - "blogMetadata": "blogMetadata---blog-pika-3-5-0-ace-104" + "blogMetadata": "acecf23e" }, - "plugin": "plugin---blog-369-22e" + "plugin": "36994c47" }, - "sidebar": "sidebar---blog-814-8ac", - "content": "content---blog-pika-3-5-32-c-2-37d" + "sidebar": "814f3328", + "content": "2c217be1" }, "/blog/Pika-3.5.4-7a0": { - "__comp": "__comp---theme-blog-post-pageccc-cab", + "__comp": "ccc49370", "__context": { "data": { - "blogMetadata": "blogMetadata---blog-pika-3-5-0-ace-104" + "blogMetadata": "acecf23e" }, - "plugin": "plugin---blog-369-22e" + "plugin": "36994c47" }, - "sidebar": "sidebar---blog-814-8ac", - "content": "content---blog-pika-3-5-46-ed-a64" + "sidebar": "814f3328", + "content": "6edb4994" }, "/blog/pika-blackwidow-396": { - "__comp": "__comp---theme-blog-post-pageccc-cab", + "__comp": "ccc49370", "__context": { "data": { - "blogMetadata": "blogMetadata---blog-pika-3-5-0-ace-104" + "blogMetadata": "acecf23e" }, - "plugin": "plugin---blog-369-22e" + "plugin": "36994c47" }, - "sidebar": "sidebar---blog-814-8ac", - "content": "content---blog-pika-blackwidow-569-00a" + "sidebar": "814f3328", + "content": "569b9636" }, "/blog/Pika-Tools-Port-Bin-dc3": { - "__comp": "__comp---theme-blog-post-pageccc-cab", + "__comp": "ccc49370", "__context": { "data": { - "blogMetadata": "blogMetadata---blog-pika-3-5-0-ace-104" + "blogMetadata": "acecf23e" }, - "plugin": "plugin---blog-369-22e" + "plugin": "36994c47" }, - "sidebar": "sidebar---blog-814-8ac", - "content": "content---blog-pika-tools-port-binfdb-f2f" + "sidebar": "814f3328", + "content": "fdbae498" }, "/blog/PikiwiDB-Pika--4.0.0-c12": { - "__comp": "__comp---theme-blog-post-pageccc-cab", + "__comp": "ccc49370", "__context": { "data": { - "blogMetadata": "blogMetadata---blog-pika-3-5-0-ace-104" + "blogMetadata": "acecf23e" }, - "plugin": "plugin---blog-369-22e" + "plugin": "36994c47" }, - "sidebar": "sidebar---blog-814-8ac", - "content": "content---blog-pikiwi-db-pika-4-0-0878-7df" + "sidebar": "814f3328", + "content": "878f190b" }, - "/docs-3c2": { - "__comp": "__comp---theme-docs-root-5-e-9-0b6", + "/docs-c12": { + "__comp": "5e95c892", "__context": { - "plugin": "plugin---docsaba-d7c" + "plugin": "aba21aa0" } }, - "/docs-708": { - "__comp": "__comp---theme-doc-version-roota-7-b-5de", - "__props": "__props---docs-005-788" + "/docs-fcc": { + "__comp": "a7bd4aaa", + "__props": "0058b4c6" }, - "/docs-7e3": { - "__comp": "__comp---theme-doc-roota-94-67a" + "/docs-6ad": { + "__comp": "a94703ab" }, "/docs/使用与运维/-5f5": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-使用与运维-ffc-db3" + "__comp": "17896441", + "content": "ffc6e5ef" }, "/docs/使用与运维/page info 信息说明/-eef": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-使用与运维-page-info-信息说明-29-b-211" + "__comp": "17896441", + "content": "29ba892c" }, "/docs/使用与运维/Pika 最佳实践/-5e2": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-使用与运维-pika-最佳实践-03-a-1d2" + "__comp": "17896441", + "content": "03ab4acf" }, "/docs/使用与运维/分布式模式简单教程/-3df": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-使用与运维-分布式模式简单教程-14-c-ccb" + "__comp": "17896441", + "content": "14c2ce36" }, "/docs/使用与运维/分片教程/-c6b": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-使用与运维-分片教程-a-77-8a8" + "__comp": "17896441", + "content": "a7776ad8" }, "/docs/使用与运维/副本一致性(使用文档)/-e86": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-使用与运维-副本一致性(使用文档)-069-951" + "__comp": "17896441", + "content": "06983a96" }, "/docs/使用与运维/副本一致性(设计文档)/-b1e": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-使用与运维-副本一致性(设计文档)-777-06f" - }, - "/docs/使用与运维/升级指南/-9cf": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-使用与运维-升级指南-169-a10" - }, - "/docs/使用与运维/升级指南/如何升级到 Pika 3.0/-bc4": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-使用与运维-升级指南-如何升级到-pika-3-0-28-d-9db" - }, - "/docs/使用与运维/升级指南/如何升级到 Pika 3.1 或 3.2/-f12": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-使用与运维-升级指南-如何升级到-pika-3-1-或-3-2-bd-3-67d" - }, - "/docs/使用与运维/升级指南/如何将 Pika 3.3.6 升级到 Pika 3.5/-b2f": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-使用与运维-升级指南-如何将-pika-3-3-6-升级到-pika-3-5-7-bd-d98" + "__comp": "17896441", + "content": "7777193d" }, "/docs/使用与运维/多库版命令/-3c5": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-使用与运维-多库版命令-82-b-abe" + "__comp": "17896441", + "content": "82bececd" }, "/docs/使用与运维/安装使用/-3a0": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-使用与运维-安装使用-d-12-a8f" + "__comp": "17896441", + "content": "d126de26" }, "/docs/使用与运维/差异化命令/-fcf": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-使用与运维-差异化命令-ae-7-c24" + "__comp": "17896441", + "content": "ae7197e3" }, "/docs/使用与运维/数据目录/-d15": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-使用与运维-数据目录-1-b-3-f3a" + "__comp": "17896441", + "content": "1b3a196b" }, "/docs/使用与运维/服务器状态监控/-a79": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-使用与运维-服务器状态监控-fdc-11a" + "__comp": "17896441", + "content": "fdc83c8b" }, "/docs/使用与运维/管理指令/-0bc": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-使用与运维-管理指令-e-13-386" + "__comp": "17896441", + "content": "e13eafd3" }, "/docs/使用与运维/自动容灾/-1d2": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-使用与运维-自动容灾-063-450" + "__comp": "17896441", + "content": "063090b1" }, "/docs/使用与运维/订阅/-18e": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-使用与运维-订阅-49-f-59e" + "__comp": "17896441", + "content": "49fb2c28" }, "/docs/使用与运维/配置文件说明/-17b": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-使用与运维-配置文件说明-c-6-b-bc2" + "__comp": "17896441", + "content": "c6bc127f" }, "/docs/序言/-db5": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-序言-980-c58" + "__comp": "17896441", + "content": "9805f35a" }, "/docs/序言/FAQ/-b59": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-序言-faq-947-fab" + "__comp": "17896441", + "content": "94717405" }, "/docs/序言/支持的 Redis 接口与兼容情况/-10f": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-序言-支持的-redis-接口与兼容情况-07-f-422" + "__comp": "17896441", + "content": "07f9788a" }, "/docs/序言/简介/-70a": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-序言-简介-382-f9d" + "__comp": "17896441", + "content": "38236c5e" }, "/docs/开发文档/-7cf": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-开发文档-fac-613" + "__comp": "17896441", + "content": "fac0ae3c" }, "/docs/开发文档/coding-style/-329": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-开发文档-coding-style-aff-bb3" + "__comp": "17896441", + "content": "affdd1e0" }, "/docs/开发文档/编码规范/-f7c": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-开发文档-编码规范-e-60-647" + "__comp": "17896441", + "content": "e60cd9a4" }, "/docs/性能与优化/-fd2": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-性能与优化-a-74-686" + "__comp": "17896441", + "content": "a74ce679" }, "/docs/性能与优化/3.2.x 性能/-b31": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-性能与优化-3-2-x-性能-adc-35c" + "__comp": "17896441", + "content": "adc1ab20" }, "/docs/性能与优化/Pika 3.5 参数优化手册/-e0f": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-性能与优化-pika-3-5-参数优化手册-30-d-264" + "__comp": "17896441", + "content": "30dc2be3" }, "/docs/性能与优化/Pika 优化案例/-088": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-性能与优化-pika-优化案例-bb-6-de3" + "__comp": "17896441", + "content": "bb6459ea" }, "/docs/性能与优化/Pika 优化案例/喜马拉雅 Redis 与 Pika 缓存使用军规/-51b": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-性能与优化-pika-优化案例-喜马拉雅-redis-与-pika-缓存使用军规-117-154" + "__comp": "17896441", + "content": "1174a4a6" }, "/docs/性能与优化/Pika 优化案例/调整 max-write-buffer-size 优化 pika 性能10倍的案例/-d3e": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-性能与优化-pika-优化案例-调整-max-write-buffer-size-优化-pika-性能-10-倍的案例-707-20c" + "__comp": "17896441", + "content": "7074118c" }, "/docs/性能与优化/Pika 内存使用/-c7d": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-性能与优化-pika-内存使用-bbb-e56" + "__comp": "17896441", + "content": "bbb97d2b" }, "/docs/性能与优化/Redis 与 Pika scan 性能对比/-601": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-性能与优化-redis-与-pika-scan-性能对比-eb-8-cb9" + "__comp": "17896441", + "content": "eb808821" }, "/docs/设计与实现/-9ca": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-999-d65" + "__comp": "17896441", + "content": "9994e0b3" }, "/docs/设计与实现/NoSQL 原理概述/-472": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-no-sql-原理概述-c-3-d-c60" + "__comp": "17896441", + "content": "c3d344d9" }, "/docs/设计与实现/Pika 与 Codis/-f53": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-pika-与-codis-107-91d" + "__comp": "17896441", + "content": "107669ab" }, "/docs/设计与实现/Pika 传火计划/-2f6": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-pika-传火计划-9-b-4-152" + "__comp": "17896441", + "content": "9b4df08c" }, "/docs/设计与实现/Pika 传火计划/主从同步/-911": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-pika-传火计划-主从同步-2-fc-1f3" + "__comp": "17896441", + "content": "2fcac357" }, "/docs/设计与实现/Pika 传火计划/线程模型/-6ce": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-pika-传火计划-线程模型-a-38-416" + "__comp": "17896441", + "content": "a3821efb" }, "/docs/设计与实现/Pika 传火计划/读写流程/-5dc": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-pika-传火计划-读写流程-a-95-da7" + "__comp": "17896441", + "content": "a950bb08" }, "/docs/设计与实现/Pika 源码学习笔记/-48f": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-pika-源码学习笔记-8-d-7-499" + "__comp": "17896441", + "content": "8d7aab24" }, "/docs/设计与实现/Pika 源码学习笔记/Pika 和 RockSDB 的对接/-9cf": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-pika-源码学习笔记-pika-和-rock-sdb-的对接-406-8c8" + "__comp": "17896441", + "content": "4061d127" }, "/docs/设计与实现/Pika 源码学习笔记/Pika 的命令执行框架/-26a": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-pika-源码学习笔记-pika-的命令执行框架-872-9d4" + "__comp": "17896441", + "content": "87292243" }, "/docs/设计与实现/Pika 源码学习笔记/PubSub 机制/-e15": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-pika-源码学习笔记-pub-sub-机制-a-60-6d4" + "__comp": "17896441", + "content": "a605574d" }, "/docs/设计与实现/Pika 源码学习笔记/通信和线程模型/-a01": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-pika-源码学习笔记-通信和线程模型-70-e-612" + "__comp": "17896441", + "content": "70e8c784" }, "/docs/设计与实现/主从同步/-4d3": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-主从同步-65-e-b7a" + "__comp": "17896441", + "content": "65ee69ef" }, "/docs/设计与实现/全同步/-248": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-全同步-43-f-30a" + "__comp": "17896441", + "content": "43fd4db6" }, "/docs/设计与实现/副本一致性/-97a": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-副本一致性-653-c24" + "__comp": "17896441", + "content": "6533aa10" }, "/docs/设计与实现/增量同步/-ea1": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-增量同步-15-d-dd0" + "__comp": "17896441", + "content": "15d8eb8d" }, "/docs/设计与实现/快照式备份/-1e5": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-快照式备份-937-ea0" + "__comp": "17896441", + "content": "937cdc77" }, "/docs/设计与实现/整体技术架构/-ccd": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-整体技术架构-184-c0e" + "__comp": "17896441", + "content": "1845589b" }, "/docs/设计与实现/新存储方案:详细解析/-948": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-新存储方案:详细解析-d-04-e36" + "__comp": "17896441", + "content": "d049632c" }, "/docs/设计与实现/新存储结构/-571": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-新存储结构-8-ad-f6a" + "__comp": "17896441", + "content": "8ad00878" }, "/docs/设计与实现/旧存储结构/-f6e": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-旧存储结构-ab-9-b18" + "__comp": "17896441", + "content": "ab946cbc" }, "/docs/设计与实现/线程模型/-334": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-线程模型-e-85-bf0" + "__comp": "17896441", + "content": "e85952ae" }, "/docs/设计与实现/锁的应用/-581": { - "__comp": "__comp---theme-doc-item-178-a40", - "content": "content---docs-设计与实现-锁的应用-b-50-0ea" + "__comp": "17896441", + "content": "b50c085f" }, "/-2e1": { - "__comp": "__comp---site-src-pages-index-jsc-4-f-f99", + "__comp": "c4f5d8e4", "__context": { - "plugin": "plugin---a-74-9d6" + "plugin": "a7456010" }, - "config": "config---5-e-9-4f3" + "config": "5e9f5e1a" } } \ No newline at end of file diff --git a/.docusaurus/site-metadata.json b/.docusaurus/site-metadata.json index b6a40aa..093c9c5 100644 --- a/.docusaurus/site-metadata.json +++ b/.docusaurus/site-metadata.json @@ -17,9 +17,9 @@ "name": "@docusaurus/plugin-content-pages", "version": "3.4.0" }, - "docusaurus-plugin-debug": { + "docusaurus-plugin-sitemap": { "type": "package", - "name": "@docusaurus/plugin-debug", + "name": "@docusaurus/plugin-sitemap", "version": "3.4.0" }, "docusaurus-theme-classic": { diff --git a/build/.nojekyll b/build/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/build/404.html b/build/404.html new file mode 100644 index 0000000..676a0e5 --- /dev/null +++ b/build/404.html @@ -0,0 +1,18 @@ + + + + + +找不到页面 | PikiwiDB(Pika) + + + + + + + + + +
跳到主要内容

找不到页面

我们找不到您要找的页面。

请联系原始链接来源网站的所有者,并告知他们链接已损坏。

+ + \ No newline at end of file diff --git a/build/assets/css/styles.bf00f426.css b/build/assets/css/styles.bf00f426.css new file mode 100644 index 0000000..4f95dd9 --- /dev/null +++ b/build/assets/css/styles.bf00f426.css @@ -0,0 +1 @@ +.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown li,body{word-wrap:break-word}body,ol ol,ol ul,ul ol,ul ul{margin:0}pre,table{overflow:auto}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button,code{vertical-align:middle}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.menu,.navbar-sidebar{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}.clean-list,.containsTaskList_mC6p,.details_lb9f>summary,.dropdown__menu,.menu__list{list-style:none}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:#0000;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:#0000000d;--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 #0000001a;--ifm-global-shadow-md:0 5px 40px #0003;--ifm-global-shadow-tl:0 12px 28px 0 #0003,0 2px 4px 0 #0000001a;--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:#0000;--ifm-table-stripe-background:#00000008;--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.5rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:0.8rem;--ifm-breadcrumb-padding-vertical:0.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-footer-logo-max-width:min(30rem,90vw);--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:0.75rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.125rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem;--docusaurus-progress-bar-color:var(--ifm-color-primary);--ifm-color-primary:#2e8555;--ifm-color-primary-dark:#29784c;--ifm-color-primary-darker:#277148;--ifm-color-primary-darkest:#205d3b;--ifm-color-primary-light:#33925d;--ifm-color-primary-lighter:#359962;--ifm-color-primary-lightest:#3cad6e;--ifm-code-font-size:95%;--docusaurus-highlighted-code-line-bg:#0000001a;--docusaurus-announcement-bar-height:auto;--docusaurus-collapse-button-bg:#0000;--docusaurus-collapse-button-bg-hover:#0000001a;--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300)}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:#0000}*{box-sizing:border-box}html{background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;-webkit-text-size-adjust:100%;text-size-adjust:100%}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none{margin-top:0!important}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.menuExternalLink_NmtK,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid #0000001a;border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:initial;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img{max-width:100%}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table{border-collapse:collapse;display:block;margin-bottom:var(--ifm-spacing-vertical)}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:var(--ifm-blockquote-border-left-width) solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);border:0;height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary,.wordWrapButtonEnabled_EoeP .wordWrapButtonIcon_Bwma{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.admonitionHeading_Gvgb,.alert__heading,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{padding-left:0}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:#3578e526;--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:#ebedf026;--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:#00a40026;--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:#ffba0026;--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:#fa383e26;--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover{opacity:1}.alert a{text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar{column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{border-radius:50%;display:block;height:var(--ifm-avatar-photo-size);overflow:hidden;width:var(--ifm-avatar-photo-size)}.card--full-height,.navbar__logo img,body,html{height:100%}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after{display:inline-block}.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs__link:any-link:hover,.breadcrumbs__link:link:hover,.breadcrumbs__link:visited:hover,area[href].breadcrumbs__link:hover{background:var(--ifm-breadcrumb-item-background-active);text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;-webkit-user-select:none;user-select:none;white-space:nowrap}.button,.button:hover{color:var(--ifm-button-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:#0000;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex;gap:var(--ifm-button-group-spacing)}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column;overflow:hidden}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);text-decoration:none}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus,.theme-code-block-highlighted-line .codeLineNumber_Tfdd:before{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;transform:translateY(-1px);visibility:visible}#nprogress,.dropdown__menu,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.sidebar_re4s,.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem;white-space:nowrap}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color);text-decoration:none}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor #0000;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:var(--ifm-footer-logo-max-width)}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.docItemContainer_Djhp article>:first-child,.docItemContainer_Djhp header+*,.footer__item{margin-top:0}.admonitionContent_BuS1>:last-child,.collapsibleContent_i85q p:last-child,.details_lb9f>summary>p:last-child,.footer__items{margin-bottom:0}.codeBlockStandalone_MEMb,[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title,.title_f1Hy{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item:not(:first-child){margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before,.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before,.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{align-items:center;display:flex}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color);text-decoration:none}.menu__caret:before,.menu__link--sublist-caret:after{content:"";height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;filter:var(--ifm-menu-link-sublist-icon-filter)}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;position:fixed;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;left:0;top:0;visibility:hidden}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.announcementBarContent_xLdY,.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem;margin-right:.5rem}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center .navbar__brand{margin:0}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__items--right>:last-child{padding-right:0}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:#ffffff1a;--ifm-navbar-search-input-placeholder-color:#ffffff80;color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:#ffffff0d;--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:.9rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);transform:translate3d(-100%,0,0);transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar__items{transform:translateZ(0)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar__backdrop{background-color:#0009;right:0;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination{column-gap:var(--ifm-pagination-page-spacing);display:flex;font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);display:inline-block;padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination__link:hover,.sidebarItemLink_mo7H:hover{text-decoration:none}.pagination-nav{display:grid;grid-gap:var(--ifm-spacing-horizontal);gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover);text-decoration:none}.pagination-nav__link--next{grid-column:2/3;text-align:right}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.sidebarItemTitle_pO2u,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs,:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto}.tabs__item{border-bottom:3px solid #0000;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:#ffffff0d;--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:#ffffff1a;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:#ffffff12;--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec}#nprogress .bar{background:var(--docusaurus-progress-bar-color);height:2px;left:0;position:fixed;top:0;width:100%;z-index:1031}#nprogress .peg{box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);height:100%;opacity:1;position:absolute;right:0;transform:rotate(3deg) translateY(-4px);width:100px}[data-theme=dark]{--ifm-color-primary:#25c2a0;--ifm-color-primary-dark:#21af90;--ifm-color-primary-darker:#1fa588;--ifm-color-primary-darkest:#1a8870;--ifm-color-primary-light:#29d5b0;--ifm-color-primary-lighter:#32d8b4;--ifm-color-primary-lightest:#4fddbf;--docusaurus-highlighted-code-line-bg:#0000004d}.backToTopButton_sjWU{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.backToTopButton_sjWU:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_xfvO{opacity:1;transform:scale(1);visibility:visible}.skipToContent_fXgn{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem;z-index:calc(var(--ifm-z-index-fixed) + 1)}.skipToContent_fXgn:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.closeButton_CVFx{line-height:0;padding:0}.content_knG7{font-size:85%;padding:5px 0;text-align:center}.content_knG7 a{color:inherit;text-decoration:underline}.announcementBar_mb4j{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}#__docusaurus-base-url-issue-banner-container,.docSidebarContainer_YfHR,.navbarSearchContainer_Bca1:empty,.sidebarLogo_isFc,.themedComponent_mlkZ,[data-theme=dark] .lightToggleIcon_pyhR,[data-theme=light] .darkToggleIcon_wfgR,html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j{display:none}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{align-self:stretch;flex:0 0 30px}.toggle_vylO{height:2rem;width:2rem}.toggleButton_gllP{align-items:center;border-radius:50%;display:flex;height:100%;justify-content:center;transition:background var(--ifm-transition-fast);width:100%}.toggleButton_gllP:hover{background:var(--ifm-color-emphasis-200)}.toggleButtonDisabled_aARS{cursor:not-allowed}.darkNavbarColorModeToggle_X3D1:hover{background:var(--ifm-color-gray-800)}[data-theme=dark] .themedComponent--dark_xIcU,[data-theme=light] .themedComponent--light_NVdE,html:not([data-theme]) .themedComponent--light_NVdE{display:initial}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}.collapseSidebarButton_PEFL{display:none;margin:0}.iconExternalLink_nPIU{margin-left:.3rem}.docMainContainer_TBSr,.docRoot_UBD9{display:flex;width:100%}.docsWrapper_hBAB{display:flex;flex:1 0 auto}.dropdownNavbarItemMobile_S0Fm{cursor:pointer}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}.navbarHideable_m1mJ{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_jGov{transform:translate3d(0,calc(-100% - 2px),0)}.errorBoundaryError_a6uf{color:red;white-space:pre-wrap}.errorBoundaryFallback_VBag{color:red;padding:.55rem}.footerLogoLink_BH7S{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.footerLogoLink_BH7S:hover,.hash-link:focus,:hover>.hash-link{opacity:1}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}.anchorWithStickyNavbar_LWe7{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_WYt5{scroll-margin-top:.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;user-select:none}.hash-link:before{content:"#"}.mainWrapper_z2l0{display:flex;flex:1 0 auto;flex-direction:column}.docusaurus-mt-lg{margin-top:3rem}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.sidebar_re4s{overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 2rem)}.sidebarItemTitle_pO2u{font-size:var(--ifm-h3-font-size)}.container_mt6G,.sidebarItemList_Yudw{font-size:.9rem}.sidebarItem__DBe{margin-top:.7rem}.sidebarItemLink_mo7H{color:var(--ifm-font-color-base);display:block}.sidebarItemLinkActive_I1ZP{color:var(--ifm-color-primary)!important}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.authorCol_Hf19{flex-grow:1!important;max-width:inherit!important}.imageOnlyAuthorRow_pa_O{display:flex;flex-flow:row wrap}.buttons_AeoN,.features_t9lD{align-items:center;display:flex}.imageOnlyAuthorCol_G86a{margin-left:.3rem;margin-right:.3rem}.features_t9lD{padding:2rem 0;width:100%}.featureSvg_GfXr{height:200px;width:200px}.heroBanner_qdFl{overflow:hidden;padding:4rem 0;position:relative;text-align:center}.buttons_AeoN{justify-content:center}.codeBlockContainer_Ckt0{border-radius:var(--ifm-code-border-radius);box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading)}.codeBlockContent_biex{border-radius:inherit;direction:ltr;position:relative}.codeBlockTitle_Ktv7{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:inherit;border-top-right-radius:inherit;font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlock_bY9V{--ifm-pre-background:var(--prism-background-color);margin:0;padding:0}.codeBlockTitle_Ktv7+.codeBlockContent_biex .codeBlock_bY9V{border-top-left-radius:0;border-top-right-radius:0}.codeBlockLines_e6Vv{float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.codeBlockLinesWithNumbering_o6Pm{display:table;padding:var(--ifm-pre-padding) 0}.buttonGroup__atx{column-gap:.2rem;display:flex;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2)}.buttonGroup__atx button{align-items:center;border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;line-height:0;opacity:0;padding:.4rem;transition:opacity var(--ifm-transition-fast) ease-in-out}.buttonGroup__atx button:focus-visible,.buttonGroup__atx button:hover{opacity:1!important}.theme-code-block:hover .buttonGroup__atx button{opacity:.4}:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.codeLine_lJS_{counter-increment:a;display:table-row}.codeLineNumber_Tfdd{background:var(--ifm-pre-background);display:table-cell;left:0;overflow-wrap:normal;padding:0 var(--ifm-pre-padding);position:sticky;text-align:right;width:1%}.codeLineNumber_Tfdd:before{content:counter(a);opacity:.4}.codeLineContent_feaV{padding-right:var(--ifm-pre-padding)}.theme-code-block:hover .copyButtonCopied_obH4{opacity:1!important}.copyButtonIcons_eSgA{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_y97N,.copyButtonSuccessIcon_LjdS{left:0;position:absolute;top:0;fill:currentColor;height:inherit;opacity:inherit;transition:all var(--ifm-transition-fast) ease;width:inherit}.copyButtonSuccessIcon_LjdS{color:#00d600;left:50%;opacity:0;top:50%;transform:translate(-50%,-50%) scale(.33)}.copyButtonCopied_obH4 .copyButtonIcon_y97N{opacity:0;transform:scale(.33)}.copyButtonCopied_obH4 .copyButtonSuccessIcon_LjdS{opacity:1;transform:translate(-50%,-50%) scale(1);transition-delay:75ms}.tag_zVej{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_zVej:hover{--docusaurus-tag-list-border:var(--ifm-link-color);text-decoration:none}.tagRegular_sFm0{border-radius:var(--ifm-global-radius);font-size:90%;padding:.2rem .5rem .3rem}.tagWithCount_h2kH{align-items:center;border-left:0;display:flex;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_h2kH:after,.tagWithCount_h2kH:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_h2kH:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_h2kH:after{border-radius:50%;height:.5rem;left:0;transform:translateY(-50%);width:.5rem}.tagWithCount_h2kH span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}.lastUpdated_JAkA{font-size:smaller;font-style:italic;margin-top:.2rem}.tocCollapsibleButton_TO0P{align-items:center;display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.tocCollapsibleButton_TO0P:after{background:var(--ifm-menu-link-sublist-icon) 50% 50%/2rem 2rem no-repeat;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast);width:1.25rem}.tocCollapsibleButtonExpanded_MG3E:after,.tocCollapsibleExpanded_sAul{transform:none}.tocCollapsible_ETCw{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.tocCollapsibleContent_vkbj>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_vkbj ul li{margin:.4rem .8rem}.tocCollapsibleContent_vkbj a{display:block}.details_lb9f{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;padding-left:1rem;position:relative}.details_lb9f>summary::-webkit-details-marker{display:none}.details_lb9f>summary:before{border-color:#0000 #0000 #0000 var(--docusaurus-details-decoration-color);border-style:solid;border-width:var(--docusaurus-details-summary-arrow-size);content:"";left:0;position:absolute;top:.45rem;transform:rotate(0);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.details_b_Ee{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast) ease;border:1px solid var(--ifm-alert-border-color);margin:0 0 var(--ifm-spacing-vertical)}.img_ev3q{height:auto}.tableOfContents_bqdL{overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.admonition_xJq3{margin-bottom:1em}.admonitionHeading_Gvgb{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family)}.admonitionHeading_Gvgb:not(:last-child){margin-bottom:.3rem}.admonitionHeading_Gvgb code{text-transform:none}.admonitionIcon_Rf37{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_Rf37 svg{display:inline-block;height:1.6em;width:1.6em;fill:var(--ifm-alert-foreground-color)}.breadcrumbHomeIcon_YNFT{height:1.1rem;position:relative;top:1px;vertical-align:top;width:1.1rem}.breadcrumbsContainer_Z_bl{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_TmdG{background-color:var(--docusaurus-collapse-button-bg)}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.collapseSidebarButton_PEFL{border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px;position:sticky}.collapseSidebarButtonIcon_kv0_{margin-top:4px;transform:rotate(180deg)}.expandButtonIcon_i1dp,[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:focus,.collapseSidebarButton_PEFL:hover,.expandButton_TmdG:focus,.expandButton_TmdG:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_SIkG{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_SIkG{padding:.5rem 0 .5rem .5rem;scrollbar-gutter:stable}}.menuWithAnnouncementBar_GW3s{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_njMd{display:flex;flex-direction:column;height:100%;padding-top:var(--ifm-navbar-height);width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_wUlq{padding-top:0}.sidebarHidden_VK0M{opacity:0;visibility:hidden}.sidebarLogo_isFc{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);text-decoration:none!important}.sidebarLogo_isFc img{height:2rem;margin-right:.5rem}.expandButton_TmdG{align-items:center;display:flex;height:100%;justify-content:center;position:absolute;right:0;top:0;transition:background-color var(--ifm-transition-fast) ease;width:100%}[dir=rtl] .expandButtonIcon_i1dp{transform:rotate(180deg)}.docSidebarContainer_YfHR{border-right:1px solid var(--ifm-toc-border-color);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_DPk8{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.sidebarViewport_aRkj{height:100%;max-height:100vh;position:sticky;top:0}.docMainContainer_TBSr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_lQrH{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_JWYK{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}.navbarSearchContainer_Bca1{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.lastUpdated_JAkA{text-align:right}.tocMobile_ITEo{display:none}.docItemCol_VOVn{max-width:75%!important}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_DEke,.footer__link-separator,.navbar__item,.sidebar_re4s,.tableOfContents_bqdL{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.navbarSearchContainer_Bca1{position:absolute;right:var(--ifm-navbar-padding-horizontal)}.docItemContainer_F8PC{padding:0 .3rem}}@media screen and (max-width:996px){.heroBanner_qdFl{padding:2rem}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}.title_f1Hy{font-size:2rem}}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media (prefers-reduced-motion:reduce){:root{--ifm-transition-fast:0ms;--ifm-transition-slow:0ms}}@media print{.announcementBar_mb4j,.footer,.menu,.navbar,.pagination-nav,.table-of-contents,.tocMobile_ITEo{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_e6Vv{white-space:pre-wrap}} \ No newline at end of file diff --git a/build/assets/images/2023-08-25-Pika-3.5.0-connect-577bc269745e6841d8dc76a6b24e382c.png b/build/assets/images/2023-08-25-Pika-3.5.0-connect-577bc269745e6841d8dc76a6b24e382c.png new file mode 100644 index 0000000..fcad168 Binary files /dev/null and b/build/assets/images/2023-08-25-Pika-3.5.0-connect-577bc269745e6841d8dc76a6b24e382c.png differ diff --git a/build/assets/images/2023-09-28-Pika-3.5.1-connect-65452ee30b0e2dff6c5affd2ee5406a1.png b/build/assets/images/2023-09-28-Pika-3.5.1-connect-65452ee30b0e2dff6c5affd2ee5406a1.png new file mode 100644 index 0000000..c2513db Binary files /dev/null and b/build/assets/images/2023-09-28-Pika-3.5.1-connect-65452ee30b0e2dff6c5affd2ee5406a1.png differ diff --git a/build/assets/images/2023-12-03-Pika-3.5.2-connect-a766680ff0766c42b3506846465fd45b.png b/build/assets/images/2023-12-03-Pika-3.5.2-connect-a766680ff0766c42b3506846465fd45b.png new file mode 100644 index 0000000..3a6ec02 Binary files /dev/null and b/build/assets/images/2023-12-03-Pika-3.5.2-connect-a766680ff0766c42b3506846465fd45b.png differ diff --git a/build/assets/images/2024-03-27-Pika-3.5.3-connect-c43aca0eeeb5cd09cc60b55f9a3df4e5.png b/build/assets/images/2024-03-27-Pika-3.5.3-connect-c43aca0eeeb5cd09cc60b55f9a3df4e5.png new file mode 100644 index 0000000..d51d857 Binary files /dev/null and b/build/assets/images/2024-03-27-Pika-3.5.3-connect-c43aca0eeeb5cd09cc60b55f9a3df4e5.png differ diff --git a/build/assets/images/2024-03-27-Pika-3.5.3-logo-b2c4565b5d1adebda975b365a3bcf337.png b/build/assets/images/2024-03-27-Pika-3.5.3-logo-b2c4565b5d1adebda975b365a3bcf337.png new file mode 100644 index 0000000..2c76943 Binary files /dev/null and b/build/assets/images/2024-03-27-Pika-3.5.3-logo-b2c4565b5d1adebda975b365a3bcf337.png differ diff --git a/build/assets/images/2024-05-16-Pika-3.5.4-connect-c43aca0eeeb5cd09cc60b55f9a3df4e5.png b/build/assets/images/2024-05-16-Pika-3.5.4-connect-c43aca0eeeb5cd09cc60b55f9a3df4e5.png new file mode 100644 index 0000000..d51d857 Binary files /dev/null and b/build/assets/images/2024-05-16-Pika-3.5.4-connect-c43aca0eeeb5cd09cc60b55f9a3df4e5.png differ diff --git a/build/assets/images/2024-07-08-PikiwiDB(Pika)-4.0.0-connect-c43aca0eeeb5cd09cc60b55f9a3df4e5.png b/build/assets/images/2024-07-08-PikiwiDB(Pika)-4.0.0-connect-c43aca0eeeb5cd09cc60b55f9a3df4e5.png new file mode 100644 index 0000000..d51d857 Binary files /dev/null and b/build/assets/images/2024-07-08-PikiwiDB(Pika)-4.0.0-connect-c43aca0eeeb5cd09cc60b55f9a3df4e5.png differ diff --git a/build/assets/images/2024-07-08-PikiwiDB(Pika)-4.0.0-key-357e46564ca61e525f598aa7ac52b886.png b/build/assets/images/2024-07-08-PikiwiDB(Pika)-4.0.0-key-357e46564ca61e525f598aa7ac52b886.png new file mode 100644 index 0000000..d05088e Binary files /dev/null and b/build/assets/images/2024-07-08-PikiwiDB(Pika)-4.0.0-key-357e46564ca61e525f598aa7ac52b886.png differ diff --git a/build/assets/images/PikiwiDB(Pika)-Logo-ab6820fbb859308b95d22928b12610fb.png b/build/assets/images/PikiwiDB(Pika)-Logo-ab6820fbb859308b95d22928b12610fb.png new file mode 100644 index 0000000..e59710d Binary files /dev/null and b/build/assets/images/PikiwiDB(Pika)-Logo-ab6820fbb859308b95d22928b12610fb.png differ diff --git a/build/assets/images/image-0f19e5ab8e50d1da87f1f2e510633680.png b/build/assets/images/image-0f19e5ab8e50d1da87f1f2e510633680.png new file mode 100644 index 0000000..208a297 Binary files /dev/null and b/build/assets/images/image-0f19e5ab8e50d1da87f1f2e510633680.png differ diff --git a/build/assets/images/image-1-1ba1cdceb8cda07f155712902543dede.png b/build/assets/images/image-1-1ba1cdceb8cda07f155712902543dede.png new file mode 100644 index 0000000..0d43147 Binary files /dev/null and b/build/assets/images/image-1-1ba1cdceb8cda07f155712902543dede.png differ diff --git a/build/assets/images/image-1-401838f772cab32f3d42f1129e1e5731.png b/build/assets/images/image-1-401838f772cab32f3d42f1129e1e5731.png new file mode 100644 index 0000000..93f43ff Binary files /dev/null and b/build/assets/images/image-1-401838f772cab32f3d42f1129e1e5731.png differ diff --git a/build/assets/images/image-1-50d7e9a7e987a96739e213f2cc79e3a4.png b/build/assets/images/image-1-50d7e9a7e987a96739e213f2cc79e3a4.png new file mode 100644 index 0000000..da75fc7 Binary files /dev/null and b/build/assets/images/image-1-50d7e9a7e987a96739e213f2cc79e3a4.png differ diff --git a/build/assets/images/image-1-73f773e065a7f4db8e884c876767aa6d.png b/build/assets/images/image-1-73f773e065a7f4db8e884c876767aa6d.png new file mode 100644 index 0000000..a17b35c Binary files /dev/null and b/build/assets/images/image-1-73f773e065a7f4db8e884c876767aa6d.png differ diff --git a/build/assets/images/image-1-9a1126eeffd6d9e00382d9ea0facef6a.png b/build/assets/images/image-1-9a1126eeffd6d9e00382d9ea0facef6a.png new file mode 100644 index 0000000..5838341 Binary files /dev/null and b/build/assets/images/image-1-9a1126eeffd6d9e00382d9ea0facef6a.png differ diff --git a/build/assets/images/image-1-a332f842fe89f276e7b0704e67b94e36.png b/build/assets/images/image-1-a332f842fe89f276e7b0704e67b94e36.png new file mode 100644 index 0000000..1bd3802 Binary files /dev/null and b/build/assets/images/image-1-a332f842fe89f276e7b0704e67b94e36.png differ diff --git a/build/assets/images/image-1-b89be591bc8c74504d87cca233c6c56a.png b/build/assets/images/image-1-b89be591bc8c74504d87cca233c6c56a.png new file mode 100644 index 0000000..04f5ef0 Binary files /dev/null and b/build/assets/images/image-1-b89be591bc8c74504d87cca233c6c56a.png differ diff --git a/build/assets/images/image-10-5469cee1ab6d47996e06cce5681cfde4.png b/build/assets/images/image-10-5469cee1ab6d47996e06cce5681cfde4.png new file mode 100644 index 0000000..bbf784b Binary files /dev/null and b/build/assets/images/image-10-5469cee1ab6d47996e06cce5681cfde4.png differ diff --git a/build/assets/images/image-10-b0202d2aaa9438e0688d28a370e671a6.png b/build/assets/images/image-10-b0202d2aaa9438e0688d28a370e671a6.png new file mode 100644 index 0000000..f27c225 Binary files /dev/null and b/build/assets/images/image-10-b0202d2aaa9438e0688d28a370e671a6.png differ diff --git a/build/assets/images/image-10-c030289539ccd1bfd2c466f532244db8.png b/build/assets/images/image-10-c030289539ccd1bfd2c466f532244db8.png new file mode 100644 index 0000000..37d0a2f Binary files /dev/null and b/build/assets/images/image-10-c030289539ccd1bfd2c466f532244db8.png differ diff --git a/build/assets/images/image-11-16e9fbeada8c7a1b6db7949bffee597a.png b/build/assets/images/image-11-16e9fbeada8c7a1b6db7949bffee597a.png new file mode 100644 index 0000000..ff06fcf Binary files /dev/null and b/build/assets/images/image-11-16e9fbeada8c7a1b6db7949bffee597a.png differ diff --git a/build/assets/images/image-11-9ff17da57274e9175f8833c28897dc02.png b/build/assets/images/image-11-9ff17da57274e9175f8833c28897dc02.png new file mode 100644 index 0000000..930d6d1 Binary files /dev/null and b/build/assets/images/image-11-9ff17da57274e9175f8833c28897dc02.png differ diff --git a/build/assets/images/image-11-e54b2b08b0af62f4b08c439611f54d88.png b/build/assets/images/image-11-e54b2b08b0af62f4b08c439611f54d88.png new file mode 100644 index 0000000..1690a81 Binary files /dev/null and b/build/assets/images/image-11-e54b2b08b0af62f4b08c439611f54d88.png differ diff --git a/build/assets/images/image-12-007503ecaf74ac5cc8c9551a58044eb0.png b/build/assets/images/image-12-007503ecaf74ac5cc8c9551a58044eb0.png new file mode 100644 index 0000000..10a3de9 Binary files /dev/null and b/build/assets/images/image-12-007503ecaf74ac5cc8c9551a58044eb0.png differ diff --git a/build/assets/images/image-12-44e490e98289320f89dea7f9e3b16a34.png b/build/assets/images/image-12-44e490e98289320f89dea7f9e3b16a34.png new file mode 100644 index 0000000..abeb4d7 Binary files /dev/null and b/build/assets/images/image-12-44e490e98289320f89dea7f9e3b16a34.png differ diff --git a/build/assets/images/image-12-8e255fa3b354119ac26c7f09de1a26b6.png b/build/assets/images/image-12-8e255fa3b354119ac26c7f09de1a26b6.png new file mode 100644 index 0000000..96830d1 Binary files /dev/null and b/build/assets/images/image-12-8e255fa3b354119ac26c7f09de1a26b6.png differ diff --git a/build/assets/images/image-13-0fea61a46c039eff667cf42449fdc7dc.png b/build/assets/images/image-13-0fea61a46c039eff667cf42449fdc7dc.png new file mode 100644 index 0000000..40ce60b Binary files /dev/null and b/build/assets/images/image-13-0fea61a46c039eff667cf42449fdc7dc.png differ diff --git a/build/assets/images/image-13-25cbe0398ddd91047389c2c697ec3cc6.png b/build/assets/images/image-13-25cbe0398ddd91047389c2c697ec3cc6.png new file mode 100644 index 0000000..5d93306 Binary files /dev/null and b/build/assets/images/image-13-25cbe0398ddd91047389c2c697ec3cc6.png differ diff --git a/build/assets/images/image-13-e31f75910036d65c4c0d4eb16a98e1a8.png b/build/assets/images/image-13-e31f75910036d65c4c0d4eb16a98e1a8.png new file mode 100644 index 0000000..4b9fd74 Binary files /dev/null and b/build/assets/images/image-13-e31f75910036d65c4c0d4eb16a98e1a8.png differ diff --git a/build/assets/images/image-14-1d4ae649d228c006018b9ca0ee7a3fa9.png b/build/assets/images/image-14-1d4ae649d228c006018b9ca0ee7a3fa9.png new file mode 100644 index 0000000..1d34545 Binary files /dev/null and b/build/assets/images/image-14-1d4ae649d228c006018b9ca0ee7a3fa9.png differ diff --git a/build/assets/images/image-14-278e8a6d45ad7bacd2a18066d3bf8126.png b/build/assets/images/image-14-278e8a6d45ad7bacd2a18066d3bf8126.png new file mode 100644 index 0000000..21fbda6 Binary files /dev/null and b/build/assets/images/image-14-278e8a6d45ad7bacd2a18066d3bf8126.png differ diff --git a/build/assets/images/image-15-e5b66129ba4c83d85989a2e28d1245b9.png b/build/assets/images/image-15-e5b66129ba4c83d85989a2e28d1245b9.png new file mode 100644 index 0000000..a6eeeba Binary files /dev/null and b/build/assets/images/image-15-e5b66129ba4c83d85989a2e28d1245b9.png differ diff --git a/build/assets/images/image-16-5ae3e6f8b377fd0e5765c9b3d6fa6e59.png b/build/assets/images/image-16-5ae3e6f8b377fd0e5765c9b3d6fa6e59.png new file mode 100644 index 0000000..c50cba7 Binary files /dev/null and b/build/assets/images/image-16-5ae3e6f8b377fd0e5765c9b3d6fa6e59.png differ diff --git a/build/assets/images/image-17-8b1b4d5aed4b7446693d24e055341323.png b/build/assets/images/image-17-8b1b4d5aed4b7446693d24e055341323.png new file mode 100644 index 0000000..71c67d1 Binary files /dev/null and b/build/assets/images/image-17-8b1b4d5aed4b7446693d24e055341323.png differ diff --git a/build/assets/images/image-18-a67989f901b1d17c080155a1f9da02ff.png b/build/assets/images/image-18-a67989f901b1d17c080155a1f9da02ff.png new file mode 100644 index 0000000..15feb5f Binary files /dev/null and b/build/assets/images/image-18-a67989f901b1d17c080155a1f9da02ff.png differ diff --git a/build/assets/images/image-2-1625989a3f7b2d85f2b61d387b1ce2f5.png b/build/assets/images/image-2-1625989a3f7b2d85f2b61d387b1ce2f5.png new file mode 100644 index 0000000..9a4e55a Binary files /dev/null and b/build/assets/images/image-2-1625989a3f7b2d85f2b61d387b1ce2f5.png differ diff --git a/build/assets/images/image-2-373d27a3ed599f2d7243c4adb1f82fdb.png b/build/assets/images/image-2-373d27a3ed599f2d7243c4adb1f82fdb.png new file mode 100644 index 0000000..6fc1f73 Binary files /dev/null and b/build/assets/images/image-2-373d27a3ed599f2d7243c4adb1f82fdb.png differ diff --git a/build/assets/images/image-2-4f3ceaebe71d52832af642ed1720bfaf.png b/build/assets/images/image-2-4f3ceaebe71d52832af642ed1720bfaf.png new file mode 100644 index 0000000..06ea4e1 Binary files /dev/null and b/build/assets/images/image-2-4f3ceaebe71d52832af642ed1720bfaf.png differ diff --git a/build/assets/images/image-2-6d00b88b3317a3c154d888ecd9ea975f.png b/build/assets/images/image-2-6d00b88b3317a3c154d888ecd9ea975f.png new file mode 100644 index 0000000..c4fa05c Binary files /dev/null and b/build/assets/images/image-2-6d00b88b3317a3c154d888ecd9ea975f.png differ diff --git a/build/assets/images/image-2-7170d56872bf3b1b9f58c4a5d54b6a38.png b/build/assets/images/image-2-7170d56872bf3b1b9f58c4a5d54b6a38.png new file mode 100644 index 0000000..7113720 Binary files /dev/null and b/build/assets/images/image-2-7170d56872bf3b1b9f58c4a5d54b6a38.png differ diff --git a/build/assets/images/image-2-d22dac95c46ec5e9cec11a24fcd80157.png b/build/assets/images/image-2-d22dac95c46ec5e9cec11a24fcd80157.png new file mode 100644 index 0000000..e908ae2 Binary files /dev/null and b/build/assets/images/image-2-d22dac95c46ec5e9cec11a24fcd80157.png differ diff --git a/build/assets/images/image-2-ee383d7fe734cbee48e267cf23d436ca.png b/build/assets/images/image-2-ee383d7fe734cbee48e267cf23d436ca.png new file mode 100644 index 0000000..b20b72a Binary files /dev/null and b/build/assets/images/image-2-ee383d7fe734cbee48e267cf23d436ca.png differ diff --git a/build/assets/images/image-3-2010433160c1cee4c06a1058f6f052bd.png b/build/assets/images/image-3-2010433160c1cee4c06a1058f6f052bd.png new file mode 100644 index 0000000..9410178 Binary files /dev/null and b/build/assets/images/image-3-2010433160c1cee4c06a1058f6f052bd.png differ diff --git a/build/assets/images/image-3-24ad1477d3eae8722a90467818d9c69c.png b/build/assets/images/image-3-24ad1477d3eae8722a90467818d9c69c.png new file mode 100644 index 0000000..f6cd836 Binary files /dev/null and b/build/assets/images/image-3-24ad1477d3eae8722a90467818d9c69c.png differ diff --git a/build/assets/images/image-3-70e011578123f4f449d52b38673d5461.png b/build/assets/images/image-3-70e011578123f4f449d52b38673d5461.png new file mode 100644 index 0000000..1afca85 Binary files /dev/null and b/build/assets/images/image-3-70e011578123f4f449d52b38673d5461.png differ diff --git a/build/assets/images/image-3-8713a5b7ac89275609bc66c2d93a911a.png b/build/assets/images/image-3-8713a5b7ac89275609bc66c2d93a911a.png new file mode 100644 index 0000000..ba19275 Binary files /dev/null and b/build/assets/images/image-3-8713a5b7ac89275609bc66c2d93a911a.png differ diff --git a/build/assets/images/image-3-be0cc82886836eb8d98462c90127e71c.png b/build/assets/images/image-3-be0cc82886836eb8d98462c90127e71c.png new file mode 100644 index 0000000..d9f4c41 Binary files /dev/null and b/build/assets/images/image-3-be0cc82886836eb8d98462c90127e71c.png differ diff --git a/build/assets/images/image-390cbcfad0906bae06cd24d4463c1a36.png b/build/assets/images/image-390cbcfad0906bae06cd24d4463c1a36.png new file mode 100644 index 0000000..46ca6d1 Binary files /dev/null and b/build/assets/images/image-390cbcfad0906bae06cd24d4463c1a36.png differ diff --git a/build/assets/images/image-4-394fe892a14fd4c34996073d516e9a00.png b/build/assets/images/image-4-394fe892a14fd4c34996073d516e9a00.png new file mode 100644 index 0000000..c755fa4 Binary files /dev/null and b/build/assets/images/image-4-394fe892a14fd4c34996073d516e9a00.png differ diff --git a/build/assets/images/image-4-71f5629b0151c58ff0f44314121cd573.png b/build/assets/images/image-4-71f5629b0151c58ff0f44314121cd573.png new file mode 100644 index 0000000..da17893 Binary files /dev/null and b/build/assets/images/image-4-71f5629b0151c58ff0f44314121cd573.png differ diff --git a/build/assets/images/image-4-a5c268580385ecbd02dd7078aa328259.png b/build/assets/images/image-4-a5c268580385ecbd02dd7078aa328259.png new file mode 100644 index 0000000..d15ba1c Binary files /dev/null and b/build/assets/images/image-4-a5c268580385ecbd02dd7078aa328259.png differ diff --git a/build/assets/images/image-4-b9ef1e863901bfa96ea344faee7feaba.png b/build/assets/images/image-4-b9ef1e863901bfa96ea344faee7feaba.png new file mode 100644 index 0000000..45faab7 Binary files /dev/null and b/build/assets/images/image-4-b9ef1e863901bfa96ea344faee7feaba.png differ diff --git a/build/assets/images/image-5-205daf4b1d81a0d7a5ec68d735eece3f.png b/build/assets/images/image-5-205daf4b1d81a0d7a5ec68d735eece3f.png new file mode 100644 index 0000000..351f697 Binary files /dev/null and b/build/assets/images/image-5-205daf4b1d81a0d7a5ec68d735eece3f.png differ diff --git a/build/assets/images/image-5-21008cb96b438b35658d409705589b9f.png b/build/assets/images/image-5-21008cb96b438b35658d409705589b9f.png new file mode 100644 index 0000000..6fb720b Binary files /dev/null and b/build/assets/images/image-5-21008cb96b438b35658d409705589b9f.png differ diff --git a/build/assets/images/image-5-37862647d0f631499532685d0e88b27e.png b/build/assets/images/image-5-37862647d0f631499532685d0e88b27e.png new file mode 100644 index 0000000..9590e0e Binary files /dev/null and b/build/assets/images/image-5-37862647d0f631499532685d0e88b27e.png differ diff --git a/build/assets/images/image-5-70e011578123f4f449d52b38673d5461.png b/build/assets/images/image-5-70e011578123f4f449d52b38673d5461.png new file mode 100644 index 0000000..1afca85 Binary files /dev/null and b/build/assets/images/image-5-70e011578123f4f449d52b38673d5461.png differ diff --git a/build/assets/images/image-582a537ff7ba027c50ebb695a55ac7bf.png b/build/assets/images/image-582a537ff7ba027c50ebb695a55ac7bf.png new file mode 100644 index 0000000..da5046b Binary files /dev/null and b/build/assets/images/image-582a537ff7ba027c50ebb695a55ac7bf.png differ diff --git a/build/assets/images/image-6-082780f16045bddafcca6f4adad51ed7.png b/build/assets/images/image-6-082780f16045bddafcca6f4adad51ed7.png new file mode 100644 index 0000000..bab24f0 Binary files /dev/null and b/build/assets/images/image-6-082780f16045bddafcca6f4adad51ed7.png differ diff --git a/build/assets/images/image-6-8cdc6045ed69e0d326e027074b83eaba.png b/build/assets/images/image-6-8cdc6045ed69e0d326e027074b83eaba.png new file mode 100644 index 0000000..9dc2b21 Binary files /dev/null and b/build/assets/images/image-6-8cdc6045ed69e0d326e027074b83eaba.png differ diff --git a/build/assets/images/image-6-9e0ae2006a8f90b434122000ce0b857a.png b/build/assets/images/image-6-9e0ae2006a8f90b434122000ce0b857a.png new file mode 100644 index 0000000..9582b3c Binary files /dev/null and b/build/assets/images/image-6-9e0ae2006a8f90b434122000ce0b857a.png differ diff --git a/build/assets/images/image-6-b9ef1e863901bfa96ea344faee7feaba.png b/build/assets/images/image-6-b9ef1e863901bfa96ea344faee7feaba.png new file mode 100644 index 0000000..45faab7 Binary files /dev/null and b/build/assets/images/image-6-b9ef1e863901bfa96ea344faee7feaba.png differ diff --git a/build/assets/images/image-6b13d65ff73adb4a7c55002725a8aecf.png b/build/assets/images/image-6b13d65ff73adb4a7c55002725a8aecf.png new file mode 100644 index 0000000..bd24998 Binary files /dev/null and b/build/assets/images/image-6b13d65ff73adb4a7c55002725a8aecf.png differ diff --git a/build/assets/images/image-7-4c0b8f1c475d8593cc940c8e3b683fb4.png b/build/assets/images/image-7-4c0b8f1c475d8593cc940c8e3b683fb4.png new file mode 100644 index 0000000..b238801 Binary files /dev/null and b/build/assets/images/image-7-4c0b8f1c475d8593cc940c8e3b683fb4.png differ diff --git a/build/assets/images/image-7-68db181908ccd6249f1d2b31f8cd6d97.png b/build/assets/images/image-7-68db181908ccd6249f1d2b31f8cd6d97.png new file mode 100644 index 0000000..6a88262 Binary files /dev/null and b/build/assets/images/image-7-68db181908ccd6249f1d2b31f8cd6d97.png differ diff --git a/build/assets/images/image-7-69a4cd17c04a4333dba253ffad7d31fa.png b/build/assets/images/image-7-69a4cd17c04a4333dba253ffad7d31fa.png new file mode 100644 index 0000000..4f07017 Binary files /dev/null and b/build/assets/images/image-7-69a4cd17c04a4333dba253ffad7d31fa.png differ diff --git a/build/assets/images/image-7-d3f5bbc5af764f52853c1b30cfbd7f2b.png b/build/assets/images/image-7-d3f5bbc5af764f52853c1b30cfbd7f2b.png new file mode 100644 index 0000000..9f87b96 Binary files /dev/null and b/build/assets/images/image-7-d3f5bbc5af764f52853c1b30cfbd7f2b.png differ diff --git a/build/assets/images/image-8-107930bf4c340996bd0ef9a28abadf41.png b/build/assets/images/image-8-107930bf4c340996bd0ef9a28abadf41.png new file mode 100644 index 0000000..74dc421 Binary files /dev/null and b/build/assets/images/image-8-107930bf4c340996bd0ef9a28abadf41.png differ diff --git a/build/assets/images/image-8-2adcd43c46ada55771e85607412475e8.png b/build/assets/images/image-8-2adcd43c46ada55771e85607412475e8.png new file mode 100644 index 0000000..71d10aa Binary files /dev/null and b/build/assets/images/image-8-2adcd43c46ada55771e85607412475e8.png differ diff --git a/build/assets/images/image-8-6c0e3de67866aabdf733d6ffd7c304c6.png b/build/assets/images/image-8-6c0e3de67866aabdf733d6ffd7c304c6.png new file mode 100644 index 0000000..329e520 Binary files /dev/null and b/build/assets/images/image-8-6c0e3de67866aabdf733d6ffd7c304c6.png differ diff --git a/build/assets/images/image-9-2e2593ad7ed0974d5f98456801ba4e24.png b/build/assets/images/image-9-2e2593ad7ed0974d5f98456801ba4e24.png new file mode 100644 index 0000000..4838fbc Binary files /dev/null and b/build/assets/images/image-9-2e2593ad7ed0974d5f98456801ba4e24.png differ diff --git a/build/assets/images/image-9-3c65e5a06d50797e839b73b981bfe362.png b/build/assets/images/image-9-3c65e5a06d50797e839b73b981bfe362.png new file mode 100644 index 0000000..5183456 Binary files /dev/null and b/build/assets/images/image-9-3c65e5a06d50797e839b73b981bfe362.png differ diff --git a/build/assets/images/image-a657289ab9c1e4ef424fefadfbe9a073.png b/build/assets/images/image-a657289ab9c1e4ef424fefadfbe9a073.png new file mode 100644 index 0000000..44c582f Binary files /dev/null and b/build/assets/images/image-a657289ab9c1e4ef424fefadfbe9a073.png differ diff --git a/build/assets/images/image-aad65eec86e42083a83018a4357d882b.png b/build/assets/images/image-aad65eec86e42083a83018a4357d882b.png new file mode 100644 index 0000000..db5abe6 Binary files /dev/null and b/build/assets/images/image-aad65eec86e42083a83018a4357d882b.png differ diff --git a/build/assets/images/pika-blackwidow-1-d2f194c46b2f89969b695ca99b666f66.png b/build/assets/images/pika-blackwidow-1-d2f194c46b2f89969b695ca99b666f66.png new file mode 100644 index 0000000..9e71cbb Binary files /dev/null and b/build/assets/images/pika-blackwidow-1-d2f194c46b2f89969b695ca99b666f66.png differ diff --git a/build/assets/images/pika-blackwidow-3-e1d6e597bfc0e9f2b5fac3d09de2d347.png b/build/assets/images/pika-blackwidow-3-e1d6e597bfc0e9f2b5fac3d09de2d347.png new file mode 100644 index 0000000..9618ef3 Binary files /dev/null and b/build/assets/images/pika-blackwidow-3-e1d6e597bfc0e9f2b5fac3d09de2d347.png differ diff --git a/build/assets/images/pika-blackwidow-5-fbecef58859e81229a02ba054c864b53.png b/build/assets/images/pika-blackwidow-5-fbecef58859e81229a02ba054c864b53.png new file mode 100644 index 0000000..74873e0 Binary files /dev/null and b/build/assets/images/pika-blackwidow-5-fbecef58859e81229a02ba054c864b53.png differ diff --git a/build/assets/images/pika-blackwidow-6-fea4db926e09062432073c6c94002b07.png b/build/assets/images/pika-blackwidow-6-fea4db926e09062432073c6c94002b07.png new file mode 100644 index 0000000..4672252 Binary files /dev/null and b/build/assets/images/pika-blackwidow-6-fea4db926e09062432073c6c94002b07.png differ diff --git a/build/assets/images/pika-blackwidow-7-f94a590f52bd9c931f665786bbc12f97.png b/build/assets/images/pika-blackwidow-7-f94a590f52bd9c931f665786bbc12f97.png new file mode 100644 index 0000000..5f6d738 Binary files /dev/null and b/build/assets/images/pika-blackwidow-7-f94a590f52bd9c931f665786bbc12f97.png differ diff --git a/build/assets/images/pika-blackwidow-8-29fc67370188a28f1fc4f5b02c0860b9.png b/build/assets/images/pika-blackwidow-8-29fc67370188a28f1fc4f5b02c0860b9.png new file mode 100644 index 0000000..0aea9ff Binary files /dev/null and b/build/assets/images/pika-blackwidow-8-29fc67370188a28f1fc4f5b02c0860b9.png differ diff --git a/build/assets/js/0058b4c6.1e250fdb.js b/build/assets/js/0058b4c6.1e250fdb.js new file mode 100644 index 0000000..a8b5158 --- /dev/null +++ b/build/assets/js/0058b4c6.1e250fdb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[849],{6164:i=>{i.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"category","label":"\u5e8f\u8a00","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"PikiwiDB(Pika) \u7b80\u4ecb","href":"/docs/\u5e8f\u8a00/\u7b80\u4ecb/","docId":"\u5e8f\u8a00/\u7b80\u4ecb/index","unlisted":false},{"type":"link","label":"\u652f\u6301\u7684 Redis \u63a5\u53e3\u4e0e\u517c\u5bb9\u60c5\u51b5","href":"/docs/\u5e8f\u8a00/\u652f\u6301\u7684 Redis \u63a5\u53e3\u4e0e\u517c\u5bb9\u60c5\u51b5/","docId":"\u5e8f\u8a00/\u652f\u6301\u7684 Redis \u63a5\u53e3\u4e0e\u517c\u5bb9\u60c5\u51b5/index","unlisted":false},{"type":"link","label":"FAQ","href":"/docs/\u5e8f\u8a00/FAQ/","docId":"\u5e8f\u8a00/FAQ/index","unlisted":false}],"href":"/docs/\u5e8f\u8a00/"},{"type":"category","label":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u914d\u7f6e\u6587\u4ef6\u8bf4\u660e","href":"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u914d\u7f6e\u6587\u4ef6\u8bf4\u660e/","docId":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u914d\u7f6e\u6587\u4ef6\u8bf4\u660e/index","unlisted":false},{"type":"link","label":"page info \u4fe1\u606f\u8bf4\u660e","href":"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/page info \u4fe1\u606f\u8bf4\u660e/","docId":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/page info \u4fe1\u606f\u8bf4\u660e/index","unlisted":false},{"type":"link","label":"\u6570\u636e\u76ee\u5f55","href":"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u6570\u636e\u76ee\u5f55/","docId":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u6570\u636e\u76ee\u5f55/index","unlisted":false},{"type":"link","label":"\u7ba1\u7406\u6307\u4ee4","href":"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u7ba1\u7406\u6307\u4ee4/","docId":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u7ba1\u7406\u6307\u4ee4/index","unlisted":false},{"type":"link","label":"\u5dee\u5f02\u5316\u547d\u4ee4","href":"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5dee\u5f02\u5316\u547d\u4ee4/","docId":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5dee\u5f02\u5316\u547d\u4ee4/index","unlisted":false},{"type":"link","label":"\u8ba2\u9605","href":"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u8ba2\u9605/","docId":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u8ba2\u9605/index","unlisted":false},{"type":"link","label":"\u5206\u5e03\u5f0f\u6a21\u5f0f\u7b80\u5355\u6559\u7a0b","href":"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5206\u5e03\u5f0f\u6a21\u5f0f\u7b80\u5355\u6559\u7a0b/","docId":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5206\u5e03\u5f0f\u6a21\u5f0f\u7b80\u5355\u6559\u7a0b/index","unlisted":false},{"type":"link","label":"\u81ea\u52a8\u5bb9\u707e","href":"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u81ea\u52a8\u5bb9\u707e/","docId":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u81ea\u52a8\u5bb9\u707e/index","unlisted":false},{"type":"link","label":"\u591a\u5e93\u7248\u547d\u4ee4","href":"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u591a\u5e93\u7248\u547d\u4ee4/","docId":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u591a\u5e93\u7248\u547d\u4ee4/index","unlisted":false},{"type":"link","label":"\u670d\u52a1\u5668\u72b6\u6001\u76d1\u63a7","href":"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u670d\u52a1\u5668\u72b6\u6001\u76d1\u63a7/","docId":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u670d\u52a1\u5668\u72b6\u6001\u76d1\u63a7/index","unlisted":false},{"type":"link","label":"\u5206\u7247\u6559\u7a0b(3.1.2 \u2010 3.3.6)","href":"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5206\u7247\u6559\u7a0b/","docId":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5206\u7247\u6559\u7a0b/index","unlisted":false},{"type":"link","label":"\u526f\u672c\u4e00\u81f4\u6027\uff08\u4f7f\u7528\u6587\u6863\uff09","href":"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u526f\u672c\u4e00\u81f4\u6027\uff08\u4f7f\u7528\u6587\u6863\uff09/","docId":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u526f\u672c\u4e00\u81f4\u6027\uff08\u4f7f\u7528\u6587\u6863\uff09/index","unlisted":false},{"type":"link","label":"\u5b89\u88c5\u4f7f\u7528","href":"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5b89\u88c5\u4f7f\u7528/","docId":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5b89\u88c5\u4f7f\u7528/index","unlisted":false},{"type":"link","label":"\u526f\u672c\u4e00\u81f4\u6027\uff08\u8bbe\u8ba1\u6587\u6863\uff09","href":"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u526f\u672c\u4e00\u81f4\u6027\uff08\u8bbe\u8ba1\u6587\u6863\uff09/","docId":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u526f\u672c\u4e00\u81f4\u6027\uff08\u8bbe\u8ba1\u6587\u6863\uff09/index","unlisted":false},{"type":"link","label":"Pika \u6700\u4f73\u5b9e\u8df5","href":"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/Pika \u6700\u4f73\u5b9e\u8df5/","docId":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/Pika \u6700\u4f73\u5b9e\u8df5/index","unlisted":false}],"href":"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/"},{"type":"category","label":"\u6027\u80fd\u4e0e\u4f18\u5316","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"3.2.x \u6027\u80fd","href":"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/3.2.x \u6027\u80fd/","docId":"\u6027\u80fd\u4e0e\u4f18\u5316/3.2.x \u6027\u80fd/index","unlisted":false},{"type":"link","label":"Pika \u5185\u5b58\u4f7f\u7528","href":"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u5185\u5b58\u4f7f\u7528/","docId":"\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u5185\u5b58\u4f7f\u7528/index","unlisted":false},{"type":"link","label":"Redis \u4e0e Pika scan \u6027\u80fd\u5bf9\u6bd4","href":"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Redis \u4e0e Pika scan \u6027\u80fd\u5bf9\u6bd4/","docId":"\u6027\u80fd\u4e0e\u4f18\u5316/Redis \u4e0e Pika scan \u6027\u80fd\u5bf9\u6bd4/index","unlisted":false},{"type":"link","label":"Pika 3.5 \u53c2\u6570\u4f18\u5316\u624b\u518c","href":"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika 3.5 \u53c2\u6570\u4f18\u5316\u624b\u518c/","docId":"\u6027\u80fd\u4e0e\u4f18\u5316/Pika 3.5 \u53c2\u6570\u4f18\u5316\u624b\u518c/index","unlisted":false},{"type":"category","label":"Pika \u4f18\u5316\u6848\u4f8b","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u559c\u9a6c\u62c9\u96c5 Redis \u4e0e Pika \u7f13\u5b58\u4f7f\u7528\u519b\u89c4","href":"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/\u559c\u9a6c\u62c9\u96c5 Redis \u4e0e Pika \u7f13\u5b58\u4f7f\u7528\u519b\u89c4/","docId":"\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/\u559c\u9a6c\u62c9\u96c5 Redis \u4e0e Pika \u7f13\u5b58\u4f7f\u7528\u519b\u89c4/index","unlisted":false},{"type":"link","label":"\u8c03\u6574 max-write-buffer-size \u4f18\u5316 pika \u6027\u80fd10\u500d\u7684\u6848\u4f8b","href":"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/\u8c03\u6574 max-write-buffer-size \u4f18\u5316 pika \u6027\u80fd10\u500d\u7684\u6848\u4f8b/","docId":"\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/\u8c03\u6574 max-write-buffer-size \u4f18\u5316 pika \u6027\u80fd10\u500d\u7684\u6848\u4f8b/index","unlisted":false}],"href":"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/"}],"href":"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/"},{"type":"category","label":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u6574\u4f53\u6280\u672f\u67b6\u6784","href":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u6574\u4f53\u6280\u672f\u67b6\u6784/","docId":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u6574\u4f53\u6280\u672f\u67b6\u6784/index","unlisted":false},{"type":"link","label":"\u7ebf\u7a0b\u6a21\u578b","href":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u7ebf\u7a0b\u6a21\u578b/","docId":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u7ebf\u7a0b\u6a21\u578b/index","unlisted":false},{"type":"link","label":"\u9501\u7684\u5e94\u7528","href":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u9501\u7684\u5e94\u7528/","docId":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u9501\u7684\u5e94\u7528/index","unlisted":false},{"type":"link","label":"\u5168\u540c\u6b65","href":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u5168\u540c\u6b65/","docId":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u5168\u540c\u6b65/index","unlisted":false},{"type":"link","label":"\u589e\u91cf\u540c\u6b65","href":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u589e\u91cf\u540c\u6b65/","docId":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u589e\u91cf\u540c\u6b65/index","unlisted":false},{"type":"link","label":"\u4e3b\u4ece\u540c\u6b65","href":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u4e3b\u4ece\u540c\u6b65/","docId":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u4e3b\u4ece\u540c\u6b65/index","unlisted":false},{"type":"link","label":"\u526f\u672c\u4e00\u81f4\u6027","href":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u526f\u672c\u4e00\u81f4\u6027/","docId":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u526f\u672c\u4e00\u81f4\u6027/index","unlisted":false},{"type":"link","label":"Pika \u4e0e Codis","href":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4e0e Codis/","docId":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4e0e Codis/index","unlisted":false},{"type":"link","label":"\u5feb\u7167\u5f0f\u5907\u4efd","href":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u5feb\u7167\u5f0f\u5907\u4efd/","docId":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u5feb\u7167\u5f0f\u5907\u4efd/index","unlisted":false},{"type":"link","label":"NoSQL \u539f\u7406\u6982\u8ff0","href":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/NoSQL \u539f\u7406\u6982\u8ff0/","docId":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/NoSQL \u539f\u7406\u6982\u8ff0/index","unlisted":false},{"type":"link","label":"\u65e7\u5b58\u50a8\u7ed3\u6784","href":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65e7\u5b58\u50a8\u7ed3\u6784/","docId":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65e7\u5b58\u50a8\u7ed3\u6784/index","unlisted":false},{"type":"link","label":"\u65b0\u5b58\u50a8\u7ed3\u6784","href":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65b0\u5b58\u50a8\u7ed3\u6784/","docId":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65b0\u5b58\u50a8\u7ed3\u6784/index","unlisted":false},{"type":"link","label":"\u65b0\u5b58\u50a8\u7ed3\u6784\uff1a\u8be6\u7ec6\u89e3\u6790","href":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65b0\u5b58\u50a8\u65b9\u6848\uff1a\u8be6\u7ec6\u89e3\u6790/","docId":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65b0\u5b58\u50a8\u65b9\u6848\uff1a\u8be6\u7ec6\u89e3\u6790/index","unlisted":false},{"type":"category","label":"Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u901a\u4fe1\u548c\u7ebf\u7a0b\u6a21\u578b","href":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/\u901a\u4fe1\u548c\u7ebf\u7a0b\u6a21\u578b/","docId":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/\u901a\u4fe1\u548c\u7ebf\u7a0b\u6a21\u578b/index","unlisted":false},{"type":"link","label":"Pubsub \u673a\u5236","href":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/PubSub \u673a\u5236/","docId":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/PubSub \u673a\u5236/index","unlisted":false},{"type":"link","label":"Pika \u7684\u547d\u4ee4\u6267\u884c\u6846\u67b6","href":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/Pika \u7684\u547d\u4ee4\u6267\u884c\u6846\u67b6/","docId":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/Pika \u7684\u547d\u4ee4\u6267\u884c\u6846\u67b6/index","unlisted":false},{"type":"link","label":"Pika \u548c RockSDB \u7684\u5bf9\u63a5","href":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/Pika \u548c RockSDB \u7684\u5bf9\u63a5/","docId":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/Pika \u548c RockSDB \u7684\u5bf9\u63a5/index","unlisted":false}],"href":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/"},{"type":"category","label":"Pika \u4f20\u706b\u8ba1\u5212","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Pika \u7ebf\u7a0b\u6a21\u578b\u7b80\u4ecb","href":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u7ebf\u7a0b\u6a21\u578b/","docId":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u7ebf\u7a0b\u6a21\u578b/index","unlisted":false},{"type":"link","label":"Pika \u8bfb\u5199\u6d41\u7a0b\u7b80\u4ecb","href":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u8bfb\u5199\u6d41\u7a0b/","docId":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u8bfb\u5199\u6d41\u7a0b/index","unlisted":false},{"type":"link","label":"Pika \u4e3b\u4ece\u540c\u6bd4","href":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u4e3b\u4ece\u540c\u6b65/","docId":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u4e3b\u4ece\u540c\u6b65/index","unlisted":false}],"href":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/"}],"href":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/"},{"type":"category","label":"\u7f16\u7801\u89c4\u8303","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u7f16\u7801\u89c4\u8303","href":"/docs/\u5f00\u53d1\u6587\u6863/\u7f16\u7801\u89c4\u8303/","docId":"\u5f00\u53d1\u6587\u6863/\u7f16\u7801\u89c4\u8303/index","unlisted":false},{"type":"link","label":"c++ coding style","href":"/docs/\u5f00\u53d1\u6587\u6863/coding-style/","docId":"\u5f00\u53d1\u6587\u6863/coding-style/index","unlisted":false}],"href":"/docs/\u5f00\u53d1\u6587\u6863/"}]},"docs":{"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/index":{"id":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/index","title":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4","description":"","sidebar":"tutorialSidebar"},"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/page info \u4fe1\u606f\u8bf4\u660e/index":{"id":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/page info \u4fe1\u606f\u8bf4\u660e/index","title":"page info \u4fe1\u606f\u8bf4\u660e","description":"\u6267\u884cINFO\u547d\u4ee4","sidebar":"tutorialSidebar"},"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/Pika \u6700\u4f73\u5b9e\u8df5/index":{"id":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/Pika \u6700\u4f73\u5b9e\u8df5/index","title":"Pika \u6700\u4f73\u5b9e\u8df5","description":"\u6211\u4eec\u6839\u636e360\u5185\u90e8\u7684pika\u4f7f\u7528\u7ecf\u9a8c\u53ca\u793e\u533a\u7528\u6237\u7684\u95ee\u9898\u53cd\u9988\uff0c\u6574\u7406\u4e86\u5982\u4e0b\u6587\u6863\u5e76\u4f1a\u4e0d\u65ad\u66f4\u65b0","sidebar":"tutorialSidebar"},"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5206\u5e03\u5f0f\u6a21\u5f0f\u7b80\u5355\u6559\u7a0b/index":{"id":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5206\u5e03\u5f0f\u6a21\u5f0f\u7b80\u5355\u6559\u7a0b/index","title":"\u5206\u5e03\u5f0f\u6a21\u5f0f\u7b80\u5355\u6559\u7a0b","description":"\u5173\u4e8esharding mode\uff0cpika\u5e95\u5c42\u63d0\u4f9bslot \u7684\u6982\u5ff5\u3002Pika\u5c06key\u8fdb\u884c\u54c8\u5e0c\u53d6\u6a21\u4e4b\u540e\u6563\u5217\u5230\u5404\u4e2aslot\u5f53\u4e2d\u5904\u7406\u3002sharding mode \u6839\u636e\u7ebf\u4e0a\u7684\u5177\u4f53\u60c5\u51b5\u53ef\u4ee5\u5e94\u7528\u4e8e\u5355\u4e2apika\uff0c\u4e5f\u53ef\u4ee5\u5e94\u7528\u5230\u591a\u4e2apika\u7ec4\u6210\u7684pika cluster\u3002\u8fd9\u4e2atutorial\u4e3b\u8981\u4ecb\u7ecd\u5f00\u542fsharding mode \u9700\u8981\u4e86\u89e3\u7684\u4e00\u4e9b\u6982\u5ff5\uff0c\u4ee5\u53ca\u9700\u8981\u8c03\u6574\u7684\u4e00\u4e9b\u914d\u7f6e\u53c2\u6570\u3002","sidebar":"tutorialSidebar"},"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5206\u7247\u6559\u7a0b/index":{"id":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5206\u7247\u6559\u7a0b/index","title":"\u5206\u7247\u6559\u7a0b(3.1.2 \u2010 3.3.6)","description":"Pika\u81ea\u7248\u672c3.1.2\u8d77\u5f00\u59cb\u5bf9\u5206\u7247\u505a\u4e86\u4e00\u7cfb\u5217\u652f\u6301\uff0c\u4e3a\u6b64\u6211\u4eec\u4e3a\u5206\u7247\u6a21\u5f0f\u6dfb\u52a0\u4e86\u4e00\u7cfb\u5217\u7684\u547d\u4ee4.","sidebar":"tutorialSidebar"},"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u526f\u672c\u4e00\u81f4\u6027\uff08\u4f7f\u7528\u6587\u6863\uff09/index":{"id":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u526f\u672c\u4e00\u81f4\u6027\uff08\u4f7f\u7528\u6587\u6863\uff09/index","title":"\u526f\u672c\u4e00\u81f4\u6027\uff08\u4f7f\u7528\u6587\u6863\uff09","description":"\u7b80\u4ecb","sidebar":"tutorialSidebar"},"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u526f\u672c\u4e00\u81f4\u6027\uff08\u8bbe\u8ba1\u6587\u6863\uff09/index":{"id":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u526f\u672c\u4e00\u81f4\u6027\uff08\u8bbe\u8ba1\u6587\u6863\uff09/index","title":"\u526f\u672c\u4e00\u81f4\u6027\uff08\u8bbe\u8ba1\u6587\u6863\uff09","description":"\u76ee\u524d\u7ebf\u7a0b\u6a21\u578b","sidebar":"tutorialSidebar"},"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u591a\u5e93\u7248\u547d\u4ee4/index":{"id":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u591a\u5e93\u7248\u547d\u4ee4/index","title":"\u591a\u5e93\u7248\u547d\u4ee4","description":"Pika\u81ea\u7248\u672c3.1.0\u8d77\u5f00\u59cb\u652f\u6301\u591adb\uff0c\u4e3a\u4e86\u517c\u5bb9\u591adb\u90e8\u5206\u547d\u4ee4\u3001\u914d\u7f6e\u53c2\u6570\u53d1\u751f\u4e86\u53d8\u5316\uff0c\u5177\u4f53\u53d8\u5316\u5982\u4e0b\uff1a","sidebar":"tutorialSidebar"},"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5b89\u88c5\u4f7f\u7528/index":{"id":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5b89\u88c5\u4f7f\u7528/index","title":"\u5b89\u88c5\u4f7f\u7528","description":"\u5feb\u901f\u8bd5\u7528","sidebar":"tutorialSidebar"},"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5dee\u5f02\u5316\u547d\u4ee4/index":{"id":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5dee\u5f02\u5316\u547d\u4ee4/index","title":"\u5dee\u5f02\u5316\u547d\u4ee4","description":"config [get | set | rewrite]","sidebar":"tutorialSidebar"},"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u6570\u636e\u76ee\u5f55/index":{"id":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u6570\u636e\u76ee\u5f55/index","title":"\u6570\u636e\u76ee\u5f55","description":"db\u76ee\u5f55","sidebar":"tutorialSidebar"},"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u670d\u52a1\u5668\u72b6\u6001\u76d1\u63a7/index":{"id":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u670d\u52a1\u5668\u72b6\u6001\u76d1\u63a7/index","title":"\u670d\u52a1\u5668\u72b6\u6001\u76d1\u63a7","description":"\u5728pika\u7684\u4f7f\u7528\u4e2d\uff0c\u4e5f\u4e3a\u7528\u6237\u63d0\u4f9b\u4e86\u4e30\u5bcc\u7684info\u5c55\u793a\uff0c\u7528\u4e8e\u76d1\u63a7\u670d\u52a1\u5668\u7684\u8fd0\u884c\u72b6\u6001\u3002","sidebar":"tutorialSidebar"},"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u7ba1\u7406\u6307\u4ee4/index":{"id":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u7ba1\u7406\u6307\u4ee4/index","title":"\u7ba1\u7406\u6307\u4ee4","description":"client kill all","sidebar":"tutorialSidebar"},"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u81ea\u52a8\u5bb9\u707e/index":{"id":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u81ea\u52a8\u5bb9\u707e/index","title":"\u81ea\u52a8\u5bb9\u707e","description":"pika\u80fd\u591f\u914d\u5408Redis-sentinel(\u54e8\u5175)\u5b9e\u73b0\u81ea\u52a8\u5bb9\u707e\u5207\u4e3b, \u4f7f\u7528\u65b9\u5f0f\u4e0eredis\u5b8c\u5168\u4e00\u81f4","sidebar":"tutorialSidebar"},"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u8ba2\u9605/index":{"id":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u8ba2\u9605/index","title":"\u8ba2\u9605","description":"\u53ef\u7528\u7248\u672c\uff1a >= 2.3.0","sidebar":"tutorialSidebar"},"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u914d\u7f6e\u6587\u4ef6\u8bf4\u660e/index":{"id":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u914d\u7f6e\u6587\u4ef6\u8bf4\u660e/index","title":"\u914d\u7f6e\u6587\u4ef6\u8bf4\u660e","description":"","sidebar":"tutorialSidebar"},"\u5e8f\u8a00/FAQ/index":{"id":"\u5e8f\u8a00/FAQ/index","title":"FAQ","description":"1 \u7f16\u8bd1\u5b89\u88c5","sidebar":"tutorialSidebar"},"\u5e8f\u8a00/index":{"id":"\u5e8f\u8a00/index","title":"\u5e8f\u8a00","description":"\u6b22\u8fce\u6765\u5230 PikiwiDB(Pika) \u7684\u4e16\u754c\u3002\u63a5\u4e0b\u6765\u7684\u7bc7\u7ae0\u65e8\u5728\u4e8e\u5e2e\u52a9\u4f60\u5efa\u7acb\u5bf9 PikiwiDB \u6570\u636e\u5e93\u7684\u57fa\u672c\u4e86\u89e3\uff0c\u4f60\u5c06\u4f1a\u9605\u8bfb\u5230\uff1a","sidebar":"tutorialSidebar"},"\u5e8f\u8a00/\u652f\u6301\u7684 Redis \u63a5\u53e3\u4e0e\u517c\u5bb9\u60c5\u51b5/index":{"id":"\u5e8f\u8a00/\u652f\u6301\u7684 Redis \u63a5\u53e3\u4e0e\u517c\u5bb9\u60c5\u51b5/index","title":"\u652f\u6301\u7684 Redis \u63a5\u53e3\u4e0e\u517c\u5bb9\u60c5\u51b5","description":"pika\u652f\u6301redis\u4e94\u79cd\u7c7b\u578b\uff08\u5206\u522b\u4e3astring\u3001hash\u3001list\u3001set\u3001zset\uff09\u7684\u63a5\u53e3\uff0c\u5148\u5217\u51fa\u5176\u5bf9redis\u7684\u4e94\u79cd\u6570\u636e\u7ed3\u6784\u517c\u5bb9\u7edf\u8ba1\u3002","sidebar":"tutorialSidebar"},"\u5e8f\u8a00/\u7b80\u4ecb/index":{"id":"\u5e8f\u8a00/\u7b80\u4ecb/index","title":"PikiwiDB(Pika) \u7b80\u4ecb","description":"PikiwiDB(Pika)-Logo-Logo.png)","sidebar":"tutorialSidebar"},"\u5f00\u53d1\u6587\u6863/coding-style/index":{"id":"\u5f00\u53d1\u6587\u6863/coding-style/index","title":"c++ coding style","description":"header file","sidebar":"tutorialSidebar"},"\u5f00\u53d1\u6587\u6863/index":{"id":"\u5f00\u53d1\u6587\u6863/index","title":"\u7f16\u7801\u89c4\u8303","description":"","sidebar":"tutorialSidebar"},"\u5f00\u53d1\u6587\u6863/\u7f16\u7801\u89c4\u8303/index":{"id":"\u5f00\u53d1\u6587\u6863/\u7f16\u7801\u89c4\u8303/index","title":"\u7f16\u7801\u89c4\u8303","description":"c++ coding style","sidebar":"tutorialSidebar"},"\u6027\u80fd\u4e0e\u4f18\u5316/3.2.x \u6027\u80fd/index":{"id":"\u6027\u80fd\u4e0e\u4f18\u5316/3.2.x \u6027\u80fd/index","title":"3.2.x \u6027\u80fd","description":"Performance\uff1a","sidebar":"tutorialSidebar"},"\u6027\u80fd\u4e0e\u4f18\u5316/index":{"id":"\u6027\u80fd\u4e0e\u4f18\u5316/index","title":"\u6027\u80fd\u4e0e\u4f18\u5316","description":"","sidebar":"tutorialSidebar"},"\u6027\u80fd\u4e0e\u4f18\u5316/Pika 3.5 \u53c2\u6570\u4f18\u5316\u624b\u518c/index":{"id":"\u6027\u80fd\u4e0e\u4f18\u5316/Pika 3.5 \u53c2\u6570\u4f18\u5316\u624b\u518c/index","title":"Pika 3.5 \u53c2\u6570\u4f18\u5316\u624b\u518c","description":"1970","sidebar":"tutorialSidebar"},"\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/index":{"id":"\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/index","title":"Pika \u4f18\u5316\u6848\u4f8b","description":"","sidebar":"tutorialSidebar"},"\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/\u559c\u9a6c\u62c9\u96c5 Redis \u4e0e Pika \u7f13\u5b58\u4f7f\u7528\u519b\u89c4/index":{"id":"\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/\u559c\u9a6c\u62c9\u96c5 Redis \u4e0e Pika \u7f13\u5b58\u4f7f\u7528\u519b\u89c4/index","title":"\u559c\u9a6c\u62c9\u96c5 Redis \u4e0e Pika \u7f13\u5b58\u4f7f\u7528\u519b\u89c4","description":"\u5ba3\u8a00\uff1a\u7f13\u5b58\u4e0d\u662f\u4e07\u91d1\u6cb9\uff0c\u66f4\u4e0d\u662f\u5783\u573e\u6876\uff01\uff01\uff01","sidebar":"tutorialSidebar"},"\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/\u8c03\u6574 max-write-buffer-size \u4f18\u5316 pika \u6027\u80fd10\u500d\u7684\u6848\u4f8b/index":{"id":"\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/\u8c03\u6574 max-write-buffer-size \u4f18\u5316 pika \u6027\u80fd10\u500d\u7684\u6848\u4f8b/index","title":"\u8c03\u6574 max-write-buffer-size \u4f18\u5316 pika \u6027\u80fd10\u500d\u7684\u6848\u4f8b","description":"\u73b0\u5c45\u73e0\u6d77\uff0c\u5148\u540e\u62c5\u4efb\u4e13\u804c Oracle \u548c MySQL DBA\uff0c\u73b0\u5728\u4e3b\u8981\u8d1f\u8d23 MySQL\u3001mongoDB \u548c Redis \u7ef4\u62a4\u5de5\u4f5c\u3002","sidebar":"tutorialSidebar"},"\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u5185\u5b58\u4f7f\u7528/index":{"id":"\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u5185\u5b58\u4f7f\u7528/index","title":"Pika \u5185\u5b58\u4f7f\u7528","description":"Pika\u5185\u5b58\u5360\u7528","sidebar":"tutorialSidebar"},"\u6027\u80fd\u4e0e\u4f18\u5316/Redis \u4e0e Pika scan \u6027\u80fd\u5bf9\u6bd4/index":{"id":"\u6027\u80fd\u4e0e\u4f18\u5316/Redis \u4e0e Pika scan \u6027\u80fd\u5bf9\u6bd4/index","title":"Redis \u4e0e Pika scan \u6027\u80fd\u5bf9\u6bd4","description":"Redis \u662f\u540e\u7aef\u5e38\u7528\u7684\u952e\u503c\u6570\u636e\u5e93\u3002Pika \u662f 360 \u51fa\u54c1\u7684\u4e00\u6b3e\u4e0e Redis \u534f\u8bae\u51e0\u4e4e\u517c\u5bb9\u7684\u6570\u636e\u5e93\u3002\u4e0e Redis \u4e0d\u540c\u7684\u662f\uff0cPika \u57fa\u4e8e\u786c\u76d8\uff0c\u4f7f\u7528 RocksDB \u4f5c\u4e3a\u5f15\u64ce\uff0c\u4ece\u5bb9\u91cf\u4e0a\u6765\u8bf4\uff0c\u6bd4\u57fa\u4e8e\u5185\u5b58\u7684 Redis \u5927\u4e86\u4e0d\u5c11\uff0c\u800c\u4e14\u5728\u6027\u80fd\u4e0a\u4e5f\u80fd\u6ee1\u8db3\u4e00\u822c\u9700\u6c42\u3002","sidebar":"tutorialSidebar"},"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/index":{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/index","title":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0","description":"","sidebar":"tutorialSidebar"},"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/NoSQL \u539f\u7406\u6982\u8ff0/index":{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/NoSQL \u539f\u7406\u6982\u8ff0/index","title":"NoSQL \u539f\u7406\u6982\u8ff0","description":"pika \u8bbe\u8ba1","sidebar":"tutorialSidebar"},"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4e0e Codis/index":{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4e0e Codis/index","title":"Pika \u4e0e Codis","description":"\u80cc\u666f","sidebar":"tutorialSidebar"},"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/index":{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/index","title":"Pika \u4f20\u706b\u8ba1\u5212","description":"\u4e3a\u65b9\u4fbf\u521a\u63a5\u89e6Pika\u7684\u540c\u5b66\u80fd\u591f\u66f4\u5feb\u7684\u4e0a\u624b\u63d0\u4ea4\u7b2c\u4e00\u4e2aPika PR\u3002\u57fa\u4e8ev3.3.4\u4ee3\u7801\uff0c\u4ece\u4ee3\u7801\u5c42\u9762\u5bf9Pika\u8fdb\u884c\u4e86\u5168\u65b9\u9762\u7684\u68b3\u7406\u3002\u8fd9\u4e2a\u60f3\u6cd5\u53eb\u4f20\u706b\u8ba1\u5212\uff0c\u5e0c\u671bPika\u661f\u661f\u4e4b\u706b\u53ef\u4ee5\u71ce\u539f\u3002","sidebar":"tutorialSidebar"},"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u4e3b\u4ece\u540c\u6b65/index":{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u4e3b\u4ece\u540c\u6b65/index","title":"Pika \u4e3b\u4ece\u540c\u6bd4","description":"alt text","sidebar":"tutorialSidebar"},"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u7ebf\u7a0b\u6a21\u578b/index":{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u7ebf\u7a0b\u6a21\u578b/index","title":"Pika \u7ebf\u7a0b\u6a21\u578b\u7b80\u4ecb","description":"alt text","sidebar":"tutorialSidebar"},"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u8bfb\u5199\u6d41\u7a0b/index":{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u8bfb\u5199\u6d41\u7a0b/index","title":"Pika \u8bfb\u5199\u6d41\u7a0b\u7b80\u4ecb","description":"alt text","sidebar":"tutorialSidebar"},"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/index":{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/index","title":"Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0","description":"","sidebar":"tutorialSidebar"},"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/Pika \u548c RockSDB \u7684\u5bf9\u63a5/index":{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/Pika \u548c RockSDB \u7684\u5bf9\u63a5/index","title":"Pika \u548c RockSDB \u7684\u5bf9\u63a5","description":"\u5728\u300aPika\u6e90\u7801\u5b66\u4e60--pika\u7684\u547d\u4ee4\u6267\u884c\u6846\u67b6\u300b\u4e2d\u6211\u4eec\u4e86\u89e3\u4e86\u4e00\u4e2a\u547d\u4ee4\u7684\u6267\u884c\u6d41\u7a0b\uff0c\u4e5f\u77e5\u9053\u4e86pika\u4f7f\u7528\u7684\u662fBlackwidow\u5f15\u64ce\uff0c\u73b0\u5728\u6211\u4eec\u6765\u770b\u770bpika\u662f\u600e\u4e48\u548crocksdb\u5bf9\u63a5\u7684\uff0cBlackwidow\u5177\u4f53\u600e\u4e48\u5904\u7406\u547d\u4ee4\u3002","sidebar":"tutorialSidebar"},"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/Pika \u7684\u547d\u4ee4\u6267\u884c\u6846\u67b6/index":{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/Pika \u7684\u547d\u4ee4\u6267\u884c\u6846\u67b6/index","title":"Pika \u7684\u547d\u4ee4\u6267\u884c\u6846\u67b6","description":"\u4eca\u5929\u6211\u4eec\u4e00\u8d77\u6765\u770b\u4e0bpika\u6536\u5230\u4e00\u4e2a\u547d\u4ee4\u540e\uff0c\u662f\u600e\u4e48\u5904\u7406\u8fd9\u4e2a\u547d\u4ee4\u7684\u3002","sidebar":"tutorialSidebar"},"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/PubSub \u673a\u5236/index":{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/PubSub \u673a\u5236/index","title":"Pubsub \u673a\u5236","description":"\u524d\u4e00\u7bc7\u300aPika\u6e90\u7801\u5b66\u4e60--pika\u7684\u901a\u4fe1\u548c\u7ebf\u7a0b\u6a21\u578b\u300b\u91cc\u8bf4\u5230WorkerThread\u91cc\u9762\u6709\u4e24\u79cd\u5904\u7406\u547d\u4ee4\u7684\u65b9\u5f0f\uff0c\u4e00\u79cd\u662f\u540c\u6b65\uff0c\u4e00\u79cd\u662f\u5f02\u6b65\u3002\u90a3\u4ec0\u4e48\u65f6\u5019\u662f\u540c\u6b65\u5904\u7406\uff0c\u4ec0\u4e48\u65f6\u5019\u662f\u5f02\u6b65\u5904\u7406\u5462\uff1f\u5176\u5b9e","sidebar":"tutorialSidebar"},"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/\u901a\u4fe1\u548c\u7ebf\u7a0b\u6a21\u578b/index":{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/\u901a\u4fe1\u548c\u7ebf\u7a0b\u6a21\u578b/index","title":"\u901a\u4fe1\u548c\u7ebf\u7a0b\u6a21\u578b","description":"pika\u7684\u7ebf\u7a0b\u6a21\u578b\u6709\u5b98\u65b9\u7684wiki\u4ecb\u7ecd\uff0c\u8fd9\u91cc\u4e3b\u8981\u4ecb\u7ecd\u4e86pika\u90fd\u6709\u54ea\u4e9b\u7ebf\u7a0b\uff0c\u8fd9\u4e9b\u7ebf\u7a0b\u7528\u6765\u5e72\u561b\u3002\u672c\u7bc7\u6587\u7ae0\u4e3b\u8981\u6d89\u53ca\u76d1\u542c\u7ebf\u7a0bDispatchThread\u3001IO\u5de5\u4f5c\u7ebf\u7a0bWorkerThread\u548c\u5de5\u4f5c\u7ebf\u7a0b\u6c60ThreadPool\uff0c\u7ed3\u5408\u4ee3\u7801\u4ecb\u7ecd\u91cc\u9762\u5b9e\u73b0\u7684\u4e00\u4e9b\u7ec6\u8282\u3002","sidebar":"tutorialSidebar"},"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u4e3b\u4ece\u540c\u6b65/index":{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u4e3b\u4ece\u540c\u6b65/index","title":"\u4e3b\u4ece\u540c\u6b65","description":"pika\u4e3b\u4ece\u540c\u6b65","sidebar":"tutorialSidebar"},"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u5168\u540c\u6b65/index":{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u5168\u540c\u6b65/index","title":"\u5168\u540c\u6b65","description":"\u80cc\u666f","sidebar":"tutorialSidebar"},"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u526f\u672c\u4e00\u81f4\u6027/index":{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u526f\u672c\u4e00\u81f4\u6027/index","title":"\u526f\u672c\u4e00\u81f4\u6027","description":"\u76ee\u524d\u7ebf\u7a0b\u6a21\u578b","sidebar":"tutorialSidebar"},"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u589e\u91cf\u540c\u6b65/index":{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u589e\u91cf\u540c\u6b65/index","title":"\u589e\u91cf\u540c\u6b65","description":"\u80cc\u666f","sidebar":"tutorialSidebar"},"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u5feb\u7167\u5f0f\u5907\u4efd/index":{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u5feb\u7167\u5f0f\u5907\u4efd/index","title":"\u5feb\u7167\u5f0f\u5907\u4efd","description":"\u539f\u7406","sidebar":"tutorialSidebar"},"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u6574\u4f53\u6280\u672f\u67b6\u6784/index":{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u6574\u4f53\u6280\u672f\u67b6\u6784/index","title":"\u6574\u4f53\u6280\u672f\u67b6\u6784","description":"\u6982\u8ff0","sidebar":"tutorialSidebar"},"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65b0\u5b58\u50a8\u65b9\u6848\uff1a\u8be6\u7ec6\u89e3\u6790/index":{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65b0\u5b58\u50a8\u65b9\u6848\uff1a\u8be6\u7ec6\u89e3\u6790/index","title":"\u65b0\u5b58\u50a8\u7ed3\u6784\uff1a\u8be6\u7ec6\u89e3\u6790","description":"\u6574\u4f53\u67b6\u6784","sidebar":"tutorialSidebar"},"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65b0\u5b58\u50a8\u7ed3\u6784/index":{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65b0\u5b58\u50a8\u7ed3\u6784/index","title":"\u65b0\u5b58\u50a8\u7ed3\u6784","description":"\u6574\u4f53\u67b6\u6784","sidebar":"tutorialSidebar"},"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65e7\u5b58\u50a8\u7ed3\u6784/index":{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65e7\u5b58\u50a8\u7ed3\u6784/index","title":"\u65e7\u5b58\u50a8\u7ed3\u6784","description":"Blackwidow \u672c\u8d28\u4e0a\u662f\u57fa\u4e8e rocksdb \u7684\u5c01\u88c5\uff0c\u4f7f\u672c\u8eab\u53ea\u652f\u6301 kv \u5b58\u50a8\u7684 rocksdb \u80fd\u591f\u652f\u6301\u591a\u79cd\u6570\u636e\u7ed3\u6784, \u76ee\u524d Blackwidow \u652f\u6301\u4e94\u79cd\u6570\u636e\u7ed3\u6784\u7684\u5b58\u50a8\uff1aString \u7ed3\u6784(\u5b9e\u9645\u4e0a\u5c31\u662f\u5b58\u50a8 key, value), Hash \u7ed3\u6784\uff0cList \u7ed3\u6784\uff0cSet \u7ed3\u6784\u548c ZSet \u7ed3\u6784\uff0c \u56e0\u4e3a Rocksdb \u7684\u5b58\u50a8\u65b9\u5f0f\u53ea\u6709 kv \u4e00\u79cd\uff0c \u6240\u4ee5\u4e0a\u8ff0\u4e94\u79cd\u6570\u636e\u7ed3\u6784\u6700\u7ec8\u90fd\u8981\u843d\u76d8\u5230 Rocksdb \u7684 kv \u5b58\u50a8\u65b9\u5f0f\u4e0a\uff0c\u4e0b\u9762\u6211\u4eec\u5c55\u793a Blackwidow \u548c rocksdb \u7684\u5173\u7cfb\u5e76\u4e14\u8bf4\u660e\u6211\u4eec\u662f\u5982\u4f55\u7528 kv \u6765\u6a21\u62df\u591a\u6570\u636e\u7ed3\u6784\u7684\u3002","sidebar":"tutorialSidebar"},"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u7ebf\u7a0b\u6a21\u578b/index":{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u7ebf\u7a0b\u6a21\u578b/index","title":"\u7ebf\u7a0b\u6a21\u578b","description":"pika\u4f7f\u7528\u7684\u662f\u591a\u7ebf\u7a0b\u6a21\u578b\uff0c\u4f7f\u7528\u591a\u4e2a\u5de5\u4f5c\u7ebf\u7a0b\u6765\u8fdb\u884c\u8bfb\u5199\u64cd\u4f5c\uff0c\u7531\u5e95\u5c42blackwidow\u5f15\u64ce\u6765\u4fdd\u8bc1\u7ebf\u7a0b\u5b89\u5168\uff0c\u7ebf\u7a0b\u5206\u4e3a12\u79cd\uff1a","sidebar":"tutorialSidebar"},"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u9501\u7684\u5e94\u7528/index":{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u9501\u7684\u5e94\u7528/index","title":"\u9501\u7684\u5e94\u7528","description":"pika\u4f5c\u4e3a\u7c7bredis\u7684\u5b58\u50a8\u7cfb\u7edf\uff0c\u4e3a\u4e86\u5f25\u8865\u5728\u6027\u80fd\u4e0a\u7684\u4e0d\u8db3\uff0c\u5728\u6574\u4e2a\u7cfb\u7edf\u4e2d\u5927\u91cf\u4f7f\u7528\u591a\u7ebf\u7a0b\u7684\u7ed3\u6784\uff0c\u6d89\u53ca\u5230\u591a\u7ebf\u7a0b\u7f16\u7a0b\uff0c\u52bf\u5fc5\u9700\u8981\u4e3a\u7ebf\u7a0b\u52a0\u9501\u6765\u4fdd\u8bc1\u6570\u636e\u8bbf\u95ee\u7684\u4e00\u81f4\u6027\u548c\u6709\u6548\u6027\u3002\u5176\u4e2d\u4e3b\u8981\u7528\u5230\u4e86\u4e09\u79cd\u9501","sidebar":"tutorialSidebar"}}}}')}}]); \ No newline at end of file diff --git a/build/assets/js/03ab4acf.473ee52d.js b/build/assets/js/03ab4acf.473ee52d.js new file mode 100644 index 0000000..e7c6352 --- /dev/null +++ b/build/assets/js/03ab4acf.473ee52d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[1903],{6907:(e,i,c)=>{c.r(i),c.d(i,{assets:()=>o,contentTitle:()=>r,default:()=>x,frontMatter:()=>d,metadata:()=>l,toc:()=>h});var s=c(4848),n=c(8453);const d={title:"Pika \u6700\u4f73\u5b9e\u8df5",sidebar_position:110},r=void 0,l={id:"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/Pika \u6700\u4f73\u5b9e\u8df5/index",title:"Pika \u6700\u4f73\u5b9e\u8df5",description:"\u6211\u4eec\u6839\u636e360\u5185\u90e8\u7684pika\u4f7f\u7528\u7ecf\u9a8c\u53ca\u793e\u533a\u7528\u6237\u7684\u95ee\u9898\u53cd\u9988\uff0c\u6574\u7406\u4e86\u5982\u4e0b\u6587\u6863\u5e76\u4f1a\u4e0d\u65ad\u66f4\u65b0",source:"@site/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/Pika \u6700\u4f73\u5b9e\u8df5/index.md",sourceDirName:"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/Pika \u6700\u4f73\u5b9e\u8df5",slug:"/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/Pika \u6700\u4f73\u5b9e\u8df5/",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/Pika \u6700\u4f73\u5b9e\u8df5/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/Pika \u6700\u4f73\u5b9e\u8df5/index.md",tags:[],version:"current",sidebarPosition:110,frontMatter:{title:"Pika \u6700\u4f73\u5b9e\u8df5",sidebar_position:110},sidebar:"tutorialSidebar",previous:{title:"\u526f\u672c\u4e00\u81f4\u6027\uff08\u8bbe\u8ba1\u6587\u6863\uff09",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u526f\u672c\u4e00\u81f4\u6027\uff08\u8bbe\u8ba1\u6587\u6863\uff09/"},next:{title:"\u6027\u80fd\u4e0e\u4f18\u5316",permalink:"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/"}},o={},h=[{value:"\u6211\u4eec\u6839\u636e360\u5185\u90e8\u7684pika\u4f7f\u7528\u7ecf\u9a8c\u53ca\u793e\u533a\u7528\u6237\u7684\u95ee\u9898\u53cd\u9988\uff0c\u6574\u7406\u4e86\u5982\u4e0b\u6587\u6863\u5e76\u4f1a\u4e0d\u65ad\u66f4\u65b0",id:"\u6211\u4eec\u6839\u636e360\u5185\u90e8\u7684pika\u4f7f\u7528\u7ecf\u9a8c\u53ca\u793e\u533a\u7528\u6237\u7684\u95ee\u9898\u53cd\u9988\u6574\u7406\u4e86\u5982\u4e0b\u6587\u6863\u5e76\u4f1a\u4e0d\u65ad\u66f4\u65b0",level:3}];function p(e){const i={blockquote:"blockquote",code:"code",em:"em",h3:"h3",hr:"hr",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.h3,{id:"\u6211\u4eec\u6839\u636e360\u5185\u90e8\u7684pika\u4f7f\u7528\u7ecf\u9a8c\u53ca\u793e\u533a\u7528\u6237\u7684\u95ee\u9898\u53cd\u9988\u6574\u7406\u4e86\u5982\u4e0b\u6587\u6863\u5e76\u4f1a\u4e0d\u65ad\u66f4\u65b0",children:"\u6211\u4eec\u6839\u636e360\u5185\u90e8\u7684pika\u4f7f\u7528\u7ecf\u9a8c\u53ca\u793e\u533a\u7528\u6237\u7684\u95ee\u9898\u53cd\u9988\uff0c\u6574\u7406\u4e86\u5982\u4e0b\u6587\u6863\u5e76\u4f1a\u4e0d\u65ad\u66f4\u65b0"}),"\n",(0,s.jsxs)(i.blockquote,{children:["\n",(0,s.jsx)(i.p,{children:"\u4e3a\u4e86\u907f\u514d\u4ee5\u540e\u4f60\u53ef\u80fd\u627e\u4e0d\u5230\u672c\u6587\uff0c\u53ef\u70b9\u51fb\u53f3\u4e0a\u65b9\u7684star\u8fdb\u884c\u5173\u6ce8"}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"pika\u6700\u4f73\u5b9e\u8df5\u4e4b\u96f6\uff1a"})}),"\n",(0,s.jsx)(i.p,{children:"\u5728\u7fa4\u91cc\u63d0\u95ee\u4e3b\u52a8\u5e26\u4e0a\u7248\u672c\u53f7\u80fd\u5927\u5e45\u5ea6\u52a0\u5feb\u95ee\u9898\u89e3\u51b3\u901f\u5ea6\uff08QQ\u7fa4\uff1a294254078\uff09"}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"pika\u6700\u4f73\u5b9e\u8df5\u4e4b\u4e00\uff1a"})}),"\n",(0,s.jsx)(i.p,{children:"\u6211\u4eec\u5efa\u8bae\u4f7f\u75283.0\u7684\u6700\u65b0\u7248\uff0c\u5982\u679c\u4e0d\u613f\u610f\u4f7f\u75283.X\uff0c\u8bf7\u4f7f\u75282.3.6\uff0c\u5426\u5219\u4f60\u4f1a\u53d1\u73b0\u4f60\u9047\u5230\u7684\u5f88\u591a\u95ee\u9898\u90fd\u5728\u6211\u4eec\u7684bug\u4fee\u590d\u5217\u8868\u4e2d\u3002\uff08\u76ee\u524d2.0\u7248\u672c\u5df2\u4e0d\u518d\u7ef4\u62a4\uff09"}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"pika\u6700\u4f73\u5b9e\u8df5\u4e4b\u4e8c\uff1a"})}),"\n",(0,s.jsx)(i.p,{children:"pika\u7684\u7ebf\u7a0b\u6570\u91cf\u5efa\u8bae\u548ccpu\u603b\u7ebf\u7a0b\u6570\u4e00\u81f4\uff0c\u5982\u679c\u662f\u5355\u673a\u591a\u5b9e\u4f8b\u7684\u90e8\u7f72\uff0c\u6bcf\u4e2apika\u5b9e\u4f8b\u7684\u7ebf\u7a0b\u6570\u91cf\u53ef\u4ee5\u914c\u60c5\u964d\u4f4e\uff0c\u4f46\u4e0d\u5efa\u8bae\u4f4e\u4e8ecpu\u603b\u7ebf\u7a0b\u6570\u76841/2"}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"pika\u6700\u4f73\u5b9e\u8df5\u4e4b\u4e09\uff1a"})}),"\n",(0,s.jsx)(i.p,{children:"pika\u7684\u6027\u80fd\u548cIO\u6027\u80fd\u606f\u606f\u76f8\u5173\uff0c\u6211\u4eec\u4e0d\u5efa\u8bae\u5728\u673a\u68b0\u76d8\u4e0a\u90e8\u7f72\u8017\u65f6\u654f\u611f\u9879\u76ee\u7684pika\uff0c\u53e6\u5916\u4e3a\u4e86\u907f\u514d\u4e00\u4e9b\u7a00\u5947\u53e4\u602a\u7684\u95ee\u9898\uff0c\u4e3b\u4ece\u670d\u52a1\u5668\u7684\u786c\u4ef6\u6027\u80fd\u5e94\u5f53\u5c3d\u91cf\u4e00\u81f4"}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"pika\u6700\u4f73\u5b9e\u8df5\u4e4b\u56db\uff1a"})}),"\n",(0,s.jsx)(i.p,{children:"\u5728\u4f7f\u7528pika\u591a\u6570\u636e\u7ed3\u6784\u7684\u65f6\u5019\uff0c\u5c3d\u91cf\u786e\u4fdd\u6bcf\u4e2akey\u4e2d\u7684field\u4e0d\u8981\u592a\u591a\uff0c\u5efa\u8bae\u6bcf\u4e2akey\u7684field\u6570\u91cf\u4e0d\u8981\u8d85\u8fc71\u4e07\u4e2a\uff0c\u7279\u5927key\u53ef\u4ee5\u8003\u8651\u62c6\u5206\u4e3a\u591a\u4e2a\u5c0fkey\uff0c\u8fd9\u6837\u53ef\u4ee5\u907f\u514d\u8d85\u5927key\u5f88\u591a\u6f5c\u5728\u7684\u6027\u80fd\u98ce\u9669"}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"pika\u6700\u4f73\u5b9e\u8df5\u4e4b\u4e94\uff1a"})}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.code,{children:"root-connection-num"}),"\u53c2\u6570\u975e\u5e38\u6709\u7528\uff0c\u610f\u4e3a\u201c\u5141\u8bb8\u901a\u8fc7127.0.0.1\u767b\u5f55pika\u7684\u8fde\u63a5\u6570\u201d\uff0c\u5b83\u4e0e\u6700\u5927\u8fde\u63a5\u6570\u914d\u7f6e\u9879",(0,s.jsx)(i.code,{children:"maxclients"}),"\u72ec\u7acb\uff0c",(0,s.jsx)(i.code,{children:"maxclients"}),"\u7684\u7528\u5c3d\u5e76\u4e0d\u4f1a\u5f71\u54cd",(0,s.jsx)(i.code,{children:"root-connection-num"}),"\uff0c\u56e0\u6b64\u5728\u53d1\u751f\u5f02\u5e38",(0,s.jsx)(i.code,{children:"maxclients"}),"\u88ab\u7528\u5c3d\u7684\u573a\u666f\u4e2d\uff0c\u7ba1\u7406\u5458\u4ecd\u7136\u53ef\u4ee5\u767b\u5f55pika\u6240\u5728\u670d\u52a1\u5668\u5e76\u901a\u8fc7127.0.0.1\u6765\u767b\u5165pika\u5904\u7406\u95ee\u9898\uff0c\u907f\u514d\u4e86",(0,s.jsx)(i.code,{children:"maxclients"}),"\u8017\u5c3d\u65e0\u6cd5\u767b\u5f55\u5904\u7406\u7684\u5c34\u5c2c\u5c40\u9762"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"pika\u6700\u4f73\u5b9e\u8df5\u4e4b\u516d\uff1a"})}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.code,{children:"client kill"}),"\u547d\u4ee4\u88ab\u52a0\u5f3a\u4e86\uff0c\u5982\u679c\u4f60\u60f3\u4e00\u6b21\u6027\u6740\u6389\u5f53\u524dpika\u7684\u6240\u6709\u8fde\u63a5\uff0c\u53ea\u9700\u8981\u6267\u884c",(0,s.jsx)(i.code,{children:"client kill all"}),"\uff0c\u4e0d\u7528\u62c5\u5fc3\uff0c\u7528\u4e8e\u540c\u6b65\u7684\u8fde\u63a5\u4e0d\u4f1a\u53d7\u5230\u5f71\u54cd"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"pika\u6700\u4f73\u5b9e\u8df5\u4e4b\u4e03\uff1a"})}),"\n",(0,s.jsxs)(i.p,{children:["\u9002\u5f53\u7684\u8c03\u6574",(0,s.jsx)(i.code,{children:"timeout"}),"\u53c2\u6570\uff0c\u901a\u8fc7\u8be5\u53c2\u6570pika\u4f1a\u4e3b\u52a8\u65ad\u5f00\u4e0d\u6d3b\u52a8\u65f6\u95f4\u8d85\u8fc7",(0,s.jsx)(i.code,{children:"timeout"}),"\u503c\u7684\u8fde\u63a5\uff0c\u907f\u514d\u8fde\u63a5\u6570\u8017\u5c3d\u95ee\u9898\u7684\u53d1\u751f\uff0c\u7531\u4e8e\u8fde\u63a5\u4e5f\u9700\u8981\u7533\u8bf7\u5185\u5b58\uff0c\u56e0\u6b64\u5408\u7406\u7684\u914d\u7f6e",(0,s.jsx)(i.code,{children:"timeout"}),"\u53c2\u6570\u4e5f\u80fd\u591f\u5728\u4e00\u5b9a\u7a0b\u5ea6\u4e0a\u964d\u4f4epika\u7684\u5185\u5b58\u5360\u7528"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"pika\u6700\u4f73\u5b9e\u8df5\u4e4b\u516b\uff1a"})}),"\n",(0,s.jsxs)(i.p,{children:["pika\u7684\u5185\u5b58\u5360\u7528\u4e3b\u8981\u96c6\u4e2d\u5728sst\u6587\u4ef6\u7684cache\u548c\u8fde\u63a5\u7533\u8bf7\u5185\u5b58\uff0c\u800c\u901a\u5e38\u8fde\u63a5\u7533\u8bf7\u5185\u5b58\u4f1a\u6bd4sst\u7684cache\u8981\u5927\u5f88\u591a\uff0cpika\u76ee\u524d\u5df2\u652f\u6301\u8fde\u63a5\u7533\u8bf7\u5185\u5b58\u7684\u52a8\u6001\u8c03\u6574\u3001\u56de\u6536\uff0c\u56e0\u6b64\u8fde\u63a5\u5360\u7528\u7684\u603b\u5185\u5b58\u5927\u5c0f\u662f\u53ef\u4ee5\u7c97\u7565\u4f30\u7b97\u7684\uff0c\u5982\u679c\u4f60\u7684pika\u5185\u5b58\u5360\u7528\u8fdc\u8d85\u9884\u4f30\u6216\u5927\u4e8e10g\uff0c\u90a3\u4e48\u53ef\u80fd\u662f\u5185\u5b58\u6cc4\u6f0f\u4e86\uff0c\u5c1d\u8bd5\u4f9d\u6b21\u6267\u884c\u547d\u4ee4",(0,s.jsx)(i.code,{children:"client kill all"}),"\u548c",(0,s.jsx)(i.code,{children:"tcmalloc free"}),"\u6765\u5bf9\u8fde\u63a5\u5185\u5b58\u8fdb\u884c\u5f3a\u5236\u56de\u6536\uff0c\u5982\u679c\u6548\u679c\u4e0d\u597d\u8bf7\u5347\u7ea7\u5230\u6700\u65b0\u7248\u672c"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"pika\u6700\u4f73\u5b9e\u8df5\u4e4b\u4e5d\uff1a"})}),"\n",(0,s.jsx)(i.p,{children:"\u975e\u5e38\u4e0d\u5efa\u8bae\u5355\u673a\u8fd0\u884cpika\uff0c\u6700\u7b80\u96c6\u7fa4\u72b6\u6001\u5e94\u4e3a\u4e00\u4e3b\u4e00\u4ece\uff0c\u800c\u4e3b\u4ece\u96c6\u7fa4\u7684\u5bb9\u707e\u6a21\u5f0f\u6709\u5f88\u591a\u79cd\uff0c\u53ef\u4ee5\u8003\u8651\u4f7f\u7528lvs\u3001vip\u6f02\u79fb\u3001\u914d\u7f6e\u7ba1\u7406\u4e2d\u95f4\u4ef6\u7b49"}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"pika\u6700\u4f73\u5b9e\u8df5\u4e4b\u5341\uff1a"})}),"\n",(0,s.jsx)(i.p,{children:"\u5efa\u8bae\u4f7f\u7528\u4e3b\u4ece\u96c6\u7fa4\u800c\u4e0d\u662f\u53cc\u4e3b\u6a21\u5f0f\uff0c\u5728\u5b9e\u9645\u4f7f\u7528\u4e2d\u53cc\u4e3b\u6a21\u5f0f\u5bf9\u4f7f\u7528\u89c4\u8303\u7684\u8981\u6c42\u3001\u7f51\u7edc\u73af\u5883\u8981\u6c42\u76f8\u5bf9\u66f4\u9ad8\uff0c\u4f7f\u7528\u4e0d\u89c4\u8303\u3001\u7f51\u7edc\u73af\u5883\u4e0d\u597d\u4f1a\u9020\u6210\u53cc\u4e3b\u6a21\u5f0f\u51fa\u73b0\u95ee\u9898\uff0c\u5728\u51fa\u73b0\u95ee\u9898\u540e\uff0c\u53cc\u4e3b\u6a21\u5f0f\u7684\u6570\u636e\u4fee\u590d\u6bd4\u4e3b\u4ece\u96c6\u7fa4\u6570\u636e\u4fee\u590d\u590d\u6742\u5ea6\u8981\u5927"}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"pika\u6700\u4f73\u5b9e\u8df5\u4e4b\u5341\u4e00\uff1a"})}),"\n",(0,s.jsxs)(i.p,{children:["\u5982\u679c\u4f60\u7684pika\u5355\u673a\u8fd0\u884c\uff08\u975e\u4e3b\u4ece\u3001\u4e3b\u4e3b\u96c6\u7fa4\uff09\uff0c\u5e76\u90e8\u7f72\u5728\u53ef\u9760\u7684\u5b58\u50a8\u4e0a\uff0c\u90a3\u4e48\u53ef\u4ee5\u8003\u8651\u901a\u8fc7\u5173\u95edbinlog\uff08\u5c06",(0,s.jsx)(i.code,{children:"write-binlog"}),"\u53c2\u6570\u8bbe\u7f6e\u4e3ano\uff09\u6765\u63d0\u9ad8\u5199\u5165\u6027\u80fd\uff0c\u4e0d\u8fc7\u6211\u4eec\u5e76\u4e0d\u63a8\u8350\u5355\u673a\u8fd0\u884c\uff0c\u81f3\u5c11\u5e94\u5f53\u6709\u4e00\u4e2a\u4ece\u5e93\u7528\u4e8e\u5bb9\u707e\uff0c\u6240\u4ee5\u975e\u5355\u673a\u8fd0\u884cpika \u4e0d\u5efa\u8bae\u5173\u95edbinlog"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"pika\u6700\u4f73\u5b9e\u8df5\u4e4b\u5341\u4e8c\uff1a"})}),"\n",(0,s.jsxs)(i.p,{children:["pika\u7684\u6570\u636e\u76ee\u5f55\u4e2d\u6709\u5927\u91cf\u7684sst\u6587\u4ef6\uff0c\u8fd9\u4e9b\u6587\u4ef6\u968f\u7740pika\u6570\u636e\u91cf\u7684\u589e\u52a0\u800c\u589e\u52a0\uff0c\u56e0\u6b64\u4f60\u9700\u8981\u4e3apika\u914d\u7f6e\u4e00\u4e2a\u66f4\u5927\u7684",(0,s.jsx)(i.code,{children:"open_file_limit"}),"\u907f\u514d\u4e0d\u591f\u7528\uff0c\u5982\u679c\u4f60\u4e0d\u5e0c\u671bpika\u5360\u7528\u592a\u591a\u7684\u6587\u4ef6\u6587\u4ef6\u63cf\u8ff0\u7b26\uff0c\u53ef\u4ee5\u901a\u8fc7\u9002\u5f53\u589e\u5927\u5355\u4e2asst\u7684\u4f53\u79ef\u6765\u964d\u4f4esst\u7684\u603b\u6570\u91cf\uff0c\u5bf9\u5e94\u53c2\u6570\u4e3a",(0,s.jsx)(i.code,{children:"target-file-size-base"})]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"pika\u6700\u4f73\u5b9e\u8df5\u4e4b\u5341\u4e09\uff1a"})}),"\n",(0,s.jsxs)(i.p,{children:["\u4e0d\u8981\u4fee\u6539log\u76ee\u5f55\u4e2d\u7684",(0,s.jsx)(i.code,{children:"write2file"}),"\u6587\u4ef6\u548c",(0,s.jsx)(i.code,{children:"manifest"}),"\uff0c\u5b83\u4eec\u662f\u540c\u6b65\u76f8\u5173\u7684\u91cd\u8981\u6587\u4ef6\uff0c",(0,s.jsx)(i.code,{children:"write2file"}),"\u4e3a",(0,s.jsx)(i.code,{children:"binlog"}),"\u89d2\u8272\uff0c\u800c",(0,s.jsx)(i.code,{children:"manifest"}),"\u5219\u7528\u6765\u786e\u4fdd\u5b9e\u4f8b\u91cd\u542f\u540e\u7684binlog\u7eed\u5199\u53ca\u5b9e\u4f8b\u4e3a\u4ece\u5e93\u65f6\u5e2e\u52a9\u540c\u6b65\u4e2d\u65ad\u91cd\u8fde\u540e\u7eed\u4f20"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"pika\u6700\u4f73\u5b9e\u8df5\u4e4b\u5341\u56db\uff1a"})}),"\n",(0,s.jsxs)(i.p,{children:["pika\u7684\u5168\u91cf\u540c\u6b65\u662f\u901a\u8fc7rsync\u6765\u8fdb\u884c\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u63d0\u4f9b\u4e86rsync\u7684\u4f20\u8f93\u9650\u901f\u53c2\u6570",(0,s.jsx)(i.code,{children:"db-sync-speed"}),"\uff0c\u8be5\u53c2\u6570\u7684\u5355\u4f4d\u662fmb\uff0c\u6211\u4eec\u5efa\u8bae\u5728\u5343\u5146\u73af\u5883\u4e2d\u8be5\u53c2\u6570\u8bbe\u7f6e\u4e0d\u5e94\u9ad8\u4e8e75\uff0c\u800c\u5728\u4e07\u5146\u73af\u5883\u4e2d\u4e0d\u5e94\u9ad8\u4e8e500\uff0c\u8fd9\u6837\u53ef\u4ee5\u907f\u514dpika\u5728\u5168\u91cf\u540c\u6b65\u7684\u65f6\u5019\u5c06\u6240\u5728\u670d\u52a1\u5668\u7f51\u5361\u7528\u5c3d\u800c\u5f71\u54cd\u5230\u90e8\u7f72\u5728\u670d\u52a1\u5668\u4e0a\u7684\u5176\u5b83\u670d\u52a1"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"pika\u6700\u4f73\u5b9e\u8df5\u4e4b\u5341\u4e94\uff1a"})}),"\n",(0,s.jsxs)(i.p,{children:["\u5728pika\u4e2d\u6267\u884c",(0,s.jsx)(i.code,{children:"key *"}),"\u5e76\u4e0d\u4f1a\u9020\u6210pika\u963b\u585e\uff08pika\u662f\u591a\u7ebf\u7a0b\u7684\uff09\uff0c\u4f46\u5728\u5b58\u5728\u5de8\u91cfkey\u7684\u573a\u666f\u4e0b\u53ef\u80fd\u4f1a\u9020\u6210\u4e34\u65f6\u5360\u7528\u5de8\u91cf\u5185\u5b58\uff08\u8fd9\u4e9b\u5185\u5b58\u7528\u4e8e\u8be5\u8fde\u63a5\u5b58\u653e",(0,s.jsx)(i.code,{children:"key *"}),"\u7684\u6267\u884c\u7ed3\u679c\uff0c\u4f1a\u5728",(0,s.jsx)(i.code,{children:"key *"}),"\u6267\u884c\u5b8c\u6bd5\u540e\u91ca\u653e\uff09\uff0c\u56e0\u6b64\u4f7f\u7528",(0,s.jsx)(i.code,{children:"keys *"}),"\u4e00\u5b9a\u8981\u5c0f\u5fc3\u8c28\u614e"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"pika\u6700\u4f73\u5b9e\u8df5\u4e4b\u5341\u516d\uff1a"})}),"\n",(0,s.jsxs)(i.p,{children:["\u5982\u679c\u53d1\u73b0pika\u6709\u6570\u636e\u4f46",(0,s.jsx)(i.code,{children:"info keyspace"}),"\u7684\u663e\u793a\u5747\u4e3a0\uff0c\u8fd9\u662f\u56e0\u4e3apika\u5e76\u6ca1\u6709\u50cfRedis\u5bf9key\u7684\u6570\u91cf\u505a\u5b9e\u65f6\u7edf\u8ba1\u5e76\u5c55\u793a\uff0cpika\u4e2dkey\u7684\u7edf\u8ba1\u9700\u8981\u4eba\u5de5\u89e6\u53d1\uff0c\u6267\u884c",(0,s.jsx)(i.code,{children:"info keyspace 1"}),"\uff0c\u6ce8\u610f\u6267\u884c",(0,s.jsx)(i.code,{children:"info keyspace"}),"\u662f\u4e0d\u4f1a\u89e6\u53d1\u7edf\u8ba1\u7684\uff0c\u6ca1\u6709\u5e26\u4e0a\u6700\u540e\u7684\u53c2\u6570",(0,s.jsx)(i.code,{children:"1"}),"\u5c06\u4f1a\u4ec5\u4ec5\u5c55\u793a\u4e0a\u4e00\u6b21\u7684\u7edf\u8ba1\u7ed3\u679c\uff0ckey\u7684\u7edf\u8ba1\u662f\u9700\u8981\u65f6\u95f4\u7684(\u8fd9\u662f\u4e00\u4e2a\u5f02\u6b65\u7684\u64cd\u4f5c)\uff0c\u6267\u884c\u72b6\u6001\u53ef\u4ee5\u901a\u8fc7",(0,s.jsx)(i.code,{children:"info stats"}),"\u4e2d\u7684",(0,s.jsx)(i.code,{children:"is_scaning_keyspace"}),"\u8fdb\u884c\u67e5\u770b\uff0c\u8be5\u9879\u503c\u4e3a",(0,s.jsx)(i.code,{children:"yes"}),"\u8868\u660e\u7edf\u8ba1\u6b63\u5728\u8fdb\u884c\uff0c\u4e3a",(0,s.jsx)(i.code,{children:"no"}),"\u65f6\u8868\u660e\u6ca1\u6709\u6b63\u5728\u8fdb\u884c\u7684\u7edf\u8ba1/\u4e0a\u4e00\u6b21\u7edf\u8ba1\u5df2\u7ed3\u675f\uff0c\u5728\u7edf\u8ba1\u6267\u884c\u5b8c\u6bd5\u524d",(0,s.jsx)(i.code,{children:"info keyspace"}),"\u4e0d\u4f1a\u66f4\u65b0\uff0c",(0,s.jsx)(i.code,{children:"info keyspace"}),"\u7684\u6570\u636e\u662f\u5b58\u653e\u5728\u5185\u5b58\u91cc\u7684\uff0c\u91cd\u542f\u5c06\u6e05\u96f6"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"pika\u6700\u4f73\u5b9e\u8df5\u4e4b\u5341\u4e03\uff1a"})}),"\n",(0,s.jsxs)(i.p,{children:["\u4e0d\u8981\u5728pika\u6267\u884c\u5168\u91cf",(0,s.jsx)(i.code,{children:"compact"}),"\u7684\u65f6\u5019\u89e6\u53d1key\u7edf\u8ba1\uff08",(0,s.jsx)(i.code,{children:"info keyspace 1"}),"\uff09\u6216\u6267\u884c",(0,s.jsx)(i.code,{children:"keys *"}),"\uff0c\u5426\u5219\u4f1a\u9020\u6210\u6570\u636e\u4f53\u79ef\u6682\u65f6\u81a8\u80c0\u76f4\u5230key\u7edf\u8ba1\u3001",(0,s.jsx)(i.code,{children:"keys *"}),"\u6267\u884c\u7ed3\u675f"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"pika\u6700\u4f73\u5b9e\u8df5\u4e4b\u5341\u516b:"})}),"\n",(0,s.jsxs)(i.p,{children:["\u5bf9\u5b58\u5728\u5927\u91cf\u8fc7\u671f\u3001\u591a\u6570\u636e\u7ed3\u6784\u5185\u5143\u7d20\u64cd\u4f5c\u7684\u5b9e\u4f8b\u914d\u7f6e",(0,s.jsx)(i.code,{children:"compact-cron"}),"\u53ef\u4ee5\u975e\u5e38\u597d\u7684\u907f\u514d\u65e0\u6548\u4f46\u8fd8\u672a\u88ab\u5f7b\u5e95\u6e05\u7406\u7684\u6570\u636e\u5bf9\u6027\u80fd\u9020\u6210\u7684\u5f71\u54cd\uff0c\u6216\u5347\u7ea7\u52303.0\u540e\u6253\u5f00\u65b0\u7684key\u7ea7",(0,s.jsx)(i.code,{children:"auto_compact"}),"\u529f\u80fd\n\u5982\u679c\u4f60\u9047\u5230\u4e86\u4e0b\u9762\u7684\u60c5\u51b5\uff0c\u90a3\u4e48\u4f60\u7684\u5b9e\u4f8b\u53ef\u80fd\u5b58\u5728\u672a\u53ca\u65f6\u6e05\u7406\u7684\u65e0\u6548\u6570\u636e\u5e26\u6765\u7684\u6027\u80fd\u98ce\u9669\uff1a"]}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsxs)(i.li,{children:["\u5f02\u5e38\u7684\u6570\u636e\u4f53\u79ef\uff08\u5927\u4e8e\u4f30\u7b97\u503c10%\u4ee5\u4e0a\uff09\uff0c\u53ef\u4ee5\u901a\u8fc7\u6267\u884c",(0,s.jsx)(i.code,{children:"compact"}),"\u547d\u4ee4\uff0c\u5728",(0,s.jsx)(i.code,{children:"compact"}),"\u6267\u884c\u5b8c\u6bd5\u540e\u89c2\u5bdf\u6570\u636e\u4f53\u79ef\u662f\u5426\u6062\u590d\u6b63\u5e38"]}),"\n",(0,s.jsxs)(i.li,{children:["\u8bf7\u6c42\u8017\u65f6\u7a81\u7136\u5f02\u5e38\u589e\u5927\uff0c\u53ef\u4ee5\u901a\u8fc7\u6267\u884c",(0,s.jsx)(i.code,{children:"compact"}),"\u547d\u4ee4\uff0c\u5728",(0,s.jsx)(i.code,{children:"compact"}),"\u6267\u884c\u5b8c\u6bd5\u540e\u89c2\u5bdf\u8bf7\u6c42\u8017\u65f6\u662f\u5426\u6062\u590d\u6b63\u5e38"]}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"pika\u6700\u4f73\u5b9e\u8df5\u4e4b\u5341\u4e5d\uff1a"})}),"\n",(0,s.jsxs)(i.p,{children:["\u5728pika3.0\u4e2d\u6211\u4eec\u63d0\u4f9b\u4e86\u8fc7\u671fkey\u7684\u7edf\u8ba1\uff08\u53ef\u901a\u8fc7",(0,s.jsx)(i.code,{children:"info keyspace 1"}),"\u6765\u89e6\u53d1\u7edf\u8ba1\uff0c\u901a\u8fc7",(0,s.jsx)(i.code,{children:"info keyspace"}),"\u67e5\u770b\u7edf\u8ba1\u7ed3\u679c\uff09\uff0c\u7edf\u8ba1\u7ed3\u679c\u4e2d\u7684",(0,s.jsx)(i.code,{children:"invaild_keys"}),"\u7684\u503c\u4e3a\u201c\u5df2\u5220\u9664/\u8fc7\u671f\u4f46\u8fd8\u672a\u88ab\u7269\u7406\u5220\u9664\u7684key\u7684\u6570\u91cf\u201d\uff0c\u5efa\u8bae\u5173\u6ce8\u8be5\u503c\u5e76\u5728\u65e0\u6548key\u6570\u91cf\u8f83\u591a\u65f6\u901a\u8fc7",(0,s.jsx)(i.code,{children:"compact"}),"\u547d\u4ee4\u6765\u6e05\u7406\uff0c\u8fd9\u6837\u80fd\u591f\u5c06\u672a\u7269\u7406\u6e05\u7406\u7684\u65e0\u6548\u6570\u636e\u63a7\u5236\u5728\u4e00\u4e2a\u8f83\u597d\u7684\u7a0b\u5ea6\u4ece\u800c\u786e\u4fddpika\u7684\u6027\u80fd\u7a33\u5b9a\uff0c\u5982\u679cpika\u4e2d\u5b58\u50a8\u7684\u6570\u636e\u662f\u89c4\u5f8b\u6027\u8fc7\u671f\u7684\uff0c\u4f8b\u5982\u6bcf\u4e2akey\u7684\u8fc7\u671f\u65f6\u95f4\u4e3a7\u5929\uff0c\u90a3\u4e48\u5efa\u8bae\u901a\u8fc7\u914d\u7f6e",(0,s.jsx)(i.code,{children:"compact-cron"}),"\u53c2\u6570\u6765\u5b9e\u73b0\u6bcf\u5929\u7684\u5b9a\u65f6\u5168\u81ea\u52a8\u5168\u91cf",(0,s.jsx)(i.code,{children:"compact"}),"\uff0c",(0,s.jsx)(i.code,{children:"compact"}),"\u4f1a\u5360\u7528\u4e00\u5b9a\u7684io\u8d44\u6e90\uff0c\u56e0\u6b64\u5982\u679c\u78c1\u76d8IO\u538b\u529b\u8fc7\u5927\uff0c\u5efa\u8bae\u5c06\u5176\u914d\u7f6e\u4e3a\u4e1a\u52a1\u4f4e\u5cf0\u671f\u6267\u884c\uff0c\u4f8b\u5982\u6df1\u591c"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"pika\u6700\u4f73\u5b9e\u8df5\u4e4b\u4e8c\u5341:"})}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.code,{children:"write2file"}),"\u7684\u89d2\u8272\u76f8\u5f53\u4e8e",(0,s.jsx)(i.code,{children:"binlog"}),"\uff0c\u5e94\u5f53\u6839\u636e\u5b9e\u9645\u5199\u5165\u60c5\u51b5\u8c03\u6574",(0,s.jsx)(i.code,{children:"write2file"}),"\u5230\u5408\u9002\u7684\u4fdd\u7559\u5468\u671f/\u6570\u91cf\uff0c\u5efa\u8bae",(0,s.jsx)(i.code,{children:"write2file"}),"\u4fdd\u7559\u5468\u671f/\u6570\u91cf\u4e0d\u4f4e\u4e8e48\u5c0f\u65f6\uff0c\u8db3\u591f\u7684",(0,s.jsx)(i.code,{children:"write2file"}),"\u80fd\u591f\u8ba9\u5f88\u591a\u60c5\u51b5\u53d8\u5f97\u8f7b\u677e\uff0c\u4f8b\u5982\uff1a\u5927\u6570\u636e\u96c6\u7fa4\u7684\u4ece\u5e93\u6269\u5bb9\u3001\u4ece\u5e93\u670d\u52a1\u5668\u5173\u673a\u7ef4\u4fee\u3001\u4ece\u5e93\u8fc1\u79fb\u7b49\u7b49\uff0c\u4e0d\u4f1a\u56e0\u4e3a\u4e3b\u5e93",(0,s.jsx)(i.code,{children:"write2file"}),"\u8fc7\u671f\u800c\u88ab\u8feb\u5168\u91cf\u91cd\u4f20"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"pika\u6700\u4f73\u5b9e\u8df5\u4e4b\u4e8c\u5341\u4e00\uff1a"})}),"\n",(0,s.jsxs)(i.p,{children:["\u5728\u4e3b\u5e93\u5199\u5165\u91cf\u8fc7\u5927\uff08\u666e\u901assd\uff0c\u5927\u81f4\u5199\u5165qps\u5927\u4e8e5\u4e07\uff09\u7684\u60c5\u51b5\u4e0b\u4ece\u5e93\u53ef\u80fd\u4f1a\u53d1\u751f\u540c\u6b65\u5ef6\u8fdf\u95ee\u9898\uff0c\u53ef\u4ee5\u8c03\u6574\u4ece\u5e93\u7684",(0,s.jsx)(i.code,{children:"sync-thread-num"}),"\u53c2\u6570\u6765\u63d0\u9ad8\u4ece\u5e93\u540c\u6b65\u6027\u80fd\uff0c\u8be5\u53c2\u6570\u63a7\u5236\u7740\u4ece\u5e93\u7684\u540c\u6b65\u7ebf\u7a0b\uff0c\u6bcf\u4e2a\u7ebf\u7a0b\u901a\u8fc7hash\u6765\u8d1f\u8d23\u5bf9\u5e94\u7684key\u7684\u540c\u6b65\uff0c\u56e0\u6b64\u4e3b\u5e93\u5199\u5165\u64cd\u4f5c\u7684\u4e0d\u540c\u7684key\u7684\u6570\u91cf\u8d8a\u591a\u8be5\u53c2\u6570\u7684\u6548\u679c\u5c31\u4f1a\u8d8a\u597d\uff0c\u800c\u5982\u679c\u5de8\u91cf\u7684\u5199\u5165\u4ec5\u96c6\u4e2d\u5728\u51e0\u4e2akey\u4e2d\uff0c\u90a3\u4e48\u8be5\u53c2\u6570\u53ef\u80fd\u65e0\u6cd5\u8fbe\u5230\u9884\u671f\u6548\u679c"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"pika\u6700\u4f73\u5b9e\u8df5\u4e4b\u4e8c\u5341\u4e8c\uff1a"})}),"\n",(0,s.jsx)(i.p,{children:"pika\u7684\u5907\u4efd\u751f\u6210\u4e3a\u5feb\u7167\u5f0f\uff0c\u901a\u8fc7\u786c\u94fe\u63a5\u5b58\u653e\u5728dump\u76ee\u5f55\u4e2d\u4ee5\u65e5\u671f\u4e3a\u540e\u7f00\uff0c\u5907\u4efd\u6bcf\u5929\u53ea\u80fd\u751f\u6210\u4e00\u4efd\uff0c\u591a\u6b21\u751f\u6210\u5907\u4efd\u65f6\u65b0\u7684\u5907\u4efd\u4f1a\u8986\u76d6\u4e4b\u524d\u7684\u3002\u5728\u751f\u6210\u5907\u4efd\u5feb\u7167\u7684\u65f6\u5019\uff0c\u4e3a\u4e86\u786e\u4fdd\u6570\u636e\u7684\u4e00\u81f4\u6027pika\u4f1a\u6682\u65f6\u963b\u585e\u5199\u5165\uff0c\u963b\u585e\u65f6\u95f4\u4e0e\u5b9e\u9645\u6570\u636e\u91cf\u76f8\u5173\uff0c\u6839\u636e\u6d4b\u8bd5500g\u7684pika\u751f\u6210\u5907\u4efd\u5feb\u7167\u4e5f\u4ec5\u970050ms\uff0c\u5728\u5199\u5165\u963b\u585e\u7684\u8fc7\u7a0b\u4e2d\u8fde\u63a5\u4e0d\u4f1a\u4e2d\u65ad\u8bf7\u6c42\u4e0d\u4f1a\u5f02\u5e38\uff0c\u4f46client\u4f1a\u611f\u89c9\u5230\u201c\u5728\u90a3\u4e00\u77ac\u95f4\u8bf7\u6c42\u8017\u65f6\u589e\u52a0\u4e86\u4e00\u4e9b\u201d\u3002\u7531\u4e8epika\u7684\u5feb\u7167\u662fdb\u76ee\u5f55\u4e2dsst\u6587\u4ef6\u7684\u786c\u8fde\u63a5\uff0c\u56e0\u6b64\u6700\u521d\u8fd9\u4e2a\u76ee\u5f55\u662f\u4e0d\u4f1a\u5360\u7528\u78c1\u76d8\u7a7a\u95f4\u7684\uff0c\u800c\u5728pika db\u76ee\u5f55\u4e2d\u7684sst\u6587\u4ef6\u53d1\u751f\u4e86\u5408\u5e76\u3001\u5220\u9664\u540e\uff0c\u786c\u94fe\u63a5\u4f1a\u56e0\u4e3a\u5176\u7279\u6027\u800c\u4f53\u73b0\u771f\u5b9e\u4f53\u79ef\u4ece\u800c\u5f00\u59cb\u5360\u7528\u78c1\u76d8\u7a7a\u95f4\uff0c\u6240\u4ee5\u8bf7\u6839\u636e\u5b9e\u9645\u7684\u78c1\u76d8\u7a7a\u95f4\u8c03\u6574\u5907\u4efd\u4fdd\u7559\u5929\u6570\uff0c\u907f\u514d\u5907\u4efd\u592a\u591a\u800c\u9020\u6210\u78c1\u76d8\u7a7a\u95f4\u7528\u5c3d"}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"pika\u6700\u4f73\u5b9e\u8df5\u4e4b\u4e8c\u5341\u4e09\uff1a"})}),"\n",(0,s.jsxs)(i.p,{children:["\u5982\u679c\u5199\u5165\u91cf\u5de8\u5927\u4e14\u78c1\u76d8\u6027\u80fd\u4e0d\u8db3\u4ee5\u6ee1\u8db3rocksdb memtable\u7684\u53ca\u65f6\u5237\u76d8\u9700\u6c42\uff0c\u90a3\u4e48rocksdb\u5f88\u53ef\u80fd\u4f1a\u8fdb\u5165\u5199\u4fdd\u62a4\u6a21\u5f0f\uff08\u5199\u5165\u5c06\u88ab\u5168\u90e8\u963b\u585e\uff09\uff0c\u5bf9\u4e8e\u8be5\u95ee\u9898\u6211\u4eec\u5efa\u8bae\u66f4\u6362\u6027\u80fd\u66f4\u597d\u7684\u5b58\u50a8\u6765\u652f\u6491\uff0c\u6216\u8005\u964d\u4f4e\u5199\u5165\u9891\u7387\uff08\u4f8b\u5982\u5c06\u96c6\u4e2d\u5199\u6570\u636e\u76842\u5c0f\u65f6\u62c9\u957f\u52304\u5c0f\u65f6\uff09\uff0c\u4e5f\u53ef\u9002\u5f53\u52a0\u5927",(0,s.jsx)(i.code,{children:"write-buffer-size"}),"\u7684\u503c\u6765\u63d0\u9ad8memtable\u7684\u603b\u5bb9\u91cf\u4ece\u800c\u964d\u4f4e\u6574\u4e2amemtable\u88ab\u5199\u6ee1\u7684\u53ef\u80fd\uff0c\u4f46\u5b9e\u9645\u6839\u636e\u6d4b\u8bd5\u53d1\u73b0\u4fee\u6539\u8be5\u53c2\u6570\u5e76\u4e0d\u80fd\u5f7b\u5e95\u89e3\u51b3\u8be5\u95ee\u9898\uff0c\u56e0\u4e3a\u201c\u5199\u7684memtable\u8fdf\u65e9\u8981\u5237\u4e0b\u53bb\u7684\uff01\u4e4b\u524d\u5237\u4e0d\u52a8\uff0c\u73b0\u5728\u4e5f\u5237\u4e0d\u52a8\uff01\u201d"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"pika\u6700\u4f73\u5b9e\u8df5\u4e4b\u4e8c\u5341\u56db\uff1a"})}),"\n",(0,s.jsxs)(i.p,{children:["pika\u5bf9\u6570\u636e\u8fdb\u884c\u4e86\u538b\u7f29\uff0c\u9ed8\u8ba4\u538b\u7f29\u7b97\u6cd5\u4e3a",(0,s.jsx)(i.code,{children:"snappy"}),"\uff0c\u5e76\u5141\u8bb8\u6539\u4e3a",(0,s.jsx)(i.code,{children:"zlib"}),"\uff0c\u56e0\u6b64\u6bcf\u4e00\u6b21\u6570\u636e\u7684\u5b58\u5165\u3001\u8bfb\u51fa\u90fd\u9700\u8981\u7ecf\u8fc7\u538b\u7f29\u3001\u89e3\u538b\uff0c\u8fd9\u5bf9cpu\u6709\u4e00\u5b9a\u7684\u6d88\u8017\uff0c\u975e\u5e38\u5efa\u8bae\u50cf\u4f7f\u7528Redis\u4e00\u6837\u4f7f\u7528pika\uff1a\u5728pika\u4e2d\u5173\u95ed\u538b\u7f29\uff0c\u800c\u5728client\u4e2d\u5b8c\u6210\u6570\u636e\u7684\u538b\u7f29\u3001\u89e3\u538b\uff0c\u8fd9\u6837\u4e0d\u4ec5\u80fd\u591f\u964d\u4f4e\u6570\u636e\u4f53\u79ef\uff0c\u8fd8\u80fd\u6709\u6548\u964d\u4f4epika\u7684cpu\u538b\u529b\uff0c\u5982\u679c\u4f60\u7684\u5b58\u50a8\u7a7a\u95f4\u4e0d\u662f\u95ee\u9898\u4f46\u5e76\u4e0d\u60f3\u8c03\u6574client\uff0c\u53ef\u4ee5\u5173\u95ed\u538b\u7f29\u6765\u964d\u4f4ecpu\u538b\u529b\uff0c\u4ee3\u4ef7\u662f\u78c1\u76d8\u5360\u7528\u7684\u589e\u52a0\uff0c\u6ce8\u610f\u5173\u95ed\u3001\u5f00\u542f\u538b\u7f29\u9700\u8981\u91cd\u542f\u5b9e\u4f8b\u4f46\u65e0\u9700\u91cd\u505a\u6570\u636e"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"pika\u6700\u4f73\u5b9e\u8df5\u4e4b\u4e8c\u5341\u4e94\uff1a"})}),"\n",(0,s.jsx)(i.p,{children:"\u8bfb\u5199\u5206\u79bb\u5f88\u91cd\u8981\uff0cpika\u5728\u5e38\u89c1\u7684\u4e3b\u4ece\u96c6\u7fa4\u4e2d\u7531\u4e8e\u5199\u5165\u662f\u5355\u70b9\u7684\uff08\u4e3b\u5e93\uff09\uff0c\u56e0\u6b64\u5199\u5165\u6027\u80fd\u662f\u6709\u6781\u9650\u7684\uff0c\u800c\u8bfb\u53d6\u53ef\u4ee5\u901a\u8fc7\u591a\u4e2a\u4ece\u5e93\u6765\u5171\u540c\u652f\u6491\uff0c\u56e0\u6b64pika\u96c6\u7fa4\u7684\u8bfb\u53d6\u6027\u80fd\u662f\u968f\u7740\u4ece\u5e93\u6570\u91cf\u7684\u589e\u52a0\u800c\u589e\u52a0\u7684\uff0c\u6240\u4ee5\u5bf9\u4e8e\u8bfb\u53d6\u91cf\u5f88\u5927\u7684\u573a\u666f\uff0c\u5efa\u8bae\u5728\u4e1a\u52a1\u5c42\u4ee3\u7801\u52a0\u5165\u8bfb\u5199\u5206\u79bb\u7b56\u7565\u540c\u65f6\u5728pika\u5c42\u589e\u52a0\u4ece\u5e93\u6570\u91cf\u901a\u8fc7\u591a\u4e2a\u4ece\u5e93\u6765\u63d0\u4f9b\u8bfb\u670d\u52a1\uff0c\u8fd9\u6837\u80fd\u591f\u5927\u5e45\u5ea6\u63d0\u9ad8\u96c6\u7fa4\u7a33\u5b9a\u6027\u5e76\u6709\u6548\u964d\u4f4e\u8bfb\u8017\u65f6"}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"pika\u6700\u4f73\u5b9e\u8df5\u4e4b\u4e8c\u5341\u516d\uff1a"})}),"\n",(0,s.jsxs)(i.p,{children:["\u5168\u91cfcompact\u7684\u539f\u7406\u662f\u9010\u6b65\u5bf9rocksdb\u7684\u6bcf\u4e00\u5c42\u505a\u6570\u636e\u5408\u5e76\u3001\u6e05\u7406\u5de5\u4f5c\uff0c\u5728\u8fd9\u4e2a\u8fc7\u7a0b\u4e2d\u4f1a\u65b0\u589e\u3001\u5220\u9664\u5927\u91cf\u7684sst\u6587\u4ef6\uff0c\u56e0\u6b64\u5728\u6267\u884c\u5168\u91cf",(0,s.jsx)(i.code,{children:"compact"}),"\u7684\u65f6\u5019\u53ef\u4ee5\u53d1\u73b0\u6570\u636e\u4f53\u79ef\u5148\u589e\u5927\u540e\u51cf\u5c0f\u5e76\u6700\u7ec8\u51cf\u5c0f\u5230\u4e00\u4e2a\u7a33\u5b9a\u503c\uff08\u65e0\u6548\u3001\u91cd\u590d\u6570\u636e\u5408\u5e76\u3001\u6e05\u7406\u5b8c\u6bd5\u4ec5\u5269\u6709\u6548\u6570\u636e\uff09\uff0c\u5efa\u8bae\u5728\u6267\u884c",(0,s.jsx)(i.code,{children:"compact"}),"\u524d\u786e\u4fdd\u78c1\u76d8\u7a7a\u4f59\u7a7a\u95f4\u4e0d\u4f4e\u4e8e30%\u907f\u514d\u65b0\u589esst\u6587\u4ef6\u65f6\u5c06\u78c1\u76d8\u7a7a\u95f4\u8017\u5c3d\uff0c\u53e6\u5916pika\u652f\u6301\u5bf9\u6307\u5b9a\u6570\u636e\u7ed3\u6784\u8fdb\u884c",(0,s.jsx)(i.code,{children:"compact"}),"\uff0c\u4f8b\u5982\u4e00\u4e2a\u5b9e\u4f8b\u4e2d\u5df2\u77e5hash\u7ed3\u6784\u7684\u65e0\u6548\u6570\u636e\u5f88\u5c11\u4f46hash\u7ed3\u6784\u6570\u636e\u91cf\u5f88\u5927\uff0cset\u7ed3\u6784\u6570\u636e\u91cf\u5f88\u5927\u4e14\u65e0\u6548\u6570\u636e\u5f88\u591a\uff0c\u5728\u8fd9\u4e2a\u4f8b\u5b50\u4e2dhash\u7ed3\u6784\u7684",(0,s.jsx)(i.code,{children:"compact"}),"\u662f\u6ca1\u6709\u5fc5\u8981\u7684\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7",(0,s.jsx)(i.code,{children:"compact set"}),"\u5b9e\u73b0\u4ec5\u4ec5\u5bf9set\u7ed3\u6784\u7684",(0,s.jsx)(i.code,{children:"compact"})]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"pika\u6700\u4f73\u5b9e\u8df5\u4e4b\u4e8c\u5341\u4e03\uff1a"})}),"\n",(0,s.jsxs)(i.p,{children:["\u5907\u4efd\u662f\u4ee5\u786c\u94fe\u63a5db\u76ee\u5f55\u4e2d\u7684sst\u7684\u65b9\u5f0f\u4ea7\u751f\u7684\uff0c\u56e0\u6b64\u5728\u5b58\u5728\u5907\u4efd\u6587\u4ef6\u7684\u60c5\u51b5\u4e0b\uff0c\u4e00\u65e6\u6267\u884c\u5168\u91cfcompact\u7531\u4e8epika db\u76ee\u5f55\u4e2d\u7684\u6240\u6709sst\u90fd\u4f1a\u88ab",(0,s.jsx)(i.code,{children:"compact"}),"\u201c\u6e05\u6d17\u201d\u4e00\u904d\uff08\u9010\u6b65\u5c06\u6240\u6709\u8001\u7684sst\u5220\u9664\u66ff\u6362\u6210\u65b0\u7684sst\uff09\uff0c\u8fd9\u5c06\u9020\u6210\u5907\u4efd\u786c\u94fe\u63a5\u6587\u4ef6\u7684\u4f53\u79ef\u53d8\u4e3a\u771f\u5b9e\u4f53\u79ef\uff0c\u6781\u7aef\u60c5\u51b5\u4e0b\u5907\u4efd\u6587\u4ef6\u4f1a\u989d\u5916\u5360\u7528\u4e00\u500d\u7684\u7a7a\u95f4\uff0c\u56e0\u6b64\u5982\u679c\u4f60\u7684\u78c1\u76d8\u7a7a\u4f59\u7a7a\u95f4\u4e0d\u5927\uff0c\u90a3\u4e48\u5728\u6267\u884c\u5168\u91cf",(0,s.jsx)(i.code,{children:"compact"}),"\u4e4b\u524d\u6700\u597d\u5220\u9664\u5907\u4efd"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"pika\u6700\u4f73\u5b9e\u8df5\u4e4b\u4e8c\u5341\u516b\uff1a"})}),"\n",(0,s.jsxs)(i.p,{children:["pika\u548cRedis\u4e00\u6837\u652f\u6301\u6162\u65e5\u5fd7\u529f\u80fd\u5e76\u53ef\u901a\u8fc7",(0,s.jsx)(i.code,{children:"slowlog"}),"\u547d\u4ee4\u67e5\u770b\uff0c\u4f46\u6211\u4eec\u77e5\u9053",(0,s.jsx)(i.code,{children:"slowlog"}),"\u7684\u5b58\u50a8\u662f\u6709\u4e0a\u9650\u7684\uff0c\u8fd9\u4e2a\u4e0a\u9650\u53d6\u51b3\u4e8e\u4f60\u7684\u914d\u7f6e\uff0c\u5982\u679c\u914d\u7f6e\u8fc7\u5927\u4f1a\u9020\u6210",(0,s.jsx)(i.code,{children:"slowlog"}),"\u5360\u7528\u592a\u591a\u5185\u5b58\uff0c\u800cpika\u5141\u8bb8\u5c06\u6162\u65e5\u5fd7\u8bb0\u5f55\u5230",(0,s.jsx)(i.code,{children:"pika.ERROR"}),"\u65e5\u5fd7\u4e2d\u7528\u4e8e\u8ffd\u6eaf\u3001\u5206\u6790\uff0c\u8be5\u529f\u80fd\u9700\u8981\u5c06",(0,s.jsx)(i.code,{children:"slowlog-write-errorlog"}),"\u8bbe\u7f6e\u4e3ayes"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"pika\u6700\u4f73\u5b9e\u8df5\u4e4b\u4e8c\u5341\u4e5d\uff1a"})}),"\n",(0,s.jsxs)(i.p,{children:["pika\u6ca1\u6709\u63d0\u4f9bRedis\u7684\u547d\u4ee4\u6539\u540d\uff08",(0,s.jsx)(i.code,{children:"rename-command"}),"\uff09\u529f\u80fd\uff0c\u56e0\u4e3a\u90e8\u5206\u547d\u4ee4\u7684\u6539\u540d\u4f1a\u9020\u6210\u4e00\u4e9b\u5de5\u5177\u3001\u4e2d\u95f4\u4ef6\u7684\u5de5\u4f5c\u5f02\u5e38\uff08\u4f8b\u5982\u5c06config\u6539\u540d\u540e\u54e8\u5175\u4f1a\u65e0\u6cd5\u5de5\u4f5c\uff09\uff0c\u56e0\u6b64pika\u989d\u5916\u589e\u52a0\u4e86",(0,s.jsx)(i.code,{children:"userpass"}),"\u3001",(0,s.jsx)(i.code,{children:"userblacklist"}),"\u6765\u89e3\u51b3\u8fd9\u4e00\u95ee\u9898\u3002",(0,s.jsx)(i.code,{children:"userpass"}),"\u5bf9\u5e94",(0,s.jsx)(i.code,{children:"requirepass"}),"\uff0c\u4f7f\u7528",(0,s.jsx)(i.code,{children:"userpass"}),"\u767b\u5f55\u7684\u7528\u6237\u4f1a\u53d7\u5230",(0,s.jsx)(i.code,{children:"userblacklist"}),"\u7684\u9650\u5236\uff0c\u5b83\u4eec\u65e0\u6cd5\u6267\u884c\u914d\u7f6e\u5728",(0,s.jsx)(i.code,{children:"userblacklist"}),"\u4e2d\u7684\u547d\u4ee4\uff0c\u800c",(0,s.jsx)(i.code,{children:"requirepass"}),"\u5219\u4e0d\u53d7\u5f71\u54cd\uff0c\u53ef\u4ee5\u7b80\u5355\u7684\u5c06\u901a\u8fc7",(0,s.jsx)(i.code,{children:"requirepass"}),"\u767b\u5f55pika\u7684\u7528\u6237\u7406\u89e3\u4e3a\u201c\u8d85\u7ea7\u7528\u6237\u201d\uff0c\u5c06\u901a\u8fc7",(0,s.jsx)(i.code,{children:"userpass"}),"\u767b\u5f55pika\u7684\u7528\u6237\u7406\u89e3\u4e3a\u201c\u666e\u901a\u7528\u6237\u201d\uff0c\u6211\u4eec\u975e\u5e38\u5efa\u8baepika\u8fd0\u7ef4\u5c06",(0,s.jsx)(i.code,{children:"userpass"}),"\u63d0\u4f9b\u7ed9\u4e1a\u52a1\u7528\u4e8e\u4ee3\u7801\u8bbf\u95ee\u5e76\u5728",(0,s.jsx)(i.code,{children:"userblacklist"}),"\u589e\u52a0\u4f8b\u5982",(0,s.jsx)(i.code,{children:"slaveof"}),",",(0,s.jsx)(i.code,{children:"config"}),",",(0,s.jsx)(i.code,{children:"shutdown"}),",",(0,s.jsx)(i.code,{children:"bgsave"}),",",(0,s.jsx)(i.code,{children:"dumpoff"}),",",(0,s.jsx)(i.code,{children:"client"}),",",(0,s.jsx)(i.code,{children:"keys"}),"\u7b49\u7ba1\u7406\u7c7b\u3001\u98ce\u9669\u6027\u547d\u4ee4\u6765\u907f\u514d\u8bef\u64cd\u4f5c\u9020\u6210\u7684\u6545\u969c"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"pika\u6700\u4f73\u5b9e\u8df5\u4e4b\u4e09\u5341\uff1a"})}),"\n",(0,s.jsxs)(i.p,{children:["Pika\u57283.0.7\u7248\u672c\u5bf9\u7f51\u7edc\u5e93\u8fdb\u884c\u4e86\u6539\u9020\uff0c\u539f\u5148\u7f51\u7edc\u901a\u4fe1\u4ee5\u53ca\u6570\u636e\u67e5\u8be2\u63d2\u5165\u64cd\u4f5c\u90fd\u5728\u914d\u7f6e\u6587\u4ef6\u4e2d",(0,s.jsx)(i.code,{children:"thread-num"}),"\u5bf9\u5e94\u7684\u7ebf\u7a0b\u4e2d\u6267\u884c\uff0c\u6539\u9020\u8fc7\u540e\u7f51\u7edc\u901a\u4fe1\u8fd8\u662f\u5728",(0,s.jsx)(i.code,{children:"thread-num"}),"\u5bf9\u5e94\u7ebf\u7a0b\u4e2d\u6267\u884c\uff0c\u800c\u6570\u636e\u5199\u5165\u548c\u5220\u9664\u64cd\u4f5c\u7531\u914d\u7f6e\u6587\u4ef6\u4e2d",(0,s.jsx)(i.code,{children:"thread-pool-size"}),"\u63a7\u5236\u7684\u7ebf\u7a0b\u6c60\u4e2d\u6267\u884c\uff0c\u7528\u6237\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u573a\u666f\u5bf9\u8fd9\u4e24\u4e2a\u53c2\u6570\u8fdb\u884c\u8c03\u6574\uff0c\u5982\u679c\u5ba2\u6237\u7aef\u6267\u884c\u7684\u662f\u4e00\u4e9b\u6bd4\u8f83\u91cd\u7684\u64cd\u4f5c\uff0c\u53ef\u4ee5\u9002\u91cf\u5c06",(0,s.jsx)(i.code,{children:"thread-pool-size"}),"\u8c03\u5927\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u6211\u4eec\u5efa\u8bae",(0,s.jsx)(i.code,{children:"thread-pool-size = 2 * thread-num"})]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"pika\u6700\u4f73\u5b9e\u8df5\u4e4b\u4e09\u5341\u4e00\uff1a"})}),"\n",(0,s.jsx)(i.p,{children:"Pika\u4ece3.0.5\u5f00\u59cb\u63d0\u4f9b\u4e86\u66f4\u7ec6\u81f4\u7684compact\u7b56\u7565\uff0c\u8be5\u7b56\u7565\u5141\u8bb8\u5bf9key\u7684\u64cd\u4f5c\u8fdb\u884c\u76d1\u63a7\u5e76\u5728\u8fbe\u5230\u8bbe\u7f6e\u9608\u503c\u7684\u65f6\u5019\u5bf9\u8be5key\u8fdb\u884c\u5355\u72ec\u7684compact\uff0c\u8fd9\u4e2a\u529f\u80fd\u4ec5\u5bf9hash\uff0cset\uff0czset\uff0clist\u8fd9\u56db\u79cd\u542b\u6709field\u7684\u6570\u636e\u7ed3\u6784\u751f\u6548\uff0c\u5bf9\u5e94\u7684\u53c2\u6570\u4e3a:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"max-cache-statistic-keys"})," \u8bbe\u7f6e\u53d7\u76d1\u63a7key\u7684\u6570\u91cf\uff0c\u4f8b\u598210000\uff08\u76d1\u63a71\u4e07\u4e2akey\uff09"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"small-compaction-threshold"})," \u8bbe\u7f6e\u64cd\u4f5c\u9608\u503c\uff08\u8be5key\u4e2d\u6709\u591a\u5c11\u4e2afield\u88ab\u4fee\u6539\u6216\u8be5key\u4e2d\u7684filed\u88ab\u4fee\u6539\u8d85\u591a\u591a\u5c11\u6b21\uff09\uff0c\u4f8b\u5982500"]}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"\u8be5\u529f\u80fd\u7279\u522b\u9002\u5408\uff08\u5305\u62ec\u5e76\u4e0d\u9650\u4e8e\uff09\u4ee5\u4e0b\u6216\u7c7b\u4f3c\u7684\u4f7f\u7528\u573a\u666f\uff0c\u5b83\u80fd\u591f\u5c06\u8fd9\u4e9b\u573a\u666f\u4e2d\u7684\u65e0\u6548\u6570\u636e\u53ca\u65f6\u7684\u6e05\u9664\u4ece\u800c\u786e\u4fdd\u6027\u80fd\u7684\u6301\u7eed\u7a33\u5b9a\uff1a"}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsx)(i.li,{children:"\u5927\u91cfhash\u7ed3\u6784\u6570\u636e\uff0c\u9891\u7e41\u7684\u4fee\u6539\u3001\u65b0\u589e\u3001\u5220\u9664\u5bf9\u5e94key\u4e2d\u7684\u6570\u636e"}),"\n",(0,s.jsx)(i.li,{children:"\u5927\u91cflist\u7ed3\u6784\uff0c\u4ee5\u7c7b\u4f3c\u961f\u5217\u7684\u65b9\u5f0f\u4f7f\u7528pika"}),"\n",(0,s.jsx)(i.li,{children:"\u7ecf\u5e38\u9700\u8981\u5bf9\u591a\u6570\u636e\u7ed3\u6784\u7c7b\u578b\u7684key\u76f4\u63a5\u5220\u9664\u7136\u540e\u590d\u7528"}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"pika\u6700\u4f73\u5b9e\u8df5\u4e4b\u4e09\u5341\u4e8c\uff1a"})}),"\n",(0,s.jsxs)(i.p,{children:["\u5728\u4e1a\u52a1\u538b\u529b\u5927\u3001IO\u4f7f\u7528\u7387\u9ad8\u7684\u65f6\u5019\u5c3d\u91cf\u4e0d\u8981\u6267\u884c",(0,s.jsx)(i.code,{children:"compact"}),"\uff0c\u56e0\u4e3a\u5728IO\u8d44\u6e90\u4e0d\u8db3\u65f6",(0,s.jsx)(i.code,{children:"compact"}),"\u8fc7\u7a0b\u4e2d\u5e26\u6765\u7684IO\u6d88\u8017\u53ef\u80fd\u4f1a\u4e0e\u4e1a\u52a1\u8bf7\u6c42\u53d1\u751fIO\u4e89\u62a2\uff0c\u4f7f\u5b9e\u4f8b\u6574\u4f53\u6027\u80fd\u4e0b\u964d\uff0c\u5982\u679c\u4e0d\u5c0f\u5fc3\u6267\u884c\u4e86\u4e5f\u6ca1\u6709\u5173\u7cfb\uff0c\u91cd\u542fpika\u5373\u53ef\uff0c\u6570\u636e\u4e0d\u4f1a\u635f\u574f\u4e0d\u4f1a\u4e22\u5931\uff0c\u4e0a\u4e00\u6b21\u672a\u5b8c\u6210\u7684",(0,s.jsx)(i.code,{children:"compact"}),"\u6b8b\u7559\u7684sst\u6587\u4ef6\u4f1a\u88abrocksdb\u81ea\u52a8\u5b89\u5168\u7684\u5168\u90e8\u6e05\u7406"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"pika\u6700\u4f73\u5b9e\u8df5\u4e4b\u4e09\u5341\u4e09\uff1a"})}),"\n",(0,s.jsx)(i.p,{children:"\u5728\u5efa\u7acb\u4e3b\u4ece\u7684\u65f6\u5019\u53d1\u73b0\u4ece\u5e93\u53cd\u590d\u7684\u8fdb\u884c\u5168\u540c\u6b65\u5f88\u53ef\u80fd\u662f\u7531\u4e8e\u4e3b\u5e93\u5199\u5165\u91cf\u592a\u5927\uff0c\u5728\u5168\u540c\u6b65\u5b8c\u6bd5\u671f\u95f4\u6e05\u7406\u6389\u4e86\u539f\u5148dumpdb\u65f6\u7684binlog\u70b9\u4f4d\uff0c\u5bfc\u81f4\u4ece\u5e93\u5728\u66ff\u6362\u4e86db\u4e4b\u540e\u91cd\u65b0trysync\u53d1\u73b0\u70b9\u4f4d\u53c8\u627e\u4e0d\u5230\uff0c\u7136\u540e\u91cd\u65b0\u89e6\u53d1\u5168\u540c\u6b65\uff0c\u9677\u5165\u4e86\u5faa\u73af\uff0c\u8fd9\u79cd\u573a\u666f\u4e0b\u53ef\u4ee5\u52a8\u6001\u5c06\u4e3b\u5e93\u7684expire-logs-nums\u8c03\u5927\uff0c\u8ba9\u5176\u4fdd\u7559\u5c3d\u91cf\u591a\u7684binlog, \u5efa\u7acb\u4e3b\u4ece\u6210\u529f\u4e4b\u540e\u518d\u8c03\u8282\u56de\u6765\u5373\u53ef"}),"\n",(0,s.jsx)(i.hr,{}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.em,{children:"\u4e0d\u65ad\u66f4\u65b0"})})]})}function x(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(p,{...e})}):p(e)}},8453:(e,i,c)=>{c.d(i,{R:()=>r,x:()=>l});var s=c(6540);const n={},d=s.createContext(n);function r(e){const i=s.useContext(d);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function l(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),s.createElement(d.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/063090b1.288e2721.js b/build/assets/js/063090b1.288e2721.js new file mode 100644 index 0000000..706fe65 --- /dev/null +++ b/build/assets/js/063090b1.288e2721.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[4624],{7091:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>p,frontMatter:()=>o,metadata:()=>c,toc:()=>d});var i=n(4848),s=n(8453);const o={title:"\u81ea\u52a8\u5bb9\u707e",sidebar_position:70},r=void 0,c={id:"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u81ea\u52a8\u5bb9\u707e/index",title:"\u81ea\u52a8\u5bb9\u707e",description:"pika\u80fd\u591f\u914d\u5408Redis-sentinel(\u54e8\u5175)\u5b9e\u73b0\u81ea\u52a8\u5bb9\u707e\u5207\u4e3b, \u4f7f\u7528\u65b9\u5f0f\u4e0eredis\u5b8c\u5168\u4e00\u81f4",source:"@site/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u81ea\u52a8\u5bb9\u707e/index.md",sourceDirName:"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u81ea\u52a8\u5bb9\u707e",slug:"/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u81ea\u52a8\u5bb9\u707e/",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u81ea\u52a8\u5bb9\u707e/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u81ea\u52a8\u5bb9\u707e/index.md",tags:[],version:"current",sidebarPosition:70,frontMatter:{title:"\u81ea\u52a8\u5bb9\u707e",sidebar_position:70},sidebar:"tutorialSidebar",previous:{title:"\u5206\u5e03\u5f0f\u6a21\u5f0f\u7b80\u5355\u6559\u7a0b",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5206\u5e03\u5f0f\u6a21\u5f0f\u7b80\u5355\u6559\u7a0b/"},next:{title:"\u591a\u5e93\u7248\u547d\u4ee4",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u591a\u5e93\u7248\u547d\u4ee4/"}},a={},d=[];function u(e){const t={br:"br",p:"p",...(0,s.R)(),...e.components};return(0,i.jsxs)(t.p,{children:["pika\u80fd\u591f\u914d\u5408Redis-sentinel(\u54e8\u5175)\u5b9e\u73b0\u81ea\u52a8\u5bb9\u707e\u5207\u4e3b, \u4f7f\u7528\u65b9\u5f0f\u4e0eredis\u5b8c\u5168\u4e00\u81f4",(0,i.jsx)(t.br,{}),"\n","\u9700\u8981\u6ce8\u610f\u7684\u662f, pika\u76ee\u524d\u5e76\u65e0server-uuid, \u4f46\u8fd9\u5e76\u4e0d\u4f1a\u5bf9\u54e8\u5175\u7684\u8fd0\u884c\u9020\u6210\u5f71\u54cd"]})}function p(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>c});var i=n(6540);const s={},o=i.createContext(s);function r(e){const t=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/06983a96.64bb3f34.js b/build/assets/js/06983a96.64bb3f34.js new file mode 100644 index 0000000..c8bf37f --- /dev/null +++ b/build/assets/js/06983a96.64bb3f34.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[2891],{2702:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>p,frontMatter:()=>t,metadata:()=>o,toc:()=>d});var s=i(4848),l=i(8453);const t={title:"\u526f\u672c\u4e00\u81f4\u6027\uff08\u4f7f\u7528\u6587\u6863\uff09",sidebar_position:100},r=void 0,o={id:"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u526f\u672c\u4e00\u81f4\u6027\uff08\u4f7f\u7528\u6587\u6863\uff09/index",title:"\u526f\u672c\u4e00\u81f4\u6027\uff08\u4f7f\u7528\u6587\u6863\uff09",description:"\u7b80\u4ecb",source:"@site/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u526f\u672c\u4e00\u81f4\u6027\uff08\u4f7f\u7528\u6587\u6863\uff09/index.md",sourceDirName:"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u526f\u672c\u4e00\u81f4\u6027\uff08\u4f7f\u7528\u6587\u6863\uff09",slug:"/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u526f\u672c\u4e00\u81f4\u6027\uff08\u4f7f\u7528\u6587\u6863\uff09/",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u526f\u672c\u4e00\u81f4\u6027\uff08\u4f7f\u7528\u6587\u6863\uff09/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u526f\u672c\u4e00\u81f4\u6027\uff08\u4f7f\u7528\u6587\u6863\uff09/index.md",tags:[],version:"current",sidebarPosition:100,frontMatter:{title:"\u526f\u672c\u4e00\u81f4\u6027\uff08\u4f7f\u7528\u6587\u6863\uff09",sidebar_position:100},sidebar:"tutorialSidebar",previous:{title:"\u5206\u7247\u6559\u7a0b(3.1.2 \u2010 3.3.6)",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5206\u7247\u6559\u7a0b/"},next:{title:"\u5b89\u88c5\u4f7f\u7528",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5b89\u88c5\u4f7f\u7528/"}},c={},d=[{value:"\u7b80\u4ecb",id:"\u7b80\u4ecb",level:3},{value:"\u6ce8\u610f",id:"\u6ce8\u610f",level:3},{value:"\u5173\u4e8e\u914d\u7f6e\uff1a",id:"\u5173\u4e8e\u914d\u7f6e",level:3},{value:"\u5173\u4e8e\u5207\u4e3b\uff1a",id:"\u5173\u4e8e\u5207\u4e3b",level:3}];function a(e){const n={a:"a",code:"code",h3:"h3",p:"p",pre:"pre",...(0,l.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h3,{id:"\u7b80\u4ecb",children:"\u7b80\u4ecb"}),"\n",(0,s.jsx)(n.p,{children:"\u526f\u672c\u4e00\u81f4\u6027\u63d0\u4f9b\u4e3b\u4ece\u526f\u672c\u5728\u77ed\u65f6\u95f4\u5185\u8fbe\u5230\u6570\u636e\u4e00\u81f4\u7684\u529f\u80fd\u3002"}),"\n",(0,s.jsx)(n.p,{children:"\u5177\u4f53\u8bf7\u6c42\u6d41\u7a0b\u5982\u4e0b\uff1a"}),"\n",(0,s.jsx)(n.p,{children:"1\uff0c\u5ba2\u6237\u7aef\u8bf7\u6c42\u5230\u4e3b\u5206\u7247\u4e0a"}),"\n",(0,s.jsx)(n.p,{children:"2\uff0c\u4e3b\u5206\u7247\u540c\u6b65\u8bf7\u6c42\u5230\u4e00\u5b9a\u4e2a\u6570(replication-num)\u4ece\u5206\u7247\u4e0a"}),"\n",(0,s.jsx)(n.p,{children:"3\uff0c\u4e3b\u63a5\u6536\u5230\u4e00\u5b9a\u4e2a\u6570\uff08consensus-level\uff09\u7684\u4ece\u53cd\u9988ACK"}),"\n",(0,s.jsx)(n.p,{children:"4\uff0c\u6570\u636e\u843d\u76d8\uff0c\u8fd4\u56de\u5ba2\u6237\u7aef\u8bf7\u6c42"}),"\n",(0,s.jsx)(n.h3,{id:"\u6ce8\u610f",children:"\u6ce8\u610f"}),"\n",(0,s.jsx)(n.p,{children:"\u76ee\u524d\u526f\u672c\u4e00\u81f4\u6027\u529f\u80fd\u53ea\u80fd\u5728\u5206\u7247\u6a21\u5f0f\u4e0b\u8fd0\u884c\u3002"}),"\n",(0,s.jsx)(n.p,{children:"\u7531\u4e8e\u6210\u5458\u53d8\u6362\u7684\u529f\u80fd\u6682\u65f6\u4e0d\u652f\u6301\uff0c\u4e0d\u5efa\u8bae\u5728\u4e3b\u4ece\u5173\u7cfb\u5efa\u7acb\u4e4b\u540e\u66f4\u6362\u65b0\u7684\u4ece\u526f\u672c\u3002"}),"\n",(0,s.jsx)(n.h3,{id:"\u5173\u4e8e\u914d\u7f6e",children:"\u5173\u4e8e\u914d\u7f6e\uff1a"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-c++",children:"# replication num defines how many followers in a single raft group, only [0, 1, 2, 3, 4] is valid\nreplication-num : 0\n# consensus level defines how many confirms does leader get, before commit this log to client,\n# only [0, ...replicaiton-num] is valid\nconsensus-level : 0\n\n"})}),"\n",(0,s.jsx)(n.p,{children:"replication-num \u542b\u4e49\u662f\u5728\u5206\u7247\u526f\u672c\u4e2d\uff0c\u4ece\u526f\u672c\u7684\u4e2a\u6570\u3002\u76ee\u524d\u53ef\u4ee5\u914d\u7f6e\u7684\u53c2\u6570\u8303\u56f4\u4e3a[0, 1, 2, 3, 4]"}),"\n",(0,s.jsx)(n.p,{children:"consensus-level \u542b\u4e49\u5728\u8fd4\u56de\u5ba2\u6237\u7aef\u4e4b\u524d\u9700\u8981\u6709\u591a\u5c11\u4ece\u786e\u8ba4\u5df2\u7ecf\u6536\u5230\u4e86\u8fd9\u4e00\u6761\u65e5\u5fd7\u3002\u76ee\u524d\u53ef\u4ee5\u914d\u7f6e\u7684\u53c2\u6570\u8303\u56f4\u4e3a[0, ...replicaiton-num]"}),"\n",(0,s.jsx)(n.p,{children:"example:"}),"\n",(0,s.jsx)(n.p,{children:"a) \u4f7f\u75283\u4e2a\u526f\u672c\uff081\u4e3b2\u4ece\uff09\u573a\u666f\uff0c\u5e0c\u671b\u4e3b\u5206\u7247\u4e0a\u6536\u52302\u526f\u672cACK\u4e4b\u540e\u518d\u8fd4\u56de\u5ba2\u6237\u7aef\u3002"}),"\n",(0,s.jsx)(n.p,{children:"replication-num: 2"}),"\n",(0,s.jsx)(n.p,{children:"consensus-level: 2"}),"\n",(0,s.jsx)(n.p,{children:"b) \u4f7f\u75283\u4e2a\u526f\u672c\uff081\u4e3b2\u4ece\uff09\u573a\u666f\uff0c\u5e0c\u671b\u5199\u5165\u5927\u591a\u6570\u526f\u672c\uff0c\u5373\u5e0c\u671b\u4e3b\u5206\u7247\u4e0a\u6536\u52301\u526f\u672cACK\u4e4b\u540e\u518d\u8fd4\u56de\u5ba2\u6237\u7aef\u3002"}),"\n",(0,s.jsx)(n.p,{children:"replication-num: 2"}),"\n",(0,s.jsx)(n.p,{children:"consensus-level: 1"}),"\n",(0,s.jsx)(n.p,{children:"c) \u9ed8\u8ba4\u573a\u666f\u4e0d\u5f00\u542f\u4e00\u81f4\u6027\uff0c\u5e0c\u671b\u5199\u5165\u4e3b\u526f\u672c\u4e4b\u540e\u7acb\u9a6c\u8fd4\u56de\u5ba2\u6237\u7aef\uff0c\u91c7\u7528\u5f02\u6b65\u540c\u6b65\u7684\u65b9\u5f0f\u5c06LOG\u540c\u6b65\u7ed9\u4ece\u526f\u672c\u3002"}),"\n",(0,s.jsx)(n.p,{children:"replication-num: 0"}),"\n",(0,s.jsx)(n.p,{children:"consensus-level: 0"}),"\n",(0,s.jsx)(n.h3,{id:"\u5173\u4e8e\u5207\u4e3b",children:"\u5173\u4e8e\u5207\u4e3b\uff1a"}),"\n",(0,s.jsx)(n.p,{children:"\u5728\u4e00\u4e9b\u573a\u666f\u4e0b\uff0c\u4f8b\u5982\u5199\u5927\u591a\u6570\u573a\u666f\uff0c\u4e0d\u80fd\u4fdd\u8bc1\u4e3b\u4e0a\u9762\u7684\u65b0\u5199\u5165\u6570\u636e\u4e00\u5b9a\u4f1a\u9a6c\u4e0a\u540c\u6b65\u5230\u6240\u6709\u4ece\u4e0a\u9762\u3002\u8fd9\u65f6\u5019\u4e3b\u526f\u672cdown\u4e86\uff0c\u9700\u8981\u7ba1\u7406\u5458\u6839\u636e\u5404\u4e2a\u526f\u672c\u7684\u65e5\u5fd7\u72b6\u51b5\u9009\u62e9\u5207\u4e3b\u3002\u5982\u679c\u5207\u4e3b\u4e0d\u5f53\u53ef\u80fd\u4f1a\u9020\u6210\u6570\u636e\u4e22\u5931\uff0c\u540c\u6b65\u5f02\u5e38\u7b49\u60c5\u51b5\uff0c\u8bf7\u5c0f\u5fc3\u64cd\u4f5c\u3002"}),"\n",(0,s.jsx)(n.p,{children:"\u5177\u4f53\u6d41\u7a0b\uff1a"}),"\n",(0,s.jsx)(n.p,{children:"\u4f7f\u7528 pkcluster info slot \u4e2d\u67e5\u770b\u5404\u4e2a\u4ece\u526f\u672c\u7684\u5206\u7247\u65e5\u5fd7\u4fe1\u606f\uff0c\u9009\u62e9term \u66f4\u5927\uff0c\u6216\u8005term\u76f8\u540c index \u66f4\u5927\u7684\u5206\u7247\u6210\u4e3a\u4e3b\u3002"}),"\n",(0,s.jsx)(n.p,{children:"example\uff1a"}),"\n",(0,s.jsx)(n.p,{children:"\u526f\u672c1 consensus_last_log=filenum: 9 offset: 65234985 term: 33 index: 998386"}),"\n",(0,s.jsx)(n.p,{children:"\u526f\u672c2 consensus_last_log=filenum: 9 offset: 65234985 term: 33 index: 998300"}),"\n",(0,s.jsxs)(n.p,{children:["\u6b64\u65f6\u5e94\u8be5\u9009\u62e9\u526f\u672c2\u4e3a\u65b0\u4e3b\u3002\u7ba1\u7406\u5458\u4f7f\u7528 pkcluster slotsslaveof ip port [0-3,8,9,10,11 | all] \u547d\u4ee4\u53ef\u4ee5\u8fdb\u884c\u5207\u4e3b\u64cd\u4f5c\u3002\u5177\u4f53\u547d\u4ee4\u4f7f\u7528\u65b9\u6cd5\u89c1",(0,s.jsx)(n.a,{href:"https://github.com/Qihoo360/pika/wiki/Pika%E5%88%86%E7%89%87%E5%91%BD%E4%BB%A4",children:"Pika\u5206\u7247\u547d\u4ee4"})]})]})}function p(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>o});var s=i(6540);const l={},t=s.createContext(l);function r(e){const n=s.useContext(t);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:r(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/07f9788a.452e6f40.js b/build/assets/js/07f9788a.452e6f40.js new file mode 100644 index 0000000..6a4db8e --- /dev/null +++ b/build/assets/js/07f9788a.452e6f40.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[9315],{5438:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>j,frontMatter:()=>i,metadata:()=>x,toc:()=>d});var l=n(4848),s=n(8453);const i={title:"\u652f\u6301\u7684 Redis \u63a5\u53e3\u4e0e\u517c\u5bb9\u60c5\u51b5",sidebar_position:2},r=void 0,x={id:"\u5e8f\u8a00/\u652f\u6301\u7684 Redis \u63a5\u53e3\u4e0e\u517c\u5bb9\u60c5\u51b5/index",title:"\u652f\u6301\u7684 Redis \u63a5\u53e3\u4e0e\u517c\u5bb9\u60c5\u51b5",description:"pika\u652f\u6301redis\u4e94\u79cd\u7c7b\u578b\uff08\u5206\u522b\u4e3astring\u3001hash\u3001list\u3001set\u3001zset\uff09\u7684\u63a5\u53e3\uff0c\u5148\u5217\u51fa\u5176\u5bf9redis\u7684\u4e94\u79cd\u6570\u636e\u7ed3\u6784\u517c\u5bb9\u7edf\u8ba1\u3002",source:"@site/docs/\u5e8f\u8a00/\u652f\u6301\u7684 Redis \u63a5\u53e3\u4e0e\u517c\u5bb9\u60c5\u51b5/index.md",sourceDirName:"\u5e8f\u8a00/\u652f\u6301\u7684 Redis \u63a5\u53e3\u4e0e\u517c\u5bb9\u60c5\u51b5",slug:"/\u5e8f\u8a00/\u652f\u6301\u7684 Redis \u63a5\u53e3\u4e0e\u517c\u5bb9\u60c5\u51b5/",permalink:"/docs/\u5e8f\u8a00/\u652f\u6301\u7684 Redis \u63a5\u53e3\u4e0e\u517c\u5bb9\u60c5\u51b5/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u5e8f\u8a00/\u652f\u6301\u7684 Redis \u63a5\u53e3\u4e0e\u517c\u5bb9\u60c5\u51b5/index.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"\u652f\u6301\u7684 Redis \u63a5\u53e3\u4e0e\u517c\u5bb9\u60c5\u51b5",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"PikiwiDB(Pika) \u7b80\u4ecb",permalink:"/docs/\u5e8f\u8a00/\u7b80\u4ecb/"},next:{title:"FAQ",permalink:"/docs/\u5e8f\u8a00/FAQ/"}},c={},d=[{value:"\u7edf\u8ba1\u6240\u7528\u7684\u6807\u8bb0\u542b\u4e49\u5982\u4e0b\uff1a",id:"\u7edf\u8ba1\u6240\u7528\u7684\u6807\u8bb0\u542b\u4e49\u5982\u4e0b",level:4},{value:"Keys",id:"keys",level:2},{value:"Strings",id:"strings",level:2},{value:"Hashes",id:"hashes",level:2},{value:"Lists",id:"lists",level:2},{value:"Sets",id:"sets",level:2},{value:"Sorted Sets",id:"sorted-sets",level:2},{value:"HyperLogLog",id:"hyperloglog",level:2},{value:"GEO",id:"geo",level:2},{value:"BitMap",id:"bitmap",level:2},{value:"Pub/Sub",id:"pubsub",level:2},{value:"ACL",id:"acl",level:2},{value:"Stream",id:"stream",level:2},{value:"\u7ba1\u7406\u547d\u4ee4\uff08\u8fd9\u91cc\u4ec5\u5217\u51fapika\u517c\u5bb9\u7684\uff09",id:"\u7ba1\u7406\u547d\u4ee4\u8fd9\u91cc\u4ec5\u5217\u51fapika\u517c\u5bb9\u7684",level:2},{value:"\u91cd\u8981\u8bf4\u660e",id:"\u91cd\u8981\u8bf4\u660e",level:2}];function h(e){const t={a:"a",code:"code",h2:"h2",h4:"h4",hr:"hr",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(t.p,{children:"pika\u652f\u6301redis\u4e94\u79cd\u7c7b\u578b\uff08\u5206\u522b\u4e3astring\u3001hash\u3001list\u3001set\u3001zset\uff09\u7684\u63a5\u53e3\uff0c\u5148\u5217\u51fa\u5176\u5bf9redis\u7684\u4e94\u79cd\u6570\u636e\u7ed3\u6784\u517c\u5bb9\u7edf\u8ba1\u3002"}),"\n",(0,l.jsx)(t.h4,{id:"\u7edf\u8ba1\u6240\u7528\u7684\u6807\u8bb0\u542b\u4e49\u5982\u4e0b",children:"\u7edf\u8ba1\u6240\u7528\u7684\u6807\u8bb0\u542b\u4e49\u5982\u4e0b\uff1a"}),"\n",(0,l.jsxs)(t.table,{children:[(0,l.jsx)(t.thead,{children:(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"\u56fe\u6807"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"\u542b\u4e49"})]})}),(0,l.jsxs)(t.tbody,{children:[(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"\u8be5\u63a5\u53e3\u5b8c\u5168\u652f\u6301\uff0c\u4f7f\u7528\u65b9\u5f0f\u4e0eredis\u6ca1\u6709\u4efb\u4f55\u533a\u522b"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"\uff01"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"\u529f\u80fd\u652f\u6301\uff0c\u4f46\u4f7f\u7528\u6216\u8f93\u51fa\u4e0eredis\u6709\u90e8\u5206\u5dee\u5f02\uff0c\u9700\u6ce8\u610f"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"\xd7"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"\u5f53\u524d\u8fd8\u672a\u652f\u6301"})]})]})]}),"\n",(0,l.jsx)(t.hr,{}),"\n",(0,l.jsx)(t.h2,{id:"keys",children:"Keys"}),"\n",(0,l.jsxs)(t.table,{children:[(0,l.jsx)(t.thead,{children:(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"\u63a5\u53e3"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"DEL"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"DUMP"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"EXISTS"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"EXPIRE"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"EXPIREAT"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"KEYS"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"MIGRATE"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"MOVE"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"OBJECT"})]})}),(0,l.jsxs)(t.tbody,{children:[(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"\u72b6\u6001"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"\u63a5\u53e3"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"PERSIST"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"PEXPIRE"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"PEXPIREAT"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"PTTL"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"RANDOMKEY"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"RENAME"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"RENAMENX"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"RESTORE"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"SORT"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"\u72b6\u6001"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"!"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"!"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"\u63a5\u53e3"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"TOUCH"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"TTL"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"TYPE"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"UNLINK"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"WAIT"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"SCAN"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"\u72b6\u6001"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"!"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"!"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}})]})]})]}),"\n",(0,l.jsx)(t.p,{children:(0,l.jsx)(t.strong,{children:"\u5907\u6ce8:"})}),"\n",(0,l.jsxs)(t.ul,{children:["\n",(0,l.jsxs)(t.li,{children:["\n",(0,l.jsx)(t.p,{children:"PEXPIRE\uff1a\u65e0\u6cd5\u7cbe\u786e\u5230\u6beb\u79d2\uff0c\u5e95\u5c42\u4f1a\u81ea\u52a8\u622a\u65ad\u6309\u79d2\u7ea7\u522b\u8fdb\u884c\u5904\u7406;"}),"\n"]}),"\n",(0,l.jsxs)(t.li,{children:["\n",(0,l.jsx)(t.p,{children:"PEXPIREAT\uff1a\u65e0\u6cd5\u7cbe\u786e\u5230\u6beb\u79d2\uff0c\u5e95\u5c42\u4f1a\u81ea\u52a8\u622a\u65ad\u6309\u79d2\u7ea7\u522b\u8fdb\u884c\u5904\u7406;"}),"\n"]}),"\n",(0,l.jsxs)(t.li,{children:["\n",(0,l.jsx)(t.p,{children:"SCAN\uff1a\u4f1a\u987a\u5e8f\u8fed\u4ee3\u5f53\u524ddb\u7684\u5feb\u7167\uff0c\u7531\u4e8epika\u5141\u8bb8\u91cd\u540d\u4e94\u6b21\uff0c\u6240\u4ee5scan\u6709\u4f18\u5148\u8f93\u51fa\u987a\u5e8f\uff0c\u4f9d\u6b21\u4e3a\uff1astring -> hash -> list -> zset -> set;"}),"\n"]}),"\n",(0,l.jsxs)(t.li,{children:["\n",(0,l.jsx)(t.p,{children:"TYPE\uff1a\u53e6\u5916\u7531\u4e8epika\u5141\u8bb8\u91cd\u540d\u4e94\u6b21\uff0c\u6240\u4ee5type\u6709\u4f18\u5148\u8f93\u51fa\u987a\u5e8f\uff0c\u4f9d\u6b21\u4e3a\uff1astring -> hash -> list -> zset -> set\uff0c\u5982\u679c\u8fd9\u4e2akey\u5728string\u4e2d\u5b58\u5728\uff0c\u90a3\u4e48\u53ea\u8f93\u51fasting\uff0c\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u90a3\u4e48\u5219\u8f93\u51fahash\u7684\uff0c\u4f9d\u6b21\u7c7b\u63a8\u3002"}),"\n"]}),"\n",(0,l.jsxs)(t.li,{children:["\n",(0,l.jsx)(t.p,{children:'KEYS: KEYS\u547d\u4ee4\u652f\u6301\u53c2\u6570\u652f\u6301\u626b\u63cf\u6307\u5b9a\u7c7b\u578b\u7684\u6570\u636e\uff0c\u7528\u6cd5\u5982 "keys * [string, hash, list, zset, set]"'}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(t.h2,{id:"strings",children:"Strings"}),"\n",(0,l.jsxs)(t.table,{children:[(0,l.jsx)(t.thead,{children:(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"\u63a5\u53e3"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"APPEND"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"BITCOUNT"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"BITFIELD"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"BITOP"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"BITPOS"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"DECR"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"DECRBY"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"GET"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"GETBIT"})]})}),(0,l.jsxs)(t.tbody,{children:[(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"\u72b6\u6001"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"!"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"!"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"\u63a5\u53e3"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"GETRANGE"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"GETSET"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"INCR"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"INCRBY"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"INCRBYFLOAT"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"MGET"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"MSET"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"MSETNX"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"STRLEN"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"\u72b6\u6001"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"\u63a5\u53e3"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"PSETEX"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"SET"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"SETBIT"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"SETEX"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"SETNX"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"SETRANGE"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"\u72b6\u6001"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"!"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}})]})]})]}),"\n",(0,l.jsx)(t.p,{children:(0,l.jsx)(t.strong,{children:"\u5907\u6ce8:"})}),"\n",(0,l.jsxs)(t.ul,{children:["\n",(0,l.jsx)(t.li,{children:"BIT\u64cd\u4f5c\uff1a\u4e0eRedis\u4e0d\u540c\uff0cPika\u7684bit\u64cd\u4f5c\u8303\u56f4\u4e3a2^21\uff0c bitmap\u7684\u6700\u5927\u503c\u4e3a256Kb\u3002redis setbit \u53ea\u662f\u5bf9key\u7684value\u503c\u66f4\u65b0\u3002\u4f46\u662fpika\u4f7f\u7528rocksdb\u4f5c\u4e3a\u5b58\u50a8\u5f15\u64ce\uff0crocksdb\u53ea\u4f1a\u65b0\u5199\u5165\u6570\u636e\u5e76\u4e14\u53ea\u5728compact\u7684\u65f6\u5019\u624d\u4ece\u786c\u76d8\u5220\u9664\u65e7\u6570\u636e\u3002\u5982\u679cpika\u7684bit\u64cd\u4f5c\u8303\u56f4\u548credis\u4e00\u81f4\u90fd\u662f2^32\u7684\u8bdd\uff0c\u90a3\u4e48\u6709\u53ef\u80fd\u6bcf\u6b21\u5bf9\u540c\u4e00\u4e2akey setbit\u65f6\uff0crocksdb\u90fd\u4f1a\u5b58\u50a8\u4e00\u4e2a512M\u5927\u5c0f\u7684value\u3002\u8fd9\u4f1a\u4ea7\u751f \u4e25\u91cd\u7684\u6027\u80fd\u9690\u60a3\u3002\u56e0\u6b64\u6211\u4eec\u5bf9pika\u7684bit\u64cd\u4f5c\u8303\u56f4\u4f5c\u4e86\u53d6\u820d\u3002"}),"\n"]}),"\n",(0,l.jsx)(t.h2,{id:"hashes",children:"Hashes"}),"\n",(0,l.jsxs)(t.table,{children:[(0,l.jsx)(t.thead,{children:(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"\u63a5\u53e3"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"HDEL"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"HEXISTS"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"HGET"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"HGETALL"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"HINCRBY"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"HINCRBYFLOAT"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"HKEYS"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"HLEN"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"HMGET"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"HMSET"})]})}),(0,l.jsxs)(t.tbody,{children:[(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"\u72b6\u6001"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"\u63a5\u53e3"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"HSET"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"HSETNX"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"HVALS"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"HSCAN"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"HSTRLEN"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"\u72b6\u6001"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"!"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}})]})]})]}),"\n",(0,l.jsx)(t.p,{children:(0,l.jsx)(t.strong,{children:"\u5907\u6ce8:"})}),"\n",(0,l.jsxs)(t.ul,{children:["\n",(0,l.jsx)(t.li,{children:"HSET\u64cd\u4f5c\uff1a\u6682\u4e0d\u652f\u6301\u5355\u6761\u547d\u4ee4\u8bbe\u7f6e\u591a\u4e2afield value\uff0c\u5982\u6709\u9700\u6c42\u8bf7\u7528HMSET"}),"\n"]}),"\n",(0,l.jsx)(t.h2,{id:"lists",children:"Lists"}),"\n",(0,l.jsxs)(t.table,{children:[(0,l.jsx)(t.thead,{children:(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"\u63a5\u53e3"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"LINDEX"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"LINSERT"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"LLEN"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"LPOP"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"LPUSH"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"LPUSHX"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"LRANGE"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"LREM"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"LSET"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"LTRIM"})]})}),(0,l.jsxs)(t.tbody,{children:[(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"\u72b6\u6001"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"\u63a5\u53e3"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"RPOP"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"RPOPLPUSH"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"RPUSH"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"RPUSHX"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"BLPOP"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"BRPOP"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"BRPOPLPUSH"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"\u72b6\u6001"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}})]})]})]}),"\n",(0,l.jsx)(t.h2,{id:"sets",children:"Sets"}),"\n",(0,l.jsxs)(t.table,{children:[(0,l.jsx)(t.thead,{children:(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"\u63a5\u53e3"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"SADD"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"SCARD"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"SDIFF"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"SDIFFSTORE"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"SINTER"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"SINTERSTORE"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"SISMEMBER"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"SMEMBERS"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"SMOVE"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"SPOP"})]})}),(0,l.jsxs)(t.tbody,{children:[(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"\u72b6\u6001"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"\u63a5\u53e3"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"SRANDMEMBER"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"SREM"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"SUNION"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"SUNIONSTORE"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"SSCAN"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"\u72b6\u6001"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"!"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}})]})]})]}),"\n",(0,l.jsx)(t.p,{children:(0,l.jsx)(t.strong,{children:"\u5907\u6ce8\uff1a"})}),"\n",(0,l.jsxs)(t.ul,{children:["\n",(0,l.jsx)(t.li,{children:"SRANDMEMBER\uff1a\u65f6\u95f4\u590d\u6742\u5ea6O( n )\uff0c\u8017\u65f6\u8f83\u591a"}),"\n"]}),"\n",(0,l.jsx)(t.h2,{id:"sorted-sets",children:"Sorted Sets"}),"\n",(0,l.jsxs)(t.table,{children:[(0,l.jsx)(t.thead,{children:(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"\u63a5\u53e3"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"ZADD"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"ZCARD"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"ZCOUNT"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"ZINCRBY"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"ZRANGE"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"ZRANGEBYSCORE"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"ZRANK"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"ZREM"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"ZREMRANGEBYRANK"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"ZREMRANGEBYSCORE"})]})}),(0,l.jsxs)(t.tbody,{children:[(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"\u72b6\u6001"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"\u63a5\u53e3"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"ZREVRANGE"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"ZREVRANGEBYSCORE"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"ZREVRANK"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"ZSCORE"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"ZUNIONSTORE"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"ZINTERSTORE"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"ZSCAN"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"ZRANGEBYLEX"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"ZLEXCOUNT"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"ZREMRANGEBYLEX"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"\u72b6\u6001"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"\u63a5\u53e3"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"ZPOPMAX"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"ZPOPMIN"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"ZREVERANGEBYLEX"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}})]}),(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"\u72b6\u6001"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}}),(0,l.jsx)(t.td,{style:{textAlign:"center"}})]})]})]}),"\n",(0,l.jsxs)(t.ul,{children:["\n",(0,l.jsx)(t.li,{children:"ZADD \u7684\u9009\u9879 [NX|XX] [CH] [INCR] \u6682\u4e0d\u652f\u6301"}),"\n"]}),"\n",(0,l.jsx)(t.h2,{id:"hyperloglog",children:"HyperLogLog"}),"\n",(0,l.jsxs)(t.table,{children:[(0,l.jsx)(t.thead,{children:(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"\u63a5\u53e3"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"PFADD"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"PFCOUNT"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"PFMERGE"})]})}),(0,l.jsx)(t.tbody,{children:(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"\u72b6\u6001"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"})]})})]}),"\n",(0,l.jsx)(t.p,{children:(0,l.jsx)(t.strong,{children:"\u5907\u6ce8\uff1a"})}),"\n",(0,l.jsxs)(t.ul,{children:["\n",(0,l.jsx)(t.li,{children:"50w\u4ee5\u5185\u8bef\u5dee\u5747\u5c0f\u4e8e1%, 100w\u4ee5\u5185\u8bef\u5dee\u5c0f\u4e8e3%, \u4f46\u4ed8\u51fa\u4e86\u65f6\u95f4\u4ee3\u4ef7."}),"\n"]}),"\n",(0,l.jsx)(t.h2,{id:"geo",children:"GEO"}),"\n",(0,l.jsxs)(t.table,{children:[(0,l.jsx)(t.thead,{children:(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"\u63a5\u53e3"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"GEOADD"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"GEODIST"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"GEOHASH"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"GEOPOS"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"GEORADIUS"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"GEORADIUSBYMEMBER"})]})}),(0,l.jsx)(t.tbody,{children:(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"\u72b6\u6001"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"})]})})]}),"\n",(0,l.jsx)(t.h2,{id:"bitmap",children:"BitMap"}),"\n",(0,l.jsxs)(t.table,{children:[(0,l.jsx)(t.thead,{children:(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"\u63a5\u53e3"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"SETBIT"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"GETBIT"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"BITPOS"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"BITOP"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"BITCOUNT"})]})}),(0,l.jsx)(t.tbody,{children:(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"\u72b6\u6001"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"})]})})]}),"\n",(0,l.jsx)(t.h2,{id:"pubsub",children:"Pub/Sub"}),"\n",(0,l.jsxs)(t.table,{children:[(0,l.jsx)(t.thead,{children:(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"\u63a5\u53e3"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"PSUBSCRIBE"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"PUBSUB"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"PUBLISH"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"PUNSUBSCRIBE"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"SUBSCRIBE"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"UNSUBSCRIBE"})]})}),(0,l.jsx)(t.tbody,{children:(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"\u72b6\u6001"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"})]})})]}),"\n",(0,l.jsx)(t.h2,{id:"acl",children:"ACL"}),"\n",(0,l.jsxs)(t.table,{children:[(0,l.jsx)(t.thead,{children:(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"\u63a5\u53e3"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"ACL CAT"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"ACL DELUSER"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"ACL DRYRUN"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"ACL GENPASS"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"ACL GETUSER"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"ACL LIST"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"ACL LOAD"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"ACL LOG"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"ACL SAVE"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"ACL SETUSER"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"ACL USERS"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"ACL HELP"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"ACL WHOAMI"})]})}),(0,l.jsx)(t.tbody,{children:(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"\u72b6\u6001"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"!"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"})]})})]}),"\n",(0,l.jsxs)(t.p,{children:[(0,l.jsx)(t.strong,{children:"\u5907\u6ce8\uff1a"}),"\nredis\u4e2d\u90e8\u5206\u547d\u4ee4\u662f\u6709\u5b50\u547d\u4ee4\u7684, \u8fd9\u4e9b\u547d\u4ee4\u5728pika\u4e2d\u662f\u4e00\u4e2a\u547d\u4ee4, \u5728ACL\u5212\u5206\u6743\u9650\u65f6, \u53ef\u80fd\u65e0\u6cd5\u505a\u5230\u5b8c\u5168\u517c\u5bb9redis."]}),"\n",(0,l.jsx)(t.h2,{id:"stream",children:"Stream"}),"\n",(0,l.jsxs)(t.table,{children:[(0,l.jsx)(t.thead,{children:(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"\u63a5\u53e3"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"XADD"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"XDEL"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"XRANGE"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"XREVRANGE"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"XREAD"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"XLEN"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"XINFO"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"XTRIM"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"XACK"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"XGROUP DESTROY"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"XGROUP HELP"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"XCLAIM"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"XAUTOCLAIM"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"XREADGROUP"})]})}),(0,l.jsx)(t.tbody,{children:(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"\u72b6\u6001"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"x"})]})})]}),"\n",(0,l.jsx)(t.p,{children:(0,l.jsx)(t.strong,{children:"\u5907\u6ce8\uff1a"})}),"\n",(0,l.jsxs)(t.ul,{children:["\n",(0,l.jsx)(t.li,{children:"xread \uff1a\u6682\u4e0d\u652f\u6301\u963b\u585e\u7b49\u5f85\u7684\u65b9\u5f0f\uff08\u7c7b\u4f3c\u4e8eblpop\uff09"}),"\n"]}),"\n",(0,l.jsx)(t.h2,{id:"\u7ba1\u7406\u547d\u4ee4\u8fd9\u91cc\u4ec5\u5217\u51fapika\u517c\u5bb9\u7684",children:"\u7ba1\u7406\u547d\u4ee4\uff08\u8fd9\u91cc\u4ec5\u5217\u51fapika\u517c\u5bb9\u7684\uff09"}),"\n",(0,l.jsxs)(t.table,{children:[(0,l.jsx)(t.thead,{children:(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"\u63a5\u53e3"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"INFO"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"CONFIG"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"CLIENT"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"PING"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"BGSAVE"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"SHUTDOWN"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"SELECT"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"TYPE"}),(0,l.jsx)(t.th,{style:{textAlign:"center"},children:"HELLO"})]})}),(0,l.jsx)(t.tbody,{children:(0,l.jsxs)(t.tr,{children:[(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"\u72b6\u6001"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"!"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"!"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"!"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"!"}),(0,l.jsx)(t.td,{style:{textAlign:"center"},children:"o"})]})})]}),"\n",(0,l.jsx)(t.p,{children:(0,l.jsx)(t.strong,{children:"\u5907\u6ce8\uff1a"})}),"\n",(0,l.jsxs)(t.ul,{children:["\n",(0,l.jsxs)(t.li,{children:["\n",(0,l.jsx)(t.p,{children:"\u6682\u4e0d\u652f\u6301keyspace notifications"}),"\n"]}),"\n",(0,l.jsxs)(t.li,{children:["\n",(0,l.jsx)(t.p,{children:"info\uff1ainfo\u652f\u6301\u5168\u90e8\u8f93\u51fa\uff0c\u4e5f\u652f\u6301\u5339\u914d\u5f62\u5f0f\u7684\u8f93\u51fa\uff0c\u4f8b\u5982\u53ef\u4ee5\u901a\u8fc7info stats\u67e5\u770b\u72b6\u6001\u4fe1\u606f\uff0c\u9700\u8981\u6ce8\u610f\u7684\u662fkey space\u4e0eredis\u4e0d\u540c\uff0cpika\u5bf9\u4e8ekey space\u7684\u5c55\u793a\u9009\u62e9\u4e86\u5206\u7c7b\u578b\u5c55\u793a\u800c\u975eredis\u7684\u5206\u5e93\u5c55\u793a\uff08\u56e0\u4e3apika\u6ca1\u6709\u5e93\uff09\uff0cpika\u5bf9\u4e8ekey space\u7684\u7edf\u8ba1\u662f\u88ab\u52a8\u7684\uff0c\u9700\u8981\u624b\u52a8\u89e6\u53d1\uff0c\u7136\u540epika\u4f1a\u5728\u540e\u53f0\u8fdb\u884c\u7edf\u8ba1\uff0cpika\u7684key space\u7edf\u8ba1\u662f\u7cbe\u786e\u7684\u3002\u89e6\u53d1\u65b9\u5f0f\u4e3a\u6267\u884c\uff1akeyspace\u547d\u4ee4\u5373\u53ef\uff0c\u7136\u540epika\u4f1a\u5728\u540e\u53f0\u7edf\u8ba1\uff0c\u6b64\u65f6\u53ef\u4ee5\u4f7f\u7528\uff1akeyspace readonly\u547d\u4ee4\u6765\u8fdb\u884c\u67e5\u770b\uff0creadonly\u53c2\u6570\u53ef\u4ee5\u907f\u514d\u53cd\u590d\u8fdb\u884c\u7edf\u8ba1\uff0c\u5982\u679c\u5f53\u524d\u6570\u636e\u4e3a0\uff0c\u5219\u8bc1\u660e\u8fd8\u5728\u7edf\u8ba1\u4e2d\uff1b\ninfo commandstats\u53ef\u4ee5\u67e5\u8be2\u5230\u5404\u4e2a\u547d\u4ee4\u7684\u8c03\u7528\u6b21\u6570\u548c\u7edf\u8ba1\u7528\u65f6\u4ee5\u53ca\u5e73\u5747\u7528\u65f6\uff0c\u548credis\u4e0d\u540c\u7684\u662f\u6211\u4eec\u7edf\u8ba1\u8017\u65f6\u7684\u65f6\u95f4\u5355\u4f4d\u662f\u6beb\u79d2"}),"\n"]}),"\n",(0,l.jsxs)(t.li,{children:["\n",(0,l.jsx)(t.p,{children:"client\uff1a\u5f53\u524dclient\u547d\u4ee4\u652f\u6301client list\u53caclient kill\u8fd8\u6709client setname\uff0cclient list\u663e\u793a\u7684\u5185\u5bb9\u5c11\u4e8eredis\uff1b"}),"\n"]}),"\n",(0,l.jsxs)(t.li,{children:["\n",(0,l.jsx)(t.p,{children:"select\uff1a\u8be5\u547d\u4ee4\u57283.1.0\u7248\u524d\u65e0\u4efb\u4f55\u6548\u679c\uff0c\u81ea3.1.0\u7248\u5f00\u59cb\u4e0eRedis\u4e00\u81f4;"}),"\n"]}),"\n",(0,l.jsxs)(t.li,{children:["\n",(0,l.jsxs)(t.p,{children:["ping\uff1a\u8be5\u547d\u4ee4\u4ec5\u652f\u6301\u65e0\u53c2\u6570\u4f7f\u7528\uff0c\u5373\u4f7f\u7528",(0,l.jsx)(t.code,{children:"PING"}),"\uff0c\u5ba2\u6237\u7aef\u8fd4\u56de",(0,l.jsx)(t.code,{children:"PONG"}),"."]}),"\n"]}),"\n",(0,l.jsxs)(t.li,{children:["\n",(0,l.jsxs)(t.p,{children:["type\uff1apika\u4e0d\u540c\u7c7b\u578b\u7684key ",(0,l.jsx)(t.strong,{children:"name"})," \u662f\u5141\u8bb8\u91cd\u590d\u7684\uff0c\u4f8b\u5982\uff1a",(0,l.jsx)(t.code,{children:"string"})," \u7c7b\u578b\u91cc\u6709 ",(0,l.jsx)(t.strong,{children:"key1"}),"\uff0c",(0,l.jsx)(t.code,{children:"hash"})," ",(0,l.jsx)(t.code,{children:"list"})," ",(0,l.jsx)(t.code,{children:"set"})," ",(0,l.jsx)(t.code,{children:"zset"}),"\u7c7b\u578b\u53ef\u4ee5\u540c\u65f6\u5b58\u5728 ",(0,l.jsx)(t.strong,{children:"key1"}),"\uff0c\u5728\u4f7f\u7528 ",(0,l.jsx)(t.code,{children:"type"}),"\u547d\u4ee4\u67e5\u8be2\u65f6\uff0c\u53ea\u80fd\u5f97\u5230\u4e00\u4e2a\uff0c\u5982\u679c\u8981\u67e5\u8be2\u540c\u4e00\u4e2a ",(0,l.jsx)(t.strong,{children:"name"})," \u6240\u6709\u7684\u7c7b\u578b\uff0c\u9700\u8981\u4f7f\u7528 ",(0,l.jsx)(t.code,{children:"ptype"})," \u547d\u4ee4\u67e5\u8be2"]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(t.hr,{}),"\n",(0,l.jsx)(t.h2,{id:"\u91cd\u8981\u8bf4\u660e",children:"\u91cd\u8981\u8bf4\u660e"}),"\n",(0,l.jsxs)(t.ul,{children:["\n",(0,l.jsxs)(t.li,{children:["\n",(0,l.jsx)(t.p,{children:"\u91cd\u540d\u95ee\u9898\uff1a\u7531\u4e8epika\u6bcf\u4e2a\u7c7b\u578b\u72ec\u7acb\u8fd0\u4f5c\uff0c \u6240\u4ee5\u5141\u8bb8\u91cd\u540d\u3002\u4f8b\u5982\u5728key abc\u5728string\u4e2d\u5b58\u5728\u7684\u65f6\u5019\u4e5f\u540c\u6837\u5141\u8bb8\u5728hash\u4e2d\u5b58\u5728\uff0c\u4e00\u4e2akey\u6700\u591a\u91cd\u540d5\u6b21\uff085\u5927\u7c7b\u578b\uff09\uff0c\u4f46\u5728\u540c\u4e00\u63a5\u53e3\u4e2d\u662f\u65e0\u6cd5\u91cd\u540d\u7684\u3002\u6240\u4ee5\u5efa\u8bae\u5728\u4f7f\u7528\u7684\u65f6\u5019\u5bf9\u4e8e\u4e0d\u540c\u7c7b\u578b\u4e0d\u8981\u4f7f\u7528\u5b8c\u5168\u76f8\u540c\u7684key;"}),"\n"]}),"\n",(0,l.jsxs)(t.li,{children:["\n",(0,l.jsxs)(t.p,{children:["\u5206\u5e93\u95ee\u9898\uff1apika\u81ea3.1.0\u7248\u8d77\u652f\u6301\u591a\u5e93\uff0c\u76f8\u5173\u547d\u4ee4\u3001\u53c2\u6570\u7684\u53d8\u5316\u8bf7\u53c2\u8003",(0,l.jsx)(t.a,{href:"https://github.com/Qihoo360/pika/wiki/pika3.1.0%E5%A4%9A%E5%BA%93%E7%89%88%E5%91%BD%E4%BB%A4%E3%80%81%E5%8F%82%E6%95%B0%E5%8F%98%E5%8C%96%E5%8F%82%E8%80%83",children:"Pika3.1.0\u591a\u5e93\u7248\u547d\u4ee4\u3001\u53c2\u6570\u53d8\u5316\u53c2\u8003\u6587\u6863"})]}),"\n"]}),"\n",(0,l.jsxs)(t.li,{children:["\n",(0,l.jsx)(t.p,{children:"\u6570\u636e\u5c55\u793a\uff1apika\u5bf9\u4e8ekeyspace\u7684\u5c55\u793a\u9009\u62e9\u4e86\u5206\u7c7b\u578b\u5c55\u793a\u800c\u975eredis\u7684\u5206\u5e93\u5c55\u793a\uff08\u56e0\u4e3apika\u6ca1\u6709\u5206\u5e93\u6982\u5ff5\uff09\uff0cpika\u5bf9\u4e8ekeyspace\u7684\u7edf\u8ba1\u662f\u88ab\u52a8\u7684\uff0c\u9700\u8981\u624b\u52a8\u89e6\u53d1\u5e76\u4e0d\u4f1a\u7acb\u5373\u8f93\u51fa\uff0c\u547d\u4ee4\u4e3a\uff1ainfo keyspace [ 0|1 ]\uff0c\u9ed8\u8ba4\u4e3a0\u4e0d\u89e6\u53d1\uff0cpika\u7684keyspace\u7edf\u8ba1\u662f\u7cbe\u786e\u7684\u3002"}),"\n"]}),"\n"]})]})}function j(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,l.jsx)(t,{...e,children:(0,l.jsx)(h,{...e})}):h(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>x});var l=n(6540);const s={},i=l.createContext(s);function r(e){const t=l.useContext(i);return l.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function x(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),l.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/107669ab.f44b5cb6.js b/build/assets/js/107669ab.f44b5cb6.js new file mode 100644 index 0000000..f092390 --- /dev/null +++ b/build/assets/js/107669ab.f44b5cb6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[2001],{1201:(t,n,e)=>{e.r(n),e.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>r,metadata:()=>d,toc:()=>a});var s=e(4848),o=e(8453);const r={title:"Pika \u4e0e Codis",sidebar_position:11},i=void 0,d={id:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4e0e Codis/index",title:"Pika \u4e0e Codis",description:"\u80cc\u666f",source:"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4e0e Codis/index.md",sourceDirName:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4e0e Codis",slug:"/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4e0e Codis/",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4e0e Codis/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4e0e Codis/index.md",tags:[],version:"current",sidebarPosition:11,frontMatter:{title:"Pika \u4e0e Codis",sidebar_position:11},sidebar:"tutorialSidebar",previous:{title:"\u526f\u672c\u4e00\u81f4\u6027",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u526f\u672c\u4e00\u81f4\u6027/"},next:{title:"\u5feb\u7167\u5f0f\u5907\u4efd",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u5feb\u7167\u5f0f\u5907\u4efd/"}},c={},a=[{value:"\u80cc\u666f",id:"\u80cc\u666f",level:5},{value:"codis\u7684\u539f\u7406\u8bbe\u8ba1",id:"codis\u7684\u539f\u7406\u8bbe\u8ba1",level:5},{value:"codis\u7684\u8fd0\u884c\u539f\u7406",id:"codis\u7684\u8fd0\u884c\u539f\u7406",level:6},{value:"codis\u7684\u6269\u7f29\u5bb9\u539f\u7406",id:"codis\u7684\u6269\u7f29\u5bb9\u539f\u7406",level:6},{value:"codis-fe\u5c06\u72b6\u6001\u53d1\u5f80codis-dashboard",id:"codis-fe\u5c06\u72b6\u6001\u53d1\u5f80codis-dashboard",level:6},{value:"codis-dashboard\u63a5\u53d7\u72b6\u6001\u5e76\u5f00\u59cb\u542f\u52a8\u8fc1\u79fb",id:"codis-dashboard\u63a5\u53d7\u72b6\u6001\u5e76\u5f00\u59cb\u542f\u52a8\u8fc1\u79fb",level:6},{value:"codis-dashboard\u5b8c\u6210",id:"codis-dashboard\u5b8c\u6210",level:6},{value:"pika\u7b80\u4ecb",id:"pika\u7b80\u4ecb",level:5},{value:"pika\u63a5\u5165codis\u7684\u6311\u6218",id:"pika\u63a5\u5165codis\u7684\u6311\u6218",level:5},{value:"pika\u5b98\u65b9\u652f\u6301\u7684codis-server\u7684\u547d\u4ee4",id:"pika\u5b98\u65b9\u652f\u6301\u7684codis-server\u7684\u547d\u4ee4",level:6},{value:"pika\u8fc1\u79fb\u5de5\u5177\u7684\u8bbe\u8ba1",id:"pika\u8fc1\u79fb\u5de5\u5177\u7684\u8bbe\u8ba1",level:6},{value:"\u603b\u7ed3",id:"\u603b\u7ed3",level:5}];function l(t){const n={a:"a",code:"code",h5:"h5",h6:"h6",img:"img",p:"p",pre:"pre",strong:"strong",...(0,o.R)(),...t.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h5,{id:"\u80cc\u666f",children:"\u80cc\u666f"}),"\n",(0,s.jsx)(n.p,{children:"\u9762\u5bf9kv\u7c7b\u578b\u6570\u636e\u5728\u516c\u53f8\u7684\u5b58\u50a8\u91cf\u8d8a\u6765\u8d8a\u5927\uff0c\u4ee5\u53ca\u5728\u6027\u80fd\u54cd\u5e94\u4e0d\u654f\u611f\u7684\u60c5\u51b5\u4e0b\uff0c\u5229\u7528\u539f\u751f\u7684codis\u65b9\u6848\u6765\u5b58\u50a8\u6570\u636e\u7684\u65b9\u6848\uff0c\u6210\u672c\u4e5f\u8d8a\u6765\u8d8a\u9ad8\uff0c\u5728\u8fd9\u79cd\u573a\u666f\u4e0b\uff0c\u6025\u9700\u4e00\u79cd\u66ff\u4ee3\u65b9\u6848\u80fd\u591f\u6709\u6548\u517c\u987e\u6210\u672c\u4e0e\u6027\u80fd\u3002\u6545\u5f15\u5165\u4e86pika\u6765\u4f5c\u4e3acodis\u7684\u5e95\u5c42\u5b58\u50a8\uff0c\u6765\u66ff\u6362\u6210\u672c\u8f83\u9ad8\u7684codis-server\uff0c\u5e76\u56f4\u7ed5pika\u7684\u65b9\u6848\u8fdb\u884c\u4e86\u4e00\u7cfb\u5217\u7684\u8bbe\u8ba1\u6539\u9020\u3002"}),"\n",(0,s.jsx)(n.h5,{id:"codis\u7684\u539f\u7406\u8bbe\u8ba1",children:"codis\u7684\u539f\u7406\u8bbe\u8ba1"}),"\n",(0,s.jsxs)(n.p,{children:["codis\u9879\u76ee\u4e3b\u8981\u5206\u4e3acodis-fe\u3001codis-",(0,s.jsx)(n.a,{href:"https://so.csdn.net/so/search?q=dashboard&spm=1001.2101.3001.7020",children:"dashboard"}),"\u3001codis-proxy\u548ccodis-server\u8fd9\u56db\u4e2a\u7ec4\u4ef6\u3002"]}),"\n",(0,s.jsx)(n.p,{children:"codis-fe\u4e3b\u8981\u662f\u65b9\u4fbf\u7edf\u4e00\u7ba1\u7406\u591a\u5957\u7684codis-dasbhoard\uff0c\u5e76\u63d0\u4f9b\u8fd0\u7ef4\u53cb\u597d\u7684\u7ba1\u7406\u754c\u9762\uff0c\u5728\u8fd0\u7ef4\u6027\u4e0e\u7ba1\u7406\u6027\u4e0a\u9762\u90fd\u6bd4\u8f83\u53cb\u597d\u3002"}),"\n",(0,s.jsxs)(n.p,{children:["codis-dashboard\u4e3b\u8981\u5c31\u662f\u5b8c\u6210\u6709\u5173slot\u3001codis-proxy\u548czk\uff08\u6216\u8005",(0,s.jsx)(n.a,{href:"https://so.csdn.net/so/search?q=etcd&spm=1001.2101.3001.7020",children:"etcd"}),"\uff09\u7b49\u7ec4\u4ef6\u7684\u6570\u636e\u4e00\u81f4\u6027\uff0c\u6574\u4e2a\u96c6\u7fa4\u7684\u8fd0\u7ef4\u7684\u72b6\u6001\uff0c\u6570\u636e\u7684\u6269\u5bb9\u7f29\u5bb9\u548c\u7ec4\u4ef6\u9ad8\u53ef\u7528\u7684\u7ba1\u7406\uff0c\u7c7b\u4f3c\u4e8ek8s\u7684api-server\u7684\u529f\u80fd\u3002"]}),"\n",(0,s.jsx)(n.p,{children:"codis-proxy\u4e3b\u8981\u5c31\u662f\u63d0\u4f9b\u7ed9\u4e1a\u52a1\u5c42\u9762\u4f7f\u7528\u7684\u8bbf\u95ee\u4ee3\u7406\uff0c\u89e3\u6790\u8bf7\u6c42\u8def\u7531\u5e76\u5c06key\u7684\u8def\u7531\u4fe1\u606f\u8def\u7531\u5230\u5bf9\u5e94\u7684\u540e\u7aefgroup\u4e0a\u9762\uff0c\u800c\u4e14\u8fd8\u6709\u4e00\u4e2a\u5f88\u91cd\u8981\u7684\u529f\u80fd\u5c31\u662f\u5f53\u901a\u8fc7codis-fe\u6765\u8fdb\u884c\u96c6\u7fa4\u7684\u6269\u7f29\u5bb9\u7684\u65f6\u5019\uff0ccodis-proxy\u4f1a\u6839\u636egroup\u7684\u8fc1\u79fb\u72b6\u6001\uff0c\u6765\u89e6\u53d1key\u7684\u68c0\u67e5\u6216\u8005\u8fc1\u79fb\u7684\u529f\u80fd\u4ece\u800c\u5b8c\u6210\u5728\u4e0d\u4e2d\u65ad\u4e1a\u52a1\u670d\u52a1\u7684\u60c5\u51b5\u4e0b\u70ed\u8fc1\u79fb\u6570\u636e\uff0c\u4ece\u800c\u4fdd\u8bc1\u4e1a\u52a1\u7684\u53ef\u7528\u6027\u3002"}),"\n",(0,s.jsx)(n.h6,{id:"codis\u7684\u8fd0\u884c\u539f\u7406",children:"codis\u7684\u8fd0\u884c\u539f\u7406"}),"\n",(0,s.jsx)(n.p,{children:"codis\u5728\u8fd0\u884c\u7684\u8fc7\u7a0b\u4e2d\u4e0e\u5b98\u7f51\u7ed9\u5b9a\u7684\u539f\u7406\u56fe\u662f\u4e00\u81f4\u7684\u3002"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:"https://img-blog.csdnimg.cn/0962ab74918247058d4deacad22c46e0.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5bGL5a2Q5aSn5L6g,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center",alt:"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0"})}),"\n",(0,s.jsx)(n.p,{children:"\u901a\u8fc7zk\u7684\u8def\u5f84\u66b4\u9732\uff0c\u6765\u8fdb\u884ccodis-proxy\u7684\u8d1f\u8f7d\u5747\u8861\u548c\u670d\u52a1\u53d1\u73b0\uff0c\u53ef\u4f7f\u7528\u5b98\u65b9\u63d0\u4f9b\u7684jodis\u6216\u8005\u81ea\u5df1\u5b9e\u73b0\u7684redis-client\u6765\u8fdb\u884c\u5c01\u88c5\u3002"}),"\n",(0,s.jsx)(n.p,{children:"codis-dashboard\u901a\u8fc7\u63a5\u53d7codis-fe\u7684\u6269\u7f29\u5bb9\u3001\u4e0a\u4e0b\u7ebf\uff0c\u96c6\u7fa4\u4e3b\u4ece\u72b6\u6001\u7b49\u7ba1\u7406\u6307\u4ee4\u3002\u5728\u63a5\u53d7\u5230\u6307\u4ee4\u4e4b\u540e\uff0c\u901a\u8fc7\u5c06\u72b6\u6001\u7684\u5b58\u50a8\u5e76\u5c06\u72b6\u6001\u63a8\u9001\u5230codis-proxy\uff0c\u4ece\u800c\u4f7f\u5728codis-fe\u4e0a\u7ebf\u7684\u7ba1\u7406\u80fd\u591f\u52a8\u6001\u7684\u5728codis-proxy\u7684\u6570\u636e\u80fd\u591f\u52a8\u6001\u8def\u7531\uff0c\u6240\u6709\u7684\u96c6\u7fa4\u72b6\u6001\u7684\u7ba1\u7406\u90fd\u4f1a\u901a\u8fc7codis-dashboard\u6765\u4fdd\u6301\u4e00\u81f4\u3002"}),"\n",(0,s.jsx)(n.h6,{id:"codis\u7684\u6269\u7f29\u5bb9\u539f\u7406",children:"codis\u7684\u6269\u7f29\u5bb9\u539f\u7406"}),"\n",(0,s.jsx)(n.p,{children:"\u901a\u8fc7\u5bf9codis\u6574\u4e2a\u7684\u8fd0\u884c\u56fe\u7684\u7b80\u5355\u7684\u6982\u8ff0\uff0c\u6211\u4eec\u6765\u8fdb\u4e00\u6b65\u63a2\u8ba8\u4e00\u4e0b\u6709\u5173codis\u662f\u5982\u4f55\u8fdb\u884c\u4e00\u4e2a\u52a8\u6001\u7684\u6269\u7f29\u5bb9\u7684\u3002"}),"\n",(0,s.jsx)(n.p,{children:"\u4ee5\u6269\u5c55group\u4e3a\u4f8b\uff0c\u6574\u4e2a\u7684\u96c6\u7fa4\u6d41\u7a0b\u5982\u4e0b\u3002"}),"\n",(0,s.jsx)(n.p,{children:"\u539f\u59cb\u96c6\u7fa4\u5982\u4e0b\uff0c\u6b64\u65f6\u9700\u8981\u5c06group4\u52a0\u5165\u96c6\u7fa4\uff0c\u5e76\u5c06group3\u7684901-1023\u7684slot\u8fc1\u79fb\u5230group4\u3002"}),"\n",(0,s.jsxs)(n.p,{children:["\u200b ",(0,s.jsx)(n.img,{src:"https://img-blog.csdnimg.cn/b6b38324c03745fbb06bb160870bd3c5.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5bGL5a2Q5aSn5L6g,size_14,color_FFFFFF,t_70,g_se,x_16#pic_center",alt:"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0"})]}),"\n",(0,s.jsx)(n.p,{children:"\u8fc1\u79fb\u5b8c\u6210\u4e4b\u540e\u7684\u72b6\u6001\u5982\u4e0b\u3002"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:"https://img-blog.csdnimg.cn/cc4cb340e53541e4b4485852cd1f6427.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5bGL5a2Q5aSn5L6g,size_18,color_FFFFFF,t_70,g_se,x_16#pic_center",alt:"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0"})}),"\n",(0,s.jsx)(n.p,{children:"\u6b64\u65f6group4\u5c31\u65b0\u52a0\u5165\u5230codis\u96c6\u7fa4\u4e2d\uff0c\u5e76\u8fd0\u884c\u7684\u6570\u636eslot\u4e3a\u539fgroup3\u7684901-1023\u7684slot\u3002"}),"\n",(0,s.jsx)(n.p,{children:"\u8be6\u7ec6\u7684\u8fc1\u79fb\u6b65\u9aa4\u53ef\u4ee5\u5206\u4e3a\u5982\u4e0b\u51e0\u6b65\u3002"}),"\n",(0,s.jsx)(n.h6,{id:"codis-fe\u5c06\u72b6\u6001\u53d1\u5f80codis-dashboard",children:"codis-fe\u5c06\u72b6\u6001\u53d1\u5f80codis-dashboard"}),"\n",(0,s.jsx)(n.p,{children:"\u5728codis-fe\u4e0a\u9762\uff0c\u5728Migrate Range\u4e0a\u9762\u5c06slot\u586b\u5199\u4e3a901-1023\uff0c\u8fc1\u79fb\u81f3group4\u3002"}),"\n",(0,s.jsx)(n.p,{children:"\u6b64\u65f6codis-fe\u5c31\u4f1a\u5f80codis-dashboard\u53d1\u9001\u4e00\u4e2a\u5305\u542b/api/topom/slots/action/create-range/\u2026/901/1023/1\u7684uri\uff0c\u6b64\u65f6codis-dashboard\u5c31\u4f1a\u6267\u884c\u5982\u4e0b\u7684\u64cd\u4f5c\u3002"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-go",children:'func (s *Topom) SlotCreateActionSome(groupFrom, groupTo int, numSlots int) error {\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\tctx, err := s.newContext()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tg, err := ctx.getGroup(groupTo)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif len(g.Servers) == 0 {\n\t\treturn errors.Errorf("group-[%d] is empty", g.Id)\n\t}\n\n\tvar pending []int\n\tfor _, m := range ctx.slots { // \u9a8c\u8bc1slot\u7684\u72b6\u6001\n\t\tif len(pending) >= numSlots {\n\t\t\tbreak\n\t\t}\n\t\tif m.Action.State != models.ActionNothing {\n\t\t\tcontinue\n\t\t}\n\t\tif m.GroupId != groupFrom {\n\t\t\tcontinue\n\t\t}\n\t\tif m.GroupId == g.Id {\n\t\t\tcontinue\n\t\t}\n\t\tpending = append(pending, m.Id)\n\t}\n\n\tfor _, sid := range pending {\n\t\tm, err := ctx.getSlotMapping(sid)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tdefer s.dirtySlotsCache(m.Id) // \u5c06\u8be5slot\u6807\u8bb0\u4e3a\u9700\u8981\u91cd\u65b0\u5199\u5165zk\u6216\u8005etcd\u6765\u7ef4\u6301\u72b6\u6001\n\n\t\tm.Action.State = models.ActionPending\n\t\tm.Action.Index = ctx.maxSlotActionIndex() + 1\n\t\tm.Action.TargetId = g.Id\n\t\tif err := s.storeUpdateSlotMapping(m); err != nil { // \u66f4\u65b0\u8be5slot\u7684\u72b6\u6001\uff0c\u8be5\u7ed3\u6784\u7ef4\u62a4\u4e86group\u5230slot\u7684\u5bf9\u5e94\u7684\u5173\u7cfb\uff0c\u7528\u4e8e\u5728codis-proxy\u4e2d\u5c31\u884c\u6bcf\u4e2aslot\u7684\u8def\u7531\u4ee3\u7406\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"\u4ece\u6d41\u7a0b\u53ef\u77e5\uff0c\u521b\u5efa\u8fc1\u79fb\u8fc7\u7a0b\u4e4b\u540e\uff0c\u5176\u5b9e\u5c31\u662f\u5c06\u8fc1\u79fb\u7684\u4fe1\u606f\u5199\u5165zk\u6216\u8005etcd\u4e2d\u6765\u4fdd\u5b58\u8fc1\u79fb\u7684\u72b6\u6001\uff0c\u5e76\u4e14\u901a\u8fc7codis-dashboard\u81ea\u5df1\u542f\u52a8\u7684\u72b6\u6001\u673a\u6765\u8fdb\u884c\u6bcf\u4e00\u6b65\u7684\u72b6\u6001\u8fc1\u79fb\u3002"}),"\n",(0,s.jsx)(n.h6,{id:"codis-dashboard\u63a5\u53d7\u72b6\u6001\u5e76\u5f00\u59cb\u542f\u52a8\u8fc1\u79fb",children:"codis-dashboard\u63a5\u53d7\u72b6\u6001\u5e76\u5f00\u59cb\u542f\u52a8\u8fc1\u79fb"}),"\n",(0,s.jsx)(n.p,{children:"\u5728codis-fe\u6210\u529f\u5199\u5165\u8fc1\u79fb\u4fe1\u606f\u5230zk\u6216\u8005etcd\u4e4b\u540e\uff0c\u6b64\u65f6\u5c31\u901a\u8fc7codis-dashboard\u81ea\u8eab\u76d1\u63a7\u670d\u52a1\u8fc1\u79fb\u7684\u72b6\u6001\u6765\u542f\u52a8\u6570\u636e\u8fc1\u79fb\u3002"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-go",children:'//\u5904\u7406slot\u64cd\u4f5c\n\tgo func() {\n\t\tfor !s.IsClosed() {\n\t\t\tif s.IsOnline() {\n\t\t\t\tif err := s.ProcessSlotAction(); err != nil {\n\t\t\t\t\tlog.WarnErrorf(err, "process slot action failed")\n\t\t\t\t\ttime.Sleep(time.Second * 5)\n\t\t\t\t}\n\t\t\t}\n\t\t\ttime.Sleep(time.Second)\n\t\t}\n\t}()\n'})}),"\n",(0,s.jsx)(n.p,{children:"\u8be5\u534f\u7a0b\u5c31\u4f1a\u4e00\u76f4\u5237\u65b0\u67e5\u770b\u662f\u5426\u6709\u8fc1\u79fb\u7684\u72b6\u6001\uff0c\u5982\u679c\u6709\u8fc1\u79fb\u7684\u72b6\u6001\u5c31\u4f1a\u8fdb\u884c\u5904\u7406\u3002\u6709\u5173\u5bf9\u8be5\u72b6\u6001\u5904\u7406\u7684\u6838\u5fc3\u51fd\u6570\u5982\u4e0b\u3002"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-go",children:'func (s *Topom) SlotActionPrepareFilter(accept, update func(m *models.SlotMapping) bool) (int, bool, error) {\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\n\t// \u4e0a\u4e0b\u6587\n\tctx, err := s.newContext()\n\tif err != nil {\n\t\treturn 0, false, err\n\t}\n\n\t// \u53d6\u6700\u5c0f\u7684action index\n\tvar minActionIndex = func(filter func(m *models.SlotMapping) bool) (picked *models.SlotMapping) {\n\t\tfor _, m := range ctx.slots {\n\t\t\t// \u904d\u5386\u6240\u6709\u7684slotMapping, \u5982\u679c m.Action.State == "", \u8df3\u51fa\u672c\u6b21\u5faa\u73af, \u6267\u884c\u4e0b\u6b21\u5faa\u73af\n\t\t\tif m.Action.State == models.ActionNothing {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// \u5c06slotMapping\u4f20\u5165filter\u51fd\u6570\u4e2d, \u5982\u679cm.Action.State != models.ActionPending, \u624d\u6267\u884cif\u91cc\u9762\u7684\u8bed\u53e5\n\t\t\tif filter(m) {\n\t\t\t\tif picked != nil && picked.Action.Index < m.Action.Index {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\t//\u53ea\u6709\u4e00\u4e2aslot\u6ca1\u6709\u6267\u884c\u8fc7update\u65b9\u6cd5,accept\u624d\u4f1a\u8fd4\u56detrue;\u4e5f\u5c31\u662f\u8bf4,\u4e00\u4e2aslot\u53ea\u4f1a\u88ab\u5904\u7406\u4e00\u6b21\n\t\t\t\t// marks\u91cc\u9762\u4fdd\u5b58\u7684\u662f:\u5df2\u7ecf\u5206\u914d\u4e86group,\u6216\u8005\u5373\u5c06\u5206\u914dgroup,\u8fd92\u79cdgroup id\n\t\t\t\t// \u5982\u679cm\u7684\u5373\u5c06\u5206\u914dgroup id\u5728marks\u91cc\u9762, accept(m)\u5c31\u8fd4\u56defalse, \u8fd9\u6837\u5c31\u4fdd\u8bc1\u4e86\u540c\u65f6\u53ea\u6709\u4e00\u4e2aslot\u8fc1\u5165\u5230\u540c\u4e00\u4e2agroup\u4e0b, \u5728\u4e00\u4e2aredis\u4e0b\u9762,\u540c\u65f6\u53ea\u6709\u4e00\u4e2aslot\u88ab\u8fc1\u79fb\u51fa\u53bb\n\t\t\t\tif accept == nil || accept(m) {\n\t\t\t\t\tpicked = m\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn picked\n\t}\n\n\t// \u7b2c\u4e00\u79cd\u60c5\u51b5\u662f: \u53d6\u6b63\u5728\u505aslot\u8fc1\u79fb\u7684slot\u91cc\u9762action.id\u6700\u5c0f\u7684\u90a3\u4e2aslot\n\t// \u7b2c\u4e8c\u4e2d\u60c5\u51b5\u662f: \u4e0a\u9762\u7684\u6ca1\u6709\u53d6\u5230\u7684\u524d\u63d0\u4e0b,\u624d\u505a\u7b2c\u4e8c\u79cd\u64cd\u4f5c,\u53d6\u51fapending\u72b6\u6001\u7684slot\u91cc\u9762action.id\u6700\u5c0f\u7684\u90a3\u4e2aslot\n\tvar m = func() *models.SlotMapping {\n\t\t// \u53d6\u51fa m.Action.State != "" and m.Action.State != pending \u7684slot\u91cc\u9762action.id\u6700\u5c0f\u7684\u90a3\u4e2aslot\n\t\t// \u5373: \u53d6\u51fa\u6b63\u5728\u505aslot\u8fc1\u79fb\u7684slot\u91cc\u9762action.id\u6700\u5c0f\u7684\u90a3\u4e2aslot\n\t\t// \u8d4b\u503c\u7ed9picked\n\t\t// \u7136\u540e\u8fd4\u56de\n\t\tvar picked = minActionIndex(func(m *models.SlotMapping) bool {\n\t\t\treturn m.Action.State != models.ActionPending\n\t\t})\n\t\tif picked != nil {\n\t\t\treturn picked\n\t\t}\n\n\t\t// \u5982\u679c\u4e0a\u9762\u6ca1\u6709\u53d6\u5230,\u6267\u884c\u4e0b\u9762\u7684\u8bed\u53e5\n\n\t\tif s.action.disabled.IsTrue() {\n\t\t\treturn nil\n\t\t}\n\n\t\t// \u53d6\u51fa m.Action.State != "" and m.Action.State == models.ActionPending\u7684slot\u91cc\u9762action.id\u6700\u5c0f\u7684\u90a3\u4e2aslot\n\t\t// \u5373: \u53d6\u51fapending\u72b6\u6001\u7684slot\u91cc\u9762action.id\u6700\u5c0f\u7684\u90a3\u4e2aslot\n\t\t// \u8d4b\u503c\u7ed9picked\n\t\t// \u7136\u540e\u8fd4\u56de\n\t\treturn minActionIndex(func(m *models.SlotMapping) bool {\n\t\t\treturn m.Action.State == models.ActionPending\n\t\t})\n\t}()\n\n\t// \u4e0a\u97622\u79cd\u60c5\u51b5\u90fd\u6ca1\u6709\u53d6\u5230\u503c\u7684\u8bdd,\u8bf4\u660e\u4e0d\u9700\u8981\u505aslot\u8fc1\u79fb, \u56e0\u4e3a\u6ca1\u6709\u53d6\u5230\u6b63\u5728\u505aslot\u8fc1\u79fb\u7684\u6700\u5c0f\u7684action.id, \u4e5f\u6ca1\u6709\u53d6\u5230\u51c6\u5907\u505aslot\u8fc1\u79fb\u7684\u6700\u5c0f\u7684action.id\n\tif m == nil {\n\t\treturn 0, false, nil\n\t}\n\n\n\tif update != nil && !update(m) {\n\t\treturn 0, false, nil\n\t}\n\n\tlog.Warnf("slot-[%d] action prepare:\\n%s", m.Id, m.Encode())\n\n\n\t//\u53d8\u66f4\u6bcf\u4e2aSlotMapping\u7684action.state,\u5e76\u4e0ezk\u4ea4\u4e92\n\t//\u53e6\u5916,Action.state\u7b26\u5408preparing\u6216\u8005prepared\u7684\u65f6\u5019,\u8981\u5c06SlotMapping\u540c\u6b65\u5230proxy\n\tswitch m.Action.State {\n\n\tcase models.ActionPending:\n\n\t\tdefer s.dirtySlotsCache(m.Id)\n\n\t\t// \u5c06action state\u72b6\u6001\u6539\u6210 preparing\n\t\tm.Action.State = models.ActionPreparing\n\n\t\t// \u5199\u5165zk\u4e2d\n\t\tif err := s.storeUpdateSlotMapping(m); err != nil {\n\t\t\treturn 0, false, err\n\t\t}\n\n\t\t// \u65e0\u6761\u4ef6\u7ee7\u7eed\u6267\u884c\u4e0b\u9762case\u4e2d\u8bed\u53e5\n\t\tfallthrough\n\n\tcase models.ActionPreparing:\n\n\t\tdefer s.dirtySlotsCache(m.Id)\n\n\t\tlog.Warnf("slot-[%d] resync to prepared", m.Id)\n\n\t\t// \u5c06action state\u72b6\u6001\u6539\u6210 ActionPrepared\n\t\tm.Action.State = models.ActionPrepared\n\n\t\t// \u5c06slotMapping\u4fe1\u606f\u5237\u65b0\u5230proxy\u4e2d, \u5982\u679c\u5237\u5931\u8d25\u4e86, \u5c06m.Action.State\u6539\u56deActionPreparing, \u8fd4\u56de\n\t\tif err := s.resyncSlotMappings(ctx, m); err != nil {\n\t\t\tlog.Warnf("slot-[%d] resync-rollback to preparing", m.Id)\n\n\t\t\t// slotMapping\u4fe1\u606f\u5237\u65b0\u5230proxy\u5931\u8d25, m.Action.State\u6539\u56deActionPreparing\n\t\t\tm.Action.State = models.ActionPreparing\n\t\t\ts.resyncSlotMappings(ctx, m)\n\t\t\tlog.Warnf("slot-[%d] resync-rollback to preparing, done", m.Id)\n\t\t\treturn 0, false, err\n\t\t}\n\n\t\t// \u5237\u65b0proxy\u4fe1\u606f\u6210\u529f\u540e, \u5c06m.Action.State = models.ActionPrepared\u5199\u5165\u5230zk\u4e2d\n\t\tif err := s.storeUpdateSlotMapping(m); err != nil {\n\t\t\treturn 0, false, err\n\t\t}\n\n\t\t// \u65e0\u6761\u4ef6\u7ee7\u7eed\u6267\u884c\u4e0b\u9762case\u4e2d\u8bed\u53e5\n\t\tfallthrough\n\n\tcase models.ActionPrepared:\n\n\t\tdefer s.dirtySlotsCache(m.Id)\n\n\t\tlog.Warnf("slot-[%d] resync to migrating", m.Id)\n\n\t\t// \u5c06action state\u72b6\u6001\u6539\u6210 ActionMigrating\n\t\tm.Action.State = models.ActionMigrating\n\n\t\t// \u5c06slotMapping\u4fe1\u606f\u5237\u65b0\u5230proxy\u4e2d, \u5982\u679c\u5237\u5931\u8d25\u4e86, \u8fd4\u56de\n\t\tif err := s.resyncSlotMappings(ctx, m); err != nil {\n\t\t\tlog.Warnf("slot-[%d] resync to migrating failed", m.Id)\n\t\t\treturn 0, false, err\n\t\t}\n\n\t\t// \u5237\u6210\u529f\u540e, \u5c06m.Action.State = models.ActionMigrating \u5199\u5165zk\n\t\tif err := s.storeUpdateSlotMapping(m); err != nil {\n\t\t\treturn 0, false, err\n\t\t}\n\n\t\t// \u65e0\u6761\u4ef6\u7ee7\u7eed\u6267\u884c\u4e0b\u9762case\u4e2d\u8bed\u53e5\n\t\tfallthrough\n\n\tcase models.ActionMigrating:\n\n\t\treturn m.Id, true, nil\n\n\tcase models.ActionFinished:\n\n\t\treturn m.Id, true, nil\n\n\tdefault:\n\n\t\treturn 0, false, errors.Errorf("slot-[%d] action state is invalid", m.Id)\n\n\t}\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"\u5728ActionPreparing\u7684\u72b6\u6001\u7684\u65f6\u5019\uff0c\u5c31\u4f1a\u5c06\u6570\u636e\u5199\u5165zk\u6216\u8005etcd\u4ece\u800c\u901a\u77e5\u5230\u4e86codis-proxy\u72b6\u6001\u66f4\u65b0\u3002"}),"\n",(0,s.jsx)(n.p,{children:"\u5728codis-dashboard\u4e2d\u5c31\u4f1a\u901a\u8fc7processSlotAction\u51fd\u6570\u6765\u8fdb\u884c\u540e\u7aef\u6570\u636e\u7684\u8fc1\u79fb\uff0c\u5176\u4e2d\u6700\u6838\u5fc3\u7684\u51fd\u6570\u4e3anewSlotActionExecutor\u3002"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-go",children:'// \u8c03\u7528redis\u7684SLOTSMGRTTAGSLOT\u547d\u4ee4, \u8fdb\u884credis slot \u8fc1\u79fb\nfunc (s *Topom) newSlotActionExecutor(sid int) (func(db int) (remains int, nextdb int, err error), error) {\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\n\t// \u4e0a\u4e0b\u6587\n\tctx, err := s.newContext()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t//\u6839\u636eslot\u7684id\u83b7\u53d6SlotMapping,\u4e3b\u8981\u65b9\u6cd5\u5c31\u662freturn ctx.slots[sid], nil\n\tm, err := ctx.getSlotMapping(sid)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tswitch m.Action.State {\n\n\t//\u6700\u521dslot\u8fd8\u5904\u5728\u8fc1\u79fb\u8fc7\u7a0b\u4e2d,\u5373migrating\n\tcase models.ActionMigrating:\n\n\t\tif s.action.disabled.IsTrue() {\n\t\t\treturn nil, nil\n\t\t}\n\t\t// m.groupId \u4e3b\u4ece\u5728\u5207\u6362\u65f6, \u4e0d\u505aslot\u8fc1\u79fb\u64cd\u4f5c\n\t\tif ctx.isGroupPromoting(m.GroupId) {\n\t\t\treturn nil, nil\n\t\t}\n\t\t// m.action.targetId \u4e3b\u4ece\u5728\u5207\u6362\u65f6, \u4e0d\u505aslot\u8fc1\u79fb\u64cd\u4f5c\n\t\tif ctx.isGroupPromoting(m.Action.TargetId) {\n\t\t\treturn nil, nil\n\t\t}\n\n\t\t//\u8fc1\u79fb\u8fc7\u7a0b\u4e2d,\u4e00\u4e2aslot\u672c\u8eab\u6240\u5728\u7684group\u4ee5\u53ca\u76ee\u6807group\u7684Promoting.State\u90fd\u5fc5\u987b\u4e3a\u7a7a\u624d\u53ef\u4ee5\u505a\u8fc1\u79fb\n\t\tfrom := ctx.getGroupMaster(m.GroupId)\n\t\t//\u53d6\u51fagroup 2\u7684\u7b2c\u4e00\u4e2aserver,\u4e5f\u662fmaster\n\t\tdest := ctx.getGroupMaster(m.Action.TargetId)\n\n\t\t//Topom\u7684action\u4e2d\u7684\u8ba1\u6570\u5668\u52a0\u4e00\n\t\ts.action.executor.Incr()\n\n\t\treturn func(db int) (int, int, error) {\n\t\t\t//\u6bcf\u6267\u884c\u4e00\u4e2a\u69fd\u7684\u8fc1\u79fb\u64cd\u4f5c,Topom\u7684action\u4e2d\u7684\u8ba1\u6570\u5668\u5c31\u51cf1\n\t\t\tdefer s.action.executor.Decr()\n\n\t\t\tif from == "" {\n\t\t\t\treturn 0, -1, nil\n\t\t\t}\n\n\t\t\t//\u4ececache\u4e2d\u5f97\u5230group 1\u7684redisClient,\u8fd9\u4e2aclient\u7531addr, auth, timeout\uff0cDatabase\uff0credigo.Conn\u7ec4\u6210: \u5982\u679ccache\u6ca1\u6709, \u5c31\u65b0\u5efa\n\t\t\tc, err := s.action.redisp.GetClient(from)\n\t\t\tif err != nil {\n\t\t\t\treturn 0, -1, err\n\t\t\t}\n\t\t\t//\u5c06\u521a\u624d\u65b0\u5efa\u7684\u6216\u8005\u4ececache\u4e2d\u53d6\u51fa\u7684redis client\u518dput\u5230Topom.action.redisp\u4e2d\n\t\t\tdefer s.action.redisp.PutClient(c)\n\n\t\t\t//\u8fd9\u91ccdb\u662f0,\u76f8\u5f53\u4e8eredis\u4ece16\u4e2a\u5e93\u4e2d\u9009\u62e90\u53f7\n\t\t\tif err := c.Select(db); err != nil {\n\t\t\t\treturn 0, -1, err\n\t\t\t}\n\n\t\t\tvar do func() (int, error)\n\n\t\t\tmethod, _ := models.ParseForwardMethod(s.config.MigrationMethod)\n\t\t\tswitch method {\n\t\t\tcase models.ForwardSync:\n\t\t\t\tdo = func() (int, error) {\n\t\t\t\t\t//\u8c03\u7528redis\u7684SLOTSMGRTTAGSLOT\u547d\u4ee4,\u968f\u673a\u9009\u62e9\u5f53\u524dslot\u7684\u4e00\u4e2akey,\u5e76\u5c06\u4e0e\u8fd9\u4e2akey\u7684tag\u76f8\u540c\u7684k-v\u5168\u90e8\u8fc1\u79fb\u5230\u76ee\u6807\u673a\n\t\t\t\t\treturn c.MigrateSlot(sid, dest)\n\t\t\t\t}\n\t\t\tcase models.ForwardSemiAsync:\n\t\t\t\tvar option = &redis.MigrateSlotAsyncOption{\n\t\t\t\t\tMaxBulks: s.config.MigrationAsyncMaxBulks,\n\t\t\t\t\tMaxBytes: s.config.MigrationAsyncMaxBytes.AsInt(),\n\t\t\t\t\tNumKeys: s.config.MigrationAsyncNumKeys,\n\t\t\t\t\tTimeout: math2.MinDuration(time.Second*5,\n\t\t\t\t\t\ts.config.MigrationTimeout.Duration()),\n\t\t\t\t}\n\t\t\t\t//\u8c03\u7528redis\u7684SLOTSMGRTTAGSLOT-ASYNC\u547d\u4ee4,\u53c2\u6570\u662ftarget redis\u7684ip\u548cport\n\t\t\t\tdo = func() (int, error) {\n\t\t\t\t\treturn c.MigrateSlotAsync(sid, dest, option)\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tlog.Panicf("unknown forward method %d", int(method))\n\t\t\t}\n\n\t\t\tn, err := do()\n\t\t\tif err != nil {\n\t\t\t\treturn 0, -1, err\n\t\t\t} else if n != 0 {\n\t\t\t\treturn n, db, nil\n\t\t\t}\n\n\t\t\tnextdb := -1\n\t\t\t//\u901a\u8fc7info\u547d\u4ee4\u67e5keyspace\u4fe1\u606f\u5e76\u505a\u5904\u7406,\u8fd9\u91cc\u53d6\u51fa\u7684m\u4e3a\u7a7a\n\t\t\tm, err := c.InfoKeySpace()\n\t\t\tif err != nil {\n\t\t\t\treturn 0, -1, err\n\t\t\t}\n\t\t\tfor i := range m {\n\t\t\t\tif (nextdb == -1 || i < nextdb) && db < i {\n\t\t\t\t\tnextdb = i\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn 0, nextdb, nil\n\n\t\t}, nil\n\n\tcase models.ActionFinished:\n\n\t\treturn func(int) (int, int, error) {\n\t\t\treturn 0, -1, nil\n\t\t}, nil\n\n\tdefault:\n\n\t\treturn nil, errors.Errorf("slot-[%d] action state is invalid", m.Id)\n\n\t}\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"\u901a\u8fc7\u8c03\u7528\u9700\u8981\u8fc1\u79fb\u6570\u636e\u7684codis-server\u6765\u4e3b\u52a8\u8fdb\u884c\u6570\u636e\u7684\u540c\u6b65\u4fe1\u606f\u3002"}),"\n",(0,s.jsx)(n.p,{children:"\u5982\u679c\u5728\u6570\u636e\u540c\u6b65\u4e2d\uff0c\u901a\u8fc7codis-proxy\u6765\u8bbf\u95ee\u6570\u636e\uff0ccodis-proxy\u5219\u6839\u636e\u914d\u7f6e\u6587\u4ef6\u8981\u4e48\u53bb\u67e5\u627e\u4e00\u4e0b\u65b0\u8282\u70b9\u6570\u636e\u662f\u5426\u5b58\u5728\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u5219\u5c06\u6570\u636e\u8fc1\u79fb\u81f3\u65b0\u8282\u70b9\u4e0a\u9762\u6765\u4ece\u800c\u4fdd\u6301\u6570\u636e\u7684\u4e00\u81f4\u6027\u3002"}),"\n",(0,s.jsx)(n.h6,{id:"codis-dashboard\u5b8c\u6210",children:"codis-dashboard\u5b8c\u6210"}),"\n",(0,s.jsx)(n.p,{children:"\u5f53\u6240\u6709\u7684slot\u8fc1\u79fb\u5b8c\u6210\u4e4b\u540e\uff0c\u5c31\u4f1a\u5728zk\u6216\u8005etcd\u4e2d\u66f4\u65b0\u5f53\u524d\u7684slot\u72b6\u6001\uff0c\u4ece\u800c\u5b8c\u6210\u6574\u4e2a\u8fc1\u79fb\u8fc7\u7a0b\u3002"}),"\n",(0,s.jsx)(n.p,{children:"\u6574\u4e2a\u8fc1\u79fb\u6d41\u7a0b\u53ef\u7b80\u5355\u5982\u4e0b\u6240\u793a\u3002"}),"\n",(0,s.jsx)(n.h5,{id:"pika\u7b80\u4ecb",children:"pika\u7b80\u4ecb"}),"\n",(0,s.jsx)(n.p,{children:"pika\u662f360\u56e2\u961f\u5f00\u6e90\u800c\u6765\u7684\u4e00\u4e2a\u517c\u5bb9redis\u534f\u8bae\u5e95\u5c42\u9009\u7528rocksdb\u7684\u4e00\u4e2akv\u5b58\u50a8\uff0c\u8be5\u9879\u76ee\u52a0\u5165\u4e86\u5f00\u653e\u539f\u5b50\u5f00\u6e90\u57fa\u91d1\u4f1a\uff0c\u5e76\u4e14\u5728\u4e3b\u6d41\u7248\u672c\u4e0a\u9762\u63d0\u4f9bcodis\u7684\u63a5\u5165\u80fd\u529b\u3002\u6545\u8003\u8651\u901a\u8fc7\u5f15\u5165pika\u6765\u66ff\u6362codis\u4e2d\u7684codis-server\u7ec4\u4ef6\u3002"}),"\n",(0,s.jsxs)(n.p,{children:["pika\u65e2\u652f\u6301\u5355\u8282\u70b9\u6a21\u5f0f\u4e5f\u652f\u6301\u5206\u5e03\u5f0f\u6a21\u5f0f\uff0c\u5373\u6bcf\u4e2aslot\u90fd\u53ef\u4ee5\u901a\u8fc7\u5355\u72ec\u7684\u7ba1\u7406\u8fc1\u79fb\u3002\u5728\u4e1a\u52a1\u5b9e\u8df5\u4e2d\u8003\u8651\u5230\u6570\u636e\u91cf\u76f8\u5bf9\u8f83\u5927\uff0c\u6545\u5728\u6700\u5f00\u59cb\u7684\u65f6\u5019\u5c31\u662f\u4f7f\u7528\u7684",(0,s.jsx)(n.strong,{children:"\u5206\u5e03\u5f0f\u6a21\u5f0f"}),"\uff0c\u5728\u540e\u7eed\u7684\u8bbe\u8ba1\u6539\u9020\u4e2d\u4e5f\u662f\u4f9d\u636e\u8be5\u6a21\u5f0f\u8fdb\u884c\u3002"]}),"\n",(0,s.jsx)(n.h5,{id:"pika\u63a5\u5165codis\u7684\u6311\u6218",children:"pika\u63a5\u5165codis\u7684\u6311\u6218"}),"\n",(0,s.jsx)(n.h6,{id:"pika\u5b98\u65b9\u652f\u6301\u7684codis-server\u7684\u547d\u4ee4",children:"pika\u5b98\u65b9\u652f\u6301\u7684codis-server\u7684\u547d\u4ee4"}),"\n",(0,s.jsx)(n.p,{children:"\u901a\u8fc7\u67e5\u9605pika\u7684\u6e90\u7801(3.4.0\u7248\u672c)\uff0c\u5728\u4f4d\u4e8epika_command.h\u5934\u6587\u4ef6\u4e2d\u627e\u5230\u5982\u4e0b\u3002"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-c++",children:'//Codis Slots\nconst std::string kCmdNameSlotsInfo = "slotsinfo";\nconst std::string kCmdNameSlotsHashKey = "slotshashkey";\nconst std::string kCmdNameSlotsMgrtTagSlotAsync = "slotsmgrttagslot-async";\nconst std::string kCmdNameSlotsMgrtSlotAsync = "slotsmgrtslot-async";\nconst std::string kCmdNameSlotsDel = "slotsdel";\nconst std::string kCmdNameSlotsScan = "slotsscan";\nconst std::string kCmdNameSlotsMgrtExecWrapper = "slotsmgrt-exec-wrapper";\nconst std::string kCmdNameSlotsMgrtAsyncStatus = "slotsmgrt-async-status";\nconst std::string kCmdNameSlotsMgrtAsyncCancel = "slotsmgrt-async-cancel";\nconst std::string kCmdNameSlotsMgrtSlot = "slotsmgrtslot";\nconst std::string kCmdNameSlotsMgrtTagSlot = "slotsmgrttagslot";\nconst std::string kCmdNameSlotsMgrtOne = "slotsmgrtone";\nconst std::string kCmdNameSlotsMgrtTagOne = "slotsmgrttagone";\n'})}),"\n",(0,s.jsx)(n.p,{children:"\u5bf9\u6bd4\u67e5\u770b\u4e00\u4e0bcodis-server\u652f\u6301\u7684\u547d\u4ee4\u5982\u4e0b\u3002"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-c",children:' {"slotsinfo",slotsinfoCommand,-1,"rF",0,NULL,0,0,0,0,0},\n {"slotsscan",slotsscanCommand,-3,"rR",0,NULL,0,0,0,0,0},\n {"slotsdel",slotsdelCommand,-2,"w",0,NULL,1,-1,1,0,0},\n {"slotsmgrtslot",slotsmgrtslotCommand,5,"w",0,NULL,0,0,0,0,0},\n {"slotsmgrttagslot",slotsmgrttagslotCommand,5,"w",0,NULL,0,0,0,0,0},\n {"slotsmgrtone",slotsmgrtoneCommand,5,"w",0,NULL,0,0,0,0,0},\n {"slotsmgrttagone",slotsmgrttagoneCommand,5,"w",0,NULL,0,0,0,0,0},\n {"slotshashkey",slotshashkeyCommand,-1,"rF",0,NULL,0,0,0,0,0},\n {"slotscheck",slotscheckCommand,0,"r",0,NULL,0,0,0,0,0},\n {"slotsrestore",slotsrestoreCommand,-4,"wm",0,NULL,0,0,0,0,0},\n {"slotsmgrtslot-async",slotsmgrtSlotAsyncCommand,8,"ws",0,NULL,0,0,0,0,0},\n {"slotsmgrttagslot-async",slotsmgrtTagSlotAsyncCommand,8,"ws",0,NULL,0,0,0,0,0},\n {"slotsmgrtone-async",slotsmgrtOneAsyncCommand,-7,"ws",0,NULL,0,0,0,0,0},\n {"slotsmgrttagone-async",slotsmgrtTagOneAsyncCommand,-7,"ws",0,NULL,0,0,0,0,0},\n {"slotsmgrtone-async-dump",slotsmgrtOneAsyncDumpCommand,-4,"rm",0,NULL,0,0,0,0,0},\n {"slotsmgrttagone-async-dump",slotsmgrtTagOneAsyncDumpCommand,-4,"rm",0,NULL,0,0,0,0,0},\n {"slotsmgrt-async-fence",slotsmgrtAsyncFenceCommand,0,"rs",0,NULL,0,0,0,0,0},\n {"slotsmgrt-async-cancel",slotsmgrtAsyncCancelCommand,0,"F",0,NULL,0,0,0,0,0},\n {"slotsmgrt-async-status",slotsmgrtAsyncStatusCommand,0,"F",0,NULL,0,0,0,0,0},\n {"slotsmgrt-exec-wrapper",slotsmgrtExecWrapperCommand,-3,"wm",0,NULL,0,0,0,0,0},\n {"slotsrestore-async",slotsrestoreAsyncCommand,-2,"wm",0,NULL,0,0,0,0,0},\n {"slotsrestore-async-auth",slotsrestoreAsyncAuthCommand,2,"sltF",0,NULL,0,0,0,0,0},\n {"slotsrestore-async-select",slotsrestoreAsyncSelectCommand,2,"lF",0,NULL,0,0,0,0,0},\n {"slotsrestore-async-ack",slotsrestoreAsyncAckCommand,3,"w",0,NULL,0,0,0,0,0},\n'})}),"\n",(0,s.jsx)(n.p,{children:"\u5bf9\u6bd4\u800c\u8a00\u53d1\u73b0pika\u5b9e\u73b0\u7684\u547d\u4ee4\u76f8\u5bf9\u8f83\u5c11\uff0c\u90a3\u5177\u4f53\u63a5\u5165codis\u4e2d\u80fd\u5426\u6b63\u5e38\u4f7f\u7528\u8fd8\u6709\u5f85\u89c2\u5bdf\uff0c\u5e76\u4e14\u5728codis-server\u548cpika\u652f\u6301\u7684\u8bed\u6cd5\u4e0a\u9762\u6765\u8bb2\u5f53\u524d\u5c31\u5df2\u7ecf\u6709\u6240\u4e0d\u540c\u3002"}),"\n",(0,s.jsx)(n.p,{children:"\u5728pika\u7684\u96c6\u7fa4\u6a21\u5f0f\u4e0b\u9762\u9700\u8981\u8f93\u5165\u5982\u4e0b\u6307\u4ee4\u3002"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",children:"redis-cli -p 9221 pkcluster slot info 1\n"})}),"\n",(0,s.jsx)(n.p,{children:"\u8fd9\u4e5f\u610f\u5473\u7740\uff0c\u5728\u547d\u4ee4\u8c03\u5ea6\u4e0e\u7ba1\u7406\u5c42\u4e5f\u5fc5\u987b\u52a0\u4e0a\u5bf9\u4e8epika\u7684\u8bed\u6cd5\u683c\u5f0f\u7684\u652f\u6301\u3002"}),"\n",(0,s.jsx)(n.p,{children:"\u5728\u524d\u671f\u7684\u8c03\u7814\u9636\u6bb5\u5f97\u76ca\u4e8e\u7814\u53d1\u540c\u5b66\u7684\u5927\u529b\u652f\u6301\uff0c\u5728codis-dashboard\u5c42\u4e2d\uff0c\u901a\u8fc7\u4fee\u6539\u90e8\u5206\u6e90\u7801\u903b\u8f91\u6765\u652f\u6301\u6709\u5173pika\u7684\u4e3b\u4ece\u540c\u6b65\u3001\u4e3b\u4ece\u63d0\u5347\u7b49\u547d\u4ee4\uff0c\u4ece\u800c\u5b8c\u6210\u4e86\u5728codis-fe\u5c42\u9762\u7684\u64cd\u4f5c\u3002"}),"\n",(0,s.jsx)(n.p,{children:"\u5728\u5b8c\u6210\u4e86\u5982\u4e0a\u7684\u64cd\u4f5c\u4e4b\u540e\uff0c\u7ee7\u7eed\u8fdb\u884c\u6570\u636e\u8fc1\u79fb\u7684\u65f6\u5019\uff0c\u53d1\u73b0\u5728codis-fe\u754c\u9762\u4e0a\u9762\u90fd\u663e\u793a\u8fc1\u79fb\u5b8c\u6210\uff0c\u4f46\u662f\u6570\u636e\u5374\u5e76\u6ca1\u6709\u8fc1\u79fb\uff0c\u5bfc\u81f4\u65b0\u8fc1\u79fb\u7684\u6570\u636e\u5176\u5b9e\u5e76\u6ca1\u6709\u8fc1\u79fb\u5bf9\u5bf9\u5e94\u7684\u96c6\u7fa4\u4e0a\u9762\u53bb\u3002\u5177\u4f53\u4e3a\u4ec0\u4e48\u4f1a\u51fa\u73b0\u5982\u4e0b\u7684\u95ee\u9898\u5462\uff1f\u5728codis-fe\u754c\u9762\u4e0a\u9762\u4e5f\u6ca1\u6709\u660e\u663e\u7684\u62a5\u9519\u4fe1\u606f\uff0c\u95ee\u9898\u51fa\u5728\u4e86\u54ea\u91cc\u5462\uff1f"}),"\n",(0,s.jsx)(n.p,{children:"\u6b64\u65f6\u7ee7\u7eed\u67e5\u770b\u4e00\u4e0bpika\u7684\u6709\u5173slot\u7684\u6e90\u7801\u3002"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-c++",children:"void SlotsMgrtSlotAsyncCmd::Do(std::shared_ptr partition) {\n int64_t moved = 0;\n int64_t remained = 0;\n res_.AppendArrayLen(2);\n res_.AppendInteger(moved);\n res_.AppendInteger(remained);\n}\n"})}),"\n",(0,s.jsx)(n.p,{children:"\u4ece\u6e90\u7801\u67e5\u770b\u53d1\u73b0\uff0c\u6211\u4eec\u65e5\u5e38\u8fd0\u884c\u7684\u60c5\u51b5\u4e0b\uff0c\u901a\u8fc7codis-dashboard\u53d1\u9001\u7ed9pika\u7684\u6307\u4ee4\u76f4\u63a5\u5c31\u662f\u6210\u529f\u8fd4\u56de\uff0c\u4ece\u800c\u4f7fcodis-dashboard\u5728\u8fc1\u79fb\u7684\u65f6\u5019\u5c31\u7acb\u9a6c\u5c31\u6536\u5230\u4e86\u6210\u529f\u7684\u4fe1\u53f7\uff0c\u4ece\u800c\u76f4\u63a5\u5c31\u4fee\u6539\u4e86\u8fc1\u79fb\u7684\u72b6\u6001\u5230\u6210\u529f\uff0c\u4f46\u662f\u5176\u5b9e\u6570\u636e\u8fc1\u79fb\u5e76\u6ca1\u6709\u6267\u884c\u3002"}),"\n",(0,s.jsxs)(n.p,{children:["\u9488\u5bf9\u8fd9\u79cd\u60c5\u51b5\uff0c\u6211\u4eec\u67e5\u9605\u4e86\u6709\u5173pika\u7684\u5b98\u65b9\u6587\u6863 ",(0,s.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/wiki/Support-Cluster-Slots",children:"Pika\u914d\u5408Codis\u6269\u5bb9\u6848\u4f8b"}),"\u3002"]}),"\n",(0,s.jsx)(n.p,{children:"\u4ece\u5b98\u65b9\u7684\u6587\u6863\u6765\u770b\uff0c\u8fd9\u79cd\u8fc1\u79fb\u7684\u65b9\u6848\u662f\u4e00\u79cd\u6709\u635f\u53ef\u80fd\u4f1a\u4e22\u6570\u636e\u7684\u65b9\u6848\uff0c\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\u9700\u8981\u4f9d\u9760\u81ea\u5df1\u6765\u8c03\u6574\u8fc1\u79fb\u7684\u65b9\u6848\u3002"}),"\n",(0,s.jsx)(n.h6,{id:"pika\u8fc1\u79fb\u5de5\u5177\u7684\u8bbe\u8ba1",children:"pika\u8fc1\u79fb\u5de5\u5177\u7684\u8bbe\u8ba1"}),"\n",(0,s.jsx)(n.p,{children:"\u8fc1\u79fb\u5de5\u5177\u7684\u6574\u4f53\u6d41\u7a0b\u5982\u4e0b\uff1a"}),"\n",(0,s.jsx)(n.p,{children:"\u539f\u59cb\u96c6\u7fa4\u4fe1\u606f\u5982\u4e0b"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:"https://img-blog.csdnimg.cn/8243b2f2bf824af38c98510dc300fed1.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5bGL5a2Q5aSn5L6g,size_18,color_FFFFFF,t_70,g_se,x_16#pic_center",alt:"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0"})}),"\n",(0,s.jsx)(n.p,{children:"\u6b64\u65f6\u9700\u8981\u8fc1\u79fb901-1023\u4e2aslot\u4fe1\u606f\u8fc1\u79fb\u5230\u65b0\u7ec4\u4ef6\u4e0a\u9762\u5373group4\u4f5c\u4e3a\u65b0\u5b9e\u4f8b\u63d0\u4f9b\u670d\u52a1\u3002"}),"\n",(0,s.jsx)(n.p,{children:"\u9996\u5148\u5f00\u53d1\u4e00\u4e2apika\u7684\u8fc1\u79fb\u5de5\u5177\uff0c\u8be5\u5de5\u5177\u53ef\u4ee5\u8f6c\u53d1\u4ee3\u7406codis\u7684\u8bf7\u6c42\u3002\u5148\u5c06801-1023\u7684\u4fe1\u606f\u8fc1\u79fb\u5230pika\u7684\u8fc1\u79fb\u5de5\u5177\u3002"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:"https://img-blog.csdnimg.cn/1799bb9c7f534c598762b1e6b4ff3454.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5bGL5a2Q5aSn5L6g,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center",alt:"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0"})}),"\n",(0,s.jsx)(n.p,{children:"\u6b64\u65f6pika\u8fc1\u79fb\u5de5\u5177\u5c31\u5c06801-900\u7684\u5199\u4fe1\u606f\u5199\u5165group3\uff0c\u5c06901-1023\u7684\u5199\u4fe1\u606f\u5199\u5165group4\uff0c\u7136\u540e\u5982\u679c\u67e5\u6570\u636e\u5148\u67e5group4\uff0c\u5982\u679c\u6ca1\u6709\u5219\u67e5group3\u3002"}),"\n",(0,s.jsx)(n.p,{children:"\u6b64\u65f6pika\u8fc1\u79fb\u5de5\u5177\u63a5\u5165\u5b8c\u6210\u4e4b\u540e\uff0c\u8f6c\u53d1\u4ee3\u7406\u5230\u540e\u7aef\u670d\u52a1\u3002\u63a5\u5165\u5b8c\u6210\u4e4b\u540e\u518d\u8fdb\u884c\u4e3b\u4ece\u540c\u6b65\u4fe1\u606f\uff0c\u5c06group3\u540c\u6b65\u5230group4\u3002"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:"https://img-blog.csdnimg.cn/5537e313a8be46518c6799801f207a39.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5bGL5a2Q5aSn5L6g,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center",alt:"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0"})}),"\n",(0,s.jsx)(n.p,{children:"\u5c06slot901-1023\u7684\u6570\u636e\u4ecegroup3\u8fc1\u79fb\u5230group4\u4e0a\u9762\u4e4b\u540e\uff0c\u56e0\u4e3a\u6ca1\u6709\u65b0\u7684group3\u7684901-1023\u7684\u6570\u636e\u5199\u5165\uff0c\u6545\u53ef\u4ee5\u653e\u5fc3\u7684\u7b49\u5f85\u6570\u636e\u8fc1\u79fb\u5b8c\u6210\u3002"}),"\n",(0,s.jsx)(n.p,{children:"\u8fc1\u79fb\u5b8c\u6210\u4e4b\u540e\u5c31\u65ad\u5f00\u4e3b\u4ece\uff0c\u518d\u5c06pika\u7684\u8fc1\u79fb\u5de5\u5177\u7684slot\u4fe1\u606f\uff0c\u5373801-900\u8fc1\u79fb\u56degroup3\uff0c\u5c06901-1023\u8fc1\u79fb\u56degroup4\uff0c\u6b64\u65f6\u6570\u636e\u8fc1\u79fb\u5b8c\u6210\u3002"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:"https://img-blog.csdnimg.cn/781f01558ba64a278e6314cc7cb0315f.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5bGL5a2Q5aSn5L6g,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center",alt:"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0"})}),"\n",(0,s.jsx)(n.p,{children:"\u81f3\u6b64\uff0cpika\u901a\u8fc7\u8fc1\u79fb\u5de5\u5177\u5b8c\u6210\u5bf9\u96c6\u7fa4\u7684\u6269\u5bb9\uff0c\u8be5\u5de5\u5177\u5927\u90e8\u5206\u5de5\u5177\u8ddfcodis-proxy\u7684\u5927\u90e8\u5206\u529f\u80fd\u76f8\u4f3c\uff0c\u53ea\u4e0d\u8fc7\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u8def\u7531\u89c4\u5219\u8fdb\u884c\u8f6c\u6362\u5e76\u6dfb\u52a0\u4e0a\u5bf9\u4e8epika\u7684\u8bed\u6cd5\u6307\u4ee4\u5c31\u53ef\u4ee5\u4e86\u3002"}),"\n",(0,s.jsx)(n.h5,{id:"\u603b\u7ed3",children:"\u603b\u7ed3"}),"\n",(0,s.jsx)(n.p,{children:"\u672c\u6587\u4ec5\u4ec5\u662f\u9488\u5bf9pika\u5728codis\u573a\u666f\u4e0b\u7684\u4e00\u4e9b\u601d\u8003\u548c\u63a2\u7d22\u3002\u7531\u4e8e\u672c\u4eba\u624d\u758f\u5b66\u6d45\uff0c\u5982\u6709\u9519\u8bef\u8bf7\u6279\u8bc4\u6307\u6b63\u3002"})]})}function p(t={}){const{wrapper:n}={...(0,o.R)(),...t.components};return n?(0,s.jsx)(n,{...t,children:(0,s.jsx)(l,{...t})}):l(t)}},8453:(t,n,e)=>{e.d(n,{R:()=>i,x:()=>d});var s=e(6540);const o={},r=s.createContext(o);function i(t){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof t?t(n):{...n,...t}}),[n,t])}function d(t){let n;return n=t.disableParentContext?"function"==typeof t.components?t.components(o):t.components||o:i(t.components),s.createElement(r.Provider,{value:n},t.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/1174a4a6.952832c1.js b/build/assets/js/1174a4a6.952832c1.js new file mode 100644 index 0000000..be14d28 --- /dev/null +++ b/build/assets/js/1174a4a6.952832c1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[3934],{2941:(n,s,e)=>{e.r(s),e.d(s,{assets:()=>l,contentTitle:()=>c,default:()=>o,frontMatter:()=>d,metadata:()=>t,toc:()=>h});var i=e(4848),r=e(8453);const d={title:"\u559c\u9a6c\u62c9\u96c5 Redis \u4e0e Pika \u7f13\u5b58\u4f7f\u7528\u519b\u89c4",sidebar_position:0},c="1. \u7f13\u5b58\u9009\u578b",t={id:"\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/\u559c\u9a6c\u62c9\u96c5 Redis \u4e0e Pika \u7f13\u5b58\u4f7f\u7528\u519b\u89c4/index",title:"\u559c\u9a6c\u62c9\u96c5 Redis \u4e0e Pika \u7f13\u5b58\u4f7f\u7528\u519b\u89c4",description:"\u5ba3\u8a00\uff1a\u7f13\u5b58\u4e0d\u662f\u4e07\u91d1\u6cb9\uff0c\u66f4\u4e0d\u662f\u5783\u573e\u6876\uff01\uff01\uff01",source:"@site/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/\u559c\u9a6c\u62c9\u96c5 Redis \u4e0e Pika \u7f13\u5b58\u4f7f\u7528\u519b\u89c4/index.md",sourceDirName:"\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/\u559c\u9a6c\u62c9\u96c5 Redis \u4e0e Pika \u7f13\u5b58\u4f7f\u7528\u519b\u89c4",slug:"/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/\u559c\u9a6c\u62c9\u96c5 Redis \u4e0e Pika \u7f13\u5b58\u4f7f\u7528\u519b\u89c4/",permalink:"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/\u559c\u9a6c\u62c9\u96c5 Redis \u4e0e Pika \u7f13\u5b58\u4f7f\u7528\u519b\u89c4/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/\u559c\u9a6c\u62c9\u96c5 Redis \u4e0e Pika \u7f13\u5b58\u4f7f\u7528\u519b\u89c4/index.md",tags:[],version:"current",sidebarPosition:0,frontMatter:{title:"\u559c\u9a6c\u62c9\u96c5 Redis \u4e0e Pika \u7f13\u5b58\u4f7f\u7528\u519b\u89c4",sidebar_position:0},sidebar:"tutorialSidebar",previous:{title:"Pika \u4f18\u5316\u6848\u4f8b",permalink:"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/"},next:{title:"\u8c03\u6574 max-write-buffer-size \u4f18\u5316 pika \u6027\u80fd10\u500d\u7684\u6848\u4f8b",permalink:"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/\u8c03\u6574 max-write-buffer-size \u4f18\u5316 pika \u6027\u80fd10\u500d\u7684\u6848\u4f8b/"}},l={},h=[{value:"1.1 \u7f13\u5b58\u7c7b\u578b\u4ecb\u7ecd",id:"11-\u7f13\u5b58\u7c7b\u578b\u4ecb\u7ecd",level:2},{value:"1.2\xa0\u7f13\u5b58\u4f7f\u7528\u6a21\u5f0f\u4ecb\u7ecd",id:"12\u7f13\u5b58\u4f7f\u7528\u6a21\u5f0f\u4ecb\u7ecd",level:2},{value:"2.1\xa0\u7f13\u5b58\u7c7b\u578b\u4f7f\u7528\u89c4\u8303",id:"21\u7f13\u5b58\u7c7b\u578b\u4f7f\u7528\u89c4\u8303",level:2},{value:"2.2\xa0\u952e\u503c\u8bbe\u8ba1\u89c4\u8303",id:"22\u952e\u503c\u8bbe\u8ba1\u89c4\u8303",level:2},{value:"2.3\xa0\u547d\u4ee4\u4f7f\u7528\u89c4\u8303",id:"23\u547d\u4ee4\u4f7f\u7528\u89c4\u8303",level:2},{value:"2.4\xa0\u4e1a\u52a1\u7f13\u5b58\u67b6\u6784\u89c4\u8303",id:"24\u4e1a\u52a1\u7f13\u5b58\u67b6\u6784\u89c4\u8303",level:2}];function x(n){const s={h1:"h1",h2:"h2",img:"img",p:"p",strong:"strong",...(0,r.R)(),...n.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"\u5ba3\u8a00\uff1a\u7f13\u5b58\u4e0d\u662f\u4e07\u91d1\u6cb9\uff0c\u66f4\u4e0d\u662f\u5783\u573e\u6876\uff01\uff01\uff01"})}),"\n",(0,i.jsx)(s.p,{children:"\u7f13\u5b58\u4f5c\u4e3a\u559c\u9a6c\u62c9\u96c5\u81f3\u5173\u91cd\u8981\u7684\u57fa\u7840\u7ec4\u4ef6\u4e4b\u4e00\uff0c\u6bcf\u5929\u627f\u8f7d\u7740\u5de8\u5927\u7684\u4e1a\u52a1\u8bf7\u6c42\u91cf\u3002\u4e00\u65e6\u7f13\u5b58\u51fa\u73b0\u6545\u969c\uff0c\u5bf9\u4e1a\u52a1\u7684\u5f71\u54cd\u5c06\u975e\u5e38\u4e25\u91cd\u3002\u56e0\u6b64\uff0c\u786e\u4fdd\u7f13\u5b58\u670d\u52a1\u7684\u7a33\u5b9a\u548c\u9ad8\u6548\u8fd0\u884c\u59cb\u7ec8\u662f\u6211\u4eec\u7684\u91cd\u8981\u76ee\u6807\u3002"}),"\n",(0,i.jsx)(s.p,{children:"\u4e0b\u9762\u662f\u6211\u4eec\u5bf9\u559c\u9a6c\u7f13\u5b58\u5386\u53f2\u6545\u969c\u590d\u76d8\u540e\u603b\u7ed3\u7684\u4e00\u5957\u7f13\u5b58\u4f7f\u7528\u89c4\u8303\uff0c\u5728\u6b64\u5206\u4eab\u7ed9\u5927\u5bb6\uff0c\u5e0c\u671b\u5c0f\u4f19\u4f34\u4eec\u80fd\u5728\u7f13\u5b58\u9009\u578b\u548c\u4f7f\u7528\u7684\u8fc7\u7a0b\u4e2d\u5c11\u8e29\u5751\u3002"}),"\n",(0,i.jsx)(s.h1,{id:"1-\u7f13\u5b58\u9009\u578b",children:(0,i.jsx)(s.strong,{children:"1. \u7f13\u5b58\u9009\u578b"})}),"\n",(0,i.jsx)(s.h2,{id:"11-\u7f13\u5b58\u7c7b\u578b\u4ecb\u7ecd",children:(0,i.jsx)(s.strong,{children:"1.1 \u7f13\u5b58\u7c7b\u578b\u4ecb\u7ecd"})}),"\n",(0,i.jsx)(s.p,{children:"\u559c\u9a6c\u7ebf\u4e0a\u7f13\u5b58\u7c7b\u578b\u4e3b\u8981\u6709 4 \u79cd\uff1a"}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"1. redis \u4e3b\u4ece\u6a21\u5f0f"}),"\uff1a\u5b98\u65b9\u539f\u7248"]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"2.codis-redis"}),"\uff1a\u8c4c\u8c46\u835a\u5f00\u6e90\uff0credis \u96c6\u7fa4\u89e3\u51b3\u65b9\u6848"]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"3. \u4e91\u6570\u636e\u5e93 redis"}),"\uff1aredis-cluster \u5bb9\u5668\u5316\u90e8\u7f72"]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"4.xcache"}),"\uff1a\u57fa\u4e8e codis\u3001pika\u3001redis \u81ea\u7814\u7684\u4e00\u5957\u6d77\u91cf KV \u5b58\u50a8\u89e3\u51b3\u65b9\u6848"]}),"\n",(0,i.jsx)(s.h2,{id:"12\u7f13\u5b58\u4f7f\u7528\u6a21\u5f0f\u4ecb\u7ecd",children:(0,i.jsx)(s.strong,{children:"1.2\xa0\u7f13\u5b58\u4f7f\u7528\u6a21\u5f0f\u4ecb\u7ecd"})}),"\n",(0,i.jsx)(s.p,{children:"\u4f7f\u7528\u6a21\u5f0f\u4e3b\u8981\u5206\u4e3a 2 \u79cd\uff1a"}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"1.cache \u6a21\u5f0f"}),"\uff1a\u6570\u636e\u4e0d\u9700\u8981\u6301\u4e45\u5316\uff0c\u5b9e\u4f8b\u6062\u590d\u4e0d\u9700\u8981\u52a0\u8f7d\u6570\u636e\uff0c\u6269\u7f29\u5bb9\u4e0d\u9700\u8981\u8fc1\u79fb\u6570\u636e"]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"2.store \u6a21\u5f0f"}),"\uff1a\u6570\u636e\u9700\u8981\u6301\u4e45\u5316\uff0c\u5b9e\u4f8b\u6062\u590d\u9700\u8981\u52a0\u8f7d\u6570\u636e\uff0c\u6269\u7f29\u5bb9\u9700\u8981\u8fc1\u79fb\u6570\u636e"]}),"\n",(0,i.jsx)(s.p,{children:"\u4e0b\u9762\u662f\u5bf9\u5404\u79cd\u7c7b\u578b\u7f13\u5b58\u505a\u4e86\u7b80\u5355\u5bf9\u6bd4\uff1a"}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.img,{src:"https://oscimg.oschina.net/oscnet/up-8c9da0c248d174821a4cfa811b2c9422528.png",alt:""})}),"\n",(0,i.jsx)(s.h1,{id:"2-\u7f13\u5b58\u4f7f\u7528\u519b\u89c4",children:(0,i.jsx)(s.strong,{children:"2. \u7f13\u5b58\u4f7f\u7528\u519b\u89c4"})}),"\n",(0,i.jsx)(s.h2,{id:"21\u7f13\u5b58\u7c7b\u578b\u4f7f\u7528\u89c4\u8303",children:(0,i.jsx)(s.strong,{children:"2.1\xa0\u7f13\u5b58\u7c7b\u578b\u4f7f\u7528\u89c4\u8303"})}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"1\uff09redis \u96c6\u7fa4\u6a21\u5f0f\u9996\u9009\u4e91\u6570\u636e\u5e93 redis\uff0c\u6d77\u91cf KV \u5b58\u50a8\u9996\u9009 xcache"})}),"\n",(0,i.jsx)(s.p,{children:"\u4e91\u6570\u636e\u5e93 redis \u91c7\u7528\u5b98\u65b9 redis cluster \u6a21\u5f0f\uff0c\u5bb9\u5668\u5316\u90e8\u7f72\uff0c\u652f\u6301\u6545\u969c\u81ea\u52a8\u6062\u590d\u548c\u5f39\u6027\u4f38\u7f29\uff0c\u662f\u5f53\u524d redis \u96c6\u7fa4\u7684\u4e3b\u63a8\u65b9\u6848\uff0c\u4f46\u4e0d\u652f\u6301\u6570\u636e\u6301\u4e45\u5316\uff0c\u5982\u679c\u5fc5\u987b\u8981\u505a\u6570\u636e\u6301\u4e45\u5316\uff0c\u5e76\u4e14\u5bf9\u5ef6\u65f6\u8981\u6c42\u975e\u5e38\u9ad8\uff0c\u53ef\u4ee5\u4f7f\u7528 codis redis\u3002\u6570\u636e\u91cf\u975e\u5e38\u5927\uff0c\u5e76\u4e14\u5bf9\u5ef6\u65f6\u8981\u6c42\u4e0d\u662f\u7279\u522b\u9ad8\uff0c\u53ef\u4ee5\u9009\u62e9 xcache\u3002"}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsxs)(s.strong,{children:["2\uff09",(0,i.jsx)(s.strong,{children:(0,i.jsx)(s.strong,{children:"redis \u4e0d\u8981\u5f53 db \u4f7f\u7528"})}),"\uff0c\u5982\u679c\u6570\u636e\u4e00\u5b9a\u8981\u505a\u6301\u4e45\u5316\uff0c\u53ef\u4ee5\u9009\u62e9 xcache"]})}),"\n",(0,i.jsx)(s.p,{children:"redis \u5f53 db \u4f7f\u7528\uff0c\u6545\u969c\u6062\u590d\u6570\u636e\u5f88\u6162\uff0c\u4e25\u91cd\u5f71\u54cd SLA\u3002\u5e76\u4e14\u5982\u679c\u4e3b\u4ece\u5168\u90e8\u6302\u6389\uff0cslave \u673a\u5668\u65e0\u6cd5\u6062\u590d\u65f6\uff0c\u6570\u636e\u5c31\u4f1a\u5b8c\u5168\u4e22\u5931\u3002xcache \u5929\u7136\u652f\u6301\u6570\u636e\u6301\u4e45\u5316"}),"\n",(0,i.jsxs)(s.p,{children:["**3\uff09**",(0,i.jsx)(s.strong,{children:"\u4e0d\u8981\u4f7f\u7528\u5ba2\u6237\u7aef\u5206\u7247\u6a21\u5f0f"})]}),"\n",(0,i.jsx)(s.p,{children:"\u5ba2\u6237\u7aef\u5206\u7247\u6a21\u5f0f\u4e0d\u5177\u5907\u9ad8\u53ef\u7528\u548c\u5f39\u6027\u4f38\u7f29\u80fd\u529b\uff0c\u5efa\u8bae\u4f7f\u7528\u771f\u6b63\u7684\u96c6\u7fa4\u6a21\u5f0f\uff0c\u5982 codis-redis\u3001\u4e91\u6570\u636e\u5e93 redis\u3001xcache"}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"4\uff09\u96c6\u7fa4\u6a21\u5f0f\u4e0d\u652f\u6301 lua\u3001redisson \u5ba2\u6237\u7aef\uff0c\u5982\u679c\u4e1a\u52a1\u5fc5\u987b\u4f7f\u7528\uff0c\u53ea\u80fd\u9009\u62e9 redis \u4e3b\u4ece\u6a21\u5f0f"})}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"5\uff09redis \u5355\u8282\u70b9\u5bb9\u91cf\u4e0d\u8981\u8d85\u8fc7 10GB\uff0cxcache \u5355\u8282\u70b9\u5bb9\u91cf\u4e0d\u8981\u8d85\u8fc7 200GB"})}),"\n",(0,i.jsx)(s.p,{children:"redis \u5355\u8282\u70b9\u5bb9\u91cf\u592a\u5927\u65f6\uff0c\u5b9e\u4f8b\u91cd\u542f\u4f1a\u6bd4\u8f83\u6162\uff0c\u5f71\u54cd\u6062\u590d\u65f6\u957f"}),"\n",(0,i.jsx)(s.h2,{id:"22\u952e\u503c\u8bbe\u8ba1\u89c4\u8303",children:(0,i.jsx)(s.strong,{children:"2.2\xa0\u952e\u503c\u8bbe\u8ba1\u89c4\u8303"})}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"1\uff09key \u5c3d\u91cf\u4fdd\u6301\u7b80\u6d01\u6027\u3001\u53ef\u8bfb\u6027\u3001\u53ef\u7ba1\u7406\u6027"})}),"\n",(0,i.jsxs)(s.p,{children:["\u5728\u4fdd\u8bc1\u8bed\u4e49\u7684\u524d\u63d0\u4e0b\uff0c\u63a7\u5236 key \u7684\u957f\u5ea6\uff1b\u4ee5\u4e1a\u52a1\u540d (\u6216\u6570\u636e\u5e93\u540d) \u4e3a\u524d\u7f00 (\u9632\u6b62 key \u51b2\u7a81)\uff0c\u7528\u5192\u53f7\u5206\u9694\uff0c\u6bd4\u5982\u4e1a\u52a1\u540d\uff1a\u8868\u540d",":id","\uff1b\u4e0d\u8981\u5305\u542b\u7279\u6b8a\u5b57\u7b26"]}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsxs)(s.strong,{children:["2\uff09",(0,i.jsx)(s.strong,{children:(0,i.jsx)(s.strong,{children:"\u62d2\u7edd bigkey"})}),"\uff0c\u9632\u6b62\u7f51\u5361\u6d41\u91cf\u8fc7\u9ad8\u3001\u6162\u67e5\u8be2"]})}),"\n",(0,i.jsx)(s.p,{children:"string \u7c7b\u578b\u63a7\u5236\u5728\xa010KB \u4ee5\u5185\uff0chash\u3001list\u3001set\u3001zset \u5143\u7d20\u4e2a\u6570\u4e0d\u8981\u8d85\u8fc7 5000"}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"3\uff09\u907f\u514d\u70ed\u70b9 key"})}),"\n",(0,i.jsx)(s.p,{children:"\u70ed key \u4f1a\u5bfc\u81f4\u6570\u636e\u503e\u659c\uff0c\u4ee5\u53ca\u5355\u8282\u70b9\u538b\u529b\u8fc7\u5927\u3002\u5efa\u8bae\u4e1a\u52a1\u4fa7\u5c06\u70ed key \u6253\u6563"}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"4\uff09\u63a7\u5236 key \u751f\u547d\u5468\u671f"})}),"\n",(0,i.jsx)(s.p,{children:"\u7f13\u5b58\u4e0d\u662f\u5783\u573e\u6876\uff0c\u6700\u597d\u5bf9 key \u90fd\u8bbe\u7f6e ttl\uff0c\u5e76\u4e14\u5c06 key \u7684 ttl \u6253\u6563\uff0c\u907f\u514d key \u96c6\u4e2d\u8fc7\u671f"}),"\n",(0,i.jsx)(s.h2,{id:"23\u547d\u4ee4\u4f7f\u7528\u89c4\u8303",children:(0,i.jsx)(s.strong,{children:"2.3\xa0\u547d\u4ee4\u4f7f\u7528\u89c4\u8303"})}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"1\uff09\u614e\u7528\u5168\u91cf\u64cd\u4f5c\u547d\u4ee4"})}),"\n",(0,i.jsx)(s.p,{children:"\u7981\u7528 `keys *` \u547d\u4ee4\uff0c\u5c3d\u91cf\u4e0d\u4f7f\u7528 hgetall\u3001smembers \u7b49\u547d\u4ee4\u3002\u5728\u83b7\u53d6 key \u4e0b\u7684\u591a\u4e2a\u5143\u7d20\u65f6\uff0c\u4f7f\u7528\u76f8\u5e94\u7684 scan \u547d\u4ee4\uff0c\u4e00\u6b21\u83b7\u53d6\u5c11\u91cf\u5143\u7d20\uff0c\u5206\u591a\u6b21\u83b7\u53d6\uff0c\u5efa\u8bae\u4e00\u6b21 scan \u4e0d\u8981\u8d85\u8fc7 200 \u4e2a"}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"2\uff09\u63a7\u5236 mset\u3001mget\u3001hmset\u3001hmget\u3001*scan\u3001*range \u7b49\u547d\u4ee4\u5355\u6b21\u64cd\u4f5c\u5143\u7d20\u6570\u91cf\uff0c\u5efa\u8bae****\u4e0d\u8981\u8d85\u8fc7 200"})}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"3\uff09\u63a7\u5236 pipeline \u4e2d\u547d\u4ee4\u7684\u6570\u91cf\uff0c\u5efa\u8bae****\u4e0d\u8981\u8d85\u8fc7 100"})}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"4\uff09redis \u5220\u9664 key \u65f6\uff0c\u4e0d\u8981\u7528 del \u547d\u4ee4\uff0c\u4f7f\u7528 unlink \u547d\u4ee4"})}),"\n",(0,i.jsx)(s.p,{children:"del \u4e00\u4e2a\u5927 key \u4f1a\u76f4\u63a5\u5bfc\u81f4 redis \u5361\u4f4f\u3002\u4f7f\u7528 unlink \u547d\u4ee4\u53ef\u4ee5\u5f02\u6b65\u5220\u9664 key\uff0c\u4e0d\u4f1a\u5bf9 redis \u4e3b\u7ebf\u7a0b\u4ea7\u751f\u5f71\u54cd\uff0c\u56e0\u6b64\u4e5f\u4e0d\u4f1a\u5f71\u54cd\u4e1a\u52a1\u6d41\u91cf"}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"5\uff09set \u548c expire \u547d\u4ee4\u5408\u5e76\u6210 setex \u547d\u4ee4\uff0c\u51cf\u5c11\u670d\u52a1\u7aef\u5199\u538b\u529b"})}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"6\uff09evalsha \u4ee3\u66ff eval"})}),"\n",(0,i.jsx)(s.p,{children:"redis-cluster \u96c6\u7fa4\u4e2d\u4f7f\u7528 evalsha \u4ee3\u66ff eval\uff0c\u51cf\u5c11\u7f51\u7edc IO\uff0c\u540c\u65f6\u4e5f\u51cf\u5c0f redis \u7f51\u7edc\xa0IO \u538b\u529b\u63d0\u9ad8\u6027\u80fd"}),"\n",(0,i.jsx)(s.h2,{id:"24\u4e1a\u52a1\u7f13\u5b58\u67b6\u6784\u89c4\u8303",children:(0,i.jsx)(s.strong,{children:"2.4\xa0\u4e1a\u52a1\u7f13\u5b58\u67b6\u6784\u89c4\u8303"})}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsxs)(s.strong,{children:["1\uff09",(0,i.jsx)(s.strong,{children:(0,i.jsx)(s.strong,{children:"redis \u4e0d\u8981\u4f7f\u7528\u903b\u8f91 db"})}),"\uff0c\u53ea\u4f7f\u7528\u9ed8\u8ba4 db\xa00"]})}),"\n",(0,i.jsx)(s.p,{children:"\u53ef\u4ee5\u901a\u8fc7\u5b9e\u4f8b\u9694\u79bb\uff0c\u4e0d\u540c\u4e1a\u52a1\u7684\u6570\u636e\u4fdd\u5b58\u5230\u4e0d\u540c\u7684\u5b9e\u4f8b\u4e2d\u3002\uff08\u53ea\u6709 redis \u4e3b\u4ece\u53ef\u4ee5\u9009\u62e9\u903b\u8f91 db\uff0c\u96c6\u7fa4\u6a21\u5f0f\u9ed8\u8ba4\u90fd\u4f7f\u7528 db0\uff09"}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"2\uff09\u907f\u514d\u591a\u4e1a\u52a1\u590d\u7528\u540c\u4e00\u7f13\u5b58\u8d44\u6e90"})}),"\n",(0,i.jsx)(s.p,{children:"\u4e0d\u540c\u4e1a\u52a1\u7684\u6570\u636e\u4f7f\u7528\u4e0d\u540c\u7684\u96c6\u7fa4\uff0cS \u7ea7\u5e94\u7528\u4e0d\u8981\u548c B \u7ea7\u5e94\u7528\u6df7\u7528\uff0c\u8fc7\u591a\u4e1a\u52a1\u590d\u7528\u540c\u4e00\u8d44\u6e90\u8981\u505a\u62c6\u5206\u3002\u4e1a\u52a1\u5c3d\u91cf\u63d0\u4f9b rpc \u63a5\u53e3\u7ed9\u5176\u5b83\u4e1a\u52a1\u8c03\u7528\uff0c\u800c\u4e0d\u662f\u76f4\u63a5\u8ba9\u5176\u5b83\u4e1a\u52a1\u8bbf\u95ee\u6570\u636e\u6e90\uff08\u5982\u4e00\u4e2a\u4e1a\u52a1\u5199\uff0c\u4e00\u4e2a\u4e1a\u52a1\u8bfb\uff09"}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"3\uff09xcache \u5c3d\u91cf\u4f7f\u7528 string \u7c7b\u578b"})}),"\n",(0,i.jsx)(s.p,{children:"xcache \u652f\u6301 string\uff0chash\uff0cehash\uff0clist\uff0cset\uff0czset \u516d\u79cd\u6570\u636e\u7c7b\u578b\uff0cehash \u6570\u636e\u7c7b\u578b\u662f\u5bf9 hash \u6570\u636e\u7c7b\u578b\u7684\u6269\u5c55\uff0c\u652f\u6301\u5bf9 field \u8bbe\u7f6e\u8fc7\u671f\u65f6\u95f4\u3002xcache \u4e2d string \u7c7b\u578b\u662f\u901f\u5ea6\u6700\u5feb\u7684\uff0c\u5176\u4ed6\u6570\u636e\u7c7b\u578b\u90fd\u662f\u7531 string \u8fdb\u884c\u7ec4\u5408\u53d8\u6362\u800c\u5b9e\u73b0\uff0c\u516d\u79cd\u6570\u636e\u7684\u6027\u80fd\u5982\u4e0b\uff1a"}),"\n",(0,i.jsx)(s.p,{children:"string\xa0>\xa0hash\xa0>\xa0set\xa0>\xa0ehash\xa0>\xa0list\xa0>\xa0zset"}),"\n",(0,i.jsx)(s.p,{children:"\u5efa\u8bae\uff1a\u5c3d\u91cf\u4f7f\u7528 string \u7c7b\u578b"}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"4\uff09\u51cf\u5c11 lua \u811a\u672c\u4f7f\u7528"})}),"\n",(0,i.jsx)(s.p,{children:"\u96c6\u7fa4\u6a21\u5f0f\u5bf9 lua \u652f\u6301\u6709\u9650\u5236\uff0c\u5fc5\u987b\u4fdd\u8bc1 lua \u4e2d\u64cd\u4f5c\u7684 key \u88ab sharding \u5230\u540c\u4e00\u4e2a\u8282\u70b9\u3002\u6240\u4ee5\u5c3d\u91cf\u51cf\u5c11\u5bf9 lua \u7684\u4f7f\u7528"}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"5\uff09lua \u811a\u672c\u4e2d\u4e0d\u8dd1\u590d\u6742\u903b\u8f91"})}),"\n",(0,i.jsx)(s.p,{children:"\u590d\u6742\u903b\u8f91\u653e\u5728\u4e1a\u52a1\u4ee3\u7801\u4e2d\uff0c\u800c\u4e0d\u662f lua \u811a\u672c\u4e2d"}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"6\uff09\u91c7\u7528\u9ad8\u6548\u5e8f\u5217\u5316\u65b9\u6cd5\u548c\u538b\u7f29\u65b9\u6cd5"})}),"\n",(0,i.jsx)(s.p,{children:"\u4e3a\u4e86\u8282\u7701\u5185\u5b58\uff0c\u5982\u679c value \u8f83\u5927\u65f6\uff0c\u53ef\u4ee5\u4f7f\u7528\u538b\u7f29\u5de5\u5177\uff08\u5982 snappy \u6216 gzip\uff09\uff0c\u628a\u6570\u636e\u538b\u7f29\u540e\u518d\u5199\u5165 redis"}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"7\uff09\u907f\u514d\u6279\u91cf\u4efb\u52a1\u3001\u5b9a\u65f6\u4efb\u52a1\u3001\u5468\u671f\u4efb\u52a1\u6d41\u91cf\u592a\u5927\u5f71\u54cd\u5728\u7ebf\u4e1a\u52a1"})}),"\n",(0,i.jsx)(s.p,{children:"\u6279\u91cf\u4efb\u52a1\u3001\u5b9a\u65f6\u4efb\u52a1\u3001\u5468\u671f\u4efb\u52a1\u4e1a\u52a1\u4e0a\u8981\u505a\u9650\u901f"}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"8\uff09\u4e1a\u52a1\u53d8\u66f4\uff0c\u5b58\u50a8\u6d41\u91cf\u6a21\u578b\u53d8\u5316\u8981\u5148\u8bc4\u4f30"})}),"\n",(0,i.jsx)(s.p,{children:"\u4e1a\u52a1\u6a21\u578b\u53d8\u5316\uff0cQPS\u3001\u5bb9\u91cf\u589e\u52a0\uff0cO (N) \u547d\u4ee4\u589e\u591a\u7b49\u90fd\u8981\u5148\u8bc4\u4f30\u5f53\u524d\u7f13\u5b58\u662f\u5426\u6297\u7684\u4f4f\uff0c\u505a\u5230\u7070\u5ea6\u4e0a\u7ebf\uff0c\u6301\u7eed\u89c2\u5bdf\uff08\u5c24\u5176\u662f\u6d41\u91cf\u9ad8\u5cf0\u671f\uff09"}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"9\uff09\u4e0d\u7528\u7684\u8d44\u6e90\u5c3d\u65e9\u7533\u8bf7\u56de\u6536"})}),"\n",(0,i.jsx)(s.p,{children:"\u4f11\u7720\u8d44\u6e90\u56de\u6536\u4e0d\u4ec5\u53ef\u4ee5\u964d\u4f4e\u4e1a\u52a1\u7684\u5b58\u50a8\u6210\u672c\uff0c\u8fd8\u53ef\u4ee5\u628a\u8d44\u6e90\u5206\u914d\u7ed9\u771f\u6b63\u9700\u8981\u7684\u4e1a\u52a1\uff0c\u53ef\u8c13\u662f\u53cc\u8d62"}),"\n",(0,i.jsxs)(s.p,{children:["\u8865\u5145\uff1aOpenAtom \u5f00\u6e90\u5927\u8d5b Pika \u8d5b\u9898\u653e\u51fa\uff0c\u5956\u91d1 50 \u4e07\uff0c\u8bf7\u626b\u63cf\u5982\u4e0b\u4e8c\u7ef4\u7801\u8fdb\u884c\xa0",(0,i.jsx)(s.strong,{children:"\u62a5\u540d"}),"\uff1a"]}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.img,{src:"https://oscimg.oschina.net/oscnet/up-880b21dc1810e0a24f8cd919846fb79d1df.png",alt:""})}),"\n",(0,i.jsxs)(s.p,{children:["\u5927\u5bb6\u4e5f\u53ef\u4ee5\u6dfb\u52a0\xa0",(0,i.jsx)(s.strong,{children:"Pika \u52a9\u624b"}),"\uff0c\u52a0\u5165 Pika \u5fae\u4fe1\u7fa4\uff0c\u4e86\u89e3\u66f4\u591a\u52a8\u6001\u6d88\u606f\uff1a"]}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.img,{src:"https://oscimg.oschina.net/oscnet/up-9f7b2427254deb9b6bb4d32411460405b70.png",alt:""})})]})}function o(n={}){const{wrapper:s}={...(0,r.R)(),...n.components};return s?(0,i.jsx)(s,{...n,children:(0,i.jsx)(x,{...n})}):x(n)}},8453:(n,s,e)=>{e.d(s,{R:()=>c,x:()=>t});var i=e(6540);const r={},d=i.createContext(r);function c(n){const s=i.useContext(d);return i.useMemo((function(){return"function"==typeof n?n(s):{...s,...n}}),[s,n])}function t(n){let s;return s=n.disableParentContext?"function"==typeof n.components?n.components(r):n.components||r:c(n.components),i.createElement(d.Provider,{value:s},n.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/14c2ce36.f7eddbf1.js b/build/assets/js/14c2ce36.f7eddbf1.js new file mode 100644 index 0000000..f221931 --- /dev/null +++ b/build/assets/js/14c2ce36.f7eddbf1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[7472],{1077:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>d,contentTitle:()=>r,default:()=>p,frontMatter:()=>o,metadata:()=>a,toc:()=>l});var s=t(4848),n=t(8453);const o={title:"\u5206\u5e03\u5f0f\u6a21\u5f0f\u7b80\u5355\u6559\u7a0b",sidebar_position:65},r=void 0,a={id:"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5206\u5e03\u5f0f\u6a21\u5f0f\u7b80\u5355\u6559\u7a0b/index",title:"\u5206\u5e03\u5f0f\u6a21\u5f0f\u7b80\u5355\u6559\u7a0b",description:"\u5173\u4e8esharding mode\uff0cpika\u5e95\u5c42\u63d0\u4f9bslot \u7684\u6982\u5ff5\u3002Pika\u5c06key\u8fdb\u884c\u54c8\u5e0c\u53d6\u6a21\u4e4b\u540e\u6563\u5217\u5230\u5404\u4e2aslot\u5f53\u4e2d\u5904\u7406\u3002sharding mode \u6839\u636e\u7ebf\u4e0a\u7684\u5177\u4f53\u60c5\u51b5\u53ef\u4ee5\u5e94\u7528\u4e8e\u5355\u4e2apika\uff0c\u4e5f\u53ef\u4ee5\u5e94\u7528\u5230\u591a\u4e2apika\u7ec4\u6210\u7684pika cluster\u3002\u8fd9\u4e2atutorial\u4e3b\u8981\u4ecb\u7ecd\u5f00\u542fsharding mode \u9700\u8981\u4e86\u89e3\u7684\u4e00\u4e9b\u6982\u5ff5\uff0c\u4ee5\u53ca\u9700\u8981\u8c03\u6574\u7684\u4e00\u4e9b\u914d\u7f6e\u53c2\u6570\u3002",source:"@site/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5206\u5e03\u5f0f\u6a21\u5f0f\u7b80\u5355\u6559\u7a0b/index.md",sourceDirName:"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5206\u5e03\u5f0f\u6a21\u5f0f\u7b80\u5355\u6559\u7a0b",slug:"/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5206\u5e03\u5f0f\u6a21\u5f0f\u7b80\u5355\u6559\u7a0b/",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5206\u5e03\u5f0f\u6a21\u5f0f\u7b80\u5355\u6559\u7a0b/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5206\u5e03\u5f0f\u6a21\u5f0f\u7b80\u5355\u6559\u7a0b/index.md",tags:[],version:"current",sidebarPosition:65,frontMatter:{title:"\u5206\u5e03\u5f0f\u6a21\u5f0f\u7b80\u5355\u6559\u7a0b",sidebar_position:65},sidebar:"tutorialSidebar",previous:{title:"\u8ba2\u9605",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u8ba2\u9605/"},next:{title:"\u81ea\u52a8\u5bb9\u707e",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u81ea\u52a8\u5bb9\u707e/"}},d={},l=[{value:"0. \u6a21\u5f0f\u7684\u9009\u62e9",id:"0-\u6a21\u5f0f\u7684\u9009\u62e9",level:4},{value:"1. \u6240\u9700\u8981\u7248\u672c",id:"1-\u6240\u9700\u8981\u7248\u672c",level:4},{value:"2. \u57fa\u672c\u64cd\u4f5c",id:"2-\u57fa\u672c\u64cd\u4f5c",level:4},{value:"3. \u914d\u7f6e\u6587\u4ef6\u8bf4\u660e",id:"3-\u914d\u7f6e\u6587\u4ef6\u8bf4\u660e",level:4},{value:"4. \u517c\u5bb9codis\uff0ctwemproxy\u65b9\u6848",id:"4-\u517c\u5bb9codistwemproxy\u65b9\u6848",level:4}];function c(e){const i={a:"a",code:"code",h4:"h4",p:"p",pre:"pre",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.p,{children:"\u5173\u4e8esharding mode\uff0cpika\u5e95\u5c42\u63d0\u4f9bslot \u7684\u6982\u5ff5\u3002Pika\u5c06key\u8fdb\u884c\u54c8\u5e0c\u53d6\u6a21\u4e4b\u540e\u6563\u5217\u5230\u5404\u4e2aslot\u5f53\u4e2d\u5904\u7406\u3002sharding mode \u6839\u636e\u7ebf\u4e0a\u7684\u5177\u4f53\u60c5\u51b5\u53ef\u4ee5\u5e94\u7528\u4e8e\u5355\u4e2apika\uff0c\u4e5f\u53ef\u4ee5\u5e94\u7528\u5230\u591a\u4e2apika\u7ec4\u6210\u7684pika cluster\u3002\u8fd9\u4e2atutorial\u4e3b\u8981\u4ecb\u7ecd\u5f00\u542fsharding mode \u9700\u8981\u4e86\u89e3\u7684\u4e00\u4e9b\u6982\u5ff5\uff0c\u4ee5\u53ca\u9700\u8981\u8c03\u6574\u7684\u4e00\u4e9b\u914d\u7f6e\u53c2\u6570\u3002"}),"\n",(0,s.jsx)(i.h4,{id:"0-\u6a21\u5f0f\u7684\u9009\u62e9",children:"0. \u6a21\u5f0f\u7684\u9009\u62e9"}),"\n",(0,s.jsx)(i.p,{children:"\u76ee\u524dpika \u5206\u4e3a\u4e24\u79cd\u6a21\u5f0f\uff0c\u4e24\u79cd\u6a21\u5f0f\u4e0d\u53ef\u517c\u5bb9\uff0c\u6240\u4ee5\u8bf7\u4e00\u5b9a\u5148\u6839\u636e\u4e1a\u52a1\u786e\u5b9a\u4f7f\u7528\u54ea\u4e00\u79cd\u6a21\u5f0f\u3002"}),"\n",(0,s.jsx)(i.p,{children:"\u4e00\u79cd\u662f\u7ecf\u5178\u6a21\u5f0f(classic)\uff0c\u7ecf\u5178\u6a21\u5f0f\u4e0b\u53ef\u4ee5\u652f\u6301\u7edd\u5927\u591a\u6570\u7684\u4e1a\u52a1\u538b\u529b\uff0c\u540c\u65f6\u652f\u63018\u4e2adb(db0-db7)\u7684\u5e76\u53d1\u8bfb\u5199\u3002\u5efa\u8bae\u4e00\u822c\u7684\u4e1a\u52a1\u7ebf\u53ef\u4ee5\u5148\u538b\u6d4b\u8fd9\u4e2a\u6a21\u5f0f\u3002"}),"\n",(0,s.jsx)(i.p,{children:"\u5982\u679c\u7ecf\u5178\u6a21\u5f0f\u4e0d\u80fd\u6ee1\u8db3\u7ebf\u4e0a\u5de8\u5927\u7684\u538b\u529b\uff0c\u53ef\u4ee5\u5c1d\u8bd5\u53e6\u4e00\u79cd\u6a21\u5f0f\uff0c\u96c6\u7fa4\u6a21\u5f0f(sharding)\uff0c\u76f8\u5bf9\u4e8e\u7ecf\u5178\u6a21\u5f0f\uff0c\u96c6\u7fa4\u6a21\u5f0f\u4f1a\u63d0\u4f9b\u66f4\u9ad8\u7684QPS\uff0c\u540c\u65f6\u4e5f\u4f1a\u5360\u7528\u66f4\u591a\u7684\u786c\u4ef6\u8d44\u6e90\u3002\u4ee5Codis\u4e0b\u914d\u7f6epika\u4e3a\u5176\u540e\u7aef\u5b58\u50a8\u4e3a\u4f8b\uff0ccodis \u9ed8\u8ba4\u662f\u96c6\u7fa4slots\u603b\u6570\u4e3a1024\uff0c\u6bcf\u4e2aslots \u90fd\u63d0\u4f9b\u4e94\u79cd\u6570\u636e\u7ed3\u6784\u7684\u8bfb\u5199\u3002\u5bf9\u5e94\u6bcf\u4e00\u79cd\u6570\u636e\u7ed3\u6784\uff0cpika\u90fd\u4f1a\u8d77rocksdb\u5b9e\u4f8b\u3002\u8fd9\u6837\uff0c\u96c6\u7fa4\u9700\u8981\u8d771024*5\u4e2arocksdb\u5b9e\u4f8b\uff0c\u96c6\u7fa4\u6a21\u5f0f\u7684\u610f\u4e49\u5f53\u7136\u662f\u628a\u8fd9\u4e9b5120\u4e2apika\u5b9e\u4f8b\u5206\u5e03\u5728\u5404\u4e2a\u673a\u5668\u7684pika\u5b9e\u4f8b\u4e0a\u3002\u6240\u4ee5\u6211\u4eec\u63a8\u8350\u96c6\u7fa4\u9700\u8981\u4e00\u5b9a\u89c4\u6a21\u7684\u7269\u7406\u673a\uff0c\u8fd9\u4e2a\u6837\u6bcf\u4e2a\u7269\u7406\u673a\u4e0a\u627f\u8f7d\u7684rocksdb\u5b9e\u4f8b\u4e0d\u4f1a\u592a\u591a\u3002\u5f53\u7136\u6211\u4eec\u7684\u8bbe\u8ba1\u4e4b\u521d\u5f53\u7136\u662f\u4f7f\u7528\u4eba\u5458\u81ea\u884c\u51b3\u5b9a\u9700\u8981\u591a\u5c11\u7269\u7406\u673a\u6765\u5206\u5e035120\u4e2arocksdb\u5b9e\u4f8b\u3002\u4e3a\u4ec0\u4e48\u4e0d\u80fd\u5e03\u7f6e\u5728\u4e00\u53f0\u7269\u7406\u673a\u4e0a\u5462\uff1f\u539f\u56e0\u5982\u4e0b\uff1a"}),"\n",(0,s.jsx)(i.p,{children:"1\uff0c\u8fc7\u591a\u7684rocksdb \u5b9e\u4f8b\u540c\u65f6compaction\u7684\u6982\u7387\u53d8\u9ad8\uff0c\u5bf9\u78c1\u76d8\u7684\u538b\u529b\u8fc7\u5927\u3002"}),"\n",(0,s.jsx)(i.p,{children:"2\uff0c \u6bcf\u4e2arocksdb\u4f1a\u5360\u7528\u4e00\u5b9a\u6570\u91cf\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u548c\u5185\u5b58\uff0c\u8fd9\u4e2a\u6570\u5b57\u4e58\u4ee55120\u5f88\u5bb9\u6613\u5c06\u7cfb\u7edf\u8d44\u6e90\u8017\u5c3d\u3002"}),"\n",(0,s.jsx)(i.p,{children:"\u603b\u4e4b\uff0c\u4e00\u5b9a\u662f\u66f4\u591a\u7684\u786c\u4ef6\u8d44\u6e90\u63d0\u4f9b\u66f4\u591a\u7684\u6027\u80fd\uff0c\u5efa\u8bae\u65b0\u63a5\u89e6pika\u7684\u540c\u5b66\u53ef\u4ee5\u7528\u6211\u4eec\u7684\u7ecf\u5178\u6a21\u5f0f\uff0c\u5982\u679c\u5b8c\u5168\u6ee1\u8db3\u4e0d\u4e86\u76ee\u524d\u7684\u9700\u6c42\uff0c\u53ef\u4ee5\u8003\u8651\u7528\u66f4\u591a\u7684\u7269\u7406\u8d44\u6e90\uff0c\u4f7f\u7528\u96c6\u7fa4\u6a21\u5f0f\u3002"}),"\n",(0,s.jsxs)(i.p,{children:["\u5177\u4f53\u7684\u6027\u80fd\u6d4b\u8bd5\u53ef\u4ee5\u53c2\u8003 ",(0,s.jsx)(i.a,{href:"https://github.com/Qihoo360/pika/wiki/3.2.x-Performance",children:"3.2.x Performance"}),"\u3002"]}),"\n",(0,s.jsx)(i.h4,{id:"1-\u6240\u9700\u8981\u7248\u672c",children:"1. \u6240\u9700\u8981\u7248\u672c"}),"\n",(0,s.jsx)(i.p,{children:"Pika \u4ece3.2.0\u7248\u672c\u4e4b\u540e\u652f\u6301sharding mode\uff0c\u5efa\u8bae\u7528\u6700\u65b0release\u3002"}),"\n",(0,s.jsx)(i.h4,{id:"2-\u57fa\u672c\u64cd\u4f5c",children:"2. \u57fa\u672c\u64cd\u4f5c"}),"\n",(0,s.jsxs)(i.p,{children:["\u5173\u4e8eslots\u7684\u57fa\u672c\u64cd\u4f5c\u8be6\u89c1 ",(0,s.jsx)(i.a,{href:"https://github.com/Qihoo360/pika/wiki/Pika%E5%88%86%E7%89%87%E5%91%BD%E4%BB%A4",children:"slot commands"})]}),"\n",(0,s.jsx)(i.h4,{id:"3-\u914d\u7f6e\u6587\u4ef6\u8bf4\u660e",children:"3. \u914d\u7f6e\u6587\u4ef6\u8bf4\u660e"}),"\n",(0,s.jsx)(i.p,{children:"\u76f8\u5173\u7684\u914d\u7f6e\u6587\u4ef6\u8c03\u53c2"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{children:"# default slot number each table in sharding mode\n default-slot-num : 1024\n\n# if this option is set to 'classic', that means pika support multiple DB, in\n# this mode, option databases enable\n# if this option is set to 'sharding', that means pika support multiple Table, you\n# can specify slot num for each table, in this mode, option default-slot-num enable\n# Pika instance mode [classic | sharding]\n instance-mode : sharding\n\n# Pika write-buffer-size\nwrite-buffer-size : 67108864\n\n# If the total size of all live memtables of all the DBs exceeds\n# the limit, a flush will be triggered in the next DB to which the next write\n# is issued.\nmax-write-buffer-size : 10737418240\n\n# maximum value of Rocksdb cached open file descriptors\nmax-cache-files : 100\n"})}),"\n",(0,s.jsxs)(i.p,{children:["\u914d\u7f6e\u6587\u4ef6\u7684\u8bf4\u660e\u53ef\u4ee5\u5728",(0,s.jsx)(i.a,{href:"https://github.com/Qihoo360/pika/wiki/pika-%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E8%AF%B4%E6%98%8E",children:"\u914d\u7f6e\u8bf4\u660e"}),"\u4e2d\u627e\u5230\u3002\n\u7279\u522b\u8bf4\u660e\u7684\u662fwrite-buffer-size \u4ee3\u8868\u7684\u662f\u6bcf\u4e00\u4e2arockdb\u5b9e\u4f8b\u7684\u6bcf\u4e00\u4e2amemtable\u7684\u5927\u5c0f\uff0c\u6240\u6709\u7684rocksdb\u7684\u6240\u6709\u7684memtable\u5927\u5c0f\u4e0a\u9650\u7531\nmax-write-buffer-size\u63a7\u5236\u3002\u5982\u679c\u8fbe\u5230max-write-buffer-size\u6570\u503c\uff0c\u6bcf\u4e2arocksdb \u5b9e\u4f8b\u90fd\u4f1a\u5c1d\u8bd5flush\u5f53\u524d\u7684memtable\u4ee5\u51cf\u5c11\u5185\u5b58\u4f7f\u7528\u3002"]}),"\n",(0,s.jsx)(i.h4,{id:"4-\u517c\u5bb9codistwemproxy\u65b9\u6848",children:"4. \u517c\u5bb9codis\uff0ctwemproxy\u65b9\u6848"}),"\n",(0,s.jsx)(i.p,{children:"\u76ee\u524d\u7684\u5206\u5e03\u5f0f\u6846\u67b6\u4f9d\u8d56\u4e8e\u5f00\u6e90\u9879\u76ee\uff0c\u76ee\u524dpika\u517c\u5bb9codis\uff0ctwemproxy\u3002"}),"\n",(0,s.jsxs)(i.p,{children:["\u5177\u4f53\u7684\u517c\u5bb9\u65b9\u6848\u8be6\u89c1",(0,s.jsx)(i.a,{href:"https://github.com/Qihoo360/pika/wiki/Support-Cluster-Slots",children:"Support Cluster Slots"}),"\u3002"]})]})}function p(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,i,t)=>{t.d(i,{R:()=>r,x:()=>a});var s=t(6540);const n={},o=s.createContext(n);function r(e){const i=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),s.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/15d8eb8d.f7365b8e.js b/build/assets/js/15d8eb8d.f7365b8e.js new file mode 100644 index 0000000..ed6cabc --- /dev/null +++ b/build/assets/js/15d8eb8d.f7365b8e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[736],{5550:(i,e,n)=>{n.r(e),n.d(e,{assets:()=>a,contentTitle:()=>l,default:()=>p,frontMatter:()=>r,metadata:()=>o,toc:()=>c});var t=n(4848),s=n(8453);const r={title:"\u589e\u91cf\u540c\u6b65",sidebar_position:4},l=void 0,o={id:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u589e\u91cf\u540c\u6b65/index",title:"\u589e\u91cf\u540c\u6b65",description:"\u80cc\u666f",source:"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u589e\u91cf\u540c\u6b65/index.md",sourceDirName:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u589e\u91cf\u540c\u6b65",slug:"/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u589e\u91cf\u540c\u6b65/",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u589e\u91cf\u540c\u6b65/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u589e\u91cf\u540c\u6b65/index.md",tags:[],version:"current",sidebarPosition:4,frontMatter:{title:"\u589e\u91cf\u540c\u6b65",sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"\u5168\u540c\u6b65",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u5168\u540c\u6b65/"},next:{title:"\u4e3b\u4ece\u540c\u6b65",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u4e3b\u4ece\u540c\u6b65/"}},a={},c=[{value:"\u80cc\u666f",id:"\u80cc\u666f",level:2},{value:"Binlog \u7ed3\u6784\uff1a",id:"binlog-\u7ed3\u6784",level:3},{value:"\u4ea4\u4e92\u8fc7\u7a0b\uff1a",id:"\u4ea4\u4e92\u8fc7\u7a0b",level:3},{value:"\u540c\u6b65\u6a21\u5757:",id:"\u540c\u6b65\u6a21\u5757",level:2},{value:"\u540c\u6b65\u8fc7\u7a0b:",id:"\u540c\u6b65\u8fc7\u7a0b",level:2},{value:"MasterPartition \u540c\u6b65\u4e8b\u4ef6",id:"masterpartition-\u540c\u6b65\u4e8b\u4ef6",level:3},{value:"SlavePartition \u540c\u6b65\u4e8b\u4ef6",id:"slavepartition-\u540c\u6b65\u4e8b\u4ef6",level:3}];function d(i){const e={h2:"h2",h3:"h3",img:"img",p:"p",...(0,s.R)(),...i.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(e.h2,{id:"\u80cc\u666f",children:"\u80cc\u666f"}),"\n",(0,t.jsx)("br",{}),"\n",(0,t.jsx)(e.p,{children:"\u4ece\u5e93Pika\u5f97\u5230\u4e3b\u5e93\u7684\u5168\u90e8DB\u7ed3\u6784\uff0c\u63a5\u4e0b\u6765\u4ee5partition\u7ef4\u5ea6\u505aTrysync\uff0c\u5982\u679c\u4ece\u5e93\u786e\u8ba4\u53ef\u4ee5\u589e\u91cf\u540c\u6b65\uff0c\u4ece\u5e93\u5c06\u4ee5partition\u4e3a\u7ef4\u5ea6\u8fdb\u884c\u589e\u91cf\u540c\u6b65\u3002\u9ed8\u8ba4\u4f7f\u7528pika port+2000\u7684\u7aef\u53e3\u8fdb\u884c\u589e\u91cf\u540c\u6b65\u3002"}),"\n",(0,t.jsx)(e.h3,{id:"binlog-\u7ed3\u6784",children:"Binlog \u7ed3\u6784\uff1a"}),"\n",(0,t.jsx)("br",{}),"\n",(0,t.jsx)(e.p,{children:"Pika\u7684\u4e3b\u4ece\u540c\u6b65\u662f\u4f7f\u7528Binlog\u6765\u5b8c\u6210\u7684\uff0c\u4e00\u4e3b\u591a\u4ece\u7684\u7ed3\u6784master\u8282\u70b9\u4e5f\u53ef\u4ee5\u7ed9\u591a\u4e2aslave\u590d\u7528\u4e00\u4e2aBinlog\uff0c\u53ea\u4e0d\u8fc7\u4e0d\u540c\u7684slave\u5728binglog\u4e2d\u6709\u81ea\u5df1\u7684\u504f\u79fb\u91cf\u800c\u5df2\uff0cmaster\u6267\u884c\u5b8c\u4e00\u6761\u5199\u547d\u4ee4\u5c31\u5c06\u547d\u4ee4\u8ffd\u52a0\u5230Binlog\u4e2d\uff0cpika\u7684\u540c\u6b65\u6a21\u5757\u4f1a\u8bfb\u51fa\u5bf9\u5e94\u7684binlog\u53d1\u9001\u5230slave\uff0c\u800cslave\u6536\u5230binlog\u540e\u4f1a\u6267\u884c\u5e76\u8ffd\u52a0\u5230\u81ea\u5df1\u7684Binlog\u4e2d\uff0c\u7531\u4e8e\u4e3b\u4ece\u504f\u79fb\u91cf\u4e00\u6837\uff0c\u6240\u4ee5\u4e00\u65e6\u53d1\u751f\u7f51\u7edc\u6216\u8282\u70b9\u6545\u969c\u9700\u8981\u91cd\u8fde\u4e3b\u4ece\u65f6\uff0cslave\u4ec5\u9700\u8981\u5c06\u81ea\u5df1\u5f53\u524d\u7684Binlog\u504f\u79fb\u91cf\u53d1\u9001\u7ed9master\uff0cmaster\u627e\u5230\u540e\u4ece\u8be5\u504f\u79fb\u91cf\u5f00\u59cb\u540c\u6b65\u540e\u7eed\u547d\u4ee4\uff0c\u7406\u8bba\u4e0a\u5c06\u547d\u4ee4\u4e0d\u505a\u5904\u7406\u4e00\u6761\u4e00\u6761\u8ffd\u52a0\u5230\u6587\u4ef6\u4e2d\uff0c\u4f46\u662f\u8fd9\u6837\u7684\u8bb0\u5f55\u683c\u5f0f\u5bb9\u9519\u5f88\u5dee\uff0c\u5982\u679c\u8bfb\u6587\u4ef6\u4e2d\u5199\u9519\u4e00\u4e2a\u5b57\u8282\u5219\u5bfc\u81f4\u6574\u4e2a\u6587\u4ef6\u4e0d\u53ef\u7528\uff0c\u6240\u4ee5pika\u91c7\u7528\u4e86\u7c7b\u4f3cleveldb log\u7684\u683c\u5f0f\u6765\u8fdb\u884c\u5b58\u50a8\uff0c\u5177\u4f53\u5982\u4e0b\uff1a"}),"\n",(0,t.jsx)(e.p,{children:(0,t.jsx)(e.img,{src:"http://ww2.sinaimg.cn/large/c2cd4307gw1f6m74717b3j20rm0gjwgw.jpg",alt:"image"})}),"\n",(0,t.jsx)(e.h3,{id:"\u4ea4\u4e92\u8fc7\u7a0b",children:"\u4ea4\u4e92\u8fc7\u7a0b\uff1a"}),"\n",(0,t.jsx)("br",{}),"\n",(0,t.jsx)(e.p,{children:"1\uff0c\u4ece\u5e93\u53d1\u9001BinlogSyncRequest \u62a5\u6587\uff0c\u62a5\u6587\u4e2d\u9700\u8bf4\u660e\u81ea\u5df1\u5df2\u7ecf\u6536\u5230\u7684BinlogOffset\u3002"}),"\n",(0,t.jsx)(e.p,{children:"2\uff0c\u4e3b\u5e93\u6536\u5230BinlogSyncRequest\u4e4b\u540e\u4f1a\u4ece\u540c\u6b65\u70b9\u5f00\u59cb\u53d1\u51fa\u4e00\u6279BinlogSyncResponse\u3002"}),"\n",(0,t.jsx)(e.p,{children:"3\uff0c\u4ece\u5e93\u5728\u6536\u5230BinlogSyncResponse\u4e4b\u540e\uff0c\u4f1a\u5728\u5199\u5165\u672c\u5730binlog\u4e4b\u540e\u518d\u8fdb\u884c1\u6d41\u7a0b\u3002"}),"\n",(0,t.jsx)(e.p,{children:(0,t.jsx)(e.img,{src:"https://i.imgur.com/JVfTV22.png",alt:"image"})}),"\n",(0,t.jsx)(e.h2,{id:"\u540c\u6b65\u6a21\u5757",children:"\u540c\u6b65\u6a21\u5757:"}),"\n",(0,t.jsx)("br",{}),"\n",(0,t.jsx)(e.p,{children:(0,t.jsx)(e.img,{src:"https://i.imgur.com/5ByKpsA.png",alt:"image"})}),"\n",(0,t.jsx)(e.p,{children:"Pika\u7684\u540c\u6b65\u7531ReplicaManager(RM)\u6a21\u5757\u8d1f\u8d23\u3002RM\u4e2d\u6709\u4e24\u5c42\u7ed3\u6784\uff0c\u903b\u8f91\u5c42\u8d1f\u8d23\u540c\u6b65\u903b\u8f91\uff0c\u4f20\u8f93\u5c42\u8d1f\u8d23\u94fe\u63a5\u7684\u7ba1\u7406\u6570\u636e\u7684\u89e3\u6790\u548c\u4f20\u8f93\u3002"}),"\n",(0,t.jsx)(e.p,{children:"\u6570\u636e\u7684\u540c\u6b65\u7684\u6700\u5c0f\u5355\u4f4d\u662fPartition\uff0c\u6bcf\u4e00\u4e2aPika\u5b9e\u4f8b\u4f1a\u7ef4\u62a4\u81ea\u5df1\u4f5c\u4e3a\u4e3b\u7684partition(MasterPartition)\u548c\u81ea\u5df1\u662f\u4ece\u7684partition(SlavePartition)\u3002\u5bf9\u4e8eMasterPartition\uff0c\u9700\u8981\u8bb0\u5f55\u8ddf\u968f\u81ea\u5df1\u7684slave\u540c\u6b65\u4fe1\u606f\uff0c\u903b\u8f91\u5c42\u4f1a\u6839\u636e\u8be5\u4fe1\u606f\u5411slave\u540c\u6b65\u4fe1\u606f\u3002\u5bf9\u4e8eSlavePartition\uff0c\u5219\u662f\u9700\u8981\u9700\u8981\u8bb0\u5f55master\u7684\u4fe1\u606f\uff0c\u903b\u8f91\u5c42\u4f1a\u6309\u7167\u8be5\u4fe1\u606f\u6309\u9700\u5411master\u53d1\u9001\u540c\u6b65\u8bf7\u6c42\u3002"}),"\n",(0,t.jsx)(e.p,{children:"\u903b\u8f91\u5c42\u7ef4\u62a4\u4e24\u4e2a\u6570\u636e\u7ed3\u6784\uff0c\u4e00\u4e2a\u662fMasterPartitions\uff0c\u8bb0\u5f55\u8ddf\u968f\u81ea\u5df1\u7684SlaveNode\u4fe1\u606f\uff0c\u4e3b\u8981\u5305\u62ecslave\u7684\u540c\u6b65\u72b6\u6001\u548c\u5f53\u524d\u7684sessionId\u3002\u53e6\u4e00\u4e2a\u662fSlavePartitions\uff0c\u8bb0\u5f55\u4e3b\u7684\u4fe1\u606f\u3002"}),"\n",(0,t.jsx)(e.p,{children:"\u4f20\u8f93\u5c42\u5206\u4e3a\u4e24\u4e2a\u5b50\u6a21\u5757\uff0cReplicationClient\u8d1f\u8d23\u53d1\u8d77\u94fe\u63a5\u7684\u5efa\u7acb\uff0cReplicationServer\u8d1f\u8d23\u54cd\u5e94\u62a5\u6587\u3002\u6bcf\u4e24\u4e2a\u5b9e\u4f8b\u4e4b\u95f4\u7684\u6240\u6709partition\u590d\u7528\u4e00\u6761\u94fe\u63a5\u3002"}),"\n",(0,t.jsx)(e.h2,{id:"\u540c\u6b65\u8fc7\u7a0b",children:"\u540c\u6b65\u8fc7\u7a0b:"}),"\n",(0,t.jsx)("br",{}),"\n",(0,t.jsx)(e.p,{children:(0,t.jsx)(e.img,{src:"https://i.imgur.com/1Q8PbjF.png",alt:"image"})}),"\n",(0,t.jsx)(e.h3,{id:"masterpartition-\u540c\u6b65\u4e8b\u4ef6",children:"MasterPartition \u540c\u6b65\u4e8b\u4ef6"}),"\n",(0,t.jsx)(e.p,{children:"\u903b\u8f91\u5c42\u5904\u7406MasterPartition\u7684\u540c\u6b65\u4e8b\u4ef6\uff0c\u5411\u5176\u5bf9\u5e94\u7684\u4ece\u540c\u6b65\u6570\u636e\u3002"}),"\n",(0,t.jsx)(e.p,{children:"1\uff0c\u8bfb\u53d6MasterPartition Binlog\u4fe1\u606f\u540e\uff0c\u5c06BinlogOffsetInfo\u8bb0\u5f55\u5230SlaveNode\u81ea\u5df1\u7684window\u4e2d\u3002"}),"\n",(0,t.jsx)(e.p,{children:"2\uff0c\u5c06Binlog\u6682\u5b58\u5230\u4e34\u65f6\u7684\u5f85\u53d1\u9001\u961f\u5217\u4e2d\u3002"}),"\n",(0,t.jsx)(e.p,{children:"3\uff0c\u8f85\u52a9\u7ebf\u7a0b(Auxiliary thread) \u5b9a\u65f6\u5c06\u4e34\u65f6\u5f85\u53d1\u9001\u961f\u5217\u7684\u6570\u636e\u901a\u8fc7RM\u7684\u4f20\u8f93\u5c42\u53d1\u9001\u7ed9\u5bf9\u5e94\u7684slave\u8282\u70b9\u3002"}),"\n",(0,t.jsx)(e.p,{children:"4\uff0c\u6536\u5230slave\u7684BinlogSyncResponse\u4e4b\u540e\uff0c\u5f97\u77e5slave\u6536\u5230\u7684BinlogOffset\u4fe1\u606f\uff0c\u66f4\u65b0SlaveNode window\uff0c\u91cd\u590d1\u6d41\u7a0b\u7ee7\u7eed\u540c\u6b65"}),"\n",(0,t.jsx)(e.p,{children:"\u4e3a\u4e86\u63a7\u5236\u6bcf\u4e2aSlaveNode\u540c\u6b65\u7684\u901f\u5ea6\uff0c\u907f\u514d\u67d0\u51e0\u4e2aSlaveNode\u5360\u7528\u8fc7\u591a\u8d44\u6e90\uff0c\u4e3a\u6bcf\u4e00\u4e2aSlaveNode\u8bbe\u7f6e\u4e86window\u3002\u5982\u4e0b\u56fe\u6240\u793a\uff0cPika\u6536\u5230\u4e86BinlogOffset\u4e3a100\u5230200\u7684ack response\uff0c\u4ecewindow\u4e2d\u79fb\u9664BinlogOffset\u4f4d\u4e8e100\u5230200\u7684\u5143\u7d20\uff0c\u4e4b\u540e\u7ee7\u7eed\u53d1\u9001BinlogOffset\u4e3a1100\u548c1200\u7684binlog\uff0c\u5bf9\u5e94\u7684BinlogOffset\u6dfb\u52a0\u81f3window\u4e2d\u3002"}),"\n",(0,t.jsx)(e.p,{children:(0,t.jsx)(e.img,{src:"https://i.imgur.com/0GtOhk4.png",alt:"image"})}),"\n",(0,t.jsx)(e.h3,{id:"slavepartition-\u540c\u6b65\u4e8b\u4ef6",children:"SlavePartition \u540c\u6b65\u4e8b\u4ef6"}),"\n",(0,t.jsx)(e.p,{children:"\u903b\u8f91\u5c42\u5904\u7406SlavePartition\u7684\u540c\u6b65\u4e8b\u4ef6\uff0c\u6536\u5230master\u53d1\u9001\u7684\u540c\u6b65\u6570\u636e\uff0c\u5411master\u53d1\u76f8\u5e94\u7684response\u4fe1\u606f\u3002"}),"\n",(0,t.jsx)(e.p,{children:"1\uff0c\u6309\u7167\u89e3\u6790\u51fa\u7684Partition\u4fe1\u606f\uff0c\u88ab\u5206\u914d\u5230\u5bf9\u5e94\u7684\u7ebf\u7a0b\u5904\u7406binlog\u5199\u5165\u4efb\u52a1\u3002"}),"\n",(0,t.jsx)(e.p,{children:"2\uff0c\u7ebf\u7a0b\u5199\u5165binlog\u4e4b\u540e\uff0c\u8c03\u7528\u4f20\u8f93\u5c42\u53d1\u9001BinlogSyncResponse\u4fe1\u606f\u3002"}),"\n",(0,t.jsx)(e.p,{children:"3\uff0c\u6839\u636ebinlog\u7684key\u5206\u914d\u7ed9\u5bf9\u5e94\u7684\u7ebf\u7a0b\u5904\u7406\u5199\u5165db\u4efb\u52a1\u3002"})]})}function p(i={}){const{wrapper:e}={...(0,s.R)(),...i.components};return e?(0,t.jsx)(e,{...i,children:(0,t.jsx)(d,{...i})}):d(i)}},8453:(i,e,n)=>{n.d(e,{R:()=>l,x:()=>o});var t=n(6540);const s={},r=t.createContext(s);function l(i){const e=t.useContext(r);return t.useMemo((function(){return"function"==typeof i?i(e):{...e,...i}}),[e,i])}function o(i){let e;return e=i.disableParentContext?"function"==typeof i.components?i.components(s):i.components||s:l(i.components),t.createElement(r.Provider,{value:e},i.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/17896441.be2148b0.js b/build/assets/js/17896441.be2148b0.js new file mode 100644 index 0000000..13fe4fe --- /dev/null +++ b/build/assets/js/17896441.be2148b0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[8401],{2447:(e,n,t)=>{t.r(n),t.d(n,{default:()=>ae});var s=t(6540),a=t(1213),i=t(9532),o=t(4848);const l=s.createContext(null);function r(e){let{children:n,content:t}=e;const a=function(e){return(0,s.useMemo)((()=>({metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,contentTitle:e.contentTitle,toc:e.toc})),[e])}(t);return(0,o.jsx)(l.Provider,{value:a,children:n})}function c(){const e=(0,s.useContext)(l);if(null===e)throw new i.dV("DocProvider");return e}function d(){const{metadata:e,frontMatter:n,assets:t}=c();return(0,o.jsx)(a.be,{title:e.title,description:e.description,keywords:n.keywords,image:t.image??n.image})}var u=t(4164),m=t(4581),h=t(1312),v=t(9022);function b(e){const{previous:n,next:t}=e;return(0,o.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,h.T)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"}),children:[n&&(0,o.jsx)(v.A,{...n,subLabel:(0,o.jsx)(h.A,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc",children:"Previous"})}),t&&(0,o.jsx)(v.A,{...t,subLabel:(0,o.jsx)(h.A,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc",children:"Next"}),isNext:!0})]})}function x(){const{metadata:e}=c();return(0,o.jsx)(b,{previous:e.previous,next:e.next})}var f=t(4586),p=t(8774),g=t(4070),j=t(7559),C=t(5597),L=t(2252);const A={unreleased:function(e){let{siteTitle:n,versionMetadata:t}=e;return(0,o.jsx)(h.A,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:n,versionLabel:(0,o.jsx)("b",{children:t.label})},children:"This is unreleased documentation for {siteTitle} {versionLabel} version."})},unmaintained:function(e){let{siteTitle:n,versionMetadata:t}=e;return(0,o.jsx)(h.A,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:n,versionLabel:(0,o.jsx)("b",{children:t.label})},children:"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained."})}};function N(e){const n=A[e.versionMetadata.banner];return(0,o.jsx)(n,{...e})}function _(e){let{versionLabel:n,to:t,onClick:s}=e;return(0,o.jsx)(h.A,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:n,latestVersionLink:(0,o.jsx)("b",{children:(0,o.jsx)(p.A,{to:t,onClick:s,children:(0,o.jsx)(h.A,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label",children:"latest version"})})})},children:"For up-to-date documentation, see the {latestVersionLink} ({versionLabel})."})}function k(e){let{className:n,versionMetadata:t}=e;const{siteConfig:{title:s}}=(0,f.A)(),{pluginId:a}=(0,g.vT)({failfast:!0}),{savePreferredVersionName:i}=(0,C.g1)(a),{latestDocSuggestion:l,latestVersionSuggestion:r}=(0,g.HW)(a),c=l??(d=r).docs.find((e=>e.id===d.mainDocId));var d;return(0,o.jsxs)("div",{className:(0,u.A)(n,j.G.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert",children:[(0,o.jsx)("div",{children:(0,o.jsx)(N,{siteTitle:s,versionMetadata:t})}),(0,o.jsx)("div",{className:"margin-top--md",children:(0,o.jsx)(_,{versionLabel:r.label,to:c.path,onClick:()=>i(r.name)})})]})}function T(e){let{className:n}=e;const t=(0,L.r)();return t.banner?(0,o.jsx)(k,{className:n,versionMetadata:t}):null}function H(e){let{className:n}=e;const t=(0,L.r)();return t.badge?(0,o.jsx)("span",{className:(0,u.A)(n,j.G.docs.docVersionBadge,"badge badge--secondary"),children:(0,o.jsx)(h.A,{id:"theme.docs.versionBadge.label",values:{versionLabel:t.label},children:"Version: {versionLabel}"})}):null}var M=t(8046),w=t(4336);function y(){const{metadata:e}=c(),{editUrl:n,lastUpdatedAt:t,lastUpdatedBy:s,tags:a}=e,i=a.length>0,l=!!(n||t||s);return i||l?(0,o.jsxs)("footer",{className:(0,u.A)(j.G.docs.docFooter,"docusaurus-mt-lg"),children:[i&&(0,o.jsx)("div",{className:(0,u.A)("row margin-top--sm",j.G.docs.docFooterTagsRow),children:(0,o.jsx)("div",{className:"col",children:(0,o.jsx)(M.A,{tags:a})})}),l&&(0,o.jsx)(w.A,{className:(0,u.A)("margin-top--sm",j.G.docs.docFooterEditMetaRow),editUrl:n,lastUpdatedAt:t,lastUpdatedBy:s})]}):null}var I=t(1422),B=t(5195);const E={tocCollapsibleButton:"tocCollapsibleButton_TO0P",tocCollapsibleButtonExpanded:"tocCollapsibleButtonExpanded_MG3E"};function O(e){let{collapsed:n,...t}=e;return(0,o.jsx)("button",{type:"button",...t,className:(0,u.A)("clean-btn",E.tocCollapsibleButton,!n&&E.tocCollapsibleButtonExpanded,t.className),children:(0,o.jsx)(h.A,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component",children:"On this page"})})}const P={tocCollapsible:"tocCollapsible_ETCw",tocCollapsibleContent:"tocCollapsibleContent_vkbj",tocCollapsibleExpanded:"tocCollapsibleExpanded_sAul"};function V(e){let{toc:n,className:t,minHeadingLevel:s,maxHeadingLevel:a}=e;const{collapsed:i,toggleCollapsed:l}=(0,I.u)({initialState:!0});return(0,o.jsxs)("div",{className:(0,u.A)(P.tocCollapsible,!i&&P.tocCollapsibleExpanded,t),children:[(0,o.jsx)(O,{collapsed:i,onClick:l}),(0,o.jsx)(I.N,{lazy:!0,className:P.tocCollapsibleContent,collapsed:i,children:(0,o.jsx)(B.A,{toc:n,minHeadingLevel:s,maxHeadingLevel:a})})]})}const S={tocMobile:"tocMobile_ITEo"};function G(){const{toc:e,frontMatter:n}=c();return(0,o.jsx)(V,{toc:e,minHeadingLevel:n.toc_min_heading_level,maxHeadingLevel:n.toc_max_heading_level,className:(0,u.A)(j.G.docs.docTocMobile,S.tocMobile)})}var D=t(7763);function R(){const{toc:e,frontMatter:n}=c();return(0,o.jsx)(D.A,{toc:e,minHeadingLevel:n.toc_min_heading_level,maxHeadingLevel:n.toc_max_heading_level,className:j.G.docs.docTocDesktop})}var U=t(1107),F=t(5533);function z(e){let{children:n}=e;const t=function(){const{metadata:e,frontMatter:n,contentTitle:t}=c();return n.hide_title||void 0!==t?null:e.title}();return(0,o.jsxs)("div",{className:(0,u.A)(j.G.docs.docMarkdown,"markdown"),children:[t&&(0,o.jsx)("header",{children:(0,o.jsx)(U.A,{as:"h1",children:t})}),(0,o.jsx)(F.A,{children:n})]})}var q=t(1754),$=t(9169),W=t(6025);function Y(e){return(0,o.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,o.jsx)("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"})})}const Z={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function J(){const e=(0,W.Ay)("/");return(0,o.jsx)("li",{className:"breadcrumbs__item",children:(0,o.jsx)(p.A,{"aria-label":(0,h.T)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e,children:(0,o.jsx)(Y,{className:Z.breadcrumbHomeIcon})})})}const K={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function Q(e){let{children:n,href:t,isLast:s}=e;const a="breadcrumbs__link";return s?(0,o.jsx)("span",{className:a,itemProp:"name",children:n}):t?(0,o.jsx)(p.A,{className:a,href:t,itemProp:"item",children:(0,o.jsx)("span",{itemProp:"name",children:n})}):(0,o.jsx)("span",{className:a,children:n})}function X(e){let{children:n,active:t,index:s,addMicrodata:a}=e;return(0,o.jsxs)("li",{...a&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},className:(0,u.A)("breadcrumbs__item",{"breadcrumbs__item--active":t}),children:[n,(0,o.jsx)("meta",{itemProp:"position",content:String(s+1)})]})}function ee(){const e=(0,q.OF)(),n=(0,$.Dt)();return e?(0,o.jsx)("nav",{className:(0,u.A)(j.G.docs.docBreadcrumbs,K.breadcrumbsContainer),"aria-label":(0,h.T)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"}),children:(0,o.jsxs)("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList",children:[n&&(0,o.jsx)(J,{}),e.map(((n,t)=>{const s=t===e.length-1,a="category"===n.type&&n.linkUnlisted?void 0:n.href;return(0,o.jsx)(X,{active:s,index:t,addMicrodata:!!a,children:(0,o.jsx)(Q,{href:a,isLast:s,children:n.label})},t)}))]})}):null}var ne=t(996);const te={docItemContainer:"docItemContainer_Djhp",docItemCol:"docItemCol_VOVn"};function se(e){let{children:n}=e;const t=function(){const{frontMatter:e,toc:n}=c(),t=(0,m.l)(),s=e.hide_table_of_contents,a=!s&&n.length>0;return{hidden:s,mobile:a?(0,o.jsx)(G,{}):void 0,desktop:!a||"desktop"!==t&&"ssr"!==t?void 0:(0,o.jsx)(R,{})}}(),{metadata:{unlisted:s}}=c();return(0,o.jsxs)("div",{className:"row",children:[(0,o.jsxs)("div",{className:(0,u.A)("col",!t.hidden&&te.docItemCol),children:[s&&(0,o.jsx)(ne.A,{}),(0,o.jsx)(T,{}),(0,o.jsxs)("div",{className:te.docItemContainer,children:[(0,o.jsxs)("article",{children:[(0,o.jsx)(ee,{}),(0,o.jsx)(H,{}),t.mobile,(0,o.jsx)(z,{children:n}),(0,o.jsx)(y,{})]}),(0,o.jsx)(x,{})]})]}),t.desktop&&(0,o.jsx)("div",{className:"col col--3",children:t.desktop})]})}function ae(e){const n=`docs-doc-id-${e.content.metadata.id}`,t=e.content;return(0,o.jsx)(r,{content:e.content,children:(0,o.jsxs)(a.e3,{className:n,children:[(0,o.jsx)(d,{}),(0,o.jsx)(se,{children:(0,o.jsx)(t,{})})]})})}},7763:(e,n,t)=>{t.d(n,{A:()=>c});t(6540);var s=t(4164),a=t(5195);const i={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var o=t(4848);const l="table-of-contents__link toc-highlight",r="table-of-contents__link--active";function c(e){let{className:n,...t}=e;return(0,o.jsx)("div",{className:(0,s.A)(i.tableOfContents,"thin-scrollbar",n),children:(0,o.jsx)(a.A,{...t,linkClassName:l,linkActiveClassName:r})})}},5195:(e,n,t)=>{t.d(n,{A:()=>b});var s=t(6540),a=t(6342);function i(e){const n=e.map((e=>({...e,parentIndex:-1,children:[]}))),t=Array(7).fill(-1);n.forEach(((e,n)=>{const s=t.slice(2,e.level);e.parentIndex=Math.max(...s),t[e.level]=n}));const s=[];return n.forEach((e=>{const{parentIndex:t,...a}=e;t>=0?n[t].children.push(a):s.push(a)})),s}function o(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:s}=e;return n.flatMap((e=>{const n=o({toc:e.children,minHeadingLevel:t,maxHeadingLevel:s});return function(e){return e.level>=t&&e.level<=s}(e)?[{...e,children:n}]:n}))}function l(e){const n=e.getBoundingClientRect();return n.top===n.bottom?l(e.parentNode):n}function r(e,n){let{anchorTopOffset:t}=n;const s=e.find((e=>l(e).top>=t));if(s){return function(e){return e.top>0&&e.bottom{e.current=n?0:document.querySelector(".navbar").clientHeight}),[n]),e}function d(e){const n=(0,s.useRef)(void 0),t=c();(0,s.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:s,linkActiveClassName:a,minHeadingLevel:i,maxHeadingLevel:o}=e;function l(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(s),l=function(e){let{minHeadingLevel:n,maxHeadingLevel:t}=e;const s=[];for(let a=n;a<=t;a+=1)s.push(`h${a}.anchor`);return Array.from(document.querySelectorAll(s.join()))}({minHeadingLevel:i,maxHeadingLevel:o}),c=r(l,{anchorTopOffset:t.current}),d=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,t){t?(n.current&&n.current!==e&&n.current.classList.remove(a),e.classList.add(a),n.current=e):e.classList.remove(a)}(e,e===d)}))}return document.addEventListener("scroll",l),document.addEventListener("resize",l),l(),()=>{document.removeEventListener("scroll",l),document.removeEventListener("resize",l)}}),[e,t])}var u=t(8774),m=t(4848);function h(e){let{toc:n,className:t,linkClassName:s,isChild:a}=e;return n.length?(0,m.jsx)("ul",{className:a?void 0:t,children:n.map((e=>(0,m.jsxs)("li",{children:[(0,m.jsx)(u.A,{to:`#${e.id}`,className:s??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,m.jsx)(h,{isChild:!0,toc:e.children,className:t,linkClassName:s})]},e.id)))}):null}const v=s.memo(h);function b(e){let{toc:n,className:t="table-of-contents table-of-contents__left-border",linkClassName:l="table-of-contents__link",linkActiveClassName:r,minHeadingLevel:c,maxHeadingLevel:u,...h}=e;const b=(0,a.p)(),x=c??b.tableOfContents.minHeadingLevel,f=u??b.tableOfContents.maxHeadingLevel,p=function(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:a}=e;return(0,s.useMemo)((()=>o({toc:i(n),minHeadingLevel:t,maxHeadingLevel:a})),[n,t,a])}({toc:n,minHeadingLevel:x,maxHeadingLevel:f});return d((0,s.useMemo)((()=>{if(l&&r)return{linkClassName:l,linkActiveClassName:r,minHeadingLevel:x,maxHeadingLevel:f}}),[l,r,x,f])),(0,m.jsx)(v,{toc:p,className:t,linkClassName:l,...h})}},996:(e,n,t)=>{t.d(n,{A:()=>h});t(6540);var s=t(4164),a=t(1312),i=t(5260),o=t(4848);function l(){return(0,o.jsx)(a.A,{id:"theme.unlistedContent.title",description:"The unlisted content banner title",children:"Unlisted page"})}function r(){return(0,o.jsx)(a.A,{id:"theme.unlistedContent.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function c(){return(0,o.jsx)(i.A,{children:(0,o.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}var d=t(7559),u=t(7293);function m(e){let{className:n}=e;return(0,o.jsx)(u.A,{type:"caution",title:(0,o.jsx)(l,{}),className:(0,s.A)(n,d.G.common.unlistedBanner),children:(0,o.jsx)(r,{})})}function h(e){return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(c,{}),(0,o.jsx)(m,{...e})]})}}}]); \ No newline at end of file diff --git a/build/assets/js/1845589b.788a4462.js b/build/assets/js/1845589b.788a4462.js new file mode 100644 index 0000000..741427a --- /dev/null +++ b/build/assets/js/1845589b.788a4462.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[1571],{1e3:(i,e,t)=>{t.r(e),t.d(e,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>r,metadata:()=>o,toc:()=>c});var n=t(4848),s=t(8453);const r={title:"\u6574\u4f53\u6280\u672f\u67b6\u6784",sidebar_position:0},a=void 0,o={id:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u6574\u4f53\u6280\u672f\u67b6\u6784/index",title:"\u6574\u4f53\u6280\u672f\u67b6\u6784",description:"\u6982\u8ff0",source:"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u6574\u4f53\u6280\u672f\u67b6\u6784/index.md",sourceDirName:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u6574\u4f53\u6280\u672f\u67b6\u6784",slug:"/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u6574\u4f53\u6280\u672f\u67b6\u6784/",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u6574\u4f53\u6280\u672f\u67b6\u6784/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u6574\u4f53\u6280\u672f\u67b6\u6784/index.md",tags:[],version:"current",sidebarPosition:0,frontMatter:{title:"\u6574\u4f53\u6280\u672f\u67b6\u6784",sidebar_position:0},sidebar:"tutorialSidebar",previous:{title:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/"},next:{title:"\u7ebf\u7a0b\u6a21\u578b",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u7ebf\u7a0b\u6a21\u578b/"}},l={},c=[{value:"\u6982\u8ff0",id:"\u6982\u8ff0",level:3},{value:"1. \u7ecf\u5178\uff08\u4e3b\u4ece\uff09\u6a21\u5f0f",id:"1-\u7ecf\u5178\u4e3b\u4ece\u6a21\u5f0f",level:3},{value:"2. \u5206\u5e03\u5f0f\u6a21\u5f0f",id:"2-\u5206\u5e03\u5f0f\u6a21\u5f0f",level:3}];function d(i){const e={h3:"h3",img:"img",li:"li",p:"p",ul:"ul",...(0,s.R)(),...i.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(e.h3,{id:"\u6982\u8ff0",children:"\u6982\u8ff0"}),"\n",(0,n.jsx)(e.p,{children:"Pika \u4e00\u6b3e\u5f00\u6e90\u7684\u9ad8\u6027\u80fd\u6301\u4e45\u5316\u7684NoSQL\u4ea7\u54c1\uff0c\u517c\u5bb9Redis\u534f\u8bae\uff0c\u6570\u636e\u6301\u4e45\u5316\u5b58\u50a8\u5230RocksDB\u5b58\u50a8\u5f15\u64ce\uff0c\u5177\u6709\u4e24\u79cd\u8fd0\u884c\u6a21\u5f0f\uff1a \u7ecf\u5178\u6a21\u5f0f\uff08Classic\uff09 & \u5206\u5e03\u5f0f\u6a21\u5f0f\uff08Sharding\uff09\u3002"}),"\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsx)(e.li,{children:"\u7ecf\u5178\u6a21\u5f0f\uff08Classic\uff09\uff1a \u53731\u4e3bN\u4ece\u540c\u6b65\u6a21\u5f0f\uff0c1\u4e2a\u4e3b\u5b9e\u4f8b\u5b58\u50a8\u6240\u6709\u7684\u6570\u636e\uff0cN\u4e2a\u4ece\u5b9e\u4f8b\u5b8c\u5168\u955c\u50cf\u540c\u6b65\u4e3b\u5b9e\u4f8b\u7684\u6570\u636e\uff0c\u6bcf\u4e2a\u5b9e\u4f8b\u652f\u6301\u591a\u4e2aDBs\u3002DB\u9ed8\u8ba4\u4ece0\u5f00\u59cb\uff0cPika\u7684\u914d\u7f6e\u9879databases\u53ef\u4ee5\u8bbe\u7f6e\u6700\u5927DB\u6570\u91cf\u3002DB\u5728Pika\u4e0a\u7684\u7269\u7406\u5b58\u5728\u5f62\u5f0f\u662f\u4e00\u4e2a\u6587\u4ef6\u76ee\u5f55\u3002"}),"\n",(0,n.jsx)(e.li,{children:"\u5206\u5e03\u5f0f\u6a21\u5f0f\uff08Sharding\uff09\uff1a Sharding\u6a21\u5f0f\u4e0b\uff0c\u5c06\u7528\u6237\u5b58\u50a8\u7684\u6570\u636e\u96c6\u5408\u79f0\u4e3aTable\uff0c\u6bcf\u4e2aTable\u5207\u5206\u6210\u591a\u4e2a\u5206\u7247\uff0c\u6bcf\u4e2a\u5206\u7247\u79f0\u4e3aSlot\uff0c\u5bf9\u4e8e\u67d0\u4e00\u4e2aKEY\u7684\u6570\u636e\u7531\u54c8\u5e0c\u7b97\u6cd5\u8ba1\u7b97\u51b3\u5b9a\u5c5e\u4e8e\u54ea\u4e2aSlot\u3002\u5c06\u6240\u6709Slots\u53ca\u5176\u526f\u672c\u6309\u7167\u4e00\u5b9a\u7b56\u7565\u5206\u6563\u5230\u6240\u6709\u7684Pika\u5b9e\u4f8b\u4e2d\uff0c\u6bcf\u4e2aPika\u5b9e\u4f8b\u6709\u4e00\u90e8\u5206\u4e3bSlot\u548c\u4e00\u90e8\u5206\u4eceSlot\u3002\u5728Sharding\u6a21\u5f0f\u4e0b\uff0c\u5206\u4e3b\u4ece\u7684\u662fSlot\u800c\u4e0d\u518d\u662fPika\u5b9e\u4f8b\u3002Slot\u5728Pika\u4e0a\u7684\u7269\u7406\u5b58\u5728\u5f62\u5f0f\u662f\u4e00\u4e2a\u6587\u4ef6\u76ee\u5f55\u3002"}),"\n"]}),"\n",(0,n.jsx)(e.p,{children:"Pika\u53ef\u4ee5\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684instance-mode\u914d\u7f6e\u9879\uff0c\u8bbe\u7f6e\u4e3aclassic\u548csharding\uff0c\u6765\u9009\u62e9\u8fd0\u884c\u7ecf\u5178\u6a21\u5f0f\uff08Classic\uff09\u8fd8\u662f\u5206\u5e03\u5f0f\u6a21\u5f0f\uff08Sharding\uff09\u7684Pika\u3002"}),"\n",(0,n.jsx)(e.h3,{id:"1-\u7ecf\u5178\u4e3b\u4ece\u6a21\u5f0f",children:"1. \u7ecf\u5178\uff08\u4e3b\u4ece\uff09\u6a21\u5f0f"}),"\n",(0,n.jsx)(e.p,{children:(0,n.jsx)(e.img,{src:"https://raw.githubusercontent.com/simpcl/simpcl.github.io/master/PikaClassic.png",alt:""})}),"\n",(0,n.jsx)(e.h3,{id:"2-\u5206\u5e03\u5f0f\u6a21\u5f0f",children:"2. \u5206\u5e03\u5f0f\u6a21\u5f0f"}),"\n",(0,n.jsx)(e.p,{children:(0,n.jsx)(e.img,{src:"https://raw.githubusercontent.com/simpcl/simpcl.github.io/master/PikaCluster.png",alt:""})})]})}function u(i={}){const{wrapper:e}={...(0,s.R)(),...i.components};return e?(0,n.jsx)(e,{...i,children:(0,n.jsx)(d,{...i})}):d(i)}},8453:(i,e,t)=>{t.d(e,{R:()=>a,x:()=>o});var n=t(6540);const s={},r=n.createContext(s);function a(i){const e=n.useContext(r);return n.useMemo((function(){return"function"==typeof i?i(e):{...e,...i}}),[e,i])}function o(i){let e;return e=i.disableParentContext?"function"==typeof i.components?i.components(s):i.components||s:a(i.components),n.createElement(r.Provider,{value:e},i.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/1b3a196b.557d332c.js b/build/assets/js/1b3a196b.557d332c.js new file mode 100644 index 0000000..6ab61e5 --- /dev/null +++ b/build/assets/js/1b3a196b.557d332c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[8140],{3301:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>d,metadata:()=>r,toc:()=>c});var t=i(4848),s=i(8453);const d={title:"\u6570\u636e\u76ee\u5f55",sidebar_position:30},o=void 0,r={id:"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u6570\u636e\u76ee\u5f55/index",title:"\u6570\u636e\u76ee\u5f55",description:"db\u76ee\u5f55",source:"@site/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u6570\u636e\u76ee\u5f55/index.md",sourceDirName:"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u6570\u636e\u76ee\u5f55",slug:"/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u6570\u636e\u76ee\u5f55/",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u6570\u636e\u76ee\u5f55/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u6570\u636e\u76ee\u5f55/index.md",tags:[],version:"current",sidebarPosition:30,frontMatter:{title:"\u6570\u636e\u76ee\u5f55",sidebar_position:30},sidebar:"tutorialSidebar",previous:{title:"page info \u4fe1\u606f\u8bf4\u660e",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/page info \u4fe1\u606f\u8bf4\u660e/"},next:{title:"\u7ba1\u7406\u6307\u4ee4",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u7ba1\u7406\u6307\u4ee4/"}},l={},c=[{value:"db\u76ee\u5f55",id:"db\u76ee\u5f55",level:4},{value:"log\u76ee\u5f55",id:"log\u76ee\u5f55",level:4},{value:"dump\u76ee\u5f55",id:"dump\u76ee\u5f55",level:4},{value:"pid\u76ee\u5f55",id:"pid\u76ee\u5f55",level:4},{value:"dbsync\u76ee\u5f55",id:"dbsync\u76ee\u5f55",level:4}];function a(e){const n={h4:"h4",p:"p",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h4,{id:"db\u76ee\u5f55",children:"db\u76ee\u5f55"}),"\n",(0,t.jsx)(n.p,{children:"\u7528\u4e8e\u5b58\u653epika\u7684\u6240\u6709\u6570\u636e\u6587\u4ef6\uff0c\u5305\u542b5\u4e2a\u5b50\u76ee\u5f55\uff085\u5927\u6570\u636e\u7c7b\u578b\uff09\u5b83\u4eec\u662f\uff1akv\uff0cset\uff0czset\uff0chash\uff0clist\uff0c\u4ecepika3.0.0\u5f00\u59cb\uff0c\u8fd9\u4e9b\u6570\u636e\u7ed3\u6784\u76ee\u5f55\u4e3a\uff1ahashes\uff0clists\uff0csets\uff0cstrings\uff0czsets"}),"\n",(0,t.jsx)(n.h4,{id:"log\u76ee\u5f55",children:"log\u76ee\u5f55"}),"\n",(0,t.jsx)(n.p,{children:"\u7528\u4e8e\u5b58\u653e\u6240\u6709\u65e5\u5fd7\u6587\u4ef6\uff0c\u5305\u542b\uff1a\u4e00\u822c\u65e5\u5fd7\u3001\u8b66\u544a\u65e5\u5fd7\u3001\u9519\u8bef\u65e5\u5fd7\u3001\u540c\u6b65\u65e5\u5fd7\uff08binlog\uff09\u3001\u540c\u6b65\u65e5\u5fd7\u8282\u70b9\u4fe1\u606f\u6587\u4ef6\uff08mainfest\uff09"}),"\n",(0,t.jsx)(n.h4,{id:"dump\u76ee\u5f55",children:"dump\u76ee\u5f55"}),"\n",(0,t.jsx)(n.p,{children:"\u7528\u4e8e\u5b58\u653e\u5feb\u7167\u5f0f\u5907\u4efd\u4ea7\u751f\u7684\u6587\u4ef6"}),"\n",(0,t.jsx)(n.h4,{id:"pid\u76ee\u5f55",children:"pid\u76ee\u5f55"}),"\n",(0,t.jsx)(n.p,{children:"\u7528\u4e8e\u5b58\u653epika\u7684pid\u6587\u4ef6"}),"\n",(0,t.jsx)(n.h4,{id:"dbsync\u76ee\u5f55",children:"dbsync\u76ee\u5f55"}),"\n",(0,t.jsx)(n.p,{children:"\u7528\u4e8e\u4e3b\u4ece\u5168\u91cf\u540c\u6b65\u65f6\u5b58\u653e\u5168\u91cf\u540c\u6b65\u6240\u9700\u7684\u6587\u4ef6"})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>r});var t=i(6540);const s={},d=t.createContext(s);function o(e){const n=t.useContext(d);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(d.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/2237.be965d46.js b/build/assets/js/2237.be965d46.js new file mode 100644 index 0000000..95a9206 --- /dev/null +++ b/build/assets/js/2237.be965d46.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[2237],{3363:(e,t,i)=>{i.d(t,{A:()=>r});i(6540);var n=i(4164),o=i(1312),s=i(1107),a=i(4848);function r(e){let{className:t}=e;return(0,a.jsx)("main",{className:(0,n.A)("container margin-vert--xl",t),children:(0,a.jsx)("div",{className:"row",children:(0,a.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,a.jsx)(s.A,{as:"h1",className:"hero__title",children:(0,a.jsx)(o.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,a.jsx)("p",{children:(0,a.jsx)(o.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,a.jsx)("p",{children:(0,a.jsx)(o.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}},2237:(e,t,i)=>{i.r(t),i.d(t,{default:()=>l});i(6540);var n=i(1312),o=i(1213),s=i(781),a=i(3363),r=i(4848);function l(){const e=(0,n.T)({id:"theme.NotFound.title",message:"Page Not Found"});return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(o.be,{title:e}),(0,r.jsx)(s.A,{children:(0,r.jsx)(a.A,{})})]})}}}]); \ No newline at end of file diff --git a/build/assets/js/2571fc76.ca7462da.js b/build/assets/js/2571fc76.ca7462da.js new file mode 100644 index 0000000..63146c0 --- /dev/null +++ b/build/assets/js/2571fc76.ca7462da.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[9974],{4909:(n,i,t)=>{t.r(i),t.d(i,{assets:()=>h,contentTitle:()=>s,default:()=>u,frontMatter:()=>o,metadata:()=>p,toc:()=>a});var e=t(4848),l=t(8453);const o={title:"What's new in Pika v3.5.0",slug:"Pika-3.5.0",authors:[{name:"\u4e8e\u96e8",title:"dubbogo\u793a\u571f\u533a"}],hide_table_of_contents:!1},s=void 0,p={permalink:"/blog/Pika-3.5.0",source:"@site/blog/2023-08-25-Pika-3.5.0.md",title:"What's new in Pika v3.5.0",description:"\u65f6\u9694\u4e24\u5e74\uff0cPika \u793e\u533a\u6b63\u5f0f\u53d1\u5e03\u7ecf\u7531\u793e\u533a 50 \u591a\u4eba\u53c2\u4e0e\u5f00\u53d1\u5e76\u5728 360 \u751f\u4ea7\u73af\u5883\u9a8c\u8bc1\u53ef\u7528\u7684 v3.5.0 \u7248\u672c\uff0c\u65b0\u7248\u672c\u5728\u63d0\u5347\u6027\u80fd\u7684\u540c\u65f6\uff0c\u4e5f\u652f\u6301\u4e86 Codis \u96c6\u7fa4\u90e8\u7f72\uff0cBlobDB KV \u5206\u79bb\uff0c\u589e\u52a0 Exporter \u7b49\u65b0\u7279\u6027\u3002",date:"2023-08-25T00:00:00.000Z",tags:[],readingTime:9.825,hasTruncateMarker:!1,authors:[{name:"\u4e8e\u96e8",title:"dubbogo\u793a\u571f\u533a"}],frontMatter:{title:"What's new in Pika v3.5.0",slug:"Pika-3.5.0",authors:[{name:"\u4e8e\u96e8",title:"dubbogo\u793a\u571f\u533a"}],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"What's new in Pika v3.5.1",permalink:"/blog/Pika-3.5.1"},nextItem:{title:"Pika Blackwidow \u5f15\u64ce\u6570\u636e\u5b58\u50a8\u683c\u5f0f",permalink:"/blog/pika-blackwidow"}},h={authorsImageUrls:[void 0]},a=[{value:"1 \u53bb\u9664 Rsync",id:"1-\u53bb\u9664-rsync",level:2},{value:"2 \u517c\u5bb9\u66f4\u591a Redis \u547d\u4ee4",id:"2-\u517c\u5bb9\u66f4\u591a-redis-\u547d\u4ee4",level:2},{value:"3 RocksDB \u7248\u672c\u5347\u7ea7\u548c\u5206\u7ea7\u538b\u7f29",id:"3-rocksdb-\u7248\u672c\u5347\u7ea7\u548c\u5206\u7ea7\u538b\u7f29",level:2},{value:"4 \u652f\u6301 BlobDB",id:"4-\u652f\u6301-blobdb",level:2},{value:"5 \u57fa\u4e8e Codis \u7684\u96c6\u7fa4\u6a21\u5f0f",id:"5-\u57fa\u4e8e-codis-\u7684\u96c6\u7fa4\u6a21\u5f0f",level:2},{value:"6 \u53ef\u89c2\u6d4b\u6027",id:"6-\u53ef\u89c2\u6d4b\u6027",level:2},{value:"7 \u5bb9\u5668\u5316\u90e8\u7f72",id:"7-\u5bb9\u5668\u5316\u90e8\u7f72",level:2},{value:"8 \u8de8\u5e73\u53f0\u7f16\u8bd1",id:"8-\u8de8\u5e73\u53f0\u7f16\u8bd1",level:2},{value:"9 \u591a\u5e73\u53f0\u96c6\u6210\u6d4b\u8bd5\u53ca\u5355\u5143\u6d4b\u8bd5",id:"9-\u591a\u5e73\u53f0\u96c6\u6210\u6d4b\u8bd5\u53ca\u5355\u5143\u6d4b\u8bd5",level:2},{value:"10 Others",id:"10-others",level:2}];function d(n){const i={a:"a",h2:"h2",img:"img",li:"li",p:"p",ul:"ul",...(0,l.R)(),...n.components};return(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)(i.p,{children:"\u65f6\u9694\u4e24\u5e74\uff0cPika \u793e\u533a\u6b63\u5f0f\u53d1\u5e03\u7ecf\u7531\u793e\u533a 50 \u591a\u4eba\u53c2\u4e0e\u5f00\u53d1\u5e76\u5728 360 \u751f\u4ea7\u73af\u5883\u9a8c\u8bc1\u53ef\u7528\u7684 v3.5.0 \u7248\u672c\uff0c\u65b0\u7248\u672c\u5728\u63d0\u5347\u6027\u80fd\u7684\u540c\u65f6\uff0c\u4e5f\u652f\u6301\u4e86 Codis \u96c6\u7fa4\u90e8\u7f72\uff0cBlobDB KV \u5206\u79bb\uff0c\u589e\u52a0 Exporter \u7b49\u65b0\u7279\u6027\u3002"}),"\n",(0,e.jsx)(i.p,{children:"\u6211\u4eec\u5c06\u8be6\u7ec6\u4ecb\u7ecd\u8be5\u7248\u672c\u5f15\u5165\u7684\u91cd\u8981\u65b0\u7279\u6027\u3002"}),"\n",(0,e.jsx)(i.h2,{id:"1-\u53bb\u9664-rsync",children:"1 \u53bb\u9664 Rsync"}),"\n",(0,e.jsx)(i.p,{children:"\u5728 v3.5.0 \u7248\u672c\u4e4b\u524d\uff0cPika \u4f7f\u7528 Rsync \u5de5\u5177\u8fdb\u884c\u5f15\u64ce\u4e2d\u5b58\u91cf\u6570\u636e\u7684\u540c\u6b65\uff0cPika \u8fdb\u7a0b\u542f\u52a8\u65f6\u521b\u5efa Rsync \u5b50\u8fdb\u7a0b\u3002\u8fd9\u79cd\u540c\u6b65\u65b9\u5f0f\u5728\u5b9e\u9645\u4f7f\u7528\u4e2d\u51fa\u73b0\u4e86\u4e00\u4e9b\u95ee\u9898\uff0c\u5305\u62ecPika \u8fdb\u7a0b crash \u540e\u91cd\u65b0\u62c9\u8d77\u65e0\u6cd5\u6b63\u5e38\u540c\u6b65\u4ee5\u53ca\u540c\u6b65\u8fc7\u7a0b\u4e2d Rsync \u8fdb\u7a0b\u65e0\u6545\u9000\u51fa\u7b49\u3002\u5728\u4eca\u5e74\u53d1\u5e03\u7684 v3.5.0 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u5728\u5168\u91cf\u540c\u6b65\u65b9\u6848\u65b9\u9762\u8fdb\u884c\u4e86\u91cd\u8981\u7684\u6539\u8fdb\uff0c\u6452\u5f03\u4e86\u4ee5\u5f80\u4f7f\u7528\u7684 Rsync\uff0c\u5b9e\u73b0\u4e86\u5168\u65b0\u7684\u6570\u636e\u540c\u6b65\u65b9\u6848\uff0c\u652f\u6301\u4e86\u65ad\u70b9\u7eed\u4f20\uff0c\u52a8\u6001\u8c03\u8282\u4f20\u8f93\u9650\u901f\u7b49\u7279\u6027\uff0c\u4ee5\u786e\u4fdd\u540c\u6b65\u8fc7\u7a0b\u66f4\u52a0\u7a33\u5b9a\u3001\u53ef\u63a7\u3002\u8fd9\u4e9b\u6539\u8fdb\u4e0d\u4ec5\u589e\u5f3a\u4e86\u540c\u6b65\u7684\u53ef\u9760\u6027\uff0c\u8fd8\u4e3a\u7528\u6237\u63d0\u4f9b\u4e86\u66f4\u597d\u7684\u4f7f\u7528\u4f53\u9a8c\u3002"}),"\n",(0,e.jsxs)(i.ul,{children:["\n",(0,e.jsxs)(i.li,{children:["\n",(0,e.jsxs)(i.p,{children:["\u53bb\u9664 Rsync \u8fdb\u7a0b\uff0c\u4f7f\u7528\u81ea\u7814\u5168\u91cf\u540c\u6b65\u65b9\u5f0f\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1805",children:"https://github.com/OpenAtomFoundation/pika/pull/1805"})]}),"\n"]}),"\n",(0,e.jsxs)(i.li,{children:["\n",(0,e.jsxs)(i.p,{children:["\u5b9e\u73b0\u65ad\u70b9\u7eed\u4f20\uff0c\u4f20\u8f93\u9650\u901f\u529f\u80fd\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1926",children:"https://github.com/OpenAtomFoundation/pika/pull/1926"})]}),"\n"]}),"\n",(0,e.jsxs)(i.li,{children:["\n",(0,e.jsxs)(i.p,{children:["Pika \u4e3b\u4ece\u540c\u6b65\u65f6\uff0c\u8fdb\u884c master run_id \u7684\u68c0\u9a8c\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1805",children:"https://github.com/OpenAtomFoundation/pika/pull/1805"})]}),"\n"]}),"\n"]}),"\n",(0,e.jsx)(i.h2,{id:"2-\u517c\u5bb9\u66f4\u591a-redis-\u547d\u4ee4",children:"2 \u517c\u5bb9\u66f4\u591a Redis \u547d\u4ee4"}),"\n",(0,e.jsx)(i.p,{children:"\u5728 v3.5.0 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u8fc8\u51fa\u4e86\u66f4\u5927\u7684\u4e00\u6b65\uff0c\u63d0\u5347\u4e86\u5bf9 Redis \u547d\u4ee4\u7684\u517c\u5bb9\u6027\uff0c\u5bf9 Redis \u547d\u4ee4\u63d0\u4f9b\u4e86\u66f4\u5e7f\u6cdb\u7684\u652f\u6301\u3002\u8fd9\u4e2a\u7248\u672c\u7684\u6539\u8fdb\u4f7f\u5f97 Pika \u5728\u4e0e Redis \u751f\u6001\u7cfb\u7edf\u7684\u96c6\u6210\u4e2d\u8868\u73b0\u66f4\u52a0\u51fa\u8272\uff0c\u4e3a\u7528\u6237\u63d0\u4f9b\u4e86\u66f4\u4e30\u5bcc\u7684\u529f\u80fd\u548c\u66f4\u5e7f\u9614\u7684\u53ef\u80fd\u6027\u3002\u6211\u4eec\u5bf9\u547d\u4ee4\u652f\u6301\u7684\u6269\u5c55\uff0c\u4e3a\u7528\u6237\u63d0\u4f9b\u4e86\u66f4\u591a\u7684\u7075\u6d3b\u6027\uff0c\u4ee5\u6ee1\u8db3\u4e0d\u540c\u573a\u666f\u4e0b\u7684\u9700\u6c42\u3002"}),"\n",(0,e.jsxs)(i.ul,{children:["\n",(0,e.jsxs)(i.li,{children:["\u652f\u6301 UNLINK \u547d\u4ee4\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1273",children:"https://github.com/OpenAtomFoundation/pika/pull/1273"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u652f\u6301 INFO COMMANDSTATS \u547d\u4ee4\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1660",children:"https://github.com/OpenAtomFoundation/pika/pull/1660"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u652f\u6301 HELLO\u3001SETNAME \u547d\u4ee4\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1245",children:"https://github.com/OpenAtomFoundation/pika/pull/1245"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u652f\u6301 BLPOP\u3001BRPOP \u547d\u4ee4\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1548",children:"https://github.com/OpenAtomFoundation/pika/pull/1548"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u65b0\u589e Pika \u539f\u521b DISKRECOVERY \u547d\u4ee4\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1843",children:"https://github.com/OpenAtomFoundation/pika/pull/1843"})]}),"\n"]}),"\n",(0,e.jsx)(i.h2,{id:"3-rocksdb-\u7248\u672c\u5347\u7ea7\u548c\u5206\u7ea7\u538b\u7f29",children:"3 RocksDB \u7248\u672c\u5347\u7ea7\u548c\u5206\u7ea7\u538b\u7f29"}),"\n",(0,e.jsx)(i.p,{children:"\u5728 v3.5.0 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u8fdb\u884c\u4e86\u4e00\u9879\u91cd\u8981\u7684\u5347\u7ea7\uff0c\u5c06 RocksDB \u5f15\u64ce\u5347\u7ea7\u81f3 v8.1.1 \u7248\u672c\uff0c\u5e76\u5b9e\u73b0\u4e86\u5206\u7ea7\u538b\u7f29\u529f\u80fd\u7684\u6574\u5408\u3002\u8fd9\u4e00\u5347\u7ea7\u4e0d\u4ec5\u662f\u6280\u672f\u7684\u98de\u8dc3\uff0c\u4e5f\u662f\u6211\u4eec\u5bf9\u7cfb\u7edf\u6027\u80fd\u548c\u4f18\u5316\u7684\u6301\u7eed\u5173\u6ce8\u7684\u4f53\u73b0\u3002\u901a\u8fc7\u8fd9\u9879\u5347\u7ea7\uff0c\u6211\u4eec\u4e3a Pika \u589e\u52a0\u4e86\u66f4\u9ad8\u7ea7\u522b\u7684\u6570\u636e\u7ba1\u7406\u80fd\u529b\uff0c\u540c\u65f6\u4e5f\u8ba9\u7cfb\u7edf\u66f4\u597d\u5730\u9002\u5e94\u4e0d\u540c\u7684\u538b\u7f29\u9700\u6c42\uff0c\u4e3a\u7528\u6237\u7684\u6570\u636e\u5b58\u50a8\u548c\u68c0\u7d22\u63d0\u4f9b\u4e86\u66f4\u5927\u7684\u7075\u6d3b\u6027\u548c\u6548\u7387\u3002"}),"\n",(0,e.jsxs)(i.ul,{children:["\n",(0,e.jsxs)(i.li,{children:["\u5347\u7ea7 RocksDB \u7248\u672c\u5230 v8.1.1\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1396",children:"https://github.com/OpenAtomFoundation/pika/pull/1396"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u5b9e\u73b0 RocksDB \u5206\u7ea7\u538b\u7f29\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1365",children:"https://github.com/OpenAtomFoundation/pika/pull/1365"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u65b0\u589e RocksDB \u7f13\u5b58\u914d\u7f6e\u9879 num-shard-bits \u80fd\u591f\u4ece\u914d\u7f6e\u6587\u4ef6\u4e2d\u8bfb\u53d6\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1189",children:"https://github.com/OpenAtomFoundation/pika/pull/1189"})]}),"\n"]}),"\n",(0,e.jsx)(i.h2,{id:"4-\u652f\u6301-blobdb",children:"4 \u652f\u6301 BlobDB"}),"\n",(0,e.jsx)(i.p,{children:"\u5728 v3.5.0 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u5f15\u5165\u4e86\u5f15\u4eba\u77a9\u76ee\u7684\u521b\u65b0--\u5bf9 BlobDB \u548c KV \u5b58\u50a8\u5c42\u8fdb\u884c\u4e86\u5206\u79bb\uff0c\u4e3a\u6211\u4eec\u7684\u7cfb\u7edf\u6ce8\u5165\u4e86\u65b0\u7684\u6d3b\u529b\u3002\u8fd9\u4e2a\u7248\u672c\u7684\u5347\u7ea7\u4f7f\u5f97 Pika \u5728\u6570\u636e\u5b58\u50a8\u65b9\u9762\u66f4\u52a0\u7075\u6d3b\u548c\u9ad8\u6548\u3002\u6211\u4eec\u901a\u8fc7\u652f\u6301 BlobDB KV \u5206\u79bb\uff0c\u63d0\u4f9b\u4e86\u66f4\u4f18\u5316\u7684\u6570\u636e\u5b58\u50a8\u7ed3\u6784\uff0c\u4e3a\u7528\u6237\u7684\u6570\u636e\u7ba1\u7406\u548c\u67e5\u8be2\u64cd\u4f5c\u5e26\u6765\u4e86\u66f4\u6df1\u5c42\u6b21\u7684\u4f18\u52bf\u3002\u8fd9\u4e00\u91cd\u8981\u6539\u8fdb\u5c06\u5728\u66f4\u591a\u5e94\u7528\u573a\u666f\u4e0b\u5c55\u73b0\u51fa\u5176\u5f3a\u5927\u7684\u6f5c\u529b\u3002"}),"\n",(0,e.jsxs)(i.ul,{children:["\n",(0,e.jsxs)(i.li,{children:["\u652f\u6301 BlobDB KV \u5206\u79bb\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1456",children:"https://github.com/OpenAtomFoundation/pika/pull/1456"})]}),"\n"]}),"\n",(0,e.jsx)(i.h2,{id:"5-\u57fa\u4e8e-codis-\u7684\u96c6\u7fa4\u6a21\u5f0f",children:"5 \u57fa\u4e8e Codis \u7684\u96c6\u7fa4\u6a21\u5f0f"}),"\n",(0,e.jsx)(i.p,{children:"\u5728 v3.5.0 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u79ef\u6781\u5f15\u5165\u4e86 Codis \u96c6\u7fa4\u6a21\u5f0f\uff0c\u6b64\u5916\uff0c\u6211\u4eec\u4e0d\u4ec5\u4ec5\u5c06 Codis \u96c6\u7fa4\u6a21\u5f0f\u878d\u5165\u4e86\u7cfb\u7edf\u4e2d\uff0c\u8fd8\u4e3a\u5176\u63d0\u4f9b\u4e86\u8fc1\u79fb slot \u7684\u547d\u4ee4\u652f\u6301\uff0c\u4ece\u800c\u5b9e\u73b0\u4e86\u66f4\u52a0\u667a\u80fd\u5316\u7684\u96c6\u7fa4\u7ba1\u7406\u3002\u8fd9\u4e00\u91cd\u5927\u53d8\u9769\u4e0d\u4ec5\u6269\u5c55\u4e86 Pika \u5728\u5927\u89c4\u6a21\u6570\u636e\u5b58\u50a8\u573a\u666f\u4e2d\u7684\u5e94\u7528\u8303\u56f4\uff0c\u8fd8\u8fdb\u4e00\u6b65\u63d0\u5347\u4e86\u7cfb\u7edf\u7684\u53ef\u6269\u5c55\u6027\u548c\u9ad8\u53ef\u7528\u6027\u3002\u901a\u8fc7\u5f15\u5165 Codis \u96c6\u7fa4\u6a21\u5f0f\uff0c\u6211\u4eec\u5bf9\u7528\u6237\u7684\u6570\u636e\u5904\u7406\u548c\u7ba1\u7406\u63d0\u4f9b\u4e86\u66f4\u4f18\u5316\u7684\u89e3\u51b3\u65b9\u6848\u3002"}),"\n",(0,e.jsxs)(i.ul,{children:["\n",(0,e.jsxs)(i.li,{children:["\n",(0,e.jsx)(i.p,{children:"\u5f15\u5165 Codis \u5230 Pika"}),"\n",(0,e.jsx)(i.p,{children:(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1279",children:"https://github.com/OpenAtomFoundation/pika/pull/1279"})}),"\n"]}),"\n",(0,e.jsxs)(i.li,{children:["\n",(0,e.jsx)(i.p,{children:"\u5f15\u5165 Codis \u7684 CI"}),"\n",(0,e.jsx)(i.p,{children:(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1311",children:"https://github.com/OpenAtomFoundation/pika/pull/1311"})}),"\n"]}),"\n",(0,e.jsxs)(i.li,{children:["\n",(0,e.jsx)(i.p,{children:"\u652f\u6301 Codis \u8fc1\u79fb slot \u547d\u4ee4"}),"\n",(0,e.jsx)(i.p,{children:(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1632",children:"https://github.com/OpenAtomFoundation/pika/pull/1632"})}),"\n"]}),"\n",(0,e.jsxs)(i.li,{children:["\n",(0,e.jsx)(i.p,{children:"\u65b0\u589e\u662f\u5426\u5728 reload \u7684 slotmigrate \u72b6\u6001"}),"\n",(0,e.jsx)(i.p,{children:(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1700",children:"https://github.com/OpenAtomFoundation/pika/pull/1700"})}),"\n"]}),"\n"]}),"\n",(0,e.jsx)(i.h2,{id:"6-\u53ef\u89c2\u6d4b\u6027",children:"6 \u53ef\u89c2\u6d4b\u6027"}),"\n",(0,e.jsx)(i.p,{children:"\u5728 v3.5.0 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u5f15\u5165\u4e86\u4e00\u4e2a\u521b\u65b0\u6027\u7684\u5de5\u5177--pika_exporter\uff0c\u4ee5\u63d0\u5347\u5bf9 Pika \u6570\u636e\u5e93\u7684\u53ef\u89c2\u6d4b\u6027\u3002\u8fd9\u4e00\u5de5\u5177\u7684\u52a0\u5165\u4e0d\u4ec5\u662f\u5bf9\u6211\u4eec\u5bf9\u7cfb\u7edf\u76d1\u6d4b\u80fd\u529b\u7684\u6301\u7eed\u589e\u5f3a\u7684\u53cd\u6620\u3002\u800c\u5728\u7248\u672c\u7684\u540e\u7eed\u66f4\u65b0\u4e2d\uff0c\u6211\u4eec\u8fdb\u4e00\u6b65\u5145\u5b9e\u4e86\u6307\u6807\uff0c\u4e0d\u65ad\u4e30\u5bcc\u4e86 Pika \u7684\u53ef\u89c2\u6d4b\u6027\u3002\u4e3a\u7528\u6237\u63d0\u4f9b\u4e86\u66f4\u4e3a\u5168\u9762\u548c\u7cbe\u51c6\u7684\u6570\u636e\u6d1e\u5bdf\u529b\u3002"}),"\n",(0,e.jsxs)(i.ul,{children:["\n",(0,e.jsxs)(i.li,{children:["\n",(0,e.jsx)(i.p,{children:"\u65b0\u589e Pika \u53ef\u89c2\u6d4b\u7cfb\u7edf pika_exporter"}),"\n",(0,e.jsx)(i.p,{children:(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1388",children:"https://github.com/OpenAtomFoundation/pika/pull/1388"})}),"\n"]}),"\n",(0,e.jsxs)(i.li,{children:["\n",(0,e.jsx)(i.p,{children:"\u65b0\u589e\u7f51\u7edc I/O \u6d41\u91cf\u76d1\u63a7\u6307\u6807"}),"\n",(0,e.jsx)(i.p,{children:(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1733",children:"https://github.com/OpenAtomFoundation/pika/pull/1733"})}),"\n"]}),"\n",(0,e.jsxs)(i.li,{children:["\n",(0,e.jsx)(i.p,{children:"\u65b0\u589e\u547d\u4ee4\u7edf\u8ba1\u8017\u65f6\u6307\u6807"}),"\n",(0,e.jsx)(i.p,{children:(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1751",children:"https://github.com/OpenAtomFoundation/pika/pull/1751"})}),"\n"]}),"\n",(0,e.jsxs)(i.li,{children:["\n",(0,e.jsx)(i.p,{children:"\u65b0\u589e estimate_pending_compaction_bytes \u5ea6\u91cf\u6765\u5206\u6790\u788e\u7247\u7387\u6307\u6807"}),"\n",(0,e.jsx)(i.p,{children:(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1736",children:"https://github.com/OpenAtomFoundation/pika/pull/1736"})}),"\n"]}),"\n",(0,e.jsxs)(i.li,{children:["\n",(0,e.jsx)(i.p,{children:"\u65b0\u589e RocksDB \u6307\u6807"}),"\n",(0,e.jsx)(i.p,{children:(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1560",children:"https://github.com/OpenAtomFoundation/pika/pull/1560"})}),"\n"]}),"\n"]}),"\n",(0,e.jsx)(i.h2,{id:"7-\u5bb9\u5668\u5316\u90e8\u7f72",children:"7 \u5bb9\u5668\u5316\u90e8\u7f72"}),"\n",(0,e.jsx)(i.p,{children:"\u5728 v3.5.0 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u5f15\u5165\u4e86\u4e00\u4e2a\u5177\u6709\u521b\u65b0\u610f\u4e49\u7684\u91cc\u7a0b\u7891--pika-operator mvp \u7248\u672c\uff0c\u8fd9\u4e00\u7248\u672c\u5728\u6280\u672f\u4e0a\u5b9e\u73b0\u4e86\u4e00\u4e2a\u91cd\u8981\u76ee\u6807\uff1a\u5c06 Pika \u5355\u5b9e\u4f8b\u670d\u52a1\u8fc1\u79fb\u5230 Kubernetes\uff08K8s\uff09\u5e73\u53f0\u4e0a\u7684\u5feb\u901f\u90e8\u7f72\u3002\u8fd9\u4e0d\u4ec5\u662f\u5bf9\u6211\u4eec\u6301\u7eed\u5173\u6ce8\u884c\u4e1a\u53d1\u5c55\u7684\u4f53\u73b0\uff0c\u4e5f\u662f\u6211\u4eec\u4e0d\u65ad\u63d0\u5347\u7528\u6237\u4f53\u9a8c\u7684\u8ffd\u6c42\u3002\u901a\u8fc7 pika-operator\uff0c\u6211\u4eec\u4e3a\u7528\u6237\u63d0\u4f9b\u4e86\u66f4\u4fbf\u6377\u7684\u90e8\u7f72\u65b9\u6848\uff0c\u5c06 Pika \u7684\u9ad8\u6027\u80fd\u6570\u636e\u5e93\u5f15\u64ce\u4e0e Kubernetes \u7684\u7075\u6d3b\u6027\u76f8\u878d\u5408\uff0c\u4ece\u800c\u4e3a\u7528\u6237\u7684\u5e94\u7528\u73af\u5883\u5e26\u6765\u66f4\u9ad8\u6548\u3001\u66f4\u5f39\u6027\u7684\u652f\u6301\u3002"}),"\n",(0,e.jsxs)(i.ul,{children:["\n",(0,e.jsxs)(i.li,{children:["\u5b9e\u73b0 Pika \u5355\u4f8b\u670d\u52a1\u5728 K8s \u4e0a\u5feb\u901f\u90e8\u7f72\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1243",children:"https://github.com/OpenAtomFoundation/pika/pull/1243"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u5b9e\u73b0\u4e86\u5728 MiniKube \u73af\u5883\u4e2d\u90e8\u7f72 Pika\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1330",children:"https://github.com/OpenAtomFoundation/pika/pull/1330"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u7ed9 pika-operator \u6dfb\u52a0 E2E \u6d4b\u8bd5\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1347",children:"https://github.com/OpenAtomFoundation/pika/pull/1347"})]}),"\n"]}),"\n",(0,e.jsx)(i.h2,{id:"8-\u8de8\u5e73\u53f0\u7f16\u8bd1",children:"8 \u8de8\u5e73\u53f0\u7f16\u8bd1"}),"\n",(0,e.jsx)(i.p,{children:"\u5728 v3.5.0 \u7248\u672c\u4e2d\uff0cPika \u5448\u73b0\u51fa\u4e00\u79cd\u5168\u9762\u6027\u7684\u84ec\u52c3\u53d1\u5c55\u6001\u52bf\uff0c\u5f97\u4ee5\u5728\u4e0d\u540c\u64cd\u4f5c\u7cfb\u7edf\u5e73\u53f0\u4e0a\u5c55\u73b0\u5176\u4f18\u8d8a\u6027\u3002\u6b64\u7248\u672c\u7684\u7a81\u7834\u6027\u4e4b\u5904\u5728\u4e8e\uff0cPika \u5b9e\u73b0\u4e86\u5bf9 MacOS\u3001CentOS \u548c Ubuntu \u8fd9\u4e9b\u4e3b\u8981\u5e73\u53f0\u7684\u5b8c\u6574\u7f16\u8bd1\u548c\u4f7f\u7528\u652f\u6301\u3002\u8fd9\u4e2a\u4e3e\u63aa\u4e0d\u4ec5\u4ec5\u4f53\u73b0\u4e86\u6211\u4eec\u5bf9\u591a\u6837\u5316\u6280\u672f\u73af\u5883\u7684\u5173\u6ce8\uff0c\u4e5f\u662f\u4e3a\u4e86\u6700\u5927\u7a0b\u5ea6\u5730\u62d3\u5c55\u7528\u6237\u57fa\u7840\uff0c\u4e3a\u5e7f\u6cdb\u7684\u7528\u6237\u7fa4\u4f53\u63d0\u4f9b\u7075\u6d3b\u3001\u9ad8\u6548\u7684\u6570\u636e\u5e93\u89e3\u51b3\u65b9\u6848\u3002\u8fd9\u79cd\u8de8\u5e73\u53f0\u517c\u5bb9\u6027\u7684\u52a0\u5f3a\u5c06 Pika \u63a8\u5411\u66f4\u5e7f\u9614\u7684\u6280\u672f\u751f\u6001\u3002"}),"\n",(0,e.jsxs)(i.ul,{children:["\n",(0,e.jsxs)(i.li,{children:["\u652f\u6301 MacOS \u5e73\u53f0\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1372",children:"https://github.com/OpenAtomFoundation/pika/pull/1372"})]}),"\n"]}),"\n",(0,e.jsx)(i.h2,{id:"9-\u591a\u5e73\u53f0\u96c6\u6210\u6d4b\u8bd5\u53ca\u5355\u5143\u6d4b\u8bd5",children:"9 \u591a\u5e73\u53f0\u96c6\u6210\u6d4b\u8bd5\u53ca\u5355\u5143\u6d4b\u8bd5"}),"\n",(0,e.jsx)(i.p,{children:"\u5728 v3.5.0 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u8fc8\u51fa\u4e86\u4e00\u4e2a\u4ee4\u4eba\u77a9\u76ee\u7684\u6b65\u4f10\uff0c\u4e0d\u4ec5\u5728\u591a\u4e2a\u4e3b\u8981\u64cd\u4f5c\u7cfb\u7edf\u5e73\u53f0\u4e0a\u5b9e\u73b0\u4e86\u652f\u6301\uff0c\u8fd8\u5728\u6d4b\u8bd5\u9886\u57df\u5b9e\u65bd\u4e86\u5168\u9762\u5347\u7ea7\u3002\u6211\u4eec\u4e3a Ubuntu\u3001CentOS \u548c MacOS \u8fd9\u4e09\u5927\u5e73\u53f0\u642d\u5efa\u4e86\u6301\u7eed\u96c6\u6210\uff08CI\uff09\u73af\u5883\uff0c\u4ee5\u786e\u4fdd\u7cfb\u7edf\u7684\u5b8c\u6574\u6027\u548c\u7a33\u5b9a\u6027\u3002\u5728\u6d4b\u8bd5\u65b9\u9762\uff0c\u6211\u4eec\u5f15\u5165\u4e86\u66f4\u4e3a\u5e7f\u6cdb\u7684\u8986\u76d6\uff0c\u5305\u62ec Go \u8bed\u8a00\u7684\u96c6\u6210\u6d4b\u8bd5\u3001TCL \u7684\u5355\u5143\u6d4b\u8bd5\u4ee5\u53ca Python \u7684\u7aef\u5230\u7aef\uff08E2E\uff09\u6d4b\u8bd5\u3002\u901a\u8fc7\u8fd9\u4e9b\u6d4b\u8bd5\u7b56\u7565\u7684\u5347\u7ea7\uff0c\u6211\u4eec\u5728\u786e\u4fdd\u7cfb\u7edf\u6027\u80fd\u548c\u53ef\u9760\u6027\u65b9\u9762\u8fc8\u51fa\u4e86\u66f4\u5927\u7684\u4e00\u6b65\u3002"}),"\n",(0,e.jsxs)(i.ul,{children:["\n",(0,e.jsxs)(i.li,{children:["\u65b0\u589e CentOS \u73af\u5883\u4e0b\u7684 CI\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1534",children:"https://github.com/OpenAtomFoundation/pika/pull/1534"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u65b0\u589e MacOS \u73af\u5883\u4e0b\u7684 CI\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1769",children:"https://github.com/OpenAtomFoundation/pika/pull/1769"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u65b0\u589e E2E \u6d4b\u8bd5\u6846\u67b6\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1347",children:"https://github.com/OpenAtomFoundation/pika/pull/1347"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u65b0\u589e\u5728 Github CI Workflow \u4e2d\u6dfb\u52a0 CMake \u7f16\u8bd1\u73af\u5883\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1268",children:"https://github.com/OpenAtomFoundation/pika/pull/1268"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u65b0\u589e\u5728 TCL \u811a\u672c\u4e2d populate \u65b9\u6cd5\u6a21\u62df Redis debug populate \u65b9\u6cd5\uff0c\u7528\u4ee5\u586b\u5145\u6d4b\u8bd5\u6570\u636e\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1693",children:"https://github.com/OpenAtomFoundation/pika/pull/1693"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u65b0\u589e\u5728 blackwidow \u4e2d\u6dfb\u52a0 CMake \u6587\u4ef6\uff0c\u6dfb\u52a0\u5bf9 blackwidow \u7684\u5355\u5143\u6d4b\u8bd5\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1246",children:"https://github.com/OpenAtomFoundation/pika/pull/1246"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u79fb\u690d Redis \u6d4b\u8bd5\u811a\u672c\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1357",children:"https://github.com/OpenAtomFoundation/pika/pull/1357"})]}),"\n"]}),"\n",(0,e.jsx)(i.h2,{id:"10-others",children:"10 Others"}),"\n",(0,e.jsx)(i.p,{children:"\u82e5\u60a8\u6709\u4efb\u4f55\u7591\u95ee\uff0c\u8bda\u631a\u6b22\u8fce\u60a8\u626b\u63cf\u5fae\u4fe1\u4e8c\u7ef4\u7801\uff0c\u52a0\u5165\u6211\u4eec\u7684\u4ea4\u6d41\u7fa4\uff0c\u4e0e\u4e00\u4f17\u5fd7\u540c\u9053\u5408\u7684\u6210\u5458\u5c55\u5f00\u6df1\u5165\u7684\u8ba8\u8bba\uff0c\u6211\u4eec\u70ed\u5207\u671f\u5f85\u4e0e\u60a8\u5206\u4eab\u89c1\u89e3\u3001\u4ea4\u6d41\u5fc3\u5f97\uff0c\u4e3a\u5171\u540c\u7684\u6280\u672f\u63a2\u7d22\u548c\u521b\u65b0\u4e4b\u65c5\u6dfb\u7816\u52a0\u74e6\u3002\u5728\u8fd9\u4e2a\u7fa4\u4f53\u4e2d\uff0c\u6211\u4eec\u5c06\u4ee5\u5353\u8d8a\u7684\u667a\u6167\u548c\u4e92\u52a8\u7684\u5408\u4f5c\u7cbe\u795e\uff0c\u6784\u5efa\u51fa\u4e00\u4e2a\u76f8\u4e92\u5b66\u4e60\u3001\u4e0d\u65ad\u8fdb\u6b65\u7684\u6280\u672f\u5171\u540c\u4f53\u3002"}),"\n",(0,e.jsx)(i.p,{children:(0,e.jsx)(i.img,{alt:"2023-08-25-Pika-3.5.0",src:t(5967).A+"",width:"747",height:"431"})})]})}function u(n={}){const{wrapper:i}={...(0,l.R)(),...n.components};return i?(0,e.jsx)(i,{...n,children:(0,e.jsx)(d,{...n})}):d(n)}},5967:(n,i,t)=>{t.d(i,{A:()=>e});const e=t.p+"assets/images/2023-08-25-Pika-3.5.0-connect-577bc269745e6841d8dc76a6b24e382c.png"},8453:(n,i,t)=>{t.d(i,{R:()=>s,x:()=>p});var e=t(6540);const l={},o=e.createContext(l);function s(n){const i=e.useContext(o);return e.useMemo((function(){return"function"==typeof n?n(i):{...i,...n}}),[i,n])}function p(n){let i;return i=n.disableParentContext?"function"==typeof n.components?n.components(l):n.components||l:s(n.components),e.createElement(o.Provider,{value:i},n.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/2859d2fb.b7b079cf.js b/build/assets/js/2859d2fb.b7b079cf.js new file mode 100644 index 0000000..b35ae90 --- /dev/null +++ b/build/assets/js/2859d2fb.b7b079cf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[2941],{2219:(n,i,t)=>{t.r(i),t.d(i,{assets:()=>h,contentTitle:()=>s,default:()=>u,frontMatter:()=>o,metadata:()=>p,toc:()=>a});var e=t(4848),l=t(8453);const o={title:"What's new in Pika v3.5.0",slug:"Pika-3.5.0",authors:[{name:"\u4e8e\u96e8",title:"dubbogo\u793a\u571f\u533a"}],hide_table_of_contents:!1},s=void 0,p={permalink:"/blog/Pika-3.5.0",source:"@site/blog/2023-08-25-Pika-3.5.0.md",title:"What's new in Pika v3.5.0",description:"\u65f6\u9694\u4e24\u5e74\uff0cPika \u793e\u533a\u6b63\u5f0f\u53d1\u5e03\u7ecf\u7531\u793e\u533a 50 \u591a\u4eba\u53c2\u4e0e\u5f00\u53d1\u5e76\u5728 360 \u751f\u4ea7\u73af\u5883\u9a8c\u8bc1\u53ef\u7528\u7684 v3.5.0 \u7248\u672c\uff0c\u65b0\u7248\u672c\u5728\u63d0\u5347\u6027\u80fd\u7684\u540c\u65f6\uff0c\u4e5f\u652f\u6301\u4e86 Codis \u96c6\u7fa4\u90e8\u7f72\uff0cBlobDB KV \u5206\u79bb\uff0c\u589e\u52a0 Exporter \u7b49\u65b0\u7279\u6027\u3002",date:"2023-08-25T00:00:00.000Z",tags:[],readingTime:9.825,hasTruncateMarker:!1,authors:[{name:"\u4e8e\u96e8",title:"dubbogo\u793a\u571f\u533a"}],frontMatter:{title:"What's new in Pika v3.5.0",slug:"Pika-3.5.0",authors:[{name:"\u4e8e\u96e8",title:"dubbogo\u793a\u571f\u533a"}],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"What's new in Pika v3.5.1",permalink:"/blog/Pika-3.5.1"},nextItem:{title:"Pika Blackwidow \u5f15\u64ce\u6570\u636e\u5b58\u50a8\u683c\u5f0f",permalink:"/blog/pika-blackwidow"}},h={authorsImageUrls:[void 0]},a=[{value:"1 \u53bb\u9664 Rsync",id:"1-\u53bb\u9664-rsync",level:2},{value:"2 \u517c\u5bb9\u66f4\u591a Redis \u547d\u4ee4",id:"2-\u517c\u5bb9\u66f4\u591a-redis-\u547d\u4ee4",level:2},{value:"3 RocksDB \u7248\u672c\u5347\u7ea7\u548c\u5206\u7ea7\u538b\u7f29",id:"3-rocksdb-\u7248\u672c\u5347\u7ea7\u548c\u5206\u7ea7\u538b\u7f29",level:2},{value:"4 \u652f\u6301 BlobDB",id:"4-\u652f\u6301-blobdb",level:2},{value:"5 \u57fa\u4e8e Codis \u7684\u96c6\u7fa4\u6a21\u5f0f",id:"5-\u57fa\u4e8e-codis-\u7684\u96c6\u7fa4\u6a21\u5f0f",level:2},{value:"6 \u53ef\u89c2\u6d4b\u6027",id:"6-\u53ef\u89c2\u6d4b\u6027",level:2},{value:"7 \u5bb9\u5668\u5316\u90e8\u7f72",id:"7-\u5bb9\u5668\u5316\u90e8\u7f72",level:2},{value:"8 \u8de8\u5e73\u53f0\u7f16\u8bd1",id:"8-\u8de8\u5e73\u53f0\u7f16\u8bd1",level:2},{value:"9 \u591a\u5e73\u53f0\u96c6\u6210\u6d4b\u8bd5\u53ca\u5355\u5143\u6d4b\u8bd5",id:"9-\u591a\u5e73\u53f0\u96c6\u6210\u6d4b\u8bd5\u53ca\u5355\u5143\u6d4b\u8bd5",level:2},{value:"10 Others",id:"10-others",level:2}];function d(n){const i={a:"a",h2:"h2",img:"img",li:"li",p:"p",ul:"ul",...(0,l.R)(),...n.components};return(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)(i.p,{children:"\u65f6\u9694\u4e24\u5e74\uff0cPika \u793e\u533a\u6b63\u5f0f\u53d1\u5e03\u7ecf\u7531\u793e\u533a 50 \u591a\u4eba\u53c2\u4e0e\u5f00\u53d1\u5e76\u5728 360 \u751f\u4ea7\u73af\u5883\u9a8c\u8bc1\u53ef\u7528\u7684 v3.5.0 \u7248\u672c\uff0c\u65b0\u7248\u672c\u5728\u63d0\u5347\u6027\u80fd\u7684\u540c\u65f6\uff0c\u4e5f\u652f\u6301\u4e86 Codis \u96c6\u7fa4\u90e8\u7f72\uff0cBlobDB KV \u5206\u79bb\uff0c\u589e\u52a0 Exporter \u7b49\u65b0\u7279\u6027\u3002"}),"\n",(0,e.jsx)(i.p,{children:"\u6211\u4eec\u5c06\u8be6\u7ec6\u4ecb\u7ecd\u8be5\u7248\u672c\u5f15\u5165\u7684\u91cd\u8981\u65b0\u7279\u6027\u3002"}),"\n",(0,e.jsx)(i.h2,{id:"1-\u53bb\u9664-rsync",children:"1 \u53bb\u9664 Rsync"}),"\n",(0,e.jsx)(i.p,{children:"\u5728 v3.5.0 \u7248\u672c\u4e4b\u524d\uff0cPika \u4f7f\u7528 Rsync \u5de5\u5177\u8fdb\u884c\u5f15\u64ce\u4e2d\u5b58\u91cf\u6570\u636e\u7684\u540c\u6b65\uff0cPika \u8fdb\u7a0b\u542f\u52a8\u65f6\u521b\u5efa Rsync \u5b50\u8fdb\u7a0b\u3002\u8fd9\u79cd\u540c\u6b65\u65b9\u5f0f\u5728\u5b9e\u9645\u4f7f\u7528\u4e2d\u51fa\u73b0\u4e86\u4e00\u4e9b\u95ee\u9898\uff0c\u5305\u62ecPika \u8fdb\u7a0b crash \u540e\u91cd\u65b0\u62c9\u8d77\u65e0\u6cd5\u6b63\u5e38\u540c\u6b65\u4ee5\u53ca\u540c\u6b65\u8fc7\u7a0b\u4e2d Rsync \u8fdb\u7a0b\u65e0\u6545\u9000\u51fa\u7b49\u3002\u5728\u4eca\u5e74\u53d1\u5e03\u7684 v3.5.0 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u5728\u5168\u91cf\u540c\u6b65\u65b9\u6848\u65b9\u9762\u8fdb\u884c\u4e86\u91cd\u8981\u7684\u6539\u8fdb\uff0c\u6452\u5f03\u4e86\u4ee5\u5f80\u4f7f\u7528\u7684 Rsync\uff0c\u5b9e\u73b0\u4e86\u5168\u65b0\u7684\u6570\u636e\u540c\u6b65\u65b9\u6848\uff0c\u652f\u6301\u4e86\u65ad\u70b9\u7eed\u4f20\uff0c\u52a8\u6001\u8c03\u8282\u4f20\u8f93\u9650\u901f\u7b49\u7279\u6027\uff0c\u4ee5\u786e\u4fdd\u540c\u6b65\u8fc7\u7a0b\u66f4\u52a0\u7a33\u5b9a\u3001\u53ef\u63a7\u3002\u8fd9\u4e9b\u6539\u8fdb\u4e0d\u4ec5\u589e\u5f3a\u4e86\u540c\u6b65\u7684\u53ef\u9760\u6027\uff0c\u8fd8\u4e3a\u7528\u6237\u63d0\u4f9b\u4e86\u66f4\u597d\u7684\u4f7f\u7528\u4f53\u9a8c\u3002"}),"\n",(0,e.jsxs)(i.ul,{children:["\n",(0,e.jsxs)(i.li,{children:["\n",(0,e.jsxs)(i.p,{children:["\u53bb\u9664 Rsync \u8fdb\u7a0b\uff0c\u4f7f\u7528\u81ea\u7814\u5168\u91cf\u540c\u6b65\u65b9\u5f0f\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1805",children:"https://github.com/OpenAtomFoundation/pika/pull/1805"})]}),"\n"]}),"\n",(0,e.jsxs)(i.li,{children:["\n",(0,e.jsxs)(i.p,{children:["\u5b9e\u73b0\u65ad\u70b9\u7eed\u4f20\uff0c\u4f20\u8f93\u9650\u901f\u529f\u80fd\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1926",children:"https://github.com/OpenAtomFoundation/pika/pull/1926"})]}),"\n"]}),"\n",(0,e.jsxs)(i.li,{children:["\n",(0,e.jsxs)(i.p,{children:["Pika \u4e3b\u4ece\u540c\u6b65\u65f6\uff0c\u8fdb\u884c master run_id \u7684\u68c0\u9a8c\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1805",children:"https://github.com/OpenAtomFoundation/pika/pull/1805"})]}),"\n"]}),"\n"]}),"\n",(0,e.jsx)(i.h2,{id:"2-\u517c\u5bb9\u66f4\u591a-redis-\u547d\u4ee4",children:"2 \u517c\u5bb9\u66f4\u591a Redis \u547d\u4ee4"}),"\n",(0,e.jsx)(i.p,{children:"\u5728 v3.5.0 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u8fc8\u51fa\u4e86\u66f4\u5927\u7684\u4e00\u6b65\uff0c\u63d0\u5347\u4e86\u5bf9 Redis \u547d\u4ee4\u7684\u517c\u5bb9\u6027\uff0c\u5bf9 Redis \u547d\u4ee4\u63d0\u4f9b\u4e86\u66f4\u5e7f\u6cdb\u7684\u652f\u6301\u3002\u8fd9\u4e2a\u7248\u672c\u7684\u6539\u8fdb\u4f7f\u5f97 Pika \u5728\u4e0e Redis \u751f\u6001\u7cfb\u7edf\u7684\u96c6\u6210\u4e2d\u8868\u73b0\u66f4\u52a0\u51fa\u8272\uff0c\u4e3a\u7528\u6237\u63d0\u4f9b\u4e86\u66f4\u4e30\u5bcc\u7684\u529f\u80fd\u548c\u66f4\u5e7f\u9614\u7684\u53ef\u80fd\u6027\u3002\u6211\u4eec\u5bf9\u547d\u4ee4\u652f\u6301\u7684\u6269\u5c55\uff0c\u4e3a\u7528\u6237\u63d0\u4f9b\u4e86\u66f4\u591a\u7684\u7075\u6d3b\u6027\uff0c\u4ee5\u6ee1\u8db3\u4e0d\u540c\u573a\u666f\u4e0b\u7684\u9700\u6c42\u3002"}),"\n",(0,e.jsxs)(i.ul,{children:["\n",(0,e.jsxs)(i.li,{children:["\u652f\u6301 UNLINK \u547d\u4ee4\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1273",children:"https://github.com/OpenAtomFoundation/pika/pull/1273"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u652f\u6301 INFO COMMANDSTATS \u547d\u4ee4\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1660",children:"https://github.com/OpenAtomFoundation/pika/pull/1660"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u652f\u6301 HELLO\u3001SETNAME \u547d\u4ee4\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1245",children:"https://github.com/OpenAtomFoundation/pika/pull/1245"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u652f\u6301 BLPOP\u3001BRPOP \u547d\u4ee4\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1548",children:"https://github.com/OpenAtomFoundation/pika/pull/1548"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u65b0\u589e Pika \u539f\u521b DISKRECOVERY \u547d\u4ee4\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1843",children:"https://github.com/OpenAtomFoundation/pika/pull/1843"})]}),"\n"]}),"\n",(0,e.jsx)(i.h2,{id:"3-rocksdb-\u7248\u672c\u5347\u7ea7\u548c\u5206\u7ea7\u538b\u7f29",children:"3 RocksDB \u7248\u672c\u5347\u7ea7\u548c\u5206\u7ea7\u538b\u7f29"}),"\n",(0,e.jsx)(i.p,{children:"\u5728 v3.5.0 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u8fdb\u884c\u4e86\u4e00\u9879\u91cd\u8981\u7684\u5347\u7ea7\uff0c\u5c06 RocksDB \u5f15\u64ce\u5347\u7ea7\u81f3 v8.1.1 \u7248\u672c\uff0c\u5e76\u5b9e\u73b0\u4e86\u5206\u7ea7\u538b\u7f29\u529f\u80fd\u7684\u6574\u5408\u3002\u8fd9\u4e00\u5347\u7ea7\u4e0d\u4ec5\u662f\u6280\u672f\u7684\u98de\u8dc3\uff0c\u4e5f\u662f\u6211\u4eec\u5bf9\u7cfb\u7edf\u6027\u80fd\u548c\u4f18\u5316\u7684\u6301\u7eed\u5173\u6ce8\u7684\u4f53\u73b0\u3002\u901a\u8fc7\u8fd9\u9879\u5347\u7ea7\uff0c\u6211\u4eec\u4e3a Pika \u589e\u52a0\u4e86\u66f4\u9ad8\u7ea7\u522b\u7684\u6570\u636e\u7ba1\u7406\u80fd\u529b\uff0c\u540c\u65f6\u4e5f\u8ba9\u7cfb\u7edf\u66f4\u597d\u5730\u9002\u5e94\u4e0d\u540c\u7684\u538b\u7f29\u9700\u6c42\uff0c\u4e3a\u7528\u6237\u7684\u6570\u636e\u5b58\u50a8\u548c\u68c0\u7d22\u63d0\u4f9b\u4e86\u66f4\u5927\u7684\u7075\u6d3b\u6027\u548c\u6548\u7387\u3002"}),"\n",(0,e.jsxs)(i.ul,{children:["\n",(0,e.jsxs)(i.li,{children:["\u5347\u7ea7 RocksDB \u7248\u672c\u5230 v8.1.1\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1396",children:"https://github.com/OpenAtomFoundation/pika/pull/1396"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u5b9e\u73b0 RocksDB \u5206\u7ea7\u538b\u7f29\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1365",children:"https://github.com/OpenAtomFoundation/pika/pull/1365"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u65b0\u589e RocksDB \u7f13\u5b58\u914d\u7f6e\u9879 num-shard-bits \u80fd\u591f\u4ece\u914d\u7f6e\u6587\u4ef6\u4e2d\u8bfb\u53d6\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1189",children:"https://github.com/OpenAtomFoundation/pika/pull/1189"})]}),"\n"]}),"\n",(0,e.jsx)(i.h2,{id:"4-\u652f\u6301-blobdb",children:"4 \u652f\u6301 BlobDB"}),"\n",(0,e.jsx)(i.p,{children:"\u5728 v3.5.0 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u5f15\u5165\u4e86\u5f15\u4eba\u77a9\u76ee\u7684\u521b\u65b0--\u5bf9 BlobDB \u548c KV \u5b58\u50a8\u5c42\u8fdb\u884c\u4e86\u5206\u79bb\uff0c\u4e3a\u6211\u4eec\u7684\u7cfb\u7edf\u6ce8\u5165\u4e86\u65b0\u7684\u6d3b\u529b\u3002\u8fd9\u4e2a\u7248\u672c\u7684\u5347\u7ea7\u4f7f\u5f97 Pika \u5728\u6570\u636e\u5b58\u50a8\u65b9\u9762\u66f4\u52a0\u7075\u6d3b\u548c\u9ad8\u6548\u3002\u6211\u4eec\u901a\u8fc7\u652f\u6301 BlobDB KV \u5206\u79bb\uff0c\u63d0\u4f9b\u4e86\u66f4\u4f18\u5316\u7684\u6570\u636e\u5b58\u50a8\u7ed3\u6784\uff0c\u4e3a\u7528\u6237\u7684\u6570\u636e\u7ba1\u7406\u548c\u67e5\u8be2\u64cd\u4f5c\u5e26\u6765\u4e86\u66f4\u6df1\u5c42\u6b21\u7684\u4f18\u52bf\u3002\u8fd9\u4e00\u91cd\u8981\u6539\u8fdb\u5c06\u5728\u66f4\u591a\u5e94\u7528\u573a\u666f\u4e0b\u5c55\u73b0\u51fa\u5176\u5f3a\u5927\u7684\u6f5c\u529b\u3002"}),"\n",(0,e.jsxs)(i.ul,{children:["\n",(0,e.jsxs)(i.li,{children:["\u652f\u6301 BlobDB KV \u5206\u79bb\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1456",children:"https://github.com/OpenAtomFoundation/pika/pull/1456"})]}),"\n"]}),"\n",(0,e.jsx)(i.h2,{id:"5-\u57fa\u4e8e-codis-\u7684\u96c6\u7fa4\u6a21\u5f0f",children:"5 \u57fa\u4e8e Codis \u7684\u96c6\u7fa4\u6a21\u5f0f"}),"\n",(0,e.jsx)(i.p,{children:"\u5728 v3.5.0 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u79ef\u6781\u5f15\u5165\u4e86 Codis \u96c6\u7fa4\u6a21\u5f0f\uff0c\u6b64\u5916\uff0c\u6211\u4eec\u4e0d\u4ec5\u4ec5\u5c06 Codis \u96c6\u7fa4\u6a21\u5f0f\u878d\u5165\u4e86\u7cfb\u7edf\u4e2d\uff0c\u8fd8\u4e3a\u5176\u63d0\u4f9b\u4e86\u8fc1\u79fb slot \u7684\u547d\u4ee4\u652f\u6301\uff0c\u4ece\u800c\u5b9e\u73b0\u4e86\u66f4\u52a0\u667a\u80fd\u5316\u7684\u96c6\u7fa4\u7ba1\u7406\u3002\u8fd9\u4e00\u91cd\u5927\u53d8\u9769\u4e0d\u4ec5\u6269\u5c55\u4e86 Pika \u5728\u5927\u89c4\u6a21\u6570\u636e\u5b58\u50a8\u573a\u666f\u4e2d\u7684\u5e94\u7528\u8303\u56f4\uff0c\u8fd8\u8fdb\u4e00\u6b65\u63d0\u5347\u4e86\u7cfb\u7edf\u7684\u53ef\u6269\u5c55\u6027\u548c\u9ad8\u53ef\u7528\u6027\u3002\u901a\u8fc7\u5f15\u5165 Codis \u96c6\u7fa4\u6a21\u5f0f\uff0c\u6211\u4eec\u5bf9\u7528\u6237\u7684\u6570\u636e\u5904\u7406\u548c\u7ba1\u7406\u63d0\u4f9b\u4e86\u66f4\u4f18\u5316\u7684\u89e3\u51b3\u65b9\u6848\u3002"}),"\n",(0,e.jsxs)(i.ul,{children:["\n",(0,e.jsxs)(i.li,{children:["\n",(0,e.jsx)(i.p,{children:"\u5f15\u5165 Codis \u5230 Pika"}),"\n",(0,e.jsx)(i.p,{children:(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1279",children:"https://github.com/OpenAtomFoundation/pika/pull/1279"})}),"\n"]}),"\n",(0,e.jsxs)(i.li,{children:["\n",(0,e.jsx)(i.p,{children:"\u5f15\u5165 Codis \u7684 CI"}),"\n",(0,e.jsx)(i.p,{children:(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1311",children:"https://github.com/OpenAtomFoundation/pika/pull/1311"})}),"\n"]}),"\n",(0,e.jsxs)(i.li,{children:["\n",(0,e.jsx)(i.p,{children:"\u652f\u6301 Codis \u8fc1\u79fb slot \u547d\u4ee4"}),"\n",(0,e.jsx)(i.p,{children:(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1632",children:"https://github.com/OpenAtomFoundation/pika/pull/1632"})}),"\n"]}),"\n",(0,e.jsxs)(i.li,{children:["\n",(0,e.jsx)(i.p,{children:"\u65b0\u589e\u662f\u5426\u5728 reload \u7684 slotmigrate \u72b6\u6001"}),"\n",(0,e.jsx)(i.p,{children:(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1700",children:"https://github.com/OpenAtomFoundation/pika/pull/1700"})}),"\n"]}),"\n"]}),"\n",(0,e.jsx)(i.h2,{id:"6-\u53ef\u89c2\u6d4b\u6027",children:"6 \u53ef\u89c2\u6d4b\u6027"}),"\n",(0,e.jsx)(i.p,{children:"\u5728 v3.5.0 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u5f15\u5165\u4e86\u4e00\u4e2a\u521b\u65b0\u6027\u7684\u5de5\u5177--pika_exporter\uff0c\u4ee5\u63d0\u5347\u5bf9 Pika \u6570\u636e\u5e93\u7684\u53ef\u89c2\u6d4b\u6027\u3002\u8fd9\u4e00\u5de5\u5177\u7684\u52a0\u5165\u4e0d\u4ec5\u662f\u5bf9\u6211\u4eec\u5bf9\u7cfb\u7edf\u76d1\u6d4b\u80fd\u529b\u7684\u6301\u7eed\u589e\u5f3a\u7684\u53cd\u6620\u3002\u800c\u5728\u7248\u672c\u7684\u540e\u7eed\u66f4\u65b0\u4e2d\uff0c\u6211\u4eec\u8fdb\u4e00\u6b65\u5145\u5b9e\u4e86\u6307\u6807\uff0c\u4e0d\u65ad\u4e30\u5bcc\u4e86 Pika \u7684\u53ef\u89c2\u6d4b\u6027\u3002\u4e3a\u7528\u6237\u63d0\u4f9b\u4e86\u66f4\u4e3a\u5168\u9762\u548c\u7cbe\u51c6\u7684\u6570\u636e\u6d1e\u5bdf\u529b\u3002"}),"\n",(0,e.jsxs)(i.ul,{children:["\n",(0,e.jsxs)(i.li,{children:["\n",(0,e.jsx)(i.p,{children:"\u65b0\u589e Pika \u53ef\u89c2\u6d4b\u7cfb\u7edf pika_exporter"}),"\n",(0,e.jsx)(i.p,{children:(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1388",children:"https://github.com/OpenAtomFoundation/pika/pull/1388"})}),"\n"]}),"\n",(0,e.jsxs)(i.li,{children:["\n",(0,e.jsx)(i.p,{children:"\u65b0\u589e\u7f51\u7edc I/O \u6d41\u91cf\u76d1\u63a7\u6307\u6807"}),"\n",(0,e.jsx)(i.p,{children:(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1733",children:"https://github.com/OpenAtomFoundation/pika/pull/1733"})}),"\n"]}),"\n",(0,e.jsxs)(i.li,{children:["\n",(0,e.jsx)(i.p,{children:"\u65b0\u589e\u547d\u4ee4\u7edf\u8ba1\u8017\u65f6\u6307\u6807"}),"\n",(0,e.jsx)(i.p,{children:(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1751",children:"https://github.com/OpenAtomFoundation/pika/pull/1751"})}),"\n"]}),"\n",(0,e.jsxs)(i.li,{children:["\n",(0,e.jsx)(i.p,{children:"\u65b0\u589e estimate_pending_compaction_bytes \u5ea6\u91cf\u6765\u5206\u6790\u788e\u7247\u7387\u6307\u6807"}),"\n",(0,e.jsx)(i.p,{children:(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1736",children:"https://github.com/OpenAtomFoundation/pika/pull/1736"})}),"\n"]}),"\n",(0,e.jsxs)(i.li,{children:["\n",(0,e.jsx)(i.p,{children:"\u65b0\u589e RocksDB \u6307\u6807"}),"\n",(0,e.jsx)(i.p,{children:(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1560",children:"https://github.com/OpenAtomFoundation/pika/pull/1560"})}),"\n"]}),"\n"]}),"\n",(0,e.jsx)(i.h2,{id:"7-\u5bb9\u5668\u5316\u90e8\u7f72",children:"7 \u5bb9\u5668\u5316\u90e8\u7f72"}),"\n",(0,e.jsx)(i.p,{children:"\u5728 v3.5.0 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u5f15\u5165\u4e86\u4e00\u4e2a\u5177\u6709\u521b\u65b0\u610f\u4e49\u7684\u91cc\u7a0b\u7891--pika-operator mvp \u7248\u672c\uff0c\u8fd9\u4e00\u7248\u672c\u5728\u6280\u672f\u4e0a\u5b9e\u73b0\u4e86\u4e00\u4e2a\u91cd\u8981\u76ee\u6807\uff1a\u5c06 Pika \u5355\u5b9e\u4f8b\u670d\u52a1\u8fc1\u79fb\u5230 Kubernetes\uff08K8s\uff09\u5e73\u53f0\u4e0a\u7684\u5feb\u901f\u90e8\u7f72\u3002\u8fd9\u4e0d\u4ec5\u662f\u5bf9\u6211\u4eec\u6301\u7eed\u5173\u6ce8\u884c\u4e1a\u53d1\u5c55\u7684\u4f53\u73b0\uff0c\u4e5f\u662f\u6211\u4eec\u4e0d\u65ad\u63d0\u5347\u7528\u6237\u4f53\u9a8c\u7684\u8ffd\u6c42\u3002\u901a\u8fc7 pika-operator\uff0c\u6211\u4eec\u4e3a\u7528\u6237\u63d0\u4f9b\u4e86\u66f4\u4fbf\u6377\u7684\u90e8\u7f72\u65b9\u6848\uff0c\u5c06 Pika \u7684\u9ad8\u6027\u80fd\u6570\u636e\u5e93\u5f15\u64ce\u4e0e Kubernetes \u7684\u7075\u6d3b\u6027\u76f8\u878d\u5408\uff0c\u4ece\u800c\u4e3a\u7528\u6237\u7684\u5e94\u7528\u73af\u5883\u5e26\u6765\u66f4\u9ad8\u6548\u3001\u66f4\u5f39\u6027\u7684\u652f\u6301\u3002"}),"\n",(0,e.jsxs)(i.ul,{children:["\n",(0,e.jsxs)(i.li,{children:["\u5b9e\u73b0 Pika \u5355\u4f8b\u670d\u52a1\u5728 K8s \u4e0a\u5feb\u901f\u90e8\u7f72\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1243",children:"https://github.com/OpenAtomFoundation/pika/pull/1243"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u5b9e\u73b0\u4e86\u5728 MiniKube \u73af\u5883\u4e2d\u90e8\u7f72 Pika\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1330",children:"https://github.com/OpenAtomFoundation/pika/pull/1330"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u7ed9 pika-operator \u6dfb\u52a0 E2E \u6d4b\u8bd5\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1347",children:"https://github.com/OpenAtomFoundation/pika/pull/1347"})]}),"\n"]}),"\n",(0,e.jsx)(i.h2,{id:"8-\u8de8\u5e73\u53f0\u7f16\u8bd1",children:"8 \u8de8\u5e73\u53f0\u7f16\u8bd1"}),"\n",(0,e.jsx)(i.p,{children:"\u5728 v3.5.0 \u7248\u672c\u4e2d\uff0cPika \u5448\u73b0\u51fa\u4e00\u79cd\u5168\u9762\u6027\u7684\u84ec\u52c3\u53d1\u5c55\u6001\u52bf\uff0c\u5f97\u4ee5\u5728\u4e0d\u540c\u64cd\u4f5c\u7cfb\u7edf\u5e73\u53f0\u4e0a\u5c55\u73b0\u5176\u4f18\u8d8a\u6027\u3002\u6b64\u7248\u672c\u7684\u7a81\u7834\u6027\u4e4b\u5904\u5728\u4e8e\uff0cPika \u5b9e\u73b0\u4e86\u5bf9 MacOS\u3001CentOS \u548c Ubuntu \u8fd9\u4e9b\u4e3b\u8981\u5e73\u53f0\u7684\u5b8c\u6574\u7f16\u8bd1\u548c\u4f7f\u7528\u652f\u6301\u3002\u8fd9\u4e2a\u4e3e\u63aa\u4e0d\u4ec5\u4ec5\u4f53\u73b0\u4e86\u6211\u4eec\u5bf9\u591a\u6837\u5316\u6280\u672f\u73af\u5883\u7684\u5173\u6ce8\uff0c\u4e5f\u662f\u4e3a\u4e86\u6700\u5927\u7a0b\u5ea6\u5730\u62d3\u5c55\u7528\u6237\u57fa\u7840\uff0c\u4e3a\u5e7f\u6cdb\u7684\u7528\u6237\u7fa4\u4f53\u63d0\u4f9b\u7075\u6d3b\u3001\u9ad8\u6548\u7684\u6570\u636e\u5e93\u89e3\u51b3\u65b9\u6848\u3002\u8fd9\u79cd\u8de8\u5e73\u53f0\u517c\u5bb9\u6027\u7684\u52a0\u5f3a\u5c06 Pika \u63a8\u5411\u66f4\u5e7f\u9614\u7684\u6280\u672f\u751f\u6001\u3002"}),"\n",(0,e.jsxs)(i.ul,{children:["\n",(0,e.jsxs)(i.li,{children:["\u652f\u6301 MacOS \u5e73\u53f0\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1372",children:"https://github.com/OpenAtomFoundation/pika/pull/1372"})]}),"\n"]}),"\n",(0,e.jsx)(i.h2,{id:"9-\u591a\u5e73\u53f0\u96c6\u6210\u6d4b\u8bd5\u53ca\u5355\u5143\u6d4b\u8bd5",children:"9 \u591a\u5e73\u53f0\u96c6\u6210\u6d4b\u8bd5\u53ca\u5355\u5143\u6d4b\u8bd5"}),"\n",(0,e.jsx)(i.p,{children:"\u5728 v3.5.0 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u8fc8\u51fa\u4e86\u4e00\u4e2a\u4ee4\u4eba\u77a9\u76ee\u7684\u6b65\u4f10\uff0c\u4e0d\u4ec5\u5728\u591a\u4e2a\u4e3b\u8981\u64cd\u4f5c\u7cfb\u7edf\u5e73\u53f0\u4e0a\u5b9e\u73b0\u4e86\u652f\u6301\uff0c\u8fd8\u5728\u6d4b\u8bd5\u9886\u57df\u5b9e\u65bd\u4e86\u5168\u9762\u5347\u7ea7\u3002\u6211\u4eec\u4e3a Ubuntu\u3001CentOS \u548c MacOS \u8fd9\u4e09\u5927\u5e73\u53f0\u642d\u5efa\u4e86\u6301\u7eed\u96c6\u6210\uff08CI\uff09\u73af\u5883\uff0c\u4ee5\u786e\u4fdd\u7cfb\u7edf\u7684\u5b8c\u6574\u6027\u548c\u7a33\u5b9a\u6027\u3002\u5728\u6d4b\u8bd5\u65b9\u9762\uff0c\u6211\u4eec\u5f15\u5165\u4e86\u66f4\u4e3a\u5e7f\u6cdb\u7684\u8986\u76d6\uff0c\u5305\u62ec Go \u8bed\u8a00\u7684\u96c6\u6210\u6d4b\u8bd5\u3001TCL \u7684\u5355\u5143\u6d4b\u8bd5\u4ee5\u53ca Python \u7684\u7aef\u5230\u7aef\uff08E2E\uff09\u6d4b\u8bd5\u3002\u901a\u8fc7\u8fd9\u4e9b\u6d4b\u8bd5\u7b56\u7565\u7684\u5347\u7ea7\uff0c\u6211\u4eec\u5728\u786e\u4fdd\u7cfb\u7edf\u6027\u80fd\u548c\u53ef\u9760\u6027\u65b9\u9762\u8fc8\u51fa\u4e86\u66f4\u5927\u7684\u4e00\u6b65\u3002"}),"\n",(0,e.jsxs)(i.ul,{children:["\n",(0,e.jsxs)(i.li,{children:["\u65b0\u589e CentOS \u73af\u5883\u4e0b\u7684 CI\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1534",children:"https://github.com/OpenAtomFoundation/pika/pull/1534"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u65b0\u589e MacOS \u73af\u5883\u4e0b\u7684 CI\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1769",children:"https://github.com/OpenAtomFoundation/pika/pull/1769"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u65b0\u589e E2E \u6d4b\u8bd5\u6846\u67b6\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1347",children:"https://github.com/OpenAtomFoundation/pika/pull/1347"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u65b0\u589e\u5728 Github CI Workflow \u4e2d\u6dfb\u52a0 CMake \u7f16\u8bd1\u73af\u5883\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1268",children:"https://github.com/OpenAtomFoundation/pika/pull/1268"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u65b0\u589e\u5728 TCL \u811a\u672c\u4e2d populate \u65b9\u6cd5\u6a21\u62df Redis debug populate \u65b9\u6cd5\uff0c\u7528\u4ee5\u586b\u5145\u6d4b\u8bd5\u6570\u636e\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1693",children:"https://github.com/OpenAtomFoundation/pika/pull/1693"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u65b0\u589e\u5728 blackwidow \u4e2d\u6dfb\u52a0 CMake \u6587\u4ef6\uff0c\u6dfb\u52a0\u5bf9 blackwidow \u7684\u5355\u5143\u6d4b\u8bd5\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1246",children:"https://github.com/OpenAtomFoundation/pika/pull/1246"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u79fb\u690d Redis \u6d4b\u8bd5\u811a\u672c\n",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1357",children:"https://github.com/OpenAtomFoundation/pika/pull/1357"})]}),"\n"]}),"\n",(0,e.jsx)(i.h2,{id:"10-others",children:"10 Others"}),"\n",(0,e.jsx)(i.p,{children:"\u82e5\u60a8\u6709\u4efb\u4f55\u7591\u95ee\uff0c\u8bda\u631a\u6b22\u8fce\u60a8\u626b\u63cf\u5fae\u4fe1\u4e8c\u7ef4\u7801\uff0c\u52a0\u5165\u6211\u4eec\u7684\u4ea4\u6d41\u7fa4\uff0c\u4e0e\u4e00\u4f17\u5fd7\u540c\u9053\u5408\u7684\u6210\u5458\u5c55\u5f00\u6df1\u5165\u7684\u8ba8\u8bba\uff0c\u6211\u4eec\u70ed\u5207\u671f\u5f85\u4e0e\u60a8\u5206\u4eab\u89c1\u89e3\u3001\u4ea4\u6d41\u5fc3\u5f97\uff0c\u4e3a\u5171\u540c\u7684\u6280\u672f\u63a2\u7d22\u548c\u521b\u65b0\u4e4b\u65c5\u6dfb\u7816\u52a0\u74e6\u3002\u5728\u8fd9\u4e2a\u7fa4\u4f53\u4e2d\uff0c\u6211\u4eec\u5c06\u4ee5\u5353\u8d8a\u7684\u667a\u6167\u548c\u4e92\u52a8\u7684\u5408\u4f5c\u7cbe\u795e\uff0c\u6784\u5efa\u51fa\u4e00\u4e2a\u76f8\u4e92\u5b66\u4e60\u3001\u4e0d\u65ad\u8fdb\u6b65\u7684\u6280\u672f\u5171\u540c\u4f53\u3002"}),"\n",(0,e.jsx)(i.p,{children:(0,e.jsx)(i.img,{alt:"2023-08-25-Pika-3.5.0",src:t(5967).A+"",width:"747",height:"431"})})]})}function u(n={}){const{wrapper:i}={...(0,l.R)(),...n.components};return i?(0,e.jsx)(i,{...n,children:(0,e.jsx)(d,{...n})}):d(n)}},5967:(n,i,t)=>{t.d(i,{A:()=>e});const e=t.p+"assets/images/2023-08-25-Pika-3.5.0-connect-577bc269745e6841d8dc76a6b24e382c.png"},8453:(n,i,t)=>{t.d(i,{R:()=>s,x:()=>p});var e=t(6540);const l={},o=e.createContext(l);function s(n){const i=e.useContext(o);return e.useMemo((function(){return"function"==typeof n?n(i):{...i,...n}}),[i,n])}function p(n){let i;return i=n.disableParentContext?"function"==typeof n.components?n.components(l):n.components||l:s(n.components),e.createElement(o.Provider,{value:i},n.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/29ba892c.45b425a1.js b/build/assets/js/29ba892c.45b425a1.js new file mode 100644 index 0000000..37623d3 --- /dev/null +++ b/build/assets/js/29ba892c.45b425a1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[2767],{1063:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>_,frontMatter:()=>a,metadata:()=>r,toc:()=>p});var s=i(4848),t=i(8453);const a={title:"page info \u4fe1\u606f\u8bf4\u660e",sidebar_position:30},o=void 0,r={id:"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/page info \u4fe1\u606f\u8bf4\u660e/index",title:"page info \u4fe1\u606f\u8bf4\u660e",description:"\u6267\u884cINFO\u547d\u4ee4",source:"@site/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/page info \u4fe1\u606f\u8bf4\u660e/index.md",sourceDirName:"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/page info \u4fe1\u606f\u8bf4\u660e",slug:"/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/page info \u4fe1\u606f\u8bf4\u660e/",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/page info \u4fe1\u606f\u8bf4\u660e/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/page info \u4fe1\u606f\u8bf4\u660e/index.md",tags:[],version:"current",sidebarPosition:30,frontMatter:{title:"page info \u4fe1\u606f\u8bf4\u660e",sidebar_position:30},sidebar:"tutorialSidebar",previous:{title:"\u914d\u7f6e\u6587\u4ef6\u8bf4\u660e",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u914d\u7f6e\u6587\u4ef6\u8bf4\u660e/"},next:{title:"\u6570\u636e\u76ee\u5f55",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u6570\u636e\u76ee\u5f55/"}},c={},p=[];function d(e){const n={code:"code",p:"p",pre:"pre",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["\u6267\u884c",(0,s.jsx)(n.code,{children:"INFO"}),"\u547d\u4ee4"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"127.0.0.1:9221> info [section]\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"#\u4e3b\u5e93\uff1a\n# Server\npika_version:2.3.0 -------------------------------------------- pika \u7248\u672c\u4fe1\u606f\npika_git_sha:3668a2807a3d047ea43656b58a2130c1566eeb65 --------- git\u7684sha\u503c\npika_build_compile_date: Nov 14 2017 -------------------------- pika\u7684\u7f16\u8bd1\u65e5\u671f\nos:Linux 2.6.32-2.0.0.8-6 x86_64 ------------------------------ \u64cd\u4f5c\u7cfb\u7edf\u4fe1\u606f\narch_bits:64 -------------------------------------------------- \u64cd\u4f5c\u7cfb\u7edf\u4f4d\u6570\nprocess_id:12969 ---------------------------------------------- pika pid\u4fe1\u606f\ntcp_port:9001 ------------------------------------------------- pika \u7aef\u53e3\u4fe1\u606f\nthread_num:12 ------------------------------------------------- pika \u7ebf\u7a0b\u6570\u91cf\nsync_thread_num:6 --------------------------------------------- sync\u7ebf\u7a0b\u6570\u91cf\nuptime_in_seconds:3074 ---------------------------------------- pika \u8fd0\u884c\u65f6\u95f4\uff08\u79d2\uff09\nuptime_in_days:0 ---------------------------------------------- pika \u8fd0\u884c\u65f6\u95f4\uff08\u5929\uff09\nconfig_file:/data1/pika9001/pika9001.conf --------------------- pika conf\u6587\u4ef6\u4f4d\u7f6e\nserver_id:1 --------------------------------------------------- pika\u7684server id\n\n# Data\ndb_size:770439 ------------------------------------------------ db\u7684\u5927\u5c0f(Byte)\ndb_size_human:0M ---------------------------------------------- \u4eba\u7c7b\u53ef\u8bfb\u7684db\u5927\u5c0f(M)\ncompression:snappy -------------------------------------------- \u538b\u7f29\u65b9\u5f0f\nused_memory:4248 ---------------------------------------------- \u4f7f\u7528\u7684\u5185\u5b58\u5927\u5c0f(Byte)\nused_memory_human:0M ------------------------------------------ \u4eba\u7c7b\u53ef\u8bfb\u7684\u4f7f\u7528\u7684\u5185\u5b58\u5927\u5c0f(M)\ndb_memtable_usage:4120 ---------------------------------------- memtable\u7684\u4f7f\u7528\u91cf(Byte)\ndb_tablereader_usage:128 -------------------------------------- tablereader\u7684\u4f7f\u7528\u91cf(Byte)\n\n# Log\nlog_size:110174 ----------------------------------------------- binlog\u7684\u5927\u5c0f(Byte)\nlog_size_human:0M --------------------------------------------- \u4eba\u7c7b\u53ef\u8bfb\u7684binlog\u5927\u5c0f(M)\nsafety_purge:none --------------------------------------------- \u76ee\u524d\u53ef\u4ee5\u5b89\u5168\u5220\u9664\u7684\u6587\u4ef6\u540d\nexpire_logs_days:7 -------------------------------------------- \u8bbe\u7f6ebinlog\u8fc7\u671f\u5929\u6570\nexpire_logs_nums:10 ------------------------------------------- \u8bbe\u7f6ebinlog\u8fc7\u671f\u6570\u91cf\nbinlog_offset:0 388 ------------------------------------------- binlog\u504f\u79fb\u91cf(\u6587\u4ef6\u53f7\uff0c\u504f\u79fb\u91cf)\n \n# Clients\nconnected_clients:2 ------------------------------------------- \u5f53\u524d\u8fde\u63a5\u6570\n \n# Stats\ntotal_connections_received:18 --------------------------------- \u603b\u8fde\u63a5\u6b21\u6570\u7edf\u8ba1\ninstantaneous_ops_per_sec:1 ----------------------------------- \u5f53\u524dqps\ntotal_commands_processed:633 ---------------------------------- \u8bf7\u6c42\u603b\u8ba1\nis_bgsaving:No, , 0 ------------------------------------------- pika \u5907\u4efd\u4fe1\u606f\uff1a\u662f\u5426\u5728\u5907\u4efd,\u5907\u4efd\u540d\u79f0\uff0c\u5907\u4efd\nis_scaning_keyspace:No ---------------------------------------- \u662f\u5426\u5728\u6267\u884cscan\u64cd\u4f5c\nis_compact:No ------------------------------------------------- \u662f\u5426\u5728\u6267\u884c\u6570\u636e\u538b\u7f29\u64cd\u4f5c\ncompact_cron: ------------------------------------------------- \u5b9a\u65f6compact(format: start-end/ratio, eg. 02-04/60)\ncompact_interval: --------------------------------------------- compact\u7684\u95f4\u9694(format: interval/ratio, eg. 6/60)\n\n# CPU\nused_cpu_sys:48.52 -------------------------------------------- Pika\u8fdb\u7a0b\u7cfb\u7edfCPU\u5360\u7528\u65f6\u95f4\nused_cpu_user:73.10 ------------------------------------------- Pika\u8fdb\u7a0b\u7528\u6237CPU\u5360\u7528\u65f6\u95f4\nused_cpu_sys_children:0.05 ------------------------------------ Pika\u5b50\u8fdb\u7a0b\u7cfb\u7edfCPU\u5360\u7528\u65f6\u95f4\nused_cpu_user_children:0.05 ----------------------------------- Pika\u5b50\u8fdb\u7a0b\u7528\u6237CPU\u5360\u7528\u65f6\u95f4\n \n# Replication(MASTER)\nrole:master --------------------------------------------------- \u672c\u5b9e\u4f8b\u89d2\u8272\nconnected_slaves:1 -------------------------------------------- \u5f53\u524d\u4ece\u5e93\u6570\u91cf\nslave0:ip=192.168.1.1,port=57765,state=online,sid=2,lag=0 ----- lag\uff1a\u5f53\u524d\u4e3b\u4ecebinlog\u76f8\u5dee\u7684\u5b57\u8282\u6570\uff08byte\uff09\uff0c\u5982\u679c\u6709\u591a\u4e2a\u4ece\u5e93\u5219\u4f9d\u6b21\u5c55\u793a\n \n#\u4ece\u5e93\uff08\u533a\u522b\u4ec5\u5728\u4e8e\u540c\u6b65\u4fe1\u606f\u7684\u5c55\u793a\uff09\uff1a\n# Replication(SLAVE)\nrole:slave ---------------------------------------------------- \u672c\u5b9e\u4f8b\u89d2\u8272\nmaster_host:192.168.1.2 --------------------------------------- \u4e3b\u5e93IP\nmaster_port:9001 ---------------------------------------------- \u4e3b\u5e93\u7aef\u53e3\nmaster_link_status:up ----------------------------------------- \u5f53\u524d\u540c\u6b65\u72b6\u6001\nslave_read_only:1 --------------------------------------------- \u4ece\u5e93\u662f\u5426readonly\nrepl_state: connected ----------------------------------------- \u4ece\u5e93\u540c\u6b65\u8fde\u63a5\u7684\u5f53\u524d\u72b6\u6001\n \n# Keyspace\uff08key\u6570\u91cf\u5c55\u793a\uff0c\u6309\u7167\u6570\u636e\u7c7b\u578b\u5206\u7c7b\u5c55\u793a\uff0c\u9ed8\u8ba4\u4e0d\u66f4\u65b0\uff0c\u4ec5\u5728\u6267\u884cinfo keyspace 1\u7684\u65f6\u5019\u5237\u65b0\u8be5\u4fe1\u606f\uff09\n# Time:2016-04-22 17:08:33 ------------------------------------ \u4e0a\u4e00\u6b21\u7edf\u8ba1\u7684\u65f6\u95f4\ndb0 Strings_keys=100004, expires=0, invaild_keys=0\ndb0 Hashes_keys=2, expires=0, invaild_keys=0\ndb0 Lists_keys=0, expires=0, invaild_keys=0\ndb0 Zsets_keys=1, expires=0, invaild_keys=0\ndb0 Sets_keys=0, expires=0, invaild_keys=0\n# keys\uff1a\u5f53\u524d\u6709\u6548KEY\u7684\u6570\u91cf\uff0c\u7b49\u540c\u4e8eredis\u7684keys \n# expires\uff1akeys\u4e2d\u5e26\u6709expire\u5c5e\u6027\u7684key\u7684\u6570\u91cf\uff0c\u7b49\u540c\u4e8eRedis \n# invalid_keys\uff1apika\u72ec\u6709\uff0c\u6307\u5df2\u7ecf\u5931\u6548\uff08\u6807\u8bb0\u5220\u9664\uff09\uff0c\u4f46\u8fd8\u672a\u88abrocksdb\u5f7b\u5e95\u7269\u7406\u5220\u9664\u7684key\uff0c\u867d\u7136\u8fd9\u4e9bkey\u4e0d\u518d\u4f1a\u88ab\u8bbf\u95ee\u5230\uff0c\u4f46\u4f1a\u5360\u7528\u4e00\u5b9a\u78c1\u76d8\u7a7a\u95f4\uff0c\u5982\u679c\u53d1\u73b0\u8f83\u5927\u53ef\u4ee5\u901a\u8fc7\u6267\u884ccompact\u6765\u5f7b\u5e95\u6e05\u7406\n\n# DoubleMaster(MASTER)\nrole:master --------------------------------------------------- \u53cc\u4e3b\u89d2\u8272\nthe peer-master host: ----------------------------------------- \u53cc\u4e3b\u5bf9\u7aefIP\nthe peer-master port:0 ---------------------------------------- \u53cc\u4e3b\u5bf9\u7aefPort\nthe peer-master server_id:0 ----------------------------------- \u53cc\u4e3b\u5bf9\u7aefserver id\ndouble_master_mode: False ------------------------------------- \u662f\u5426\u914d\u7f6e\u53cc\u4e3b\u6a21\u5f0f\nrepl_state: 0 ------------------------------------------------- \u53cc\u4e3b\u8fde\u63a5\u72b6\u6001\ndouble_master_recv_info: filenum 0 offset 0 ------------------- \u4ece\u5bf9\u7aef\u63a5\u53d7\u7684Binlog\u504f\u79fb\u91cf\n"})})]})}function _(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>r});var s=i(6540);const t={},a=s.createContext(t);function o(e){const n=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),s.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/2c217be1.4a8642f5.js b/build/assets/js/2c217be1.4a8642f5.js new file mode 100644 index 0000000..a1e8960 --- /dev/null +++ b/build/assets/js/2c217be1.4a8642f5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[4700],{8078:(i,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>l,default:()=>c,frontMatter:()=>s,metadata:()=>e,toc:()=>a});var o=t(4848),p=t(8453);const s={title:"What's new in Pika v3.5.3 ",slug:"Pika-3.5.3",authors:[{name:"360 \u4e2d\u95f4\u4ef6\u56e2\u961f",title:"Pika \u5f00\u6e90\u793e\u533a"}],hide_table_of_contents:!1},l=void 0,e={permalink:"/blog/Pika-3.5.3",source:"@site/blog/2024-03-27-Pika-3.5.3.md",title:"What's new in Pika v3.5.3 ",description:"\u968f\u7740 Redis \u5ba3\u5e03\u91c7\u7528\u53cc\u534f\u8bae\u4ee5\u7ef4\u62a4\u5176\u5546\u4e1a\u5229\u76ca\u4e4b\u9645\uff0cPikiwiDB(Pika) \u793e\u533a\u975e\u5e38\u8363\u5e78\u5730\u5ba3\u5e03\uff0c\u6211\u4eec\u7684\u6700\u65b0 v3.5.3 \u6b63\u5f0f\u751f\u4ea7\u53ef\u7528\u7248\u672c\u73b0\u5df2\u53d1\u5e03\u3002",date:"2024-03-27T00:00:00.000Z",tags:[],readingTime:14.535,hasTruncateMarker:!1,authors:[{name:"360 \u4e2d\u95f4\u4ef6\u56e2\u961f",title:"Pika \u5f00\u6e90\u793e\u533a"}],frontMatter:{title:"What's new in Pika v3.5.3 ",slug:"Pika-3.5.3",authors:[{name:"360 \u4e2d\u95f4\u4ef6\u56e2\u961f",title:"Pika \u5f00\u6e90\u793e\u533a"}],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"What's new in Pika v3.5.4",permalink:"/blog/Pika-3.5.4"},nextItem:{title:"What's new in Pika v3.5.0",permalink:"/blog/Pika-3.5.0"}},h={authorsImageUrls:[void 0]},a=[];function u(i){const n={a:"a",br:"br",img:"img",li:"li",ol:"ol",p:"p",ul:"ul",...(0,p.R)(),...i.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.p,{children:"\u968f\u7740 Redis \u5ba3\u5e03\u91c7\u7528\u53cc\u534f\u8bae\u4ee5\u7ef4\u62a4\u5176\u5546\u4e1a\u5229\u76ca\u4e4b\u9645\uff0cPikiwiDB(Pika) \u793e\u533a\u975e\u5e38\u8363\u5e78\u5730\u5ba3\u5e03\uff0c\u6211\u4eec\u7684\u6700\u65b0 v3.5.3 \u6b63\u5f0f\u751f\u4ea7\u53ef\u7528\u7248\u672c\u73b0\u5df2\u53d1\u5e03\u3002"}),"\n",(0,o.jsx)(n.p,{children:"v3.5.3 \u89e3\u51b3\u4e86\u5386\u53f2\u9057\u7559\u7684 Bug\uff0c\u5f15\u5165\u4e86\u591a\u9879\u65b0\u7279\u6027\u3002\u8fd9\u4e9b\u7279\u6027\u4e3b\u8981\u5305\u62ec Pika \u652f\u6301 ACL\u3001\u5220\u9664 Sharing \u6a21\u5f0f\u6b8b\u7559\u7684 Slot \u4ee3\u7801\u3001\u5feb\u6162\u547d\u4ee4\u5206\u79bb\u3001 Redis Stream\u3001\u5927 key \u5206\u6790\u5de5\u5177\u3001Pika \u5206\u5e03\u5f0f\u96c6\u7fa4\u652f\u6301\u5168\u81ea\u52a8\u5316 failover \u7b49\u529f\u80fd\uff0c\u540c\u65f6\uff0c\u6211\u4eec\u5728 3.5.3 \u7248\u672c\u4e30\u5bcc\u4e86\u66f4\u591a\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5 case\uff0c\u63d0\u5347 Pika \u670d\u52a1\u7684\u7a33\u5b9a\u6027\u548c\u5065\u58ee\u6027\uff0c\u4f1a\u8ba9\u7528\u6237\u611f\u53d7\u5230\u66f4\u4e3a\u9ad8\u6548\u548c\u7a33\u5b9a\u7684\u4f7f\u7528\u4f53\u9a8c\uff0c\u672c\u6587\u4e3b\u8981\u9610\u8ff0\u672c\u6b21\u6539\u52a8\u7684\u76f8\u5173\u91cd\u5927 feature\u3001bugfix \u6027\u80fd\u63d0\u5347\u9879\u3002"}),"\n",(0,o.jsx)(n.p,{children:"\u5728\u6df1\u5165\u63a2\u8ba8 3.5.3 \u7248\u672c\u7684\u66f4\u65b0\u5185\u5bb9\u4e4b\u524d\uff0c\u8bf7\u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\u58f0\u660e\uff1a"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\u7531\u4e8e\u5546\u6807\u95ee\u9898\uff0cPika \u9879\u76ee\u5df2\u66f4\u540d\u4e3a PikiwiDB\u3002\u6587\u4e2d\u4ee5 PikiwiDB(Pika) \u6307\u4ee3\u9879\u76ee",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika",children:"https://github.com/OpenAtomFoundation/pika"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u6211\u4eec\u65b0\u521b\u5efa\u4e86\u4e00\u4e2a\u9879\u76ee",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pikiwidb",children:"https://github.com/OpenAtomFoundation/pikiwidb"}),"\n\u8fd9\u662f\u4e00\u4e2a\u57fa\u4e8e Raft \u534f\u8bae\u5b9e\u73b0\u7684\u517c\u5bb9 Redis \u534f\u8bae\u7684\u5927\u5bb9\u91cf KV \u6570\u636e\u5e93\uff0c\u4e3b\u8981\u9762\u5411\u5f3a\u4e00\u81f4\u6027\u6570\u636e\u573a\u666f\uff0c\u4f8b\u5982\u5b58\u50a8\u7ea6 10TiB \u89c4\u6a21\u7684\u5143\u6570\u636e\u3002PikiwiDB \u5c06\u4e13\u95e8\u7528\u4e8e\u6307\u4ee3\u6b64\u9879\u76ee\u3002"]}),"\n",(0,o.jsx)(n.li,{children:"\u6211\u4eec\u4e3a PikiwiDB \u8bbe\u8ba1\u4e86\u4e00\u4e2a\u65b0\u7684 logo\uff0c\u4f5c\u4e3a\u5176\u5546\u6807\uff0c\u5e76\u5df2\u5728\u76f8\u5173\u653f\u5e9c\u673a\u6784\u6ce8\u518c\u3002"}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"2024-03-27-Pika-3.5.3-logo",src:t(1001).A+"",width:"1080",height:"451"})}),"\n",(0,o.jsx)(n.p,{children:"1 \u91cd\u5927\u6539\u8fdb"}),"\n",(0,o.jsx)(n.p,{children:"1.1 PikiwiDB(Pika) \u652f\u6301 ACL"}),"\n",(0,o.jsx)(n.p,{children:"PikiwiDB(Pika) 3.5.3 \u7248\u672c\u6b63\u5f0f\u5168\u9762\u652f\u6301 Redis ACL\uff0c\u4e3a\u672a\u6765\u5728\u4e91\u539f\u751f Pika \u96c6\u7fa4\u4e2d\u652f\u6301\u591a\u79df\u6237\u573a\u666f\u5960\u5b9a\u4e86\u57fa\u7840\u3002\u5728\u6b64\u4e4b\u524d\uff0cPika \u5df2\u7ecf\u652f\u6301\u4e86 Redis \u7684\u7528\u6237\u8ba4\u8bc1\u65b9\u5f0f\uff0c\u5982 auth/userpass/requirepass\uff0c\u4ee5\u53ca\u901a\u8fc7 pika.conf \u4e2d\u7684 userblacklist \u914d\u7f6e\u547d\u4ee4\u9ed1\u540d\u5355\u6a21\u5f0f\u3002\u672c\u6b21\u66f4\u65b0\u4fdd\u6301\u4e86\u5411\u540e\u517c\u5bb9\uff0c\u5e76\u652f\u6301\u8fd9\u4e9b\u5df2\u6709\u7684\u4f7f\u7528\u65b9\u5f0f\u3002"}),"\n",(0,o.jsx)(n.p,{children:"\u6211\u4eec\u8fd8\u786e\u4fdd PikiwiDB(Pika) \u7684 ACL \u5b9e\u73b0\u4e0e Redis ACL \u5b8c\u5168\u517c\u5bb9\uff0c\u901a\u8fc7\u5c06 Redis \u7684\u6240\u6709 ACL TCL \u6d4b\u8bd5\u96c6\u7eb3\u5165 PikiwiDB(Pika) \u7684\u6d4b\u8bd5\u96c6\u4e2d\u3002"}),"\n",(0,o.jsx)(n.p,{children:"\u5173\u952e PR\uff1a"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["PikiwiDB(Pika) \u652f\u6301 ACL\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2013",children:"https://github.com/OpenAtomFoundation/pika/pull/2013"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u6b63 ACL \u7528\u6237\u8ba4\u8bc1\u9519\u8bef\u95ee\u9898\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2449",children:"https://github.com/OpenAtomFoundation/pika/pull/2449"})]}),"\n",(0,o.jsxs)(n.li,{children:["ACL \u5411\u524d\u517c\u5bb9 userblacklist\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2459",children:"https://github.com/OpenAtomFoundation/pika/pull/2459"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u6dfb\u52a0 Redis ACL \u6d4b\u8bd5\u96c6\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2495",children:"https://github.com/OpenAtomFoundation/pika/pull/2495"})]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"1.2 \u6df7\u5408\u5b58\u50a8\u6a21\u578b\u652f\u6301 bitmap"}),"\n",(0,o.jsx)(n.p,{children:"\u5728\u5355\u4f53\u73af\u5883\u4e0b\uff0c\u540c\u65f6\u4f18\u5316 PikiwiDB(Pika) \u7684\u8bfb/\u5199/compaction \u662f\u4e00\u9879\u6311\u6218\u3002\u5728 v3.5.2 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u5f15\u5165\u4e86\u7531\u7f13\u5b58 Redis \u548c RocksDB \u6784\u6210\u7684\u6df7\u5408\u5b58\u50a8\u6a21\u578b\uff0c\u5e76\u652f\u6301\u4e86 string/list/set/zset/hashtable \u4e94\u79cd\u6570\u636e\u7ed3\u6784\u3002\u5728 3.5.3 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u589e\u52a0\u4e86\u5bf9 bitmap \u7684\u652f\u6301\u3002"}),"\n",(0,o.jsx)(n.p,{children:"\u6b64\u5916\uff0c\u6211\u4eec\u5728 3.5.3 \u7248\u672c\u4e2d\u652f\u6301\u5bf9 Redis \u7f13\u5b58\u8fdb\u884c\u52a8\u6001\u53c2\u6570\u8c03\u6574\u3002"}),"\n",(0,o.jsx)(n.p,{children:"\u5173\u952e PR \u94fe\u63a5\uff1a"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["\u652f\u6301 bitmap \u7684\u652f\u6301\uff1a\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2253",children:"https://github.com/OpenAtomFoundation/pika/pull/2253"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["\u53e6\u5916\uff0c\u6211\u4eec\u5728 3.5.3 \u7248\u672c\u4e2d\u652f\u6301\u5bf9 Redis \u7f13\u5b58\u8fdb\u884c\u52a8\u6001\u8c03\u53c2\uff1a\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2197",children:"https://github.com/OpenAtomFoundation/pika/pull/2197"})]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"1.3 \u5feb\u6162\u547d\u4ee4\u5206\u79bb"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\u4e3a\u4e86\u9632\u6b62\u6162\u547d\u4ee4\u628a\u5feb\u547d\u4ee4\u6267\u884c\u5361\u6b7b\uff0c\u6211\u4eec\u5728 Codis-Proxy \u548c PikiwiDB(Pika) \u4e24\u4e2a\u5c42\u9762\u90fd\u5b9e\u73b0\u4e86\u5feb\u6162\u547d\u4ee4\u5206\u79bb\u3002\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2162",children:"https://github.com/OpenAtomFoundation/pika/pull/2162"})]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"1.4 Redis Stream"}),"\n",(0,o.jsx)(n.p,{children:"\u867d\u7136 PikiwiDB(Pika) \u4e4b\u524d\u652f\u6301\u4e86 Redis pubsub\uff0c\u4f46\u5b83\u53ea\u80fd\u8fdb\u884c\u5728\u7ebf\u6d88\u606f\u4f20\u9012\u3002\u5728 3.5.3 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u589e\u52a0\u4e86\u5bf9 Redis Stream \u7684\u6709\u9650\u652f\u6301\uff0c\u7c7b\u4f3c\u4e8e\u6d88\u606f\u961f\u5217\uff08MQ\uff09\uff0c\u4ee5\u4fbf\u66f4\u5b89\u5168\u5730\u4f20\u9012\u6d88\u606f\u3002\u4e3a\u4e86\u786e\u4fdd\u6570\u636e\u7684\u5b89\u5168\u6027\uff0c\u6211\u4eec\u5728\u5e95\u5c42\u5f15\u64ce BlackWidow \u4e2d\u7279\u522b\u6dfb\u52a0\u4e86\u5bf9 Stream \u6570\u636e\u7c7b\u578b\u7684\u652f\u6301\u3002\n\u5173\u952e PR\uff1a"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Pika \u652f\u6301 Redis Stream\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1955",children:"https://github.com/OpenAtomFoundation/pika/pull/1955"}),"\n\u8bf7\u6ce8\u610f\uff0cPika Stream \u76ee\u524d\u8fd8\u4e0d\u652f\u6301\u6d88\u8d39\u7ec4\u6d88\u8d39\uff0c\u8fd9\u5c06\u5728\u540e\u7eed\u7248\u672c\u4e2d\u5b9e\u73b0\u3002"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"1.5 \u4e91\u539f\u751f\u96c6\u7fa4"}),"\n",(0,o.jsx)(n.p,{children:"\u5728 PikiwiDB(Pika) 3.5.0 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u5f00\u6e90\u4e86 Pika-Operator\uff0c\u5b83\u652f\u6301\u5728 K8s \u4e0a\u90e8\u7f72 Pika \u4e3b\u4ece\u5bf9\u3002\u5728 3.5.2 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u57fa\u4e8e Kubeblocks \u7684 Pika-Operator \u652f\u6301\u4e86\u5728 K8s \u4e0a\u90e8\u7f72\u7c7b\u4f3c Codis \u7684 Pika Cluster\uff0c\u4f46\u5f53\u65f6\u8fd8\u4e0d\u652f\u6301\u52a8\u6001\u6269\u7f29\u5bb9\u3002"}),"\n",(0,o.jsx)(n.p,{children:"\u5728 3.5.3 \u7248\u672c\u4e2d\uff0c\u6700\u65b0\u7684 Pika-Operator \u5df2\u7ecf\u652f\u6301\u4e86 Codis Group \u7ea7\u522b\u7684\u8282\u70b9\u6269\u7f29\u5bb9\uff0c\u5e76\u4e14\u652f\u6301\u6570\u636e\u7684 Rebalance\u3002\n\u5173\u952e PR\uff1a"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["PikiwiDB(Pika) Operator \u652f\u6301 pika \u96c6\u7fa4\u81ea\u52a8\u6269\u5bb9\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2121",children:"https://github.com/OpenAtomFoundation/pika/pull/2121"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["\u4f18\u5316 codis slot \u8fc1\u79fb\u901f\u5ea6\uff0c\u652f\u6301\u52a8\u6001\u4fee\u6539\u8fc1\u79fb\u7ebf\u7a0b\u548c\u901f\u5ea6\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2486",children:"https://github.com/OpenAtomFoundation/pika/pull/2486"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Pika-operator \u652f\u6301 namespace\uff0c\u5728\u4e0d\u540c\u7684 namespace \u4e0b\u90e8\u7f72\u4e0d\u540c\u7684\u96c6\u7fa4\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2480",children:"https://github.com/OpenAtomFoundation/pika/pull/2480"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Pika-operator \u652f\u6301\u76d1\u63a7\u6307\u6807\u91c7\u96c6\uff0c\u81ea\u52a8\u62c9\u8d77 pika-expoter"}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2451",children:"https://github.com/OpenAtomFoundation/pika/pull/2451"}),"\n1.6 Compaction \u6539\u8fdb"]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"PikiwiDB(Pika) \u7684\u5e95\u5c42\u78c1\u76d8\u5b58\u50a8\u5f15\u64ce RocksDB \u5728\u8fdb\u884c compaction \u65f6\u4f1a\u663e\u8457\u5f71\u54cd PikiwiDB(Pika) \u7684\u8bfb\u5199\u6027\u80fd\u3002\u56e0\u6b64\uff0c\u63a7\u5236\u597d compaction \u662f\u4f18\u5316 Pika \u8bfb\u5199\u6027\u80fd\u7684\u5173\u952e\u3002\n\u6709\u5173 compaction \u7684\u5173\u952e\u4f18\u5316 PR \u5982\u4e0b\uff1a"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\u6dfb\u52a0 CompactRange \u547d\u4ee4\u652f\u6301\u5bf9\u4e00\u5b9a\u8303\u56f4\u5185\u7684 key \u8fdb\u884c compact\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2163",children:"https://github.com/OpenAtomFoundation/pika/pull/2163"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u63d0\u5347 Compaction \u901f\u5ea6\u51cf\u5c11 Compaction \u8017\u65f6\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2172",children:"https://github.com/OpenAtomFoundation/pika/pull/2172"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u6267\u884c shutdown \u547d\u4ee4\u65f6\u8c03\u7528 disable compaction, \u63d0\u5347\u8fdb\u7a0b\u9000\u51fa\u901f\u5ea6\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2345",children:"https://github.com/OpenAtomFoundation/pika/pull/2345"})]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"1.7 \u81ea\u52a8 Failover"}),"\n",(0,o.jsx)(n.p,{children:"PikiwiDB(Pika) \u96c6\u7fa4\u76ee\u524d\u662f\u57fa\u4e8e Codis \u5b9e\u73b0\u7684\u3002\u4e3a\u4e86\u63d0\u9ad8\u57fa\u4e8e Codis \u7684 PikiwiDB(Pika) Cluster \u7684\u6613\u7528\u6027\uff0c\u6211\u4eec\u5bf9 Codis \u8fdb\u884c\u4e86\u8bb8\u591a\u6269\u5c55\u3002"}),"\n",(0,o.jsx)(n.p,{children:"\u539f\u59cb\u7684 Codis \u4e0d\u652f\u6301 Group \u5185\u7684 Failover\uff0c\u9700\u8981\u4f7f\u7528 Redis Sentinel\uff0c\u8fd9\u4f1a\u5bfc\u81f4\u8fd0\u7ef4\u6210\u672c\u589e\u52a0\u3002\u6211\u4eec\u5728 Codis Dashboard \u4e2d\u52a0\u5165\u4e86 sentinel \u7684\u529f\u80fd\uff0c\u5b9e\u73b0\u4e86\u5bf9 Group \u5185\u4e3b\u4ece\u7684\u81ea\u52a8 failover\u3002"}),"\n",(0,o.jsx)(n.p,{children:"\u5173\u952e PR\uff1a"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["PikiwiDB(Pika) \u5206\u5e03\u5f0f\u96c6\u7fa4\u652f\u6301\u81ea\u52a8 failover\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2386",children:"https://github.com/OpenAtomFoundation/pika/pull/2386"})]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"1.8 \u53ef\u89c2\u6d4b\u6027\u63d0\u5347"}),"\n",(0,o.jsx)(n.p,{children:"PikiwiDB(Pika) \u7684\u53ef\u89c2\u6d4b\u6027\u5173\u952e\u7ec4\u4ef6\u662f Pika-Exporter\u3002\u5728 3.5.2 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u867d\u7136\u6dfb\u52a0\u4e86 Redis Cache \u7f13\u5b58\u70ed\u6570\u636e\uff0c\u4f46\u7f3a\u5c11\u76d1\u63a7\u6307\u6807\u3002\u5728 3.5.3 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u589e\u52a0\u4e86\u5305\u62ec\u547d\u4e2d\u7387\u3001\u6bcf\u79d2\u547d\u4e2d\u6b21\u6570\u3001Redis Cache \u5185\u5b58\u4f7f\u7528\u91cf\u3001Redis Cache \u4e2a\u6570\u3001Redis Cache DB \u4e2a\u6570 \u7b49\u6307\u6807\u3002"}),"\n",(0,o.jsx)(n.p,{children:"\u5173\u952e PR\uff1a"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["PikiwiDB(Pika) exporter \u66b4\u9732 cache \u76f8\u5173\u7684\u6570\u636e\u91c7\u96c6\u6307\u6807",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2318",children:"https://github.com/OpenAtomFoundation/pika/pull/2318"})]}),"\n",(0,o.jsxs)(n.li,{children:["PikiwiDB(Pika) \u5206\u5e03\u5f0f\u96c6\u7fa4 Codis proxy \u65b0\u589e\u53ef\u89c2\u6d4b\u6307\u6807",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2199",children:"https://github.com/OpenAtomFoundation/pika/pull/2199"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590ddbsize \u8ba1\u7b97\u9519\u8bef\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2494",children:"https://github.com/OpenAtomFoundation/pika/pull/2494"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u7f51\u7edc\u76d1\u63a7\u6307\u6807\u7edf\u8ba1\u4e0d\u51c6\u786e\u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2234",children:"https://github.com/OpenAtomFoundation/pika/pull/2234"}),"\n1.9 \u6570\u636e\u4e00\u81f4\u6027\n3.5.3 \u7248\u672c\u4fee\u590d\u4e86\u8bb8\u591a PikiwiDB(Pika) \u4e3b\u4ece\u540c\u6b65\u95ee\u9898\uff0c\u786e\u4fdd\u6570\u636e\u7684\u4e00\u81f4\u6027\u3002"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"\u5173\u952e PR\uff1a"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u4e3b\u4ece\u590d\u5236\u8fc7\u7a0b\u4e2d, slave \u8282\u70b9\u6536\u5230 master \u5f02\u5e38\u56de\u5305\u540e\u7684\u5904\u7406\u903b\u8f91",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2319",children:"https://github.com/OpenAtomFoundation/pika/pull/2319"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d Pika cache \u90e8\u5206\u573a\u666f\u4e0b cache \u548c DB \u6570\u636e\u4e0d\u4e00\u81f4\u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2225",children:"https://github.com/OpenAtomFoundation/pika/pull/2225"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u5168\u91cf\u590d\u5236\u5931\u8d25\u540e\uff0c\u672a\u505a\u5904\u7406\u5bfc\u81f4\u6570\u636e\u4e22\u5931\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2439",children:"https://github.com/OpenAtomFoundation/pika/pull/2439"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u4e3b\u4ece\u590d\u5236\u8fc7\u7a0b\u4e2d\uff0c\u4e3b\u5b9e\u4f8b\u6267\u884c bgsave \u8fc7\u7a0b\u4e2d\uff0c\u6ca1\u6709\u6b63\u786e\u56de\u5e94\u4ece\u7684\u540c\u6b65\u8bf7\u6c42",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2437",children:"https://github.com/OpenAtomFoundation/pika/pull/2437"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u5168\u91cf\u590d\u5236\u8fc7\u7a0b\u4e2d\uff0c\u6dfb\u52a0\u6570\u636e\u540c\u6b65\u72b6\u6001\uff0c\u660e\u786e\u6570\u636e\u540c\u6b65\u8fdb\u5ea6",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2430",children:"https://github.com/OpenAtomFoundation/pika/pull/2430"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u4ece\u5e93\u5728 Apply binlog \u65f6\uff0c\u6ca1\u6709\u5bf9\u64cd\u4f5c\u7684 key \u52a0\u9501\uff0c\u5bfc\u81f4\u6570\u636e\u4e0d\u4e00\u81f4\u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2409",children:"https://github.com/OpenAtomFoundation/pika/pull/2409"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u8fc1\u79fb\u6570\u636e\u540e\u6570\u636e\u4e0d\u4e00\u81f4\u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2485",children:"https://github.com/OpenAtomFoundation/pika/pull/2485"})]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"1.10 \u6dfb\u52a0\u6d4b\u8bd5\u96c6"}),"\n",(0,o.jsx)(n.p,{children:"PikiwiDB(Pika) \u6d4b\u8bd5\u96c6\u7531 gtest \u5355\u6d4b\u3001Redis TCL \u6d4b\u8bd5\u96c6\u548c Go \u6d4b\u8bd5\u96c6\u7ec4\u6210\uff1a"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"gtest \u5355\u6d4b\u4e3b\u8981\u6d4b\u8bd5 Pika C++ \u4ee3\u7801"}),"\n",(0,o.jsx)(n.li,{children:"Redis TCL \u6d4b\u8bd5\u96c6\u6765\u81ea Redis\uff0c\u7528\u4e8e\u6d4b\u8bd5 PikiwiDB(Pika) \u5bf9 Redis \u6807\u51c6\u547d\u4ee4\u517c\u5bb9\u5ea6"}),"\n",(0,o.jsx)(n.li,{children:"Go \u6d4b\u8bd5\u96c6\u53ef\u5bf9 Pika \u8fdb\u884c Redis \u547d\u4ee4\u6d4b\u8bd5\u3001\u4e3b\u4ece\u548c Codis \u96c6\u7fa4 e2e \u6d4b\u8bd5"}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"3.5.3 \u4e2d\u6dfb\u52a0\u4e86 Codis \u96c6\u7fa4 e2e \u6d4b\u8bd5\uff0c\u5173\u952e PR \u5982\u4e0b\uff1a"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\u4e30\u5bcc\u4e86 Pika TCL \u6d4b\u8bd5\u96c6",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2497",children:"https://github.com/OpenAtomFoundation/pika/pull/2497"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4e30\u5bcc\u4e86 Pika Gotest \u6d4b\u8bd5\u96c6",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2502",children:"https://github.com/OpenAtomFoundation/pika/pull/2502"})]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["1.11 \u5de5\u5177\u96c6\nPikiwiDB(Pika) \u4e00\u76f4\u91cd\u89c6\u5de5\u5177\u96c6\u7684\u5efa\u8bbe\uff0c\u6240\u6709\u76f8\u5173\u5de5\u5177\u90fd\u53ef\u4ee5\u5728 ",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/tree/unstable/tools",children:"https://github.com/OpenAtomFoundation/pika/tree/unstable/tools"})," \u4e2d\u627e\u5230\u3002\u5728 3.5.3 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u65b0\u589e\u4e86\u4e00\u4e2a\u5de5\u5177\uff1a"]}),"\n",(0,o.jsxs)(n.p,{children:["PikiwiDB(Pika) \u652f\u6301\u5927 key \u5206\u6790\u5de5\u5177\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2195",children:"https://github.com/OpenAtomFoundation/pika/pull/2195"})]}),"\n",(0,o.jsx)(n.p,{children:"1.12 \u6587\u6863\u66f4\u65b0"}),"\n",(0,o.jsx)(n.p,{children:"PikiwiDB(Pika) \u7684\u6587\u6863\u4e3b\u8981\u662f wiki \u6587\u6863\u3002\u5728 3.5.3 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u66f4\u65b0\u4e86 Pika \u652f\u6301\u7684 Redis \u547d\u4ee4\u6587\u6863\u3002"}),"\n",(0,o.jsxs)(n.p,{children:["\u6587\u6863\u94fe\u63a5\uff1a ",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/wiki/pika-%E6%94%AF%E6%8C%81%E7%9A%84redis%E6%8E%A5%E5%8F%A3%E5%8F%8A%E5%85%BC%E5%AE%B9%E6%83%85%E5%86%B5",children:"https://github.com/OpenAtomFoundation/pika/wiki/pika-%E6%94%AF%E6%8C%81%E7%9A%84redis%E6%8E%A5%E5%8F%A3%E5%8F%8A%E5%85%BC%E5%AE%B9%E6%83%85%E5%86%B5"}),"\n2 \u6539\u8fdb\u5217\u8868"]}),"\n",(0,o.jsx)(n.p,{children:"\u5728\u7b2c\u4e00\u7ae0\u8282\u4e2d\uff0c\u6211\u4eec\u6982\u8ff0\u4e86 3.5.3 \u7248\u672c\u7684\u4e3b\u8981\u529f\u80fd\u5347\u7ea7\u548c\u6539\u8fdb\u3002\u4e0b\u9762\u8be6\u7ec6\u5217\u51fa\u4e86\u672c\u6b21\u53d1\u7248\u7684\u76f8\u5173 PR\u3002"}),"\n",(0,o.jsx)(n.p,{children:"2.1 \u65b0\u7279\u6027"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Pika \u652f\u6301 ACL"}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2013",children:"https://github.com/OpenAtomFoundation/pika/pull/2013"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"\u5728\u5168\u91cf\u590d\u5236\u7684\u8fc7\u7a0b\u4e2d\uff0cpika \u670d\u52a1\u7684\u4ece\u8282\u70b9\u4e0d\u63a5\u6536\u8bfb\u8bf7\u6c42"}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2197",children:"https://github.com/OpenAtomFoundation/pika/pull/2197"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["\u5220\u9664 Sharing \u6a21\u5f0f\u6b8b\u7559\u7684 Slot \u4ee3\u7801\uff0c\u56de\u5f52 3.0\uff0c\u4ee5\u540e\u4e00\u4e2a Pika \u4e0b\u6709\u591a\u4e2a DB\uff0c\u6bcf\u4e2a DB \u53ea\u6709\u4e00\u4e2a Blackwidow",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2251",children:"https://github.com/OpenAtomFoundation/pika/pull/2251"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["\u5728 Codis dashboard \u534f\u7a0b panic \u65f6\u81ea\u52a8\u6062\u590d\u670d\u52a1",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2349",children:"https://github.com/OpenAtomFoundation/pika/pull/2349"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Pika cache \u65b0\u589e bimap\u6570\u636e\u7c7b\u578b",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2253",children:"https://github.com/OpenAtomFoundation/pika/pull/2253"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Pika \u652f\u6301\u5feb\u6162\u547d\u4ee4\u5206\u79bb",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2162",children:"https://github.com/OpenAtomFoundation/pika/pull/2162"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Pika exporter \u66b4\u9732 cache \u76f8\u5173\u7684\u6570\u636e\u91c7\u96c6\u6307\u6807",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2318",children:"https://github.com/OpenAtomFoundation/pika/pull/2318"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Pika \u6267\u884c\u5b8c\u6210 Bgsave \u540e, \u4fdd\u7559 unix timepoint",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2167",children:"https://github.com/OpenAtomFoundation/pika/pull/2167"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Pika \u652f\u6301\u52a8\u6001\u914d\u7f6e disable_auto_compations \u53c2\u6570",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2257",children:"https://github.com/OpenAtomFoundation/pika/pull/2257"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Pika \u652f\u6301 Redis Stream",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1955",children:"https://github.com/OpenAtomFoundation/pika/pull/1955"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Pika \u652f\u6301\u5927 key \u5206\u6790\u5de5\u5177",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2195",children:"https://github.com/OpenAtomFoundation/pika/pull/2195"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Pika \u652f\u6301\u52a8\u6001\u8c03\u6574 Pika cache \u53c2\u6570",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2197",children:"https://github.com/OpenAtomFoundation/pika/pull/2197"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["\u66f4\u65b0 Pika benchmark \u5de5\u5177\u652f\u6301\u66f4\u591a\u7684\u63a5\u53e3\u538b\u6d4b",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2222",children:"https://github.com/OpenAtomFoundation/pika/pull/2222"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Pika Operator \u652f\u6301 pika \u96c6\u7fa4\u81ea\u52a8\u6269\u5bb9",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2121",children:"https://github.com/OpenAtomFoundation/pika/pull/2121"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["\u6dfb\u52a0 CompactRange \u547d\u4ee4\u652f\u6301\u5bf9\u4e00\u5b9a\u8303\u56f4\u5185\u7684 key \u8fdb\u884c compact",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2163",children:"https://github.com/OpenAtomFoundation/pika/pull/2163"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["\u63d0\u5347 Compaction \u901f\u5ea6\u51cf\u5c11 Compaction \u8017\u65f6",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2172",children:"https://github.com/OpenAtomFoundation/pika/pull/2172"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["\u5347\u7ea7 RocksDB \u7248\u672c\u5230 v8.7.3",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2157",children:"https://github.com/OpenAtomFoundation/pika/pull/2157"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Pika \u5206\u5e03\u5f0f\u96c6\u7fa4 Codis proxy \u65b0\u589e\u53ef\u89c2\u6d4b\u6307\u6807",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2199",children:"https://github.com/OpenAtomFoundation/pika/pull/2199"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Pika \u5206\u5e03\u5f0f\u96c6\u7fa4\u652f\u6301\u81ea\u52a8 failover",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2386",children:"https://github.com/OpenAtomFoundation/pika/pull/2386"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Pika \u652f\u6301 redis rename-command \u529f\u80fd",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2455",children:"https://github.com/OpenAtomFoundation/pika/pull/2455"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["\u4f18\u5316 codis slot \u8fc1\u79fb\u901f\u5ea6\uff0c\u652f\u6301\u52a8\u6001\u4fee\u6539\u8fc1\u79fb\u7ebf\u7a0b\u548c\u901f\u5ea6",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2486",children:"https://github.com/OpenAtomFoundation/pika/pull/2486"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Pika \u652f\u6301\u52a8\u6001\u8c03\u6574 max-conn-rbuf-size \u53c2\u6570",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2434",children:"https://github.com/OpenAtomFoundation/pika/pull/2434"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Pika-operator \u652f\u6301 namespace\uff0c\u53ef\u4ee5\u5728\u4e0d\u540c\u7684 namespace \u4e0b\u90e8\u7f72\u4e0d\u540c\u7684\u96c6\u7fa4",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2480",children:"https://github.com/OpenAtomFoundation/pika/pull/2480"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Pika-operator \u652f\u6301\u76d1\u63a7\u6307\u6807\u91c7\u96c6\uff0c\u81ea\u52a8\u62c9\u8d77 pika-expoter",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2451",children:"https://github.com/OpenAtomFoundation/pika/pull/2451"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["ACL \u5411\u524d\u517c\u5bb9 userblacklist",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2459",children:"https://github.com/OpenAtomFoundation/pika/pull/2459"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["\u4e30\u5bcc\u4e86 Pika TCL \u6d4b\u8bd5\u96c6",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2497",children:"https://github.com/OpenAtomFoundation/pika/pull/2497"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["\u4e30\u5bcc\u4e86 Pika Gotest \u6d4b\u8bd5\u96c6",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2502",children:"https://github.com/OpenAtomFoundation/pika/pull/2502"})]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"2.2 bug \u4fee\u590d"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d Pika \u6709\u4ece\u8282\u70b9\u8fdb\u884c\u5168\u91cf\u590d\u5236\u671f\u95f4\u4f1a\u8bef\u5220\u9664 dump \u6587\u4ef6\u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2377",children:"https://github.com/OpenAtomFoundation/pika/pull/2377"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u4e3b\u4ece\u590d\u5236\u8fc7\u7a0b\u4e2d, slave \u8282\u70b9\u6536\u5230 master \u5f02\u5e38\u56de\u5305\u540e\u7684\u5904\u7406\u903b\u8f91",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2319",children:"https://github.com/OpenAtomFoundation/pika/pull/2319"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u5728 Pika \u6267\u884c shutdown \u547d\u4ee4\u65f6\u8c03\u7528 disable compaction, \u63d0\u5347\u8fdb\u7a0b\u9000\u51fa\u901f\u5ea6",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2345",children:"https://github.com/OpenAtomFoundation/pika/pull/2345"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d Codis-dashboard Redis Memory \u503c\u4e0d\u51c6\u786e\u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2337",children:"https://github.com/OpenAtomFoundation/pika/pull/2337"})]}),"\n",(0,o.jsxs)(n.li,{children:["INFO \u547d\u4ee4\u8017\u65f6\u4f18\u5316\uff0c\u964d\u4f4e\u67e5\u78c1\u76d8\u4f7f\u7528\u91cf\u7684\u9891\u7387",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2197",children:"https://github.com/OpenAtomFoundation/pika/pull/2197"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d Rsync \u5220\u9664\u4e34\u65f6\u6587\u4ef6\u8def\u5f84\u4e0d\u5bf9\uff0c\u5220\u9664\u5931\u8d25\uff0c\u5bfc\u81f4rocksdb\u6253\u5f00\u5931\u8d25\u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2186",children:"https://github.com/OpenAtomFoundation/pika/pull/2186"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d Compact ,Bgsave ,Info keyspace \u547d\u4ee4\u672a\u6307\u5b9adb\u540d\u79f0\uff0c\u5bfc\u81f4\u90e8\u5206\u547d\u4ee4 coredump \u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2194",children:"https://github.com/OpenAtomFoundation/pika/pull/2194"})]}),"\n",(0,o.jsxs)(n.li,{children:["Codis dashboard \u7528 info replication \u66ff\u4ee3 info \u547d\u4ee4\u67e5\u5bfb master ip \u964d\u4f4e\u5bf9 Pika \u7684\u6027\u80fd\u5f71\u54cd",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2198",children:"https://github.com/OpenAtomFoundation/pika/pull/2198"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d Pika cache \u4f7f\u7528\u8fb9\u7f18case\uff0c\u89e3\u51b3\u90e8\u5206\u573a\u666f\u4e0b cache \u548c DB \u6570\u636e\u4e0d\u4e00\u81f4\u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2225",children:"https://github.com/OpenAtomFoundation/pika/pull/2225"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u5f53 dump \u6587\u4ef6\u5939\u4e3a\u7a7a\u65f6\uff0c\u4f1a\u542f\u52a8\u62a5\u9519 Segmentation fault \u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2265",children:"https://github.com/OpenAtomFoundation/pika/pull/2265"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u56e0\u4e3a flag \u8ba1\u7b97\u9519\u8bef\uff0c\u5bfc\u81f4\u7684\u90e8\u5206\u547d\u4ee4\u7f13\u5b58\u6ca1\u6709\u751f\u6548\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2217",children:"https://github.com/OpenAtomFoundation/pika/pull/2217"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u4e3b\u4ece\u590d\u5236\u6a21\u5f0f\u4e0b\uff0c\u4e3b\u5b9e\u4f8b flushdb \u540e\uff0c\u4ece\u5b9e\u4f8b\u56e0\u4e3a\u6b7b\u9501\u5bfc\u81f4\u7684\u4e0d\u80fd\u8bbf\u95ee\u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2249",children:"https://github.com/OpenAtomFoundation/pika/pull/2249"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u90e8\u5206\u547d\u4ee4\u672a\u5bf9 RocksDB \u7684\u8fd4\u56de\u503c\u8fdb\u884c\u5224\u65ad\u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2187",children:"https://github.com/OpenAtomFoundation/pika/pull/2187"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u89c4\u8303\u51fd\u6570\u7684\u8fd4\u56de\u503c\u53ca\u521d\u59cb\u503c",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2176",children:"https://github.com/OpenAtomFoundation/pika/pull/2176"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u7f51\u7edc\u76d1\u63a7\u6307\u6807\u7edf\u8ba1\u4e0d\u51c6\u786e\u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2234",children:"https://github.com/OpenAtomFoundation/pika/pull/2234"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u914d\u7f6e\u6587\u4ef6\u52a0\u8f7d\u90e8\u5206\u53c2\u6570\u5f02\u5e38\u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2218",children:"https://github.com/OpenAtomFoundation/pika/pull/2218"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d Codis dashboard cpu 100% \u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2393",children:"https://github.com/OpenAtomFoundation/pika/pull/2393"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d Codis fe pika \u4e3b\u4ece\u89d2\u8272\u663e\u793a\u5f02\u5e38\u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2387",children:"https://github.com/OpenAtomFoundation/pika/pull/2387"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u8fc1\u79fb\u6570\u636e\u540e\u6570\u636e\u4e0d\u4e00\u81f4\u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2485",children:"https://github.com/OpenAtomFoundation/pika/pull/2485"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590ddbsize \u8ba1\u7b97\u9519\u8bef\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2494",children:"https://github.com/OpenAtomFoundation/pika/pull/2494"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u6269\u7f29\u5bb9\u6216\u8005 pod \u8d77\u505c\u540e\uff0cCodis-dashboard \u754c\u9762\u663e\u793a\u4e0d\u51c6\u786e\u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2475",children:"https://github.com/OpenAtomFoundation/pika/pull/2475"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d DB \u5c42\u91cd\u590d\u4e0a\u9501\u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2372",children:"https://github.com/OpenAtomFoundation/pika/pull/2372"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u5168\u91cf\u590d\u5236\u5931\u8d25\u540e\uff0c\u672a\u505a\u5904\u7406\u5bfc\u81f4\u6570\u636e\u4e22\u5931\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2439",children:"https://github.com/OpenAtomFoundation/pika/pull/2439"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u4e3b\u4ece\u590d\u5236\u8fc7\u7a0b\u4e2d\uff0c\u4e3b\u5b9e\u4f8b\u6267\u884c bgsave \u8fc7\u7a0b\u4e2d\uff0c\u6ca1\u6709\u6b63\u786e\u56de\u5e94\u4ece\u7684\u540c\u6b65\u8bf7\u6c42",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2437",children:"https://github.com/OpenAtomFoundation/pika/pull/2437"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u5168\u91cf\u590d\u5236\u8fc7\u7a0b\u4e2d\uff0c\u6dfb\u52a0\u6570\u636e\u540c\u6b65\u72b6\u6001\uff0c\u660e\u786e\u6570\u636e\u540c\u6b65\u8fdb\u5ea6",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2430",children:"https://github.com/OpenAtomFoundation/pika/pull/2430"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u4ece\u5e93\u5728 Apply binlog \u65f6\uff0c\u6ca1\u6709\u5bf9\u64cd\u4f5c\u7684 key \u52a0\u9501\uff0c\u5bfc\u81f4\u6570\u636e\u4e0d\u4e00\u81f4\u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2409",children:"https://github.com/OpenAtomFoundation/pika/pull/2409"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d codis slot \u8fc1\u79fb\u8fc7\u7a0b\u4e2d master \u5b9e\u4f8b coredump \u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2415",children:"https://github.com/OpenAtomFoundation/pika/pull/2415"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u5728\u4e3b\u4ece\u590d\u5236\u8fc7\u7a0b\u4e2d\uff0c\u5220\u9664\u6b63\u5728\u4f7f\u7528\u7684 dump \u6587\u4ef6\u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2377",children:"https://github.com/OpenAtomFoundation/pika/pull/2377"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u4e3b\u4ece\u590d\u5236\u8fc7\u7a0b\u4e2d\u4ece\u5b9e\u4f8b rsync \u54cd\u5e94\u9519\u8bef\u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2319",children:"https://github.com/OpenAtomFoundation/pika/pull/2319"})]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["2.3 \u53d1\u7248 tag\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.3",children:"https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.3"}),"\n3 \u793e\u533a"]}),"\n",(0,o.jsx)(n.p,{children:"\u5982\u679c\u4f60\u6709\u4efb\u4f55\u7591\u95ee\uff0c\u6b22\u8fce\u52a0\u5165\u4ea4\u6d41\u7fa4\uff0cPikiwiDB(Pika) \u5f00\u6e90\u793e\u533a\u611f\u8c22\u5927\u5bb6\u7684\u652f\u6301\u548c\u5e2e\u52a9\u3002"}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"2024-03-27-Pika-3.5.3-connect",src:t(3228).A+"",width:"747",height:"431"})})]})}function c(i={}){const{wrapper:n}={...(0,p.R)(),...i.components};return n?(0,o.jsx)(n,{...i,children:(0,o.jsx)(u,{...i})}):u(i)}},3228:(i,n,t)=>{t.d(n,{A:()=>o});const o=t.p+"assets/images/2024-03-27-Pika-3.5.3-connect-c43aca0eeeb5cd09cc60b55f9a3df4e5.png"},1001:(i,n,t)=>{t.d(n,{A:()=>o});const o=t.p+"assets/images/2024-03-27-Pika-3.5.3-logo-b2c4565b5d1adebda975b365a3bcf337.png"},8453:(i,n,t)=>{t.d(n,{R:()=>l,x:()=>e});var o=t(6540);const p={},s=o.createContext(p);function l(i){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof i?i(n):{...n,...i}}),[n,i])}function e(i){let n;return n=i.disableParentContext?"function"==typeof i.components?i.components(p):i.components||p:l(i.components),o.createElement(s.Provider,{value:n},i.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/2fcac357.f2526d07.js b/build/assets/js/2fcac357.f2526d07.js new file mode 100644 index 0000000..fcfe8f4 --- /dev/null +++ b/build/assets/js/2fcac357.f2526d07.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[2885],{8356:(n,e,i)=>{i.r(e),i.d(e,{assets:()=>l,contentTitle:()=>a,default:()=>p,frontMatter:()=>s,metadata:()=>o,toc:()=>d});var t=i(4848),r=i(8453);const s={title:"Pika \u4e3b\u4ece\u540c\u6bd4",sidebar_position:2},a=void 0,o={id:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u4e3b\u4ece\u540c\u6b65/index",title:"Pika \u4e3b\u4ece\u540c\u6bd4",description:"alt text",source:"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u4e3b\u4ece\u540c\u6b65/index.md",sourceDirName:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u4e3b\u4ece\u540c\u6b65",slug:"/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u4e3b\u4ece\u540c\u6b65/",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u4e3b\u4ece\u540c\u6b65/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u4e3b\u4ece\u540c\u6b65/index.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Pika \u4e3b\u4ece\u540c\u6bd4",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Pika \u8bfb\u5199\u6d41\u7a0b\u7b80\u4ecb",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u8bfb\u5199\u6d41\u7a0b/"},next:{title:"\u7f16\u7801\u89c4\u8303",permalink:"/docs/\u5f00\u53d1\u6587\u6863/"}},l={},d=[{value:"Introduction",id:"introduction",level:2},{value:"\u540c\u6b65\u7ebf\u7a0b\u6a21\u578b",id:"\u540c\u6b65\u7ebf\u7a0b\u6a21\u578b",level:2},{value:"\u4e3b\u4ece\u534f\u5546\u5efa\u7acb\u540c\u6b65",id:"\u4e3b\u4ece\u534f\u5546\u5efa\u7acb\u540c\u6b65",level:2},{value:"MetaSync",id:"metasync",level:3},{value:"TrySync",id:"trysync",level:3},{value:"DbSync",id:"dbsync",level:3},{value:"Master DbSync Behavior",id:"master-dbsync-behavior",level:3},{value:"TrySync",id:"trysync-1",level:3},{value:"DbSync",id:"dbsync-1",level:3},{value:"Master DbSync Behavior",id:"master-dbsync-behavior-1",level:3},{value:"Slave DbSync Behavior",id:"slave-dbsync-behavior",level:3},{value:"BinlogSync",id:"binlogsync",level:3},{value:"\u4e00\u81f4\u6027\u540c\u6b65",id:"\u4e00\u81f4\u6027\u540c\u6b65",level:3},{value:"\u4ece\u5728\u4e00\u81f4\u6027\u573a\u666f\u4e0b\u7684\u6570\u636e\u5199\u5165",id:"\u4ece\u5728\u4e00\u81f4\u6027\u573a\u666f\u4e0b\u7684\u6570\u636e\u5199\u5165",level:3},{value:"\u4e3b\u5728\u4e00\u81f4\u6027\u573a\u666f\u4e0b\u7684\u6570\u636e\u5199\u5165",id:"\u4e3b\u5728\u4e00\u81f4\u6027\u573a\u666f\u4e0b\u7684\u6570\u636e\u5199\u5165",level:3},{value:"Reference",id:"reference",level:2}];function c(n){const e={a:"a",code:"code",h2:"h2",h3:"h3",img:"img",p:"p",pre:"pre",...(0,r.R)(),...n.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(e.p,{children:(0,t.jsx)(e.img,{alt:"alt text",src:i(7162).A+"",width:"572",height:"175"})}),"\n",(0,t.jsx)(e.h2,{id:"introduction",children:"Introduction"}),"\n",(0,t.jsx)(e.p,{children:"Pika\u7684\u4e3b\u4ece\u540c\u6b65\u7684\u6982\u5ff5\u5728\u7ecf\u5178\u6a21\u5f0f\u4e0b\u548c\u96c6\u7fa4\u6a21\u5f0f\u4e0b\u4f1a\u6709\u5dee\u5f02\uff0c\u4f46\u662f\u5176\u6700\u57fa\u672c\u7684\u540c\u6b65\u5355\u5143\u90fd\u662f\u5185\u90e8\u7ed3\u6784Partition\u7684\u540c\u6b65\u3002Partition\u662fPika\u4ee3\u7801\u5c42\u9762\u7684\u6700\u5c0f\u540c\u6b65\u5355\u5143\uff0c\u7ecf\u5178\u6a21\u5f0f\u4e0b\u591aDB\u7ed3\u6784\uff0c\u6bcf\u4e00\u4e2aDB\u5bf9\u5e94\u4e00\u4e2aPartition\uff0c\u96c6\u7fa4\u6a21\u5f0f\u4e0b\u6bcf\u4e00\u4e2a\u5206\u7247\u5bf9\u5e94\u4e00\u4e2aPartition\uff0c\u6240\u4ee5\u4e0d\u7ba1\u662f\u4ec0\u4e48\u6a21\u5f0f\uff0c\u53ea\u662f\u8df3\u51faPika\u4ee3\u7801\u4e4b\u5916\u7684\u6982\u5ff5\u6709\u533a\u522b\uff0c\u5728Pika\u4ee3\u7801\u5185\u90e8\u7edf\u79f0\u4e3aPartition\u7684\u540c\u6b65\u3002\u4e0b\u8fb9\u4e3b\u8981\u5173\u6ce8\u7ecf\u5178\u6a21\u5f0f\u4e0b\u591aDB\u7684\u540c\u6b65\u6d41\u7a0b\uff0c\u96c6\u7fa4\u6a21\u5f0f\u4e0b\u7684\u540c\u6b65\u611f\u5174\u8da3\u7684\u540c\u5b66\u53ef\u4ee5\u81ea\u884c\u6574\u7406\u3002"}),"\n",(0,t.jsx)(e.p,{children:"Pika \u7684\u540c\u6b65\u4e3b\u8981\u5206\u4e3a\u4e24\u4e2a\u90e8\u5206\uff0c\u9996\u5148\u662f\u8fdb\u7a0b\u7ea7\u522b\u7684\u540c\u6b65\uff0c\u786e\u8ba4\u4e3b\u4ecedb\u4e2a\u6570\u662f\u76f8\u540c\u7684\u3002\u8fd9\u4e00\u8fc7\u7a0b\u79f0\u4e4b\u4e3aMetaSync\u3002\u4e4b\u540e\u6bcf\u4e00\u4e2aPartition\u5355\u72ec\u540c\u6b65\uff0c\u901a\u8fc7\u4ece\u7ed9\u4e3b\u53d1\u9001\u7684TrySync \u4fe1\u606f\uff0c\u67e5\u770b\u4e3b\u4ece\u540c\u6b65\u70b9\u4f4d\uff0c\u4ece\u5224\u65ad\u9700\u8981\u53d1\u8d77\u5168\u91cf\u540c\u6b65\u8fd8\u662f\u589e\u91cf\u540c\u6b65\u3002\u5168\u91cf\u540c\u6b65\u7531DbSync \u6d88\u606f\u6765\u53d1\u8d77\uff0c\u589e\u91cf\u540c\u6b65\u7531BinlogSync \u6d88\u606f\u6765\u53d1\u8d77\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f\u5168\u540c\u6b65\u505a\u5b8c\uff0c\u4ece\u4f1a\u518d\u53d1\u9001\u4e00\u6b21TrySync\u6d88\u606f\u5c1d\u8bd5BinlogSync\u6765\u540c\u6b65\u5168\u540c\u6b65\u671f\u95f4\u7684\u589e\u91cf\u6570\u636e\u3002"}),"\n",(0,t.jsx)(e.h2,{id:"\u540c\u6b65\u7ebf\u7a0b\u6a21\u578b",children:"\u540c\u6b65\u7ebf\u7a0b\u6a21\u578b"}),"\n",(0,t.jsx)(e.p,{children:(0,t.jsx)(e.img,{alt:"alt text",src:i(9112).A+"",width:"670",height:"415"})}),"\n",(0,t.jsx)(e.p,{children:"Pika\u7684\u540c\u6b65\u6a21\u578b\u4e2d\uff0c\u6240\u6709\u540c\u6b65\u6d41\u7a0b\u7684\u53d1\u8d77\u8005\u90fd\u662f\u4ece\u8282\u70b9\uff08\u8fd9\u4e00\u70b9\u5f88\u91cd\u8981\uff09\uff0cMetaSync\uff0cTrySync\uff0cDbSync\uff0cBinlogSync\u90fd\u662f\u4ece\u53d1\u8d77\u5230\u4e3b\u3002\u5728MetaSync\uff0cTrySync\uff0cDbSync\uff0cBinlogSync\u6d41\u7a0b\u4e2d\uff0c\u4e3b\u7684\u56de\u590d\u7528\u7684\u8fde\u63a5\u662f\u4ece\u53d1\u8d77\u8bf7\u6c42\u65f6\u5efa\u7acb\u7684\u8fde\u63a5\u3002\u5373\u4e0a\u56fe\u4e2d\u4e3bPikaReplServerThread \u5230 PikaReplClientThread \u7684\u8fde\u63a5\u3002"}),"\n",(0,t.jsx)(e.pre,{children:(0,t.jsx)(e.code,{className:"language-c++",children:"class PikaAuxiliaryThread : public pink::Thread {\n virtual void* ThreadMain();\n while (!should_stop()) {\n if (g_pika_server->ShouldMetaSync()) {\n g_pika_rm->SendMetaSyncRequest();\n } else if (g_pika_server->MetaSyncDone()) {\n g_pika_rm->RunSyncSlavePartitionStateMachine();\n }\n Status s = g_pika_rm->CheckSyncTimeout(slash::NowMicros());\n s = g_pika_server->TriggerSendBinlogSync();\n int res = g_pika_server->SendToPeer();\n if (!res) {\n // sleep 100 ms\n mu_.Lock();\n cv_.TimedWait(100);\n mu_.Unlock();\n }\n }\n}\n"})}),"\n",(0,t.jsx)(e.p,{children:"\u8f85\u52a9\u7ebf\u7a0b\u7684\u5de5\u4f5c\u4e3b\u8981\u5305\u62ec1\uff09Pika\u540c\u6b65MetaSync\u6d88\u606f\u53d1\u9001\uff0c2\uff09TrySync\u6d88\u606f\u53d1\u9001\uff0c3\uff09\u9a71\u52a8BinlogSync\u6d41\u7a0b\u542f\u52a8\uff0c4\uff09Partition\u7ea7\u522b\u7684keepalive\u548c\u8d85\u65f6\u68c0\u6d4b\u3002"}),"\n",(0,t.jsx)(e.p,{children:"\u5176\u4e2d\uff0cSendToPeer\u51fd\u6570\u8d1f\u8d23\u5c1d\u8bd5\u5411\u4ece\u53d1\u9001\u6d88\u606f\uff0c\u8fd4\u56de\u503c\u4ee3\u8868\u53d1\u9001\u4e86\u591a\u5c11\u6761Binlog\uff0c\u5982\u679c\u6ca1\u6709\u4efb\u4f55\u53ef\u4ee5\u53d1\u9001\u7684Binlog\uff0c\u4e3a\u4e86\u8ba9\u51faCPU\u8d44\u6e90\uff0c\u8f85\u52a9\u7ebf\u7a0b\u4f1asleep 100ms\u3002"}),"\n",(0,t.jsx)(e.pre,{children:(0,t.jsx)(e.code,{className:"language-c++",children:"class PikaReplClient {\n PikaReplClientThread* client_thread_;\n std::vector bg_workers_;\n Status SendMetaSync();\n Status SendPartitionDBSync(...);\n Status SendPartitionTrySync((...);\n Status SendPartitionBinlogSync(...);\n};\n\nclass PikaReplClientThread : public pink::ClientThread {\n class ReplClientConnFactory : public pink::ConnFactory {\n virtual std::shared_ptr NewPinkConn(...) {\n return std::make_shared(...);\n }\n }\n class ReplClientHandle : public pink::ClientHandle {\n void FdTimeoutHandle(int fd, const std::string& ip_port) const override;\n void FdClosedHandle(int fd, const std::string& ip_port) const override;\n }\n}\n\nclass PikaReplClientConn: public pink::PbConn {\n int DealMessage() override;\n static void HandleMetaSyncResponse(void* arg);\n static void HandleDBSyncResponse(void* arg);\n static void HandleTrySyncResponse(void* arg);\n void DispatchBinlogRes(\n const std::shared_ptr response);\n}\n\nclass PikaReplBgWorker {\n pink::BGThread bg_thread_;\n static void HandleBGWorkerWriteBinlog(void* arg);\n static void HandleBGWorkerWriteDB(void* arg);\n}\n"})}),"\n",(0,t.jsx)(e.p,{children:"class PikaReplClient \u4e2d\u5305\u542b\u4e86PikaReplClientThread \u5f02\u6b65\u5ba2\u6237\u7aef\uff0c\u548c\u4e00\u7ec4PikaReplBgWorker\u5f02\u6b65\u5904\u7406binlog\u7684\u8bfb\u5199\u3002\u5e76\u4e14PikaReplClient\u4e2d\u5c01\u88c5\u4e86\u5404\u4e2a\u534f\u8bae\u7684Send\u51fd\u6570\u3002"}),"\n",(0,t.jsx)(e.p,{children:"1\uff0cPikaReplClientThread\u7ee7\u627f\u81eaClientThread\uff0c\u5176\u672c\u8d28\u662f\u4e00\u4e2a\u5f02\u6b65\u7684\u5ba2\u6237\u7aef \uff0c\u5b9a\u4e49\u4e86ReplClientConnFactory\u548cReplClientHandle\u3002ConnFactory \u548cClientHandle \u7684\u542b\u4e49\u8be6\u89c1Pika\u4f20\u706b\u8ba1\u5212\u4e4b\u7ebf\u7a0b\u6a21\u578b\u3002"}),"\n",(0,t.jsx)(e.p,{children:"2\uff0cPikaReplClientConn\u7ee7\u627f\u81eaPbConn\uff0c\u5176\u901a\u4fe1\u534f\u8bae\u4e3aProtobuf\u534f\u8bae\uff0c\u5176\u4e2d\u5305\u542b\u4e86PikaReplClientThread\u63a5\u6536\u5230\u76f8\u5e94\u534f\u8bae\u7684\u5904\u7406\u51fd\u6570\u3002"}),"\n",(0,t.jsx)(e.p,{children:"3\uff0cPikaReplBgWorker\u662f\u9ad8\u6548\u5904\u7406\u540c\u6b65\u8fc7\u6765Binlog\u7684\u4e00\u7ec4\u5de5\u4f5c\u7ebf\u7a0b\u3002PikaReplClientThread\u63a5\u6536\u5230\u76f8\u5e94\u534f\u8bae\u62a5\u6587\u540e\uff0c\u5bf9\u4e8e\u4e00\u4e9b\u963b\u585e\u7684\u64cd\u4f5c\uff0c\u4f8b\u5982\u672c\u5730Binlog\u5199\u5165\u548cDb\u7684\u5199\u5165\u7b49\u64cd\u4f5c\u4f1a\u76f4\u63a5\u5b89\u6392\u7ed9PikaReplBgWorker \u64cd\u4f5c\u3002\u907f\u514d\u963b\u585ePikaReplClientThread\u540e\u7eed\u62a5\u6587\u7684\u5904\u7406\u3002"}),"\n",(0,t.jsx)(e.pre,{children:(0,t.jsx)(e.code,{className:"language-c++",children:"class PikaReplServer {\n // thread pool size PIKA_REPL_SERVER_TP_SIZE 3\n pink::ThreadPool* server_tp_;\n PikaReplServerThread* pika_repl_server_thread_;\n slash::Status SendSlaveBinlogChips(\n const std::string& ip,\n int port, const std::vector& tasks);\n void Schedule(pink::TaskFunc func, void* arg);\n}\n\nclass PikaReplServerThread : public pink::HolyThread {\n class ReplServerConnFactory : public pink::ConnFactory {\n virtual std::shared_ptr NewPinkConn(...) {\n return std::make_shared(...);\n }\n }\n class ReplServerHandle : public pink::ServerHandle {\n virtual void FdClosedHandle(\n int fd, const std::string& ip_port) const override;\n }\n}\n\nclass PikaReplServerConn: public pink::PbConn {\n int DealMessage();\n static void HandleMetaSyncRequest(void* arg);\n static void HandleTrySyncRequest(void* arg);\n static void HandleDBSyncRequest(void* arg);\n static void HandleBinlogSyncRequest(void* arg);\n}\n"})}),"\n",(0,t.jsx)(e.p,{children:"class PikaReplServer \u5305\u542b\u4e86\u4e00\u4e2a\u5c0f\u578b\u7ebf\u7a0b\u6c60ThreadPool\uff0c\u548cPikaReplServerThread\u3002\u5e76\u4e14\u5305\u542b\u4e86\u53d1\u9001Binlog\u7684\u63a5\u53e3SendSlaveBinlogChips\u3002"}),"\n",(0,t.jsx)(e.p,{children:"1\uff0cPikaReplServerThread\u7ee7\u627f\u81eaHolyThread\uff0cHolyThread\u7ee7\u627f\u81eaServerThread\uff0c\u5b9e\u73b0\u4e86HandleConnEvent\u548cHandleNewConn\uff0c\u662f\u4e00\u4e2a\u5355\u7ebf\u7a0b\u7684\u8f7b\u91cf\u7ea7server\u3002\u540c\u65f6\u4e5f\u5b9e\u73b0\u4e86ReplServerConnFactory \u548cReplServerHandle\u3002"}),"\n",(0,t.jsx)(e.p,{children:"2\uff0cPikaReplServerConn \u7ee7\u627f\u81eaPbConn\uff0c\u5176\u901a\u4fe1\u534f\u8bae\u4e5f\u662fProtobuf\u534f\u8bae\u3002\u5176\u4e2d\u8fd8\u5305\u542b\u4e86PikaReplServerThread\u63a5\u6536\u5230\u76f8\u5e94\u534f\u8bae\u7684\u5904\u7406\u51fd\u6570\u3002"}),"\n",(0,t.jsx)(e.p,{children:"3\uff0c\u7531\u4e8ePikaReplServerThread \u7531\u4e8e\u6536\u5230Binlog\u7684ack\u4e4b\u540e\u4f1a\u4ece\u78c1\u76d8\u4e2d\u52a0\u8f7d\u4e0b\u6b21\u540c\u6b65\u5230\u4ece\u7684binlog\u5230\u5185\u5b58\u4e2d\uff0c\u6240\u4ee5\u4e3a\u4e86\u907f\u514d\u963b\u585ePikaReplServerThread\u540e\u7eed\u62a5\u6587\u5904\u7406\uff0c\u4f1a\u963b\u585e\u7684\u64cd\u4f5c\u88ab\u5b89\u6392\u5230\u4e86ThreadPool \u5f53\u4e2d\u3002"}),"\n",(0,t.jsx)(e.h2,{id:"\u4e3b\u4ece\u534f\u5546\u5efa\u7acb\u540c\u6b65",children:"\u4e3b\u4ece\u534f\u5546\u5efa\u7acb\u540c\u6b65"}),"\n",(0,t.jsx)(e.p,{children:"\u4e3b\u4ece\u5efa\u7acb\u540c\u6b65\u7684\u8fc7\u7a0b\u5206\u4e3aMetaSync=>TrySync=>BinlogSync\uff0c\u6216\u8005MetaSync=>TrySync=>DbSync=>BinlogSync\u4e24\u79cd\u6a21\u5f0f\u3002MetaSync \u662f\u8fdb\u7a0b\u4e4b\u95f4\u7684\u4e3b\u4ece\u540c\u6b65db\u4e2a\u6570\u662f\u5426\u4e00\u6837\u3002TrySync\u662f\u6bcf\u4e00\u4e2a\u4ecePartition\u4e3b\u52a8\u53d1\u8d77\uff0c\u5c06\u81ea\u5df1Binlog\u7684\u4f4d\u7f6e\u53d1\u9001\u7ed9\u4e3b\uff0c\u63a5\u6536\u5230\u4e3b\u7684\u8fd4\u56deTrySyncResp\u4e4b\u540e\uff0c\u8fdb\u4e00\u6b65\u5224\u65ad\u662f\u5168\u91cf\u540c\u6b65\u505aDbSync \u8fd8\u662f\u76f4\u63a5\u53ef\u4ee5\u589e\u91cf\u540c\u6b65\u505aBinlogSync\u3002"}),"\n",(0,t.jsx)(e.h3,{id:"metasync",children:"MetaSync"}),"\n",(0,t.jsx)(e.p,{children:"\u5728\u6b63\u5f0f\u5efa\u7acb\u540c\u6b65\u4e4b\u524d\u9700\u8981\u5bf9\u4e8e\u4e3b\u4ece\u8fdb\u7a0b\u7684\u7684db\u4e2a\u6570\u8fdb\u884c\u786e\u8ba4\uff0c\u8fd9\u4e00\u8fc7\u7a0b\u79f0\u4e4b\u4e3aMetaSync\u3002"}),"\n",(0,t.jsx)(e.p,{children:"\u5176\u4ea4\u4e92\u8fc7\u7a0b\u5982\u4e0b\u3002"}),"\n",(0,t.jsx)(e.p,{children:(0,t.jsx)(e.img,{alt:"alt text",src:i(4723).A+"",width:"622",height:"348"})}),"\n",(0,t.jsx)(e.pre,{children:(0,t.jsx)(e.code,{className:"language-c++",children:"\n\nvoid PikaReplServerConn::HandleMetaSyncRequest(void* arg) {\n // build server table meta info\n ...;\n // use same conn write back\n conn->WriteResp(reply_str);\n conn->NotifyWrite();\n}\n\nvoid PikaReplClientConn::HandleMetaSyncResponse(void* arg) {\n // check if table is the same as master's\n if (!PikaReplClientConn::IsTableStructConsistent(...))) {\n g_pika_server->SyncError();\n conn->NotifyClose();\n }\n g_pika_server->FinishMetaSync();\n}\n"})}),"\n",(0,t.jsx)(e.h3,{id:"trysync",children:"TrySync"}),"\n",(0,t.jsx)(e.p,{children:"MetaSync\u4e4b\u540e\uff0c\u6bcf\u4e00\u4e2aPartition\u5355\u72ec\u505aTrySync\uff0c\u4ece\u7684Partition \u5e26\u7740\u81ea\u5df1\u5f53\u524d\u7684\u540c\u6b65\u70b9\u4f4d\u5411\u4e3b\u505a\u8bf7\u6c42\u3002\u4e3b\u6839\u636e\u4ece\u7684TrySync\u6d88\u606f\uff0c\u5982\u679c\u672c\u5730\u6709\u4ece\u53d1\u9001\u8fc7\u6765\u7684\u70b9\u4f4d\uff0c\u5219\u56de\u590d\u5efa\u8bae\u8fdb\u884c\u589e\u91cf\u540c\u6b65\u8d70BinlogSync\u6d41\u7a0b\uff0c\u5982\u679c\u6ca1\u6709\uff0c\u5219\u56de\u590d\u5efa\u8bae\u8fdb\u884c\u5168\u91cf\u540c\u6b65\u8d70DbSync\u6d41\u7a0b\u3002"}),"\n",(0,t.jsx)(e.p,{children:(0,t.jsx)(e.img,{alt:"alt text",src:i(2810).A+"",width:"587",height:"306"})}),"\n",(0,t.jsx)(e.pre,{children:(0,t.jsx)(e.code,{className:"language-c++",children:"void PikaReplServerConn::HandleTrySyncRequest(void* arg) {\n // master check if slave offset is valid\n ...;\n // master check if this slave is already exist\n if (!partition->CheckSlaveNodeExist(node.ip(), node.port())) {\n int32_t session_id = partition->GenSessionId();\n try_sync_response->set_session_id(session_id);\n Status s = partition->AddSlaveNode(node.ip(), node.port(), session_id);\n } else {\n Status s = partition->GetSlaveNodeSession(\n node.ip(), node.port(), &session_id);\n try_sync_response->set_session_id(session_id);\n }\n onn->WriteResp(reply_str);\n conn->NotifyWrite();\n}\n\nvoid PikaReplClientConn::HandleTrySyncResponse(void* arg) {\n if (try_sync_response.reply_code()\n == InnerMessage::InnerResponse::TrySync::kOk) {\n slave_partition->SetMasterSessionId(session_id);\n g_pika_rm->SendPartitionBinlogSyncAckRequest(\n table_name, partition_id, offset, offset, true);\n slave_partition->SetReplState(ReplState::kConnected);\n } else if (try_sync_response.reply_code() == kSyncPointBePurged) {\n // Need To Try DBSync\n slave_partition->SetReplState(ReplState::kTryDBSync);\n } else if (try_sync_response.reply_code() == kSyncPointLarger) {\n // rySync Error, Because the invalid filenum and offset\n slave_partition->SetReplState(ReplState::kError);\n } else if (try_sync_response.reply_code() == kError) {\n slave_partition->SetReplState(ReplState::kError);\n }\n}\n"})}),"\n",(0,t.jsx)(e.p,{children:"\u4ece\u8282\u70b9\u63a5\u6536\u5230TrySyncResponse\u4e4b\u540e"}),"\n",(0,t.jsx)(e.p,{children:"1\uff0c\uff08kOk\uff09 \u5982\u679c\u4ece\u8fd4\u56de\u6ca1\u6709\u95ee\u9898\uff0c\u5219\u8fdb\u884c\u589e\u91cf\u540c\u6b65\uff0c\u53d1\u9001BinlogSync\u6d88\u606f\u3002"}),"\n",(0,t.jsx)(e.p,{children:"2\uff0c\uff08kSyncPointBePurged\uff09\u5982\u679c\u81ea\u5df1\u7684\u540c\u6b65\u70b9\u4f4d\uff0c\u5728\u4e3b\u8282\u70b9\u5df2\u7ecf\u88ab\u6e05\u9664\u3002\u5219\u8fdb\u884c\u5168\u91cf\u540c\u6b65\uff0c\u53d1\u9001DbSync \u6d88\u606f\u3002"}),"\n",(0,t.jsx)(e.p,{children:"3\uff0c\uff08kSyncPointLarger\uff09\u5982\u679c\u4ece\u70b9\u4f4d\u6bd4\u4e3b\u8d85\u524d\uff0c\u8bf4\u660e\u4ece\u4e0a\u7684\u6570\u636e\u6709\u4e00\u90e8\u5206\u662f\u810f\u6570\u636e\uff0c\u5c06\u540c\u6b65\u7ec8\u6b62\uff08kError\uff09\uff0c\u9700\u8981\u7ba1\u7406\u5458\u4ecb\u5165\u3002"}),"\n",(0,t.jsx)(e.p,{children:"4\uff0c\uff08kError\uff09\u5982\u679c\u4e3b\u8fd4\u56de\u7684TrySyncResponse \u6709\u5f02\u5e38\uff0c\u90a3\u4e48\u5c06\u540c\u6b65\u7ec8\u6b62\uff08kError\uff09\uff0c\u9700\u8981\u7ba1\u7406\u5458\u4ecb\u5165\u3002"}),"\n",(0,t.jsx)(e.h3,{id:"dbsync",children:"DbSync"}),"\n",(0,t.jsx)(e.p,{children:(0,t.jsx)(e.img,{alt:"alt text",src:i(3237).A+"",width:"603",height:"359"})}),"\n",(0,t.jsx)(e.p,{children:"Pika\u5168\u91cf\u540c\u6b65\uff0c\u4e3b\u8981\u4f9d\u8d56\u4e8eRSYNC\u5de5\u5177\uff0c\u901a\u8fc7system\u8c03\u7528\u8d77RSYNC\u8fdb\u7a0b\uff0c\u5c06\u4e3b\u4e0a\u6570\u636e\u63a8\u5230\u4ece\u4e0a\u3002\u76ee\u524d\u4ece\u4e0a\u4e00\u76f4\u8d77\u4e00\u4e2aRSYNC\u5e38\u9a7b\u8fdb\u7a0b\uff0c\u4e13\u95e8\u8d1f\u8d23\u63a5\u6536\u4e3b\u540c\u6b65\u8fc7\u6765\u7684\u5168\u540c\u6b65\u6570\u636e\u3002"}),"\n",(0,t.jsx)(e.h3,{id:"master-dbsync-behavior",children:"Master DbSync Behavior"}),"\n",(0,t.jsx)(e.pre,{children:(0,t.jsx)(e.code,{className:"language-c++",children:"void PikaReplServerConn::HandleDBSyncRequest(void* arg) {\n // sanity check\n ...;\n g_pika_server->TryDBSync(node.ip(), node.port() + kPortShiftRSync,\n table_name, partition_id);\n conn->WriteResp(reply_str);\n conn->NotifyWrite();\n}\n\nvoid PikaServer::TryDBSync(const std::string& ip, int port,\n const std::string& table_name,\n uint32_t partition_id) {\n partition->BgSavePartition();\n DBSync(ip, port, table_name, partition_id);\n}\n"})}),"\n",(0,t.jsx)(e.p,{children:"\u4e3b\u6536\u5230HandleDBSyncRequest"}),"\n",(0,t.jsx)(e.p,{children:"1\uff0c\u8c03\u7528TryDBSync\u7684BgSavePartition\uff0c\u5f02\u6b65\u5c06\u5bf9\u5e94\u7684partition\u6253\u5feb\u7167\u3002"}),"\n",(0,t.jsx)(e.p,{children:"2\uff0c\u8c03\u7528DBSync \u5f02\u6b65\u53d1\u9001\u3002"}),"\n",(0,t.jsx)(e.p,{children:"\u4e3a\u4fdd\u8bc1\u6253\u5feb\u7167\u548c\u53d1\u9001\u7684\u6587\u4ef6\u7684\u5148\u540e\u5faa\u5e8f\uff0c\u8fd9\u4e24\u4e2a\u4efb\u52a1\u7531\u540c\u4e00\u4e2a\u7ebf\u7a0b\u5b8c\u6210\u3002\u8fd9\u4e2a\u7ebf\u7a0b\u4f1a\u6839\u636e\u653e\u5165\u5176\u6d88\u8d39\u961f\u5217\u7684\u987a\u5e8f\u4f9d\u6b21\u6267\u884c\u4efb\u52a1\u3002\u8fd9\u91cc\u4e00\u5b9a\u662f\u5148\u6267\u884c\u6253\u5feb\u7167\u4efb\u52a1\uff0c\u518d\u6267\u884c\u53d1\u9001\u6587\u4ef6\u4efb\u52a1\u3002"}),"\n",(0,t.jsx)(e.pre,{children:(0,t.jsx)(e.code,{className:"language-c++",children:"void Partition::BgSavePartition() {\n slash::MutexLock l(&bgsave_protector_);\n if (bgsave_info_.bgsaving) {\n return;\n }\n bgsave_info_.bgsaving = true;\n BgTaskArg* bg_task_arg = new BgTaskArg();\n bg_task_arg->partition = shared_from_this();\n g_pika_server->BGSaveTaskSchedule(\n &DoBgSave, static_cast(bg_task_arg));\n}\n\nvoid PikaServer::BGSaveTaskSchedule(pink::TaskFunc func, void* arg) {\n bgsave_thread_.StartThread();\n bgsave_thread_.Schedule(func, arg);\n}\n\nvoid Partition::DoBgSave(void* arg) {\n // do bgsave https://github.com/Qihoo360/pika/wiki/pika-\u5feb\u7167\u5f0f\u5907\u4efd\u65b9\u6848\n // generate a info file indicate this snapshot's binlog filenum and offset\n}\n"})}),"\n",(0,t.jsx)(e.p,{children:"1\uff0c\u8c03\u7528BGSaveTaskSchedule\u5c06\u6253\u5feb\u7167\u4efb\u52a1\u653e\u5165bgsave_thread\u7684\u6d88\u8d39\u961f\u5217\u4e2d\u3002"}),"\n",(0,t.jsx)(e.p,{children:"2\uff0cbgsave_thread\u8c03\u7528DoBgSave \u5bf9\u5f53\u524d\u7684DB\u72b6\u6001\u6253\u5feb\u7167\u5e76\u4e14\u751f\u6210info\u6587\u4ef6\uff0cinfo\u6587\u4ef6\u662f\u4ee3\u8868\u8fd9\u4e2a\u5feb\u7167\u5bf9\u5e94\u7684binlog filenum\u548coffset \u7684\u4f4d\u7f6e\u3002"}),"\n",(0,t.jsx)(e.pre,{children:(0,t.jsx)(e.code,{className:"language-c++",children:"void PikaServer::DBSync(const std::string& ip, int port,\n const std::string& table_name,\n uint32_t partition_id) {\n // check if this partition_is is processing dbsync\n ...;\n // Reuse the bgsave_thread_\n // Since we expect BgSave and DBSync execute serially\n bgsave_thread_.Schedule(&DoDBSync, reinterpret_cast(arg));\n}\n\n// DoDBSync\nvoid PikaServer::DbSyncSendFile(const std::string& ip, int port,\n const std::string& table_name,\n uint32_t partition_id) {\n // sending files\n ...;\n // Send info file at last\n ...;\n}\n"})}),"\n",(0,t.jsx)(e.h3,{id:"trysync-1",children:"TrySync"}),"\n",(0,t.jsx)(e.p,{children:"MetaSync\u4e4b\u540e\uff0c\u6bcf\u4e00\u4e2aPartition\u5355\u72ec\u505aTrySync\uff0c\u4ece\u7684Partition \u5e26\u7740\u81ea\u5df1\u5f53\u524d\u7684\u540c\u6b65\u70b9\u4f4d\u5411\u4e3b\u505a\u8bf7\u6c42\u3002\u4e3b\u6839\u636e\u4ece\u7684TrySync\u6d88\u606f\uff0c\u5982\u679c\u672c\u5730\u6709\u4ece\u53d1\u9001\u8fc7\u6765\u7684\u70b9\u4f4d\uff0c\u5219\u56de\u590d\u5efa\u8bae\u8fdb\u884c\u589e\u91cf\u540c\u6b65\u8d70BinlogSync\u6d41\u7a0b\uff0c\u5982\u679c\u6ca1\u6709\uff0c\u5219\u56de\u590d\u5efa\u8bae\u8fdb\u884c\u5168\u91cf\u540c\u6b65\u8d70DbSync\u6d41\u7a0b\u3002"}),"\n",(0,t.jsx)(e.p,{children:(0,t.jsx)(e.img,{alt:"alt text",src:i(7324).A+"",width:"587",height:"306"})}),"\n",(0,t.jsx)(e.pre,{children:(0,t.jsx)(e.code,{className:"language-c++",children:"void PikaReplServerConn::HandleTrySyncRequest(void* arg) {\n // master check if slave offset is valid\n ...;\n // master check if this slave is already exist\n if (!partition->CheckSlaveNodeExist(node.ip(), node.port())) {\n int32_t session_id = partition->GenSessionId();\n try_sync_response->set_session_id(session_id);\n Status s = partition->AddSlaveNode(node.ip(), node.port(), session_id);\n } else {\n Status s = partition->GetSlaveNodeSession(\n node.ip(), node.port(), &session_id);\n try_sync_response->set_session_id(session_id);\n }\n onn->WriteResp(reply_str);\n conn->NotifyWrite();\n}\n\nvoid PikaReplClientConn::HandleTrySyncResponse(void* arg) {\n if (try_sync_response.reply_code()\n == InnerMessage::InnerResponse::TrySync::kOk) {\n slave_partition->SetMasterSessionId(session_id);\n g_pika_rm->SendPartitionBinlogSyncAckRequest(\n table_name, partition_id, offset, offset, true);\n slave_partition->SetReplState(ReplState::kConnected);\n } else if (try_sync_response.reply_code() == kSyncPointBePurged) {\n // Need To Try DBSync\n slave_partition->SetReplState(ReplState::kTryDBSync);\n } else if (try_sync_response.reply_code() == kSyncPointLarger) {\n // rySync Error, Because the invalid filenum and offset\n slave_partition->SetReplState(ReplState::kError);\n } else if (try_sync_response.reply_code() == kError) {\n slave_partition->SetReplState(ReplState::kError);\n }\n}\n"})}),"\n",(0,t.jsx)(e.p,{children:"\u4ece\u8282\u70b9\u63a5\u6536\u5230TrySyncResponse\u4e4b\u540e"}),"\n",(0,t.jsx)(e.p,{children:"1\uff0c\uff08kOk\uff09 \u5982\u679c\u4ece\u8fd4\u56de\u6ca1\u6709\u95ee\u9898\uff0c\u5219\u8fdb\u884c\u589e\u91cf\u540c\u6b65\uff0c\u53d1\u9001BinlogSync\u6d88\u606f\u3002"}),"\n",(0,t.jsx)(e.p,{children:"2\uff0c\uff08kSyncPointBePurged\uff09\u5982\u679c\u81ea\u5df1\u7684\u540c\u6b65\u70b9\u4f4d\uff0c\u5728\u4e3b\u8282\u70b9\u5df2\u7ecf\u88ab\u6e05\u9664\u3002\u5219\u8fdb\u884c\u5168\u91cf\u540c\u6b65\uff0c\u53d1\u9001DbSync \u6d88\u606f\u3002"}),"\n",(0,t.jsx)(e.p,{children:"3\uff0c\uff08kSyncPointLarger\uff09\u5982\u679c\u4ece\u70b9\u4f4d\u6bd4\u4e3b\u8d85\u524d\uff0c\u8bf4\u660e\u4ece\u4e0a\u7684\u6570\u636e\u6709\u4e00\u90e8\u5206\u662f\u810f\u6570\u636e\uff0c\u5c06\u540c\u6b65\u7ec8\u6b62\uff08kError\uff09\uff0c\u9700\u8981\u7ba1\u7406\u5458\u4ecb\u5165\u3002"}),"\n",(0,t.jsx)(e.p,{children:"4\uff0c\uff08kError\uff09\u5982\u679c\u4e3b\u8fd4\u56de\u7684TrySyncResponse \u6709\u5f02\u5e38\uff0c\u90a3\u4e48\u5c06\u540c\u6b65\u7ec8\u6b62\uff08kError\uff09\uff0c\u9700\u8981\u7ba1\u7406\u5458\u4ecb\u5165\u3002"}),"\n",(0,t.jsx)(e.h3,{id:"dbsync-1",children:"DbSync"}),"\n",(0,t.jsx)(e.p,{children:(0,t.jsx)(e.img,{alt:"alt text",src:i(4903).A+"",width:"603",height:"359"})}),"\n",(0,t.jsx)(e.p,{children:"Pika\u5168\u91cf\u540c\u6b65\uff0c\u4e3b\u8981\u4f9d\u8d56\u4e8eRSYNC\u5de5\u5177\uff0c\u901a\u8fc7system\u8c03\u7528\u8d77RSYNC\u8fdb\u7a0b\uff0c\u5c06\u4e3b\u4e0a\u6570\u636e\u63a8\u5230\u4ece\u4e0a\u3002\u76ee\u524d\u4ece\u4e0a\u4e00\u76f4\u8d77\u4e00\u4e2aRSYNC\u5e38\u9a7b\u8fdb\u7a0b\uff0c\u4e13\u95e8\u8d1f\u8d23\u63a5\u6536\u4e3b\u540c\u6b65\u8fc7\u6765\u7684\u5168\u540c\u6b65\u6570\u636e\u3002"}),"\n",(0,t.jsx)(e.h3,{id:"master-dbsync-behavior-1",children:"Master DbSync Behavior"}),"\n",(0,t.jsx)(e.pre,{children:(0,t.jsx)(e.code,{className:"language-c++",children:"void PikaReplServerConn::HandleDBSyncRequest(void* arg) {\n // sanity check\n // ...;\n g_pika_server->TryDBSync(node.ip(), node.port() + kPortShiftRSync,\n table_name, partition_id);\n conn->WriteResp(reply_str);\n conn->NotifyWrite();\n}\n\nvoid PikaServer::TryDBSync(const std::string& ip, int port,\n const std::string& table_name,\n uint32_t partition_id) {\n partition->BgSavePartition();\n DBSync(ip, port, table_name, partition_id);\n}\n"})}),"\n",(0,t.jsx)(e.p,{children:"\u4e3b\u6536\u5230HandleDBSyncRequest"}),"\n",(0,t.jsx)(e.p,{children:"1\uff0c\u8c03\u7528TryDBSync\u7684BgSavePartition\uff0c\u5f02\u6b65\u5c06\u5bf9\u5e94\u7684partition\u6253\u5feb\u7167\u3002"}),"\n",(0,t.jsx)(e.p,{children:"2\uff0c\u8c03\u7528DBSync \u5f02\u6b65\u53d1\u9001\u3002"}),"\n",(0,t.jsx)(e.p,{children:"\u4e3a\u4fdd\u8bc1\u6253\u5feb\u7167\u548c\u53d1\u9001\u7684\u6587\u4ef6\u7684\u5148\u540e\u5faa\u5e8f\uff0c\u8fd9\u4e24\u4e2a\u4efb\u52a1\u7531\u540c\u4e00\u4e2a\u7ebf\u7a0b\u5b8c\u6210\u3002\u8fd9\u4e2a\u7ebf\u7a0b\u4f1a\u6839\u636e\u653e\u5165\u5176\u6d88\u8d39\u961f\u5217\u7684\u987a\u5e8f\u4f9d\u6b21\u6267\u884c\u4efb\u52a1\u3002\u8fd9\u91cc\u4e00\u5b9a\u662f\u5148\u6267\u884c\u6253\u5feb\u7167\u4efb\u52a1\uff0c\u518d\u6267\u884c\u53d1\u9001\u6587\u4ef6\u4efb\u52a1\u3002"}),"\n",(0,t.jsx)(e.pre,{children:(0,t.jsx)(e.code,{className:"language-c++",children:"void Partition::BgSavePartition() {\n slash::MutexLock l(&bgsave_protector_);\n if (bgsave_info_.bgsaving) {\n return;\n }\n bgsave_info_.bgsaving = true;\n BgTaskArg* bg_task_arg = new BgTaskArg();\n bg_task_arg->partition = shared_from_this();\n g_pika_server->BGSaveTaskSchedule(\n &DoBgSave, static_cast(bg_task_arg));\n}\n\nvoid PikaServer::BGSaveTaskSchedule(pink::TaskFunc func, void* arg) {\n bgsave_thread_.StartThread();\n bgsave_thread_.Schedule(func, arg);\n}\n\nvoid Partition::DoBgSave(void* arg) {\n // do bgsave https://github.com/Qihoo360/pika/wiki/pika-\u5feb\u7167\u5f0f\u5907\u4efd\u65b9\u6848\n // generate a info file indicate this snapshot's binlog filenum and offset\n}\n"})}),"\n",(0,t.jsx)(e.p,{children:"1\uff0c\u8c03\u7528BGSaveTaskSchedule\u5c06\u6253\u5feb\u7167\u4efb\u52a1\u653e\u5165bgsave_thread\u7684\u6d88\u8d39\u961f\u5217\u4e2d\u3002"}),"\n",(0,t.jsx)(e.p,{children:"2\uff0cbgsave_thread\u8c03\u7528DoBgSave \u5bf9\u5f53\u524d\u7684DB\u72b6\u6001\u6253\u5feb\u7167\u5e76\u4e14\u751f\u6210info\u6587\u4ef6\uff0cinfo\u6587\u4ef6\u662f\u4ee3\u8868\u8fd9\u4e2a\u5feb\u7167\u5bf9\u5e94\u7684binlog filenum\u548coffset \u7684\u4f4d\u7f6e\u3002"}),"\n",(0,t.jsx)(e.pre,{children:(0,t.jsx)(e.code,{className:"language-c++",children:"void PikaServer::DBSync(const std::string& ip, int port,\n const std::string& table_name,\n uint32_t partition_id) {\n // check if this partition_is is processing dbsync\n ...;\n // Reuse the bgsave_thread_\n // Since we expect BgSave and DBSync execute serially\n bgsave_thread_.Schedule(&DoDBSync, reinterpret_cast(arg));\n}\n\n// DoDBSync\nvoid PikaServer::DbSyncSendFile(const std::string& ip, int port,\n const std::string& table_name,\n uint32_t partition_id) {\n // sending files\n ...;\n // Send info file at last\n ...;\n}\n"})}),"\n",(0,t.jsx)(e.p,{children:"1, \u8c03\u7528DBSync \u5c06\u53d1\u9001\u6587\u4ef6\u7684\u4efb\u52a1\u653e\u5165bgsave_thread\u7684\u6d88\u8d39\u961f\u5217\u4e2d\u3002"}),"\n",(0,t.jsx)(e.p,{children:"2\uff0cbgsave_thread\u8c03\u7528DbSyncSendFile\uff0c\u4f9d\u6b21\u53d1\u9001\u5feb\u7167\u7684\u6587\u4ef6\u3002\u6700\u540e\u53d1\u9001info\u6587\u4ef6\u3002"}),"\n",(0,t.jsx)(e.h3,{id:"slave-dbsync-behavior",children:"Slave DbSync Behavior"}),"\n",(0,t.jsx)(e.pre,{children:(0,t.jsx)(e.code,{className:"language-c++",children:"void PikaReplClientConn::HandleDBSyncResponse(void* arg) {\n slave_partition->SetReplState(ReplState::kWaitDBSync);\n}\n\n// PikaAuxiliaryThread invoke this periodically\nStatus PikaReplicaManager::RunSyncSlavePartitionStateMachine() {\n if (s_partition->State() == ReplState::kWaitDBSync) {\n rtition->TryUpdateMasterOffset();\n }\n}\n\nbool Partition::TryUpdateMasterOffset() {\n// 1, Check dbsync finished, got the new binlog offset from info file\n// 2, Replace the old db\n// 3, Update master offset, and TrySync again\n}\n"})}),"\n",(0,t.jsx)(e.p,{children:"1\uff0c\u4ece\u6536\u5230DBSyncResponse \u5c06partition\u7f6e\u4e3akWaitDBSync\u3002"}),"\n",(0,t.jsx)(e.p,{children:"2\uff0c\u8f85\u52a9\u7ebf\u7a0bPikaAuxiliaryThread \u5468\u671f\u6027\u68c0\u67e5DbSync \u6709\u6ca1\u6709\u7ed3\u675f\uff0c\u7ed3\u675f\u7684\u6807\u5fd7\u4e3a\u5728\u672c\u5730\u68c0\u6d4b\u5230Info\u6587\u4ef6\u7684\u5b58\u5728\u3002"}),"\n",(0,t.jsx)(e.p,{children:"3\uff0c\u5982\u679cDbSync \u68c0\u6d4b\u5b8c\uff0c\u89e3\u6790info\u6587\u4ef6\u7684filenum offset\uff0c\u66ff\u6362\u672c\u5730\u7684Db\uff0c\u672c\u5730\u66ff\u6362\u6210\u65b0\u7684filenum\u548coffset\uff0c\u5e76\u4e14\u91cd\u8d70TrySync\u6d41\u7a0b\uff0c\u540c\u6b65DbSync\u671f\u95f4\u4ea7\u751f\u7684\u589e\u91cf\u3002"}),"\n",(0,t.jsx)(e.h3,{id:"binlogsync",children:"BinlogSync"}),"\n",(0,t.jsx)(e.p,{children:(0,t.jsx)(e.img,{alt:"alt text",src:i(1758).A+"",width:"588",height:"486"})}),"\n",(0,t.jsx)(e.p,{children:"BinlogSync\u7684\u540c\u6b65\u903b\u8f91\uff0c\u4e5f\u662f\u4ece\u53d1\u8d77\u7684\u3002"}),"\n",(0,t.jsx)(e.p,{children:"1\uff0c\u4ece\u5148\u53d1\u9001\u4e00\u4e2aBinlogSyncRequest\uff0c\u5176\u4e2d\u6709\u4e00\u4e2afirst_send\u6807\u5fd7\uff0c\u7b2c\u4e00\u6b21\u53d1\u9001\u8bbe\u7f6efirst_send\u4e3aTrue\u3002"}),"\n",(0,t.jsx)(e.p,{children:"2\uff0c\u4e3b\u4e0a\u6536\u5230BinlogSyncRequest\u770b\u5230first_send\u4e3atrue\uff0c\u5219\u4f1a\u76f8\u5e94\u505a\u4e00\u4e9b\u521d\u59cb\u5316\u5de5\u4f5c\uff0c\u4e4b\u540e\u5c06\u5f85\u53d1\u9001\u6570\u636e\u5199\u5165RM::write_queues\u4e2d\u3002\u7136\u540e\u7531\u8f85\u52a9\u7ebf\u7a0b\u7528\u4e4b\u524d\u4ece\u521b\u5efa\u7684\u8fde\u63a5\u53d1\u9001write_queues\u4e2d\u7684Binlog\u6570\u636e\u3002"}),"\n",(0,t.jsx)(e.p,{children:"3\uff0c\u4ece\u63a5\u5230Binlog\u6570\u636e\u540e\uff0c\u8fd4\u56de\u76f8\u5e94\u7684BinlogSyncAck\u6d88\u606f\uff08\u590d\u7528BinlogSyncRequest\u7ed3\u6784\uff09\u3002"}),"\n",(0,t.jsx)(e.p,{children:"4\uff0c\u4e3b\u6536\u5230BinlogSyncAck\u4f1a\uff0c\u7ee7\u7eed\u5c06\u540e\u7eed\u5e26\u53d1\u9001\u6570\u636e\u518d\u5199\u5165write_queues \u7531\u8f85\u52a9\u7ebf\u7a0b\u53d1\u9001\u5230\u4ece\u3002"}),"\n",(0,t.jsx)(e.p,{children:"\u9700\u8981\u6ce8\u610f\u7684\u662f\u4ee5\u4e0b\u4e24\u79cd\u573a\u666f\uff1a"}),"\n",(0,t.jsx)(e.p,{children:"1\uff0c\u5f53\u4e3b\u4ece\u6570\u636e\u5b8c\u5168\u4e00\u81f4\uff0c\u5e76\u4e14\u8fc7\u4e86\u5f88\u4e45\u6ca1\u6709\u540c\u6b65\u6570\u636e\u7684\u65f6\u5019\uff0c\u8f85\u52a9\u7ebf\u7a0b\u4f1a\u4e3a\u4e86\u4fdd\u6301\u8fde\u63a5\u7684keepalive\uff0c\u4f1a\u6bcf\u9694kSendKeepAliveTimeout \u5411\u8fd9\u6761\u8fde\u63a5\u53d1\u9001keealive\u6d88\u606f\u3002\u5e76\u4e14\u68c0\u67e5\u4e3b\u7684last_recv_time\uff0c\u5982\u679c\u8d85\u8fc7kRecvKeepAliveTimeout\u6ca1\u6709\u6536\u5230\u4efb\u4f55\u6d88\u606f\uff0c\u5219\u4e3b\u52a8\u5c06\u8fde\u63a5\u65ad\u5f00\u3002"}),"\n",(0,t.jsx)(e.p,{children:"2\uff0c\u7531\u4e8e\u4ece\u662fBinlogSync\u7684\u53d1\u8d77\u8005\uff0c\u4f46\u662f\u4e00\u6bb5\u65f6\u95f4\u6ca1\u6709\u6570\u636e\u540c\u6b65\u4e4b\u540e\uff0c\u4ece\u611f\u77e5\u4e0d\u5230\u4e3b\u4e0a\u65b0\u7684\u6570\u636e\u5199\u5165\uff0c\u4ece\u800c\u4e0d\u80fd\u518d\u4e3b\u52a8\u518d\u6b21\u53d1\u8d77BinlogSync \u6d41\u7a0b\uff0c\u8fd9\u65f6\u5019\u9700\u8981\u8f85\u52a9\u7ebf\u7a0b\u6765\u8c03\u7528TriggerSendBinlogSync\uff0c\u9a71\u52a8BinlogSync\u6d41\u7a0b\u3002TriggerSendBinlogSync\u7684\u4e3b\u8981\u903b\u8f91\u5c31\u662f\u5c06\u65b0\u5199\u5165\u7684\u589e\u91cf\u653e\u5165write_queues\uff0c\u518d\u53d1\u9001\u7ed9\u4ece\u3002"}),"\n",(0,t.jsx)(e.pre,{children:(0,t.jsx)(e.code,{className:"language-c++",children:"void PikaReplServerConn::HandleBinlogSyncRequest(void* arg) {\n if (is_first_send) {\n master_partition->ActivateSlaveBinlogSync(\n node.ip(), node.port(), range_start);\n return;\n }\n // read next sync binlog to write_queues\n s = g_pika_rm->UpdateSyncBinlogStatus(slave_node, range_start, range_end);\n}\n"})}),"\n",(0,t.jsx)(e.p,{children:"1\uff0c\u4e3b\u6536\u5230\u4ece\u7684BinlogSyncRequest\u540e\uff0c\u5982\u679c\u662f\u7b2c\u4e00\u6b21\u53d1\u9001\uff0c\u5219\u521d\u59cb\u5316\u672c\u5730\u7684\u4e00\u4e9b\u53c2\u6570\u3002"}),"\n",(0,t.jsx)(e.p,{children:"2\uff0c\u4e3b\u628a\u4e0b\u4e00\u6b21\u540c\u6b65\u7684\u6d88\u606f\u653e\u5165write_queues \u4e2d\u3002\u5177\u4f53\u4e3b\u5c06\u54ea\u4e9b\u7684Binlog \u653e\u5165write_queues\uff0c\u53c2\u8003\u589e\u91cf\u540c\u6b65\u6ed1\u52a8\u7a97\u53e3\u8bbe\u8ba1\u3002"}),"\n",(0,t.jsx)(e.pre,{children:(0,t.jsx)(e.code,{className:"language-c++",children:"void PikaReplClientConn::DispatchBinlogRes(\n const std::shared_ptr res) {\n g_pika_rm->ScheduleWriteBinlogTask(\n table_name_ + partition_id_, res, PikaReplClientConn)); \n}\n\nvoid PikaReplBgWorker::HandleBGWorkerWriteBinlog(void* arg) {\n for (InnerResponse binlogs) {\n redis_parser_.ProcessInputBuffer(\n redis_parser_start, redis_parser_len, &processed_len);\n }\n g_pika_rm->SendPartitionBinlogSyncAckRequest(\n table_name, partition_id, ack_start, ack_end);\n}\n\nint PikaReplBgWorker::HandleWriteBinlog(\n pink::RedisParser* parser, const pink::RedisCmdArgsType& argv) {\n c_ptr->Initial(argv, worker->table_name_);\n partition->ConsensusProcessLeaderLog(c_ptr, worker->binlog_item_);\n}\n\nStatus ConsensusCoordinator::ProcessLeaderLog(\n std::shared_ptr cmd_ptr, const BinlogItem& attribute) {\n Status s = InternalAppendLog(attribute, cmd_ptr, nullptr, nullptr);\n // do g_pika_rm->ScheduleWriteDBTask(); in InternalApplyFollower\n InternalApplyFollower(\n MemLog::LogItem(LogOffset(), cmd_ptr, nullptr, nullptr));\n}\n\nvoid PikaReplBgWorker::HandleBGWorkerWriteDB(void* arg) {\n c_ptr->Do(partition);\n}\n"})}),"\n",(0,t.jsx)(e.p,{children:"\u4ece\u6536\u5230\u4e3b\u53d1\u9001\u7684Binlog\u4fe1\u606f\u4e4b\u540e"}),"\n",(0,t.jsx)(e.p,{children:"1\uff0c\u8c03\u7528DispatchBinlogRes\uff0c\u4e3a\u4fdd\u8bc1\u76f8\u540cpartition\u7684binlog \u5199\u5165\u987a\u5e8f\uff0c\u5c06\u540ctalbe_name\u540cpartition_id\u7684binlog\u5904\u7406\u6d41\u7a0b\u5b89\u6392\u7ed9\u540c\u4e00\u4e2a\u7ebf\u7a0b\u3002"}),"\n",(0,t.jsx)(e.p,{children:"2\uff0cPikaReplBgWorker\u7ebf\u7a0b\u8c03\u7528HandleBGWorkerWriteBinlog\uff0c\u5c06binlog\u653e\u5165redis_parser\u4e2d\uff0credis_parser\u89e3\u6790\u51fa\u5b8c\u6574\u7684\u547d\u4ee4\u540e\u8c03\u7528HandleWriteBinlog\u3002"}),"\n",(0,t.jsx)(e.p,{children:"3\uff0c\u8c03\u7528ConsensusProcessLeaderLog=>ProcessLeaderLog\uff0c\u901a\u8fc7InternalAppendLog \u5199\u5165Binlog\uff0c\u901a\u8fc7InternalApplyFollower\u8c03\u7528\uff0cScheduleWriteDBTask\u3002"}),"\n",(0,t.jsx)(e.p,{children:"4\uff0c\u8fd4\u56de\u6b65\u9aa42\uff0c\u5728\u5199\u5b8cBinlog\u4e4b\u540e\u53d1\u9001BinlogSyncAckRequest\u8fdb\u884c\u4e0b\u4e00\u6b21BinlogSync\u3002"}),"\n",(0,t.jsx)(e.p,{children:"5\uff0c\u5728\u6b65\u9aa43\u4e2d\uff0cScheduleWriteDBTask \u4e4b\u540e\uff0cPikaReplBgWorker\u7ebf\u7a0b\u8c03\u7528HandleBGWorkerWriteDB \u5c06\u6570\u636e\u843d\u76d8\u3002"}),"\n",(0,t.jsx)(e.h3,{id:"\u4e00\u81f4\u6027\u540c\u6b65",children:"\u4e00\u81f4\u6027\u540c\u6b65"}),"\n",(0,t.jsx)(e.p,{children:"\u901a\u8fc7\u4e4b\u524d\u7684\u4ecb\u7ecd\uff0c\u4e3b\u4ece\u4e4b\u95f4\u7684\u540c\u6b65\u4f7f\u7528\u4e86Protobuf\u534f\u8bae\uff0c\u5728\u4f7f\u7528\u4e00\u81f4\u6027\u7248\u672c\u7684pika\u7684\u65f6\u5019\uff0c\u5728Pb\u534f\u8bae\u4e2d\u6dfb\u52a0\u4e86ConsensusMeta\u3002\u901a\u8fc7\u89e3\u6790Pb\u586b\u5145\u7684ConsensusMeta\u7684\u6570\u636e\uff0c\u8fdb\u884c\u4e00\u81f4\u6027\u4e0b\u7684\u4e3b\u4ece\u901a\u4fe1\u3002\u5176Pb\u534f\u8bae\u4e2d\u5b9a\u4e49\u5982\u4e0b\u3002\u5728TrySync\u548cBinlogSync\u7684\u903b\u8f91\u4e2d\u901a\u8fc7\u5224\u65adPb\u62a5\u6587\u4e2d\u662f\u5426\u643a\u5e26ConsensusMeta \u6765\u5224\u65ad\u5bf9\u7aef\u662f\u5426\u5f00\u542f\u4e00\u81f4\u6027\u529f\u80fd\u3002"}),"\n",(0,t.jsx)(e.pre,{children:(0,t.jsx)(e.code,{className:"language-c++",children:"message ConsensusMeta {\n optional uint32 term = 1;\n // Leader -> Follower prev_log_offset\n // Follower -> Leader last_log_offset\n optional BinlogOffset log_offset = 2;\n optional BinlogOffset commit = 3;\n optional bool reject = 4;\n repeated BinlogOffset hint = 5;\n}\n"})}),"\n",(0,t.jsx)(e.p,{children:"\u5176\u4e3b\u8981\u8bbe\u8ba1\u89c1\u526f\u672c\u4e00\u81f4\u6027\u8bbe\u8ba1\u6587\u6863\u3002"}),"\n",(0,t.jsx)(e.h3,{id:"\u4ece\u5728\u4e00\u81f4\u6027\u573a\u666f\u4e0b\u7684\u6570\u636e\u5199\u5165",children:"\u4ece\u5728\u4e00\u81f4\u6027\u573a\u666f\u4e0b\u7684\u6570\u636e\u5199\u5165"}),"\n",(0,t.jsx)(e.pre,{children:(0,t.jsx)(e.code,{className:"language-c++",children:"void PikaReplBgWorker::HandleBGWorkerWriteBinlog(void* arg) {\n for (InnerResponse binlogs) {\n HandleWriteBinlog();\n }\n if (res->has_consensus_meta()) {\n partition->ConsensusProcessLocalUpdate(leader_commit);\n }\n ...;\n}\n\nPikaReplBgWorker::HandleWriteBinlog(\n pink::RedisParser* parser, const pink::RedisCmdArgsType& argv) {\n c_ptr->Initial(argv, worker->table_name_);\n partition->ConsensusProcessLeaderLog(c_ptr, worker->binlog_item_);\n}\n"})}),"\n",(0,t.jsx)(e.p,{children:"1, \u4e00\u81f4\u6027\u573a\u666f\u4e0b\uff0c\u5728PikaReplBgWorker\u5904\u7406\u4e3b\u540c\u6b65\u8fc7\u6765\u7684Binlog \u540c\u6837\u8c03\u7528\u4e86ConsensusProcessLeaderLog\u63a5\u53e3\uff0c\u5199\u5165Binlog\u3002"}),"\n",(0,t.jsx)(e.p,{children:"2\uff0c\u5728HandleBGWorkerWriteBinlog\u51fd\u6570\u8c03\u7528\u7684\u6700\u540e\uff0c\u8c03\u7528ConsensusProcessLocalUpdate \u63a5\u53e3\uff0c\u66f4\u65b0\u4ece\u7684commit\u4fe1\u606f\uff0c\u8c03\u7528ScheduleApplyFollowerLog \u5c06\u4ece\u53ef\u4ee5\u5199\u5165DB\u7684\u8bf7\u6c42\u5f02\u6b65\u5199\u5165DB\u3002"}),"\n",(0,t.jsx)(e.h3,{id:"\u4e3b\u5728\u4e00\u81f4\u6027\u573a\u666f\u4e0b\u7684\u6570\u636e\u5199\u5165",children:"\u4e3b\u5728\u4e00\u81f4\u6027\u573a\u666f\u4e0b\u7684\u6570\u636e\u5199\u5165"}),"\n",(0,t.jsx)(e.pre,{children:(0,t.jsx)(e.code,{className:"language-c++",children:"\n\nvoid PikaReplServerConn::HandleBinlogSyncRequest(void* arg) {\n s = g_pika_rm->UpdateSyncBinlogStatus(slave_node, range_start, range_end);\n}\n\nStatus ConsensusCoordinator::UpdateSlave(const std::string& ip, int port,\n const LogOffset& start, const LogOffset& end) {\n LogOffset committed_index;\n // invoke InternalCalCommittedIndex to calculate committed_index\n Status s = sync_pros_.Update(ip, port, start, end, &committed_index);\n if (!s.ok()) {\n return s;\n }\n LogOffset updated_committed_index;\n bool need_update = false;\n {\n slash::MutexLock l(&index_mu_);\n need_update = InternalUpdateCommittedIndex(\n committed_index, &updated_committed_index);\n }\n if (need_update) {\n // sheduel DoExecTask\n s = ScheduleApplyLog(updated_committed_index);\n if (!s.ok() && !s.IsNotFound()) {\n return s;\n }\n }\n return Status::OK();\n}\n"})}),"\n",(0,t.jsx)(e.p,{children:"1\uff0cHandleBinlogSyncRequest => UpdateSyncBinlogStatus => ConsensusUpdateSlave => UpdateSlave"}),"\n",(0,t.jsx)(e.p,{children:"2\uff0cUpdateSlave\u51fd\u6570\u4e2d\u8c03\u7528sync_pros.Update\u66f4\u65b0\u5bf9\u5e94\u7684\u4ece\u8282\u70b9\u7684acked_offset\uff0c\u540c\u65f6\u66f4\u65b0\u8fd9\u4e2a\u4ece\u7684match_index\uff0c\u4ee3\u8868\u5df2\u7ecf\u540c\u6b65\u5230\u8be5\u4ece\u7684\u6700\u9ad8\u7684LogOffset\u3002\u7136\u540e\u4f9d\u636ematch_index\u6570\u7ec4\u8ba1\u7b97\u4e3b\u4e0a\u7684committed_index\u3002"}),"\n",(0,t.jsx)(e.p,{children:"3\uff0c\u66f4\u65b0\u4e3b\u7684committed_index\u3002"}),"\n",(0,t.jsx)(e.p,{children:"4\uff0c\u5982\u679c\u6210\u529f\u66f4\u65b0committed_index\uff0c\u8fdb\u800cschedule\u5e94\u7528log\uff0c\u6bcf\u4e00\u6761\u53ef\u4ee5\u5e94\u7528\u7684log\u8c03\u7528\u56de\u8c03DoExecTask\u5b8c\u6210\u5bf9DB\u7684\u5199\u5165\u3002"}),"\n",(0,t.jsx)(e.h2,{id:"reference",children:"Reference"}),"\n",(0,t.jsx)(e.p,{children:(0,t.jsx)(e.a,{href:"https://github.com/Qihoo360/pika/tree/v3.3.4",children:"https://github.com/Qihoo360/pika/tree/v3.3.4"})})]})}function p(n={}){const{wrapper:e}={...(0,r.R)(),...n.components};return e?(0,t.jsx)(e,{...n,children:(0,t.jsx)(c,{...n})}):c(n)}},9112:(n,e,i)=>{i.d(e,{A:()=>t});const t=i.p+"assets/images/image-1-1ba1cdceb8cda07f155712902543dede.png"},4723:(n,e,i)=>{i.d(e,{A:()=>t});const t=i.p+"assets/images/image-2-ee383d7fe734cbee48e267cf23d436ca.png"},2810:(n,e,i)=>{i.d(e,{A:()=>t});const t=i.p+"assets/images/image-3-70e011578123f4f449d52b38673d5461.png"},3237:(n,e,i)=>{i.d(e,{A:()=>t});const t=i.p+"assets/images/image-4-b9ef1e863901bfa96ea344faee7feaba.png"},7324:(n,e,i)=>{i.d(e,{A:()=>t});const t=i.p+"assets/images/image-5-70e011578123f4f449d52b38673d5461.png"},4903:(n,e,i)=>{i.d(e,{A:()=>t});const t=i.p+"assets/images/image-6-b9ef1e863901bfa96ea344faee7feaba.png"},1758:(n,e,i)=>{i.d(e,{A:()=>t});const t=i.p+"assets/images/image-7-d3f5bbc5af764f52853c1b30cfbd7f2b.png"},7162:(n,e,i)=>{i.d(e,{A:()=>t});const t=i.p+"assets/images/image-aad65eec86e42083a83018a4357d882b.png"},8453:(n,e,i)=>{i.d(e,{R:()=>a,x:()=>o});var t=i(6540);const r={},s=t.createContext(r);function a(n){const e=t.useContext(s);return t.useMemo((function(){return"function"==typeof n?n(e):{...e,...n}}),[e,n])}function o(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(r):n.components||r:a(n.components),t.createElement(s.Provider,{value:e},n.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/30dc2be3.63f16889.js b/build/assets/js/30dc2be3.63f16889.js new file mode 100644 index 0000000..829706d --- /dev/null +++ b/build/assets/js/30dc2be3.63f16889.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[3717],{7771:(s,e,t)=>{t.r(e),t.d(e,{assets:()=>r,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>c,toc:()=>d});var n=t(4848),i=t(8453);const o={title:"Pika 3.5 \u53c2\u6570\u4f18\u5316\u624b\u518c",sidebar_position:3},a="Pika 3.5 \u53c2\u6570\u4f18\u5316\u624b\u518c #1970",c={id:"\u6027\u80fd\u4e0e\u4f18\u5316/Pika 3.5 \u53c2\u6570\u4f18\u5316\u624b\u518c/index",title:"Pika 3.5 \u53c2\u6570\u4f18\u5316\u624b\u518c",description:"1970",source:"@site/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika 3.5 \u53c2\u6570\u4f18\u5316\u624b\u518c/index.md",sourceDirName:"\u6027\u80fd\u4e0e\u4f18\u5316/Pika 3.5 \u53c2\u6570\u4f18\u5316\u624b\u518c",slug:"/\u6027\u80fd\u4e0e\u4f18\u5316/Pika 3.5 \u53c2\u6570\u4f18\u5316\u624b\u518c/",permalink:"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika 3.5 \u53c2\u6570\u4f18\u5316\u624b\u518c/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika 3.5 \u53c2\u6570\u4f18\u5316\u624b\u518c/index.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{title:"Pika 3.5 \u53c2\u6570\u4f18\u5316\u624b\u518c",sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"Redis \u4e0e Pika scan \u6027\u80fd\u5bf9\u6bd4",permalink:"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Redis \u4e0e Pika scan \u6027\u80fd\u5bf9\u6bd4/"},next:{title:"Pika \u4f18\u5316\u6848\u4f8b",permalink:"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/"}},r={},d=[{value:"Replies: 1 comment",id:"replies-1-comment",level:2}];function l(s){const e={a:"a",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",ul:"ul",...(0,i.R)(),...s.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(e.h1,{id:"pika-35-\u53c2\u6570\u4f18\u5316\u624b\u518c-1970",children:"Pika 3.5 \u53c2\u6570\u4f18\u5316\u624b\u518c #1970"}),"\n",(0,n.jsxs)(e.p,{children:[(0,n.jsx)(e.a,{href:"https://github.com/AlexStocks",children:"AlexStocks"})," started this conversation in ",(0,n.jsx)(e.a,{href:"https://github.com/OpenAtomFoundation/pika/discussions/categories/general",children:"General"})]}),"\n",(0,n.jsxs)(e.p,{children:[(0,n.jsx)(e.a,{href:"https://github.com/OpenAtomFoundation/pika/discussions/1970#top",children:"Pika 3.5 \u53c2\u6570\u4f18\u5316\u624b\u518c"})," #1970"]}),"\n",(0,n.jsx)(e.p,{children:(0,n.jsxs)(e.a,{href:"https://github.com/AlexStocks",children:[(0,n.jsx)(e.img,{src:"https://avatars.githubusercontent.com/u/7959374?s=40&v=4",alt:"@AlexStocks"})," AlexStocks"]})}),"\n",(0,n.jsx)(e.p,{children:"Sep 11, 2023 \xb7 1 comment"}),"\n",(0,n.jsx)(e.p,{children:(0,n.jsx)(e.a,{href:"https://github.com/OpenAtomFoundation/pika/discussions/1970#top",children:"Return to top"})}),"\n",(0,n.jsx)(e.p,{children:"Discussion options"}),"\n",(0,n.jsx)(e.p,{children:"Quote reply"}),"\n",(0,n.jsx)(e.p,{children:"edited"}),"\n",(0,n.jsx)(e.h2,{id:""}),"\n",(0,n.jsxs)(e.p,{children:["[",(0,n.jsx)(e.img,{src:"https://avatars.githubusercontent.com/u/7959374?s=64&v=4",alt:""})]}),"\n",(0,n.jsx)(e.p,{children:"AlexStocks"}),"\n",(0,n.jsxs)(e.p,{children:["](",(0,n.jsx)(e.a,{href:"https://github.com/AlexStocks)%5BSep",children:"https://github.com/AlexStocks)[Sep"})," 11, 2023](",(0,n.jsx)(e.a,{href:"https://github.com/OpenAtomFoundation/pika/discussions/1970#discussion-5614484",children:"https://github.com/OpenAtomFoundation/pika/discussions/1970#discussion-5614484"}),")"]}),"\n",(0,n.jsx)(e.p,{children:"Maintainer"}),"\n",(0,n.jsx)(e.p,{children:"-"}),"\n",(0,n.jsx)("table",{class:"d-block",role:"presentation","data-paste-markdown-skip":"",children:(0,n.jsx)("tbody",{class:"d-block js-translation-source","data-target-translation-id":"5614484","data-target-translation-type":"discussion",children:(0,n.jsx)("tr",{class:"d-block",children:(0,n.jsx)("td",{class:"d-block color-fg-default comment-body markdown-body js-comment-body",children:(0,n.jsxs)("ul",{dir:"auto",children:[(0,n.jsx)("li",{children:"1 \u4e0d\u8981\u4f7f\u7528\u538b\u7f29\uff0csnappy::internaluncompress \u5360\u7528\u8f83\u9ad8\uff1b"}),(0,n.jsx)("li",{children:"2 \u5173\u95ed binlog\uff1b"}),(0,n.jsx)("li",{children:"3 \u8c03\u9ad8 write-buffer-size\uff1b"}),(0,n.jsx)("li",{children:"4 Cluster \u6a21\u5f0f\u4e0b\u628a slot \u6570\u76ee\u8c03\u6574\u4e3a 128\uff0c\u4e0d\u8981\u4f7f\u7528 1024\uff1b"}),(0,n.jsx)("li",{children:"5 \u8c03\u5927 compaction \u7ebf\u7a0b\u6570\u76ee\uff1b"}),(0,n.jsx)("li",{children:"6 \u7f13\u5b58\u4f7f\u7528\u573a\u666f\u4e0b\uff0c\u53ef\u4ee5\u52a8\u6001\u5173\u95ed WAL\uff1b"})]})})})})}),"\n",(0,n.jsxs)(e.p,{children:["Beta Was this translation helpful? ",(0,n.jsx)(e.a,{href:"https://github.com/OpenAtomFoundation/pika/discussions/1970#",children:"Give feedback."})]}),"\n",(0,n.jsx)(e.p,{children:"1 You must be logged in to vote"}),"\n",(0,n.jsx)(e.p,{children:"All reactions"}),"\n",(0,n.jsx)(e.h2,{id:"replies-1-comment",children:"Replies: 1 comment"}),"\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsx)(e.li,{children:(0,n.jsx)(e.a,{href:"https://github.com/OpenAtomFoundation/pika/discussions/1970?sort=old",children:"Oldest"})}),"\n",(0,n.jsx)(e.li,{children:(0,n.jsx)(e.a,{href:"https://github.com/OpenAtomFoundation/pika/discussions/1970?sort=new",children:"Newest"})}),"\n",(0,n.jsx)(e.li,{children:(0,n.jsx)(e.a,{href:"https://github.com/OpenAtomFoundation/pika/discussions/1970?sort=top",children:"Top"})}),"\n"]}),"\n",(0,n.jsx)(e.p,{children:"Comment options"}),"\n",(0,n.jsx)(e.p,{children:"Quote reply"}),"\n",(0,n.jsx)(e.p,{children:"edited by Mixficsol"}),"\n",(0,n.jsx)(e.h3,{id:"-1"}),"\n",(0,n.jsxs)(e.p,{children:["[",(0,n.jsx)(e.img,{src:"https://avatars.githubusercontent.com/u/7959374?s=64&v=4",alt:""})]}),"\n",(0,n.jsx)(e.p,{children:"AlexStocks"}),"\n",(0,n.jsxs)(e.p,{children:["](",(0,n.jsx)(e.a,{href:"https://github.com/AlexStocks)%5BOct",children:"https://github.com/AlexStocks)[Oct"})," 23, 2023](",(0,n.jsx)(e.a,{href:"https://github.com/OpenAtomFoundation/pika/discussions/1970#discussioncomment-7357996",children:"https://github.com/OpenAtomFoundation/pika/discussions/1970#discussioncomment-7357996"}),")"]}),"\n",(0,n.jsx)(e.p,{children:"Maintainer Author"}),"\n",(0,n.jsx)(e.p,{children:"-"}),"\n",(0,n.jsx)("table",{class:"d-block",role:"presentation","data-paste-markdown-skip":"",children:(0,n.jsx)("tbody",{class:"d-block js-translation-source","data-target-translation-id":"7357996","data-target-translation-type":"comment",children:(0,n.jsx)("tr",{class:"d-block",children:(0,n.jsxs)("td",{class:"d-block color-fg-default comment-body markdown-body js-comment-body",children:[(0,n.jsxs)("p",{dir:"auto",children:["from ",(0,n.jsx)("a",{class:"issue-link js-issue-link","data-error-text":"Failed to load title","data-id":"1908090783","data-permission-text":"Title is private","data-url":"https://github.com/OpenAtomFoundation/pika/issues/2008","data-hovercard-type":"issue","data-hovercard-url":"/OpenAtomFoundation/pika/issues/2008/hovercard?comment_id=1775012080&comment_type=issue_comment",href:"https://github.com/OpenAtomFoundation/pika/issues/2008#issuecomment-1775012080",children:"#2008 (comment)"}),":"]}),(0,n.jsx)("p",{dir:"auto",children:"based on v3.5.1\uff0c you can optimize some parameters as follows."}),(0,n.jsxs)("p",{dir:"auto",children:["1 Adjust ",(0,n.jsx)("code",{class:"notranslate",children:"max-background-flushes"})," and ",(0,n.jsx)("code",{class:"notranslate",children:"max-background-compaction"})," to 4 to increase the number of threads for compaction and flushdb. Adjust max-background-jobs to 8.",(0,n.jsx)("br",{}),"2 Adjust the ",(0,n.jsx)("code",{class:"notranslate",children:"block-cache"})," to be 60% of the memory allocated to the Pika instance.",(0,n.jsx)("br",{}),"3 Uncomment ",(0,n.jsx)("code",{class:"notranslate",children:"share-block-cache"})," and set it to yes.",(0,n.jsx)("br",{})," Adjust ",(0,n.jsx)("code",{class:"notranslate",children:"thread-num"})," to 80% of the CPU cores of the Pika instance.",(0,n.jsx)("br",{}),"5 Adjust ",(0,n.jsx)("code",{class:"notranslate",children:"thread-pool-size"})," to CPU cores * 1.5.",(0,n.jsx)("br",{}),"6 Set ",(0,n.jsx)("code",{class:"notranslate",children:"rate-limiter-bandwidth"})," to 2000Mib/s for gigabit Ethernet and 10000Mib/s for 10-gigabit Ethernet",(0,n.jsx)("p",{dir:"auto",children:"in Chinese:"}),(0,n.jsxs)("ol",{dir:"auto",children:[(0,n.jsxs)("li",{children:[(0,n.jsx)("code",{class:"notranslate",children:"max-background-flushes"})," \u548c ",(0,n.jsx)("code",{class:"notranslate",children:"max-backgroud-compaction"}),"\u53ef\u4ee5\u8c03\u6574\u5230 4\uff0c\u63d0\u9ad8 compaction \u548c flushdb \u7684\u7ebf\u7a0b\u6570\uff0c ",(0,n.jsx)("code",{class:"notranslate",children:"max-backgroumd-jobs"}),"\u8c03\u6574\u5230 8"]}),(0,n.jsxs)("li",{children:[(0,n.jsx)("code",{class:"notranslate",children:"block-cache"}),"\u7684\u5927\u5c0f\u53ef\u4ee5\u8c03\u6574\u4e3a\u5206\u7ed9 Pika \u5b9e\u4f8b\u5185\u5b58\u7684 60%"]}),(0,n.jsxs)("li",{children:[(0,n.jsx)("code",{class:"notranslate",children:"share-block-cache"}),"\u89e3\u9664\u6ce8\u91ca\uff0c\u6539\u4e3ayes"]}),(0,n.jsxs)("li",{children:[(0,n.jsx)("code",{class:"notranslate",children:"thread-num"}),"\u8c03\u6574\u4e3a Pika \u5b9e\u4f8b\u7684 CPU \u6838\u6570\u7684 80%"]}),(0,n.jsxs)("li",{children:[(0,n.jsx)("code",{class:"notranslate",children:"thread-pool-size"}),"\u8c03\u6574\u4e3a CPU \u6838\u6570 * 1.5"]}),(0,n.jsxs)("li",{children:[(0,n.jsx)("code",{class:"notranslate",children:"rate-limiter-bandwidth"}),"\uff1a\u5343\u5146\u7f51\u53612000Mib/s \u4e07\u5146\u7f51\u5361\uff1a10000Mib/s"]})]})]})]})})})})]})}function h(s={}){const{wrapper:e}={...(0,i.R)(),...s.components};return e?(0,n.jsx)(e,{...s,children:(0,n.jsx)(l,{...s})}):l(s)}},8453:(s,e,t)=>{t.d(e,{R:()=>a,x:()=>c});var n=t(6540);const i={},o=n.createContext(i);function a(s){const e=n.useContext(o);return n.useMemo((function(){return"function"==typeof s?s(e):{...e,...s}}),[e,s])}function c(s){let e;return e=s.disableParentContext?"function"==typeof s.components?s.components(i):s.components||i:a(s.components),n.createElement(o.Provider,{value:e},s.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/36994c47.411c604c.js b/build/assets/js/36994c47.411c604c.js new file mode 100644 index 0000000..a836d8b --- /dev/null +++ b/build/assets/js/36994c47.411c604c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[9858],{5516:i=>{i.exports=JSON.parse('{"name":"docusaurus-plugin-content-blog","id":"default"}')}}]); \ No newline at end of file diff --git a/build/assets/js/38236c5e.89df4baf.js b/build/assets/js/38236c5e.89df4baf.js new file mode 100644 index 0000000..1cdb8ba --- /dev/null +++ b/build/assets/js/38236c5e.89df4baf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[3780],{4959:(i,e,n)=>{n.r(e),n.d(e,{assets:()=>l,contentTitle:()=>r,default:()=>k,frontMatter:()=>d,metadata:()=>a,toc:()=>o});var s=n(4848),t=n(8453);const d={title:"PikiwiDB(Pika) \u7b80\u4ecb",sidebar_position:0},r=void 0,a={id:"\u5e8f\u8a00/\u7b80\u4ecb/index",title:"PikiwiDB(Pika) \u7b80\u4ecb",description:"PikiwiDB(Pika)-Logo-Logo.png)",source:"@site/docs/\u5e8f\u8a00/\u7b80\u4ecb/index.md",sourceDirName:"\u5e8f\u8a00/\u7b80\u4ecb",slug:"/\u5e8f\u8a00/\u7b80\u4ecb/",permalink:"/docs/\u5e8f\u8a00/\u7b80\u4ecb/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u5e8f\u8a00/\u7b80\u4ecb/index.md",tags:[],version:"current",sidebarPosition:0,frontMatter:{title:"PikiwiDB(Pika) \u7b80\u4ecb",sidebar_position:0},sidebar:"tutorialSidebar",previous:{title:"\u5e8f\u8a00",permalink:"/docs/\u5e8f\u8a00/"},next:{title:"\u652f\u6301\u7684 Redis \u63a5\u53e3\u4e0e\u517c\u5bb9\u60c5\u51b5",permalink:"/docs/\u5e8f\u8a00/\u652f\u6301\u7684 Redis \u63a5\u53e3\u4e0e\u517c\u5bb9\u60c5\u51b5/"}},l={},o=[{value:"PikiwiDB(Pika) \u6570\u636e\u5e93\u7684\u7279\u70b9",id:"pikiwidbpika-\u6570\u636e\u5e93\u7684\u7279\u70b9",level:2},{value:"\u5bf9 Redis \u7684\u826f\u597d\u517c\u5bb9\u6027",id:"\u5bf9-redis-\u7684\u826f\u597d\u517c\u5bb9\u6027",level:3},{value:"\u6d77\u91cf\u6570\u636e\u5b58\u50a8\u53cb\u597d",id:"\u6d77\u91cf\u6570\u636e\u5b58\u50a8\u53cb\u597d",level:3},{value:"\u5feb\u901f\u6545\u969c\u6062\u590d",id:"\u5feb\u901f\u6545\u969c\u6062\u590d",level:3},{value:"\u793e\u533a\u9a71\u52a8\u53d1\u5c55",id:"\u793e\u533a\u9a71\u52a8\u53d1\u5c55",level:3},{value:"\u53d1\u5c55\u5386\u7a0b",id:"\u53d1\u5c55\u5386\u7a0b",level:2}];function c(i){const e={h2:"h2",h3:"h3",img:"img",li:"li",p:"p",ul:"ul",...(0,t.R)(),...i.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.img,{alt:"PikiwiDB(Pika)-Logo",src:n(1313).A+"",width:"2445",height:"831"}),"\nPikiwiDB(Pika) \u662f\u4e00\u6b3e\u7531 360 \u57fa\u7840\u67b6\u6784\u5c0f\u7ec4\u7814\u53d1\u8bbe\u8ba1\u7684\u952e\u503c\u6570\u636e\u5e93\uff0c\u89e3\u51b3\u4e86\u4f20\u7edf\u952e\u503c\u6570\u636e\u5e93\u5728\u5927\u89c4\u6a21\u6570\u636e\u573a\u666f\u4e0b\u6062\u590d\u65f6\u95f4\u8f83\u957f\u3001\u6027\u80fd\u8868\u73b0\u4e0d\u4f73\u7684\u95ee\u9898\uff0c\u6700\u65e9\u88ab\u547d\u540d\u4e3a Pika\uff0c\u7528\u4e8e\u66ff\u6362 360 \u5185\u90e8\u7cfb\u7edf\u6240\u4f7f\u7528\u7684 Redis\uff0c\u652f\u6491 360 \u81ea\u8eab\u4e1a\u52a1\u6240\u9700\u8981\u7684\u7f13\u5b58\u9700\u6c42\uff0c\u540e\u9762\u5411\u884c\u4e1a\u5f00\u653e\u6e90\u4ee3\u7801\uff0c\u5e76\u4ea4\u4ed8\u5f00\u653e\u539f\u5b50\u57fa\u91d1\u4f1a\u6258\u7ba1\u8fd0\u8425\uff0c\u4e3a\u4e1a\u5185\u6d77\u91cf\u6570\u636e\u573a\u666f\u7684\u9ad8\u53ef\u7528\u5b58\u50a8\u9700\u6c42\u63d0\u4f9b\u652f\u6301\u3002"]}),"\n",(0,s.jsx)(e.h2,{id:"pikiwidbpika-\u6570\u636e\u5e93\u7684\u7279\u70b9",children:"PikiwiDB(Pika) \u6570\u636e\u5e93\u7684\u7279\u70b9"}),"\n",(0,s.jsx)(e.p,{children:"\u6240\u6709\u7684\u8f6f\u4ef6\u90fd\u6709\u81ea\u8eab\u6240\u5bf9\u63a5\u7684\u9700\u6c42\u4e0e\u7279\u70b9\uff0c\u628a\u63e1\u4f4f\u8fd9\u4e9b\u7279\u70b9\u6709\u52a9\u4e8e\u589e\u8fdb\u4f60\u5bf9\u4e8e\u884c\u4e1a\u9700\u6c42\u7684\u7406\u89e3\uff0c\u5e76\u589e\u8fdb\u4f60\u5bf9\u4e8e\u8f6f\u4ef6\u7684\u5e94\u7528\u80fd\u529b\u3002"}),"\n",(0,s.jsx)(e.p,{children:"PikiwiDB(Pika) \u7684\u7279\u70b9\u53ef\u4ee5\u6982\u62ec\u5982\u4e0b\u3002"}),"\n",(0,s.jsx)(e.h3,{id:"\u5bf9-redis-\u7684\u826f\u597d\u517c\u5bb9\u6027",children:"\u5bf9 Redis \u7684\u826f\u597d\u517c\u5bb9\u6027"}),"\n",(0,s.jsx)(e.p,{children:"PikiwiDB(Pika) \u6700\u65e9\u88ab\u7528\u4e8e\u66ff\u6362 360 \u5185\u90e8\u7684 Redis \u670d\u52a1\uff0c\u800c\u6570\u636e\u5e94\u7528\u7a0b\u5e8f\u7684\u6570\u636e\u72ec\u7acb\u6027\u9700\u6c42\u4f7f\u5f97\u6211\u4eec\u5728\u8fc1\u79fb Redis \u6570\u636e\u81f3 PikiwiDB(Pika) \u65f6\uff0c\u5fc5\u987b\u5c3d\u53ef\u80fd\u5c11\u5730\u5e72\u6270\u5230\u6570\u636e\u5e94\u7528\u672c\u8eab\u3002"}),"\n",(0,s.jsx)(e.p,{children:"\u56e0\u6b64 PikiwiDB(Pika) \u81ea\u8bbe\u8ba1\u4f0a\u59cb\uff0c\u4fbf\u5728\u5bf9\u65e2\u6709\u7684 Redis \u5e94\u7528\u517c\u5bb9\u6027\u4e0a\u4e0b\u4e86\u529f\u592b\uff0c\u91c7\u7528\u4e86\u517c\u5bb9 Redis \u7684\u6570\u636e\u4f20\u8f93\u534f\u8bae\uff0c\u8fdb\u800c\u4f7f\u5f97\u7edd\u5927\u591a\u6570\u6570\u636e\u5e94\u7528\u7a0b\u5e8f\uff0c\u53ef\u4ee5\u987a\u5229\u5728\u4e0d\u52a0\u4fee\u6539\u7684\u60c5\u51b5\u4e0b\uff0c\u7531 Redis \u8fc1\u79fb\u5230 PikiwiDB(Pika) \u4e0a\u9762\u6765\u3002"}),"\n",(0,s.jsx)(e.h3,{id:"\u6d77\u91cf\u6570\u636e\u5b58\u50a8\u53cb\u597d",children:"\u6d77\u91cf\u6570\u636e\u5b58\u50a8\u53cb\u597d"}),"\n",(0,s.jsx)(e.p,{children:"\u4f20\u7edf\u7684\u952e\u503c\u6570\u636e\u5e93\u5728\u5c0f\u89c4\u6a21\u6570\u636e\u5e94\u7528\u4e0a\u8868\u73b0\u826f\u597d\uff0c\u53ef\u4ee5\u987a\u5229\u5730\u6ee1\u8db3\u9ad8\u6027\u80fd\u6570\u636e\u5b58\u50a8\u7684\u9700\u6c42\uff0c\u4f46\u662f\u6211\u4eec\u5728\u5b9e\u8df5\u4e2d\u53d1\u73b0\uff0c\u4f34\u968f\u7740\u4e1a\u52a1\u91cf\u7684\u4e0d\u65ad\u6269\u5f20\uff0c\u652f\u6491\u8fd9\u4e9b\u4f20\u7edf\u952e\u503c\u6570\u636e\u5e93\u6240\u9700\u8981\u7684\u786c\u4ef6\u6210\u672c\u6b63\u5728\u4e0d\u65ad\u4e0a\u5347\uff0c\u7ed9\u4f01\u4e1a\u5e26\u6765\u4e86\u6602\u8d35\u7684\u8d1f\u62c5\uff0c\u56e0\u6b64 PikiwiDB(Pika) \u5728\u8bbe\u8ba1\u65f6\u5728\u6d77\u91cf\u6570\u636e\u5b58\u50a8\u4f18\u5316\u4e0a\u505a\u4e86\u6587\u7ae0\uff0c\u4f7f\u5f97\u5728\u540c\u6837\u7684\u6570\u636e\u89c4\u6a21\u6761\u4ef6\u4e0b\uff0cPikiwiDB(Pika) \u76f8\u8f83\u4e8e\u4f20\u7edf\u7684\u952e\u503c\u6570\u636e\u5e93\u80fd\u591f\u5360\u7528\u66f4\u5c11\u7684\u670d\u52a1\u5668\u8d44\u6e90\uff0c\u5e76\u63d0\u4f9b\u6027\u80fd\u76f8\u5f53\u7684\u6570\u636e\u5b58\u50a8\u670d\u52a1\u3002"}),"\n",(0,s.jsx)(e.h3,{id:"\u5feb\u901f\u6545\u969c\u6062\u590d",children:"\u5feb\u901f\u6545\u969c\u6062\u590d"}),"\n",(0,s.jsx)(e.p,{children:"\u9664\u4e86\u786c\u4ef6\u6210\u672c\u7684\u9ad8\u6602\u5916\uff0c\u4f20\u7edf\u7684\u952e\u503c\u6570\u636e\u5e93\u56e0\u4e3a\u5e76\u975e\u9762\u5411\u4e8e\u6d77\u91cf\u6570\u636e\u89c4\u6a21\u800c\u8bbe\u8ba1\uff0c\u540c\u65f6\u56e0\u4e3a\u5176\u6570\u636e\u5b58\u50a8\u4e8e\u5185\u5b58\u4e4b\u4e2d\uff0c\u56e0\u6b64\u5728\u51fa\u73b0\u6545\u969c\u7684\u573a\u666f\u4e0b\uff0c\u6570\u636e\u5f80\u5f80\u4f1a\u5168\u90e8\u4e22\u5931\uff0c\u6570\u636e\u5e94\u7528\u7a0b\u5e8f\u6574\u4f53\u6027\u80fd\u5c06\u4f1a\u5728\u5bf9\u5e94\u65f6\u95f4\u70b9\u6781\u901f\u4e0b\u6ed1\uff0cPikiwiDB(Pika) \u5f25\u8865\u4e86\u4f20\u7edf\u952e\u503c\u6570\u636e\u5e93\u5728\u8fd9\u4e00\u65b9\u9762\u7684\u4e0d\u8db3\uff0c\u5176\u601d\u8def\u5728\u4e8e\u5c06\u5b58\u50a8\u4e8e\u5185\u5b58\u4e2d\u7684\u6570\u636e\u540c\u6b65\u4e8e\u78c1\u76d8\uff0c\u5e76\u4ee5\u65e5\u5fd7\u65b9\u5f0f\u8fdb\u884c\u5b58\u50a8\u3002\u8fd9\u6837\u5728\u51fa\u73b0\u6545\u969c\u7684\u65f6\u5019\uff0c\u4f9d\u6258\u78c1\u76d8\u4e0a\u7684\u6570\u636e\u4e0e\u65e5\u5fd7\u4e2d\u7684\u8bb0\u5f55\uff0c\u5373\u53ef\u5b9e\u73b0\u5feb\u901f\u7684\u6545\u969c\u6062\u590d\uff0c\u800c\u5bf9\u4e8e\u6570\u636e\u5e94\u7528\u7a0b\u5e8f\u800c\u8a00\uff0c\u56e0\u4e3a\u5927\u90e8\u5206\u7684\u5b58\u50a8\u6570\u636e\u4f9d\u65e7\u987a\u5229\u4fdd\u5b58\u7740\uff0c\u6545\u6027\u80fd\u65b9\u9762\u5e76\u4e0d\u4f1a\u4e0b\u964d\u5f88\u591a\u3002"}),"\n",(0,s.jsx)(e.h3,{id:"\u793e\u533a\u9a71\u52a8\u53d1\u5c55",children:"\u793e\u533a\u9a71\u52a8\u53d1\u5c55"}),"\n",(0,s.jsx)(e.p,{children:"\u76ee\u524d PikiwiDB(Pika) \u5df2\u7ecf\u9010\u6e10\u7531 360 \u7684\u5185\u90e8\u9879\u76ee\uff0c\u8fc7\u6e21\u4e3a\u7531\u5f00\u653e\u539f\u5b50\u57fa\u91d1\u4f1a\u6258\u7ba1\u8fd0\u8425\u7684\u793e\u533a\u5f00\u6e90\u9879\u76ee\uff0c\u6211\u4eec\u5c06\u8fdb\u4e00\u6b65\u4f18\u5316\u9879\u76ee\u6587\u6863\u6c34\u5e73\uff0c\u964d\u4f4e\u5916\u90e8\u53c2\u4e0e PikiwiDB(Pika) \u9879\u76ee\u7684\u95e8\u69db\uff0c\u5c3d\u529b\u800c\u4e3a\u5730\u505a\u597d\u6d77\u91cf\u6570\u636e\u89c4\u6a21\u4e0b\u7684\u9ad8\u53ef\u7528\u952e\u503c\u6570\u636e\u5e93"}),"\n",(0,s.jsx)(e.h2,{id:"\u53d1\u5c55\u5386\u7a0b",children:"\u53d1\u5c55\u5386\u7a0b"}),"\n",(0,s.jsxs)(e.ul,{children:["\n",(0,s.jsx)(e.li,{children:"2016\u5e74 Pika \u9879\u76ee\u53d1\u5e03\u4e8e 360 Github \u4ed3\u5e93"}),"\n",(0,s.jsx)(e.li,{children:"2021\u5e74 \u63a5\u53d7\u5f00\u653e\u539f\u5b50\u57fa\u91d1\u4f1a\u6307\u5bfc\u5b75\u5316"}),"\n",(0,s.jsx)(e.li,{children:"2023\u5e74 Pika \u9879\u76ee\u66f4\u540d\u4e3a PikiwiDB(Pika)"}),"\n"]})]})}function k(i={}){const{wrapper:e}={...(0,t.R)(),...i.components};return e?(0,s.jsx)(e,{...i,children:(0,s.jsx)(c,{...i})}):c(i)}},1313:(i,e,n)=>{n.d(e,{A:()=>s});const s=n.p+"assets/images/PikiwiDB(Pika)-Logo-ab6820fbb859308b95d22928b12610fb.png"},8453:(i,e,n)=>{n.d(e,{R:()=>r,x:()=>a});var s=n(6540);const t={},d=s.createContext(t);function r(i){const e=s.useContext(d);return s.useMemo((function(){return"function"==typeof i?i(e):{...e,...i}}),[e,i])}function a(i){let e;return e=i.disableParentContext?"function"==typeof i.components?i.components(t):i.components||t:r(i.components),s.createElement(d.Provider,{value:e},i.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/3834.d9ccb168.js b/build/assets/js/3834.d9ccb168.js new file mode 100644 index 0000000..ab5aaeb --- /dev/null +++ b/build/assets/js/3834.d9ccb168.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[3834],{6535:(e,t,a)=>{a.d(t,{A:()=>j});var n=a(6540),s=a(4164),r=a(781),i=a(4581),l=a(8774),o=a(1312),c=a(6347),d=a(9169);function m(e){const{pathname:t}=(0,c.zy)();return(0,n.useMemo)((()=>e.filter((e=>function(e,t){return!(e.unlisted&&!(0,d.ys)(e.permalink,t))}(e,t)))),[e,t])}const u={sidebar:"sidebar_re4s",sidebarItemTitle:"sidebarItemTitle_pO2u",sidebarItemList:"sidebarItemList_Yudw",sidebarItem:"sidebarItem__DBe",sidebarItemLink:"sidebarItemLink_mo7H",sidebarItemLinkActive:"sidebarItemLinkActive_I1ZP"};var h=a(4848);function g(e){let{sidebar:t}=e;const a=m(t.items);return(0,h.jsx)("aside",{className:"col col--3",children:(0,h.jsxs)("nav",{className:(0,s.A)(u.sidebar,"thin-scrollbar"),"aria-label":(0,o.T)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"}),children:[(0,h.jsx)("div",{className:(0,s.A)(u.sidebarItemTitle,"margin-bottom--md"),children:t.title}),(0,h.jsx)("ul",{className:(0,s.A)(u.sidebarItemList,"clean-list"),children:a.map((e=>(0,h.jsx)("li",{className:u.sidebarItem,children:(0,h.jsx)(l.A,{isNavLink:!0,to:e.permalink,className:u.sidebarItemLink,activeClassName:u.sidebarItemLinkActive,children:e.title})},e.permalink)))})]})})}var f=a(5600);function p(e){let{sidebar:t}=e;const a=m(t.items);return(0,h.jsx)("ul",{className:"menu__list",children:a.map((e=>(0,h.jsx)("li",{className:"menu__list-item",children:(0,h.jsx)(l.A,{isNavLink:!0,to:e.permalink,className:"menu__link",activeClassName:"menu__link--active",children:e.title})},e.permalink)))})}function x(e){return(0,h.jsx)(f.GX,{component:p,props:e})}function b(e){let{sidebar:t}=e;const a=(0,i.l)();return t?.items.length?"mobile"===a?(0,h.jsx)(x,{sidebar:t}):(0,h.jsx)(g,{sidebar:t}):null}function j(e){const{sidebar:t,toc:a,children:n,...i}=e,l=t&&t.items.length>0;return(0,h.jsx)(r.A,{...i,children:(0,h.jsx)("div",{className:"container margin-vert--lg",children:(0,h.jsxs)("div",{className:"row",children:[(0,h.jsx)(b,{sidebar:t}),(0,h.jsx)("main",{className:(0,s.A)("col",{"col--7":l,"col--9 col--offset-1":!l}),children:n}),a&&(0,h.jsx)("div",{className:"col col--2",children:a})]})})})}},6609:(e,t,a)=>{a.d(t,{A:()=>F});var n=a(6540),s=a(4164),r=a(7131),i=a(4848);function l(e){let{children:t,className:a}=e;return(0,i.jsx)("article",{className:a,children:t})}var o=a(8774);const c={title:"title_f1Hy"};function d(e){let{className:t}=e;const{metadata:a,isBlogPostPage:n}=(0,r.e)(),{permalink:l,title:d}=a,m=n?"h1":"h2";return(0,i.jsx)(m,{className:(0,s.A)(c.title,t),children:n?d:(0,i.jsx)(o.A,{to:l,children:d})})}var m=a(1312),u=a(4586);const h=["zero","one","two","few","many","other"];function g(e){return h.filter((t=>e.includes(t)))}const f={locale:"en",pluralForms:g(["one","other"]),select:e=>1===e?"one":"other"};function p(){const{i18n:{currentLocale:e}}=(0,u.A)();return(0,n.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:g(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),f}}),[e])}function x(){const e=p();return{selectMessage:(t,a)=>function(e,t,a){const n=e.split("|");if(1===n.length)return n[0];n.length>a.pluralForms.length&&console.error(`For locale=${a.locale}, a maximum of ${a.pluralForms.length} plural forms are expected (${a.pluralForms.join(",")}), but the message contains ${n.length}: ${e}`);const s=a.select(t),r=a.pluralForms.indexOf(s);return n[Math.min(r,n.length-1)]}(a,t,e)}}var b=a(6266);const j={container:"container_mt6G"};function v(e){let{readingTime:t}=e;const a=function(){const{selectMessage:e}=x();return t=>{const a=Math.ceil(t);return e(a,(0,m.T)({id:"theme.blog.post.readingTime.plurals",description:'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One min read|{readingTime} min read"},{readingTime:a}))}}();return(0,i.jsx)(i.Fragment,{children:a(t)})}function A(e){let{date:t,formattedDate:a}=e;return(0,i.jsx)("time",{dateTime:t,children:a})}function N(){return(0,i.jsx)(i.Fragment,{children:" \xb7 "})}function P(e){let{className:t}=e;const{metadata:a}=(0,r.e)(),{date:n,readingTime:l}=a,o=(0,b.i)({day:"numeric",month:"long",year:"numeric",timeZone:"UTC"});return(0,i.jsxs)("div",{className:(0,s.A)(j.container,"margin-vert--md",t),children:[(0,i.jsx)(A,{date:n,formattedDate:(c=n,o.format(new Date(c)))}),void 0!==l&&(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(N,{}),(0,i.jsx)(v,{readingTime:l})]})]});var c}function k(e){return e.href?(0,i.jsx)(o.A,{...e}):(0,i.jsx)(i.Fragment,{children:e.children})}function _(e){let{author:t,className:a}=e;const{name:n,title:r,url:l,imageURL:o,email:c}=t,d=l||c&&`mailto:${c}`||void 0;return(0,i.jsxs)("div",{className:(0,s.A)("avatar margin-bottom--sm",a),children:[o&&(0,i.jsx)(k,{href:d,className:"avatar__photo-link",children:(0,i.jsx)("img",{className:"avatar__photo",src:o,alt:n})}),n&&(0,i.jsxs)("div",{className:"avatar__intro",children:[(0,i.jsx)("div",{className:"avatar__name",children:(0,i.jsx)(k,{href:d,children:(0,i.jsx)("span",{children:n})})}),r&&(0,i.jsx)("small",{className:"avatar__subtitle",children:r})]})]})}const w={authorCol:"authorCol_Hf19",imageOnlyAuthorRow:"imageOnlyAuthorRow_pa_O",imageOnlyAuthorCol:"imageOnlyAuthorCol_G86a"};function y(e){let{className:t}=e;const{metadata:{authors:a},assets:n}=(0,r.e)();if(0===a.length)return null;const l=a.every((e=>{let{name:t}=e;return!t}));return(0,i.jsx)("div",{className:(0,s.A)("margin-top--md margin-bottom--sm",l?w.imageOnlyAuthorRow:"row",t),children:a.map(((e,t)=>(0,i.jsx)("div",{className:(0,s.A)(!l&&"col col--6",l?w.imageOnlyAuthorCol:w.authorCol),children:(0,i.jsx)(_,{author:{...e,imageURL:n.authorsImageUrls[t]??e.imageURL}})},t)))})}function I(){return(0,i.jsxs)("header",{children:[(0,i.jsx)(d,{}),(0,i.jsx)(P,{}),(0,i.jsx)(y,{})]})}var B=a(440),T=a(5533);function M(e){let{children:t,className:a}=e;const{isBlogPostPage:n}=(0,r.e)();return(0,i.jsx)("div",{id:n?B.blogPostContainerID:void 0,className:(0,s.A)("markdown",a),children:(0,i.jsx)(T.A,{children:t})})}var U=a(7559),L=a(4336),C=a(8046);function O(){return(0,i.jsx)("b",{children:(0,i.jsx)(m.A,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts",children:"Read More"})})}function $(e){const{blogPostTitle:t,...a}=e;return(0,i.jsx)(o.A,{"aria-label":(0,m.T)({message:"Read more about {title}",id:"theme.blog.post.readMoreLabel",description:"The ARIA label for the link to full blog posts from excerpts"},{title:t}),...a,children:(0,i.jsx)(O,{})})}function R(){const{metadata:e,isBlogPostPage:t}=(0,r.e)(),{tags:a,title:n,editUrl:l,hasTruncateMarker:o,lastUpdatedBy:c,lastUpdatedAt:d}=e,m=!t&&o,u=a.length>0;if(!(u||m||l))return null;if(t){const e=!!(l||d||c);return(0,i.jsxs)("footer",{className:"docusaurus-mt-lg",children:[u&&(0,i.jsx)("div",{className:(0,s.A)("row","margin-top--sm",U.G.blog.blogFooterEditMetaRow),children:(0,i.jsx)("div",{className:"col",children:(0,i.jsx)(C.A,{tags:a})})}),e&&(0,i.jsx)(L.A,{className:(0,s.A)("margin-top--sm",U.G.blog.blogFooterEditMetaRow),editUrl:l,lastUpdatedAt:d,lastUpdatedBy:c})]})}return(0,i.jsxs)("footer",{className:"row docusaurus-mt-lg",children:[u&&(0,i.jsx)("div",{className:(0,s.A)("col",{"col--9":m}),children:(0,i.jsx)(C.A,{tags:a})}),m&&(0,i.jsx)("div",{className:(0,s.A)("col text--right",{"col--3":u}),children:(0,i.jsx)($,{blogPostTitle:n,to:e.permalink})})]})}function F(e){let{children:t,className:a}=e;const n=function(){const{isBlogPostPage:e}=(0,r.e)();return e?void 0:"margin-bottom--xl"}();return(0,i.jsxs)(l,{className:(0,s.A)(n,a),children:[(0,i.jsx)(I,{}),(0,i.jsx)(M,{children:t}),(0,i.jsx)(R,{})]})}},7131:(e,t,a)=>{a.d(t,{e:()=>o,i:()=>l});var n=a(6540),s=a(9532),r=a(4848);const i=n.createContext(null);function l(e){let{children:t,content:a,isBlogPostPage:s=!1}=e;const l=function(e){let{content:t,isBlogPostPage:a}=e;return(0,n.useMemo)((()=>({metadata:t.metadata,frontMatter:t.frontMatter,assets:t.assets,toc:t.toc,isBlogPostPage:a})),[t,a])}({content:a,isBlogPostPage:s});return(0,r.jsx)(i.Provider,{value:l,children:t})}function o(){const e=(0,n.useContext)(i);if(null===e)throw new s.dV("BlogPostProvider");return e}},6676:(e,t,a)=>{a.d(t,{k:()=>d,J:()=>m});var n=a(6025),s=a(4586),r=a(6803);var i=a(7131);const l=e=>new Date(e).toISOString();function o(e){const t=e.map(u);return{author:1===t.length?t[0]:t}}function c(e,t,a){return e?{image:h({imageUrl:t(e,{absolute:!0}),caption:`title image for the blog post: ${a}`})}:{}}function d(e){const{siteConfig:t}=(0,s.A)(),{withBaseUrl:a}=(0,n.hH)(),{metadata:{blogDescription:r,blogTitle:i,permalink:d}}=e,m=`${t.url}${d}`;return{"@context":"https://schema.org","@type":"Blog","@id":m,mainEntityOfPage:m,headline:i,description:r,blogPost:e.items.map((e=>function(e,t,a){const{assets:n,frontMatter:s,metadata:r}=e,{date:i,title:d,description:m,lastUpdatedAt:u}=r,h=n.image??s.image,g=s.keywords??[],f=`${t.url}${r.permalink}`,p=u?l(u):void 0;return{"@type":"BlogPosting","@id":f,mainEntityOfPage:f,url:f,headline:d,name:d,description:m,datePublished:i,...p?{dateModified:p}:{},...o(r.authors),...c(h,a,d),...g?{keywords:g}:{}}}(e.content,t,a)))}}function m(){const e=function(){const e=(0,r.A)(),t=e?.data?.blogMetadata;if(!t)throw new Error("useBlogMetadata() can't be called on the current route because the blog metadata could not be found in route context");return t}(),{assets:t,metadata:a}=(0,i.e)(),{siteConfig:d}=(0,s.A)(),{withBaseUrl:m}=(0,n.hH)(),{date:u,title:h,description:g,frontMatter:f,lastUpdatedAt:p}=a,x=t.image??f.image,b=f.keywords??[],j=p?l(p):void 0,v=`${d.url}${a.permalink}`;return{"@context":"https://schema.org","@type":"BlogPosting","@id":v,mainEntityOfPage:v,url:v,headline:h,name:h,description:g,datePublished:u,...j?{dateModified:j}:{},...o(a.authors),...c(x,m,h),...b?{keywords:b}:{},isPartOf:{"@type":"Blog","@id":`${d.url}${e.blogBasePath}`,name:e.blogTitle}}}function u(e){return{"@type":"Person",...e.name?{name:e.name}:{},...e.title?{description:e.title}:{},...e.url?{url:e.url}:{},...e.email?{email:e.email}:{},...e.imageURL?{image:e.imageURL}:{}}}function h(e){let{imageUrl:t,caption:a}=e;return{"@type":"ImageObject","@id":t,url:t,contentUrl:t,caption:a}}}}]); \ No newline at end of file diff --git a/build/assets/js/4061d127.59241894.js b/build/assets/js/4061d127.59241894.js new file mode 100644 index 0000000..7a0cbd8 --- /dev/null +++ b/build/assets/js/4061d127.59241894.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[4292],{9370:(i,e,t)=>{t.r(e),t.d(e,{assets:()=>E,contentTitle:()=>o,default:()=>I,frontMatter:()=>d,metadata:()=>n,toc:()=>k});var s=t(4848),a=t(8453);const d={title:"Pika \u548c RockSDB \u7684\u5bf9\u63a5",sidebar_position:3},o=void 0,n={id:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/Pika \u548c RockSDB \u7684\u5bf9\u63a5/index",title:"Pika \u548c RockSDB \u7684\u5bf9\u63a5",description:"\u5728\u300aPika\u6e90\u7801\u5b66\u4e60--pika\u7684\u547d\u4ee4\u6267\u884c\u6846\u67b6\u300b\u4e2d\u6211\u4eec\u4e86\u89e3\u4e86\u4e00\u4e2a\u547d\u4ee4\u7684\u6267\u884c\u6d41\u7a0b\uff0c\u4e5f\u77e5\u9053\u4e86pika\u4f7f\u7528\u7684\u662fBlackwidow\u5f15\u64ce\uff0c\u73b0\u5728\u6211\u4eec\u6765\u770b\u770bpika\u662f\u600e\u4e48\u548crocksdb\u5bf9\u63a5\u7684\uff0cBlackwidow\u5177\u4f53\u600e\u4e48\u5904\u7406\u547d\u4ee4\u3002",source:"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/Pika \u548c RockSDB \u7684\u5bf9\u63a5/index.md",sourceDirName:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/Pika \u548c RockSDB \u7684\u5bf9\u63a5",slug:"/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/Pika \u548c RockSDB \u7684\u5bf9\u63a5/",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/Pika \u548c RockSDB \u7684\u5bf9\u63a5/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/Pika \u548c RockSDB \u7684\u5bf9\u63a5/index.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{title:"Pika \u548c RockSDB \u7684\u5bf9\u63a5",sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"Pika \u7684\u547d\u4ee4\u6267\u884c\u6846\u67b6",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/Pika \u7684\u547d\u4ee4\u6267\u884c\u6846\u67b6/"},next:{title:"Pika \u4f20\u706b\u8ba1\u5212",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/"}},E={},k=[];function c(i){const e={a:"a",img:"img",p:"p",...(0,a.R)(),...i.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(e.p,{children:"\u5728\u300aPika\u6e90\u7801\u5b66\u4e60--pika\u7684\u547d\u4ee4\u6267\u884c\u6846\u67b6\u300b\u4e2d\u6211\u4eec\u4e86\u89e3\u4e86\u4e00\u4e2a\u547d\u4ee4\u7684\u6267\u884c\u6d41\u7a0b\uff0c\u4e5f\u77e5\u9053\u4e86pika\u4f7f\u7528\u7684\u662fBlackwidow\u5f15\u64ce\uff0c\u73b0\u5728\u6211\u4eec\u6765\u770b\u770bpika\u662f\u600e\u4e48\u548crocksdb\u5bf9\u63a5\u7684\uff0cBlackwidow\u5177\u4f53\u600e\u4e48\u5904\u7406\u547d\u4ee4\u3002"}),"\n",(0,s.jsx)(e.p,{children:"1.Pika\u548crocksdb\u5bf9\u63a5\n\u5728Partition\u6784\u9020\u7684\u65f6\u5019\uff0c\u521b\u5efa\u4e86\u4e00\u4e2aBlackWidow\uff0c\u5f53\u524dBlackWidow\u652f\u63015\u79cdredis\u7684\u6570\u636e\u7ed3\u6784\uff0c\u5206\u522b\u662fString\u7ed3\u6784\uff0c Hash\u7ed3\u6784\uff0cList\u7ed3\u6784\uff0cSet\u7ed3\u6784\u548cZSet\u7ed3\u6784\u3002\u4e00\u4e2aBlackWidow\u5206\u522b\u4e3a\u8fd95\u79cd\u6570\u636e\u7ed3\u6784\u6253\u5f00\u4e86\u4e00\u4e2arocksdb\uff0c\u5206\u522b\u662f strings_db_\uff0chashes_db_\uff0csets_db_\uff0czsets_db_\uff0clists_db_\uff0c\u5728BlackWidow::Open\u7684\u65f6\u5019\u6253\u5f00\u4e86\u8fd9\u4e2a5\u4e2arocksdb\uff1a"}),"\n",(0,s.jsx)(e.p,{children:(0,s.jsx)(e.img,{alt:"alt text",src:t(8488).A+"",width:"490",height:"583"})}),"\n",(0,s.jsx)(e.p,{children:"\u5728\u4e0a\u9762\u547d\u4ee4\u4e0b\u6765\u7684\u65f6\u5019\uff0cBlackWidow\u5c31\u4f1a\u6839\u636e\u547d\u4ee4\u4f7f\u7528\u5177\u4f53\u7c7b\u578b\u7684db\u6765\u64cd\u4f5c"}),"\n",(0,s.jsx)(e.p,{children:(0,s.jsx)(e.img,{alt:"alt text",src:t(4326).A+"",width:"517",height:"88"})}),"\n",(0,s.jsxs)(e.p,{children:["2.Redis\u547d\u4ee4\u4e0erocksdb kv\u7684\u8f6c\u6362\n\u56e0\u4e3arocksdb\u53ea\u652f\u6301kv\u7684\u64cd\u4f5c\uff0c\u90a3\u4e48redis\u7684\u51e0\u79cd\u6570\u636e\u7ed3\u6784\u662f\u600e\u4e48\u8f6c\u6362\u6210rocksdb\u7684kv\u7684\u5462\uff1f\u5b98\u65b9\u6709\u8d44\u6599\u8be6\u7ec6\u4ecb\u7ecd\u4e86\u8fd9\u4e2a\uff0c\u6211\u4eec\u6839\u636e\u5b98\u65b9\u8d44\u6599\u5b66\u4e60\u5373\u53ef\uff08pika blackwidow\u5f15\u64ce\u6570\u636e\u5b58\u50a8\u683c\u5f0f\uff09",(0,s.jsx)(e.a,{href:"https://github.com/Qihoo360/pika/wiki/pika-blackwidow%E5%BC%95%E6%93%8E%E6%95%B0%E6%8D%AE%E5%AD%98%E5%82%A8%E6%A0%BC%E5%BC%8F",children:"https://github.com/Qihoo360/pika/wiki/pika-blackwidow\u5f15\u64ce\u6570\u636e\u5b58\u50a8\u683c\u5f0f"}),"\n\u8fd9\u91cc\u5f15\u7528\u5b98\u65b9\u7684\u4e00\u4e2a\u56fe\uff0cpika\u7684\u6bcf\u4e2a\u5206\u533a\u662f\u6253\u5f00\u4e865\u4e2arocksdb\uff0c\u4e00\u4e9b\u6570\u636e\u7ed3\u6784\u7684\u5bf9\u63a5\u9700\u8981\u5206\u5f00\u4fdd\u5b58\u5143\u6570\u636e\u548c\u6570\u636e\uff0c\u5143\u6570\u636e\u548c\u6570\u636e\u5206\u5f00\u5b58\u50a8\u662f\u7528\u4e86rocksdb\u7684Column Family"]}),"\n",(0,s.jsx)(e.p,{children:(0,s.jsx)(e.img,{alt:"alt text",src:t(7914).A+"",width:"554",height:"638"})})]})}function I(i={}){const{wrapper:e}={...(0,a.R)(),...i.components};return e?(0,s.jsx)(e,{...i,children:(0,s.jsx)(c,{...i})}):c(i)}},4326:(i,e,t)=>{t.d(e,{A:()=>s});const s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgUAAABYCAYAAABlE4QNAAAABHNCSVQICAgIfAhkiAAAG6ZJREFUeF7tnb+r49p2x7++TJPjpAlXBwZCbNKN5C5+tR1IEQikCCPf8t20zgu8/0BSG0j3rqtABlKNNVV4TQgJcpIiZFxaGl4RsJt74WhCilyfkBCisPaWbEmWZNnH5+d8P2AOx9tb2luSvddee+317SRJkgBbbJZLbHsjmAZqiBEtNugO3wCfllhvDz9mmPX1f/jhB7x+/fqwEiGEEEKeBK9atyKOEXcN9LpddIcj9HYVxViIYYxMFOyJ7QbLZQxjOESv2/oshBBCCHkkXm2Wi/2sP1pgAQOmGuBlsI8QZw3r9jEc9sDxnRBCCHmZdPTywf3D5QNCCCHkafPV024eIYQQQh4KGgWEEEIIUdAoIIQQQoiCRsG5hAvMOh58/9wDEEIIIU+LV1mOAsk7UMwzoHMX7PMRdNHfbS8sl0EqY1Sf5OBkYm8GHzamzmHihKayA2TwHgT7XRS2DWduph+L4HdCWImN7J3nSDQpGifm3JFuPmFexnUnhJCXxqvN8hPwZoj+pyWK+Yi66OXzEcQRFpsYvd3AnzcSLk2EwDUwTg4NAjSWlYngD0JYKwcjq1x2R6wRpsnojge5O8oggA0nec5mDSGEkKfAq95wCOUtONKa7e0tut2rI5/KcYfkRbEXIHarZ+9NZQeEsfIQXB8UoDC7jjqe/kTOixBNZohtC+Ek9TJYY0xXI5W/YTGYIQiligm74GXQM+BrN0bg6gwPhjvdezvKXgtxsGTlpbJCvTrCBQJf2lBjEJSOufMg+D5msuzhR4itMcZmgMCHLkdDmV28buoK7LwSp/bdxM5OO6fvhBBCLs6RjIa5BEYqeVE+ddEWa0l8pJp0Sa9BjMgHrPdVXoKmsgqsEWw3xGzgIdgN6hoZzJxGN3aMwAOmiaMyNcqMPPBHsG0DI/E8pHUPiRCE6cxdBrtvIsSOGBMlr4Xvw/Ot1GCIsfjmDI9GdIPYui5mktxROp8aeGdYrKYQ/0bsQxk0YcdHaE8xtXz4USx2Tn2ZJLZS1y1FHdNHtDOMWva9cO3O7DshhJCLcyTQULIbjjCSV2+L5XKTLjHopQX1vrzMK6yXueyHQreH4eiMFMd+gMAcV7v7m8pqMJwpnMTB1A5VYKA3iWo+eYipBnNN+3V6E3YWs2AZMMKbfTxDLQZMGwgGHmbeLofk3fBDRHbuOlojjO0YN1n3bSuNozAxLsdtNJWJMSPXUV75WA1FTd/LbSlwD30nhBByFkc8BTkMA0a0wedtD91yrmMpazH0HSfGwosxfl/lDm8qO44yDhxxcQdYhGa10XGvmLBsH754LdR5im5/3T6oIEqvE6MYEFmDeb0zOqr8Kpcngj+JMd7FaOglg7tyVt8JIYRcnCOeghypINLXZYNAIhI2G8TKMMghMQWLJTYVaoq1hBFCWDCrggKbytqSxhgUiRGr+IB7Rtb/o7FajhDPhVOz40ENkKsxjEjHQzRimbAsGagrvB9iMPhiAKVHUPEHBq6r7K0ziSY+Ks58iGpLmH5WYjKq653Ud0IIIRfnTEGkkljShbYjRl4Aw9Fr+GWaymoRV3dhwDQwljX1ndFhYuwGOuZADlLYrliHzI73g5oKUizFK1Qi7nvTw6yj/QSarD3FY8ravbTz+Oxf4humwEC8C/uz6qWOEabzG3g7z0Su761G8iqK3g7DHcP0b6o+WETFdszU8o1gzm2Yk8xaObfvhBBCLs3TEURSQXmArSL8SzSVPRfEQPGu0x0MGhW8aOV2JxBCCCGPyNMxCl485RlxW88EIYQQ8jDQKCCEEEKIon2gISGEEEJeNDQKCCGEEKKgUUAIIYQQBY0C8sSJ4Xs+Bh0PnfQ1mEg+izMII3iTGQaDxXn1CSHkhUOjgDxp/MkME7doBIS+jz/62a9Kqp4tiEK4fozwv79HuEvZTQghJINGwZdM7GHgdVCVEPFJEC7giZojuvj23RhBoF/v3D5+e/tv+HRSuswc//s/+K/GDmolzF02yC+Fp/48EELuna+UbPJygcViARHJ27N/X8oWVSmL4ygtW2BxiZlX+qPU8Tr65asRIcXHxJsg/047zq13DnKutO3p3/2AG8KbZWXn9KMKOeYAVRpKvl8x2EcTFK9pGx7y+tWxxXr9f+gPtQDXT52f4pd/biEv5C3eg8Ggeokh9GZ66SG7Ges1vv3JO/y6Wo7wD54pkc0ObfsR9DHynHnda79D9/H8HUGet8rvchMRJh0xVi8kDEYIOYmvNstPwJsh+geaBhVKiJv9F3W7WWKx6WKYKSUOezg4xEn4mMx82NMEiZO+bPukIzwNbMyz9k9dRH5mAFhwVN/meIhemdcWomOiDoaDlZMgE3V8clgm7De6VYH7j+j/7i8wEfe/+A6MHsyefuJk0FdxBrlAA2Uk/MG/tFhi0Cm7d/hiJNippPVzo+k71OL5u+jzEMILIrjZMx95lcYrIeRp8VVv2E7eeHt7i243m5tt8Tm+gtlkCJwqiBRHtSn5ZdbbUbPr3Ew850XQ5fsZejYhbK5XnomV/i/NuAbn+JLjEKGRSRQ3U9eHjEJ5wYOyJ1wM0PGqPQcZllJEOjJrLPS95NUoXZfsWsu5y9fo4D1Vt6Z9lWUGnOhP8PPfT83NX/27ijEYdH6BP965jCJ4rhirv4Fv3Z/oJYZ3FsbS4b/9Z/zsb2JYzhQ/rv8QgZsm0O738S5digiC9LMpkR/BtKtVo2rvQc01QfpMeeq+6OezcI1qnrHm57aBhu9QM0eeB+mJ+g7WefAOv3uaUDTIoNtlwjzIX34M7TUoenOy97RXKPMoaG/QDN7OMKTHgZCzSBQ/JuuPQRLe6P/23CRhECSBvD6ukx+zgh/XyceP62QdpmVBkHxc70rTQ66Tj8HHJHv7+++/P3iVWQVWAhcJvnOTVbkwmSe2ayfzg/dL3LiJVfhcXb3y+/n/V4n7nZW4B9fjGHIM6D6ov1XtLZ+3glIf5nMkmFf1fN9Ode1y103+twK5ivvz7d/LqGqLvJfve/4zpTLVzvSzoZ22sXg+O8z1L//5Mk1l8nyG/5C4336X9OEmUK+/SP70n5IkWQWJtXsvK9v/Hbv7ZzCZz3Xd/rvkXf553hEmc8yTfJN3V6r2HjRcE1WWu3fSx909OvaMVd2b4zR/h4Sm41aX1fdd+pB/xkv11T2t+z7XESY2pN5NMrflPs5z3/l9mSK997b6apTK1L3O1yWEtOFIoKEBM1se6G2xzMcNbNfYGnqNdzQycbX+VJRJ7vYwHBW9EK9fvy68ylijlVo6WFm+CoCrmxEfkF+7nLkX2G5m4a0FuLPOwez3OPnlAwteeaZdR20ffPiRBXdct+gQ6naGNlZTB5kApGWYCG8iIPIBE/BTZUTTqNKlzhH58E0HTtWsrlxmOHDMdDZoWPrccQQYkTpfdANY+eMo9/Sq+thNZbKUZf4enL/6Kf717yz8jmrufyL8+yU2zRGDIuyN7W3dRW9Lwz1ouiYKG/NsGcwwYcaZhPRdnrF6zv4O1dLQ9/gD/DgfRyNepUjHJokXRJYD5blVfdbeiLZBraE7w8Q34K7s/XKbH6r4DylT21MHQe67borIKULtmoDnRYBtPchSHSEviVetO2MYMKINPm/T2IFuH73dD74Bw4gQy4/v3QILFOqHbSQ/NrIOaVcPIjt8THy9dqkHMql3ejhiGd0GpC75UPR+cXKMg/EWtuHrH8mqQbZ1H5pcr2IwmHADPdiUh3w/FEVoG74sOVyXe3lhYjEGQlhjG2Gc9vsuSFyAfw3HGcnvu3q4bv4jwa+pY3bR72+x7Rli8yCUHQquiW/HLR7A9Rbrk9vVdA/O4yLPWA2nfYeO0dB3wy0Yoxm+78K0Ezgm8BYDtWykDKTqlZkDLMtQA7z/IYZTtCzhrqZwyg+60hczgUkIP7yGHxpw37c8GSFkxxFPQY44Rtw18LX85na/hoEYn7dZeYw47mIXciCcGlNQpnJ9NJ2FNODvAvvy1NXbv19dLzVQpi6s+IyEOWom1fCDWkOxLTZs04fXFNOgDBYUd2eombsOmpO5lg0fH2AWZ+5VSD2Z/aoymd3lYgpUWS5gLPbgRZY+ZjoL9mUGbL6FdeMjLA8mlXEDKTVloR9gUrWrYNzHt3155kw47m8qj8A79yPG4yD3usHNaLRfyzavU6Mphlu5+8DAtRUhPLApG+5B0zVpiRrAK5+xuue2JZXfoVNp6rt4PlzIpLyMBLr66YW0Ru+hwjnM3Kz/GLaNlWukHoP0w2rmH8OtOqFgj+FaESbiQbC0J6aAyJd3PPlDCKnhK70dcSmTJ8SRbD2MoPcYSFS23qqotiTKToNdYGEXvTcG4nQro9SB2S5gsZa8+1yWDtROhLyr2YYz1i59Vb77ZsuPlnahy/vetVtyGdbXyx+vWC/vEk3bYu9d883k6qo+ZLsNsvdzAZMzL3V/NvfBtucwg32wWuWyys4wyG1FjHxEKrAQMK8juEH2693QFsPB+3GUbq0cIBzndkuIi9821XLF4T0Sg8OHf2NCzBFTGSTtgixrscdY/eVvSVzgnn4X428tvJNRxuhBNiBYzp/h489fI/8xjd5ZsNszY43w/q/76fJDRn73gYGRYyLyFvs6KbX3oPGaNHHsGat7bhto/A413PPGMpmB1z1/NuZqh00uCDF9ppUhEGdbEgdwDVf/f8KIbDk2XAsquFQHEJqYr8awfH+X3bIYhGjgra1dcrYzOvCaiVEopXFx7zUhJAelk8kTZ4ttvMGnTYxt5pnqdmGIQdAzCqtV202ET+u4tA1R4mLMwurNNo7wKcp/zlBxMRnRxENgTZ/ptsQvG3/iYRKNsVpVGAWI4Hd8YO6o+ANCyCE0Cgg5QDIa+sD76SMnMCJtUbkqZGuqVW0QxN4MMzeG4dLYI6QJGgWEEEIIUbTffUAIIfeMbDW8NEniXPqQhLxYaBQQQp4MHMAJeVzab0kkhBBCyIuGRgEhXxqp5kLb7IJfBnpnQkXKBUK+KM6TTs5LJme5DC4hnUzIF4fkDzhDSrskprTf/39c3OjinCWRfC4xvFwyq8nFEhGZsOeAPzjMUdEG2cYqiZFmlHwmz531RxGMqRNEynETJsGhYpKmqSxFBJEIIWWqRYiaKYkwVXLOcc8hL+zUpl0XoiCGdDlC2xUtpdNYBcl3VpCcrJ9GyBPkTOnkPFtsNrfo74UQNHdNc0zII1ErE0yJ5J18cnHp4XSJ5Gap46I3QHYkZBLJjYQLDDre3nugMh8eyikrMaWaY4psdlVGS0K+FI7EFOxTHS9jA28kp2yZeIP1lU43S8hzRwyCCeZKrVO9dqnvfExU2ur0fZXed4C9t9iHe+PoOlMXCD+kKaxDeH6unqiAjrSaj23LsSSNdE5Zs02qPZWKOk35vUuV3QYLjmp/LnV1jvq+y5KEDzu7Jo742bMlDwuOnaY6lnxPNccuYzljpWMggkcKpYBowH4riYgNOCtH7URQr7mJ0A1SPY5ziTDp+IjcqT7mSl3Aw+UH24IZ3hykuW4kukFsGs2aZ4Q8E45sSdTSyQqJI1hucvoHgngJYhi9CjUyJZ3ceyaXgRAhlQmeVuTATSWS55napZKNduHLmKbeK0ski4gwlA6EyHAPZh3449XOILgreYXFgeeep+JZoKHvqURy6HVyNSxYajzfSySHSqkzxIeZaGYkRxQRtdTxREkdG/BFa9u29+qHMssvuCMMRKG6oOeRyi6LIdBx94eo+OWSHztRe25xLsl8OUNg2nDayj8S8sQ5YhTkyEsnZw4D8RKgj2GjLDAhz4nTVS2PQYnkanZSx2KO+YCdDayyDDCJYM8dzMU+UwbCTtbqDtTLLhcxRPyyBQZGKwcjUV+cgIYBeREcWT7IkZdOVmRegl5BlGYHYwrIs6NJJrhBNrollEgukUod+16MKPUcKKKbdOlFiOHVSSWXsQw184+UCmKp3jHZ5YwwRmxpNcXWiPpiFJ+25EDIE+WVSCeLbLJCpJN3qnIl2dluv7h0QC8BeYGITLDvDdAJ0s4pSWobWiI5RGfWgfY+W3AL0t51lLcc6nr7iahIJIsLPj1udr4mZAtgQYI435bi+Xxx+RsuVlOR/m4q0xLJlX1PJZKljbsFhOyYIpE8E1nv7HplEsnpdWtESx27bgDLne4lz1NjwZ146ny2O4YVij9f0LEB2U7EUH0m8wCYcFwDg3SJoFhPyy4PBhJ8mDXKxDyRiI49kRfAcBzGB5AvFgoiEUKIIMsA3jWmq9FpRkG4wGxwg3Fi18QoEPJ8aL98QAghL5ZINlTAPtUgEKwRxrZkRGTyIvL8oaeAEPLg3Ica4rlQhImQPe13HxBCyIXgQEzI04TLBy8dit88MHrv+iKLiyMNUISIkKfGeYJIQkkUabnJtjA8JySSuWUK1UelHMH+3Mn35xH6lhfw8TponxVQ2trBoGHEjyYzhLaNNGmhjpb3PAwWl9hn/1jcl8jS3USICCGX56vN8hPwZoj+QQbjLnrDEUaj9GVeYb3JfthiRBFgZmUjE1frDffpPkUMByvnWHa5l4ek7K0cvMVz4vuwxqt9KmO1Xe8C+D582Jg6Ly2bV3N65DthS26IAMHF1A4JIXfhTEGkK3S7MTaZd0AlNuriKt+SB0tepMVTBt5Czfq12In8OGdob0BZBMWX/c3p50LZ1yx1BwudNKVRWKXhfKreDJ4ne6HTtrQVrS+J7WQDmhbnkTzzepaqZra5Peq+5N+PxNuRitXscuE3ze707NxbyP5yXa8wgJZlefOz45p2HqVQ71AqOKpry5nY9gp2OCjt529D7jrn+r2/D0AYpNetpDsQ+ZES1KkngngNOl7p+VTv6VfmUQgXM3S8WU5bQde9k8dB3YP8tdfPSPaIFoSgvE5J9KiOsqen6v86ISVNrQiRbPXrzLgUQ8gDciSmoE4QSXsRetslFosFFrGB0bAms+EDEbohLCWiIslIInhKqaZeBEVSqOrPQiVOUcIrq1HrGWP1+YQYrgvMUyEX+AG8o+vLdxHNCeEGIkSjhXrmhgudAO7Y7K5OwKck/COJe8x5mrO/vp3NlI55IJqTa4szhxl8kxsMz0X3f3Utg21uIDTewjZyA3shCZAe0KLMiyDCRsFADY578SLsvQwFD0OE0DdhVcgmZPjKk2Bi7mQJc2Sg9xGNp0gcB8l0DAQzdT5rlAoGqex88iiLYJAJZ3QHL4Tqe4TskErTAC6c1I7RfcwLPh0ab6fRJKSU4xwRIkLIvXBk90GdINIWm+US6ysTo5GBWDIhLksZDx9aEMkep2IqkqXM0RfLT5XVWomgnEjV+dLB354Xs6Qd526iOfZ47/6WH/aGcSlHnYBPE2e2sywmdECuLTBhGakU75HxL1wMMAgyi0uUBg/V/1RqYWOCjjdIMxBqY8HJZrQqviDNCBinM3jxBGQZDSEtujuhDPaSeW+aezbUQA9lCByez4Q4HSY32ijwAlmvO/W5KqPv3zdRCGdkIYx8wHq/N4QPMiW2e5JqaRJSOri3FSJE1gjTZFR7eELI5TliFOTICyLhM+KtATNVQjLMIfrLJTZxD+bBl/2xaSuC8rjcp2jOacga7wSTXTpfGWz3g8PDtNOSNPZHydrShDYcZHa+Kg1xWq44GwiVWJ+ibfri07AMA2EcQ2b+xdm+GApTVIUh2JapJYXja/ixAbdxaaId1siBOfuAcAR8CE040yyawsfEj+BOk7Qt4jW5wEL/LsXyMdqKEBFC7pMjywc5DgSRbnG723Bwi+22i24+qODBYgoaOCqCYsCygHA/ImiahFXumXsTzWlL7MGLXRWcmKjX4exbqG9nBUpMKFtHF5dyg1s68uDGl1EqVMGGN05tH4QwTgWOxQhRM3FZjqkbDMWLAYQ3UqeMgWtLlhDK76dYNlZjQ3sMsuqmBVuWm8QLUIU5hmtEmMwChIaFt2VDSdLydjylMNgeG7bh40P0Ab5R73nwT1o62C9JFOoZJsw4W85qoE6ESMUUMEsgIQ/JeYJI3R7e9GMsRUwpba1hjtA72MHw2BwTQTHgOCbcSSqSYo2xUnEFTcIq90E5OOsCojmlYxaFcRowHDhGBwMvJzq/mz0fa2cNhoP344EKhhREdMg+WMvPVGqqlwFORQwC73qFZL83UHPgItfxAnqmbmM+dTGYyZJCdsZ8eyw4Yxuun5YXZsEGRo4Jz1sgtqtz51sjG244g+vP4CnvgIn5dIzBzM+dLx9zYOCtZcANYtjjingXUedDhFgFCZQthnrEA9HxXbXUtKfoIbLGLuwoW5op3vfis1QUdCrWy65nhZBS7sy1IkSWoXoVKaO9ff8IIefDNMekiAyagZWq6mmyAXZVHmDJAdHEQ2BNL7Yt0fc9TOIxVtMKoyBN/oO5Izv7nieNIkQ6EVRoX+56EkKaoVFASpS9AeJWPyaDW1En42jdOu7jmA+BDGQ+8H6aS2B0OrIlcRDEgFFtEMTeDDM3huE+5wFTMhqGsKrUBcVYmETPvH+EPD9oFBBCCCFE0T7QkBBCCCEvGhoFhBBCCFG8QpaIaAu1g2CfZyBNULTbdthFfzjc7zCQLYfLNXRxqexMsnVSiZpy5pdIGUMIIYSQtnTWHz8mePMG+LTEtpc3CkqIKqKkM1ZWg6Q/jmGMTL1RSAwEpatUn+r4hx9+wOvXr8tHreAygVqEEEIIOY3zBJEkkZFkOMzO1f0aBmJ8zqsnn528yJCcJ4QQQgh5YI6kORaPQKQlkbuibZBmJ7rqoiuGgQzg0uB4A1lm6F+s8TFU0riL6NkSQgghpA3plkQdP3B0+WDTxTBdIthullhmAQdGH/3bWNYParMatl8+0EgSGD8aY7qqzg5HCCGEkMtyxFOQIy+I1AW6vSFGvaxcPApXMC6U5lgMgtB2kNPhIYQQQsg9035L4oEgUoZ4GSLc9nvF7ORnxxQIBq4ZV0AIIYQ8KOcJIpW2K8pWxlRFmRBCCCHPlAdNc5ynfnsityQSQgghj0H7mIILUG8IaArJi7jzgBBCCHlQHtRTcMwoIIQQQsjj0T7QkBBCCCEvGhoFhBBCCFE0CCJlZMJIBsxM60C4B0EkQgghhDweX220khH6NYmHtptPWF/ldA4UMaLlGlfmCKPRCKOhgXiZpkMmhBBCyLOkWRBpu8Gn9RXMvZ6yRiUy6qOXKiJtP8fYIpa399wpeREhhBBCHpqGmIItNp/EG5DKI+fY3t4CV1cQ50IcLbCMDfR3komEEEIIeY7UGgV62cBE2UmQIfoHm+UCm+4Qo2EPV+Xed3sYjuoFkgghhBDytKhJXrTF53gLbCMsFvsGx4uFSmlsXl1hG0UqpkCnN95CnAeEEEIIeb7UGAVd9IYj7EQQlQpiDGO3+0ACD2/RzdwD8QZr9Iv6B2p3QgxjSG8BIYQQ8hxoEERqwoA5vMVyucBafUy2K/ZUjAEhhBBCnidMc0wIIYQQxf8DcJMvwqKCoCEAAAAASUVORK5CYII="},7914:(i,e,t)=>{t.d(e,{A:()=>s});const s=t.p+"assets/images/image-2-373d27a3ed599f2d7243c4adb1f82fdb.png"},8488:(i,e,t)=>{t.d(e,{A:()=>s});const s=t.p+"assets/images/image-a657289ab9c1e4ef424fefadfbe9a073.png"},8453:(i,e,t)=>{t.d(e,{R:()=>o,x:()=>n});var s=t(6540);const a={},d=s.createContext(a);function o(i){const e=s.useContext(d);return s.useMemo((function(){return"function"==typeof i?i(e):{...e,...i}}),[e,i])}function n(i){let e;return e=i.disableParentContext?"function"==typeof i.components?i.components(a):i.components||a:o(i.components),s.createElement(d.Provider,{value:e},i.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/43fd4db6.091730e4.js b/build/assets/js/43fd4db6.091730e4.js new file mode 100644 index 0000000..5fa8139 --- /dev/null +++ b/build/assets/js/43fd4db6.091730e4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[1398],{5609:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>o});var l=n(4848),t=n(8453);const s={title:"\u5168\u540c\u6b65",sidebar_position:3},r=void 0,a={id:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u5168\u540c\u6b65/index",title:"\u5168\u540c\u6b65",description:"\u80cc\u666f",source:"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u5168\u540c\u6b65/index.md",sourceDirName:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u5168\u540c\u6b65",slug:"/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u5168\u540c\u6b65/",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u5168\u540c\u6b65/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u5168\u540c\u6b65/index.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{title:"\u5168\u540c\u6b65",sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"\u9501\u7684\u5e94\u7528",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u9501\u7684\u5e94\u7528/"},next:{title:"\u589e\u91cf\u540c\u6b65",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u589e\u91cf\u540c\u6b65/"}},c={},o=[{value:"\u80cc\u666f",id:"\u80cc\u666f",level:2},{value:"1.Pika Replicate",id:"1pika-replicate",level:3},{value:"2.Binlog",id:"2binlog",level:3},{value:"\u5168\u540c\u6b65",id:"\u5168\u540c\u6b65",level:2},{value:"1. \u7b80\u4ecb",id:"1-\u7b80\u4ecb",level:3},{value:"2. \u5b9e\u73b0\u903b\u8f91",id:"2-\u5b9e\u73b0\u903b\u8f91",level:3},{value:"3. Slave\u8fde\u63a5\u72b6\u6001",id:"3-slave\u8fde\u63a5\u72b6\u6001",level:3}];function d(e){const i={h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",ul:"ul",...(0,t.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(i.h2,{id:"\u80cc\u666f",children:"\u80cc\u666f"}),"\n",(0,l.jsx)(i.h3,{id:"1pika-replicate",children:"1.Pika Replicate"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"pika\u652f\u6301master/slave\u7684\u590d\u5236\u65b9\u5f0f\uff0c\u901a\u8fc7slave\u7aef\u7684slaveof\u547d\u4ee4\u6fc0\u53d1"}),"\n",(0,l.jsx)(i.li,{children:"salve\u7aef\u5904\u7406slaveof\u547d\u4ee4\uff0c\u5c06\u5f53\u524d\u72b6\u6001\u53d8\u4e3aslave\uff0c\u6539\u53d8\u8fde\u63a5\u72b6\u6001"}),"\n",(0,l.jsx)(i.li,{children:"slave\u7684\u5411master\u53d1\u9001MetaSync\u8bf7\u6c42\uff0c\u5728\u540c\u6b65\u4e4b\u524d\u786e\u4fdd\u81ea\u8eabdb\u7684\u62d3\u6251\u7ed3\u6784\u548cmaster\u4e00\u81f4"}),"\n",(0,l.jsx)(i.li,{children:"slave\u4e0b\u7684\u6bcf\u4e2apartition\u5355\u72ec\u7684\u5411master\u7aef\u5bf9\u5e94\u7684partition\u53d1\u8d77trysync\u8bf7\u6c42\uff0c\u5efa\u7acb\u540c\u6b65\u5173\u7cfb"}),"\n"]}),"\n",(0,l.jsx)(i.h3,{id:"2binlog",children:"2.Binlog"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"pika\u540c\u6b65\u4f9d\u8d56binlog"}),"\n",(0,l.jsx)(i.li,{children:"binlog\u6587\u4ef6\u4f1a\u81ea\u52a8\u6216\u624b\u52a8\u5220\u9664"}),"\n",(0,l.jsx)(i.li,{children:"\u5f53\u540c\u6b65\u70b9\u5bf9\u5e94\u7684binlog\u6587\u4ef6\u4e0d\u5b58\u5728\u65f6\uff0c\u9700\u8981\u901a\u8fc7\u5168\u540c\u6b65\u8fdb\u884c\u6570\u636e\u540c\u6b65"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"\u5168\u540c\u6b65",children:"\u5168\u540c\u6b65"}),"\n",(0,l.jsx)(i.h3,{id:"1-\u7b80\u4ecb",children:"1. \u7b80\u4ecb"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"\u9700\u8981\u8fdb\u884c\u5168\u540c\u6b65\u65f6\uff0cmaster\u4f1a\u5c06db\u6587\u4ef6dump\u540e\u53d1\u9001\u7ed9slave"}),"\n",(0,l.jsx)(i.li,{children:"\u901a\u8fc7rsync\u7684deamon\u6a21\u5f0f\u5b9e\u73b0db\u6587\u4ef6\u7684\u4f20\u8f93"}),"\n",(0,l.jsx)(i.li,{children:"\u9ed8\u8ba4\u4f7f\u7528pika port+1000\u4f5c\u4e3arysnc\u4f20\u8f93\u7aef\u53e3"}),"\n"]}),"\n",(0,l.jsx)(i.h3,{id:"2-\u5b9e\u73b0\u903b\u8f91",children:"2. \u5b9e\u73b0\u903b\u8f91"}),"\n",(0,l.jsxs)(i.ol,{children:["\n",(0,l.jsx)(i.li,{children:"\u5728pika\u5b9e\u4f8b\u542f\u52a8\u7684\u540c\u65f6\u4f1a\u542f\u52a8Rsync\u670d\u52a1"}),"\n",(0,l.jsx)(i.li,{children:"master\u53d1\u73b0\u67d0\u4e00\u4e2apartition\u9700\u8981\u5168\u540c\u6b65\u65f6\uff0c\u5224\u65ad\u662f\u5426\u6709\u5907\u4efd\u6587\u4ef6\u53ef\u7528\uff0c\u5982\u679c\u6ca1\u6709\u5148dump\u4e00\u4efd"}),"\n",(0,l.jsx)(i.li,{children:"master\u901a\u8fc7rsync\u5411slave\u53d1\u9001\u5bf9\u5e94partition\u7684dump\u7684\u6587\u4ef6"}),"\n",(0,l.jsx)(i.li,{children:"slave\u7684\u5bf9\u5e94partition\u7528\u6536\u5230\u7684\u6587\u4ef6\u66ff\u6362\u81ea\u5df1\u7684db"}),"\n",(0,l.jsx)(i.li,{children:"slave\u7684\u5bf9\u5e94partition\u7528\u6700\u65b0\u7684\u504f\u79fb\u91cf\u518d\u6b21\u53d1\u8d77trysnc"}),"\n",(0,l.jsx)(i.li,{children:"\u5b8c\u6210\u540c\u6b65"}),"\n"]}),"\n",(0,l.jsxs)(i.p,{children:["Slave\u4e2d\u67d0\u4e00\u4e2aPartition\u5efa\u7acb\u540c\u6b65:\n",(0,l.jsx)(i.img,{src:"https://i.imgur.com/flnOyeZ.png",alt:"slave\u7684partition"})]}),"\n",(0,l.jsxs)(i.p,{children:["Master\u5904\u7406\u540c\u6b65\u8bf7\u6c42\uff1a\n",(0,l.jsx)(i.img,{src:"https://i.imgur.com/Beclo9c.png",alt:"master\u6267\u884c\u8fc7\u7a0b"})]}),"\n",(0,l.jsx)(i.h3,{id:"3-slave\u8fde\u63a5\u72b6\u6001",children:"3. Slave\u8fde\u63a5\u72b6\u6001"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"No Connect\uff1a\u4e0d\u5c1d\u8bd5\u6210\u4e3a\u4efb\u4f55\u5176\u4ed6\u8282\u70b9\u7684slave"}),"\n",(0,l.jsx)(i.li,{children:"ShouldMetaSync\uff1a\u5411master\u8bf7\u6c42db\u7684\u62d3\u6251\u4fe1\u606f\uff0c\u786e\u4fdd\u4e0e\u81ea\u8eab\u4e00\u81f4"}),"\n",(0,l.jsx)(i.li,{children:"TryConnect\uff1a\u4e3a\u6bcf\u4e2apartition\u91cd\u7f6e\u72b6\u6001\u673a\uff0c\u8ba9\u5176\u5904\u4e8e\u51c6\u5907\u540c\u6b65\u7684\u72b6\u6001"}),"\n",(0,l.jsx)(i.li,{children:"Connecting\uff1a\u5728\u6240\u6709partition\u6ca1\u6709\u5efa\u7acb\u540c\u6b65\u5173\u7cfb\u4e4b\u524d\u4e00\u76f4\u662f\u5904\u4e8econnecting\u7684\u72b6\u6001"}),"\n",(0,l.jsx)(i.li,{children:"EstablishSucces: \u6240\u6709partition\u5efa\u7acb\u540c\u6b65\u5173\u7cfb\u6210\u529f"}),"\n",(0,l.jsx)(i.li,{children:"Error\uff1a\u51fa\u73b0\u4e86\u5f02\u5e38"}),"\n"]})]})}function h(e={}){const{wrapper:i}={...(0,t.R)(),...e.components};return i?(0,l.jsx)(i,{...e,children:(0,l.jsx)(d,{...e})}):d(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>r,x:()=>a});var l=n(6540);const t={},s=l.createContext(t);function r(e){const i=l.useContext(s);return l.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),l.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/49fb2c28.1c1b9522.js b/build/assets/js/49fb2c28.1c1b9522.js new file mode 100644 index 0000000..ab0cca9 --- /dev/null +++ b/build/assets/js/49fb2c28.1c1b9522.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[7765],{583:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>o,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var t=i(4848),s=i(8453);const r={title:"\u8ba2\u9605",sidebar_position:60},l="Pika Pub/Sub\u6587\u6863",a={id:"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u8ba2\u9605/index",title:"\u8ba2\u9605",description:"\u53ef\u7528\u7248\u672c\uff1a >= 2.3.0",source:"@site/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u8ba2\u9605/index.md",sourceDirName:"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u8ba2\u9605",slug:"/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u8ba2\u9605/",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u8ba2\u9605/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u8ba2\u9605/index.md",tags:[],version:"current",sidebarPosition:60,frontMatter:{title:"\u8ba2\u9605",sidebar_position:60},sidebar:"tutorialSidebar",previous:{title:"\u5dee\u5f02\u5316\u547d\u4ee4",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5dee\u5f02\u5316\u547d\u4ee4/"},next:{title:"\u5206\u5e03\u5f0f\u6a21\u5f0f\u7b80\u5355\u6559\u7a0b",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5206\u5e03\u5f0f\u6a21\u5f0f\u7b80\u5355\u6559\u7a0b/"}},c={},d=[{value:"Pika \u53d1\u5e03\u8ba2\u9605\u547d\u4ee4",id:"pika-\u53d1\u5e03\u8ba2\u9605\u547d\u4ee4",level:2},{value:"\u4ee5\u4e0b\u4e3aPub/Sub\u53d1\u5e03\u8ba2\u9605\u547d\u4ee4, \u4e0eRedis\u5b8c\u5168\u517c\u5bb9",id:"\u4ee5\u4e0b\u4e3apubsub\u53d1\u5e03\u8ba2\u9605\u547d\u4ee4-\u4e0eredis\u5b8c\u5168\u517c\u5bb9",level:5},{value:"\u5177\u4f53\u4f7f\u7528\u65b9\u6cd5\u53c2\u8003Redis\u7684Pub/Sub\u6587\u6863",id:"\u5177\u4f53\u4f7f\u7528\u65b9\u6cd5\u53c2\u8003redis\u7684pubsub\u6587\u6863",level:4}];function u(e){const n={a:"a",h1:"h1",h2:"h2",h4:"h4",h5:"h5",li:"li",p:"p",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"pika-pubsub\u6587\u6863",children:"Pika Pub/Sub\u6587\u6863"}),"\n",(0,t.jsx)(n.p,{children:"\u53ef\u7528\u7248\u672c\uff1a >= 2.3.0"}),"\n",(0,t.jsx)(n.p,{children:"\u6ce8\u610f:\t\u6682\u4e0d\u652f\u6301\u952e\u7a7a\u95f4\u901a\u77e5\u529f\u80fd"}),"\n",(0,t.jsx)(n.h2,{id:"pika-\u53d1\u5e03\u8ba2\u9605\u547d\u4ee4",children:"Pika \u53d1\u5e03\u8ba2\u9605\u547d\u4ee4"}),"\n",(0,t.jsx)(n.h5,{id:"\u4ee5\u4e0b\u4e3apubsub\u53d1\u5e03\u8ba2\u9605\u547d\u4ee4-\u4e0eredis\u5b8c\u5168\u517c\u5bb9",children:"\u4ee5\u4e0b\u4e3aPub/Sub\u53d1\u5e03\u8ba2\u9605\u547d\u4ee4, \u4e0eRedis\u5b8c\u5168\u517c\u5bb9"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"PUBSUB subcommand [argument [argument ...]]"}),"\n",(0,t.jsx)(n.li,{children:"PUBLISH channel message"}),"\n",(0,t.jsx)(n.li,{children:"SUBSCRIBE channel [channel ...]"}),"\n",(0,t.jsx)(n.li,{children:"PSUBSCRIBE pattern [pattern ...]"}),"\n",(0,t.jsx)(n.li,{children:"UNSUBSCRIBE [channel [channel ...]]"}),"\n",(0,t.jsx)(n.li,{children:"PUNSUBSCRIBE [pattern [pattern ...]]"}),"\n"]}),"\n",(0,t.jsxs)(n.h4,{id:"\u5177\u4f53\u4f7f\u7528\u65b9\u6cd5\u53c2\u8003redis\u7684pubsub\u6587\u6863",children:["\u5177\u4f53\u4f7f\u7528\u65b9\u6cd5\u53c2\u8003Redis\u7684",(0,t.jsx)(n.a,{href:"http://redisdoc.com/topic/pubsub.html",children:"Pub/Sub\u6587\u6863"})]})]})}function o(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>l,x:()=>a});var t=i(6540);const s={},r=t.createContext(s);function l(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/569b9636.d0a44d1b.js b/build/assets/js/569b9636.d0a44d1b.js new file mode 100644 index 0000000..b9566ee --- /dev/null +++ b/build/assets/js/569b9636.d0a44d1b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[3805],{4654:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>l,contentTitle:()=>o,default:()=>k,frontMatter:()=>n,metadata:()=>d,toc:()=>r});var a=t(4848),s=t(8453);const n={title:"Pika Blackwidow \u5f15\u64ce\u6570\u636e\u5b58\u50a8\u683c\u5f0f",slug:"pika-blackwidow",authors:[{name:"Axlgrep",title:"Pika \u5f00\u6e90\u793e\u533a"}],hide_table_of_contents:!1},o=void 0,d={permalink:"/blog/pika-blackwidow",source:"@site/blog/2020-7-16-pika-blackwidow.md",title:"Pika Blackwidow \u5f15\u64ce\u6570\u636e\u5b58\u50a8\u683c\u5f0f",description:"\bBlackwidow\u672c\u8d28\u4e0a\u662f\u57fa\u4e8erocksdb\u7684\u5c01\u88c5\uff0c\u4f7f\u672c\u8eab\u53ea\u652f\u6301kv\u5b58\u50a8\u7684rocksdb\u80fd\u591f\u652f\u6301\u591a\u79cd\u6570\u636e\u7ed3\u6784, \u76ee\u524dBlackwidow\u652f\u6301\u4e94\u79cd\u6570\u636e\u7ed3\u6784\u7684\u5b58\u50a8\uff1aString\u7ed3\u6784(\u5b9e\u9645\u4e0a\u5c31\u662f\u5b58\u50a8key, value), Hash\u7ed3\u6784\uff0cList\u7ed3\u6784\uff0cSet\u7ed3\u6784\u548cZSet\u7ed3\u6784\uff0c \u56e0\u4e3aRocksdb\u7684\u5b58\u50a8\u65b9\u5f0f\u53ea\u6709kv\u4e00\u79cd\uff0c \u6240\u4ee5\u4e0a\u8ff0\u4e94\u79cd\u6570\u636e\u7ed3\u6784\u6700\u7ec8\u90fd\u8981\u843d\u76d8\u5230Rocksdb\u7684kv\u5b58\u50a8\u65b9\u5f0f\u4e0a\uff0c\u4e0b\u9762\u6211\u4eec\u5c55\u793aBlackwidow\u548crocksdb\u7684\u5173\u7cfb\u5e76\u4e14\u8bf4\u660e\u6211\u4eec\u662f\u5982\u4f55\u7528kv\u6765\u6a21\u62df\u591a\u6570\u636e\u7ed3\u6784\u7684\u3002",date:"2020-07-16T00:00:00.000Z",tags:[],readingTime:12.29,hasTruncateMarker:!1,authors:[{name:"Axlgrep",title:"Pika \u5f00\u6e90\u793e\u533a"}],frontMatter:{title:"Pika Blackwidow \u5f15\u64ce\u6570\u636e\u5b58\u50a8\u683c\u5f0f",slug:"pika-blackwidow",authors:[{name:"Axlgrep",title:"Pika \u5f00\u6e90\u793e\u533a"}],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"What's new in Pika v3.5.0",permalink:"/blog/Pika-3.5.0"},nextItem:{title:"pika_port \u8fc1\u79fb\u5de5\u5177",permalink:"/blog/Pika-Tools-Port-Bin"}},l={authorsImageUrls:[void 0]},r=[{value:"1. String\u7ed3\u6784\u7684\u5b58\u50a8",id:"1-string\u7ed3\u6784\u7684\u5b58\u50a8",level:2},{value:"2. Hash\u7ed3\u6784\u7684\u5b58\u50a8",id:"2-hash\u7ed3\u6784\u7684\u5b58\u50a8",level:2},{value:"3. List\u7ed3\u6784\u7684\u5b58\u50a8",id:"3-list\u7ed3\u6784\u7684\u5b58\u50a8",level:2},{value:"4. Set\u7ed3\u6784\u7684\u5b58\u50a8",id:"4-set\u7ed3\u6784\u7684\u5b58\u50a8",level:2},{value:"5. ZSet\u7ed3\u6784\u7684\u5b58\u50a8",id:"5-zset\u7ed3\u6784\u7684\u5b58\u50a8",level:2},{value:"Blackwidow\u76f8\u5bf9\u4e8eNemo\u6709\u54ea\u4e9b\u4f18\u52bf",id:"blackwidow\u76f8\u5bf9\u4e8enemo\u6709\u54ea\u4e9b\u4f18\u52bf",level:2}];function c(e){const i={h2:"h2",img:"img",li:"li",ol:"ol",p:"p",...(0,s.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(i.p,{children:"\bBlackwidow\u672c\u8d28\u4e0a\u662f\u57fa\u4e8erocksdb\u7684\u5c01\u88c5\uff0c\u4f7f\u672c\u8eab\u53ea\u652f\u6301kv\u5b58\u50a8\u7684rocksdb\u80fd\u591f\u652f\u6301\u591a\u79cd\u6570\u636e\u7ed3\u6784, \u76ee\u524dBlackwidow\u652f\u6301\u4e94\u79cd\u6570\u636e\u7ed3\u6784\u7684\u5b58\u50a8\uff1aString\u7ed3\u6784(\u5b9e\u9645\u4e0a\u5c31\u662f\u5b58\u50a8key, value), Hash\u7ed3\u6784\uff0cList\u7ed3\u6784\uff0cSet\u7ed3\u6784\u548cZSet\u7ed3\u6784\uff0c \u56e0\u4e3aRocksdb\u7684\u5b58\u50a8\u65b9\u5f0f\u53ea\u6709kv\u4e00\u79cd\uff0c \u6240\u4ee5\u4e0a\u8ff0\u4e94\u79cd\u6570\u636e\u7ed3\u6784\u6700\u7ec8\u90fd\u8981\u843d\u76d8\u5230Rocksdb\u7684kv\u5b58\u50a8\u65b9\u5f0f\u4e0a\uff0c\u4e0b\u9762\u6211\u4eec\u5c55\u793aBlackwidow\u548crocksdb\u7684\u5173\u7cfb\u5e76\u4e14\u8bf4\u660e\u6211\u4eec\u662f\u5982\u4f55\u7528kv\u6765\u6a21\u62df\u591a\u6570\u636e\u7ed3\u6784\u7684\u3002"}),"\n",(0,a.jsx)(i.p,{children:(0,a.jsx)(i.img,{alt:"pika-blackwidow-1",src:t(8120).A+"",width:"877",height:"1053"})}),"\n",(0,a.jsx)(i.h2,{id:"1-string\u7ed3\u6784\u7684\u5b58\u50a8",children:"1. String\u7ed3\u6784\u7684\u5b58\u50a8"}),"\n",(0,a.jsx)(i.p,{children:"String\u672c\u8d28\u4e0a\u5c31\u662fKey, Value, \u6211\u4eec\u77e5\u9053Rocksdb\u672c\u8eab\u5c31\u662f\u652f\u6301kv\u5b58\u50a8\u7684\uff0c \u6211\u4eec\u4e3a\u4e86\u5b9e\u73b0Redis\u4e2d\u7684expire\u529f\u80fd\uff0c\u6240\u4ee5\u5728value\u540e\u9762\u6dfb\u52a0\u4e864 Bytes\u7528\u4e8e\u5b58\u50a8timestamp, \u4f5c\u4e3a\u6700\u540eRocksdb\u843d\u76d8\u7684kv\u683c\u5f0f\uff0c\u4e0b\u9762\u662f\u5177\u4f53\u7684\u5b9e\u73b0\u65b9\u5f0f:"}),"\n",(0,a.jsx)(i.p,{children:(0,a.jsx)(i.img,{alt:"pika-blackwidow-2",src:t(4979).A+"",width:"750",height:"100"})}),"\n",(0,a.jsx)(i.p,{children:"\u5982\u679c\u6211\u4eec\u6ca1\u6709\u5bf9\u8be5String\u5bf9\u8c61\u8bbe\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u5219timestamp\u5b58\u50a8\u7684\u503c\u5c31\u662f\u9ed8\u8ba4\u503c0\uff0c \u5426\u5219\u5c31\u662f\u8be5\u5bf9\u8c61\u8fc7\u671f\u65f6\u95f4\u7684\u65f6\u95f4\u6233\uff0c \u6bcf\u6b21\u6211\u4eec\u83b7\u53d6\u4e00\u4e2aString\u5bf9\u8c61\u7684\u65f6\u5019\uff0c \u9996\u5148\u4f1a\u89e3\u6790Value\u90e8\u5206\u7684\u540e\u56db\u5b57\u8282\uff0c \u83b7\u53d6\u5230timestamp\u505a\u51fa\u5224\u65ad\u4e4b\u540e\u518d\u8fd4\u56de\u7ed3\u679c\u3002"}),"\n",(0,a.jsx)(i.h2,{id:"2-hash\u7ed3\u6784\u7684\u5b58\u50a8",children:"2. Hash\u7ed3\u6784\u7684\u5b58\u50a8"}),"\n",(0,a.jsx)(i.p,{children:"blackwidow\u4e2d\u7684hash\u8868\u7531\u4e24\u90e8\u5206\u6784\u6210\uff0c\u5143\u6570\u636e(meta_key, meta_value), \u548c\u666e\u901a\u6570\u636e(data_key, data_value), \u5143\u6570\u636e\u4e2d\u5b58\u50a8\u7684\u4e3b\u8981\u662fhash\u8868\u7684\u4e00\u4e9b\u4fe1\u606f\uff0c \u6bd4\u5982\u8bf4\u5f53\u524dhash\u8868\u7684\u57df\u7684\u6570\u91cf\u4ee5\u53ca\u5f53\u524dhash\u8868\u7684\u7248\u672c\u53f7\u548c\u8fc7\u671f\u65f6\u95f4(\u7528\u505a\u79d2\u5220\u529f\u80fd), \u800c\u666e\u901a\u6570\u636e\u4e3b\u8981\u5c31\u662f\u6307\u7684\u540c\u4e00\u4e2ahash\u8868\u4e2d\u4e00\u4e00\u5bf9\u5e94\u7684field\u548cvalue\uff0c\u4f5c\u4e3a\u5177\u4f53\u6700\u540eRocksdb\u843d\u76d8\u7684kv\u683c\u5f0f\uff0c\u4e0b\u9762\u662f\u5177\u4f53\u7684\u5b9e\u73b0\u65b9\u5f0f:"}),"\n",(0,a.jsxs)(i.ol,{children:["\n",(0,a.jsxs)(i.li,{children:["\u6bcf\u4e2ahash\u8868\u7684meta_key\u548cmeta_value\u7684\u843d\u76d8\u65b9\u5f0f:\n",(0,a.jsx)(i.img,{alt:"pika-blackwidow-3",src:t(3402).A+"",width:"750",height:"99"})]}),"\n"]}),"\n",(0,a.jsx)(i.p,{children:"meta_key\u5b9e\u9645\u4e0a\u5c31\u662fhash\u8868\u7684key, \u800cmeta_value\u7531\u4e09\u4e2a\u90e8\u5206\u6784\u6210: 4Bytes\u7684Hash size(\u7528\u4e8e\u5b58\u50a8\u5f53\u524dhash\u8868\u7684\u5927\u5c0f) + 4Bytes\u7684Version(\u7528\u4e8e\u79d2\u5220\u529f\u80fd) + 4Bytes\u7684Timestamp(\u7528\u4e8e\u8bb0\u5f55\u6211\u4eec\u7ed9\u8fd9\u4e2aHash\u8868\u8bbe\u7f6e\u7684\u8d85\u65f6\u65f6\u95f4\u7684\u65f6\u95f4\u6233\uff0c \u9ed8\u8ba4\u4e3a0)"}),"\n",(0,a.jsxs)(i.ol,{start:"2",children:["\n",(0,a.jsxs)(i.li,{children:["hash\u8868\u4e2ddata_key\u548cdata_value\u7684\u843d\u76d8\u65b9\u5f0f:\n",(0,a.jsx)(i.img,{alt:"pika-blackwidow-4",src:t(7701).A+"",width:"749",height:"100"})]}),"\n"]}),"\n",(0,a.jsx)(i.p,{children:"data_key\u7531\u56db\u4e2a\u90e8\u5206\u6784\u6210: 4Bytes\u7684Key size(\u7528\u4e8e\u8bb0\u5f55\u540e\u9762\u8ffd\u52a0\u7684key\u7684\u957f\u5ea6\uff0c\u4fbf\u4e0e\u89e3\u6790) + key\u7684\u5185\u5bb9 + 4Bytes\u7684Version + Field\u7684\u5185\u5bb9\uff0c \u800cdata_value\u5c31\u662fhash\u8868\u67d0\u4e2afield\u5bf9\u5e94\u7684value\u3002"}),"\n",(0,a.jsxs)(i.ol,{start:"3",children:["\n",(0,a.jsx)(i.li,{children:"\u5982\u679c\u6211\u4eec\u9700\u8981\u67e5\u627e\u4e00\u4e2ahash\u8868\u4e2d\u7684\u67d0\u4e00\u4e2afield\u5bf9\u5e94\u7684value, \u6211\u4eec\u9996\u5148\u4f1a\u83b7\u53d6\u5230meta_value\u89e3\u6790\u51fa\u5176\u4e2d\u7684timestamp\u5224\u65ad\u8fd9\u4e2ahash\u8868\u662f\u5426\u8fc7\u671f\uff0c \u5982\u679c\u6ca1\u6709\u8fc7\u671f\uff0c \u6211\u4eec\u53ef\u4ee5\u62ff\u5230\u5176\u4e2d\u7684version, \u7136\u540e\u6211\u4eec\u4f7f\u7528key, version\uff0c\u548cfield\u62fc\u51fadata_key, \u8fdb\u800c\u627e\u5230\u5bf9\u5e94\u7684data_value\uff08\u5982\u679c\u5b58\u5728\u7684\u8bdd)"}),"\n"]}),"\n",(0,a.jsx)(i.h2,{id:"3-list\u7ed3\u6784\u7684\u5b58\u50a8",children:"3. List\u7ed3\u6784\u7684\u5b58\u50a8"}),"\n",(0,a.jsx)(i.p,{children:"blackwidow\u4e2d\u7684list\u7531\u4e24\u90e8\u5206\u6784\u6210\uff0c\u5143\u6570\u636e(meta_key, meta_value), \u548c\u666e\u901a\u6570\u636e(data_key, data_value), \u5143\u6570\u636e\u4e2d\u5b58\u50a8\u7684\u4e3b\u8981\u662flist\u94fe\u8868\u7684\u4e00\u4e9b\u4fe1\u606f\uff0c \u6bd4\u5982\u8bf4\u5f53\u524dlist\u94fe\u8868\u7ed3\u70b9\u7684\u7684\u6570\u91cf\u4ee5\u53ca\u5f53\u524dlist\u94fe\u8868\u7684\u7248\u672c\u53f7\u548c\u8fc7\u671f\u65f6\u95f4(\u7528\u505a\u79d2\u5220\u529f\u80fd), \u8fd8\u6709\u5f53\u524dlist\u94fe\u8868\u7684\u5de6\u53f3\u8fb9\u754c(\u7531\u4e8enemo\u5b9e\u73b0\u7684\u94fe\u8868\u7ed3\u6784\u88ab\u5410\u69fdlrange\u6548\u7387\u4f4e\u4e0b\uff0c\u6240\u4ee5\u8fd9\u6b21blackwidow\u6211\u4eec\u5e95\u5c42\u7528\u6570\u7ec4\u6765\u6a21\u62df\u94fe\u8868\uff0c\u8fd9\u6837lrange\u901f\u5ea6\u4f1a\u5927\u5927\u63d0\u5347\uff0c\u56e0\u4e3a\u7ed3\u70b9\u5b58\u50a8\u90fd\u662f\u6709\u5e8f\u7684), \u666e\u901a\u6570\u636e\u5b9e\u9645\u4e0a\u5c31\u662f\u6307\u7684list\u4e2d\u6bcf\u4e00\u4e2a\u7ed3\u70b9\u4e2d\u7684\u6570\u636e\uff0c\u4f5c\u4e3a\u5177\u4f53\u6700\u540eRocksdb\u843d\u76d8\u7684kv\u683c\u5f0f\uff0c\u4e0b\u9762\u662f\u5177\u4f53\u7684\u5b9e\u73b0\u65b9\u5f0f"}),"\n",(0,a.jsxs)(i.ol,{children:["\n",(0,a.jsxs)(i.li,{children:["\u6bcf\u4e2alist\u94fe\u8868\u7684meta_key\u548cmeta_value\u7684\u843d\u76d8\u65b9\u5f0f:\n",(0,a.jsx)(i.img,{alt:"pika-blackwidow-5",src:t(4812).A+"",width:"749",height:"99"})]}),"\n"]}),"\n",(0,a.jsx)(i.p,{children:"meta_key\u5b9e\u9645\u4e0a\u5c31\u662flist\u94fe\u8868\u7684key, \u800cmeta_value\u7531\u4e94\u4e2a\u90e8\u5206\u6784\u6210: 8Bytes\u7684List size(\u7528\u4e8e\u5b58\u50a8\u5f53\u524d\u94fe\u8868\u4e2d\u603b\u5171\u6709\u591a\u5c11\u4e2a\u7ed3\u70b9) + 4Bytes\u7684Version(\u7528\u4e8e\u79d2\u5220\u529f\u80fd) + 4Bytes\u7684Timestamp(\u7528\u4e8e\u8bb0\u5f55\u6211\u4eec\u7ed9\u8fd9\u4e2aList\u94fe\u8868\u8bbe\u7f6e\u7684\u8d85\u65f6\u65f6\u95f4\u7684\u65f6\u95f4\u6233\uff0c \u9ed8\u8ba4\u4e3a0) + 8Bytes\u7684Left Index\uff08\u6570\u7ec4\u7684\u5de6\u8fb9\u754c) + 8Bytes\u7684Right Index(\u6570\u7ec4\u7684\u53f3\u8fb9\u754c)"}),"\n",(0,a.jsxs)(i.ol,{start:"2",children:["\n",(0,a.jsxs)(i.li,{children:["list\u94fe\u8868\u4e2ddata_key\u548cdata_value\u7684\u843d\u76d8\u65b9\u5f0f:\n",(0,a.jsx)(i.img,{alt:"pika-blackwidow-6",src:t(3287).A+"",width:"750",height:"99"})]}),"\n"]}),"\n",(0,a.jsx)(i.p,{children:"data_key\u7531\u56db\u4e2a\u90e8\u5206\u6784\u6210: 4Bytes\u7684Key size(\u7528\u4e8e\u8bb0\u5f55\u540e\u9762\u8ffd\u52a0\u7684key\u7684\u957f\u5ea6\uff0c\u4fbf\u4e0e\u89e3\u6790) + key\u7684\u5185\u5bb9 + 4Bytes\u7684Version + 8Bytes\u7684Index(\u8fd9\u4e2a\u8bb0\u5f55\u7684\u5c31\u662f\u5f53\u524d\u7ed3\u70b9\u7684\u5728\u8fd9\u4e2alist\u94fe\u8868\u4e2d\u7684\u7d22\u5f15)\uff0c \u800cdata_value\u5c31\u662flist\u94fe\u8868\u8be5node\u4e2d\u5b58\u50a8\u7684\u503c"}),"\n",(0,a.jsx)(i.h2,{id:"4-set\u7ed3\u6784\u7684\u5b58\u50a8",children:"4. Set\u7ed3\u6784\u7684\u5b58\u50a8"}),"\n",(0,a.jsx)(i.p,{children:"blackwidow\u4e2d\u7684set\u7531\u4e24\u90e8\u5206\u6784\u6210\uff0c\u5143\u6570\u636e(meta_key, meta_value), \u548c\u666e\u901a\u6570\u636e(data_key, data_value), \u5143\u6570\u636e\u4e2d\u5b58\u50a8\u7684\u4e3b\u8981\u662fset\u96c6\u5408\u7684\u4e00\u4e9b\u4fe1\u606f\uff0c \u6bd4\u5982\u8bf4\u5f53\u524dset\u96c6\u5408member\u7684\u6570\u91cf\u4ee5\u53ca\u5f53\u524dset\u96c6\u5408\u7684\u7248\u672c\u53f7\u548c\u8fc7\u671f\u65f6\u95f4(\u7528\u505a\u79d2\u5220\u529f\u80fd), \u666e\u901a\u6570\u636e\u5b9e\u9645\u4e0a\u5c31\u662f\u6307\u7684set\u96c6\u5408\u4e2d\u7684member\uff0c\u4f5c\u4e3a\u5177\u4f53\u6700\u540eRocksdb\u843d\u76d8\u7684kv\u683c\u5f0f\uff0c\u4e0b\u9762\u662f\u5177\u4f53\u7684\u5b9e\u73b0\u65b9\u5f0f\uff1a"}),"\n",(0,a.jsxs)(i.ol,{children:["\n",(0,a.jsxs)(i.li,{children:["\u6bcf\u4e2aset\u96c6\u5408\u7684meta_key\u548cmeta_value\u7684\u843d\u76d8\u65b9\u5f0f:\n",(0,a.jsx)(i.img,{alt:"pika-blackwidow-7",src:t(1950).A+"",width:"750",height:"100"})]}),"\n"]}),"\n",(0,a.jsx)(i.p,{children:"meta_key\u5b9e\u9645\u4e0a\u5c31\u662fset\u96c6\u5408\u7684key, \u800cmeta_value\u7531\u4e09\u4e2a\u90e8\u5206\u6784\u6210: 4Bytes\u7684Set size(\u7528\u4e8e\u5b58\u50a8\u5f53\u524dSet\u96c6\u5408\u7684\u5927\u5c0f) + 4Bytes\u7684Version(\u7528\u4e8e\u79d2\u5220\u529f\u80fd) + 4Bytes\u7684Timestamp(\u7528\u4e8e\u8bb0\u5f55\u6211\u4eec\u7ed9\u8fd9\u4e2aset\u96c6\u5408\u8bbe\u7f6e\u7684\u8d85\u65f6\u65f6\u95f4\u7684\u65f6\u95f4\u6233\uff0c \u9ed8\u8ba4\u4e3a0)"}),"\n",(0,a.jsxs)(i.ol,{start:"2",children:["\n",(0,a.jsxs)(i.li,{children:["set\u96c6\u5408\u4e2ddata_key\u548cdata_value\u7684\u843d\u76d8\u65b9\u5f0f:\n",(0,a.jsx)(i.img,{alt:"pika-blackwidow-8",src:t(841).A+"",width:"749",height:"100"})]}),"\n"]}),"\n",(0,a.jsx)(i.p,{children:"data_key\u7531\u56db\u4e2a\u90e8\u5206\u6784\u6210: 4Bytes\u7684Key size(\u7528\u4e8e\u8bb0\u5f55\u540e\u9762\u8ffd\u52a0\u7684key\u7684\u957f\u5ea6\uff0c\u4fbf\u4e0e\u89e3\u6790) + key\u7684\u5185\u5bb9 + 4Bytes\u7684Version + member\u7684\u5185\u5bb9\uff0c \u7531\u4e8eset\u96c6\u5408\u53ea\u9700\u8981\u5b58\u50a8member, \u6240\u4ee5data_value\u5b9e\u9645\u4e0a\u5c31\u662f\u7a7a\u4e32"}),"\n",(0,a.jsx)(i.h2,{id:"5-zset\u7ed3\u6784\u7684\u5b58\u50a8",children:"5. ZSet\u7ed3\u6784\u7684\u5b58\u50a8"}),"\n",(0,a.jsx)(i.p,{children:"blackwidow\u4e2d\u7684zset\u7531\u4e24\u90e8\u90e8\u5206\u6784\u6210\uff0c\u5143\u6570\u636e(meta_key, meta_value), \u548c\u666e\u901a\u6570\u636e(data_key, data_value), \u5143\u6570\u636e\u4e2d\u5b58\u50a8\u7684\u4e3b\u8981\u662fzset\u96c6\u5408\u7684\u4e00\u4e9b\u4fe1\u606f\uff0c \u6bd4\u5982\u8bf4\u5f53\u524dzset\u96c6\u5408member\u7684\u6570\u91cf\u4ee5\u53ca\u5f53\u524dzset\u96c6\u5408\u7684\u7248\u672c\u53f7\u548c\u8fc7\u671f\u65f6\u95f4(\u7528\u505a\u79d2\u5220\u529f\u80fd), \u800c\u666e\u901a\u6570\u636e\u5c31\u662f\u6307\u7684zset\u4e2d\u6bcf\u4e2amember\u4ee5\u53ca\u5bf9\u5e94\u7684score, \u7531\u4e8ezset\u8fd9\u79cd\u6570\u636e\u7ed3\u6784\u6bd4\u8f83\u7279\u6b8a\uff0c\u9700\u8981\u6309\u7167memer\u8fdb\u884c\u6392\u5e8f\uff0c\u4e5f\u9700\u8981\u6309\u7167score\u8fdb\u884c\u6392\u5e8f\uff0c \u6240\u4ee5\u6211\u4eec\u5bf9\u4e8e\u6bcf\u4e00\u4e2azset\u6211\u4eec\u4f1a\u6309\u7167\u4e0d\u540c\u7684\u683c\u5f0f\u5b58\u50a8\u4e24\u4efd\u666e\u901a\u6570\u636e, \u5728\u8fd9\u91cc\u6211\u4eec\u79f0\u4e3amember to score\u548cscore to member\uff0c\u4f5c\u4e3a\u5177\u4f53\u6700\u540eRocksdb\u843d\u76d8\u7684kv\u683c\u5f0f\uff0c\u4e0b\u9762\u662f\u5177\u4f53\u7684\u5b9e\u73b0\u65b9\u5f0f\uff1a"}),"\n",(0,a.jsxs)(i.ol,{children:["\n",(0,a.jsxs)(i.li,{children:["\u6bcf\u4e2azset\u96c6\u5408\u7684meta_key\u548cmeta_value\u7684\u843d\u76d8\u65b9\u5f0f:\n",(0,a.jsx)(i.img,{src:"https://i.imgur.com/RhZ8KMw.png",alt:""})]}),"\n"]}),"\n",(0,a.jsx)(i.p,{children:"meta_key\u5b9e\u9645\u4e0a\u5c31\u662fzset\u96c6\u5408\u7684key, \u800cmeta_value\u7531\u4e09\u4e2a\u90e8\u5206\u6784\u6210: 4Bytes\u7684ZSet size(\u7528\u4e8e\u5b58\u50a8\u5f53\u524dzSet\u96c6\u5408\u7684\u5927\u5c0f) + 4Bytes\u7684Version(\u7528\u4e8e\u79d2\u5220\u529f\u80fd) + 4Bytes\u7684Timestamp(\u7528\u4e8e\u8bb0\u5f55\u6211\u4eec\u7ed9\u8fd9\u4e2aZset\u96c6\u5408\u8bbe\u7f6e\u7684\u8d85\u65f6\u65f6\u95f4\u7684\u65f6\u95f4\u6233\uff0c \u9ed8\u8ba4\u4e3a0)"}),"\n",(0,a.jsxs)(i.ol,{start:"2",children:["\n",(0,a.jsxs)(i.li,{children:["\u6bcf\u4e2azset\u96c6\u5408\u7684data_key\u548cdata_value\u7684\u843d\u76d8\u65b9\u5f0f(member to score):\n",(0,a.jsx)(i.img,{src:"https://i.imgur.com/C85Ba5Z.png",alt:""})]}),"\n"]}),"\n",(0,a.jsx)(i.p,{children:"member to socre\u7684data_key\u7531\u56db\u4e2a\u90e8\u5206\u6784\u6210\uff1a4Bytes\u7684Key size(\u7528\u4e8e\u8bb0\u5f55\u540e\u9762\u8ffd\u52a0\u7684key\u7684\u957f\u5ea6\uff0c\u4fbf\u4e0e\u89e3\u6790) + key\u7684\u5185\u5bb9 + 4Bytes\u7684Version + member\u7684\u5185\u5bb9\uff0c data_value\u4e2d\u5b58\u50a8\u7684\u5176member\u5bf9\u5e94\u7684score\u7684\u503c\uff0c\u5927\u5c0f\u4e3a8\u4e2a\u5b57\u8282\uff0c\u7531\u4e8erocksdb\u9ed8\u8ba4\u662f\u6309\u7167\u5b57\u5178\u5e8f\u8fdb\u884c\u6392\u5217\u7684\uff0c\u6240\u4ee5\u540c\u4e00\u4e2azset\u4e2d\u4e0d\u540c\u7684member\u5c31\u662f\u6309\u7167member\u7684\u5b57\u5178\u5e8f\u6765\u6392\u5217\u7684(\u540c\u4e00\u4e2azset\u7684key size, key, \u4ee5\u53caversion\uff0c\u4e5f\u5c31\u662f\u524d\u7f00\u90fd\u662f\u4e00\u81f4\u7684\uff0c\u4e0d\u540c\u7684\u53ea\u6709\u672b\u7aef\u7684member)."}),"\n",(0,a.jsxs)(i.ol,{start:"3",children:["\n",(0,a.jsxs)(i.li,{children:["\u6bcf\u4e2azset\u96c6\u5408\u7684data_key\u548cdata_value\u7684\u843d\u76d8\u65b9\u5f0f(score to member):\n",(0,a.jsx)(i.img,{src:"https://i.imgur.com/QV9XHEk.png",alt:""})]}),"\n"]}),"\n",(0,a.jsx)(i.p,{children:"score to member\u7684data_key\u7531\u4e94\u4e2a\u90e8\u5206\u6784\u6210\uff1a4Bytes\u7684Key size(\u7528\u4e8e\u8bb0\u5f55\u540e\u9762\u8ffd\u52a0\u7684key\u7684\u957f\u5ea6\uff0c\u4fbf\u4e0e\u89e3\u6790) + key\u7684\u5185\u5bb9 + 4Bytes\u7684Version + 8Bytes\u7684Score + member\u7684\u5185\u5bb9\uff0c \u7531\u4e8escore\u548cmember\u90fd\u5df2\u7ecf\u653e\u5728data_key\u4e2d\u8fdb\u884c\u5b58\u50a8\u4e86\u6240\u4ee5data_value\u5c31\u662f\u4e00\u4e2a\u7a7a\u4e32\uff0c\u65e0\u9700\u5b58\u50a8\u5176\u4ed6\u5185\u5bb9\u4e86\uff0c\u5bf9\u4e8escore to member\u4e2d\u7684data_key\u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u4e86rocksdb\u7684comparator\uff0c\u540c\u4e00\u4e2azset\u4e2dscore to member\u7684data_key\u4f1a\u9996\u5148\u6309\u7167score\u6765\u6392\u5e8f\uff0c \u5728score\u76f8\u540c\u7684\u60c5\u51b5\u4e0b\u518d\u6309\u7167member\u6765\u6392\u5e8f"}),"\n",(0,a.jsx)(i.h2,{id:"blackwidow\u76f8\u5bf9\u4e8enemo\u6709\u54ea\u4e9b\u4f18\u52bf",children:"Blackwidow\u76f8\u5bf9\u4e8eNemo\u6709\u54ea\u4e9b\u4f18\u52bf"}),"\n",(0,a.jsxs)(i.ol,{children:["\n",(0,a.jsx)(i.li,{children:"Blackwidow\u91c7\u7528\u4e86rocksdb\u7684column families\u7684\u65b0\u7279\u6027\uff0c\u5c06\u5143\u6570\u636e\u548c\u5b9e\u9645\u6570\u636e\u5206\u5f00\u5b58\u653e(\u5bf9\u5e94\u4e8e\u4e0a\u9762\u7684meta\u6570\u636e\u548cdata\u6570\u636e), \u8fd9\u79cd\u5b58\u50a8\u65b9\u5f0f\u76f8\u5bf9\u4e8eNemo\u5c06meta, data\u6df7\u5728\u4e00\u8d77\u5b58\u653e\u66f4\u52a0\u5408\u7406\uff0c \u5e76\u4e14\u53ef\u4ee5\u63d0\u5347\u67e5\u627e\u6548\u7387(\u6bd4\u5982info keyspace\u7684\u6548\u7387\u4f1a\u5927\u5927\u63d0\u5347)"}),"\n",(0,a.jsx)(i.li,{children:"Blackwidow\u4e2d\u53c2\u6570\u4f20\u9012\u5927\u91cf\u91c7\u7528Slice\u800cNemo\u4e2d\u91c7\u7528\u7684\u662fstd::string, \u6240\u4ee5Nemo\u4f1a\u6709\u5f88\u591a\u6ca1\u6709\u5fc5\u8981\u7684string\u5bf9\u8c61\u7684\u6784\u9020\u51fd\u6570\u4ee5\u53ca\u6790\u6784\u51fd\u6570\u7684\u8c03\u7528\uff0c\u9020\u6210\u989d\u5916\u7684\u8d44\u6e90\u6d88\u8017\uff0c\u800cBlackwidow\u5219\u4e0d\u4f1a\u6709\u8fd9\u4e2a\u95ee\u9898"}),"\n",(0,a.jsx)(i.li,{children:"Blackwidow\u5bf9kv\u6a21\u62df\u591a\u6570\u636e\u7ed3\u6784\u7684\u5b58\u50a8\u683c\u5f0f\u4e0a\u505a\u4e86\u91cd\u65b0\u8bbe\u8ba1(\u5177\u4f53\u53ef\u4ee5\u53c2\u8003Nemo\u5f15\u64ce\u6570\u636e\u5b58\u50a8\u683c\u5f0f\u548c\u672c\u7bc7\u6587\u7ae0)\uff0c\u4f7f\u4e4b\u524d\u5728Nemo\u4e0a\u51fa\u73b0\u7684\u4e00\u4e9b\u65e0\u6cd5\u89e3\u51b3\u7684\u6027\u80fd\u95ee\u9898\u5f97\u4ee5\u89e3\u51b3\uff0c\u6240\u4ee5Blackwidow\u7684\u591a\u6570\u636e\u7ed3\u6784\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u6027\u80fd\u8fdc\u8fdc\u4f18\u4e8eNemo"}),"\n",(0,a.jsx)(i.li,{children:"\u539f\u6765Nemo\u5bf9\u591a\u6570\u636e\u7ed3\u6784\u7684Key\u7684\u957f\u5ea6\u6700\u5927\u53ea\u80fd\u652f\u6301\u5230256 Bytes\uff0c\u800cBlackwidow\u7ecf\u8fc7\u91cd\u65b0\u8bbe\u8ba1\uff0c\u653e\u5f00\u4e86\u591a\u6570\u636e\u7ed3\u6784Key\u957f\u5ea6\u7684\u8fd9\u4e2a\u9650\u5236"}),"\n",(0,a.jsx)(i.li,{children:"Blackwidow\u76f8\u5bf9\u4e8eNemo\u66f4\u52a0\u8282\u7701\u7a7a\u95f4\uff0cNemo\u7531\u4e8e\u9700\u8981nemo-rocksdb\u7684\u652f\u6301\uff0c\u6240\u4ee5\u4e0d\u7ba1\u5728meta\u8fd8\u662fdata\u6570\u636e\u90e8\u5206\u90fd\u8ffd\u52a0\u4e86version\u548ctimestamp\u8fd9\u4e9b\u4fe1\u606f\uff0c\u5e76\u4e14\u4e3a\u4e86\u533a\u5206meta_key\u548cdata_key, \u5728\u6700\u524d\u9762\u52a0\u5165s\u548cS(\u62ffSet\u6570\u636e\u7ed3\u6784\u6253\u6bd4\u65b9)\uff0cBlackwidow\u5728\u8fd9\u65b9\u9762\u505a\u4e86\u4f18\u5316\uff0c\u4f7f\u540c\u6837\u7684\u6570\u636e\u91cf\u4e0bBlackwidow\u6240\u5360\u7528\u7684\u7a7a\u95f4\u6bd4Nemo\u8981\u5c0f(\u4e3e\u4e2a\u4f8b\u5b50\uff0cBlackwidow\u4e2dList\u7ed3\u6784\u4e2d\u7684\u4e00\u4e2aNode\u5c31\u6bd4Nemo\u4e2d\u7684\u4e00\u4e2aNode\u8282\u7701\u4e8616 Bytes\u7684\u7a7a\u95f4)"}),"\n",(0,a.jsx)(i.li,{children:"Blackwidow\u5728\u9501\u7684\u5b9e\u73b0\u4e0a\u53c2\u7167\u4e86RocksDB\u4e8b\u52a1\u91cc\u9501\u7684\u5b9e\u73b0\u65b9\u6cd5\uff0c\u800c\u5f03\u7528\u4e86\u4e4b\u524dNemo\u7684\u884c\u9501\uff0c\u6240\u4ee5\u5728\u591a\u7ebf\u7a0b\u5bf9\u540c\u4e00\u628a\u9501\u6709\u62a2\u5360\u7684\u60c5\u51b5\u4e0b\u6027\u80fd\u4f1a\u6709\u6240\u63d0\u5347"}),"\n"]})]})}function k(e={}){const{wrapper:i}={...(0,s.R)(),...e.components};return i?(0,a.jsx)(i,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},8120:(e,i,t)=>{t.d(i,{A:()=>a});const a=t.p+"assets/images/pika-blackwidow-1-d2f194c46b2f89969b695ca99b666f66.png"},4979:(e,i,t)=>{t.d(i,{A:()=>a});const a="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAu4AAABkCAYAAADZqbVdAAAABHNCSVQICAgIfAhkiAAAGshJREFUeF7t3Ql0VPW9B/DvnTWTjYRsLEkgBEjCEtFEgpCHKLIIxKeiEuv6lNae1z71vfZg1eerrc/aY6Wni9aKtvq0Yp96tC2KiCLy3LBoNYDsa1gSsu+zz7zz+9+5Q1jFEDKZzPdzTk7u3Jm5c+fm5n9/93d/9//XgsFgEERERERE1C9JuK5pGkz9cu2IiIiIiOgYDNyJiIiIiKIAA3ciIiIioijAwJ2IiIiIKAowcCciIiIiigIM3ImIiIiIogADdyIiIiKiKMDAnYiIiIgoCjBwJyIiIiKKAgzciYiIiIiiAAN3IiIiIqIowMCdiIiIiCgKMHAnIiIiIooCDNyJiIiIiKIAA3ciIiIioihgieQ6BoPBSH78gKdp2oD/juca91GKBUZbwf3967FdJaJIiljgLgcINoDnFrfx2eH2o1hhBOxsk78e2wUiiqSIBe5ygPD7fQgE/JH8/gOW1WpX21guajDx/s11Pzh7vF7w2hANVGaTCRazWX09v0/a5MBA/apnzWQ2wxzaVkREkRCxwH337t144YU/Y+XKr1BT60EwoIdGDJB6RopiZNs54szIz3fgttvmY/78eUhMTGSG6Bsygna32423V63CGy+8gOaqKgScTn1JPBuiaCWNRKiCTjOZYM3KwoT581F5883QgkE8/6fleHPtRzjS2olQkxxqWWKx7O7oxjJpwJCURMybcRFuuvEG5OfnR+seQERRTgv2YVGjERAdOFCNa69djNGj38E1Cy9FQmLo2EBnTQ41Bw/4cPvi/8Mvf/kr3Hnn91WGiJd3z4yxnSTr+NLy5bjxpptQ/sQTsOXnq0CHQTtFPePeIrnq2dGBXStWIPfjj1BrS8DF44ajYtZ0JCY4wi8j/aplZ5cLr76xGrvrPXj5xeeRk5vLdpWI+owRn0Qk4/7OO+8jNfUdPPLIYuTk2PvsS8cODcOGpeDyec/hiivmIz9/dOx89bNk/GMcqavD4z/4ASpefhk5CxfqQfvRZCVR1DOubuaXlGDdD5dgqrMRDy75HnJHDgc0UzgzT6HEUjCICyZNwHf+/T/xzpr3cNu/3MpNQ0R9LiKB++HDzSgp0ZCTEwcE3VAllbF4JfYckJIjs8WCESMSMWKEC/v27Wfg3gNerxfr6+pwc0kJgiYTvH4/bxaggUfT4MjNRfW48fh20y7k5gxF0OVWJ7B0lGwNk6ap7VMysQg1R+q4eYgoIiISuPv9Adis+veV44NJ3RfFyL03HD3cmuBwtMPlcvfGYmOWZg3tqJoWzroTDRjSuxcAj9UKq0UDzCbAC5ikLIyOoU5mTCbYbRb4fLyBl4giIyKBuwgHmMZdldqZZHjCL47M1oomWhCBgMbu3c7SmeyVRFFPglLZ2bnDfy0VwPMQREQRwrTKgMUjS2/gVqTYENrTucOfGZ7gEFGEMHAnIop1DNiJiKICA3ciIiIioigQsRr3/sboRUEN+a3KPfWbtjjsKNFZ6NZn+DFONYjVqebTudWD0o+T9TyjQVNtp1BtKRER9SoG7kJ6VjAOMqFA45jHPAAR9Yjxf3R8XCjzj58nTjWfzrEexNiaJXT4ME62ZBk+PzTVB7yGoF+me7DgUzgmuUJEFKMYuAtN07v3CgIWq1495HbrBx2bTR6HelwIvVY5PjMoUUjvHaOIBoSAz4dgIACTzXbM9/G7XNBsthO62PR7vWqeZlZ9xFI/JUF0e0ubavNsFgs8Pp8abTgpIQH+gB+BQBBxcXb1t++t4F2dKAQDCPp7b5lERNEmtmvcVXZdj7jffacRq96WQTUsqK524r779qjfcmQKduuyV2V9gqGLwaHsvJ4JOln+kChGSbAOoK2qCnt+/GMEfT61IWRe565d2Pfoowh0dennumoENsnW+nDwj39Ex/bt6nUS9IWF/teUU01Tz51h86V3hSiJDj9Wvvcxnv3zG/jBQ7/F8tfexp//+g7aOzpxqLYB2/dUAxazer3eZMrvY6f1P6U+/+TTx3ZP2djQjK5Opzqx05elr7Sx/JMvw3iNnnwJvy+0bL3tJiKKHsy4h3R2+WG3AW63F48/fhCXz03F6NEJAALHZAX1pLrUv8uUftDRM0pSGx8IZd2ZeqcYFyqFSRg1CrUeD7p27UJSYSEkFG9+9104xo+HLTFRPZZATEgs5W9pQcDr1QP3UICmBr8KlVxIoHVMBvcUJTf0DZ1hk6W2fTAIi8WMymvmoam+EUufegk3XDUHSWkpCLo9SElL0T/c54dJGtVAt37PVZ5EbyuDUlYjf3u5uhKULLoJCPjV68NlOPKGgIxJEcCLf1mNWdNKUFRciGCXEybJwMu+YXxVKc0JzZN1NNZVqGmfD5qM9ieDTMlJofFen/8bbiwioshh4B5it5ngdPrw+uu1OO+8RFw2KyOcjf9qcxvWvt+kRnydOTMdubkOrPjbEcyenYGMzDjs3duOTZs6MG9eJiwy+qBkd3qxtpMo6khAHQzClpqKhKIitHz0EZILC+F3OtG1ZQuy77oLXYcOoe6tt+BzuzG4rAyDJk2CKS4OJqsVzRs3wtPRgYypU1W5Te2qVUicOBHJI0agZdMmNK1bpzLyg6dPV+87w4Qx9aZAQJXE2GxW+CVpISUsJhPW/30jrBYzhg3JwHsffoakpATU1jWgpHgc9h2swaGaOsydMQVjC/LQ2dqBN9/7GDVHGpCRlooFl01DckoSqjZux8efb4LdZkPlFZfB5XZj9boNqKtvwGWNzZgxvQy7du7DB59+iS6XC5MnjcMFEwqwZt2ncLo9aGhqUZ+fkpyEz6u2IntYFuZdehG27NiDPdU1sNut2LZrPy6ecj5KzyvS22x1UtGbG4iIqPfFdqlMN/EJZly36DA2buxC5aIh4aD98GEXnvlDLSoqMnHllUPw7LN1aG3xYtt2N3bu6lAt/WuvNcKkaSoLFeyeXSIiDCorg/PAAfj9fnR+9RUs2dmIz89X5TMZc+ciuaAANb//Pfxudzhj6jp4EM69e/XrWsEgOjZsQMDthqupCbXLliGzogJDrrwSdc88A1ftEb0h615CQ99Mj858QmUo0uYZ79c07D9YiwM1dXC63PjVc3/FyJyhSBmUjLseehJj8rKRmpKMFe9+pDLtr69aB5fHi+/edBU8Xi/eWvsJ/G4vnn1lJcaPHYWKWdNUMJ2cmICLSsah4rJylF9YrLLn0t7Omj4ZBfkj8NSLK+B0u7Fx2x7srj6Mfyo7H8teWomqLbtw2fTJ+NNf1qCuoQnNrR147A+vYdyYPFw6rRT//cRyHKlrBKwWBLj/EFEUYOAe4nYH8POfp8Jm07BhQ0uoGhfYvbsLLpcHe/Z0YOvWNvz9722qu7NF16Vj8+ZONDW50NHhRdkUuTxsXBJm2oZISDyXICUy9fWqtr1j1y5VPiO3nkopTNvmzXDv3ImA3Y6AxxMqowjCZLfDnJAQjgctaWkqm9u1dy/cTic69uxB65Yt6Ni6Fd621nCATz3Uoybr5G+Ki7PBEWdX2fiFcy5C8YQCTCgYhXn/NAnFEwtxwYSxsFnMcDa3YcvOvfB5vfh841aVdd+17wDMNgtKJxbggw1V6OpyIT7ODs2kITE+HqmDkmFJlBJGKaE3YfP23di57xDsNjN8Xh8SHHG4bFoJxo7Nw0WTCjCtdAIKi0ZjyqQCOJ1u9b67bqlA3tg8nFc0GhdOGI3W9g5AlWv16OyFiKhPMXAP8XgCKC1NxuLbh+HHDx7Etm1tgAovgLQ0K3Jz41FUmIjnnh2DYcPikDsiHjU1fjz3XA3Gj09ARoYdQVWn2ad/P6J+TUIhs9WK5Jkz0bh6NTw1NUiZPl1l3w898wwsCQlILi+HOT5e/x7So0yo7tnf0aH+A6WHGV9zsz5f02DLyEB8bi4Si4ow5umn4cjJ0Wvl+c8XEWaL6Zh2z2gC5UqJ1apXY0qZYVKCQ62fTEu2XF5oMpmQPSQDOcOycF3FTNy+qELVtF9/5SwsuHQqvv/g46ipa4DZYlHlMupmUrMZTqcLf/jfN5EQH4/y0gmIj4sL3/9glpp5v199hl0+3+eD2biPIhhUVwKE1+tDY3Ob/hxjdiKKEgzcQ5zOAGpr3MjOScQDDwzH4sV7sH9/OyZMSITbbcahg254vUHU1fnhdgeRnGxDWVk8li5tQGnpoG5/bkbuRIoE0tIdIICUyZNx6M47oXk8sGdmqjKZoNcLX0sLnNXV6Fq/XtUZ+xobEfD7kVhYiLYVK9Dwj3+g9fPP0fjgg3r2fuxYmD0euA8dQtDjga/2CDSWOJy9HgauctNobV2zyq4bTV9nl0sFxz6/H/WNcvUS8Pp8qJNpdY+oDzV1jXAkJaja9Kpte+AJBdFSny5Z9k+/2AKX24P0lCQVYMNmxfAhGXhpxRrs27ZbBecejxctbe2oPlyH9VXb1VdoamlTJTey79U3tqrlynRDk0x71ZWAF//2PtZ/9Lkq04lz2JGVkQb4fb3WbSUR0bnEwF0J4sILk0PlLn5MnZqKpUtz0NbmRWqqHXfdNRxt7R5s3daOOIcGq1VCERMGD7ahsjIZI3LjeJmV6GRCvb7Y0tNR8MEHyKisVK+SUpjh3/42ApoGa3o68n79a5gcDqRfcQXsWVmIGzIE2fffD1dNjboJdcynn8I6aJDqiWbY3XfD096O9m3boDnioFmtPY07ydCTfEMggMQEB25bNA8OR5y6OVVOviZPKsKkcWOQlZ6KyitmqpO3nKEZuGb+JSoTnj0sEwvnzVCDNV0+YwqmlUzA5m27VRCeEB+nbhyVe4Zq6urxw+9ch2FZGSprLje0SglNY3MrbAkO3F65QH1eeuog/Pq/vgeH3a5q4rOHZKrPXFRxKYZmpavpaxdcom5W7exy4pq55SpIT0qMx3/cfi0SkxP1Hm54xYaIokBs9ypjNNTBIPLzE9WfS8pdTCYNZWVpocd+ZGc7kJ2t11XqdZABHDjQjhUrGvGtb2WE+hXWM4tE1E2odxnpLSajvFwF2NIFpJQsJOblISkvLxx0y/yUiRPVY/lJKS5GanGxmpa4Up6XGwjjc3KQmJOjPsRYnsLAq89IkCsnVPHxDpSUFkvdSajffQ35o0fq6yG9/mSmqS4iMzLTkDE0U01nZqYhMzQtpTRTp5XoNeZy5USy5f4Aplx0vj5PumqUZXt9SE9PxYKKmSr4l+WMGpWLUQWj9K4dZUfwejGxuFB/3ufHpPPHqZMDGcFVTQOqNCYtNRllF08GPF592dJNJPcdIooSsR24G1RwIdki6VNa784xEPSrYEEey3PG8yazPsrq22/XY8qUZEyalHw0287Gn+hEof8LnzGKpjzWNBWEq37ZjXeYTKr0Ivx8IBAO2pXQ++Q9vlB5jAq4+H939npQKmME70EZBbd7X/sSfIdIAC2JEPkd9J5kWvYBpyv8emM5AXUjqX7KJtl39VkSsHd2qb+3zJPPkXIp/bRO77c96PKEdhMNAWMa+rTJbFI93Kh9rNMJv8er1o1BOxFFEwbuIXoAEH4Aid+7P3c0NpDBR0xYvHhE6Gl9JFW98Tdyg0R0PGOgpbBuwV5Y6CZCRW5UPX4h4mTvo7Nz0g399boH7IbugbDRbuqv019x4vSJHy4B9fGdqh//Wcc+1pfRfVH6MnQS6MtNr2WlE9QMybKbZSAmIqIow8D9GwsdZCRTpEZQ7X6J/sQDEBER9QNyMTU0Smr3kwsiomjCwL3Hjht6nYiI+jUG7EQU7XitsKdOcnm3f+lB0SqdgFuRYoKxo3OHPzO8uEpEEcLAfcCSIwuPwmeLx2eKCcaOzh3+9Iztw6aViCIkIqUycrnSGDNF/T7jGJNpoa8j21NtzmAQZrOVl4bPkur1QpYhG5YD/dAAo/ZvuXoYbpD1toNOpHpACh2CWHJDRJESkcDd4bCgutoMn0/voYWZ4d6jyRjxMMHrDWDr1gSkpQ3uvYXHEOPAHGhshJabC5MMo040wMh+HvB6kdfSguZOD7xOF6x2GxDwn9CrS2wLQjOZ4etyob65DSNybLG9OYgoYiISuJeWjseSJT7MvLQal84cDkccK3Z6i+SHGxp8eOWVjzB79mSMHTu2txYdE4yAfVByMv7tjjvw28cfx2333Qd7drY+IAzRABLo6sKhtWuxd+mjeAjABdMm45KLShAfZz/6LSNRPhOUcZX86v/xhG5E+1K3khinuxNrPtyAJ/7ndbz33p19uRZERGERCdzLy8uxbNkzuOrqu5GU2IGU1FCCR0TiIDEQyCVuADYbsG8fMGfOP+Phh+9BSkpK6Ntxw54JvYwriOTkZPzr3Xej7kc/wh9HjwaGD9cH+jEGCCKKdtJn/oEDGJWWht//7neQsZ9vv+chNB05DBmXVkaq7WvSSsnwTQ4LUFYxH/W1h7D+ky8h41hHYn0MklpqAdAO4Omnn0Z5+bS+3jRERIoWlMK9PqTqBDUNfr8fX331FerrmxAIyCrIKIp9uCIDjFGmKtvWajVjzJh8DJdgk3pE3SugAUeOHMHOHTvgdemjO4br3YmimWSy5QBgMiE1PR3FxcXq22zcuBENjdImy0jSofs7+pgMjOTxeDFvXiUefvhHKkh2Op36aKl9vC5CpTw0ueBmRkZ6GsaPHw+z2Rw+lhER9QUjfu7zwF0YH07nFrfz2eH2I4qcUSNz8dzzf8L06dMjtxKnwLaBiPqa0e5EpFTGKEfo42R/TFG1of2+r/n+jfspxQqjrYh0myyfL9lst9sNt9evMu3C5/PBJKU9/QDbViKKpIgE7oKNH0UD7qcUSyJ9sm+cOBhBevff/SVwJyKKpP6RwiAiIiIiotNi4E5EREREFAUYuBMRERERRQEG7kREREREUYCBOxER9QvGzakn+x3pHm+IiPqDiPUqQ0RE1J3Rc4zFbAl3DSmki0giIgIDdyIiijwZTdvr9aqg3eV2hftzF9Kfu8ViUT+R7rKSiCiSIjJyKhERkTBGA2xqasK9996L2tpaOBwO7NixAxkZGRgyZAg2btyIn/3sZ7j88svDryciiiVGW8lSGSIiirjkpGQMHjwYy5Ytw4gRI5CWlobq6mps2LABzc3NyMzMVOtoHLyIiGIRb04lIqKIMUpfLFYLFixYoNYjJydH/U5PT0dHRweWLFmCsWPHqnkslSGiWMbAnYiIIioQCKjPz8vLw6RJk9DZ2aluVJX5UvdeWFiIpKQkZtuJKOYxcCcioogysuipqam4/vrr8cUXX8But6OtrQ3nn3++CuaJiAgM3ImIKLIkcJfsutyUWlpaqlbGarWipqYGEydOREFBQWRXkIion2DGnYiI+g2pb589e7a6IbW1tRXl5eWIi4vrN+tHRBRJDNyJiCjijHKZUaNG4eKLL0ZVVRV8Ph+mTp2q6t3ZmwwREUtliIioH5DAXYJzGSW1qKhIrVFlZSWysrLUtDxHRBTrmHEnIqJ+paSkRK3PnDlzVH/ugt1AEhEx405ERP3MsGHDcMstt2DMmDHhG1cZuBMRAVqQ1x+JiKgfMOrY/X4/PvnkE4wcORLZ2dmsbyeimGe0jwzciYio35HuISXLzkw7EZF+n4+0hxZuDCIi6m+kJxkiIjoWW0YiIup3WMVJRHQiBu5ERNTvsESGiOhEDNyJiIiIiKIAA3ciIiIioijAm1OJiOicMWrVjdKXU9Wun6405vhlEBHFKgbuRETU68J9DmtaeNnGvG/qdEE9EVEsYeBORES9ygjQnU4nXn31VbS2tuLmm29GcnIy3nzzTXzxxReIi4uD2+3GhRdeiBkzZsBqtar3STeQwaD0Waz34y7Tfr9PrZ/ZbA53Eymv7Z69N7qPPNV8IqKBgDXuRER0TmzdulUF7L/5zW/g8XjUZ6xfvx4PPPAAcnJy1Lw5c+aoQF6y6nrQHoQk6WVan6fh/vvvx/vvv39McG68Xl7XPWg/2XwiooGCGXciIuo1Rra9o6MDr7/+F1RUVMBisYTLXWw2mwrEFy1ahLq6Ovz0pz9FfX09Nm3apDL0kydPhtfrxbp161BQUIDGxkb84he/UNl2ydJPmTJFZeflPVu2bFHBf1ZWFiZOnKg+o62tDZs3b0ZLSwuGDh2K8847r9sJwdGyHSKiaMSMOxER9bp3330XWVmZuOOOO/DWW2+FA3e73Y61a9fi5ZdfxmOPPYaf/OQnmD59OlasWIGysjI0NDRgx44dmDVrlgrsDx06pNZt586d+OCDD1QQ3tTUhEcffRSPPPIIli9fjhtuuAEffvihet1rr72GadOmqZKcL7/8En6/v9e/GxFRpDBwJyKiXmFk2yUbvmrVKixYsACDBw+Gy+UKl7NI4C3B+L59+7B7927U1NSoDLsE36K6uhpVVVX47ne/q7Lls2fPVpn3yspK3HfffSrzLhl1Cfrz8/ORmpqqHq9cuVK9v6urS/1euHAhrr76apXtF7zBlYgGApbKEBFRrzACdwm8n3rqKcycOVMF1UJq2+fOnavKYW688UYsWbIEtbW1qpxFAvz58+erYF0y9QcPHlRZeAm6pRRGlislNga5qVVIUC/vv+qqq9QJgpBlFxcX48knn1SZfamnl/ca60ZEFM2YcSciol5hZLVHjhyJ559/Xj1ub29Xyw4EAuq3BOIPP/wwXnnlFVXmIoyg+9Zbb8U999yDPXv24JJLLlHPScA9btw4LF26NPx6ubG1sLBQldRI2YycACQmJqrXywnC3r171QmC1MmzVIaIBhJm3ImIqFcYgfvo0aNVGYs8HjNmjLp5VDLoQm4ufeihh7B//34VXEuGvaSkRD1XVFSEvLw81T1kZmammifZ8nvvvRerV69WN5xKWY0E7XJisGbNGmzYsEF1M2n0LCMnBtu3b1fLkM90OByh78YbU4ko+mnB7h3hEhERnSOnK1eRLPtnn32mepuR8prx48ef9vUnc7rlExFFM6N9Y6kMERH1OjnIHP8jGfjj5xklNJJ5l6D9jTfeUKUx3XV/j9AHaDqz5RMRDSTMuBMRUcRJCYwE8dJdpGD2nIjoKKNNZOBORET9CoN2IqJjGe0ib04lIqKIk4OSgX2uExGdHAN3IiKKOAbrRERfj4E7EREREVE/ZlyVZOBORERERNQPdS8jFAzciYiIiIj6keMDdgP7cSciIiIi6idOFbQLZtyJiIiIiCLsdAG74f8BEP5zjcnmz+wAAAAASUVORK5CYII="},3402:(e,i,t)=>{t.d(i,{A:()=>a});const a=t.p+"assets/images/pika-blackwidow-3-e1d6e597bfc0e9f2b5fac3d09de2d347.png"},7701:(e,i,t)=>{t.d(i,{A:()=>a});const a="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAu0AAABkCAYAAAAyng5eAAAABHNCSVQICAgIfAhkiAAAIABJREFUeF7t3Ql0VOX9N/Dv7MlkXyELIRsEEwggm5RdQUWtW5XSaqtU+7bHVmvt8nftaW31fd/2+FdRe9ri9tZuWipiXUE0iMoW2Y/shBiyJySZrLO/5/fcuZMhhH9VIjOZfD8YZ+bOzJ2ZZ56593uf+9znGvx+vx9ERERERBSxjBH7zoiIiIiISGFoJyIiIiKKcAztREREREQRjqGdiIiIiCjCMbQTEREREUU4hnYiIiIiogjH0E5EREREFOEY2omIiIiIIhxDOxERERFRhGNoJyIiIiKKcAztREREREQRjqGdiIiIiCjCMbQTEREREUU4hnYiIiIiogjH0E5EREREFOEY2omIiIiIIhxDOxERERFRhDOH+/35/f5wvwUioi+dwWD40l+DiIiiV1hDuwR2rsiIaCTg8o6IiM5G2EJ76Aps9+7d2Pz+ZnS3d8PvY8t7KKPZiKyCbCy5eDHS09Oxe/cuvP/+VrS398LHshoyZrMR+fmjsHTpEvT29OGtd95C/cl6eH3eIXuNaCAb2bGWWEyfNB3z5s5DQ2MD1q9/G83N9fCxrE4hZWW1xmLKlOmYO3cuLBYLgztFFVmPc285RTtZlkdKA7PBH6ZfnB7aKyoqsGjRIkz69kQk5ifBb2Ro1xlggN8FfPT3D3HvsnsxoWwC7r//EcybtxvFRQYYeETCkOnrAyoq/MjN+QY8xh4433dhauFUWI22QF0dspcavuSnaQQa2xtR4a3A5V+9Ap9WHcXBQ52YNGkmzGYrV+AhpDeMw9GCl19+EqtWrcKKFStgMpkY3CkqcM8RjSSRUt/DEtr1D9/S2oJblt8C6yVWLPpfixCbGKuCKvXzwY+mI01Y++PV2PJaJR597CKsuLkISUlWFtOQ8uPokW7ceturiGtciJU3/g6F6YVgdTyd2+3BG5+8jqsfuxrXX/99rFhxD7Jz8mDkT/c0fX0efPDBa7jrrmvUHsXy8nL4fD4YjdzipuFLX4c3Njbi8KFDcEurB1GUMRiNSM3IQFlZWcQ0uISle4z+g+/t6cWr77yKh558CDGJMXD5XAxJofxQK/e04lRMmH8etrzWjUsvzUJSkhF+n5NlNVT8gMFoQFFxLBYtGo/mDcXIjMsEvIDX64ORyT3IDz8sZjMWFi3CrKwsXDDnUuTm5sHp5B6ygaSsrFYzpk+/EEAcWlubBz6EaNjR198HDhzAL+++Gy+uXQvk5Gifw+eD2sVENNxJw0pHB+ydnVi5ahW+fdNNEdHFMSyhXScrNWG2m4PXI6XfUCSQ8pF/Po8PplgTABfsdu2dqZ4KsmxkVjpr/sA6xuvxId5uwYHONrg8LsAq20UGroRCSX3zATHmWFiajbDa7GodLStyth4P4Ae8PsBmiwWQolrYiYYzPbA7HA78/rHH8GJaGm45cgTW3FxpYRrOH43oNP7eXtS++y5uveYaFBUVYeGiRac95lwLa2gPxW4xZ9bfcDEwoUugPPPz6DMKDDuql7PURTYWDU5Vt0Cd0ze6WQXPrH+72qdXM6JhSw/tHQ4HnvjjH3Hjjh2wFhXJdjxR9LFYkHfFFTD94AfYV1nJ0E5ERETDi4R3YUxL03a+eb2q/y9RNFEbqWYzvBkZ8PT2RsRHi5iWdiIaPti6/tmxrChaqaHw5MPJrknunqQoI3VbX37rG6rhxk1jIiIi+twGdtgkoi8XQzudncBu0qCBtykqcWVNRNyLRHRuRUVol90W+q6L0Otn49R5yugYZzO3KCXlIh9N/scz452BKpwB9w28PfyEY2WtfpOfs6jOtEvzTNOJiIgi1bDv0y4rcZNBhkMEvH4vjAYj5J8XXnXfFwkXEtD1eUpMMBoMweEX1VlKP3d0iEJSSKo/o2z3aendEDxFq4wl8EVKPvrI+O/C79Nroz9k2uf/vFr/0WCRjyhmc6AsA8l94GUoVdoGwGwywOvVNpsCxTbodCKis6YvlPT+/QNv/yef5fGDPUamyd9gBwPLULODTadhadiGdqmf8ruQE98c33ocXq8X478yHp0dndjzj90oWlyMjKIMeH3e/i9Gz5GB/CQH0agWt8DJdYSq9wYDmo824+iGo/CbfPC7gPO+WgpbvBW1u2tRvKBYC/EqiIXM3ijzC8xEJ8E2yvKrlJmUXUeHB+vXN+HiizOQmGjDpk2taGzsw1VXjYLFYoAvpHwkuwaXNaFBVh2/FGUFpPhhMBnw9v631YbkkglL1DjwJosRuz7djePtx3Fl6ZWqSvqkPNUwk1qs7G8F1qb5/XJeXNmQNMLpdeLDqg9xwdjZsFtjTxv7W99wkudoG05aHdXmPXTlfGrN//KoumaU4O3Ftm0bcPz4AdjtiWpM+NLSGejudqBs4iz1G/bJZw68MZPZiK7ODmzdth6zZl2ChPgEeDxeGI0mdHW2Y/v2DbjggksRFxcHr1erz0REZ0Nr4NPOW6Gt+7UDdT9T+0xgvarWCWd6E3I+DNWI2P8awecZDIM+T5aVZ5wfDTvDvnuM/CTaq9vRUeeADz7semGnCivJucnqtlRYq9Gq/qT1XCq2xWhRQUoCgVzKbSG3JRh1n+zGjmc/RvbUbEz62mTkz8mH0WSAPdmOgrkFwZZ2fb5yKfPQwizUdZvRpi4lh52rgHNuGeBy+rBxo0OV6bFjXXj++UZMnJgAi8WoFiQSkIxGs7pU4dxo1IYFC7QKGIzyfWjfQ7TRN1DsVjveOfIO+lxOmIxGuFwuvHpwLZJjkmA0G2AwG2CyGdV1tfA1GmC0GAN/2gaf3JbHwARYTTYsKFqIWEusVn/NRhitRhhlHlLusrEgG7MyD7NBu89qHPINo6GL//+Zei2/H/v3b8e48VOwZMlyzJv3VYwZM04Fd/0HZrMZYbcb1aVsF7rcTuzdswket0uVicViQlycrEuN2Lv3A7g92nQiorPm96O3qQme7u7g8lauy7SgwLovuIIQ+jSDof/xgz1OGAzobWyEs6VFe41A0Hd3dqKnthaqVV2fp8za7UZPQ4O6DJ0+6HX9NSmiDfvQLkwxZtjirDj03iH0tTsxbcU0mG1m1U2mq7kLe97Yg12v7YKj0QF3rxtHtx5FX5cTZoMZ3W3dqKo8Dp/bF/yhOR1OdNZ3IXlsClKSk5FTnoOkrCR0NneicX+jek05S+ne9fuw+43d2LtuL6p3VauNAqn3xyuPo3LNxzi29Rh8Xp8KHdHXh1bb1TFmjBX1dX145pl63HZbFiZMSFTlIxsqH1e2Yc2aGmzd0gq/z4BDhzpx+FCXtovEYMCePW2ore0NLnyiafNGC5rAzNxZcHgd2N+4H7ABzZ3NONhxEFOzp8Lr9mLDgQ1Yu2Mt9tfvVwFe7q+sqsTWqm3YVrUNTo8TH1d/jDUfv4LDjYfh8rqwt24vet29qiW/quU43tr7Fl7f9Qb2ntirQn+Pqxc7ju/AocZD6r6KAxvh6OsM7PEZvpuQsbFxSE/PQlpaDNLTU1Qr+7FjnwQXsHv3VOLtt1/Bzp1bVJcYk9GEhIRUVb8ktB858gnWr38Dn+zfiri4JLXBTkR0VvQWGq8XtatWoevwYbX8l7+eQ4dQ88wzwdlry6LA8JiB5+nTZGnULY//4x/VNGlR1/aQBkhDGIDWt99G7bPPBhtO5HUaX3sNLW+9pTWMqWyvtfB72ttR/dvfwu1waGFPtSKG7n0NbDQEXuuU16OINOzXWtK/3Gq3YMdTO1BdUY3Zd8yG2ar1+ulu78b2p7YhJj4G9iQ7djyzAz0ne7DnmT1oOdQME0w4+OoBNH/SBItFaymX1vnkvGQULynCW3e+iR0vf4yezh61AdD2aTt2/3239kUagLSCVCRlJ2H7/92O7sZumGHGkfWH1fvIKstCzQc1OPruMfXcaGQyAW1tHtxzbzUWL07BtGlyqnbpjmTAhg2teK+iHRPLErHxfQe2bG1HXZ0TTz5Vr4qisdGFlY/Xw2TSFm+BxUj0FJN8FDmFvcWK6VkzcLy1St3e07AHS/OWIjE2Cc9+/Byae5pRlFGM53c/rwJ4R58DM16dgU/bqzE6MQu76nbhpX3/RG5KjtrY6XQ6sHLr4/B4PTjeUo0HNz0Ii9mC9Ph0PFn5JLZVb4PH51bT3z7yNnKTc7H20Fr8e/+r0pdsyLaLwhX92042oaWlBw5HL07UHsGGDX9X9bCycgN27apAYWEp9u7dhF27NsJkssDl6oPVakNV1WH84x8PIzExBW0nG1FVtUftAdLXt0REZ8sku/JC+48bjTDZ7dps/X64u7rUn2oRD3QL9fT0wOVwqGWqnMjHnJgIn8sFZ2cnvG53MJwLeUzaxRfDVV+P3hMnYDIY4GxrQ9eGDUhdvFg9xtXRoeapGAwwJSaqMC7dMP0ej/a6Ph+8Lhf8vkBjpc+nWuvleVG0Fo5KUZEmpRXbPtoOd7cLvR29KiTLdmbzwWY4mh2Iz4qHPc2Oo68chcflxaSbylVo73X1ovVgKwoXFGpfbiCJSGtl+fLJmHvPXNTtqMd7v3oPnW2dsMZZYU+3q4MKjSYjcotz0d3UjZLrx2P8JePV/I5tPIaEwkTYkqywJFpw7L0j6r2IcAWdL4sEHjk4MD3dhMZGp0qpRqMBfX1eVFS0obDQisQkM5KSjHjnnWbMmpmC+Hg/2tvcqsV91gUJGD06RpVM9C0oZCHpU11aFoydjw9qP0C7ox1ba7eibHQZ2nvbsbGqAgXJBUiyJcHR68D+hv2wmi34eeHPsbTkMuRljkGMKQYtfc1ItadiXIYcSwGMTcxXG6tbqjfj2nHX4qLzLsKs4pn4eunXsb1mu9poKk0txRXjr8DEwon4Zvk3UNdep1XAwIribIXj+zKbrfjoozewYcNL2LptHVzOXmSOGove3l7s3LkRo0cXwB6XhFh7InbufF/VK5PJDK/XgwMHKrFo0Q2YNWs2pk9fgqysYnU8wBAVBxGRCsFmu10dLCh/pthYFdBledm1dy9qX3gB1U88gcaXX1bTOvftw6crV6L26afRU1WlAn7fkSNoXLsWJ55+GlUPPoi+ujpteRtoYbBlZsJis6HryBEV4Hpra2HJyUFMRgZaKypQ98ILOP7b36Jjxw61ESAkrJ/485/ReeCArJLgPnkS1Y8/Dm9PD3xuN2qfew41q1ah+pFH0LFzZ1iW7/TZDPvQLoHY3eNG6fIylC2fiPU/WY/Ok52q1dvZ7YI53oyOug50NHRgzv+Zg4TRCciYkI7WfSdx4N8HkDI+Bcljk+GBnIY5cCBpYESavEl5uPQ3l8KWbEPNjhpYbGb4PVqfMdWqvv0o9r2wD5OWl8MKq+p6IxsQXrcHTQeakFSYhPIbJqvWe7X76bN9J8OGNBYkxJvwwAP52L27G2telq5DJng8fni9PrjdPhw40IniIhuuuToTsXYzJk9OwL9ebsGevd1YsCBJBUx1QG9UpieDal0flTAK8dZ4bK7ejGRrMkoyStDR244EcyLae9pxpPkwvlbyNUzLPR/drm5kxWcjzmoHnEB5djl+OvtneGrbU1h3YD2sJquqHx6/Bz3uXmTEpWv1xQ8k2BLV70E2FiTsJ8cmA27AZopBrDlWhfbhXAc9HjcuueQGXHvtzbjowqtU1xevxw23260CuFxWHz+A7KwiXHjhMrU3wmKxqef19nYjOTlTlZUc52KzaRuLRERDxWizofH113Fi/XqcWLdOXde7xtqys5HzjW8gbc4cNL/0ErxOJ9q2bIElMxP5d96JmDFjVLj2NDcjobwchXfeqbq7tO/ZE9xJqo7DMxqRfPnl6N63Dx6fD47330f8nDlqYyGupAS53/42YnJz0bpxo9bdJbBu9TkcKqDLOsDv9cLd3KxCfeumTXC3tqLwrruQefXVqH/qKXj7+k7ZUKDIMexDu/A6vehp7UbB9AKMu2YcNtz9Drq6u5AxLh1GpxHpBekomF2AjPwM1RIcnxaPjPJ0bLlvC3KnjdG6rwTGGZd+ZJ31nTiw7iBaGlrR3tAOX58Pscl2eNxe9LX3qb6yTVVNeH3Bayj5WglMVhM6uzpVF5y0wjQV6PNn5yO7NBsJaQnatx1tzezC78enNU4kJprxk5/k4c8vNGP9+kbEx5tRVCS7BE2YPTsNpWVJSEvXQtK8eSlYvboZLpcfeXnyGNmgiZwfxFBSuyS9fiTEJeArOV/BZf+8DDlJObDb7ciIy0BaQiqS4pIxt3AuikYVIyE2EW6vB229J4PV5URHLTLiMzAr5wLsbdirWtgbuxtgM1oxObscf9z5JxxtOIqGk43qANeSUSXqI0i3GwmtUrZurwvtzo6h/Ghhqc49PQ643S61sSh/0oLe0dGChIRE5OQUqt/2pEmzUVRUiuTkNPV5T56sh9Uag7y88XjzzWdw4kQTPvlkC7Zvf1WtEKPxZ0lEYeLzqfBtLyhQfzF5ecE30lNTg7rVq9G9Zw9MGRmqVT79oovQe/Ag6l58URZoKrTHTZ+O+JIStf6Inz4dPunSEugjr7e2x40fj749e9B17Bhcra1IKNb2wjr27kX96tVwy0GpsbFadxjpriOt9BYLjNINWOYl3XaSk+Hr7YWzrk51xal58UU0VVTAkJWl3htFpmE75KMe9CTESEu51yfD4vlRdnUZvC4P6nbWqZFeyr45Cfte3gujzYT0/HTEj45XreIpRalInZGK9JL008ZdlxDuqO1Aa3ULDD4gb0Eexpyfi7bqNuTMGqO+yZajLSi+txg9HT2o/H/bkTYuHWWLyzDx2onY/+on2Pr0VlhtVhQtKAp88+qnEpm14Auy2oxYuDBJLRDS02Pwy1/mYfPmdsyc6cbXv56F1asb8fTT1bDZzFgwXwtRWVk2FBbGYOqUOMTEmFUfeAlbUc0PlGROwKMLH8WM3BmAB4izxeE7027BG/tfx66anUiIS8QVEy5HckwypuVM12qKAeqA0zV716iW92snXQOzwYSF+YtUnZ2WOw3fct6IdYfWwWgwYV7efFxYdCE6nV2YP3Y+rGab2iZKiU3B1KwpqoiHKqSey29M/XIMBowbdz7iE5JUYJd1UHxCMsaPP199rgULrsWmTa/g1VefhtVqxYwZi5GUlI7Jkxeo55aWzkRraz3effefyMoai2XL7tUORB2qAiGiEU9Cd+KkSUgJhGiTz4e+xkbVDaXhL39Bzq23whQTA8e+farfelxBAYoffBBHfvYztGZlIW7sWBWYtZHoZC/0gDHWA8M62tLTYZ8zB3WrViFm/HjEFRaiq6oKLa+8gnEPP4yO7dvh+OSTYP91g8UCg80GV2MjTBMnav3oa2pgjIlR0+OKipB99dWqBd7X16feo1o0RuUe8OFt2IZ2PTRIVB87a6zWTcbvhiXWgpk3zVJdUiTYjJ2Zp/7kuuo6AB96XD2o3XoCpTeUwWK1wKtGMdVGmJCuBXFpcZixYkbwOUKel5qfirT8NHUSp5LFJThv8Xla15cAeX17qh0zbp6ppsvryeuqcbijqPKrz+L3IynJjOuuy1FR0O/3YvLkJPWnjTJrwIoVuSG/DlkEyLB9XaqPe/lkGWUm+vsUS1n5vX7kp47FnQvuVEWjH/xYmFaAH877YX+S9gNJMUnISx0DNeS4HxifMQ7jM8f1l6MPWHb+9YAc7+sHLhx3IS4svlC7X34UXiDRloDrA4/xe/woTCtEYXqhmudwo9U16dJiwvz5l6vArhqeDEBOdgHG5Bao7liJScm48sqb1f1SPaXHlXzeiy9ZBrXDwQBccsnXg/fLbZmPVz3+XG6CEFG0knDu6erSF8/qunRLkXAcM3YsWtetgzUpCZ6WFrWAP7lpk2qBN8bHIyYzUwV5b3d3sHj8Tid8cqS9LhDkzSYT4ktLUXPzzSiR1nHpQ5+QoMJ205tvwnX4MHwxMeo1PK2tMFitSJ45E7WPPKI2CFzV1XAeOqQOmk2bOxcn/vu/0fDaa1rXwdRUpMybp72irIS4fIwowza0B+uwRL9AGlEBSSopPMEVsQRsVekCY7LLUI1b/rBZtUwWLgiMuR4SqmUeErK1QBk4E2ogZWmNctrR1hLGpV+xHvaF9lyJ6/2Pido6HyhTbWNIlYI6oY+KP/pJq9SY4dpJliR07dvXhpUrZWjIbKSkWLXHj4gFQuAkXoGwqe9x6T8514DQqOqbNk1dVRVPbxI2yKl/g/fDE7pQHewxoSf8Grpwqr/SuSThXOqWXmUkmPs8gTrm9UMGLtLrk15CHnd/HdQCfeC7CPxeh65EiGhE0hdIJhNyvvtdmOPi1PJH/uImTIAtN1d1R8m5+Wb01tfDEh+P1KVLYY6PR1xpKUwpKUhdsACx2dnw9vYi77bb1HJO2ljSlixR81HtLYHXkXlJm01CWRmm1NSoVne5bU1Px9i774arrQ3WRYtU67qMHJN/770qzCecdx7yf/1rNfxjQmkp0q+4Qs0rJisLY+6+G31NTWr5GTNqVP8IOCNi/Ty8DPvQrtXl/lXvwBDYvxLXAriMbT39OzNUi7yMACOB//TnqLkGv8lT7z/TdM3g84pSEqBC8qM61DawgaPKQS255ARW8vl9GDcuHo89Vgy73ayaQfvLKmQmUUvG5h344U6bEDDY9NBpIddPWaie4THKYPP84oZ2bp/Nab8t9bG0dzLofYFgHno58DoR0ZAwGBCbmRlY7WnNGhLgLXFxqiHQkpgIW2JisMFDgrgtLQ2xaWnBYC4Hk1rsdi2kSxBPSVFvTTUchi7r/f7gY7XVrHa/vL498B6EvIZ99Ojg/Ow5OTDk5JzyHmTe+vvQn6O9e4pEURHaPwu9vsvKPTY+NtBt5fTATp/TwPQWumDRUpU2Q1kw2GQ3n9we2E9j4EyIiIiGF20vfX9jggRiFYD1XgD6Xn0J2XIgvPQMkGnymMBt/fFC38t/auNM//yCXW8D6101Fntod1y1p7u/X7xcV01kqlFNew+h702bdeDkTxSRRkxoD6W6zIS0wtE5EFhI6N1pTlsI0bDClhgiogFCG63EKY1YIWc47W9FPHUv4f/0/IEGnjE18HoD9zoOPNlTsInsTO+NItqIDO2nVWo6N6JwrHqi/4QbOERENBSiYpx2IiIiIqJoFjEt7YGeXzSIwDEtgf7goWRcu0GeQF+IXs5SF/vLnEKp/pCBOmfwaztaWQXPTJWXutt42p5vIiKizyOsoV2NNiKnZO/xBK8HD7wgFcilK4/JbISnVw3qhJ4erWCk5Bgsh0ggWUk5d/W4kZaQAqvZqmau+uAzlYaQg5cM6HP2wp3pg8vZo+qh1FP+dk8ldcdkNKDb2QugTY2BTBRNuGgkOrfCEtr1PuWx9lhcufhK7Pr3TiwYvQj2pNhgeA8nrxr1FDAh5KQG4SAniYEfTUeacHDTfgD78fZb2cgaXYSkJFs43lF0UtuOfhw90o2K9w7D3pKNpu5GxMfGqyAfVrJWlMF25G1EwCA7sqHtdrlRcfQ9bK2vR95Hb+G88VORnZ13yvFOJAzo6/Nge+W7ALqRlpbBYqGoEgGLJKIvnz7aTgQIW2iXVrn0tHT8+L4fY9GiRdi/5wASCxK1cBJGMrLM2MSx6h1UO6phMoQzuBsAF/DR3z/EvcvuxW3X34H77nsE27ZtQHGxgSFpCDn7gPcq/MjN+QY8yT34wSM/xNSC82Ez2bQhtIbwtT4TGZHL64cl3oKE7AR01nXC3eVW5xkIR/NWsJuHAWhob0CFrwI//fnPUHP8KP7rv76D8vJZsFi0sqJ+Dkcz1qx5Ck8/vQplZRPVHQZDmDcEiYaI3+3W5iRDDcrQgkRRRO1Bls/jcsEYGxsRnywsoT3UwoULsWvXLmx+fzO627tDzhIZBn7AbDHjjd+/qVpel69YDo9bzoEehvcSYLSbcPtvfojFFy9Geno6yssn4f33t6G9vQc+OSUkDYm4eCNuv30ULr10CXp7+vDWO2+h4WQDPD7punXuyUatxWJBU0sT7n/oftxx3x3ITM+E2+0Oy+hHehnIQqzQUohlk5Zh3tx5aGhswPr169DcXA+fT075SjopK5ttLG6//V3MnTsXJpM2LjNHr6LhTpZNF2Rmou3jjxGfnw+rKZyNW0Rfnr5PPwUqK5GybNmX9yKfg8Efxo6op5wEIII89L8fUu/mvnvui6B3RSNRU0MTRmWNQmN9IzJHZ47EIogakbq8I/qs9DosJ+n5+9/+hhu/9S3MefJJxBQXnzoeOFE06OrChn/9C0uOHsXTL72EvDFjwr4cD2tLe6QdvCYLJDlYzOP0BHsgyMKJLWN0rkm9M5lM6HP1qZfWL71eLw9oHKa4HKHhTl9ny3ryuuuvR0JCAl7/y19w8rHH4NNHSSCKBgYjbDnZ+M3SpVj+q1+pwC7CvRwPa2iPhAIYlJzFN3CHfEHh/pJo5NHr3GCXrI9EFC56cLfZbLjyqqtw6WWXheMwG6JzwmQ0whxB3b/CHtqJiIho+NCDu1xaLZbh88aJvoBI6trI0E5ERESfix7ciaJdJO3dZmgnikD68eFnuiQiCrdICjNEIwEHDCaKQHIQqjCbte1qGWJN6NOJiIhoZGFLO1GEaWlpwbFjx2C321FTU6PenZzLoLW1FT09PSgsLFRj9hMREdHIwdAeIN0QBjvYQO+ewN2A9GXT6197eztmzZqFmTNnqiEezz//fDzwwAOqlX3btm04fPiwCu2D1VciIiKKTuweEyChXMaeFRKOTEate4JMY2Cncyk1NRUrVqxAVVXVKX3apfVdpsv9RERENLKM6JZ2vaVSTg2/du1aHDlyBImJiaisrFS14Pe//z0cDgeKi4tx1VVXqX7FbN2kL4u+cSih/PLLL8dzzz2H8847D52dneokJtJtRqb3h3b9bAJEREQU7UZ0aNeHrJIw3tDQgHvuuUd93yUlJepSgrx44oknGNjpnJAzocrenfz8fPV6fX196mBUuRT6dP1xRERENDKM6NAeauHChZg/fz6cTmdIGwGYAAAGqElEQVRwsvQrjomJwaJFi0ZGbaCw01vb5WDTO+64AytXrsSCBQuwceNGdVumC3bZIiIiGlnYpz2gqKhI/R06dChYA+S6hKTCwqKRVSsobPS9PykpKZg4caJ6H/qxFnJbprOLFhER0cjD0B4gLerz5s1DW1ubCk7yJ9dlWkyMbeTVDAq7yZMnY/LkKarr1pQpU9RtIiIiGplGfGjXWzblcvbs2aoW6MM/CpkW+hiic6W0tBSTJk3E/v37VSu73CYiIqKRacSHduH3a19+RkYGvvnNb6oRY+TvhhtuUNNCH0N0rsjJlfQNSbmU20RERDQyMbSrg/q0L18fak9aNuXvsssuCw6vpz+G6Mum79mRvuzSPUvIpdxmf3YiIqKRiaE9MBKHDKEnYWncuHHBmiDXZZp+H9G5op+Jd9SoUbj55pvVpdCnExER0cjCIR8DJJyL/PwC3Hjjjep2QUGBmqbfR3Su6HVOTqr005/+VF2yLhIREY1cDO0BepeEjIx0lJeXq6np6ensjkBhoYf22NhYlJWVBd8DNyCJiIhGJob2QchJlYiIiIiIIoXBz06yp9FPGS9jtxMRERERhVvUhvbQbRG9S8HA7RN2NaBziXWSiIiIvqioDe2hPu8weaHhSq7rp5EnGiqft07q5Hmsk0RERCNP1IZ2GabR7XbDZDLBbDar2y6XCwYYoP4zGGC1WtU3PliAGjhNTsDEsdrpbLBOEhER0RcVdeO0663kGzduVH3S161bp8qmtrYWF110Eb5zy3dw7bXX4qabbsL27duD5aY/T2/JlFDf1dWFEydOaGE/cAIm/f7QS92p933Rr4SiDeskERERna2oCu166/jJkyfxt7/9TZWNflCptHJ+9NFHWLZsGR5++GEkJyfjjjvugMfjUQFd798een3Xrl0YM2aMCu1CP8mS/pjQx4pTp/NEONS/F4d1koiIiM5G1Az5qHVf0ZrDKyoqkJqaigkTJgTLRg/lEydORFFRESZNmgSLxYKDBw/i5Zdfxg033IDCwkJ8+OGH2LdvHy6//HL86U9/wowZM3DfffdhxYoVmDJlCrq7u/HOO++gqqpKdb1ZsmSJeh0J9h988AEqKz+G3+9TGwdyciZ9Q4JGHtZJIiIiGipR1NKu9Uepq6tTIfy73/0uxo0bp1rShd5F4Xe/+x1uueUWPPbYY7jtttvUCZR+8YtfqKDf2dmJZ599Fq2trYiLi0NOTo7qFy9hPj4+Xs3npZdewp133omWlhYV3m+//Xb1vLa2NtX9pq6uFvn5+cGNBBrJWCeJiIhoaERFaA9tzV6zZg0WLlyIUaNGoaamJti1RW9pnz17Nq655hrVav7ee+8hM3MU/vrXv6rrEvgltF999dVISUnBJZdcorrIfO9730NxcTF6e3vx73//W7XU9/T0qCAvwd3hcKjr0ldeDnqVjQV5fRq5WCeJiIhoKEVFaNc5nU68+eab2LZtGx5//HEVpJ9//nm0t7cHT5Q0f/58XHHFFVi6dKlqafd6PZg+fQaamprw3HPP4Uc/+hGys7PVLPt6+9SlPF/I0I8S0OfOnYvvf//7+PWvf62616SlpcFut+MPf/gD5nxlDqZNm4bNmzer5+gt/DQysU4SERHRUIiaPu1CWrnlIFM5+FT+HnjgAXWwaWJioho9Rsg0CdkrV67Eo48+qlrgi4uLcNlll6luLzLajBykKlJSU9RleXk53njjDUyfPl11u/nFA7+A1+tVgbykpATjx49X87///vuRlJSknhMbG6suaWSTOvnQQw+p8M46SURERF9UVIR2veuLHBgqAVu3YcMG1b9cWsgluEsgl8dK4L7uuuswdepU9RwhQX7s2LEqgOvkYFVpta+vr0dGRoaaLF1rpI97a0srfH6fmr+Q+S9fvlxdl+EkS0tL1XX9vdHIElonJ0+eHPzwrJNERET0RUTdyZVCu6Powcnnk7OaBgZaH0AOKF29erUaKUa6y9x6663BeQwM3GcaCeZMJ14603QaWVgniYiI6GxFRUt7qNCgrY+rLoFdglNoeJLr0soujzl+/DjuuusuXHXVVcFZyXxCnyO3B04T/2k6EeskERERna2oa2n/PAZrOR9sGtG5Mlj9G2waERERjSwjOrTrQlvgB3aJIQoH1kkiIiIKxdBORERERBThomqcdiIiIiKiaMTQTkREREQU4RjaiYiIiIgiHEM7EREREVGEY2gnIiIiIopwDO1ERERERBGOoZ2IiIiIKMIxtBMRERERRTiGdiIiIiKiCPf/AR2fjWWB1luQAAAAAElFTkSuQmCC"},4812:(e,i,t)=>{t.d(i,{A:()=>a});const a=t.p+"assets/images/pika-blackwidow-5-fbecef58859e81229a02ba054c864b53.png"},3287:(e,i,t)=>{t.d(i,{A:()=>a});const a=t.p+"assets/images/pika-blackwidow-6-fea4db926e09062432073c6c94002b07.png"},1950:(e,i,t)=>{t.d(i,{A:()=>a});const a=t.p+"assets/images/pika-blackwidow-7-f94a590f52bd9c931f665786bbc12f97.png"},841:(e,i,t)=>{t.d(i,{A:()=>a});const a=t.p+"assets/images/pika-blackwidow-8-29fc67370188a28f1fc4f5b02c0860b9.png"},8453:(e,i,t)=>{t.d(i,{R:()=>o,x:()=>d});var a=t(6540);const s={},n=a.createContext(s);function o(e){const i=a.useContext(n);return a.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function d(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),a.createElement(n.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/56a9bc23.2d1645ba.js b/build/assets/js/56a9bc23.2d1645ba.js new file mode 100644 index 0000000..cd80a2f --- /dev/null +++ b/build/assets/js/56a9bc23.2d1645ba.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[9460],{8031:(n,i,t)=>{t.r(i),t.d(i,{assets:()=>a,contentTitle:()=>l,default:()=>u,frontMatter:()=>e,metadata:()=>h,toc:()=>s});var p=t(4848),o=t(8453);const e={title:"What's new in Pika v3.5.4",slug:"Pika-3.5.4",authors:[{name:"\u4e8e\u96e8",title:"dubbogo\u793a\u571f\u533a"}],hide_table_of_contents:!1},l=void 0,h={permalink:"/blog/Pika-3.5.4",source:"@site/blog/2024-05-16-Pika-3.5.4.md",title:"What's new in Pika v3.5.4",description:"PikiwiDB(Pika) \u793e\u533a\u975e\u5e38\u8363\u5e78\u5730\u5ba3\u5e03\uff0c\u6211\u4eec\u7684\u6700\u65b0 v3.5.4 \u6b63\u5f0f\u751f\u4ea7\u53ef\u7528\u7248\u672c\u73b0\u5df2\u53d1\u5e03\u3002",date:"2024-05-16T00:00:00.000Z",tags:[],readingTime:5.935,hasTruncateMarker:!1,authors:[{name:"\u4e8e\u96e8",title:"dubbogo\u793a\u571f\u533a"}],frontMatter:{title:"What's new in Pika v3.5.4",slug:"Pika-3.5.4",authors:[{name:"\u4e8e\u96e8",title:"dubbogo\u793a\u571f\u533a"}],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"What's new in PikiwiDB(Pika) v4.0.0",permalink:"/blog/PikiwiDB-Pika--4.0.0"},nextItem:{title:"What's new in Pika v3.5.3 ",permalink:"/blog/Pika-3.5.3"}},a={authorsImageUrls:[void 0]},s=[];function c(n){const i={a:"a",img:"img",li:"li",ol:"ol",p:"p",...(0,o.R)(),...n.components};return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(i.p,{children:"PikiwiDB(Pika) \u793e\u533a\u975e\u5e38\u8363\u5e78\u5730\u5ba3\u5e03\uff0c\u6211\u4eec\u7684\u6700\u65b0 v3.5.4 \u6b63\u5f0f\u751f\u4ea7\u53ef\u7528\u7248\u672c\u73b0\u5df2\u53d1\u5e03\u3002\nv3.5.4 \u89e3\u51b3\u4e86\u5386\u53f2\u9057\u7559\u7684 bug\uff0c\u5bf9 PikiwiDB(Pika) \u7684\u4e00\u4e9b\u9057\u7559 bug \u8fdb\u884c\u4fee\u590d\u548c\u4f18\u5316\uff0c\u65e8\u5728\u6253\u9020\u51fa\u4e00\u4e2a\u9ad8\u7a33\u5b9a\u6027\u7684\u7248\u672c\u3002\u672c\u6b21\u7684\u91cd\u70b9\u4f18\u5316\u4e3b\u8981\u5305\u62ec\uff0cPikiwiDB(Pika)\u652f\u6301\u52a8\u6001\u8c03\u6574\u9650\u901f\u53c2\u6570\u3001\u589e\u5f3a PikiwiDB(Pika) \u7684\u5ba2\u89c2\u6d4b\u6027\u6307\u6807\u3001 \u78c1\u76d8 IO \u9650\u901f\u652f\u6301\u8bfb\u9650\u901f\u53ca\u5199\u9650\u901f\u7b49\u3002\n1 \u65b0\u7279\u6027"}),"\n",(0,p.jsxs)(i.ol,{children:["\n",(0,p.jsx)(i.li,{children:"Pika \u652f\u6301\u52a8\u6001\u8c03\u6574\u5168\u91cf\u540c\u6b65\u9650\u901f\u53c2\u6570 rsync-timeout-ms \u548c throttle-bytes-per-second\u3002"}),"\n"]}),"\n",(0,p.jsx)(i.p,{children:"\u81ea v3.5.0 \u7248\u672c\u5f00\u59cb\uff0cPikiwiDB(Pika) \u670d\u52a1\u6452\u5f03\u4e86\u901a\u8fc7\u5b50\u8fdb\u7a0b\u5185\u4f7f\u7528\u539f\u6765 rsync \u5de5\u5177\u8fdb\u884c\u4e3b\u4ece\u5168\u91cf\u540c\u6b65\u7684\u903b\u8f91\uff0c\u5728 PikiwiDB(Pika) \u5185\u90e8\u4ee5\u7ebf\u7a0b\u65b9\u5f0f\u3010\u79f0\u4f5c rsync \u7ebf\u7a0b\u3011\u81ea\u884c\u5b9e\u73b0\u4e86\u65b0\u7684\u5168\u91cf\u540c\u6b65\u903b\u8f91\uff0c\u907f\u514d\u56e0\u4e3a\u5916\u90e8\u8fdb\u7a0b\u4e0d\u53ef\u63a7\u5f15\u8d77\u7684\u4e3b\u4ece\u540c\u6b65\u95ee\u9898\uff0c\u6839\u636e 360 \u5185\u90e8 Pika \u7ebf\u4e0a\u5927\u89c4\u6a21\u96c6\u7fa4\u8fd0\u7ef4\u7684\u7ecf\u9a8c\uff0c\u5728 PikiwiDB(Pika) \u4e3b\u4ece\u8fdb\u884c\u5168\u91cf\u540c\u6b65\u7684\u8fc7\u7a0b\u4e2d\uff0c\u5982\u679c\u9047\u5230\u67d0\u4e9b\u4e0d\u5229\u7684\u5916\u90e8\u56e0\u7d20\uff0c\u5982\u7f51\u7edc\u6ce2\u52a8\uff0c\u786c\u4ef6\u6545\u969c\uff08\u5982\u7f51\u5361\u964d\u901f\u5bfc\u81f4\u7684\u4e3b\u4ece\u7f51\u5361\u901f\u7387\u4e0d\u5339\u914d\uff09\u7b49\uff0c\u53ef\u80fd\u5f15\u8d77 rsync \u7ebf\u7a0b\u8bf7\u6c42\u6301\u7eed\u8d85\u65f6\uff08PikiwiDB(Pika) \u5185\u7f6e rsync \u6a21\u5757\u7528\u4e8e\u5168\u91cf\u540c\u6b65\u9636\u6bb5\u7684\u6587\u4ef6\u4f20\u8f93\uff09\uff0c\u4e14\u8d85\u65f6\u91cd\u8bd5\u6240\u53d1\u51fa\u7684\u5305\u53ef\u80fd\u5f15\u53d1\u66f4\u5927\u7684\u7f51\u7edc\u4fe1\u9053\u8d1f\u62c5\u3002\u6b64\u65f6\u5bf9\u4e8e\u8fd0\u7ef4\u4eba\u5458\u6765\u8bf4\uff0c\u5982\u679c\u80fd\u52a8\u6001\u8c03\u6574 rsync \u8bf7\u6c42\u7684\u8d85\u65f6\u65f6\u95f4\u548c rsync \u4f20\u8f93\u7684\u901f\u7387\u4e0a\u9650\uff0c\u4e0d\u4ec5\u610f\u5473\u7740\u5bf9\u5168\u91cf\u540c\u6b65\u9636\u6bb5\u63a7\u5236\u7c92\u5ea6\u7684\u8fdb\u4e00\u6b65\u7ec6\u5316\uff0c\u66f4\u5927\u5927\u964d\u4f4e\u4e86\u5728\u8be5\u573a\u666f\u4e0b\u7684\u8fd0\u7ef4\u5904\u7f6e\u96be\u5ea6\u3002"}),"\n",(0,p.jsx)(i.p,{children:"\u5173\u952ePR\uff1a"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2633",children:"https://github.com/OpenAtomFoundation/pika/pull/2633"})}),"\n",(0,p.jsxs)(i.ol,{start:"2",children:["\n",(0,p.jsx)(i.li,{children:"\u5c06 info key space 1 \u7684\u7ed3\u679c\u8f93\u51fa\u81f3 info all \u5e76\u5c55\u793a\u5230\u76d1\u63a7\u754c\u9762\u4e2d\u3002"}),"\n"]}),"\n",(0,p.jsx)(i.p,{children:"PikiwiDB(Pika) \u662f\u901a\u8fc7 Info \u547d\u4ee4\u91c7\u96c6\u6570\u636e\u81f3 Pika-Exporter\uff0c\u5c55\u793a\u5230 Grafana \u754c\u9762\u4e0a\u7684\uff0c\u76ee\u524d\u754c\u9762\u4e0a\u90e8\u5206\u6570\u636e\u662f\u6ca1\u6709\u5c55\u793a\u7684\uff0c\u5982 keys \u7684\u6570\u91cf\uff0c\u672c\u6b21\u5c06\u6267\u884c info keyspace \u7684\u7ed3\u679c\u5c55\u793a\u5230\u76d1\u63a7\u754c\u9762\uff0c\u7528\u6237\u53ef\u4ee5\u901a\u8fc7\u8fd9\u4e2a\u6307\u6807\u6765\u67e5\u770b\u5b58\u50a8\u7684\u91cf\u7ea7\u7b49\u3002"}),"\n",(0,p.jsx)(i.p,{children:"\u5173\u952ePR\uff1a"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2603",children:"https://github.com/OpenAtomFoundation/pika/pull/2603"})}),"\n",(0,p.jsx)(i.p,{children:"3.Pika \u78c1\u76d8IO \u9650\u901f\u53c2\u6570\u652f\u6301 OnlyRead\u3001OnlyWrite\u3001ReadAndWrite\uff0c\u9ed8\u8ba4\u652f\u6301OnlyWrite\u3002"}),"\n",(0,p.jsx)(i.p,{children:"\u81ea3.5.0\u7248\u672c\u5f00\u59cb\uff0cPikiwiDB(Pika) \u670d\u52a1\u53ef\u4ee5\u901a\u8fc7\u8c03\u6574 rate-limit \u53c2\u6570\u5b9e\u73b0\u5199\u9650\u901f\uff0c\u9632\u6b62\u5728\u7f51\u5361\u8d28\u91cf\u4e0d\u9ad8\u7684\u60c5\u51b5\u4e0b\u78c1\u76d8 IO \u8fc7\u91cd\u5bfc\u81f4\u670d\u52a1\u4e0d\u53ef\u7528\uff0c\u6216\u8005 binlog \u963b\u585e\u7684\u60c5\u51b5\u53d1\u751f\u3002360\u5185\u90e8 Pika \u7ebf\u4e0a\u5927\u89c4\u6a21\u96c6\u7fa4\u8fd0\u7ef4\u7684\u7ecf\u9a8c\uff0c\u5728 PikiwiDB(Pika) \u5b9e\u4f8b\u7684\u7f51\u5361\u8f83\u5dee\u60c5\u51b5\u4e0b\uff0c\u4e5f\u9700\u8981\u5bf9\u8bfb\u5b9e\u4f8b\u8fdb\u884c\u9650\u901f\uff0c\u672c\u6b21\u4fee\u6539\u652f\u6301\u8bfb\u3001\u5199\u9650\u901f\uff0c\u9ed8\u8ba4\u662f\u5199\u9650\u901f\uff0c\u8c03\u6574 config \u914d\u7f6e\u4e2d\u7684 rate-limiter-mode \u53ef\u4ee5\u8bbe\u7f6e\u4e3a\u8bfb\u9650\u901f\uff0c\u6216\u8005\u540c\u65f6\u8bfb\u5199\u9650\u901f\u3002"}),"\n",(0,p.jsx)(i.p,{children:"\u5173\u952ePR\uff1a"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2599",children:"https://github.com/OpenAtomFoundation/pika/pull/2599"})}),"\n",(0,p.jsx)(i.p,{children:"2 \u6539\u8fdb\u5217\u8868"}),"\n",(0,p.jsx)(i.p,{children:"slotmigrate \u6dfb\u52a0 go test\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2576",children:"https://github.com/OpenAtomFoundation/pika/pull/2576"})}),"\n",(0,p.jsx)(i.p,{children:"INFO \u547d\u4ee4\u8017\u65f6\u4f18\u5316\uff0c\u964d\u4f4e\u67e5\u78c1\u76d8\u9891\u7387\uff0c\u907f\u514d\u56e0\u4e3a\u6570\u636e\u91c7\u96c6\u8c03\u7528 info \u547d\u4ee4\u65f6\u67e5\u78c1\u76d8\u592a\u8fc7\u9891\u7e41\u5bfc\u81f4\u670d\u52a1\u6027\u80fd\u4e0b\u964d\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2554",children:"https://github.com/OpenAtomFoundation/pika/pull/2554"})}),"\n",(0,p.jsx)(i.p,{children:"\u5bf9\u4e94\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u547d\u4ee4\u589e\u52a0 Redis tcl \u6d4b\u8bd5\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2527",children:"https://github.com/OpenAtomFoundation/pika/pull/2527"})}),"\n",(0,p.jsx)(i.p,{children:"3 Bug \u4fee\u590d"}),"\n",(0,p.jsx)(i.p,{children:"\u4fee\u590d\u4f7f\u7528 Pika Exporter \u65f6\u53ef\u80fd\u4f1a\u51fa\u73b0 slots \u5206\u914d\u4e0d\u5747\u8861\u7684\u95ee\u9898\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2651",children:"https://github.com/OpenAtomFoundation/pika/pull/2651"})}),"\n",(0,p.jsx)(i.p,{children:"\u4fee\u590d Codis dashboard \u4e0d\u80fd\u6b63\u786e\u66f4\u65b0 master \u5b9e\u4f8b\u72b6\u6001\u7684\u95ee\u9898\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2650",children:"https://github.com/OpenAtomFoundation/pika/pull/2650"})}),"\n",(0,p.jsx)(i.p,{children:"\u4fee\u590d Redis \u4e8b\u52a1 binlog \u89e3\u6790\u5931\u8d25\u5bfc\u81f4\u7684\u4e3b\u4ece\u540c\u6b65\u5f02\u5e38\u95ee\u9898\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2642",children:"https://github.com/OpenAtomFoundation/pika/pull/2642"})}),"\n",(0,p.jsx)(i.p,{children:"\u4fee\u590d Pika Expoter \u542f\u52a8\u65f6\u4e0d\u5e26\u53c2\u6570\u5bfc\u81f4\u542f\u52a8\u5931\u8d25\u95ee\u9898\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2640",children:"https://github.com/OpenAtomFoundation/pika/pull/2640"})}),"\n",(0,p.jsx)(i.p,{children:"\u4fee\u590d\u4f7f\u7528 Pika Operater \u62c9\u8d77\u96c6\u7fa4 Codis-proxy panic \u7684\u95ee\u9898\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2633",children:"https://github.com/OpenAtomFoundation/pika/pull/2633"})}),"\n",(0,p.jsx)(i.p,{children:"\u4fee\u590d CI \u7f16\u8bd1\u51fa\u7684\u4e8c\u8fdb\u5236\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u65f6 cp \u547d\u4ee4\u5931\u8d25\u95ee\u9898\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2614",children:"https://github.com/OpenAtomFoundation/pika/pull/2614"})}),"\n",(0,p.jsx)(i.p,{children:"\u4fee\u590d\u53d8\u91cf\u672a\u521d\u59cb\u5316\u5bfc\u81f4 cache \u542f\u52a8\u5931\u8d25\u7684\u95ee\u9898\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2613",children:"https://github.com/OpenAtomFoundation/pika/pull/2613"})}),"\n",(0,p.jsx)(i.p,{children:"\u4fee\u590d userpass \u548c userblacklist \u52a8\u6001\u4fee\u6539\u53c2\u6570\u529f\u80fd\u5f02\u5e38\u95ee\u9898\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2600",children:"https://github.com/OpenAtomFoundation/pika/pull/2600"})}),"\n",(0,p.jsx)(i.p,{children:"\u4fee\u590d scard sscan \u7ed3\u679c\u4e0d\u4e00\u81f4\u7684\u95ee\u9898\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2596",children:"https://github.com/OpenAtomFoundation/pika/pull/2596"})}),"\n",(0,p.jsx)(i.p,{children:"\u4fee\u590d\u5f53 max-rsync-parallel-num \u5927\u4e8e4\uff0cslave \u4f1a\u5728\u4e3b\u4ece\u590d\u5236\u65f6 coredump \u7684\u95ee\u9898\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2595",children:"https://github.com/OpenAtomFoundation/pika/pull/2595"})}),"\n",(0,p.jsx)(i.p,{children:"\u8c03\u6574\u4e0d\u5e38\u7528\u7684\u7ebf\u7a0b\u6c60\u7ebf\u7a0b\u6570\uff0c\u907f\u514d\u56e0\u4e3a\u7a7a\u8dd1\u5bfc\u81f4\u6027\u80fd\u635f\u8017\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2590",children:"https://github.com/OpenAtomFoundation/pika/pull/2590"})}),"\n",(0,p.jsx)(i.p,{children:"\u4fee\u590d Pika \u4e8b\u52a1\u8fb9\u7f18\u6d4b\u8bd5 case \u4e0d\u901a\u8fc7\u7684\u95ee\u9898\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2586",children:"https://github.com/OpenAtomFoundation/pika/pull/2586"})}),"\n",(0,p.jsx)(i.p,{children:"\u5c06 cache-model \u4fee\u6539\u6210 cache-mode\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2585",children:"https://github.com/OpenAtomFoundation/pika/pull/2585"})}),"\n",(0,p.jsx)(i.p,{children:"\u4fee\u590d\u4f7f\u7528 info keyspace \u540e\uff0cinfo all \u6b7b\u9501\u7684\u95ee\u9898\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2584",children:"https://github.com/OpenAtomFoundation/pika/pull/2584"})}),"\n",(0,p.jsx)(i.p,{children:"\u4fee\u590d\u56e0\u4fee\u6539 zsetscorekey comparator impl \u5b57\u5178\u5e8f\u6bd4\u8f83\u719f\u987a\u5e8f\uff0c\u5bfc\u81f4 353 352\u6781\u7aef\u573a\u666f\u4e0d\u517c\u5bb9\u7684\u95ee\u9898\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2583",children:"https://github.com/OpenAtomFoundation/pika/pull/2583"})}),"\n",(0,p.jsx)(i.p,{children:"\u4fee\u590d compact \u6b7b\u9501\u7684\u95ee\u9898\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2581",children:"https://github.com/OpenAtomFoundation/pika/pull/2581"})}),"\n",(0,p.jsx)(i.p,{children:"Slotmigrate \u6dfb\u52a0 go test\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2576",children:"https://github.com/OpenAtomFoundation/pika/pull/2576"})}),"\n",(0,p.jsx)(i.p,{children:"\u66f4\u65b0 Pika Operater \u4f7f\u7528\u7684 pika \u7248\u672c\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2572",children:"https://github.com/OpenAtomFoundation/pika/pull/2572"})}),"\n",(0,p.jsx)(i.p,{children:"\u4fee\u590d config rewrite \u540e blockcache \u6570\u503c\u5f02\u5e38\u7684\u95ee\u9898\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2561",children:"https://github.com/OpenAtomFoundation/pika/pull/2561"})}),"\n",(0,p.jsx)(i.p,{children:"\u4fee\u590d slotmigrate \u52a8\u6001\u4fee\u590d\u540e\u503c\u9519\u8bef\u7684\u95ee\u9898\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2548",children:"https://github.com/OpenAtomFoundation/pika/pull/2548"})}),"\n",(0,p.jsx)(i.p,{children:"\u4fee\u590d spop \u53ef\u80fd\u4f1a\u51fa\u73b0\u4e3b\u4ece\u6570\u636e\u4e0d\u4e00\u81f4\u7684\u95ee\u9898\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2541",children:"https://github.com/OpenAtomFoundation/pika/pull/2541"})}),"\n",(0,p.jsx)(i.p,{children:"\u4fee\u590d CloseFd(it->second[i]) \u51fa\u73b0\u8d8a\u754c\u7684\u95ee\u9898\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2539",children:"https://github.com/OpenAtomFoundation/pika/pull/2539"})}),"\n",(0,p.jsx)(i.p,{children:"\u4fee\u590d Flushall \u548c FlushDB \u6b7b\u9501\u7684\u9690\u60a3\uff0c\u5e76\u5220\u9664 FlushSubDB \u63a5\u53e3\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2533",children:"https://github.com/OpenAtomFoundation/pika/pull/2533"})}),"\n",(0,p.jsx)(i.p,{children:"\u589e\u52a0\u53c2\u6570\u63a7\u5236\u662f\u5426\u6e05\u7406 tcl \u6d4b\u8bd5\u540e\u4ea7\u751f\u7684\u6570\u636e\u6587\u4ef6\uff0c\u9632\u6b62\u5e9f\u5f03\u6570\u636e\u5360\u636e\u78c1\u76d8\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2507",children:"https://github.com/OpenAtomFoundation/pika/pull/2507"})}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.img,{alt:"2024-05-16-Pika-3.5.4-connect.png",src:t(8973).A+"",width:"747",height:"431"})})]})}function u(n={}){const{wrapper:i}={...(0,o.R)(),...n.components};return i?(0,p.jsx)(i,{...n,children:(0,p.jsx)(c,{...n})}):c(n)}},8973:(n,i,t)=>{t.d(i,{A:()=>p});const p=t.p+"assets/images/2024-05-16-Pika-3.5.4-connect-c43aca0eeeb5cd09cc60b55f9a3df4e5.png"},8453:(n,i,t)=>{t.d(i,{R:()=>l,x:()=>h});var p=t(6540);const o={},e=p.createContext(o);function l(n){const i=p.useContext(e);return p.useMemo((function(){return"function"==typeof n?n(i):{...i,...n}}),[i,n])}function h(n){let i;return i=n.disableParentContext?"function"==typeof n.components?n.components(o):n.components||o:l(n.components),p.createElement(e.Provider,{value:i},n.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/5845532a.247425f5.js b/build/assets/js/5845532a.247425f5.js new file mode 100644 index 0000000..0ad00d1 --- /dev/null +++ b/build/assets/js/5845532a.247425f5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[1970],{3400:(n,i,t)=>{t.r(i),t.d(i,{assets:()=>h,contentTitle:()=>l,default:()=>c,frontMatter:()=>p,metadata:()=>s,toc:()=>a});var o=t(4848),e=t(8453);const p={title:"What's new in PikiwiDB(Pika) v4.0.0",slug:"PikiwiDB-Pika--4.0.0",authors:[{name:"360 \u8f66\u91d1\u9e3d",title:"Pika \u5f00\u6e90\u793e\u533a"}],hide_table_of_contents:!1},l=void 0,s={permalink:"/blog/PikiwiDB-Pika--4.0.0",source:"@site/blog/2024-07-08-PikiwiDB(Pika)-4.0.0.md",title:"What's new in PikiwiDB(Pika) v4.0.0",description:"\u5c0a\u656c\u7684\u793e\u533a\u6210\u5458\u53ca\u6280\u672f\u7231\u597d\u8005\u4eec\uff1a",date:"2024-07-08T00:00:00.000Z",tags:[],readingTime:17.085,hasTruncateMarker:!1,authors:[{name:"360 \u8f66\u91d1\u9e3d",title:"Pika \u5f00\u6e90\u793e\u533a"}],frontMatter:{title:"What's new in PikiwiDB(Pika) v4.0.0",slug:"PikiwiDB-Pika--4.0.0",authors:[{name:"360 \u8f66\u91d1\u9e3d",title:"Pika \u5f00\u6e90\u793e\u533a"}],hide_table_of_contents:!1},unlisted:!1,nextItem:{title:"What's new in Pika v3.5.4",permalink:"/blog/Pika-3.5.4"}},h={authorsImageUrls:[void 0]},a=[{value:"1 \u91cd\u5927\u6539\u8fdb",id:"1-\u91cd\u5927\u6539\u8fdb",level:2}];function u(n){const i={a:"a",br:"br",h2:"h2",img:"img",li:"li",p:"p",ul:"ul",...(0,e.R)(),...n.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.p,{children:"\u5c0a\u656c\u7684\u793e\u533a\u6210\u5458\u53ca\u6280\u672f\u7231\u597d\u8005\u4eec\uff1a\nPikiwiDB \u793e\u533a\u8363\u8000\u5730\u5ba3\u544a\u2014\u2014\u7ecf\u8fc7 9 \u4e2a\u6708\u6253\u78e8\u5e76\u5728\u751f\u4ea7\u73af\u5883\u7a33\u5b9a\u8fd0\u884c 5 \u4e2a\u6708\u7684 PikiwiDB(Pika) v4.0.0 \u3010\u4e0b\u6587\u7b80\u79f0 Pika\u3011\u4eca\u5929\u6b63\u5f0f\u53d1\u5e03\u3002\u5e0c\u671b\u57fa\u4e8e\u7b2c\u4e09\u4ee3\u5b58\u50a8\u5f15\u64ce Floyd \u7684\u8fd9\u4e2a\u65b0\u7248\u672c\u80fd\u4e3a\u793e\u533a\u7528\u6237\u4eec\u5e26\u6765\u66f4\u5353\u8d8a\u7684\u4f53\u9a8c\u3002"}),"\n",(0,o.jsx)(i.h2,{id:"1-\u91cd\u5927\u6539\u8fdb",children:"1 \u91cd\u5927\u6539\u8fdb"}),"\n",(0,o.jsx)(i.p,{children:"1.1 \u7b2c\u4e09\u4ee3\u5b58\u50a8\u5f15\u64ce Floyd\nFloyd \u5982\u540c\u5176\u524d\u4ee3 Blackwidow\uff0c\u57fa\u4e8e RocksDB\uff0c\u4e0d\u4ec5\u652f\u6301\u57fa\u7840\u7684 String \u7ed3\u6784\uff0c\u4e5f\u539f\u751f\u652f\u6301\u4e86 Hash\u3001List\u3001Set\u3001Stream\u53ca ZSet \u7b49 KKV \u5f62\u5f0f\u7684\u590d\u5408\u6570\u636e\u7ed3\u6784\u3002"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsx)(i.li,{children:"RocksDB \u5b9e\u4f8b\u6570\u53ef\u914d\u7f6e"}),"\n"]}),"\n",(0,o.jsx)(i.p,{children:"\u6452\u5f03\u4e86 Blackwidow \u6309\u6570\u636e\u7c7b\u578b\u91c7\u7528 RocksDB \u5b9e\u4f8b\u7684\u7269\u7406\u9694\u79bb\u6a21\u5f0f\uff0cFloyd \u91c7\u7528\u4e86 RocksDB \u7684 Column-Family \u865a\u62df\u9694\u79bb\u673a\u5236\uff0c\u5728\u5355\u4e2a RocksDB \u5b9e\u4f8b\u4e0b\u53ef\u5b58\u50a8\u6240\u6709\u7c7b\u578b\u7684\u6570\u636e\u3002\u7528\u6237\u53ef\u81ea\u7531\u8bbe\u5b9a Pika \u5b9e\u4f8b\u4e2d\u6bcf\u4e2a DB\u3010\u7b49\u540c\u4e8eRedis DB\u3011\u4e2d RocksDB \u5b9e\u4f8b\u7684\u6570\u91cf\uff0c\u800c\u6570\u636e\u7684\u5b58\u50a8\u5219\u4f9d\u636e key \u7684 hash \u503c\u5206\u914d\u81f3\u76f8\u5e94\u7684 RocksDB \u5b9e\u4f8b\uff0c\u51cf\u5c0f\u4e86\u6570\u636e\u7684\u7a7a\u95f4\u653e\u5927\u548c\u8bfb\u653e\u5927\u6548\u5e94\uff0c\u5b9e\u73b0\u4e86\u673a\u5668\u8d44\u6e90\u7684\u9ad8\u6548\u5229\u7528\u3002"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsx)(i.li,{children:"\u7981\u6b62\u91cd\u590d key"}),"\n"]}),"\n",(0,o.jsxs)(i.p,{children:[(0,o.jsx)(i.img,{alt:"2024-05-16-PikiwiDB(Pika)-4.0.0-key",src:t(9805).A+"",width:"1080",height:"1006"}),"\n\u57fa\u4e8e RocksDB \u7684 Column-Family \u865a\u62df\u9694\u79bb\u673a\u5236\uff0cFloyd \u628a\u6240\u6709\u7c7b\u578b\u7684 key \u548c string \u4e00\u8d77\u5b58\u50a8\u5728 Column-Family 0\u3002\u5728\u6b64\u5b58\u50a8\u57fa\u7840\u4e4b\u4e0a\uff0c\u53ef\u660e\u786e\u7981\u6b62\u4e0d\u540c\u7c7b\u578b\u7684 key \u91cd\u590d\uff0c\u8fd9\u4e00\u8bbe\u8ba1\u65e8\u5728\u675c\u7edd\u6f5c\u5728\u7684\u6570\u636e\u5197\u4f59\u4e0e\u4e0d\u4e00\u81f4\u6027\uff0c\u4e0e Redis \u670d\u52a1\u7279\u6027\u4fdd\u6301\u4e00\u81f4\uff0c\u8fdb\u4e00\u6b65\u63d0\u5347\u4e86\u7cfb\u7edf\u7684\u6574\u4f53\u6548\u7387\u4e0e\u6570\u636e\u8d28\u91cf\u3002"]}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsx)(i.li,{children:"Floyd \u8be6\u7ec6\u8bf4\u660e"}),"\n"]}),"\n",(0,o.jsxs)(i.p,{children:["\u5982\u679c\u5bf9 Floyd \u5b58\u50a8\u5f15\u64ce\u611f\u5174\u8da3\uff0c\u8bf7\u8be6\u9605\u300aFloyd \u5b58\u50a8\u5f15\u64ce\u300b\u3010\u94fe\u63a5\uff1a",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/discussions/2052%E3%80%91%E3%80%82%E7%94%B1%E4%BA%8E",children:"https://github.com/OpenAtomFoundation/pika/discussions/2052\u3011\u3002\u7531\u4e8e"})," Floyd \u524d\u540e\u8fdb\u884c\u4e86\u591a\u4e2a\u7248\u672c\u7684\u8fed\u4ee3\uff0c\u6240\u4ee5\u9605\u8bfb\u8be5 github discussion \u6587\u6863\u65f6\u8bf7\u6ce8\u610f\u524d\u540e\u65f6\u95f4\uff0c\u5982\u6709\u76f8\u5173\u51b2\u7a81\u6027\u8bf4\u6cd5\uff0c\u4ee5\u6700\u65b0\u65e5\u671f\u7684\u6587\u5b57\u4e3a\u51c6\u3002"]}),"\n",(0,o.jsx)(i.p,{children:"\u5173\u952e PR\uff1a"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:["PikiwiDB(Pika) \u652f\u6301 Floyd \u5b58\u50a8\u5f15\u64ce",(0,o.jsx)(i.br,{}),"\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2413",children:"https://github.com/OpenAtomFoundation/pika/pull/2413"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u6dfb\u52a0 Floyd \u7684 compaction-filter \u7684 Gtest",(0,o.jsx)(i.br,{}),"\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2669",children:"https://github.com/OpenAtomFoundation/pika/pull/2669"})]}),"\n",(0,o.jsxs)(i.li,{children:["Pika \u4e0d\u652f\u6301\u4e0d\u540c\u7c7b\u578b\u7684\u91cd\u590d key, \u5199\u5165\u91cd\u590d key \u8fd4\u56de\u975e\u6cd5\u7c7b\u578b",(0,o.jsx)(i.br,{}),"\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2609",children:"https://github.com/OpenAtomFoundation/pika/pull/2609"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u5bf9 HyperLogLog \u548c String \u8fdb\u884c\u7c7b\u578b\u9694\u79bb\uff0c\u786e\u4fdd HyperLogLog \u64cd\u4f5c\u4e0e String \u64cd\u4f5c\u660e\u786e\u533a\u5206\u5f00",(0,o.jsx)(i.br,{}),"\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2720",children:"https://github.com/OpenAtomFoundation/pika/pull/2720"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u6dfb\u52a0\u652f\u6301\u5206\u533a\u7d22\u5f15\u8fc7\u6ee4\u7684\u529f\u80fd",(0,o.jsx)(i.br,{}),"\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2601",children:"https://github.com/OpenAtomFoundation/pika/pull/2601"})]}),"\n"]}),"\n",(0,o.jsx)(i.p,{children:"1.2 Mget \u6279\u91cf\u67e5\u8be2\u7f13\u5b58"}),"\n",(0,o.jsx)(i.p,{children:"Pika v3.5.2 \u7684\u70ed\u6570\u636e\u7f13\u5b58\u53ea\u5b9e\u73b0\u4e86\u5bf9\u70ed\u70b9 Key \u7684\u70b9\u67e5(\u5982get/hget)\uff0c\u5728\u540e\u7eed\u7684 v3.5.3 \u548c v3.5.4 \u4fee\u590d\u82e5\u5e72 bug \u540e\uff0c\u5bf9\u70ed\u6570\u636e\u7684\u70b9\u67e5\u76ee\u524d\u5df2\u7ecf\u975e\u5e38\u7a33\u5b9a\u3002\u7136\u800c\u5e76\u672a\u652f\u6301\u6279\u91cf\u67e5\u8be2(\u5982 mget etc)\u3002\n\u5185\u90e8\u4e1a\u52a1\u4fa7\u53cd\u9988\u6279\u91cf\u67e5\u8be2\u901f\u5ea6\u6bd4\u8f83\u6162\uff0c\u5728 40C/256GiB/2TiB SATA SSD \u89c4\u683c\u673a\u5668\u4e0a\u6570\u636e\u91cf\u8d85\u8fc7 100GiB \u65f6\uff0cPika v3.3.6 30% \u6279\u91cf\u67e5\u8be2\u5ef6\u8fdf\u8d85\u8fc7 35ms\u3002\u4f46\u7531\u4e8e Pika \u70ed\u6570\u636e\u7f13\u5b58\u5c1a\u672a\u652f\u6301\u6279\u91cf\u67e5\u8be2\uff0c\u6027\u80fd\u5e76\u672a\u6539\u5584\u3002"}),"\n",(0,o.jsxs)(i.p,{children:["\u4e3a\u4e86\u6ee1\u8db3\u4e1a\u52a1\u9700\u6c42\uff0cPika \u56e2\u961f\u5f00\u53d1\u4e86\u6279\u91cf\u67e5\u8be2\u70ed\u6570\u636e\u7f13\u5b58\u529f\u80fd\uff0c\u663e\u8457\u63d0\u5347\u4e86\u6279\u91cf\u67e5\u8be2\u6027\u80fd\uff0c\u964d\u4f4e\u4e86\u67e5\u8be2\u5ef6\u8fdf\u548c\u5931\u8d25\u7387\u3002\u76f8\u5173\u6280\u672f\u7ec6\u8282\u8bf7\u9605\u8bfb\u300aPikiwiDB (Pika) \u6df7\u5408\u5b58\u50a8\u4e4b\u6279\u91cf\u67e5\u8be2\u300b \u3010\u94fe\u63a5\uff1a",(0,o.jsx)(i.a,{href:"https://mp.weixin.qq.com/s/KFLPruSdB66TMRxUfR9PbQ",children:"https://mp.weixin.qq.com/s/KFLPruSdB66TMRxUfR9PbQ"})," \u3011\u3002"]}),"\n",(0,o.jsx)(i.p,{children:"\u5173\u952e PR \uff1a"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:["Mget \u652f\u6301\u591a key \u67e5\u8be2\u7f13\u5b58, \u8bb0\u5f55\u672a\u547d\u4e2d\u7684 key \u53bb DB \u4e2d\u67e5\u8be2\uff0c\u63d0\u5347 Pika \u670d\u52a1\u7684\u8bfb\u6027\u80fd",(0,o.jsx)(i.br,{}),"\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2675",children:"https://github.com/OpenAtomFoundation/pika/pull/2675"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d Mget \u6ca1\u6709\u4f7f\u7528\u89e3\u6790 ttl \u7684\u51fd\u6570\u5bfc\u81f4\u51fa\u73b0\u90e8\u5206key\u7684ttl\u672a\u88ab\u66f4\u65b0\uff0c\u6570\u636e\u4e0d\u4e00\u81f4\u7684\u95ee\u9898",(0,o.jsx)(i.br,{}),"\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2730",children:"https://github.com/OpenAtomFoundation/pika/pull/2730"})]}),"\n"]}),"\n",(0,o.jsx)(i.p,{children:"1.3 \u4e3b\u4ece\u590d\u5236"}),"\n",(0,o.jsx)(i.p,{children:'Pika v3.3.6 \u6709\u5f88\u591a\u4e3b\u4ece\u590d\u5236\u7684\u7f3a\u9677\u3002v4.0.0 \u7248\u672c\u5bf9 Pika \u5168\u91cf\u590d\u5236\u53ca\u589e\u91cf\u590d\u5236\u8fdb\u884c\u4e86\u5927\u91cf\u4f18\u5316\u548c bug \u4fee\u590d\uff0c\u53d6\u5f97\u4e86\u975e\u5e38\u597d\u7684\u6548\u679c\u3002\n\u5e76\u5728 info \u547d\u4ee4\u4e2d\u8f93\u51fa\u4e86 "repl_connect_status" \u6307\u6807(PR 2638)\uff0c\u4ee5\u65b9\u4fbf\u7528\u6237\u66f4\u52a0\u660e\u786e\u6e05\u6670\u7684\u786e\u5b9a\u5f53\u524d\u7684\u4e3b\u4ece\u590d\u5236\u72b6\u6001\u3002'}),"\n",(0,o.jsx)(i.p,{children:"\u5173\u952e PR \uff1a"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d\u6279\u91cf\u6269\u5bb9\u65f6\uff0c\u591a\u4e2a slave \u540c\u65f6\u8fde\u63a5 master, \u77ed\u65f6\u95f4\u591a\u6b21 bgsave \u5bfc\u81f4\u90e8\u5206\u4ece\u8282\u70b9\u6570\u636e\u4e0d\u5b8c\u6574\u7684\u95ee\u9898",(0,o.jsx)(i.br,{}),"\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2746",children:"https://github.com/OpenAtomFoundation/pika/pull/2746"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d Spop \u5728\u5199 binlog \u65f6\u53ef\u80fd\u4f1a\u51fa\u73b0\u7ade\u6001\u95ee\u9898",(0,o.jsx)(i.br,{}),"\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2647",children:"https://github.com/OpenAtomFoundation/pika/pull/2647"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d\u591a DB \u4e0b\u5168\u91cf\u540c\u6b65\u8d85\u65f6\u540e\u4e0d\u91cd\u8bd5\u7684\u95ee\u9898",(0,o.jsx)(i.br,{}),"\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2667",children:"https://github.com/OpenAtomFoundation/pika/pull/2667"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d\u591a DB \u4e3b\u4ece\u8d85\u65f6\u573a\u666f\u4e0b\uff0c\u53ef\u80fd\u4f1a\u51fa\u73b0\u7a97\u53e3\u5d29\u6e83\u7684\u95ee\u9898",(0,o.jsx)(i.br,{}),"\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2666",children:"https://github.com/OpenAtomFoundation/pika/pull/2666"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d\u4e3b\u4ece\u540c\u6b65\u9650\u901f\u903b\u8f91\u4e2d\u91cd\u590d\u89e3\u9501\u7684\u95ee\u9898",(0,o.jsx)(i.br,{}),"\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2657",children:"https://github.com/OpenAtomFoundation/pika/pull/2657"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u91cd\u6784\u4e3b\u4ece\u590d\u5236\u6a21\u5f0f slave \u8282\u70b9\u7684\u4e3b\u4ece\u540c\u6b65\u7ebf\u7a0b\u6a21\u578b\uff0c\u5c3d\u53ef\u80fd\u51cf\u5c11 binlog \u6d88\u8d39\u963b\u585e\u95ee\u9898",(0,o.jsx)(i.br,{}),"\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2638",children:"https://github.com/OpenAtomFoundation/pika/pull/2638"})]}),"\n"]}),"\n",(0,o.jsx)(i.p,{children:"1.4 Redis Stream"}),"\n",(0,o.jsx)(i.p,{children:"Redis Stream \u7c7b\u4f3c\u4e8e\u6d88\u606f\u961f\u5217\uff08MQ\uff09\uff0c\u4ee5\u4fbf\u66f4\u5b89\u5168\u5730\u4f20\u9012\u6d88\u606f\u3002\u4e3a\u4e86\u786e\u4fdd\u6570\u636e\u7684\u5b89\u5168\u6027\uff0c\u5e95\u5c42\u5f15\u64ce BlackWidow \u548c Floyd \u4e2d\u7279\u522b\u6dfb\u52a0\u4e86\u5bf9 Stream \u6570\u636e\u7c7b\u578b\u7684\u652f\u6301\u3002\n\u5173\u952e PR\uff1a"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d pkpatternmatchdel \u547d\u4ee4\u4f7f\u7528\u9519\u8bef\u5bfc\u81f4\u7684 stream \u7c7b\u578b\u6570\u636e\u5220\u9664\u5f02\u5e38\u7684\u95ee\u9898",(0,o.jsx)(i.br,{}),"\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2726",children:"https://github.com/OpenAtomFoundation/pika/pull/2726"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d Keyspace \u547d\u4ee4\u672a\u8ba1\u7b97 Stream \u7c7b\u578b\u6570\u636e\u7684\u95ee\u9898",(0,o.jsx)(i.br,{}),"\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2705",children:"https://github.com/OpenAtomFoundation/pika/pull/2705"})]}),"\n"]}),"\n",(0,o.jsx)(i.p,{children:"1.5 Compaction"}),"\n",(0,o.jsx)(i.p,{children:"PikiwiDB(Pika) \u7684\u5e95\u5c42\u78c1\u76d8\u5b58\u50a8\u5f15\u64ce RocksDB \u5728\u8fdb\u884c compaction \u65f6\u4f1a\u663e\u8457\u5f71\u54cd PikiwiDB(Pika) \u7684\u8bfb\u5199\u6027\u80fd\u3002\u56e0\u6b64\uff0c\u63a7\u5236\u597d compaction \u662f\u4f18\u5316 Pika \u8bfb\u5199\u6027\u80fd\u7684\u5173\u952e\u3002"}),"\n",(0,o.jsx)(i.p,{children:"Floyd \u4f7f\u7528\u4e86 v8.7.3 \u7248\u672c\u7684 RocksDB\uff0c\u5f00\u653e\u4e86\u66f4\u591a RocksDB \u53c2\u6570\uff0c\u4ee5\u65b9\u4fbf\u7528\u6237\u4f18\u5316 RocksDB \u6027\u80fd\uff1a"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsx)(i.li,{children:"enable-partitioned-index-filters\uff1a \u652f\u6301\u52a0\u8f7d\u5206\u533a\u7d22\u5f15\u8fc7\u6ee4\u5668\uff0c\u52a0\u5feb RocksDB \u67e5\u627e\u901f\u5ea6\u3002"}),"\n",(0,o.jsx)(i.li,{children:"min-write-buffer-number-to-merge: \u9ed8\u8ba4\u503c\u4e3a 1\uff0c\u5982\u679c\u5c06\u6b64\u503c\u8bbe\u7f6e\u5f97\u66f4\u5927\uff0c\u610f\u5473\u7740\u9700\u8981\u66f4\u591a\u7684\u5199\u7f13\u51b2\u533a\u88ab\u586b\u6ee1\u540e\u624d\u8fdb\u884c flush\u3002\u8fd9\u6837\u53ef\u4ee5\u51cf\u5c11 flush \u7684\u9891\u7387\uff0c\u589e\u52a0\u6570\u636e\u5728\u5185\u5b58\u4e2d\u7684\u7d2f\u79ef\u91cf\uff0c\u4ece\u800c\u53ef\u80fd\u63d0\u9ad8\u5199\u5165\u541e\u5410\u91cf\u3002"}),"\n",(0,o.jsx)(i.li,{children:"level0-stop-writes-trigger: \u9ed8\u8ba4\u503c\u4e3a 36\uff0c\u5b9a\u4e49\u4e86 L0 \u5c42\u4e2d sst \u6587\u4ef6\u7684\u6700\u5927\u6570\u91cf\uff0c\u4e00\u65e6\u8fbe\u5230\u8fd9\u4e2a\u6570\u91cf\uff0cRocksDB \u5c06\u4f1a\u91c7\u53d6 \u6682\u505c\u5199\u5165\u3001\u5f3a\u5236 compaction \u7b49\u63aa\u65bd\u6765\u9632\u6b62\u5199\u5165\u64cd\u4f5c\u7ee7\u7eed\u7d2f\u79ef\uff0c\u4ee5\u907f\u514d L0 \u5c42\u53d8\u5f97\u8fc7\u4e8e\u5e9e\u5927\uff0c\u8fdb\u800c\u53ef\u80fd\u5bfc\u81f4\u5199\u5165\u653e\u5927\u3001\u67e5\u8be2\u6027\u80fd\u4e0b\u964d\u7b49\u95ee\u9898\u3002"}),"\n",(0,o.jsx)(i.li,{children:"level0-slowdown-writes-trigger\uff1a\u9ed8\u8ba4\u503c\u4e3a 20\uff0c\u7528\u4e8e\u63a7\u5236\u5f53 Level 0 \u7684 SST \u6587\u4ef6\u6570\u91cf\u8fbe\u5230\u8fd9\u4e2a\u9608\u503c\u65f6\uff0c\u89e6\u53d1\u5199\u51cf\u901f\uff08write slowdown\uff09\uff0c\u9632\u6b62 Level 0 \u7684\u6587\u4ef6\u6570\u91cf\u8fc7\u591a\uff0c\u5bfc\u81f4\u540e\u7eed compaction \u64cd\u4f5c\u7684\u538b\u529b\u8fc7\u5927\u3002"}),"\n",(0,o.jsx)(i.li,{children:"level0-file-num-compaction-trigger\uff1a\u9ed8\u8ba4\u503c\u4e3a 4\uff0c\u5f53 Level 0 \u7684 SST \u6587\u4ef6\u6570\u91cf\u8fbe\u5230\u8fd9\u4e2a\u53c2\u6570\u8bbe\u5b9a\u7684\u9608\u503c\u65f6\uff0cRocksDB \u4f1a\u5f00\u59cb\u6267\u884c compaction \u64cd\u4f5c\uff0c\u5c06 Level 0 \u7684\u6587\u4ef6\u5408\u5e76\u5230 Level 1\uff0c\u4ee5\u51cf\u5c11 Level 0 \u7684\u6587\u4ef6\u6570\u91cf\uff0c\u964d\u4f4e\u8bfb\u53d6\u5ef6\u8fdf\uff0c\u5e76\u4f18\u5316\u5b58\u50a8\u7a7a\u95f4\u7684\u5229\u7528\u7387\u3002"}),"\n",(0,o.jsx)(i.li,{children:"max-subcompactions\uff1a\u9ed8\u8ba4\u503c\u4e3a 1\uff0c\u7528\u4e8e\u63a7\u5236RocksDB \u4e2d\u5e76\u53d1\u6267\u884c\u7684 sub-compaction \u4efb\u52a1\u6570\u91cf\uff0c\u5176\u503c\u4e3a 1 \u8868\u793a\u5173\u95ed sub-compaction\u3002\u5982\u679c\u7cfb\u7edf\u8d44\u6e90\u5145\u8db3\uff0c\u5efa\u8bae\u63d0\u5347\u8be5\u53c2\u6570\u4ee5\u4f18\u5316 compaction \u6548\u7387\u3002"}),"\n",(0,o.jsx)(i.li,{children:"max-bytes-for-level-base\uff1a\u6307\u5b9a\u4e86 L1 SST \u6587\u4ef6\u603b\u7684\u5927\u5c0f\u3002\u8fd9\u4e2a\u5927\u5c0f\u662f RocksDB \u8fdb\u884c\u6570\u636e\u5206\u5c42\u7ba1\u7406\u548c compaction \u51b3\u7b56\u7684\u91cd\u8981\u4f9d\u636e\uff1a\u5982\u679c L1 \u5c42\u7684\u5927\u5c0f\u8bbe\u7f6e\u5f97\u592a\u5c0f\uff0c\u53ef\u80fd\u4f1a\u5bfc\u81f4 L0 \u5c42\u7684 compaction \u8fc7\u4e8e\u9891\u7e41\uff0c\u8fdb\u800c\u5f71\u54cd\u5199\u6027\u80fd\u3002\u53cd\u4e4b\uff0c\u5982\u679c\u8bbe\u7f6e\u5f97\u592a\u5927\uff0c\u53ef\u80fd\u4f1a\u5360\u7528\u8f83\u591a\u7684\u78c1\u76d8\u7a7a\u95f4\uff0c\u5e76\u4e14\u5f71\u54cd\u8bfb\u53d6\u6027\u80fd\uff0c\u56e0\u4e3a\u8bfb\u53d6\u64cd\u4f5c\u53ef\u80fd\u9700\u8981\u8de8\u8d8a\u66f4\u591a\u7684\u5c42\u7ea7\u3002Pika \u6ca1\u6709\u5728 pika.conf \u4e2d\u5f00\u653e\u6b64\u53c2\u6570\u7ed9\u7528\u6237\u914d\u7f6e\uff0c\u800c\u662f\u4f7f\u7528\u5176\u4ed6\u53c2\u6570\uff08level0-file-num-compaction-trigger \u548c write-buffer-size\uff09\u8ba1\u7b97\u540e\u7684\u7ed3\u679c\u3002"}),"\n"]}),"\n",(0,o.jsx)(i.p,{children:"storage_options_.options.max_bytes_for_level_base = g_pika_conf->level0_file_num_compaction_trigger() * g_pika_conf->write_buffer_size()"}),"\n",(0,o.jsxs)(i.p,{children:["\u5173\u952e PR\uff1a\n\u6dfb\u52a0 Floyd \u7684 compaction-filter \u7684 Gtest\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2669",children:"https://github.com/OpenAtomFoundation/pika/pull/2669"}),"\n\u6dfb\u52a0\u652f\u6301\u5206\u533a\u7d22\u5f15\u8fc7\u6ee4\u7684\u529f\u80fd\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2601",children:"https://github.com/OpenAtomFoundation/pika/pull/2601"}),"\n\u65b0\u589e RocksDB Compaction \u7b56\u7565\u52a8\u6001\u8c03\u6574\u53c2\u6570\uff0c\u7528\u6237\u53ef\u4ee5\u6839\u636e\u4e1a\u52a1\u8c03\u6574 Compaction \u7b56\u7565\uff0c\u964d\u4f4e Compaction \u64cd\u4f5c\u5bf9\u670d\u52a1\u6027\u80fd\u7684\u635f\u8017\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2538",children:"https://github.com/OpenAtomFoundation/pika/pull/2538"}),"\n1.6 \u53ef\u89c2\u6d4b\u6027\nv3.5 \u7248\u672c\u589e\u52a0\u4e86\u5305\u62ec\u547d\u4e2d\u7387\u3001\u6bcf\u79d2\u547d\u4e2d\u6b21\u6570\u3001Redis Cache \u5185\u5b58\u4f7f\u7528\u91cf\u3001Redis Cache \u4e2a\u6570\u3001Redis Cache DB \u4e2a\u6570 \u7b49\u6307\u6807\uff0c\u4f46\u662f\u5728\u96c6\u7fa4\u65b9\u9762\u7684\u53ef\u89c2\u6d4b\u6027\u662f\u7f3a\u5931\u7684\u3002v4.0.0 \u5bf9 Codis-Proxy \u7684 P99\u3001P999\u3001\u5ef6\u8fdf\u7b49\u76d1\u63a7\u6307\u6807\u8fdb\u884c\u91c7\u96c6\u548c\u5c55\u793a\uff0c\u53ef\u4ee5\u76f4\u89c2\u5730\u53cd\u6620\u7ebf\u4e0a Codis-proxy \u7684\u8fd0\u884c\u60c5\u51b5\u3002"]}),"\n",(0,o.jsx)(i.p,{children:"v4.0.0 \u5f00\u59cb\u8fd8\u63d0\u4f9b\u65b0\u7684\u5de5\u5177\uff1a\u6839\u636e pika benchmark \u5de5\u5177\u538b\u6d4b\u7ed3\u679c\u81ea\u52a8\u751f\u6210\u53ef\u89c6\u5316\u7684\u7edf\u8ba1\u56fe\u8868\u3002"}),"\n",(0,o.jsxs)(i.p,{children:["\u5173\u952e PR\uff1a\nCodis \u652f\u6301 info \u547d\u4ee4, \u53ef\u4ee5\u901a\u8fc7\u8be5\u547d\u4ee4\u67e5\u8be2 Codis-proxy \u7684 info \u4fe1\u606f\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2688",children:"https://github.com/OpenAtomFoundation/pika/pull/2688"}),"\nCodis-proxy \u65b0\u589e P99 P95 \u7b49\u76d1\u63a7\u8017\u65f6\u6307\u6807\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2668",children:"https://github.com/OpenAtomFoundation/pika/pull/2668"}),"\n\u6dfb\u52a0 Pika \u538b\u6d4b\u6307\u6807\uff0c\u63d0\u5347 Pika \u538b\u6d4b\u6548\u7387\uff0c\u5e76\u8f93\u51fa\u53ef\u89c6\u5316\u7684\u7edf\u8ba1\u56fe\u8868\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2663",children:"https://github.com/OpenAtomFoundation/pika/pull/2663"})]}),"\n",(0,o.jsxs)(i.p,{children:["1.7 \u6d4b\u8bd5\u96c6\nPikiwiDB(Pika) \u6d4b\u8bd5\u96c6\u7531 gtest \u5355\u6d4b\u3001Redis TCL \u6d4b\u8bd5\u96c6\u548c Go \u6d4b\u8bd5\u96c6\u7ec4\u6210\u3002v4.0.0 \u4e2d\u4e30\u5bcc\u4e86\u8bf8\u591a\u7279\u6027\u7684 go test \u529f\u80fd\uff0c\u5e76\u8fdb\u4e00\u6b65\u5b8c\u5584\u4e86\u57fa\u672c\u6570\u636e\u7c7b\u578b\u7684 TCL \u6d4b\u8bd5\u3002\n\u5173\u952e PR\uff1a\n\u6dfb\u52a0 Floyd \u7684 compaction-filter \u7684 Gtest\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2669",children:"https://github.com/OpenAtomFoundation/pika/pull/2669"}),"\nPika Geo \u6570\u636e\u7c7b\u578b\u589e\u52a0 TCL \u6d4b\u8bd5\uff0c\u5e76\u4fee\u590d\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9047\u5230\u7684\u7f3a\u9677\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2753",children:"https://github.com/OpenAtomFoundation/pika/pull/2753"}),"\n1.8 \u8de8\u5e73\u53f0\nPikiwiDB(Pika) \u4ee5\u5f80\u4ec5\u652f\u6301 centos \u548c ubuntu \u7b49 linux \u5e73\u53f0\uff0cv3.5 \u5f00\u59cb\u652f\u6301 Mac \u7b49\u5e73\u53f0\u3002v4.0.0 \u5c06\u5bf9 Mac \u5e73\u53f0\u7684\u652f\u6301\u6269\u5c55\u81f3 FreeBSD \u5e73\u53f0\u3002\n\u5173\u952e PR\uff1a\nPika \u652f\u6301\u5728 FreeBSD14 \u5e73\u53f0\u4e0a\u8fdb\u884c\u7f16\u8bd1\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2711",children:"https://github.com/OpenAtomFoundation/pika/pull/2711"}),"\n2 \u6539\u8fdb\u5217\u8868\n\u4e0b\u9762\u8be6\u7ec6\u5217\u51fa\u4e86\u672c\u6b21\u53d1\u7248\u7684\u4e3b\u8981\u529f\u80fd\u5347\u7ea7\u548c\u6539\u8fdb\u3002\n2.1 \u65b0\u7279\u6027"]}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:["Pika Geo \u6570\u636e\u7c7b\u578b\u589e\u52a0 TCL \u6d4b\u8bd5\uff0c\u5e76\u4fee\u590d\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9047\u5230\u7684\u7f3a\u9677\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2753",children:"https://github.com/OpenAtomFoundation/pika/pull/2753"})]}),"\n",(0,o.jsxs)(i.li,{children:["Pika \u652f\u6301\u5728 FreeBSD14 \u5e73\u53f0\u4e0a\u8fdb\u884c\u7f16\u8bd1\u6253\u5305\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2711",children:"https://github.com/OpenAtomFoundation/pika/pull/2711"})]}),"\n",(0,o.jsxs)(i.li,{children:["Pika \u7ebf\u7a0b\u6574\u7406\uff0c\u907f\u514d\u542f\u52a8\u8fc7\u591a\u65e0\u7528\u7ebf\u7a0b\uff0c\u5bf9\u4e0d\u540c\u7684\u7ebf\u7a0b\u8fdb\u884c\u547d\u540d\uff0c\u65b9\u4fbf\u95ee\u9898\u5b9a\u4f4d\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2697",children:"https://github.com/OpenAtomFoundation/pika/pull/2697"})]}),"\n",(0,o.jsxs)(i.li,{children:["Mget \u652f\u6301\u591a key \u67e5\u8be2\u7f13\u5b58, \u8bb0\u5f55\u672a\u547d\u4e2d\u7684 key \u53bb DB \u4e2d\u67e5\u8be2\uff0c\u63d0\u5347 Pika \u670d\u52a1\u7684\u8bfb\u6027\u80fd\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2675",children:"https://github.com/OpenAtomFoundation/pika/pull/2675"})]}),"\n",(0,o.jsxs)(i.li,{children:["Codis \u652f\u6301 info \u547d\u4ee4, \u53ef\u4ee5\u901a\u8fc7\u8be5\u547d\u4ee4\u67e5\u8be2 Codis-proxy \u7684 info \u4fe1\u606f\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2688",children:"https://github.com/OpenAtomFoundation/pika/pull/2688"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u6dfb\u52a0 Floyd \u7684 compaction-filter \u7684 Gtest\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2669",children:"https://github.com/OpenAtomFoundation/pika/pull/2669"})]}),"\n",(0,o.jsxs)(i.li,{children:["Codis-proxy \u65b0\u589e P99 P95 \u7b49\u76d1\u63a7\u8017\u65f6\u6307\u6807\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2668",children:"https://github.com/OpenAtomFoundation/pika/pull/2668"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u6dfb\u52a0 Pika \u538b\u6d4b\u6307\u6807\uff0c\u63d0\u5347 Pika \u538b\u6d4b\u6548\u7387\uff0c\u5e76\u8f93\u51fa\u53ef\u89c6\u5316\u7684\u7edf\u8ba1\u56fe\u8868\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2663",children:"https://github.com/OpenAtomFoundation/pika/pull/2663"})]}),"\n",(0,o.jsxs)(i.li,{children:["Pika \u4e3b\u4ece\u590d\u5236\u65b0\u589e\u76d1\u63a7\u6307\u6807 repl_connect_status, \u53ef\u4ee5\u66f4\u52a0\u660e\u786e\u6e05\u6670\u7684\u786e\u5b9a\u5f53\u524d\u7684\u4e3b\u4ece\u590d\u5236\u7684\u72b6\u6001\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2638",children:"https://github.com/OpenAtomFoundation/pika/pull/2638"})]}),"\n",(0,o.jsxs)(i.li,{children:["Pika \u4e0d\u652f\u6301\u4e0d\u540c\u7c7b\u578b\u7684\u91cd\u590d key, \u5199\u5165\u91cd\u590d key \u8fd4\u56de\u975e\u6cd5\u7c7b\u578b\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2609",children:"https://github.com/OpenAtomFoundation/pika/pull/2609"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u6dfb\u52a0\u652f\u6301\u5206\u533a\u7d22\u5f15\u8fc7\u6ee4\u7684\u529f\u80fd\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2601",children:"https://github.com/OpenAtomFoundation/pika/pull/2601"})]}),"\n",(0,o.jsxs)(i.li,{children:["Pika \u652f\u6301\u7b2c\u4e09\u4ee3\u5b58\u50a8\u5f15\u64ce Floyd, \u901a\u8fc7\u652f\u6301\u591a rocksdb \u5b9e\u4f8b\u3001\u5bf9 Blob \u7684\u4f7f\u7528\u8fdb\u884c\u4f18\u5316\u3001\u5bf9\u8fc7\u671f\u6570\u636e\u7684\u6e05\u7406\u8fdb\u884c\u4f18\u5316\uff0c\u63d0\u5347\u4e86 Pika \u5b9e\u4f8b\u7684\u8bfb\u5199\u6027\u80fd\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2413",children:"https://github.com/OpenAtomFoundation/pika/pull/2413"})]}),"\n"]}),"\n",(0,o.jsx)(i.p,{children:"2.2 bug \u4fee\u590d"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d iter \u672a\u88ab\u6790\u6784\uff0c\u5bfc\u81f4 pkpatternmatchdel \u5728\u8fd4\u56de\u4e4b\u524d\u4e0d\u4f1a\u5220\u9664 iter\uff0c\u8fd9\u53ef\u80fd\u4f1a\u5bfc\u81f4 rocksdb \u6c38\u8fdc\u5f15\u7528\u4e00\u4e2a\u7248\u672c\uff0c\u5bfc\u81f4\u6570\u636e\u4e0d\u7b26\u5408\u9884\u671f\u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2785",children:"https://github.com/OpenAtomFoundation/pika/pull/2785"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d config \u53c2\u6570 min-blob-size \u5e26\u5355\u4f4d\u65f6\u89e3\u6790\u9519\u8bef\u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2767",children:"https://github.com/OpenAtomFoundation/pika/pull/2767"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d zverank \u8fd4\u56de\u503c\u5f02\u5e38\u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2673",children:"https://github.com/OpenAtomFoundation/pika/pull/2673"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d Pika-port \u4f20\u8f93\u6570\u636e\u8fc7\u7a0b\u4e2d\u62a5\u9519\u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2758",children:"https://github.com/OpenAtomFoundation/pika/pull/2758"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d\u56e0\u4e3a\u5806\u4e0a\u5206\u914d\u7684\u7f13\u51b2\u533a\u8d8a\u754c\u5bfc\u81f4 Dbsize \u547d\u4ee4\u8fd0\u884c\u65f6\u5d29\u6e83\u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2749",children:"https://github.com/OpenAtomFoundation/pika/pull/2749"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d\u6279\u91cf\u6269\u5bb9\u65f6\uff0c\u591a\u4e2a slave \u540c\u65f6\u8fde\u63a5 master, \u77ed\u65f6\u95f4\u591a\u6b21 bgsave \u5bfc\u81f4\u90e8\u5206\u4ece\u8282\u70b9\u6570\u636e\u4e0d\u5b8c\u6574\u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2746",children:"https://github.com/OpenAtomFoundation/pika/pull/2746"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d\u53c2\u6570\u672a\u521d\u59cb\u5316\u5bfc\u81f4 slotsscan \u7b49\u547d\u4ee4\u4e0d\u80fd\u548c bgsave \u547d\u4ee4\u76f8\u4e92\u5236\u8861\u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2745",children:"https://github.com/OpenAtomFoundation/pika/pull/2745"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d Slotmigrate \u8fc1\u79fb\u6570\u636e\u7684\u8fc7\u7a0b\u4e2d\uff0c\u8fd4\u56de\u503c\u8bbe\u7f6e\u9519\u8bef\uff0c\u5f02\u5e38\u573a\u666f\u4e0b\u4f1a\u7ec8\u6b62\u6570\u636e\u8fc1\u79fb\u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2741",children:"https://github.com/OpenAtomFoundation/pika/pull/2741"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d Mget \u6ca1\u6709\u4f7f\u7528\u89e3\u6790 ttl \u7684\u51fd\u6570\u5bfc\u81f4\u51fa\u73b0\u90e8\u5206key\u7684ttl\u672a\u88ab\u66f4\u65b0\uff0c\u6570\u636e\u4e0d\u4e00\u81f4\u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2730",children:"https://github.com/OpenAtomFoundation/pika/pull/2730"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d pkpatternmatchdel \u547d\u4ee4\u4f7f\u7528\u9519\u8bef\u5bfc\u81f4\u7684 stream \u7c7b\u578b\u6570\u636e\u5220\u9664\u5f02\u5e38\u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2726",children:"https://github.com/OpenAtomFoundation/pika/pull/2726"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d pkpatternmatchdel \u4e0d\u80fd\u6b63\u786e\u5220\u9664\u6389\u5bf9\u5e94\u7684 keys \u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2717",children:"https://github.com/OpenAtomFoundation/pika/pull/2717"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d ACL \u5bc6\u7801\u9a8c\u8bc1\u9519\u8bef\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2714",children:"https://github.com/OpenAtomFoundation/pika/pull/2714"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d Keyspace \u547d\u4ee4\u672a\u8ba1\u7b97 Stream \u7c7b\u578b\u6570\u636e\u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2705",children:"https://github.com/OpenAtomFoundation/pika/pull/2705"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u5bf9\u90e8\u5206\u547d\u4ee4\u5b9a\u5236\u5316\u5904\u7406\u903b\u8f91\uff0c\u907f\u514d\u5199 binlog \u5bfc\u81f4\u4ece\u8282\u70b9\u7684 binlog \u89e3\u6790\u5931\u8d25\u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2793",children:"https://github.com/OpenAtomFoundation/pika/pull/2793"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d Pika cmdID \u8d4b\u503c\u5728 Cmd \u521d\u59cb\u51fd\u6570\u4e2d\uff0c\u53ef\u80fd\u4f1a\u5bfc\u81f4\u5e76\u53d1\u6784\u9020\u7684\u65f6\u5019\u51fa\u73b0\u5185\u5b58\u6cc4\u6f0f\u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2692",children:"https://github.com/OpenAtomFoundation/pika/pull/2692"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d ExpectedStale \u672a\u8003\u8651 String \u7c7b\u578b, \u5982\u679c\u5b58\u5728\u5df2\u7ecf\u8fc7\u671f\u7684 String \u7c7b\u578b\u7684 key, ExpectedStale \u4f1a\u8fd4\u56de\u9519\u8bef\u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2682",children:"https://github.com/OpenAtomFoundation/pika/pull/2682"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d Spop \u5728\u5199 binlog \u65f6\u53ef\u80fd\u4f1a\u51fa\u73b0\u7ade\u6001\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2674",children:"https://github.com/OpenAtomFoundation/pika/pull/2674"})]}),"\n",(0,o.jsxs)(i.li,{children:["db instance \u8bbe\u7f6e\u4e0d\u5408\u7406\u65f6\uff0c\u7ed9\u7528\u6237\u9519\u8bef\u63d0\u793a\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2672",children:"https://github.com/OpenAtomFoundation/pika/pull/2672"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d server_stat \u4e2d\u7684\u6570\u636e\u7ade\u6001\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2671",children:"https://github.com/OpenAtomFoundation/pika/pull/2671"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d\u591a DB \u4e0b\u5168\u91cf\u540c\u6b65\u8d85\u65f6\u540e\u4e0d\u91cd\u8bd5\u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2667",children:"https://github.com/OpenAtomFoundation/pika/pull/2667"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d\u591a DB \u4e0b\u5168\u91cf\u540c\u6b65\u8d85\u65f6\u540e\u4e0d\u91cd\u8bd5\u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2666",children:"https://github.com/OpenAtomFoundation/pika/pull/2666"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d\u4e3b\u4ece\u540c\u6b65\u9650\u901f\u903b\u8f91\u4e2d\u91cd\u590d\u89e3\u9501\u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2657",children:"https://github.com/OpenAtomFoundation/pika/pull/2657"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u53d1\u7248\u652f\u6301\u81ea\u52a8\u6253\u5305 centos7 \u548c centos8 \u5e73\u53f0\u7684\u4e8c\u8fdb\u5236\u7f16\u8bd1\u5305\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2535",children:"https://github.com/OpenAtomFoundation/pika/pull/2535"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d Codis \u4fa7\u7684 getrange \u547d\u4ee4\u6ca1\u6709\u8fd4\u56de\u9884\u671f\u7ed3\u679c\u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2510",children:"https://github.com/OpenAtomFoundation/pika/pull/2510"})]}),"\n"]}),"\n",(0,o.jsx)(i.p,{children:"2.3 \u63d0\u5347\u6539\u8fdb\u9879"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:["\u66f4\u65b0 Pika Docker Readme, \u53ef\u4ee5\u6309\u7167 Readme \u5728 Docker \u4e2d\u90e8\u7f72 Pika \u670d\u52a1\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2743",children:"https://github.com/OpenAtomFoundation/pika/pull/2743"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4f18\u5316\u91cd\u590d\u67e5\u8be2 meta value \u5bfc\u81f4\u5f71\u54cd Pika \u670d\u52a1\u8bfb\u5199\u6027\u80fd\u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2735",children:"https://github.com/OpenAtomFoundation/pika/pull/2735"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u652f\u6301\u5bf9\u66f4\u591a\u7684 RocksDB \u53c2\u6570\u8fdb\u884c\u52a8\u6001\u8c03\u6574\uff0c\u7528\u6237\u6839\u636e\u4e0d\u540c\u7684\u4e1a\u52a1\u4f7f\u7528\u573a\u666f\u8c03\u6574\u53c2\u6570\u63d0\u5347 Pika \u7684\u8bfb\u5199\u6027\u80fd\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2728",children:"https://github.com/OpenAtomFoundation/pika/pull/2728"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u5bf9 HyperLogLog \u548c String \u8fdb\u884c\u7c7b\u578b\u9694\u79bb\uff0c\u786e\u4fdd HyperLogLog \u64cd\u4f5c\u4e0e String \u64cd\u4f5c\u660e\u786e\u533a\u5206\u5f00\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2720",children:"https://github.com/OpenAtomFoundation/pika/pull/2720"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u66f4\u65b0\u4e86 PR \u6807\u9898\u9a8c\u8bc1\uff0c\u4e0d\u5141\u8bb8\u5728\u6807\u9898\u672b\u5c3e\u51fa\u73b0\u4e2d\u6587\u5b57\u7b26\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2718",children:"https://github.com/OpenAtomFoundation/pika/pull/2718"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u91cd\u6784\u4e3b\u4ece\u590d\u5236\u6a21\u5f0f slave \u8282\u70b9\u7684\u4e3b\u4ece\u540c\u6b65\u7ebf\u7a0b\u6a21\u578b\uff0c\u5c3d\u53ef\u80fd\u51cf\u5c11 binlog \u6d88\u8d39\u963b\u585e\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2638",children:"https://github.com/OpenAtomFoundation/pika/pull/2638"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u65b0\u589e RocksDB Compaction \u7b56\u7565\u52a8\u6001\u8c03\u6574\u53c2\u6570\uff0c\u7528\u6237\u53ef\u4ee5\u6839\u636e\u4e1a\u52a1\u8c03\u6574 Compaction \u7b56\u7565\uff0c\u964d\u4f4e Compaction \u64cd\u4f5c\u5bf9\u670d\u52a1\u6027\u80fd\u7684\u635f\u8017\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2538",children:"https://github.com/OpenAtomFoundation/pika/pull/2538"})]}),"\n"]}),"\n",(0,o.jsx)(i.p,{children:"2.4 \u53d1\u7248 tag"}),"\n",(0,o.jsxs)(i.p,{children:[(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/releases/tag/v4.0.0",children:"https://github.com/OpenAtomFoundation/pika/releases/tag/v4.0.0"}),"\n3 \u793e\u533a\n\u611f\u8c22\u6240\u6709\u4e3a v4.0.0 \u505a\u51fa\u8d21\u732e\u7684\u793e\u533a\u6210\u5458\uff0c\u5305\u62ec issue/PR \u63d0\u4ea4\u8005\u3001\u4ee3\u7801 reviewer \u3010\u6392\u540d\u4e0d\u5206\u5148\u540e\uff0c\u4f9d\u636e\u5b57\u6bcd\u5e8f\u5217\u3011\uff1a"]}),"\n",(0,o.jsx)(i.p,{children:"AlexStocks"}),"\n",(0,o.jsx)(i.p,{children:"baerwang"}),"\n",(0,o.jsx)(i.p,{children:"chejinge"}),"\n",(0,o.jsx)(i.p,{children:"cheniujh"}),"\n",(0,o.jsx)(i.p,{children:"chienguo"}),"\n",(0,o.jsx)(i.p,{children:"guangkun123"}),"\n",(0,o.jsx)(i.p,{children:"gukj-spel"}),"\n",(0,o.jsx)(i.p,{children:"longfar-ncy"}),"\n",(0,o.jsx)(i.p,{children:"lqxhub"}),"\n",(0,o.jsx)(i.p,{children:"luky116"}),"\n",(0,o.jsx)(i.p,{children:"Mixficsol"}),"\n",(0,o.jsx)(i.p,{children:"saz97"}),"\n",(0,o.jsx)(i.p,{children:"wangshao1"}),"\n",(0,o.jsx)(i.p,{children:"PikiwiDB (Pika) \u5f00\u6e90\u793e\u533a\u70ed\u70c8\u6b22\u8fce\u60a8\u7684\u53c2\u4e0e\u548c\u652f\u6301\u3002\u5982\u679c\u60a8\u6709\u4efb\u4f55\u95ee\u9898\u3001\u610f\u89c1\u6216\u5efa\u8bae\uff0c\u8bf7\u626b\u7801\u6dfb\u52a0 PikiwiDB \u5c0f\u52a9\u624b\u3010\u5fae\u4fe1\u53f7: PikiwiDB\u3011\u4e3a\u597d\u53cb\uff0c\u5b83\u4f1a\u62c9\u60a8\u52a0\u5165\u5b98\u65b9\u5fae\u4fe1\u7fa4\u3002"}),"\n",(0,o.jsx)(i.p,{children:(0,o.jsx)(i.img,{alt:"2024-07-08-PikiwiDB(Pika)-4.0.0-connect",src:t(3654).A+"",width:"747",height:"431"})})]})}function c(n={}){const{wrapper:i}={...(0,e.R)(),...n.components};return i?(0,o.jsx)(i,{...n,children:(0,o.jsx)(u,{...n})}):u(n)}},3654:(n,i,t)=>{t.d(i,{A:()=>o});const o=t.p+"assets/images/2024-07-08-PikiwiDB(Pika)-4.0.0-connect-c43aca0eeeb5cd09cc60b55f9a3df4e5.png"},9805:(n,i,t)=>{t.d(i,{A:()=>o});const o=t.p+"assets/images/2024-07-08-PikiwiDB(Pika)-4.0.0-key-357e46564ca61e525f598aa7ac52b886.png"},8453:(n,i,t)=>{t.d(i,{R:()=>l,x:()=>s});var o=t(6540);const e={},p=o.createContext(e);function l(n){const i=o.useContext(p);return o.useMemo((function(){return"function"==typeof n?n(i):{...i,...n}}),[i,n])}function s(n){let i;return i=n.disableParentContext?"function"==typeof n.components?n.components(e):n.components||e:l(n.components),o.createElement(p.Provider,{value:i},n.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/5e95c892.4ef812a6.js b/build/assets/js/5e95c892.4ef812a6.js new file mode 100644 index 0000000..855e23a --- /dev/null +++ b/build/assets/js/5e95c892.4ef812a6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[9647],{7121:(e,i,s)=>{s.r(i),s.d(i,{default:()=>t});s(6540);var r=s(4164),a=s(1213),u=s(7559),c=s(2831),k=s(781),n=s(4848);function t(e){return(0,n.jsx)(a.e3,{className:(0,r.A)(u.G.wrapper.docsPages),children:(0,n.jsx)(k.A,{children:(0,c.v)(e.route.routes)})})}}}]); \ No newline at end of file diff --git a/build/assets/js/6533aa10.2ec72a61.js b/build/assets/js/6533aa10.2ec72a61.js new file mode 100644 index 0000000..1729681 --- /dev/null +++ b/build/assets/js/6533aa10.2ec72a61.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[5491],{3458:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>o,contentTitle:()=>r,default:()=>x,frontMatter:()=>l,metadata:()=>s,toc:()=>c});var d=i(4848),t=i(8453);const l={title:"\u526f\u672c\u4e00\u81f4\u6027",sidebar_position:6},r=void 0,s={id:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u526f\u672c\u4e00\u81f4\u6027/index",title:"\u526f\u672c\u4e00\u81f4\u6027",description:"\u76ee\u524d\u7ebf\u7a0b\u6a21\u578b",source:"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u526f\u672c\u4e00\u81f4\u6027/index.md",sourceDirName:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u526f\u672c\u4e00\u81f4\u6027",slug:"/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u526f\u672c\u4e00\u81f4\u6027/",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u526f\u672c\u4e00\u81f4\u6027/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u526f\u672c\u4e00\u81f4\u6027/index.md",tags:[],version:"current",sidebarPosition:6,frontMatter:{title:"\u526f\u672c\u4e00\u81f4\u6027",sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"\u4e3b\u4ece\u540c\u6b65",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u4e3b\u4ece\u540c\u6b65/"},next:{title:"Pika \u4e0e Codis",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4e0e Codis/"}},o={},c=[{value:"\u76ee\u524d\u7ebf\u7a0b\u6a21\u578b",id:"\u76ee\u524d\u7ebf\u7a0b\u6a21\u578b",level:2},{value:"Binlog Header \u53d8\u52a8",id:"binlog-header-\u53d8\u52a8",level:2},{value:"\u4e00\u81f4\u6027\u534f\u8bae\u7684\u4e09\u9636\u6bb5",id:"\u4e00\u81f4\u6027\u534f\u8bae\u7684\u4e09\u9636\u6bb5",level:2},{value:"\u65e5\u5fd7\u590d\u5236",id:"\u65e5\u5fd7\u590d\u5236",level:2},{value:"\u65e5\u5fd7\u6062\u590d\uff1a",id:"\u65e5\u5fd7\u6062\u590d",level:2},{value:"\u65e5\u5fd7\u534f\u5546\uff1a",id:"\u65e5\u5fd7\u534f\u5546",level:2},{value:"\u5173\u4e8e\u9009\u4e3b\u548c\u6210\u5458\u53d8\u6362",id:"\u5173\u4e8e\u9009\u4e3b\u548c\u6210\u5458\u53d8\u6362",level:2}];function a(e){const n={a:"a",code:"code",h2:"h2",img:"img",p:"p",pre:"pre",...(0,t.R)(),...e.components};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(n.h2,{id:"\u76ee\u524d\u7ebf\u7a0b\u6a21\u578b",children:"\u76ee\u524d\u7ebf\u7a0b\u6a21\u578b"}),"\n",(0,d.jsx)(n.p,{children:"\u975e\u4e00\u81f4\u6027\u573a\u666f"}),"\n",(0,d.jsx)(n.p,{children:"1\uff0c\u5ba2\u6237\u7aef\u8bf7\u6c42\u52a0\u9501\u5199\u5165 db \u548c binlog \u6587\u4ef6"}),"\n",(0,d.jsx)(n.p,{children:"2\uff0c\u5c06\u7ed3\u679c\u8fd4\u56de\u5ba2\u6237\u7aef"}),"\n",(0,d.jsx)(n.p,{children:"3\uff0c\u901a\u8fc7\u53d1\u9001 BinlogSync \u8bf7\u6c42\u5411\u4ece\u5e93\u540c\u6b65"}),"\n",(0,d.jsx)(n.p,{children:"4\uff0c\u4ece\u5e93\u8fd4\u56de BinlogSyncAck \u62a5\u544a\u540c\u6b65\u72b6\u51b5"}),"\n",(0,d.jsx)(n.p,{children:(0,d.jsx)(n.img,{src:"https://camo.githubusercontent.com/176a1e24eb8376f4a8e9021ac8b552d8f4c58e913ef6234c19e42d08a940fb37/68747470733a2f2f73312e617831782e636f6d2f323032302f30332f32372f47505666426a2e706e67",alt:""})}),"\n",(0,d.jsx)(n.p,{children:"\u4e00\u81f4\u6027\u573a\u666f"}),"\n",(0,d.jsx)(n.p,{children:"1\uff0c\u5ba2\u6237\u7aef\u8bf7\u6c42\u5148\u5199\u5165 binlog \u6587\u4ef6"}),"\n",(0,d.jsx)(n.p,{children:"2\uff0c\u901a\u8fc7\u53d1\u9001 BinlogSync \u8bf7\u6c42\u5411\u4ece\u5e93\u540c\u6b65"}),"\n",(0,d.jsx)(n.p,{children:"3\uff0c\u4ece\u5e93\u8fd4\u56de BinlogSyncAck \u62a5\u544a\u540c\u6b65\u72b6\u51b5"}),"\n",(0,d.jsx)(n.p,{children:"4\uff0c\u5c06\u76f8\u5e94\u7684\u8bf7\u6c42\u5199\u5165 db"}),"\n",(0,d.jsx)(n.p,{children:"5\uff0c\u5c06\u7ed3\u679c\u8fd4\u56de\u5ba2\u6237\u7aef"}),"\n",(0,d.jsx)(n.p,{children:(0,d.jsx)(n.img,{src:"https://camo.githubusercontent.com/af1f39adb0c4225c2774dff237b5e0f67df605df8e718caf0cb3beaa2a3ee2e3/68747470733a2f2f73312e617831782e636f6d2f323032302f30332f32372f475056494e712e706e67",alt:""})}),"\n",(0,d.jsx)(n.h2,{id:"binlog-header-\u53d8\u52a8",children:"Binlog Header \u53d8\u52a8"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{children:"/*\n* *****************Type First Binlog Item Format******************\n* |||||||||\n* | 2 | 4 | 4 | 8 | 4 | 8 | 4 | ... |\n* |----------------------------------------- 34 Bytes ------------------------------------|\n*/\n"})}),"\n",(0,d.jsxs)(n.p,{children:["\u5176\u4e2d TermId, \u548c Logic id \u662f\u6cbf\u7528",(0,d.jsx)(n.a,{href:"https://raft.github.io/raft.pdf",children:"Raft"}),"\u8bba\u6587\u4e2d term \u548c log index \u7684\u6982\u5ff5\u3002\u5177\u4f53\u7684\u8be6\u89c1\u8bba\u6587\u3002"]}),"\n",(0,d.jsx)(n.p,{children:"\u5176\u4e2d File Num \u548c offset \u662f\u672c\u6761 binlog \u5728\u6587\u4ef6\u4e2d\u7684\u504f\u79fb\u91cf\u3002"}),"\n",(0,d.jsx)(n.p,{children:'Pika \u7684 Binlog \u5b58\u5728\u7684\u610f\u4e49\u662f\u4e3a\u4e86\u4fdd\u8bc1\u4e3b\u4ece\u80fd\u591f\u589e\u91cf\u540c\u6b65\uff0c\u800c Raft Log \u5b58\u5728\u7684\u610f\u4e49\u662f\u4e3a\u4e86\u4fdd\u8bc1 Leader \u548c Follower \u7684\u6570\u636e\u591f\u4e00\u81f4\u3002\u67d0\u79cd\u610f\u4e49\u4e0a\u8bf4\u8fd9\u4e24\u4e2a"Log"\u7684\u6982\u5ff5\u662f\u4e00\u6837\u7684\uff0c\u6240\u4ee5\u5728\u5b9e\u73b0\u4e0a\uff0c\u5c06 binlog \u548c Raft Log \u590d\u7528\u6210\u4e00\u6761 log\uff0c\u76ee\u524d\u7684 binlog header \u4e2d Term Id \u548c Logic Id \u5c5e\u4e8e Raft Log\uff08\u7b80\u79f0\u65e5\u5fd7\uff09\u7684\u4fe1\u606f\uff0c\u800c File Num \u548c Offset \u5c5e\u4e8e Binlog \u7684\u4fe1\u606f\u3002'}),"\n",(0,d.jsx)(n.h2,{id:"\u4e00\u81f4\u6027\u534f\u8bae\u7684\u4e09\u9636\u6bb5",children:"\u4e00\u81f4\u6027\u534f\u8bae\u7684\u4e09\u9636\u6bb5"}),"\n",(0,d.jsx)(n.p,{children:"\u65e5\u5fd7\u6062\u590d\u548c\u590d\u5236\u57fa\u672c\u6309\u7167 Raft \u8bba\u6587\u5f53\u4e2d\u6240\u505a\u64cd\u4f5c\uff0c\u8fd9\u91cc\u4e0d\u505a\u8fc7\u591a\u89e3\u91ca\u3002\u5b9e\u73b0\u4e0a\uff0c\u8fd9\u91cc\u5206\u4e3a\u4e09\u4e2a\u9636\u6bb5\u3002\u5206\u522b\u662f\u65e5\u5fd7\u7684\u590d\u5236\uff0c\u65e5\u5fd7\u7684\u6062\u590d\uff0c\u65e5\u5fd7\u7684\u534f\u5546\u3002"}),"\n",(0,d.jsx)(n.p,{children:"\u719f\u6089 Raft \u534f\u8bae\u7684\u8bfb\u8005\u53ef\u80fd\u4f1a\u53d1\u73b0\uff0c\u8fd9\u91cc\u7684\u4e09\u4e2a\u9636\u6bb5\u8ddf Raft \u65e5\u5fd7\u590d\u5236\u4e0d\u662f\u5b8c\u5168\u4e00\u6837\u3002\u5728 Pika \u7684\u5b9e\u73b0\u5f53\u4e2d\uff0c\u57fa\u4e8e pika \u73b0\u6709\u7684\u4ee3\u7801\u7ed3\u6784\uff0c\u6211\u4eec\u628a Leader \u548c Follower \u540c\u6b65\u70b9\u4f4d\u56de\u9000\u7684\u903b\u8f91\u5355\u72ec\u63d0\u53d6\u51fa\u6765\uff0c\u5f62\u6210\u4e86 Pika Trsysync \u7684\u72b6\u6001\u3002\u4efb\u4f55\u65e5\u5fd7\u7684\u590d\u5236\u51fa\u9519\uff0cpika \u4f1a\u7ec8\u6b62\u5f53\u524d\u7684\u65e5\u5fd7\u590d\u5236\uff08BinlogSync\uff09\u72b6\u6001\uff0c\u8f6c\u800c\u5c06\u72b6\u6001\u673a\u8f6c\u5316\u6210 Trysync \u7684\u72b6\u6001\uff0c\u8fdb\u800c Leader \u548c Follower \u4f1a\u8fdb\u5165\u65e5\u5fd7\u7684\u534f\u5546\u903b\u8f91\u3002\u534f\u5546\u6210\u529f\u4e4b\u540e\u4f1a\u8f6c\u5165\u65e5\u5fd7\u590d\u5236\u7684\u903b\u8f91\u3002"}),"\n",(0,d.jsx)(n.p,{children:(0,d.jsx)(n.img,{src:"https://camo.githubusercontent.com/6be0f7496a5ea6cde8f6a7adfbb33b1734c757774e8933b085a78087992c13ac/68747470733a2f2f73312e617831782e636f6d2f323032302f30332f32372f4750566c37522e706e67",alt:""})}),"\n",(0,d.jsx)(n.h2,{id:"\u65e5\u5fd7\u590d\u5236",children:"\u65e5\u5fd7\u590d\u5236"}),"\n",(0,d.jsx)(n.p,{children:"\u65e5\u5fd7\u7684\u903b\u8f91\u7ed3\u6784\u5982\u4e0b\uff0c\u4e0a\u9762\u90e8\u5206\u662f Leader \u53ef\u80fd\u7684 log \u70b9\u4f4d\uff0c\u4e0b\u90e8\u5206\u662f Follower \u53ef\u80fd\u7684 log \u70b9\u4f4d\u3002"}),"\n",(0,d.jsx)(n.p,{children:(0,d.jsx)(n.img,{src:"https://camo.githubusercontent.com/a6697bf289c4d88e342498320e5e1a34057d5e8f8264d11deee696753489175b/68747470733a2f2f73312e617831782e636f6d2f323032302f30332f32372f4750564833542e706e67",alt:""})}),"\n",(0,d.jsx)(n.p,{children:"1\uff0c\u65e5\u5fd7\u7684\u590d\u5236\u7684\u903b\u8f91\u53ef\u4ee5\u53c2\u8003 Raft \u534f\u8bae\u7684\u903b\u8f91\uff0c\u8fd9\u91cc\u4e3e\u4f8b\u8bf4\u8bf4\u660e\u5ba2\u6237\u7aef\u4ece\u8bf7\u6c42\u5230\u8fd4\u56de\uff0c\u65e5\u5fd7\u7ecf\u8fc7\u4e86\u600e\u6837\u7684\u6d41\u7a0b\u3002"}),"\n",(0,d.jsx)(n.p,{children:"Leader Status:"}),"\n",(0,d.jsx)(n.p,{children:"Committed Index : 10"}),"\n",(0,d.jsx)(n.p,{children:"Applied Index\uff1a8"}),"\n",(0,d.jsx)(n.p,{children:"Last Index: 15"}),"\n",(0,d.jsx)(n.p,{children:"Follower Status:"}),"\n",(0,d.jsx)(n.p,{children:"Committed Index : 7"}),"\n",(0,d.jsx)(n.p,{children:"Applied Index\uff1a5"}),"\n",(0,d.jsx)(n.p,{children:"LastIndex: 12"}),"\n",(0,d.jsx)(n.p,{children:"2\uff0c\u5f53 Leader \u53d1\u9001 13-15 \u7684\u65e5\u5fd7\u5230 Follower \u7684\u65f6\u5019\uff0cFollower \u7684\u72b6\u6001\u4f1a\u505a\u5982\u4e0b\u66f4\u65b0\uff1a"}),"\n",(0,d.jsx)(n.p,{children:"Follower Status:"}),"\n",(0,d.jsx)(n.p,{children:"Committed Index : 10"}),"\n",(0,d.jsx)(n.p,{children:"Applied Index\uff1a5"}),"\n",(0,d.jsx)(n.p,{children:"LastIndex: 15"}),"\n",(0,d.jsx)(n.p,{children:"\u8fd9\u65f6\u5019\u65e5\u5fd7 6-10 \u90fd\u662f\u53ef\u4ee5\u88ab\u5e94\u7528\u5230\u72b6\u6001\u673a\u7684\u3002\u4f46\u662f\u5bf9\u4e8e\u65e5\u5fd7 11-15 \u6765\u8bf4\u53ea\u80fd\u7b49\u5230\u4e0b\u4e00\u6b21\u6536\u5230 Leader Committed Index \u5927\u4e8e 15 \u7684\u65f6\u5019\u8fd9\u4e9b\u65e5\u5fd7\u624d\u80fd\u591f\u88ab\u66f4\u65b0\uff0c\u8fd9\u65f6\u5019\u5982\u679c\u5ba2\u6237\u7aef\u6ca1\u6709\u7ee7\u7eed\u5199\u5165\uff0cFollower \u7684 Committed index \u53ef\u4ee5\u4f9d\u9760 ping \u6d88\u606f\uff08\u643a\u5e26\u4e86 Leader \u7684 committed index\uff09\u8fdb\u884c\u66f4\u65b0\u3002"}),"\n",(0,d.jsx)(n.p,{children:"3\uff0c\u5f53 Leader \u63a5\u6536\u5230 Follower \u7684 ack \u4fe1\u606f\u7684\u65f6\u5019\uff0cLeader \u72b6\u6001\u4f1a\u505a\u5982\u4e0b\u66f4\u65b0\uff1a"}),"\n",(0,d.jsx)(n.p,{children:"Leader Status:"}),"\n",(0,d.jsx)(n.p,{children:"Committed Index : 15"}),"\n",(0,d.jsx)(n.p,{children:"Applied Index: 8"}),"\n",(0,d.jsx)(n.p,{children:"Last Index: 15"}),"\n",(0,d.jsx)(n.p,{children:"\u6b64\u65f6\u65e5\u5fd7 9-15 \u90fd\u662f\u53ef\u4ee5\u88ab\u5e94\u7528\u5230\u72b6\u6001\u673a\uff0c\u8fd9\u91cc\u662f\u5199 db\uff0c\u5f53\u65e5\u5fd7 9 \u5199\u5165 db \u4e4b\u540e\uff0c\u5c31\u4f1a\u8fd4\u56de\u5ba2\u6237\u7aef\uff0c\u76f8\u5e94\u7684 Applied Index \u66f4\u65b0\u4e3a 9\u3002\u8fd9\u65f6\u5019\u65e5\u5fd7 9 \u5c31\u53ef\u4ee5\u8fd4\u56de\u5ba2\u6237\u7aef\u3002"}),"\n",(0,d.jsx)(n.p,{children:"\u5bf9\u4e8e\u4ece\u6765\u8bf4\uff0c\u6574\u4f53\u7684\u65e5\u5fd7\u590d\u5236\u7684\u903b\u8f91\u8fd8\u662f\u6309\u7167 Raft \u8bba\u6587\u5f53\u4e2d\u8fdb\u884c\u7684\u3002\u552f\u4e00\u4e0d\u540c\u7684\u662f\u8bba\u6587\u4e2d\u65e5\u5fd7\u56de\u9000\u7684\u4e00\u90e8\u5206\u903b\u8f91\u653e\u5230\u4e86\u65e5\u5fd7\u534f\u5546\u9636\u6bb5\u8fdb\u884c\u3002"}),"\n",(0,d.jsx)(n.h2,{id:"\u65e5\u5fd7\u6062\u590d",children:"\u65e5\u5fd7\u6062\u590d\uff1a"}),"\n",(0,d.jsx)(n.p,{children:"\u91cd\u542f pika \u7684\u65f6\u5019\uff0c\u6839\u636e\u6301\u4e45\u8bdd\u7684\u4e00\u81f4\u6027\u4fe1\u606f\uff08applied index \u7b49\uff09\u56de\u590d\u51fa\u4e4b\u524d\u7684\u4e00\u81f4\u6027\u72b6\u6001\u3002"}),"\n",(0,d.jsx)(n.h2,{id:"\u65e5\u5fd7\u534f\u5546",children:"\u65e5\u5fd7\u534f\u5546\uff1a"}),"\n",(0,d.jsx)(n.p,{children:"\u8fd9\u4e2a\u9636\u6bb5 Follower \u8282\u70b9\u4e3b\u52a8\u53d1\u8d77 Trysync \u6d41\u7a0b\uff0c\u643a\u5e26 Last Index\uff0c\u5411 Leader \u53d1\u9001\u534f\u5546\u540c\u6b65\u70b9\u4f4d\u8bf7\u6c42\u3002\u534f\u5546\u8fc7\u7a0b\u5982\u4e0b\uff1a"}),"\n",(0,d.jsx)(n.p,{children:"Follower \u643a\u5e26 last_index \u53d1\u52a8\u5230 Leader\uff0c Leader \u901a\u8fc7 Follower \u7684 last_index \u4f4d\u7f6e\u5224\u65ad\u662f\u5426\u81ea\u5df1\u80fd\u591f\u627e\u5230 last_index \u5bf9\u5e94\u7684\u81ea\u5df1\u7684\u76f8\u5e94\u7684 log\uff0c\u5982\u679c\u627e\u5230 log \u5e76\u4e14\u4e24\u4e2a log \u4e00\u81f4\uff0cLeader \u8fd4\u56de okay \u534f\u5546\u7ed3\u675f\u3002\u5982\u679c\u6ca1\u6709\u627e\u5230\uff0c\u6216\u8005 log \u4e0d\u4e00\u81f4\uff0cLeader \u5411 Follower \u53d1\u9001 hints\uff0chints \u662f Leader \u672c\u5730\u7684\u6700\u65b0\u7684\u65e5\u5fd7\u3002Follower \u901a\u8fc7 hints\uff0c\u56de\u9000\u672c\u5730\u65e5\u5fd7\uff0c\u66f4\u65b0\u81ea\u5df1\u7684 last_index\uff0c\u91cd\u65b0\u5411\u4e3b\u534f\u5546\u3002\u6700\u7ec8 Leader Follower \u8fbe\u6210\u4e00\u81f4\uff0c\u7ed3\u675f TrySync \u6d41\u7a0b\uff0c\u8fdb\u884c\u65e5\u5fd7\u590d\u5236\u6d41\u7a0b\u3002"}),"\n",(0,d.jsx)(n.p,{children:(0,d.jsx)(n.img,{src:"https://camo.githubusercontent.com/57d198f5c7bd858af0981cdd6d55d0924a790099b451354dd2b2f45beaffc629/68747470733a2f2f73312e617831782e636f6d2f323032302f30332f32372f4750566267552e706e67",alt:""})}),"\n",(0,d.jsx)(n.p,{children:"Leader \u65e5\u5fd7\u534f\u5546\u7684\u4f2a\u4ee3\u7801\u5982\u4e0b\uff1a"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-c",children:"Status LeaderNegotiate() {\n reject = true\n if (follower.last_index > last_index) {\n send[last_index - 100, last_index]\n } else if (follower.last_index < first_index) {\n need dbsync\n }\n if (follower.last_index not found) {\n need dbsync\n }\n if (follower.last_index found but term not equal) {\n send[found_index - 100, found_index]\n }\n reject = false\n return ok;\n}\n"})}),"\n",(0,d.jsx)(n.p,{children:"Follower \u65e5\u5fd7\u534f\u5546\u7684\u4f2a\u4ee3\u7801\u65e5\u4e0b\uff1a"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-c",children:"Status FollowerNegotiate() {\n if last_index > hints[hints.size() - 1] {\n TruncateTo(hints[hints.size() - 1]);\n }\n for (reverse loop hints) {\n if (hint.index exist && hint.term == term) {\n TruncateTo(hint.index)\n send trysync with log_index = hint.index\n return ok;\n }\n }\n // cant find any match\n TruncateTo(hints[0])\n send trysync with log_index = last_index\n}\n"})}),"\n",(0,d.jsx)(n.p,{children:"\u4ee5\u4e0a\u4ecb\u7ecd\u4e86\u5173\u4e8e\u65e5\u5fd7\u7684\u5177\u4f53\u4e09\u4e2a\u9636\u6bb5\u3002\u6574\u4f53\u7684\u903b\u8f91\u9075\u4ece\u4e0e Raft \u8bba\u6587\u7684\u8bbe\u8ba1\uff0c\u5728\u5b9e\u73b0\u7ec6\u8282\u4e0a\u6839\u636e Pika \u76ee\u524d\u7684\u4ee3\u7801\u7ed3\u6784\u8fdb\u884c\u4e86\u4e00\u4e9b\u5217\u7684\u8c03\u6574\u3002"}),"\n",(0,d.jsx)(n.h2,{id:"\u5173\u4e8e\u9009\u4e3b\u548c\u6210\u5458\u53d8\u6362",children:"\u5173\u4e8e\u9009\u4e3b\u548c\u6210\u5458\u53d8\u6362"}),"\n",(0,d.jsxs)(n.p,{children:["\u76ee\u524d\u9009\u4e3b\u9700\u8981\u7ba1\u7406\u5458\u624b\u52a8\u4ecb\u5165\uff0c\u8be6\u89c1",(0,d.jsx)(n.a,{href:"https://github.com/Qihoo360/pika/wiki/%E5%89%AF%E6%9C%AC%E4%B8%80%E8%87%B4%E6%80%A7%E4%BD%BF%E7%94%A8%E6%96%87%E6%A1%A3",children:"\u526f\u672c\u4e00\u81f4\u6027\u4f7f\u7528\u6587\u6863"})," \u3002"]}),"\n",(0,d.jsx)(n.p,{children:"\u6210\u5458\u53d8\u6362\u7684\u529f\u80fd\u76ee\u524d\u6682\u4e0d\u652f\u6301\u3002"})]})}function x(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,d.jsx)(n,{...e,children:(0,d.jsx)(a,{...e})}):a(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>s});var d=i(6540);const t={},l=d.createContext(t);function r(e){const n=d.useContext(l);return d.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),d.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/65ee69ef.ff80038c.js b/build/assets/js/65ee69ef.ff80038c.js new file mode 100644 index 0000000..5620767 --- /dev/null +++ b/build/assets/js/65ee69ef.ff80038c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[8184],{6e3:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>c,frontMatter:()=>s,metadata:()=>o,toc:()=>_});var r=t(4848),i=t(8453);const s={title:"\u4e3b\u4ece\u540c\u6b65",sidebar_position:5},a=void 0,o={id:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u4e3b\u4ece\u540c\u6b65/index",title:"\u4e3b\u4ece\u540c\u6b65",description:"pika\u4e3b\u4ece\u540c\u6b65",source:"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u4e3b\u4ece\u540c\u6b65/index.md",sourceDirName:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u4e3b\u4ece\u540c\u6b65",slug:"/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u4e3b\u4ece\u540c\u6b65/",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u4e3b\u4ece\u540c\u6b65/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u4e3b\u4ece\u540c\u6b65/index.md",tags:[],version:"current",sidebarPosition:5,frontMatter:{title:"\u4e3b\u4ece\u540c\u6b65",sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"\u589e\u91cf\u540c\u6b65",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u589e\u91cf\u540c\u6b65/"},next:{title:"\u526f\u672c\u4e00\u81f4\u6027",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u526f\u672c\u4e00\u81f4\u6027/"}},l={},_=[{value:"pika\u4e3b\u4ece\u540c\u6b65",id:"pika\u4e3b\u4ece\u540c\u6b65",level:2},{value:"pika\u4e3b\u4ece\u540c\u6b65\u539f\u7406",id:"pika\u4e3b\u4ece\u540c\u6b65\u539f\u7406",level:2},{value:"auxiliary_thread\u7ebf\u7a0b",id:"auxiliary_thread\u7ebf\u7a0b",level:3},{value:"RunSyncSlavePartitionStateMachine-",id:"runsyncslavepartitionstatemachine-",level:4},{value:"CheckSyncTimeout-\u68c0\u67e5\u8fde\u63a5\u7684\u8d85\u65f6\u65f6\u95f4",id:"checksynctimeout-\u68c0\u67e5\u8fde\u63a5\u7684\u8d85\u65f6\u65f6\u95f4",level:4},{value:"TriggerSendBinlogSync-\u751f\u6210\u6bcf\u4e2a\u8282\u70b9\u5f85\u53d1\u9001\u7684\u6570\u636e\u4efb\u52a1",id:"triggersendbinlogsync-\u751f\u6210\u6bcf\u4e2a\u8282\u70b9\u5f85\u53d1\u9001\u7684\u6570\u636e\u4efb\u52a1",level:4},{value:"SendToPeer-\u5c06\u5f85\u53d1\u9001\u7684binlog\u540c\u6b65\u4efb\u52a1\u53d1\u9001\u7ed9\u4ece\u8282\u70b9",id:"sendtopeer-\u5c06\u5f85\u53d1\u9001\u7684binlog\u540c\u6b65\u4efb\u52a1\u53d1\u9001\u7ed9\u4ece\u8282\u70b9",level:4},{value:"pika_repl_client\u548cpika_repl_server_\u7ebf\u7a0b",id:"pika_repl_client\u548cpika_repl_server_\u7ebf\u7a0b",level:3},{value:"pika_repl_client\u5ba2\u6237\u7aef\u8fde\u63a5\u7ba1\u7406\u7ebf\u7a0b",id:"pika_repl_client\u5ba2\u6237\u7aef\u8fde\u63a5\u7ba1\u7406\u7ebf\u7a0b",level:4},{value:"pika_repl_server\u7ebf\u7a0b",id:"pika_repl_server\u7ebf\u7a0b",level:4},{value:"\u4e3b\u4ece\u540c\u6b65\u7684\u6d41\u7a0b",id:"\u4e3b\u4ece\u540c\u6b65\u7684\u6d41\u7a0b",level:3},{value:"\u603b\u7ed3",id:"\u603b\u7ed3",level:2}];function d(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"pika\u4e3b\u4ece\u540c\u6b65",children:"pika\u4e3b\u4ece\u540c\u6b65"}),"\n",(0,r.jsx)(n.p,{children:"\u4e3b\u8981\u4e3a\u4e86\u5206\u6790\u63a2\u7d22\u4e00\u4e0bpika\u662f\u5982\u4f55\u5b9e\u73b0\u4e3b\u4ece\u540c\u6b65\u7684\uff0cpika\u7684\u4e3b\u4ece\u540c\u6b65\u7684\u539f\u7406\u4e0eredis\u7684\u540c\u6b65\u65b9\u6848\u8fd8\u4e0d\u76f8\u540c\uff0c\u672c\u6587\u4e3b\u8981\u662f\u4e3a\u4e86\u5206\u6790\u5176\u4e3b\u4ece\u540c\u6b65\u7684\u76f8\u5173\u6d41\u7a0b\uff08pika\u57fa\u4e8e3.4\u7248\u672c\uff09\u3002"}),"\n",(0,r.jsx)(n.h2,{id:"pika\u4e3b\u4ece\u540c\u6b65\u539f\u7406",children:"pika\u4e3b\u4ece\u540c\u6b65\u539f\u7406"}),"\n",(0,r.jsx)(n.p,{children:"\u4e3b\u4ece\u540c\u6b65\u7684\u539f\u7406\uff0c\u4e3b\u8981\u662f\u901a\u8fc7\u5728\u542f\u52a8\u7684\u65f6\u5019\u542f\u52a8\u4e86\u4e24\u90e8\u5206\u7684\u7ebf\u7a0b\u6765\u8fdb\u884c\u7684\u3002"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"auxiliary_thread\u7ebf\u7a0b"}),"\n",(0,r.jsx)(n.li,{children:"pika_rm\u4e2d\u7684pika_repl_client\u7ebf\u7a0b\u6c60\u548cpika_repl_server\u7ebf\u7a0b\u6c60"}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"\u5148\u9010\u4e2a\u5206\u6790\u4e00\u4e0b\u4e24\u4e2a\u90e8\u5206\u7ebf\u7a0b\u7684\u5de5\u4f5c\u7684\u6d41\u7a0b\u3002"}),"\n",(0,r.jsx)(n.h3,{id:"auxiliary_thread\u7ebf\u7a0b",children:"auxiliary_thread\u7ebf\u7a0b"}),"\n",(0,r.jsx)(n.p,{children:"\u5728pika\u7684pika_server\u7684Start\u51fd\u6570\u4e2d\u542f\u52a8\u4e86auxiliary_thread\u7ebf\u7a0b\u3002"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-c++",children:' ret = pika_auxiliary_thread_->StartThread();\n if (ret != pink::kSuccess) {\n tables_.clear();\n LOG(FATAL) << "Start Auxiliary Thread Error: " << ret << (ret == pink::kCreateThreadError ? ": create thread error " : ": other error");\n }\n'})}),"\n",(0,r.jsx)(n.p,{children:"\u6b64\u65f6\u542f\u52a8\u7684\u7ebf\u7a0b\u5c31\u662f\u4f4d\u4e8epika_auxiliary_thread.cc\u4e2d\u7684\u7ebf\u7a0b\u51fd\u6570\u3002"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-c++",children:'void* PikaAuxiliaryThread::ThreadMain() {\n while (!should_stop()) { // \u662f\u5426\u505c\u6b62\u7ebf\u7a0b\n if (g_pika_conf->classic_mode()) { // \u5224\u65ad\u5f53\u524d\u8fd0\u884c\u7684\u6a21\u5f0f\u662f\u5206\u5e03\u5f0f\u6a21\u5f0f\u8fd8\u662f\u7ecf\u5178\u6a21\u5f0f\n if (g_pika_server->ShouldMetaSync()) {\n g_pika_rm->SendMetaSyncRequest();\n } else if (g_pika_server->MetaSyncDone()) {\n g_pika_rm->RunSyncSlavePartitionStateMachine();\n }\n } else {\n g_pika_rm->RunSyncSlavePartitionStateMachine(); // \u5206\u5e03\u5f0f\u6a21\u5f0f\u5219\u76f4\u63a5\u542f\u52a8\u72b6\u6001\u673a\u7684\u540c\u6b65\n }\n\n Status s = g_pika_rm->CheckSyncTimeout(slash::NowMicros()); // \u68c0\u67e5\u8d85\u65f6\u7684\u8282\u70b9\n if (!s.ok()) {\n LOG(WARNING) << s.ToString();\n }\n\n // TODO(whoiami) timeout\n s = g_pika_server->TriggerSendBinlogSync(); // \u89e6\u53d1binlog\u7684\u4e3b\u4ece\u540c\u6b65\n if (!s.ok()) {\n LOG(WARNING) << s.ToString();\n }\n // send to peer\n int res = g_pika_server->SendToPeer(); // \u5c06\u5f85\u53d1\u9001\u7684\u4efb\u52a1\u52a0\u5165\u5230\u5de5\u4f5c\u7ebf\u7a0b\u961f\u5217\u4e2d\n if (!res) {\n // sleep 100 ms\n mu_.Lock();\n cv_.TimedWait(100);\n mu_.Unlock();\n } else {\n //LOG_EVERY_N(INFO, 1000) << "Consume binlog number " << res;\n }\n }\n return NULL;\n}\n'})}),"\n",(0,r.jsx)(n.h4,{id:"runsyncslavepartitionstatemachine-",children:"RunSyncSlavePartitionStateMachine-"}),"\n",(0,r.jsx)(n.p,{children:"\u8be5\u51fd\u6570\u5c31\u662f\u5904\u7406\u4e3b\u4ece\u540c\u6b65\u8fc7\u7a0b\u4e2d\u7684\u72b6\u6001\u673a\uff0c\u6839\u636e\u4e0d\u540c\u7684\u72b6\u6001\u53bb\u8fdb\u884c\u4e0d\u540c\u7684\u64cd\u4f5c\u3002"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-c++",children:'Status PikaReplicaManager::RunSyncSlavePartitionStateMachine() {\n slash::RWLock l(&partitions_rw_, false);\n for (const auto& item : sync_slave_partitions_) { // \u83b7\u53d6\u6240\u6709\u7684\u4ece\u8282\u70b9\u540c\u6b65\u4fe1\u606f\n PartitionInfo p_info = item.first;\n std::shared_ptr s_partition = item.second;\n if (s_partition->State() == ReplState::kTryConnect) { // \u5982\u679c\u540c\u6b65\u7684\u4fe1\u606f\u662fkTryConnect\u5219\u53d1\u9001TrySync\u7684\u540c\u6b65\u8bf7\u6c42\n LOG(WARNING) << "Partition start, Table Name: "\n << p_info.table_name_ << " Partition Id: " << p_info.partition_id_;\n SendPartitionTrySyncRequest(p_info.table_name_, p_info.partition_id_);\n } else if (s_partition->State() == ReplState::kTryDBSync) { // \u5982\u679c\u662fkTryDB\u7684\u72b6\u6001\u5219\u53d1\u9001DB\u540c\u6b65\u7684\u8bf7\u6c42\n SendPartitionDBSyncRequest(p_info.table_name_, p_info.partition_id_);\n } else if (s_partition->State() == ReplState::kWaitReply) { // \u5982\u679c\u662fwait\u72b6\u6001\u5219\u4ec0\u4e48\u90fd\u4e0d\u505a\n continue;\n } else if (s_partition->State() == ReplState::kWaitDBSync) { // \u5982\u679c\u662fwaitdb\u72b6\u6001\u5219\u7b49\u5f85\n std::shared_ptr partition =\n g_pika_server->GetTablePartitionById(\n p_info.table_name_, p_info.partition_id_);\n if (partition) {\n partition->TryUpdateMasterOffset(); // \u66f4\u65b0\u548c\u4e3b\u4e4b\u95f4\u7684offset\n } else {\n LOG(WARNING) << "Partition not found, Table Name: "\n << p_info.table_name_ << " Partition Id: " << p_info.partition_id_;\n }\n } else if (s_partition->State() == ReplState::kConnected\n || s_partition->State() == ReplState::kNoConnect\n || s_partition->State() == ReplState::kDBNoConnect) { // \u5982\u679c\u662f\u5df2\u8fde\u63a5\u6216\u8005\u5931\u8054\u5219\u4ec0\u4e48\u90fd\u4e0d\u5904\u7406\n continue;\n }\n }\n return Status::OK();\n}\n'})}),"\n",(0,r.jsx)(n.p,{children:"\u4ece\u72b6\u6001\u673a\u7684\u8fd0\u884c\u6765\u770b\uff0c\u6240\u6709\u7684\u6b65\u9aa4\u90fd\u662f\u4f9d\u8d56\u4e8e\u8be5\u51fd\u6570\u901a\u8fc7\u72b6\u6001\u6765\u9a71\u52a8\u8fdb\u884c\u4e0d\u540c\u7684\u64cd\u4f5c\u3002"}),"\n",(0,r.jsx)(n.h4,{id:"checksynctimeout-\u68c0\u67e5\u8fde\u63a5\u7684\u8d85\u65f6\u65f6\u95f4",children:"CheckSyncTimeout-\u68c0\u67e5\u8fde\u63a5\u7684\u8d85\u65f6\u65f6\u95f4"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-c++",children:'Status PikaReplicaManager::CheckSyncTimeout(uint64_t now) {\n slash::RWLock l(&partitions_rw_, false);\n\n for (auto& iter : sync_master_partitions_) {\n std::shared_ptr partition = iter.second;\n Status s = partition->CheckSyncTimeout(now); // \u83b7\u53d6\u6240\u6709\u7684master\u7684\u540c\u6b65\u8282\u70b9\u68c0\u67e5\u662f\u5426\u8d85\u65f6\n if (!s.ok()) {\n LOG(WARNING) << "CheckSyncTimeout Failed " << s.ToString();\n }\n }\n for (auto& iter : sync_slave_partitions_) {\n std::shared_ptr partition = iter.second;\n Status s = partition->CheckSyncTimeout(now); // \u83b7\u53d6\u6240\u6709slave\u7684\u540c\u6b65\u8282\u70b9\u4fe1\u606f\u68c0\u67e5\u662f\u5426\u8d85\u65f6\n if (!s.ok()) {\n LOG(WARNING) << "CheckSyncTimeout Failed " << s.ToString();\n }\n }\n return Status::OK();\n}\n'})}),"\n",(0,r.jsx)(n.p,{children:"\u4e3b\u8981\u662f\u68c0\u67e5master\u548cslave\u7684\u540c\u6b65\u8fde\u63a5\u4fe1\u606f\u662f\u5426\u8d85\u65f6\u3002"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-c++",children:'Status SyncMasterPartition::CheckSyncTimeout(uint64_t now) {\n std::unordered_map> slaves = GetAllSlaveNodes();\n\n std::vector to_del;\n for (auto& slave_iter : slaves) {\n std::shared_ptr slave_ptr = slave_iter.second; // \u83b7\u53d6\u6240\u6709slave\u7684\u8fde\u63a5\u4fe1\u606f\n slash::MutexLock l(&slave_ptr->slave_mu);\n if (slave_ptr->LastRecvTime() + kRecvKeepAliveTimeout < now) { // \u5982\u679c\u6700\u540e\u7684\u65f6\u95f4\u8d85\u65f6\u5219\u5220\u9664\u8be5\u8fde\u63a5\n to_del.push_back(Node(slave_ptr->Ip(), slave_ptr->Port()));\n } else if (slave_ptr->LastSendTime() + kSendKeepAliveTimeout < now && slave_ptr->sent_offset == slave_ptr->acked_offset) { // \u5982\u679c\u6700\u540e\u7684\u53d1\u9001\u65f6\u95f4\u672a\u8d85\u65f6 \u5e76\u4e14\u4e3b\u4ece\u540c\u6b65\u7684\u504f\u79fb\u91cf\u53d1\u9001\u7684\u4e0e\u56de\u590d\u7684\u76f8\u540c\u5219\u53d1\u9001binlogchips\u8bf7\u6c42\u5e76\u4e14\u66f4\u65b0\u5f53\u524d\u7684\u6700\u540e\u53d1\u9001\u65f6\u95f4\n std::vector task;\n RmNode rm_node(slave_ptr->Ip(), slave_ptr->Port(), slave_ptr->TableName(), slave_ptr->PartitionId(), slave_ptr->SessionId());\n WriteTask empty_task(rm_node, BinlogChip(LogOffset(), ""), LogOffset());\n task.push_back(empty_task);\n Status s = g_pika_rm->SendSlaveBinlogChipsRequest(slave_ptr->Ip(), slave_ptr->Port(), task); // \u540c\u6b65\u5f53\u524d\u7684\u4e3b\u4ece\u540c\u6b65\u7684\u4fe1\u606f\n slave_ptr->SetLastSendTime(now);\n if (!s.ok()) {\n LOG(INFO)<< "Send ping failed: " << s.ToString();\n return Status::Corruption("Send ping failed: " + slave_ptr->Ip() + ":" + std::to_string(slave_ptr->Port()));\n }\n }\n }\n\n for (auto& node : to_del) { // \u5c06\u8d85\u65f6\u7684\u8fde\u63a5\u4fe1\u606f\u90fd\u5220\u9664\u6389\n coordinator_.SyncPros().RemoveSlaveNode(node.Ip(), node.Port());\n g_pika_rm->DropItemInWriteQueue(node.Ip(), node.Port());\n LOG(WARNING) << SyncPartitionInfo().ToString() << " Master del Recv Timeout slave success " << node.ToString();\n }\n return Status::OK();\n}\n'})}),"\n",(0,r.jsx)(n.p,{children:"\u4e3b\u8282\u70b9\u4e3b\u8981\u7ef4\u62a4\u4e86\u5f53\u524d\u7684\u4e00\u4e9b\u4e3b\u4ece\u8fde\u63a5\u7684\u4fe1\u606f\u7ef4\u62a4\u3002"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-c++",children:"Status SyncSlavePartition::CheckSyncTimeout(uint64_t now) {\n slash::MutexLock l(&partition_mu_);\n // no need to do session keepalive return ok\n if (repl_state_ != ReplState::kWaitDBSync && repl_state_ != ReplState::kConnected) {\n return Status::OK(); // \u5982\u679c\u4ece\u8282\u70b9\u7684\u4fe1\u606f\u4e0d\u662fwaitdb\u6216\u8005\u8fde\u63a5\u72b6\u6001\u5219\u8fd4\u56deok\n }\n if (m_info_.LastRecvTime() + kRecvKeepAliveTimeout < now) {\n // update slave state to kTryConnect, and try reconnect to master node\n repl_state_ = ReplState::kTryConnect;\n g_pika_server->SetLoopPartitionStateMachine(true); // \u5426\u5219\u5c31\u8bbe\u7f6e\u6210tryconnect\u72b6\u6001\u53bb\u5c1d\u8bd5\u8fde\u63a5\u4e3b\u8282\u70b9\n }\n return Status::OK();\n}\n"})}),"\n",(0,r.jsx)(n.h4,{id:"triggersendbinlogsync-\u751f\u6210\u6bcf\u4e2a\u8282\u70b9\u5f85\u53d1\u9001\u7684\u6570\u636e\u4efb\u52a1",children:"TriggerSendBinlogSync-\u751f\u6210\u6bcf\u4e2a\u8282\u70b9\u5f85\u53d1\u9001\u7684\u6570\u636e\u4efb\u52a1"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-c++",children:"Status PikaServer::TriggerSendBinlogSync() {\n return g_pika_rm->WakeUpBinlogSync();\n}\n\n...\n\nStatus PikaReplicaManager::WakeUpBinlogSync() {\n slash::RWLock l(&partitions_rw_, false);\n for (auto& iter : sync_master_partitions_) {\n std::shared_ptr partition = iter.second;\n Status s = partition->WakeUpSlaveBinlogSync(); // \u68c0\u67e5\u6bcf\u4e2a\u8282\u70b9\u662f\u5426\u9700\u8981\u751f\u6210binlog\u540c\u6b65\u4efb\u52a1\n if (!s.ok()) {\n return s;\n }\n }\n return Status::OK();\n}\n"})}),"\n",(0,r.jsx)(n.p,{children:"\u4e3b\u8981\u662f\u68c0\u67e5\u6bcf\u4e2a\u8fde\u63a5\u7684\u4ece\u8282\u70b9\u4fe1\u606f\u662f\u5426\u9700\u8981\u751f\u6210\u540c\u6b65binlog\u4efb\u52a1\u3002"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-c++",children:'Status SyncMasterPartition::WakeUpSlaveBinlogSync() {\n std::unordered_map> slaves = GetAllSlaveNodes();\n std::vector> to_del;\n for (auto& slave_iter : slaves) {\n std::shared_ptr slave_ptr = slave_iter.second;\n slash::MutexLock l(&slave_ptr->slave_mu);\n if (slave_ptr->sent_offset == slave_ptr->acked_offset) { // \u68c0\u67e5\u5f53\u524d\u540c\u6b65\u7684\u6570\u636e\u4fe1\u606f\u662f\u5426\u8ddf\u56de\u590d\u7684\u6570\u636e\u504f\u79fb\u76f8\u540c\n Status s = ReadBinlogFileToWq(slave_ptr); // \u5199binlog\u4efb\u52a1\u5230\u8be5\u4ece\u8282\u70b9\u8fde\u63a5\u4e0a\u9762\n if (!s.ok()) {\n to_del.push_back(slave_ptr);\n LOG(WARNING) << "WakeUpSlaveBinlogSync falied, Delete from RM, slave: " <<\n slave_ptr->ToStringStatus() << " " << s.ToString();\n }\n }\n }\n for (auto& to_del_slave : to_del) { // \u5982\u679c\u540c\u6b65\u5931\u8d25\u5219\u5220\u9664\u8be5node\n RemoveSlaveNode(to_del_slave->Ip(), to_del_slave->Port());\n }\n return Status::OK();\n}\n'})}),"\n",(0,r.jsx)(n.p,{children:"\u5176\u4e2dReadBinlogFileToWq\u5c31\u662f\u6839\u636e\u5f53\u524d\u7684\u8fde\u63a5\u6765\u751f\u6210binlog\u540c\u6b65\u4efb\u52a1\u3002"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-c++",children:'Status SyncMasterPartition::ReadBinlogFileToWq(const std::shared_ptr& slave_ptr) {\n int cnt = slave_ptr->sync_win.Remaining();\n std::shared_ptr reader = slave_ptr->binlog_reader; //\u83b7\u53d6\u5f53\u524dbinlogreader\n if (reader == nullptr) {\n return Status::OK();\n }\n std::vector tasks;\n for (int i = 0; i < cnt; ++i) {\n std::string msg;\n uint32_t filenum;\n uint64_t offset;\n if (slave_ptr->sync_win.GetTotalBinlogSize() > PIKA_MAX_CONN_RBUF_HB * 2) {\n LOG(INFO) << slave_ptr->ToString() << " total binlog size in sync window is :"\n << slave_ptr->sync_win.GetTotalBinlogSize();\n break; //\u68c0\u67e5\u5f53\u524d\u540c\u6b65\u7a97\u53e3\u7684\u5927\u5c0f\n }\n Status s = reader->Get(&msg, &filenum, &offset); //\u83b7\u53d6\u5bf9\u5e94\u7684\u504f\u79fb\u6570\u636e\n if (s.IsEndFile()) {\n break;\n } else if (s.IsCorruption() || s.IsIOError()) {\n LOG(WARNING) << SyncPartitionInfo().ToString()\n << " Read Binlog error : " << s.ToString();\n return s;\n }\n BinlogItem item;\n if (!PikaBinlogTransverter::BinlogItemWithoutContentDecode(\n TypeFirst, msg, &item)) {\n LOG(WARNING) << "Binlog item decode failed";\n return Status::Corruption("Binlog item decode failed");\n }\n BinlogOffset sent_b_offset = BinlogOffset(filenum, offset); // \u751f\u6210\u53d1\u9001\u7684\u504f\u79fb\u91cf\n LogicOffset sent_l_offset = LogicOffset(item.term_id(), item.logic_id());\n LogOffset sent_offset(sent_b_offset, sent_l_offset);\n\n slave_ptr->sync_win.Push(SyncWinItem(sent_offset, msg.size())); //\u8bbe\u7f6e\u540c\u6b65\u7a97\u53e3\u7684\u5927\u5c0f\n slave_ptr->SetLastSendTime(slash::NowMicros()); //\u8bbe\u7f6e\u6700\u540e\u7684\u53d1\u9001\u65f6\u95f4\n RmNode rm_node(slave_ptr->Ip(), slave_ptr->Port(), slave_ptr->TableName(), slave_ptr->PartitionId(), slave_ptr->SessionId());\n WriteTask task(rm_node, BinlogChip(sent_offset, msg), slave_ptr->sent_offset);\n tasks.push_back(task); // \u5305\u88c5\u6210\u4efb\u52a1\n slave_ptr->sent_offset = sent_offset; // \u8bbe\u7f6e\u5f53\u524d\u7684\u53d1\u9001\u504f\u79fb\u91cf\n }\n\n if (!tasks.empty()) {\n g_pika_rm->ProduceWriteQueue(slave_ptr->Ip(), slave_ptr->Port(), partition_info_.partition_id_, tasks); // \u5c06\u4efb\u52a1\u653e\u5165\u961f\u5217\u4e2d\u7b49\u5f85\u5904\u7406\n }\n return Status::OK();\n}\n'})}),"\n",(0,r.jsx)(n.p,{children:"\u4e3b\u8981\u5c31\u662f\u901a\u8fc7\u83b7\u53d6\u504f\u79fb\u91cf\uff0c\u7136\u540e\u751f\u6210\u4efb\u52a1\u5e76\u653e\u5165\u53d1\u9001\u961f\u5217\u4e2d\u7b49\u5f85\u5904\u7406\u3002"}),"\n",(0,r.jsx)(n.h4,{id:"sendtopeer-\u5c06\u5f85\u53d1\u9001\u7684binlog\u540c\u6b65\u4efb\u52a1\u53d1\u9001\u7ed9\u4ece\u8282\u70b9",children:"SendToPeer-\u5c06\u5f85\u53d1\u9001\u7684binlog\u540c\u6b65\u4efb\u52a1\u53d1\u9001\u7ed9\u4ece\u8282\u70b9"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-c++",children:'int PikaServer::SendToPeer() {\n return g_pika_rm->ConsumeWriteQueue();\n}\n\n...\n \nint PikaReplicaManager::ConsumeWriteQueue() {\n std::unordered_map>> to_send_map;\n int counter = 0;\n {\n slash::MutexLock l(&write_queue_mu_);\n for (auto& iter : write_queues_) {\n const std::string& ip_port = iter.first;\n std::unordered_map>& p_map = iter.second; //\u83b7\u53d6\u961f\u5217\n for (auto& partition_queue : p_map) {\n std::queue& queue = partition_queue.second;\n for (int i = 0; i < kBinlogSendPacketNum; ++i) {\n if (queue.empty()) {\n break;\n }\n size_t batch_index = queue.size() > kBinlogSendBatchNum ? kBinlogSendBatchNum : queue.size(); // \u68c0\u67e5\u5f53\u524d\u53ef\u53d1\u9001\u7684\u5927\u5c0f\n std::vector to_send;\n int batch_size = 0;\n for (size_t i = 0; i < batch_index; ++i) {\n WriteTask& task = queue.front();\n batch_size += task.binlog_chip_.binlog_.size();\n // make sure SerializeToString will not over 2G\n if (batch_size > PIKA_MAX_CONN_RBUF_HB) {\n break;\n }\n to_send.push_back(task); // \u653e\u5165\u53ef\u53d1\u9001\u7684\u961f\u5217\u4e2d\n queue.pop();\n counter++;\n }\n if (!to_send.empty()) {\n to_send_map[ip_port].push_back(std::move(to_send));\n }\n }\n }\n }\n }\n\n std::vector to_delete;\n for (auto& iter : to_send_map) {\n std::string ip;\n int port = 0;\n if (!slash::ParseIpPortString(iter.first, ip, port)) {\n LOG(WARNING) << "Parse ip_port error " << iter.first;\n continue;\n }\n for (auto& to_send : iter.second) {\n Status s = pika_repl_server_->SendSlaveBinlogChips(ip, port, to_send); // \u53d1\u9001Binglog\u4efb\u52a1\n if (!s.ok()) {\n LOG(WARNING) << "send binlog to " << ip << ":" << port << " failed, " << s.ToString();\n to_delete.push_back(iter.first); // \u5982\u679c\u53d1\u9001\u5931\u8d25\u5219\u653e\u5165\u5931\u8d25\u961f\u5217\u4e2d\n continue;\n }\n }\n }\n\n if (!to_delete.empty()) {\n {\n slash::MutexLock l(&write_queue_mu_);\n for (auto& del_queue : to_delete) {\n write_queues_.erase(del_queue); //\u5220\u9664\u53d1\u9001\u5931\u8d25\u7684\u4efb\u52a1\n }\n }\n }\n return counter;\n}\n'})}),"\n",(0,r.jsxs)(n.p,{children:["\u6700\u7ec8\u901a\u8fc7pika_repl_server_\u7684SendSlaveBinlogChip",(0,r.jsx)(n.a,{href:"https://so.csdn.net/so/search?q=s%E5%87%BD%E6%95%B0&spm=1001.2101.3001.7020",children:"s\u51fd\u6570"}),"\u5c06\u5f53\u524d\u5f85\u53d1\u9001\u7684\u4efb\u52a1\u53d1\u9001\u51fa\u53bb\u3002"]}),"\n",(0,r.jsx)(n.h3,{id:"pika_repl_client\u548cpika_repl_server_\u7ebf\u7a0b",children:"pika_repl_client\u548cpika_repl_server_\u7ebf\u7a0b"}),"\n",(0,r.jsx)(n.p,{children:"\u8fd9\u4e24\u4e2a\u7ebf\u7a0b\u5c31\u662f\u7ef4\u62a4\u4e86\u4e3b\u4ece\u8fde\u63a5\u7684client\u548cserver\u7aef\u7684\u4ea4\u4e92\u529f\u80fd\uff0cauxiliary_thread\u4e2d\u72b6\u6001\u673a\u89e6\u53d1\u7684\u8fde\u63a5\u72b6\u6001\u5c31\u662f\u4f9d\u8d56\u4e8e\u8fd9\u4e24\u4e2a\u7ebf\u7a0b\u6765\u5b8c\u6210\u4ea4\u4e92\u3002"}),"\n",(0,r.jsx)(n.h4,{id:"pika_repl_client\u5ba2\u6237\u7aef\u8fde\u63a5\u7ba1\u7406\u7ebf\u7a0b",children:"pika_repl_client\u5ba2\u6237\u7aef\u8fde\u63a5\u7ba1\u7406\u7ebf\u7a0b"}),"\n",(0,r.jsx)(n.p,{children:"pika_reple_client\u7684\u6700\u6838\u5fc3\u7684\u539f\u7406\u5c31\u662f\u901a\u8fc7\u4e00\u4e2a\u57fa\u4e8eepoll\uff08linux\u5e73\u53f0\uff09\u7684\u4e8b\u4ef6\u9a71\u52a8\uff0c\u53bb\u5b8c\u6210\u591a\u4e2a\u8fde\u63a5\u7684\u4e8b\u4ef6\u9a71\u52a8\uff0c\u5e76\u901a\u8fc7\u52a0\u5165\u7ebf\u7a0b\u6c60\u6765\u63d0\u4f9bepoll\u7684\u5904\u7406\u6027\u80fd\u3002\u63a5\u4e0b\u6765\u5c31\u5927\u81f4\u4e86\u89e3\u4e00\u4e0bpika_repl_client\u5b8c\u6210\u7684\u4ea4\u4e92\u7684\u76f8\u5173\u529f\u80fd\u3002"}),"\n",(0,r.jsx)(n.p,{children:"\u5728\u4e3b\u4ece\u540c\u6b65\u8fc7\u7a0b\u4e2d\uff0c\u65e0\u8bba\u662fpika_repl_client\u8fd8\u662fpika_repl_server_\u5e95\u5c42\u90fd\u5229\u7528\u4e86pink\u5e93\u7684PbConn\u6a21\u5f0f\u6765\u8fdb\u884c\u7684\u6570\u636e\u4ea4\u4e92\u3002"}),"\n",(0,r.jsx)(n.p,{children:"\u901a\u8fc7client_thread\u7684\u903b\u8f91\u6d41\u7a0b\u6765\u7b80\u5355\u5206\u6790\u4e00\u4e0bPbConn\u7684\u6267\u884c\u6d41\u7a0b\u3002"}),"\n",(0,r.jsx)(n.p,{children:"\u5728PikaReplClient\u7684Start\u6d41\u7a0b\u4e2d\uff0c\u542f\u52a8\u4e86\u5982\u4e0b\u7ebf\u7a0b\u3002"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-c++",children:'int PikaReplClient::Start() {\n int res = client_thread_->StartThread(); // \u542f\u52a8\u4e00\u4e2aepoll\u7684\u4e8b\u4ef6\u9a71\u52a8\n if (res != pink::kSuccess) {\n LOG(FATAL) << "Start ReplClient ClientThread Error: " << res << (res == pink::kCreateThreadError ? ": create thread error " : ": other error");\n }\n for (size_t i = 0; i < bg_workers_.size(); ++i) { // \u901a\u8fc7\u5c06epoll\u4e8b\u4ef6\u9a71\u52a8\u7684\u6267\u884c\u5206\u53d1\u5230\u7ebf\u7a0b\u6c60\u4e2d\u6267\u884c\n res = bg_workers_[i]->StartThread();\n if (res != pink::kSuccess) {\n LOG(FATAL) << "Start Pika Repl Worker Thread Error: " << res\n << (res == pink::kCreateThreadError ? ": create thread error " : ": other error");\n }\n }\n return res;\n}\n'})}),"\n",(0,r.jsx)(n.p,{children:"\u6b64\u65f6client_thread\u542f\u52a8\u7684\u5c31\u662f\u4f4d\u4e8epink\u7684client_thread.c\u4e2d\u7684ClientThread\u7ebf\u7a0b\u3002"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-c++",children:'void *ClientThread::ThreadMain() {\n int nfds = 0;\n PinkFiredEvent *pfe = NULL;\n\n struct timeval when;\n gettimeofday(&when, NULL);\n struct timeval now = when;\n\n when.tv_sec += (cron_interval_ / 1000);\n when.tv_usec += ((cron_interval_ % 1000) * 1000);\n int timeout = cron_interval_;\n if (timeout <= 0) {\n timeout = PINK_CRON_INTERVAL;\n }\n\n std::string ip_port;\n\n while (!should_stop()) {\n if (cron_interval_ > 0) {\n gettimeofday(&now, nullptr);\n if (when.tv_sec > now.tv_sec ||\n (when.tv_sec == now.tv_sec && when.tv_usec > now.tv_usec)) {\n timeout = (when.tv_sec - now.tv_sec) * 1000 +\n (when.tv_usec - now.tv_usec) / 1000;\n } else {\n // do user defined cron\n handle_->CronHandle(); // \u6267\u884c\u5b9a\u65f6\u4efb\u52a1\n\n DoCronTask();\n when.tv_sec = now.tv_sec + (cron_interval_ / 1000);\n when.tv_usec = now.tv_usec + ((cron_interval_ % 1000) * 1000);\n timeout = cron_interval_;\n }\n }\n //{\n //InternalDebugPrint();\n //}\n nfds = pink_epoll_->PinkPoll(timeout); //\u4e8b\u4ef6\u9a71\u52a8\n for (int i = 0; i < nfds; i++) {\n pfe = (pink_epoll_->firedevent()) + i;\n if (pfe == NULL) {\n continue;\n }\n\n if (pfe->fd == pink_epoll_->notify_receive_fd()) { // \u5904\u7406\u9a71\u52a8\n ProcessNotifyEvents(pfe);\n continue;\n }\n\n int should_close = 0;\n std::map>::iterator iter = fd_conns_.find(pfe->fd);\n if (iter == fd_conns_.end()) {\n log_info("fd %d not found in fd_conns\\n", pfe->fd);\n pink_epoll_->PinkDelEvent(pfe->fd);\n continue;\n }\n\n std::shared_ptr conn = iter->second;\n\n if (connecting_fds_.count(pfe->fd)) {\n Status s = ProcessConnectStatus(pfe, &should_close);\n if (!s.ok()) {\n handle_->DestConnectFailedHandle(conn->ip_port(), s.ToString());\n }\n connecting_fds_.erase(pfe->fd);\n }\n\n if (!should_close && (pfe->mask & EPOLLOUT) && conn->is_reply()) {\n WriteStatus write_status = conn->SendReply(); // \u5982\u679c\u5f53\u524d\u662f\u53ef\u4ee5\u5199\u6570\u636e\u5219\u8c03\u7528SendReply\n conn->set_last_interaction(now);\n if (write_status == kWriteAll) {\n pink_epoll_->PinkModEvent(pfe->fd, 0, EPOLLIN);\n conn->set_is_reply(false);\n } else if (write_status == kWriteHalf) {\n continue;\n } else {\n log_info("send reply error %d\\n", write_status);\n should_close = 1;\n }\n }\n\n if (!should_close && (pfe->mask & EPOLLIN)) {\n ReadStatus read_status = conn->GetRequest(); // \u5982\u679c\u662f\u63a5\u53d7\u6570\u636e\u5219\u8c03\u7528GetRequest\u6765\u89e3\u6790\n conn->set_last_interaction(now);\n if (read_status == kReadAll) {\n // pink_epoll_->PinkModEvent(pfe->fd, 0, EPOLLOUT);\n } else if (read_status == kReadHalf) {\n continue;\n } else {\n log_info("Get request error %d\\n", read_status);\n should_close = 1;\n }\n }\n\n if ((pfe->mask & EPOLLERR) || (pfe->mask & EPOLLHUP) || should_close) {\n {\n log_info("close connection %d reason %d %d\\n", pfe->fd, pfe->mask, should_close);\n pink_epoll_->PinkDelEvent(pfe->fd); // \u5982\u679c\u5173\u95ed\u5219\u5220\u9664\u8be5\u4e8b\u4ef6\n CloseFd(conn);\n fd_conns_.erase(pfe->fd);\n if (ipport_conns_.count(conn->ip_port())) {\n ipport_conns_.erase(conn->ip_port());\n }\n if (connecting_fds_.count(conn->fd())) {\n connecting_fds_.erase(conn->fd());\n }\n }\n }\n }\n }\n return nullptr;\n}\n'})}),"\n",(0,r.jsx)(n.p,{children:"\u901a\u8fc7client_thread\u7684\u6267\u884c\u51fd\u6570\u53ef\u77e5\uff0c\u8fd9\u662f\u4e00\u4e2a\u6807\u51c6\u7684\u4e8b\u4ef6\u9a71\u52a8\u6a21\u578b\u3002\u5982\u679c\u53ef\u5199\u5165\u5219\u8c03\u7528conn\u7684SendReply\u51fd\u6570\uff0c\u5982\u679c\u662f\u63a5\u53d7\u4e8b\u60c5\u5219\u8c03\u7528conn\u7684GetRequest\u51fd\u6570\u3002\u6b64\u65f6\u7684conn\u5c31\u662fPbConn\u3002"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-c++",children:'// Msg is [ length(COMMAND_HEADER_LENGTH) | body(length bytes) ]\n// step 1. kHeader, we read COMMAND_HEADER_LENGTH bytes;\n// step 2. kPacket, we read header_len bytes;\nReadStatus PbConn::GetRequest() {\n while (true) {\n switch (connStatus_) {\n case kHeader: {\n ssize_t nread = read(\n fd(), rbuf_ + cur_pos_, COMMAND_HEADER_LENGTH - cur_pos_); // \u89e3\u6790\u5934\u90e8\u4fe1\u606f\n if (nread == -1) {\n if (errno == EAGAIN) {\n return kReadHalf;\n } else {\n return kReadError;\n }\n } else if (nread == 0) {\n return kReadClose;\n } else {\n cur_pos_ += nread;\n if (cur_pos_ == COMMAND_HEADER_LENGTH) {\n uint32_t integer = 0;\n memcpy(reinterpret_cast(&integer),\n rbuf_, sizeof(uint32_t));\n header_len_ = ntohl(integer);\n remain_packet_len_ = header_len_;\n connStatus_ = kPacket;\n continue;\n }\n return kReadHalf;\n }\n }\n case kPacket: {\n if (header_len_ > rbuf_len_ - COMMAND_HEADER_LENGTH) { //\u89e3\u6790packet\n uint32_t new_size = header_len_ + COMMAND_HEADER_LENGTH;\n if (new_size < kProtoMaxMessage) {\n rbuf_ = reinterpret_cast(realloc(rbuf_, sizeof(char) * new_size));\n if (rbuf_ == NULL) {\n return kFullError;\n }\n rbuf_len_ = new_size;\n log_info("Thread_id %ld Expand rbuf to %u, cur_pos_ %u\\n", pthread_self(), new_size, cur_pos_);\n } else {\n return kFullError;\n }\n }\n // read msg body\n ssize_t nread = read(fd(), rbuf_ + cur_pos_, remain_packet_len_);\n if (nread == -1) {\n if (errno == EAGAIN) {\n return kReadHalf;\n } else {\n return kReadError;\n }\n } else if (nread == 0) {\n return kReadClose;\n }\n cur_pos_ += nread;\n remain_packet_len_ -= nread;\n if (remain_packet_len_ == 0) {\n connStatus_ = kComplete;\n continue;\n }\n return kReadHalf;\n }\n case kComplete: { //\u89e3\u6790\u5b8c\u6210\u4e4b\u540e\u8c03\u7528DealMessage\u51fd\u6570\u6765\u5904\u7406\n if (DealMessage() != 0) {\n return kDealError;\n }\n connStatus_ = kHeader;\n cur_pos_ = 0;\n return kReadAll;\n }\n // Add this switch case just for delete compile warning\n case kBuildObuf:\n break;\n\n case kWriteObuf:\n break;\n }\n }\n\n return kReadHalf;\n}\n\nWriteStatus PbConn::SendReply() {\n ssize_t nwritten = 0;\n size_t item_len;\n slash::MutexLock l(&resp_mu_);\n while (!write_buf_.queue_.empty()) { //\u5199\u5165\u7684\u961f\u5217\u662f\u5426\u4e3a\u7a7a\n std::string item = write_buf_.queue_.front();\n item_len = item.size();\n while (item_len - write_buf_.item_pos_ > 0) {\n nwritten = write(fd(), item.data() + write_buf_.item_pos_, item_len - write_buf_.item_pos_); // \u5c06\u6570\u636e\u5199\u5165\u5bf9\u5e94\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\n if (nwritten <= 0) {\n break;\n }\n write_buf_.item_pos_ += nwritten;\n if (write_buf_.item_pos_ == item_len) {\n write_buf_.queue_.pop();\n write_buf_.item_pos_ = 0;\n item_len = 0;\n }\n }\n if (nwritten == -1) {\n if (errno == EAGAIN) {\n return kWriteHalf;\n } else {\n // Here we should close the connection\n return kWriteError;\n }\n }\n if (item_len - write_buf_.item_pos_ != 0) {\n return kWriteHalf;\n }\n }\n return kWriteAll;\n}\n'})}),"\n",(0,r.jsx)(n.p,{children:"\u4ececlient\u7684\u4e8b\u4ef6\u9a71\u52a8\u53ef\u77e5\uff0c\u5904\u7406\u7684\u4e3b\u8981\u7684\u903b\u8f91\u51fd\u6570\u5c31\u662f\u81ea\u5b9a\u4e49\u7684DealMessage()\u51fd\u6570\u3002"}),"\n",(0,r.jsx)(n.p,{children:"\u6211\u4eec\u7ee7\u7eed\u5206\u6790PikaReplClientConn\u7c7b\u3002"}),"\n",(0,r.jsx)(n.p,{children:"\u5728pika_repl_client_thread.h\u7684\u5b9a\u4e49\u4e2d\u3002"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-c++",children:'class PikaReplClientThread : public pink::ClientThread {\n public:\n PikaReplClientThread(int cron_interval, int keepalive_timeout);\n virtual ~PikaReplClientThread() = default;\n int Start();\n\n private:\n class ReplClientConnFactory : public pink::ConnFactory {\n public:\n virtual std::shared_ptr NewPinkConn(\n int connfd,\n const std::string &ip_port,\n pink::Thread *thread,\n void* worker_specific_data,\n pink::PinkEpoll* pink_epoll) const override {\n return std::static_pointer_cast\n (std::make_shared(connfd, ip_port, thread, worker_specific_data, pink_epoll)); // \u65b0\u8fde\u63a5\u8fdb\u6765\u7684\u65f6\u5019\u901a\u8fc7\u521d\u59cb\u5316\u6210PikaReplClientConn\n }\n };\n class ReplClientHandle : public pink::ClientHandle {\n public:\n void CronHandle() const override {\n }\n void FdTimeoutHandle(int fd, const std::string& ip_port) const override;\n void FdClosedHandle(int fd, const std::string& ip_port) const override;\n bool AccessHandle(std::string& ip) const override {\n // ban 127.0.0.1 if you want to test this routine\n // if (ip.find("127.0.0.2") != std::string::npos) {\n // std::cout << "AccessHandle " << ip << std::endl;\n // return false;\n // }\n return true;\n }\n int CreateWorkerSpecificData(void** data) const override {\n return 0;\n }\n int DeleteWorkerSpecificData(void* data) const override {\n return 0;\n }\n void DestConnectFailedHandle(std::string ip_port, std::string reason) const override {\n }\n };\n\n ReplClientConnFactory conn_factory_;\n ReplClientHandle handle_;\n};\n'})}),"\n",(0,r.jsx)(n.p,{children:"\u7531\u4e8e\u6bcf\u6b21client_thread\u90fd\u4f1a\u5c06\u65b0\u8fde\u63a5\u901a\u8fc7PikaReplClientConn\u6765\u521d\u59cb\u5316\uff0c\u6545\u6bcf\u6b21\u6709\u4e8b\u4ef6\u9a71\u52a8\u7684\u65f6\u5019\u5c31\u8c03\u7528\u8be5PikaReplClientConn\u7684Dealmessage\u51fd\u6570\uff0c\u6765\u5904\u7406\u89e3\u6790\u7684\u6570\u636e\u3002"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-c++",children:'int PikaReplClientConn::DealMessage() {\n std::shared_ptr response = std::make_shared();\n ::google::protobuf::io::ArrayInputStream input(rbuf_ + cur_pos_ - header_len_, header_len_);\n ::google::protobuf::io::CodedInputStream decoder(&input);\n decoder.SetTotalBytesLimit(g_pika_conf->max_conn_rbuf_size(), g_pika_conf->max_conn_rbuf_size());\n bool success = response->ParseFromCodedStream(&decoder) && decoder.ConsumedEntireMessage(); \n if (!success) {\n LOG(WARNING) << "ParseFromArray FAILED! " << " msg_len: " << header_len_;\n g_pika_server->SyncError();\n return -1;\n }\n switch (response->type()) { // \u6839\u636e\u534f\u8bae\u89e3\u6790\u7684\u7c7b\u578b\u6765\u5224\u65ad\u6267\u884c\u4ec0\u4e48\u64cd\u4f5c\n case InnerMessage::kMetaSync:\n {\n ReplClientTaskArg* task_arg = new ReplClientTaskArg(response, std::dynamic_pointer_cast(shared_from_this()));\n g_pika_rm->ScheduleReplClientBGTask(&PikaReplClientConn::HandleMetaSyncResponse, static_cast(task_arg)); // \u5982\u679c\u662f\u5143\u6570\u636e\u540c\u6b65\uff0c\u5c06\u8be5\u4e8b\u4ef6\u653e\u5165\u5230\u5904\u7406\u7ebf\u7a0b\u6c60\u4e2d\u6267\u884c\n break;\n }\n case InnerMessage::kDBSync:\n {\n ReplClientTaskArg* task_arg = new ReplClientTaskArg(response, std::dynamic_pointer_cast(shared_from_this()));\n g_pika_rm->ScheduleReplClientBGTask(&PikaReplClientConn::HandleDBSyncResponse, static_cast(task_arg));\n break;\n }\n case InnerMessage::kTrySync:\n {\n ReplClientTaskArg* task_arg = new ReplClientTaskArg(response, std::dynamic_pointer_cast(shared_from_this()));\n g_pika_rm->ScheduleReplClientBGTask(&PikaReplClientConn::HandleTrySyncResponse, static_cast(task_arg)); // \u5982\u679c\u662f\u540c\u6b65\u5219\u653e\u5165\u7ebf\u7a0b\u6c60\u4e2d\u53bb\u6267\u884cHandleTrySyncResponse\u51fd\u6570\n break;\n }\n case InnerMessage::kBinlogSync:\n {\n DispatchBinlogRes(response); // binlog\u540c\u6b65\u5904\u7406\n break;\n }\n case InnerMessage::kRemoveSlaveNode:\n {\n ReplClientTaskArg* task_arg = new ReplClientTaskArg(response, std::dynamic_pointer_cast(shared_from_this()));\n g_pika_rm->ScheduleReplClientBGTask(&PikaReplClientConn::HandleRemoveSlaveNodeResponse, static_cast(task_arg));\n break;\n }\n default:\n break;\n }\n return 0;\n}\n'})}),"\n",(0,r.jsx)(n.p,{children:"\u81f3\u6b64\uff0c\u4e00\u4e2apika_repl_client\u7684\u6574\u4e2a\u7684\u5904\u7406\u6d41\u7a0b\u5c31\u6e05\u6670\uff0c\u5373\u6bcf\u6b21\u90fd\u4f1a\u6839\u636e\u534f\u8bae\u8c03\u7528PikaReplClientConn\u7684DealMessage\u51fd\u6570\uff0c\u5c06\u6bcf\u4e2a\u6267\u884c\u4efb\u52a1\u653e\u5165\u7ebf\u7a0b\u6c60\u4e2d\u53bb\u5904\u7406\u3002"}),"\n",(0,r.jsx)(n.h4,{id:"pika_repl_server\u7ebf\u7a0b",children:"pika_repl_server\u7ebf\u7a0b"}),"\n",(0,r.jsx)(n.p,{children:"\u8be5\u7ebf\u7a0b\u7684\u6838\u5fc3\u601d\u60f3\u4e0epika_repl_client\u7684\u5904\u7406\u6d41\u7a0b\u5dee\u4e0d\u591a\uff0c\u53ea\u4e0d\u8fc7\u5728pink\u4e2d\u5bf9\u5e94\u7684\u662fHolyThread\uff0c\u5904\u7406\u6d41\u7a0b\u5927\u540c\u5c0f\u5f02\uff0c\u6700\u7ec8\u8c03\u7528\u7684\u5c31\u662fPikaReplServerConn\u7684DealMessage\u65b9\u6cd5\u3002"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-c++",children:'int PikaReplServerConn::DealMessage() {\n std::shared_ptr req = std::make_shared();\n bool parse_res = req->ParseFromArray(rbuf_ + cur_pos_ - header_len_, header_len_);\n if (!parse_res) {\n LOG(WARNING) << "Pika repl server connection pb parse error.";\n return -1;\n }\n switch (req->type()) {\n case InnerMessage::kMetaSync:\n {\n ReplServerTaskArg* task_arg = new ReplServerTaskArg(req, std::dynamic_pointer_cast(shared_from_this()));\n g_pika_rm->ScheduleReplServerBGTask(&PikaReplServerConn::HandleMetaSyncRequest, task_arg);\n break;\n }\n case InnerMessage::kTrySync:\n {\n ReplServerTaskArg* task_arg = new ReplServerTaskArg(req, std::dynamic_pointer_cast(shared_from_this()));\n g_pika_rm->ScheduleReplServerBGTask(&PikaReplServerConn::HandleTrySyncRequest, task_arg);\n break;\n }\n case InnerMessage::kDBSync:\n {\n ReplServerTaskArg* task_arg = new ReplServerTaskArg(req, std::dynamic_pointer_cast(shared_from_this()));\n g_pika_rm->ScheduleReplServerBGTask(&PikaReplServerConn::HandleDBSyncRequest, task_arg);\n break;\n }\n case InnerMessage::kBinlogSync:\n {\n ReplServerTaskArg* task_arg = new ReplServerTaskArg(req, std::dynamic_pointer_cast(shared_from_this()));\n g_pika_rm->ScheduleReplServerBGTask(&PikaReplServerConn::HandleBinlogSyncRequest, task_arg);\n break;\n }\n case InnerMessage::kRemoveSlaveNode:\n {\n ReplServerTaskArg* task_arg = new ReplServerTaskArg(req, std::dynamic_pointer_cast(shared_from_this()));\n g_pika_rm->ScheduleReplServerBGTask(&PikaReplServerConn::HandleRemoveSlaveNodeRequest, task_arg);\n break;\n }\n default:\n break;\n }\n return 0;\n}\n\n'})}),"\n",(0,r.jsx)(n.h3,{id:"\u4e3b\u4ece\u540c\u6b65\u7684\u6d41\u7a0b",children:"\u4e3b\u4ece\u540c\u6b65\u7684\u6d41\u7a0b"}),"\n",(0,r.jsx)(n.p,{children:"pika_repl_server\u7684\u6d41\u7a0b\u53ef\u7528\u5982\u56fe\u63cf\u8ff0\u3002"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{src:"https://img-blog.csdnimg.cn/f5f65e0cb6e74b45a9afbc45933ab12f.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5bGL5a2Q5aSn5L6g,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center",alt:"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0"})}),"\n",(0,r.jsx)(n.p,{children:"pika_repl_client\u7684\u6d41\u7a0b\u53ef\u7528\u5982\u56fe\u63cf\u8ff0\u3002"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{src:"https://img-blog.csdnimg.cn/8cd2006d23814034b0b6372412506363.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5bGL5a2Q5aSn5L6g,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center",alt:"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0"})}),"\n",(0,r.jsx)(n.p,{children:"\u4e3b\u4ece\u7684\u72b6\u6001\u673a\u6d41\u7a0b\u5982\u4e0b\u3002"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{src:"https://img-blog.csdnimg.cn/9fbd751015384d198c2ea514e4ca84b6.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5bGL5a2Q5aSn5L6g,size_12,color_FFFFFF,t_70,g_se,x_16#pic_center",alt:"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0"})}),"\n",(0,r.jsx)(n.p,{children:"\u901a\u8fc7\u5982\u4e0a\u4e09\u4e2a\u56fe\u5c31\u53ef\u4ee5\u80fd\u591f\u660e\u767dpika\u5b98\u7f51\u63cf\u8ff0\u7684\u4e3b\u4ece\u540c\u6b65\u7684\u6d41\u7a0b\u56fe\u3002"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/wiki/pika-%E5%A2%9E%E9%87%8F%E5%90%8C%E6%AD%A5",children:"pika-\u589e\u91cf\u540c\u6b65"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/wiki/pika-%E5%85%A8%E5%90%8C%E6%AD%A5",children:"pika-\u5168\u540c\u6b65"})}),"\n",(0,r.jsx)(n.h2,{id:"\u603b\u7ed3",children:"\u603b\u7ed3"}),"\n",(0,r.jsx)(n.p,{children:"\u672c\u6587\u6839\u636epika\u5b98\u7f51\u7684\u6d41\u7a0b\uff0c\u5206\u6790\u4e86\u4e00\u4e0bpika\u4e3b\u4ece\u7684\u4e00\u4e2a\u5927\u81f4\u6d41\u7a0b\uff0c\u5176\u4e2d\u8fd8\u5305\u542b\u4e86\u5f88\u591a\u7684\u6280\u672f\u7ec6\u8282\u9650\u4e8e\u672c\u6587\u7bc7\u5e45\u5e76\u6ca1\u6709\u8be6\u5c3d\u5206\u6790\uff0c\u4e3b\u8981\u901a\u8fc7\u539f\u7406\u6d41\u7a0b\u7684\u4e00\u4e2a\u5206\u6790\u6765\u67e5\u770b\u4e86\u4e3b\u4ece\u540c\u6b65\u7684\u72b6\u6001\u673a\u7ebf\u7a0b\uff0c\u548c\u4e3b\u4ece\u540c\u6b65\u7684\u7ebf\u7a0b\u6a21\u578b\u7684\u57fa\u672c\u539f\u7406\u3002\u7531\u4e8e\u672c\u4eba\u624d\u758f\u5b66\u6d45\uff0c\u5982\u6709\u9519\u8bef\u8bf7\u6279\u8bc4\u6307\u6b63\u3002"})]})}function c(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>o});var r=t(6540);const i={},s=r.createContext(i);function a(e){const n=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/6edb4994.49230d1c.js b/build/assets/js/6edb4994.49230d1c.js new file mode 100644 index 0000000..98bc9e7 --- /dev/null +++ b/build/assets/js/6edb4994.49230d1c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[72],{4413:(n,i,t)=>{t.r(i),t.d(i,{assets:()=>a,contentTitle:()=>l,default:()=>u,frontMatter:()=>e,metadata:()=>h,toc:()=>s});var p=t(4848),o=t(8453);const e={title:"What's new in Pika v3.5.4",slug:"Pika-3.5.4",authors:[{name:"\u4e8e\u96e8",title:"dubbogo\u793a\u571f\u533a"}],hide_table_of_contents:!1},l=void 0,h={permalink:"/blog/Pika-3.5.4",source:"@site/blog/2024-05-16-Pika-3.5.4.md",title:"What's new in Pika v3.5.4",description:"PikiwiDB(Pika) \u793e\u533a\u975e\u5e38\u8363\u5e78\u5730\u5ba3\u5e03\uff0c\u6211\u4eec\u7684\u6700\u65b0 v3.5.4 \u6b63\u5f0f\u751f\u4ea7\u53ef\u7528\u7248\u672c\u73b0\u5df2\u53d1\u5e03\u3002",date:"2024-05-16T00:00:00.000Z",tags:[],readingTime:5.935,hasTruncateMarker:!1,authors:[{name:"\u4e8e\u96e8",title:"dubbogo\u793a\u571f\u533a"}],frontMatter:{title:"What's new in Pika v3.5.4",slug:"Pika-3.5.4",authors:[{name:"\u4e8e\u96e8",title:"dubbogo\u793a\u571f\u533a"}],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"What's new in PikiwiDB(Pika) v4.0.0",permalink:"/blog/PikiwiDB-Pika--4.0.0"},nextItem:{title:"What's new in Pika v3.5.3 ",permalink:"/blog/Pika-3.5.3"}},a={authorsImageUrls:[void 0]},s=[];function c(n){const i={a:"a",img:"img",li:"li",ol:"ol",p:"p",...(0,o.R)(),...n.components};return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(i.p,{children:"PikiwiDB(Pika) \u793e\u533a\u975e\u5e38\u8363\u5e78\u5730\u5ba3\u5e03\uff0c\u6211\u4eec\u7684\u6700\u65b0 v3.5.4 \u6b63\u5f0f\u751f\u4ea7\u53ef\u7528\u7248\u672c\u73b0\u5df2\u53d1\u5e03\u3002\nv3.5.4 \u89e3\u51b3\u4e86\u5386\u53f2\u9057\u7559\u7684 bug\uff0c\u5bf9 PikiwiDB(Pika) \u7684\u4e00\u4e9b\u9057\u7559 bug \u8fdb\u884c\u4fee\u590d\u548c\u4f18\u5316\uff0c\u65e8\u5728\u6253\u9020\u51fa\u4e00\u4e2a\u9ad8\u7a33\u5b9a\u6027\u7684\u7248\u672c\u3002\u672c\u6b21\u7684\u91cd\u70b9\u4f18\u5316\u4e3b\u8981\u5305\u62ec\uff0cPikiwiDB(Pika)\u652f\u6301\u52a8\u6001\u8c03\u6574\u9650\u901f\u53c2\u6570\u3001\u589e\u5f3a PikiwiDB(Pika) \u7684\u5ba2\u89c2\u6d4b\u6027\u6307\u6807\u3001 \u78c1\u76d8 IO \u9650\u901f\u652f\u6301\u8bfb\u9650\u901f\u53ca\u5199\u9650\u901f\u7b49\u3002\n1 \u65b0\u7279\u6027"}),"\n",(0,p.jsxs)(i.ol,{children:["\n",(0,p.jsx)(i.li,{children:"Pika \u652f\u6301\u52a8\u6001\u8c03\u6574\u5168\u91cf\u540c\u6b65\u9650\u901f\u53c2\u6570 rsync-timeout-ms \u548c throttle-bytes-per-second\u3002"}),"\n"]}),"\n",(0,p.jsx)(i.p,{children:"\u81ea v3.5.0 \u7248\u672c\u5f00\u59cb\uff0cPikiwiDB(Pika) \u670d\u52a1\u6452\u5f03\u4e86\u901a\u8fc7\u5b50\u8fdb\u7a0b\u5185\u4f7f\u7528\u539f\u6765 rsync \u5de5\u5177\u8fdb\u884c\u4e3b\u4ece\u5168\u91cf\u540c\u6b65\u7684\u903b\u8f91\uff0c\u5728 PikiwiDB(Pika) \u5185\u90e8\u4ee5\u7ebf\u7a0b\u65b9\u5f0f\u3010\u79f0\u4f5c rsync \u7ebf\u7a0b\u3011\u81ea\u884c\u5b9e\u73b0\u4e86\u65b0\u7684\u5168\u91cf\u540c\u6b65\u903b\u8f91\uff0c\u907f\u514d\u56e0\u4e3a\u5916\u90e8\u8fdb\u7a0b\u4e0d\u53ef\u63a7\u5f15\u8d77\u7684\u4e3b\u4ece\u540c\u6b65\u95ee\u9898\uff0c\u6839\u636e 360 \u5185\u90e8 Pika \u7ebf\u4e0a\u5927\u89c4\u6a21\u96c6\u7fa4\u8fd0\u7ef4\u7684\u7ecf\u9a8c\uff0c\u5728 PikiwiDB(Pika) \u4e3b\u4ece\u8fdb\u884c\u5168\u91cf\u540c\u6b65\u7684\u8fc7\u7a0b\u4e2d\uff0c\u5982\u679c\u9047\u5230\u67d0\u4e9b\u4e0d\u5229\u7684\u5916\u90e8\u56e0\u7d20\uff0c\u5982\u7f51\u7edc\u6ce2\u52a8\uff0c\u786c\u4ef6\u6545\u969c\uff08\u5982\u7f51\u5361\u964d\u901f\u5bfc\u81f4\u7684\u4e3b\u4ece\u7f51\u5361\u901f\u7387\u4e0d\u5339\u914d\uff09\u7b49\uff0c\u53ef\u80fd\u5f15\u8d77 rsync \u7ebf\u7a0b\u8bf7\u6c42\u6301\u7eed\u8d85\u65f6\uff08PikiwiDB(Pika) \u5185\u7f6e rsync \u6a21\u5757\u7528\u4e8e\u5168\u91cf\u540c\u6b65\u9636\u6bb5\u7684\u6587\u4ef6\u4f20\u8f93\uff09\uff0c\u4e14\u8d85\u65f6\u91cd\u8bd5\u6240\u53d1\u51fa\u7684\u5305\u53ef\u80fd\u5f15\u53d1\u66f4\u5927\u7684\u7f51\u7edc\u4fe1\u9053\u8d1f\u62c5\u3002\u6b64\u65f6\u5bf9\u4e8e\u8fd0\u7ef4\u4eba\u5458\u6765\u8bf4\uff0c\u5982\u679c\u80fd\u52a8\u6001\u8c03\u6574 rsync \u8bf7\u6c42\u7684\u8d85\u65f6\u65f6\u95f4\u548c rsync \u4f20\u8f93\u7684\u901f\u7387\u4e0a\u9650\uff0c\u4e0d\u4ec5\u610f\u5473\u7740\u5bf9\u5168\u91cf\u540c\u6b65\u9636\u6bb5\u63a7\u5236\u7c92\u5ea6\u7684\u8fdb\u4e00\u6b65\u7ec6\u5316\uff0c\u66f4\u5927\u5927\u964d\u4f4e\u4e86\u5728\u8be5\u573a\u666f\u4e0b\u7684\u8fd0\u7ef4\u5904\u7f6e\u96be\u5ea6\u3002"}),"\n",(0,p.jsx)(i.p,{children:"\u5173\u952ePR\uff1a"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2633",children:"https://github.com/OpenAtomFoundation/pika/pull/2633"})}),"\n",(0,p.jsxs)(i.ol,{start:"2",children:["\n",(0,p.jsx)(i.li,{children:"\u5c06 info key space 1 \u7684\u7ed3\u679c\u8f93\u51fa\u81f3 info all \u5e76\u5c55\u793a\u5230\u76d1\u63a7\u754c\u9762\u4e2d\u3002"}),"\n"]}),"\n",(0,p.jsx)(i.p,{children:"PikiwiDB(Pika) \u662f\u901a\u8fc7 Info \u547d\u4ee4\u91c7\u96c6\u6570\u636e\u81f3 Pika-Exporter\uff0c\u5c55\u793a\u5230 Grafana \u754c\u9762\u4e0a\u7684\uff0c\u76ee\u524d\u754c\u9762\u4e0a\u90e8\u5206\u6570\u636e\u662f\u6ca1\u6709\u5c55\u793a\u7684\uff0c\u5982 keys \u7684\u6570\u91cf\uff0c\u672c\u6b21\u5c06\u6267\u884c info keyspace \u7684\u7ed3\u679c\u5c55\u793a\u5230\u76d1\u63a7\u754c\u9762\uff0c\u7528\u6237\u53ef\u4ee5\u901a\u8fc7\u8fd9\u4e2a\u6307\u6807\u6765\u67e5\u770b\u5b58\u50a8\u7684\u91cf\u7ea7\u7b49\u3002"}),"\n",(0,p.jsx)(i.p,{children:"\u5173\u952ePR\uff1a"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2603",children:"https://github.com/OpenAtomFoundation/pika/pull/2603"})}),"\n",(0,p.jsx)(i.p,{children:"3.Pika \u78c1\u76d8IO \u9650\u901f\u53c2\u6570\u652f\u6301 OnlyRead\u3001OnlyWrite\u3001ReadAndWrite\uff0c\u9ed8\u8ba4\u652f\u6301OnlyWrite\u3002"}),"\n",(0,p.jsx)(i.p,{children:"\u81ea3.5.0\u7248\u672c\u5f00\u59cb\uff0cPikiwiDB(Pika) \u670d\u52a1\u53ef\u4ee5\u901a\u8fc7\u8c03\u6574 rate-limit \u53c2\u6570\u5b9e\u73b0\u5199\u9650\u901f\uff0c\u9632\u6b62\u5728\u7f51\u5361\u8d28\u91cf\u4e0d\u9ad8\u7684\u60c5\u51b5\u4e0b\u78c1\u76d8 IO \u8fc7\u91cd\u5bfc\u81f4\u670d\u52a1\u4e0d\u53ef\u7528\uff0c\u6216\u8005 binlog \u963b\u585e\u7684\u60c5\u51b5\u53d1\u751f\u3002360\u5185\u90e8 Pika \u7ebf\u4e0a\u5927\u89c4\u6a21\u96c6\u7fa4\u8fd0\u7ef4\u7684\u7ecf\u9a8c\uff0c\u5728 PikiwiDB(Pika) \u5b9e\u4f8b\u7684\u7f51\u5361\u8f83\u5dee\u60c5\u51b5\u4e0b\uff0c\u4e5f\u9700\u8981\u5bf9\u8bfb\u5b9e\u4f8b\u8fdb\u884c\u9650\u901f\uff0c\u672c\u6b21\u4fee\u6539\u652f\u6301\u8bfb\u3001\u5199\u9650\u901f\uff0c\u9ed8\u8ba4\u662f\u5199\u9650\u901f\uff0c\u8c03\u6574 config \u914d\u7f6e\u4e2d\u7684 rate-limiter-mode \u53ef\u4ee5\u8bbe\u7f6e\u4e3a\u8bfb\u9650\u901f\uff0c\u6216\u8005\u540c\u65f6\u8bfb\u5199\u9650\u901f\u3002"}),"\n",(0,p.jsx)(i.p,{children:"\u5173\u952ePR\uff1a"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2599",children:"https://github.com/OpenAtomFoundation/pika/pull/2599"})}),"\n",(0,p.jsx)(i.p,{children:"2 \u6539\u8fdb\u5217\u8868"}),"\n",(0,p.jsx)(i.p,{children:"slotmigrate \u6dfb\u52a0 go test\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2576",children:"https://github.com/OpenAtomFoundation/pika/pull/2576"})}),"\n",(0,p.jsx)(i.p,{children:"INFO \u547d\u4ee4\u8017\u65f6\u4f18\u5316\uff0c\u964d\u4f4e\u67e5\u78c1\u76d8\u9891\u7387\uff0c\u907f\u514d\u56e0\u4e3a\u6570\u636e\u91c7\u96c6\u8c03\u7528 info \u547d\u4ee4\u65f6\u67e5\u78c1\u76d8\u592a\u8fc7\u9891\u7e41\u5bfc\u81f4\u670d\u52a1\u6027\u80fd\u4e0b\u964d\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2554",children:"https://github.com/OpenAtomFoundation/pika/pull/2554"})}),"\n",(0,p.jsx)(i.p,{children:"\u5bf9\u4e94\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u547d\u4ee4\u589e\u52a0 Redis tcl \u6d4b\u8bd5\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2527",children:"https://github.com/OpenAtomFoundation/pika/pull/2527"})}),"\n",(0,p.jsx)(i.p,{children:"3 Bug \u4fee\u590d"}),"\n",(0,p.jsx)(i.p,{children:"\u4fee\u590d\u4f7f\u7528 Pika Exporter \u65f6\u53ef\u80fd\u4f1a\u51fa\u73b0 slots \u5206\u914d\u4e0d\u5747\u8861\u7684\u95ee\u9898\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2651",children:"https://github.com/OpenAtomFoundation/pika/pull/2651"})}),"\n",(0,p.jsx)(i.p,{children:"\u4fee\u590d Codis dashboard \u4e0d\u80fd\u6b63\u786e\u66f4\u65b0 master \u5b9e\u4f8b\u72b6\u6001\u7684\u95ee\u9898\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2650",children:"https://github.com/OpenAtomFoundation/pika/pull/2650"})}),"\n",(0,p.jsx)(i.p,{children:"\u4fee\u590d Redis \u4e8b\u52a1 binlog \u89e3\u6790\u5931\u8d25\u5bfc\u81f4\u7684\u4e3b\u4ece\u540c\u6b65\u5f02\u5e38\u95ee\u9898\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2642",children:"https://github.com/OpenAtomFoundation/pika/pull/2642"})}),"\n",(0,p.jsx)(i.p,{children:"\u4fee\u590d Pika Expoter \u542f\u52a8\u65f6\u4e0d\u5e26\u53c2\u6570\u5bfc\u81f4\u542f\u52a8\u5931\u8d25\u95ee\u9898\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2640",children:"https://github.com/OpenAtomFoundation/pika/pull/2640"})}),"\n",(0,p.jsx)(i.p,{children:"\u4fee\u590d\u4f7f\u7528 Pika Operater \u62c9\u8d77\u96c6\u7fa4 Codis-proxy panic \u7684\u95ee\u9898\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2633",children:"https://github.com/OpenAtomFoundation/pika/pull/2633"})}),"\n",(0,p.jsx)(i.p,{children:"\u4fee\u590d CI \u7f16\u8bd1\u51fa\u7684\u4e8c\u8fdb\u5236\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u65f6 cp \u547d\u4ee4\u5931\u8d25\u95ee\u9898\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2614",children:"https://github.com/OpenAtomFoundation/pika/pull/2614"})}),"\n",(0,p.jsx)(i.p,{children:"\u4fee\u590d\u53d8\u91cf\u672a\u521d\u59cb\u5316\u5bfc\u81f4 cache \u542f\u52a8\u5931\u8d25\u7684\u95ee\u9898\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2613",children:"https://github.com/OpenAtomFoundation/pika/pull/2613"})}),"\n",(0,p.jsx)(i.p,{children:"\u4fee\u590d userpass \u548c userblacklist \u52a8\u6001\u4fee\u6539\u53c2\u6570\u529f\u80fd\u5f02\u5e38\u95ee\u9898\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2600",children:"https://github.com/OpenAtomFoundation/pika/pull/2600"})}),"\n",(0,p.jsx)(i.p,{children:"\u4fee\u590d scard sscan \u7ed3\u679c\u4e0d\u4e00\u81f4\u7684\u95ee\u9898\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2596",children:"https://github.com/OpenAtomFoundation/pika/pull/2596"})}),"\n",(0,p.jsx)(i.p,{children:"\u4fee\u590d\u5f53 max-rsync-parallel-num \u5927\u4e8e4\uff0cslave \u4f1a\u5728\u4e3b\u4ece\u590d\u5236\u65f6 coredump \u7684\u95ee\u9898\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2595",children:"https://github.com/OpenAtomFoundation/pika/pull/2595"})}),"\n",(0,p.jsx)(i.p,{children:"\u8c03\u6574\u4e0d\u5e38\u7528\u7684\u7ebf\u7a0b\u6c60\u7ebf\u7a0b\u6570\uff0c\u907f\u514d\u56e0\u4e3a\u7a7a\u8dd1\u5bfc\u81f4\u6027\u80fd\u635f\u8017\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2590",children:"https://github.com/OpenAtomFoundation/pika/pull/2590"})}),"\n",(0,p.jsx)(i.p,{children:"\u4fee\u590d Pika \u4e8b\u52a1\u8fb9\u7f18\u6d4b\u8bd5 case \u4e0d\u901a\u8fc7\u7684\u95ee\u9898\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2586",children:"https://github.com/OpenAtomFoundation/pika/pull/2586"})}),"\n",(0,p.jsx)(i.p,{children:"\u5c06 cache-model \u4fee\u6539\u6210 cache-mode\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2585",children:"https://github.com/OpenAtomFoundation/pika/pull/2585"})}),"\n",(0,p.jsx)(i.p,{children:"\u4fee\u590d\u4f7f\u7528 info keyspace \u540e\uff0cinfo all \u6b7b\u9501\u7684\u95ee\u9898\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2584",children:"https://github.com/OpenAtomFoundation/pika/pull/2584"})}),"\n",(0,p.jsx)(i.p,{children:"\u4fee\u590d\u56e0\u4fee\u6539 zsetscorekey comparator impl \u5b57\u5178\u5e8f\u6bd4\u8f83\u719f\u987a\u5e8f\uff0c\u5bfc\u81f4 353 352\u6781\u7aef\u573a\u666f\u4e0d\u517c\u5bb9\u7684\u95ee\u9898\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2583",children:"https://github.com/OpenAtomFoundation/pika/pull/2583"})}),"\n",(0,p.jsx)(i.p,{children:"\u4fee\u590d compact \u6b7b\u9501\u7684\u95ee\u9898\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2581",children:"https://github.com/OpenAtomFoundation/pika/pull/2581"})}),"\n",(0,p.jsx)(i.p,{children:"Slotmigrate \u6dfb\u52a0 go test\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2576",children:"https://github.com/OpenAtomFoundation/pika/pull/2576"})}),"\n",(0,p.jsx)(i.p,{children:"\u66f4\u65b0 Pika Operater \u4f7f\u7528\u7684 pika \u7248\u672c\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2572",children:"https://github.com/OpenAtomFoundation/pika/pull/2572"})}),"\n",(0,p.jsx)(i.p,{children:"\u4fee\u590d config rewrite \u540e blockcache \u6570\u503c\u5f02\u5e38\u7684\u95ee\u9898\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2561",children:"https://github.com/OpenAtomFoundation/pika/pull/2561"})}),"\n",(0,p.jsx)(i.p,{children:"\u4fee\u590d slotmigrate \u52a8\u6001\u4fee\u590d\u540e\u503c\u9519\u8bef\u7684\u95ee\u9898\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2548",children:"https://github.com/OpenAtomFoundation/pika/pull/2548"})}),"\n",(0,p.jsx)(i.p,{children:"\u4fee\u590d spop \u53ef\u80fd\u4f1a\u51fa\u73b0\u4e3b\u4ece\u6570\u636e\u4e0d\u4e00\u81f4\u7684\u95ee\u9898\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2541",children:"https://github.com/OpenAtomFoundation/pika/pull/2541"})}),"\n",(0,p.jsx)(i.p,{children:"\u4fee\u590d CloseFd(it->second[i]) \u51fa\u73b0\u8d8a\u754c\u7684\u95ee\u9898\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2539",children:"https://github.com/OpenAtomFoundation/pika/pull/2539"})}),"\n",(0,p.jsx)(i.p,{children:"\u4fee\u590d Flushall \u548c FlushDB \u6b7b\u9501\u7684\u9690\u60a3\uff0c\u5e76\u5220\u9664 FlushSubDB \u63a5\u53e3\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2533",children:"https://github.com/OpenAtomFoundation/pika/pull/2533"})}),"\n",(0,p.jsx)(i.p,{children:"\u589e\u52a0\u53c2\u6570\u63a7\u5236\u662f\u5426\u6e05\u7406 tcl \u6d4b\u8bd5\u540e\u4ea7\u751f\u7684\u6570\u636e\u6587\u4ef6\uff0c\u9632\u6b62\u5e9f\u5f03\u6570\u636e\u5360\u636e\u78c1\u76d8\u3002"}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2507",children:"https://github.com/OpenAtomFoundation/pika/pull/2507"})}),"\n",(0,p.jsx)(i.p,{children:(0,p.jsx)(i.img,{alt:"2024-05-16-Pika-3.5.4-connect.png",src:t(8973).A+"",width:"747",height:"431"})})]})}function u(n={}){const{wrapper:i}={...(0,o.R)(),...n.components};return i?(0,p.jsx)(i,{...n,children:(0,p.jsx)(c,{...n})}):c(n)}},8973:(n,i,t)=>{t.d(i,{A:()=>p});const p=t.p+"assets/images/2024-05-16-Pika-3.5.4-connect-c43aca0eeeb5cd09cc60b55f9a3df4e5.png"},8453:(n,i,t)=>{t.d(i,{R:()=>l,x:()=>h});var p=t(6540);const o={},e=p.createContext(o);function l(n){const i=p.useContext(e);return p.useMemo((function(){return"function"==typeof n?n(i):{...i,...n}}),[i,n])}function h(n){let i;return i=n.disableParentContext?"function"==typeof n.components?n.components(o):n.components||o:l(n.components),p.createElement(e.Provider,{value:i},n.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/7074118c.fde43517.js b/build/assets/js/7074118c.fde43517.js new file mode 100644 index 0000000..03f5be7 --- /dev/null +++ b/build/assets/js/7074118c.fde43517.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[4674],{4044:(i,e,n)=>{n.r(e),n.d(e,{assets:()=>o,contentTitle:()=>t,default:()=>p,frontMatter:()=>c,metadata:()=>a,toc:()=>d});var s=n(4848),r=n(8453);const c={title:"\u8c03\u6574 max-write-buffer-size \u4f18\u5316 pika \u6027\u80fd10\u500d\u7684\u6848\u4f8b",sidebar_position:1},t=void 0,a={id:"\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/\u8c03\u6574 max-write-buffer-size \u4f18\u5316 pika \u6027\u80fd10\u500d\u7684\u6848\u4f8b/index",title:"\u8c03\u6574 max-write-buffer-size \u4f18\u5316 pika \u6027\u80fd10\u500d\u7684\u6848\u4f8b",description:"\u73b0\u5c45\u73e0\u6d77\uff0c\u5148\u540e\u62c5\u4efb\u4e13\u804c Oracle \u548c MySQL DBA\uff0c\u73b0\u5728\u4e3b\u8981\u8d1f\u8d23 MySQL\u3001mongoDB \u548c Redis \u7ef4\u62a4\u5de5\u4f5c\u3002",source:"@site/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/\u8c03\u6574 max-write-buffer-size \u4f18\u5316 pika \u6027\u80fd10\u500d\u7684\u6848\u4f8b/index.md",sourceDirName:"\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/\u8c03\u6574 max-write-buffer-size \u4f18\u5316 pika \u6027\u80fd10\u500d\u7684\u6848\u4f8b",slug:"/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/\u8c03\u6574 max-write-buffer-size \u4f18\u5316 pika \u6027\u80fd10\u500d\u7684\u6848\u4f8b/",permalink:"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/\u8c03\u6574 max-write-buffer-size \u4f18\u5316 pika \u6027\u80fd10\u500d\u7684\u6848\u4f8b/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/\u8c03\u6574 max-write-buffer-size \u4f18\u5316 pika \u6027\u80fd10\u500d\u7684\u6848\u4f8b/index.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"\u8c03\u6574 max-write-buffer-size \u4f18\u5316 pika \u6027\u80fd10\u500d\u7684\u6848\u4f8b",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"\u559c\u9a6c\u62c9\u96c5 Redis \u4e0e Pika \u7f13\u5b58\u4f7f\u7528\u519b\u89c4",permalink:"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/\u559c\u9a6c\u62c9\u96c5 Redis \u4e0e Pika \u7f13\u5b58\u4f7f\u7528\u519b\u89c4/"},next:{title:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/"}},o={},d=[{value:"1\u3001\u80cc\u666f",id:"1\u80cc\u666f",level:2},{value:"2\u3001\u8bca\u65ad",id:"2\u8bca\u65ad",level:2},{value:"3\u3001\u7ed3\u8bba",id:"3\u7ed3\u8bba",level:2}];function l(i){const e={a:"a",h1:"h1",h2:"h2",hr:"hr",img:"img",li:"li",ol:"ol",p:"p",...(0,r.R)(),...i.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(e.p,{children:"\u73b0\u5c45\u73e0\u6d77\uff0c\u5148\u540e\u62c5\u4efb\u4e13\u804c Oracle \u548c MySQL DBA\uff0c\u73b0\u5728\u4e3b\u8981\u8d1f\u8d23 MySQL\u3001mongoDB \u548c Redis \u7ef4\u62a4\u5de5\u4f5c\u3002"}),"\n",(0,s.jsx)(e.p,{children:"\u672c\u6587\u6765\u6e90\uff1a\u539f\u521b\u6295\u7a3f"}),"\n",(0,s.jsx)(e.p,{children:"*\u7231\u53ef\u751f\u5f00\u6e90\u793e\u533a\u51fa\u54c1\uff0c\u539f\u521b\u5185\u5bb9\u672a\u7ecf\u6388\u6743\u4e0d\u5f97\u968f\u610f\u4f7f\u7528\uff0c\u8f6c\u8f7d\u8bf7\u8054\u7cfb\u5c0f\u7f16\u5e76\u6ce8\u660e\u6765\u6e90\u3002"}),"\n",(0,s.jsx)(e.hr,{}),"\n",(0,s.jsx)(e.h2,{id:"1\u80cc\u666f",children:"1\u3001\u80cc\u666f"}),"\n",(0,s.jsx)(e.p,{children:"\u67d0\u4e1a\u52a1\u5199\u591a\u8bfb\u5c11\uff0c\u4e0a\u7ebf\u524d\u9884\u4f30TPS\u6700\u9ad8\u53ef\u8fbe4w\u4e14\u53ef\u80fd\u4f1a\u968f\u65f6\u589e\u957f\uff0c\u53bb\u5e74\u4e0a\u7ebf\u65f6\u91c7\u7528\u4e86mongo 4\u5206\u7247\u96c6\u7fa4\u67b6\u6784\u3002"}),"\n",(0,s.jsx)(e.p,{children:"\u73b0\u5728\u4e1a\u52a1\u8d8b\u4e8e\u7a33\u5b9a\uff0c\u65e5\u5e38TPS\u53ea\u6709\u6700\u9ad8\u503c\u76841/10\u4e0d\u5230\uff0c\u9879\u76ee\u7ec4\u51fa\u4e8e\u6210\u672c\u8003\u8651\u60f3\u8981\u5c06\u5176\u8fc1\u79fb\u5230\u5185\u5b58KV\u6570\u636e\u5e93\uff0c\u4f46\u662f redis\u7eaf\u5185\u5b58\u6a21\u5f0f\u673a\u5668\u6210\u672c\u6709\u70b9\u9ad8\uff0c\u7ecf\u8fc7\u8c03\u7814\u540e\u51b3\u5b9a\u5c1d\u8bd5360\u5f00\u6e90\u7684pika\u3002"}),"\n",(0,s.jsx)(e.p,{children:"\u6211\u4eec\u91c7\u7528\u7684\u662f3.3.6\u7248\u672c\uff0c\u673a\u5668A\u914d\u7f6e\u4e3a8c8G200G\uff0c\u538b\u6d4b\u51fa\u73b0\u5927\u91cf\u8d85\u65f6ERROR: redis: connection pool timeout\uff0cqps\u53ea\u67093k\u5de6\u53f3\uff0c\u4e14\u78c1\u76d8\u7684%util \u4e00\u76f4\u63a5\u8fd1100\uff0c\u5904\u4e8e\u201c\u9971\u548c\u201d\u72b6\u6001\u3002"}),"\n",(0,s.jsx)(e.p,{children:"\u540c\u6837\u7248\u672c\u7684pika\uff0c\u5728\u673a\u5668B\u4e0a\u6d4b\u8bd5\uff0cqps\u80fd\u8fbe\u523040K\u4e14\u6ca1\u67091\u4e2a\u8d85\u65f6\u9519\u8bef\uff0c\u8fd9\u53f0\u673a\u5668\u914d\u7f6e24c48G1.5T\u3002 \u4ece\u591a\u5bb6\u4e91\u5382\u5546\u90a3\u91cc\u83b7\u6089\u76f8\u540c\u578b\u53f7\u7684\u4e91\u4e3b\u673a\uff0c\u786c\u76d8\u5bb9\u91cf\u8d8a\u5927IO\u541e\u5410\u4f1a\u8d8a\u9ad8\uff0c\u56e0\u6b64\u4e00\u5f00\u59cb\u6000\u7591\u662f\u786c\u4ef6\u95ee\u9898\u3002"}),"\n",(0,s.jsx)(e.p,{children:"\u9488\u5bf9\u4e24\u53f0\u4e91\u4e3b\u673a\u8fdb\u884cFIO\u6d4b\u8bd5\uff0c\u914d\u7f6e\u66f4\u9ad8\u7684\u673a\u5668\u8bfb\u5199\u541e\u5410\u662f\u4f1a\u9ad8\u4e00\u4e9b(\u5927\u6982\u63d0\u534720%\u5de6\u53f3)\uff0c\u4f46\u5e76\u6ca1\u6709pika qps\u6307\u6807\u76f8 \u5dee10\u500d\u8fd9\u4e48\u5938\u5f20\u3002"}),"\n",(0,s.jsx)(e.p,{children:"\u5c06\u673a\u5668B\u7684pika\u914d\u7f6e\u6587\u4ef6\u590d\u5236\u5230\u673a\u5668A\u4e0a\uff0c\u91cd\u542fpika\u518d\u6d4b\u8fdb\u884c\u538b\u6d4b\uff0c\u8fd9\u6b21\u673a\u5668A\u7684qps\u4e5f\u80fd\u8fbe\u523040K\uff0c\u8bf4\u660epika\u914d\u7f6e \u53c2\u6570\u5bfc\u81f4\u7684\u6027\u80fd\u5dee\u5f02\u3002"}),"\n",(0,s.jsx)(e.h2,{id:"2\u8bca\u65ad",children:"2\u3001\u8bca\u65ad"}),"\n",(0,s.jsx)(e.p,{children:"\u4e24\u4e2a\u914d\u7f6e\u6587\u4ef6\u53c2\u6570\u76f8\u5dee\u7684\u6709\u70b9\u591a\uff0c\u53ea\u80fd\u9010\u4e2a\u4fee\u6539\u5e76\u538b\u6d4b\u3002"}),"\n",(0,s.jsx)(e.p,{children:"\u6d4b\u8bd5\u8fc7\u7a0b\u7565\u8fc7\uff0c\u6700\u540e\u786e\u8ba4\u662fmax-write-buffer-size\u8bbe\u7f6e\u4e0d\u5408\u7406\u5bfc\u81f4\u7684\uff0c\u8be5\u53c2\u6570\u9ed8\u8ba4\u503c14045392(13M)\uff0c\u8c03\u5927\u4e3a 4294967296(4G)\u540epika qps\u5c31\u4ece3k\u63d0\u5347\u5230\u4e8640K\u3002"}),"\n",(0,s.jsx)(e.p,{children:(0,s.jsx)(e.img,{src:"https://action-weikai.oss-cn-shanghai.aliyuncs.com/renkun0518-1.png",alt:""})}),"\n",(0,s.jsx)(e.p,{children:"\u4ee5\u4e0b\u662f\u5bf9\u5e94\u6d4b\u8bd5\u6848\u4f8b\u7684iostat\u622a\u56fe"}),"\n",(0,s.jsx)(e.p,{children:"\u2014 max-write-buffer-size 14045392(13M)"}),"\n",(0,s.jsx)(e.p,{children:(0,s.jsx)(e.img,{src:"https://action-weikai.oss-cn-shanghai.aliyuncs.com/renkun0518-2.png",alt:""})}),"\n",(0,s.jsx)(e.p,{children:"\u2014 max-write-buffer-size 4294967296"}),"\n",(0,s.jsx)(e.p,{children:(0,s.jsx)(e.img,{src:"https://action-weikai.oss-cn-shanghai.aliyuncs.com/renkun0518-3.png",alt:""})}),"\n",(0,s.jsx)(e.p,{children:"\u4e24\u8005\u6700\u5927\u7684\u5dee\u5f02\u662fw/s\u548cavgrq-sz\uff0c\u5176\u4e2davgrq-sz\u63cf\u8ff0\u7684\u662fIO\u8bf7\u6c42\u7684\u5e73\u5747\u5927\u5c0f\uff0c\u4ee5\u6247\u533a\uff08512\u5b57\u8282\uff09\u4e3a\u5355\u4f4d\u3002"}),"\n",(0,s.jsx)(e.p,{children:"\u56fe1\u6bcf\u79d2\u78c1\u76d8\u5199\u8bf7\u6c424700\uff0c\u6bcf\u4e2a\u8bf7\u6c42\u5e73\u5747\u5927\u5c0f\u4e3a55 * 0.5 ~= 27.5K\uff0c\u51fa\u73b0\u4e86\u5927\u91cf\u7684\u5c0f\u5757\u5199\u3002"}),"\n",(0,s.jsx)(e.p,{children:"\u56fe2\u6bcf\u79d2\u78c1\u76d8\u5199\u8bf7\u6c42200\u5de6\u53f3\uff0c\u6bcf\u4e2a\u8bf7\u6c42\u5e73\u5747\u5927\u5c0f\u4e3a800 * 0.5 ~= 400K\uff0c\u660e\u663e\u91c7\u7528\u4e86\u6279\u91cf\u843d\u76d8\u7684\u7b56\u7565\u3002"}),"\n",(0,s.jsx)(e.p,{children:"\u518d\u770b%util \u6307\u6807\uff0c\u8fd9\u4e2a\u4e0d\u662f\u6211\u4eec\u901a\u5e38\u7406\u89e3\u7684\u78c1\u76d8\u9971\u548c\u5ea6\uff0c\u800c\u662f\u78c1\u76d8\u4f7f\u7528\u7387\uff0c\u5176\u8ba1\u7b97\u65f6\u53ea\u5173\u6ce8io\u8bf7\u6c42\u6570\u91cf\uff0c\u4e0d\u7406\u4f1a\u6bcf \u4e2aio\u8bf7\u6c42\u7684\u5927\u5c0f\uff0c\u5373\u4fbf\u8fbe\u5230\u4e86100\uff0c\u5e76\u4e0d\u610f\u5473\u7740\u78c1\u76d8\u541e\u5410\u5df2\u8fbe\u4e0a\u9650\u3002"}),"\n",(0,s.jsx)(e.p,{children:"\u5047\u8bbe\u67d0\u8def\u6bb5\u67091w\u8f86\u79c1\u5bb6\u8f66(\u6bcf\u8f66\u53ea\u67091\u4e2a\u4eba\uff0cavgrq-sz=1)\u540c\u65f6\u901a\u884c\uff0c\u5373\u4fbf\u5e73\u5747\u6bcf\u79d2\u653e\u884c10\u8f86\u8f66(w/s=10)\uff0c\u603b\u4f53\u8fd0 \u529b\u4e5f\u53ea\u670910\u4eba/s\uff0c\u82e5\u662f\u6539\u621050\u5ea7\u5927\u5df4\u8f66(avgrq-sz=50)\uff0c\u5373\u4fbf\u6bcf\u79d2\u53ea\u653e\u884c1\u8f86\u8f66(w/s=1)\uff0c\u603b\u4f53\u8fd0\u529b\u4e5f\u4f1a\u63d0\u9ad8\u523050 \u4eba/s\u3002"}),"\n",(0,s.jsx)(e.p,{children:"\u5728\u8fd9\u4e2a\u6848\u4f8b\u4e2d\uff0c%util \u8bb0\u5f55\u7684\u53ea\u662f\u5e73\u5747\u6bcf\u79d2\u901a\u884c\u7684\u673a\u52a8\u8f66\u6570\u91cf\uff0c\u4e0d\u5173\u5fc3\u6bcf\u8f86\u8f66\u5750\u4e86\u591a\u5c11\u4eba\uff0c\u5982\u679c\u79c1\u5bb6\u8f66\u7684%util \u662f 100\uff0c\u90a3\u5927\u5df4\u8f66\u7684%util\u53ea\u670910\u5e76\u4e14\u541e\u5410\u66f4\u9ad8\uff0c\u8ddf\u4e0a\u8ff0\u622a\u56fe\u63cf\u8ff0\u7684\u573a\u666f\u5341\u5206\u543b\u5408\u3002"}),"\n",(0,s.jsxs)(e.p,{children:["\u5173\u4e8emax-write-buffer-size\u53c2\u6570\uff0cpika\u5b98\u6863\u539f\u6587\u5982\u4e0b\uff1a",(0,s.jsx)(e.a,{href:"https://github.com/OpenAtomFoundation/pika/wiki/pika-",children:"https://github.com/OpenAtomFoundation/pika/wiki/pika-"})," %E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E8%AF%B4%E6%98%8E"]}),"\n",(0,s.jsxs)(e.p,{children:["# Pika \u5e95\u5c42\u5355\u4e2arocksdb\u5355\u4e2amemtable\u7684\u5927\u5c0f, \u8bbe\u7f6e\u8d8a\u5927\u5199\u5165\u6027\u80fd\u8d8a\u597d\u4f46\u4f1a\u5728buffer\u5237\u76d8\u65f6\u5e26\u6765\u66f4\u5927\u7684IO\u8d1f\u8f7d, \u8bf7 \u4f9d\u636e\u4f7f\u7528\u573a\u666f\u5408\u7406\u914d\u7f6e\n[RocksDb\u2010Tuning\u2010Guide](",(0,s.jsx)(e.a,{href:"https://github.com/facebook/rocksdb/wiki/RocksDB%E2%80%90Tuning%E2%80%90Guide",children:"https://github.com/facebook/rocksdb/wiki/RocksDB\u2010Tuning\u2010Guide"}),")\nwrite\u2010buffer\u2010size : 268435456"]}),"\n",(0,s.jsx)(e.h1,{id:"pika\u5b9e\u4f8b\u6240\u62e5\u6709\u7684rocksdb\u5b9e\u4f8b\u4f7f\u7528\u7684memtable\u5927\u5c0f\u4e0a\u9650\u5982\u679crocksdb\u5b9e\u9645\u4f7f\u7528\u8d85\u8fc7\u8fd9\u4e2a\u6570\u503c\u4e0b\u4e00\u6b21\u5199\u5165\u4f1a\u9020\u6210-\u5237\u76d8",children:"pika\u5b9e\u4f8b\u6240\u62e5\u6709\u7684rocksdb\u5b9e\u4f8b\u4f7f\u7528\u7684memtable\u5927\u5c0f\u4e0a\u9650\uff0c\u5982\u679crocksdb\u5b9e\u9645\u4f7f\u7528\u8d85\u8fc7\u8fd9\u4e2a\u6570\u503c\uff0c\u4e0b\u4e00\u6b21\u5199\u5165\u4f1a\u9020\u6210 \u5237\u76d8"}),"\n",(0,s.jsxs)(e.p,{children:["[Rocksdb\u2010Basic\u2010Tuning](",(0,s.jsx)(e.a,{href:"https://github.com/facebook/rocksdb/wiki/Setup%E2%80%90Options%E2%80%90and%E2%80%90Basic%E2%80%90Tuning",children:"https://github.com/facebook/rocksdb/wiki/Setup\u2010Options\u2010and\u2010Basic\u2010Tuning"}),")\nmax\u2010write\u2010buffer\u2010size : 10737418240"]}),"\n",(0,s.jsxs)(e.ol,{children:["\n",(0,s.jsxs)(e.li,{children:["\n",(0,s.jsx)(e.p,{children:"# Pika \u5e95\u5c42\u5355\u4e2arocksdb\u5355\u4e2amemtable\u7684\u5927\u5c0f, \u8bbe\u7f6e\u8d8a\u5927\u5199\u5165\u6027\u80fd\u8d8a\u597d\u4f46\u4f1a\u5728buffer\u5237\u76d8\u65f6\u5e26\u6765\u66f4\u5927\u7684IO\u8d1f\u8f7d, \u8bf7 \u4f9d\u636e\u4f7f\u7528\u573a\u666f\u5408\u7406\u914d\u7f6e"}),"\n"]}),"\n",(0,s.jsxs)(e.li,{children:["\n",(0,s.jsxs)(e.p,{children:["[RocksDb\u2010Tuning\u2010Guide](",(0,s.jsx)(e.a,{href:"https://github.com/facebook/rocksdb/wiki/RocksDB%E2%80%90Tuning%E2%80%90Guide",children:"https://github.com/facebook/rocksdb/wiki/RocksDB\u2010Tuning\u2010Guide"}),")"]}),"\n"]}),"\n",(0,s.jsxs)(e.li,{children:["\n",(0,s.jsx)(e.p,{children:"write\u2010buffer\u2010size : 268435456"}),"\n"]}),"\n",(0,s.jsxs)(e.li,{children:["\n",(0,s.jsx)(e.p,{children:"# pika\u5b9e\u4f8b\u6240\u62e5\u6709\u7684rocksdb\u5b9e\u4f8b\u4f7f\u7528\u7684memtable\u5927\u5c0f\u4e0a\u9650\uff0c\u5982\u679crocksdb\u5b9e\u9645\u4f7f\u7528\u8d85\u8fc7\u8fd9\u4e2a\u6570\u503c\uff0c\u4e0b\u4e00\u6b21\u5199\u5165\u4f1a\u9020\u6210 \u5237\u76d8"}),"\n"]}),"\n",(0,s.jsxs)(e.li,{children:["\n",(0,s.jsxs)(e.p,{children:["[Rocksdb\u2010Basic\u2010Tuning](",(0,s.jsx)(e.a,{href:"https://github.com/facebook/rocksdb/wiki/Setup%E2%80%90Options%E2%80%90and%E2%80%90Basic%E2%80%90Tuning",children:"https://github.com/facebook/rocksdb/wiki/Setup\u2010Options\u2010and\u2010Basic\u2010Tuning"}),")"]}),"\n"]}),"\n",(0,s.jsxs)(e.li,{children:["\n",(0,s.jsx)(e.p,{children:"max\u2010write\u2010buffer\u2010size : 10737418240"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(e.p,{children:["# Pika \u5e95\u5c42\u5355\u4e2arocksdb\u5355\u4e2amemtable\u7684\u5927\u5c0f, \u8bbe\u7f6e\u8d8a\u5927\u5199\u5165\u6027\u80fd\u8d8a\u597d\u4f46\u4f1a\u5728buffer\u5237\u76d8\u65f6\u5e26\u6765\u66f4\u5927\u7684IO\u8d1f\u8f7d, \u8bf7 \u4f9d\u636e\u4f7f\u7528\u573a\u666f\u5408\u7406\u914d\u7f6e\n[RocksDb\u2010Tuning\u2010Guide](",(0,s.jsx)(e.a,{href:"https://github.com/facebook/rocksdb/wiki/RocksDB%E2%80%90Tuning%E2%80%90Guide",children:"https://github.com/facebook/rocksdb/wiki/RocksDB\u2010Tuning\u2010Guide"}),")\nwrite\u2010buffer\u2010size : 268435456"]}),"\n",(0,s.jsx)(e.h1,{id:"pika\u5b9e\u4f8b\u6240\u62e5\u6709\u7684rocksdb\u5b9e\u4f8b\u4f7f\u7528\u7684memtable\u5927\u5c0f\u4e0a\u9650\u5982\u679crocksdb\u5b9e\u9645\u4f7f\u7528\u8d85\u8fc7\u8fd9\u4e2a\u6570\u503c\u4e0b\u4e00\u6b21\u5199\u5165\u4f1a\u9020\u6210-\u5237\u76d8-1",children:"pika\u5b9e\u4f8b\u6240\u62e5\u6709\u7684rocksdb\u5b9e\u4f8b\u4f7f\u7528\u7684memtable\u5927\u5c0f\u4e0a\u9650\uff0c\u5982\u679crocksdb\u5b9e\u9645\u4f7f\u7528\u8d85\u8fc7\u8fd9\u4e2a\u6570\u503c\uff0c\u4e0b\u4e00\u6b21\u5199\u5165\u4f1a\u9020\u6210 \u5237\u76d8"}),"\n",(0,s.jsxs)(e.p,{children:["[Rocksdb\u2010Basic\u2010Tuning](",(0,s.jsx)(e.a,{href:"https://github.com/facebook/rocksdb/wiki/Setup%E2%80%90Options%E2%80%90and%E2%80%90Basic%E2%80%90Tuning",children:"https://github.com/facebook/rocksdb/wiki/Setup\u2010Options\u2010and\u2010Basic\u2010Tuning"}),")\nmax\u2010write\u2010buffer\u2010size : 10737418240"]}),"\n",(0,s.jsx)(e.p,{children:"RocksDB\u91c7\u7528WAL + LSM\u67b6\u6784\uff0cmemtable\u53ef\u4ee5\u770b\u4f5c\u662f\u7528\u6237\u6570\u636e\u843d\u76d8\u7684\u57fa\u672c\u5355\u4f4d\uff0cmemtable\u8d8a\u5927\u5219\u843d\u76d8\u65f6\u8d8a\u503e \u5411\u4e8e\u6279\u91cf\u5199\uff0c\u66f4\u80fd\u6709\u6548\u5229\u7528\u78c1\u76d8IO\u541e\u5410\u3002"}),"\n",(0,s.jsx)(e.p,{children:(0,s.jsx)(e.img,{src:"https://action-weikai.oss-cn-shanghai.aliyuncs.com/renkun0518-4.png",alt:""})}),"\n",(0,s.jsx)(e.p,{children:"\u6700\u521d\u7684\u53c2\u6570\u6587\u4ef6\u6ca1\u6709\u8bbe\u7f6emax-write-buffer-size\uff0c\u53ea\u6709write-buffer-size\uff0c\u5947\u602a\u7684\u662f\u8c03\u5927write-buffer-size\u5e76\u4e0d\u4f1a \u5c06\u524d\u8005\u81ea\u52a8\u589e\u5927\uff0c\u4e24\u8005\u4e0d\u5177\u5907\u8054\u52a8\u5173\u7cfb\u3002"}),"\n",(0,s.jsx)(e.p,{children:(0,s.jsx)(e.img,{src:"https://action-weikai.oss-cn-shanghai.aliyuncs.com/renkun0518-5.png",alt:""})}),"\n",(0,s.jsx)(e.p,{children:"\u6211\u5728\u538b\u6d4b\u65f6\u5c1d\u8bd5\u8c03\u5927write-buffer-size\u52301G(max-write-buffer-size\u4fdd\u6301\u9ed8\u8ba4\u503c)\uff0c\u6027\u80fd\u4f9d\u7136\u4e0a\u4e0d\u53bb\uff0c\u770b\u6765\u662fmax- write-buffer-size\u8d77\u5230\u4e86\u51b3\u5b9a\u6027\u4f5c\u7528\u3002"}),"\n",(0,s.jsx)(e.p,{children:"\u7ecf\u8fc7\u591a\u6b21\u538b\u6d4b\uff0c\u6700\u7ec8\u6211\u4eec\u7684\u4e3b\u8981\u53c2\u6570\u8bbe\u7f6e\u5982\u4e0b\uff1a"}),"\n",(0,s.jsx)(e.p,{children:"thread\u2010num : 8 #\u548ccpu\u6838\u6570\u76f8\u540c\nthread\u2010pool\u2010size : 8\nwrite\u2010buffer\u2010size : 268435456\nmax\u2010write\u2010buffer\u2010size : 4294967296\ncompression : snappy\nmax\u2010background\u2010flushes : 2\nmax\u2010background\u2010compactions : 2"}),"\n",(0,s.jsxs)(e.ol,{children:["\n",(0,s.jsx)(e.li,{children:"thread\u2010num : 8 #\u548ccpu\u6838\u6570\u76f8\u540c"}),"\n",(0,s.jsx)(e.li,{children:"thread\u2010pool\u2010size : 8"}),"\n",(0,s.jsx)(e.li,{children:"write\u2010buffer\u2010size : 268435456"}),"\n",(0,s.jsx)(e.li,{children:"max\u2010write\u2010buffer\u2010size : 4294967296"}),"\n",(0,s.jsx)(e.li,{children:"compression : snappy"}),"\n",(0,s.jsx)(e.li,{children:"max\u2010background\u2010flushes : 2"}),"\n",(0,s.jsx)(e.li,{children:"max\u2010background\u2010compactions : 2"}),"\n"]}),"\n",(0,s.jsx)(e.p,{children:"thread\u2010num : 8 #\u548ccpu\u6838\u6570\u76f8\u540c\nthread\u2010pool\u2010size : 8\nwrite\u2010buffer\u2010size : 268435456\nmax\u2010write\u2010buffer\u2010size : 4294967296\ncompression : snappy\nmax\u2010background\u2010flushes : 2\nmax\u2010background\u2010compactions : 2"}),"\n",(0,s.jsx)(e.h2,{id:"3\u7ed3\u8bba",children:"3\u3001\u7ed3\u8bba"}),"\n",(0,s.jsx)(e.p,{children:"\u901a\u8fc7\u8fd9\u4e2a\u6848\u4f8b\u5bf9iostat\u7684\u8f93\u51fa\u6307\u6807\u6709\u4e86\u66f4\u6df1\u4e00\u6b65\u7684\u4e86\u89e3\uff0c\u4ee5\u540e\u518d\u9047\u5230%util\u8fbe\u5230100\u65f6\u5148\u4e0d\u8981\u8f7b\u6613\u4f5c\u51fa\u78c1\u76d8IO\u5df2\u9971\u548c \u7684\u7ed3\u8bba\uff0c\u5f88\u53ef\u80fd\u662f\u5927\u91cf\u5c0fIO\u8bf7\u6c42\u5bfc\u81f4\u7684\uff0c\u53ef\u901a\u8fc7w/s\u548cavgrq-sz\u8fdb\u884c\u8fa8\u522b\u6bd4\u8f83\u3002"}),"\n",(0,s.jsx)(e.p,{children:"\u4f7f\u7528pika\u65f6\uff0c\u4e00\u5b9a\u8981\u8bbe\u7f6emax-write-buffer-size\u503c\uff0c\u867d\u7136\u548cwrite-buffer-size\u53c2\u6570\u540d\u5b57\u5f88\u50cf\uff0c\u4f46\u4e24\u8005\u6ca1\u6709\u8054\u52a8\u5173\u7cfb \u4e14max-write-buffer-size\u8d77\u5230\u4e86\u51b3\u5b9a\u6027\u4f5c\u7528\u3002"}),"\n",(0,s.jsx)(e.p,{children:"\u6700\u540e\uff0c\u6211\u4eec\u7684\u5e94\u7528\u6210\u529f\u8fc1\u79fb\u5230pika\uff0c\u76f8\u6bd4\u4e4b\u524d\u7684mongo\u96c6\u7fa4\u8282\u7701\u4e86\u4e0d\u5c11\u7684\u673a\u5668\u8d44\u6e90\u5f00\u9500\uff0c\u53ef\u89c1\u6ca1\u6709\u6700\u597d\u7684DB\uff0c\u53ea\u6709\u6700\u9002\u5408\u7684\u3002"})]})}function p(i={}){const{wrapper:e}={...(0,r.R)(),...i.components};return e?(0,s.jsx)(e,{...i,children:(0,s.jsx)(l,{...i})}):l(i)}},8453:(i,e,n)=>{n.d(e,{R:()=>t,x:()=>a});var s=n(6540);const r={},c=s.createContext(r);function t(i){const e=s.useContext(c);return s.useMemo((function(){return"function"==typeof i?i(e):{...e,...i}}),[e,i])}function a(i){let e;return e=i.disableParentContext?"function"==typeof i.components?i.components(r):i.components||r:t(i.components),s.createElement(c.Provider,{value:e},i.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/70e8c784.75d52a62.js b/build/assets/js/70e8c784.75d52a62.js new file mode 100644 index 0000000..9f6aa38 --- /dev/null +++ b/build/assets/js/70e8c784.75d52a62.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[7191],{472:(e,a,s)=>{s.r(a),s.d(a,{assets:()=>h,contentTitle:()=>n,default:()=>l,frontMatter:()=>t,metadata:()=>d,toc:()=>o});var r=s(4848),i=s(8453);const t={title:"\u901a\u4fe1\u548c\u7ebf\u7a0b\u6a21\u578b",sidebar_position:0},n=void 0,d={id:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/\u901a\u4fe1\u548c\u7ebf\u7a0b\u6a21\u578b/index",title:"\u901a\u4fe1\u548c\u7ebf\u7a0b\u6a21\u578b",description:"pika\u7684\u7ebf\u7a0b\u6a21\u578b\u6709\u5b98\u65b9\u7684wiki\u4ecb\u7ecd\uff0c\u8fd9\u91cc\u4e3b\u8981\u4ecb\u7ecd\u4e86pika\u90fd\u6709\u54ea\u4e9b\u7ebf\u7a0b\uff0c\u8fd9\u4e9b\u7ebf\u7a0b\u7528\u6765\u5e72\u561b\u3002\u672c\u7bc7\u6587\u7ae0\u4e3b\u8981\u6d89\u53ca\u76d1\u542c\u7ebf\u7a0bDispatchThread\u3001IO\u5de5\u4f5c\u7ebf\u7a0bWorkerThread\u548c\u5de5\u4f5c\u7ebf\u7a0b\u6c60ThreadPool\uff0c\u7ed3\u5408\u4ee3\u7801\u4ecb\u7ecd\u91cc\u9762\u5b9e\u73b0\u7684\u4e00\u4e9b\u7ec6\u8282\u3002",source:"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/\u901a\u4fe1\u548c\u7ebf\u7a0b\u6a21\u578b/index.md",sourceDirName:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/\u901a\u4fe1\u548c\u7ebf\u7a0b\u6a21\u578b",slug:"/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/\u901a\u4fe1\u548c\u7ebf\u7a0b\u6a21\u578b/",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/\u901a\u4fe1\u548c\u7ebf\u7a0b\u6a21\u578b/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/\u901a\u4fe1\u548c\u7ebf\u7a0b\u6a21\u578b/index.md",tags:[],version:"current",sidebarPosition:0,frontMatter:{title:"\u901a\u4fe1\u548c\u7ebf\u7a0b\u6a21\u578b",sidebar_position:0},sidebar:"tutorialSidebar",previous:{title:"Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/"},next:{title:"Pubsub \u673a\u5236",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/PubSub \u673a\u5236/"}},h={},o=[];function c(e){const a={a:"a",img:"img",p:"p",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(a.p,{children:["pika\u7684\u7ebf\u7a0b\u6a21\u578b\u6709",(0,r.jsx)(a.a,{href:"https://github.com/OpenAtomFoundation/pika/wiki/pika-%E7%BA%BF%E7%A8%8B%E6%A8%A1%E5%9E%8B",children:"\u5b98\u65b9\u7684wiki\u4ecb\u7ecd"}),"\uff0c\u8fd9\u91cc\u4e3b\u8981\u4ecb\u7ecd\u4e86pika\u90fd\u6709\u54ea\u4e9b\u7ebf\u7a0b\uff0c\u8fd9\u4e9b\u7ebf\u7a0b\u7528\u6765\u5e72\u561b\u3002\u672c\u7bc7\u6587\u7ae0\u4e3b\u8981\u6d89\u53ca\u76d1\u542c\u7ebf\u7a0bDispatchThread\u3001IO\u5de5\u4f5c\u7ebf\u7a0bWorkerThread\u548c\u5de5\u4f5c\u7ebf\u7a0b\u6c60ThreadPool\uff0c\u7ed3\u5408\u4ee3\u7801\u4ecb\u7ecd\u91cc\u9762\u5b9e\u73b0\u7684\u4e00\u4e9b\u7ec6\u8282\u3002"]}),"\n",(0,r.jsx)(a.p,{children:"1.\u76d1\u542c\u7ebf\u7a0bDispatchThread"}),"\n",(0,r.jsx)(a.p,{children:"\u5728\u521b\u5efaPikaServer\u7684\u65f6\u5019\uff0c\u4f1a\u6784\u9020\u4e00\u4e2aPikaDispatchThread\uff0c\u8fd9\u4e2aPikaDispatchThread\uff0c\u5b9e\u9645\u4e0a\u662f\u7528\u4e86pink\u7f51\u7edc\u5e93\u7684DispatchThread::DispatchThread"}),"\n",(0,r.jsx)(a.p,{children:(0,r.jsx)(a.img,{alt:"alt text",src:s(7512).A+"",width:"554",height:"118"})}),"\n",(0,r.jsx)(a.p,{children:"DispatchThread\u6784\u9020\u51fd\u6570\u91cc\u9762\u4f1a\u521d\u59cb\u5316\u597d\u82e5\u5e72\u4e2aWorkerThread"}),"\n",(0,r.jsx)(a.p,{children:(0,r.jsx)(a.img,{alt:"alt text",src:s(5942).A+"",width:"554",height:"172"})}),"\n",(0,r.jsx)(a.p,{children:"DispatchThread\u7ee7\u627f\u81eaServerThread\uff0cServerThread\u7ee7\u627f\u4e86Thread\uff0c\u7ebf\u7a0b\u542f\u52a8\u65f6\u5b9e\u9645\u4e0a\u8fd0\u884c\u7684\u662f\u5b50\u7c7b\u7684ThreadMain\u65b9\u6cd5\uff0c\u7ee7\u627f\u4e86Thread\u7c7b\u7684\u5b50\u7c7b\u9700\u8981\u6709\u81ea\u5df1\u7684ThreadMain\uff0c\u76d1\u542c\u7ebf\u7a0bstart\u7684\u65f6\u5019\uff0c\u5165\u53e3\u662fServerThread::ThreadMain()\u3002\u7ebf\u7a0b\u542f\u52a8\u4f1a\u5148ServerThread::InitHandle()\uff0c\u7ed1\u5b9a\u548c\u76d1\u542c\u7aef\u53e3\uff0c\u4e0b\u9762\u770b\u770bServerThread::ThreadMain()\u91cc\u9762\u505a\u4e86\u5565\u3002"}),"\n",(0,r.jsx)(a.p,{children:"ServerThread::ThreadMain()\u4e3b\u8981\u903b\u8f91\u662f\u4e00\u4e2aepoll\uff0c\u5f53\u6709\u65b0\u7684\u8fde\u63a5\u4e8b\u4ef6\u6765\u7684\u65f6\u5019\uff0caccept\uff0c\u7136\u540e\u8c03\u7528DispatchThread::HandleNewConn\u6765\u5904\u7406\u8fd9\u4e2a\u65b0\u7684\u8fde\u63a5"}),"\n",(0,r.jsx)(a.p,{children:(0,r.jsx)(a.img,{alt:"alt text",src:s(7149).A+"",width:"492",height:"576"})}),"\n",(0,r.jsx)(a.p,{children:"DispatchThread::HandleNewConn\u5982\u4f55\u5904\u7406\u8fde\u63a5\u5462\uff1f\u5b9e\u9645\u4e0a\u76d1\u542c\u7ebf\u7a0b\u4f1a\u628a\u8fde\u63a5\u5206\u53d1\u7ed9IO\u5de5\u4f5c\u7ebf\u7a0bWorkerThread\u6765\u5904\u7406\u3002\u6bcf\u4e2aWorkerThread\u90fd\u6709\u4e00\u4e2aPinkEpoll\uff0cPinkEpoll\u6709\u4e00\u4e2anotify_queue_\uff0c\u65b0\u7684\u8fde\u63a5\u4f1a\u4ee5PinkItem\u7684\u5f62\u5f0fpush\u5230\u8fd9\u4e2a\u961f\u5217\u91cc\u9762\uff0c\u7136\u540e\u901a\u77e5WorkerThread\u6765\u5904\u7406\u3002\u5206\u53d1\u7684\u65b9\u5f0f\u7c7b\u4f3c\u8f6e\u8bad\uff0c\u4f1a\u6309\u987a\u5e8f\u5206\u53d1\u7ed9notify_queue_\u6ca1\u6709\u6ee1\u7684WorkerThread\u3002"}),"\n",(0,r.jsx)(a.p,{children:(0,r.jsx)(a.img,{alt:"alt text",src:s(468).A+"",width:"501",height:"356"})}),"\n",(0,r.jsx)(a.p,{children:"\u90a3\u4e48\u76d1\u542c\u7ebf\u7a0b\u5982\u4f55\u901a\u77e5WorkerThread\u6765\u5904\u7406\u65b0\u7684\u8fde\u63a5\u5462\uff1f\u4f7f\u7528\u7684\u662f\u7ba1\u9053\u7684\u65b9\u5f0f\uff0cPinkEpoll\u4f1a\u521b\u5efa\u4e00\u4e2a\u7ba1\u9053\u7528\u6765\u901a\u77e5\uff0c\u5e76\u4e14\u628a\u8fd9\u4e2a\u7ba1\u9053\u52a0\u5230Epoll\u91cc\u9762\u3002\u5728\u786e\u5b9a\u597d\u8981\u5206\u53d1\u7684WorkerThread\u540e\uff0c\u5f80\u8fd9\u4e2aWorkerThread\u7684\u7ba1\u9053\u5199\u8fdb\u53bb\u4e00\u4e2a1\u5b57\u8282\u7684\u5185\u5bb9\uff0c\u6765\u89e6\u53d1\u8fd9\u4e2a\u7ba1\u9053\u7684\u8bfb\u4e8b\u4ef6\u3002"}),"\n",(0,r.jsx)(a.p,{children:(0,r.jsx)(a.img,{alt:"alt text",src:s(379).A+"",width:"459",height:"320"})}),"\n",(0,r.jsx)(a.p,{children:"2.IO\u5de5\u4f5c\u7ebf\u7a0bWorkerThread"}),"\n",(0,r.jsx)(a.p,{children:"DispatchThread::StartThread\u7684\u65f6\u5019\u4f1a\u8d77WorkerThread\u7ebf\u7a0b\uff0cWorkerThread\u4e5f\u662f\u7ee7\u627f\u4e86Thread\uff0c\u56e0\u6b64\u5de5\u4f5c\u7ebf\u7a0b\u7684\u5165\u53e3\u662fWorkerThread::ThreadMain\u3002\u4e0a\u6587\u8bf4\u5230\u76d1\u542c\u7ebf\u7a0b\u628a\u65b0\u7684\u8fde\u63a5\u653e\u5230WorkerThread\u7684\u961f\u5217\u91cc\u9762\u540e\uff0c\u901a\u77e5\u4e86WorkerThread\u8fdb\u884c\u5904\u7406\u3002\u4e0b\u9762\u6211\u4eec\u770b\u770bWorkerThread\u600e\u4e48\u5904\u7406\u7684\u3002\nWorkerThread\u540c\u6837\u662f\u4e00\u4e2aEpoll\uff0c\u8fd9\u91cc\u4f1a\u5904\u7406\u65b0\u8fde\u63a5\u8bf7\u6c42\u4e8b\u4ef6\u548c\u5df2\u8fde\u63a5\u8bf7\u6c42\u7684\u4e8b\u4ef6\uff0c\u5982\u679cEpoll\u8fd4\u56de\u7684fd\u662fnotify_receive_fd\uff0c\u5373\u7ba1\u9053\u7684\u63a5\u6536fd\uff0c\u8bf4\u660e\u662f\u5185\u90e8\u7684\u901a\u77e5\u4e8b\u4ef6\uff0c\u4e00\u6b21\u6027\u8bfb\u53d6\u591a\u4e2a\u5b57\u8282\u7684\u5185\u5bb9\uff0c\u56e0\u4e3a\u524d\u9762\u5df2\u77e5\u6bcf\u4e2a\u901a\u77e5\u662f1\u4e2a\u5b57\u8282\uff0c\u56e0\u6b64\u8fd9\u91cc\u8bfb\u5230\u4e86\u591a\u5c11\u4e2a\u5b57\u8282\u5c31\u8bf4\u660e\u6709\u591a\u5c11\u4e2a\u901a\u77e5\uff0c\u7136\u540e\u5728\u4e00\u4e2a\u5faa\u73af\u91cc\u9762\u5904\u7406\u8fd9\u4e9b\u8bf7\u6c42\u3002\u7c7b\u578b\u4e3akNotiConnect\u5219\u662f\u65b0\u7684\u8fde\u63a5\uff0c\u8fd9\u91cc\u4f1a\u628a\u76d1\u542c\u7ebf\u7a0bpush\u7684PinkItem\u53d6\u51fa\u6765\uff0c\u7136\u540e\u521b\u5efa\u4e00\u4e2aNewPinkConn\uff0c\u52a0\u5230conns_\u91cc\u9762\uff0c\u5e76\u4e14\u628a\u8fd9\u4e2afd\u52a0\u5230WorkerThread\u7684epoll\uff0c\u540e\u7eed\u7684\u6d88\u606f\u4e8b\u4ef6\u5c31\u53ef\u4ee5\u5728\u8fd9\u4e2aepoll\u88ab\u5904\u7406\u3002\u8fd9\u91ccconn_factory\u7528\u7684\u662fClientConnFactory\uff0c\u8fd4\u56de\u7684\u662fPikaClientConn\uff0c\u7ee7\u627f\u4e86pink::RedisConn\u3002"}),"\n",(0,r.jsx)(a.p,{children:(0,r.jsx)(a.img,{alt:"alt text",src:s(9250).A+"",width:"508",height:"536"})}),"\n",(0,r.jsx)(a.p,{children:"\u8fde\u63a5\u7ed1\u5b9a\u5230WorkerThread\u540e\uff0c\u5df2\u5efa\u7acb\u8fde\u63a5\u7684\u5ba2\u6237\u7aef\u53d1\u9001\u8bf7\u6c42\u8fc7\u6765\uff0c\u5219\u662f\u8d70\u7684\u4e0b\u9762\u7684\u5206\u652f\uff0c\u6839\u636efd\u5728conns_\u91cc\u9762\u627e\u5230PinkConn\uff0c\u6211\u4eec\u5148\u53ea\u770b\u8bfb\u8bf7\u6c42\u90e8\u5206\uff0c\u56de\u54cd\u5e94\u90e8\u5206\u540e\u9762\u518d\u770b\u3002"}),"\n",(0,r.jsx)(a.p,{children:(0,r.jsx)(a.img,{alt:"alt text",src:s(8985).A+"",width:"496",height:"521"})}),"\n",(0,r.jsx)(a.p,{children:"\u5728conns_\u91cc\u9762\u627e\u5230\u7684\u662f\u5bf9\u5e94fd\u7684PikaClientConn\uff0c\u4f7f\u7528RedisConn::GetRequest\u6765\u8bfb\u53d6\u5ba2\u6237\u7aef\u7684\u7684\u8bf7\u6c42\uff0c\u6b64\u5904\u6709\u4e00\u4e2a\u7ec6\u8282\uff0c\u5982\u679cread_status\u4e3akReadAll\uff0c\u5219\u4e00\u6b21\u5b8c\u6574\u7684\u8bf7\u6c42\u88ab\u8bfb\u53d6\uff0c\u4f1a\u5148\u628a\u8fd9\u4e2a\u8bf7\u6c42fd\u7684\u8bfb\u5199\u4e8b\u4ef6\u7ed9\u5220\u9664\u3002\u8fd9\u662f\u4e3a\u5565\u5462\uff1f\u5220\u9664\u4e86\u4e0d\u662f\u540e\u7eed\u5c31\u5904\u7406\u4e0d\u4e86\u8fd9\u4e2a\u8bf7\u6c42\u7684\u8bfb\u5199\u5417\uff0c\u8fd9\u4e2a\u6211\u4eec\u540e\u9762\u8bb2\u5230\u4e86\u518d\u8bf4\u660e\u3002\nRedisConn::GetRequest\u91cc\u9762\uff0c\u4f7f\u7528RedisParser::ProcessRequestBuffer\u6765\u89e3\u6790\u8bfb\u53d6\u5230\u7684\u5185\u5bb9\uff0c\u7136\u540e\u67092\u79cd\u5904\u7406\u65b9\u5f0f\uff0cDealMessage\u548cComplete"}),"\n",(0,r.jsx)(a.p,{children:(0,r.jsx)(a.img,{alt:"alt text",src:s(2736).A+"",width:"488",height:"513"})}),"\n",(0,r.jsx)(a.p,{children:"\u5148\u770b\u4e0b\u8fd9\u4e24\u4e2a\u51fd\u6570\u7684\u521d\u59cb\u5316\uff0cDealMessage\u5bf9\u5e94\u7740ParserDealMessageCb\uff0cComplete\u5bf9\u5e94\u7740ParserCompleteCb"}),"\n",(0,r.jsx)(a.p,{children:(0,r.jsx)(a.img,{alt:"alt text",src:s(2647).A+"",width:"450",height:"274"})}),"\n",(0,r.jsx)(a.p,{children:"\u6211\u4eec\u770b\u8fd9\u4e24\u4e2a\u65b9\u6cd5\uff0c\u539f\u6765\u4e00\u4e2a\u662f\u540c\u6b65\u5904\u7406\uff0c\u4e00\u4e2a\u662f\u5f02\u6b65\uff0c\u540c\u6b65\u7684\u8bdd\u5c31\u662f\u4e00\u4e2a\u4e2a\u547d\u4ee4\u8c03\u7528DealMessage\u6765\u5904\u7406\uff0c\u5f02\u6b65\u7684\u8bdd\u662f\u89e3\u6790\u5b8c\u5408\u6210\u4e00\u7ec4\u547d\u4ee4\u7edf\u4e00\u8c03Complete\u5904\u7406\u3002\u5f02\u6b65\u7684\u5904\u7406\u65b9\u5f0f\u662f\u5c06\u8bf7\u6c42\u7684\u547d\u4ee4\u63d0\u4ea4\u7ed9\u7ebf\u7a0b\u6c60\u6765\u5904\u7406PikaClientConn::AsynProcessRedisCmds\uff0c\u600e\u4e48\u63d0\u4ea4\u7684\u6211\u4eec\u5728\u5de5\u4f5c\u7ebf\u7a0b\u6c60\u91cc\u9762\u4ecb\u7ecd\u3002"}),"\n",(0,r.jsx)(a.p,{children:(0,r.jsx)(a.img,{alt:"alt text",src:s(3422).A+"",width:"554",height:"176"})}),"\n",(0,r.jsx)(a.p,{children:"3.\u5de5\u4f5c\u7ebf\u7a0b\u6c60ThreadPool"}),"\n",(0,r.jsx)(a.p,{children:"PikaServer\u6784\u9020\u7684\u65f6\u5019\u4f1a\u521b\u5efa\u4e00\u4e2aPikaClientProcessor\uff0cPikaClientProcessor\u91cc\u9762\u6709\u4e00\u4e2aThreadPool\uff0cThreadPool\u542f\u52a8\u65f6\u4f1a\u521b\u5efaWorker\u7ebf\u7a0b\uff0cWorker\u7ebf\u7a0b\u5b9e\u9645\u7684\u5904\u7406\u51fd\u6570\u662fThreadPool::runInThread()"}),"\n",(0,r.jsx)(a.p,{children:(0,r.jsx)(a.img,{alt:"alt text",src:s(5636).A+"",width:"554",height:"66"})}),"\n",(0,r.jsx)(a.p,{children:"\u524d\u9762\u8bb2\u5230WorkerThread\u89e3\u6790\u5b8credis\u547d\u4ee4\u540e\u4f1a\u628a\u547d\u4ee4\u63d0\u4ea4\u7ed9ThreadPool\u6765\u5904\u7406\uff0c\u5b9e\u9645\u4e0a\u662f\u8c03\u7528\u4e86\u7ebf\u7a0b\u6c60\u7684ThreadPool::Schedule\u65b9\u6cd5\uff0cSchedule\u9700\u8981\u4e00\u4e2aTaskFunc\u6765\u771f\u6b63\u5904\u7406\u547d\u4ee4\uff0c\u8fd9\u91cc\u4f7f\u7528\u7684\u662fDoBackgroundTask"}),"\n",(0,r.jsx)(a.p,{children:(0,r.jsx)(a.img,{alt:"alt text",src:s(6765).A+"",width:"554",height:"65"})}),"\n",(0,r.jsx)(a.p,{children:"ThreadPool::Schedule\u91cc\u9762\uff0c\u628a\u53c2\u6570\u5c01\u88c5\u6210Task\uff0c\u7136\u540epush\u5230\u7ebf\u7a0b\u6c60\u7684\u4efb\u52a1\u961f\u5217\uff0c\u63a5\u7740\u901a\u77e5\u7ebf\u7a0b\u6c60\u5904\u7406\uff0c\u8fd9\u91ccWorkerThread\u662f\u751f\u4ea7\u8005\uff0c\u7ebf\u7a0b\u6c60\u662f\u6d88\u8d39\u8005\u3002"}),"\n",(0,r.jsx)(a.p,{children:(0,r.jsx)(a.img,{alt:"alt text",src:s(5526).A+"",width:"459",height:"162"})}),"\n",(0,r.jsx)(a.p,{children:"\u800c\u7ebf\u7a0b\u6c60\u7684\u5de5\u4f5c\u7ebf\u7a0b\uff0c\u5219\u662f\u4e0d\u65ad\u5730\u5728\u961f\u5217\u91cc\u9762\u53d6\u51faTask\u8fdb\u884c\u5904\u7406\u3002"}),"\n",(0,r.jsx)(a.p,{children:(0,r.jsx)(a.img,{alt:"alt text",src:s(4543).A+"",width:"481",height:"440"})}),"\n",(0,r.jsx)(a.p,{children:"4.\u547d\u4ee4\u5904\u7406\u548c\u54cd\u5e94\u6d41\u7a0b"}),"\n",(0,r.jsx)(a.p,{children:"\u7ebf\u7a0b\u6c60\u91cc\u9762\u5b9e\u9645\u5904\u7406\u547d\u4ee4\u7684\u662fDoBackgroundTask\uff0c\u6211\u4eec\u5148\u6765\u770b\u770b\u547d\u4ee4\u662f\u600e\u4e48\u88ab\u5904\u7406\u7684\u3002DoBackgroundTask\u91cc\u9762\u8c03\u7528\u7684\u662fPikaClientConn::BatchExecRedisCmd"}),"\n",(0,r.jsx)(a.p,{children:(0,r.jsx)(a.img,{alt:"alt text",src:s(1696).A+"",width:"554",height:"229"})}),"\n",(0,r.jsx)(a.p,{children:"BatchExecRedisCmd\u91cc\u9762\u662f\u547d\u4ee4\u4e00\u4e2a\u4e00\u4e2a\u53d6\u51fa\u6765ExecRedisCmd\uff0c\u7136\u540ePikaClientConn::DoCmd\uff0c\u54cd\u5e94\u6d88\u606f\u5148\u585e\u5230resp_array\uff0c\u5728TryWriteResp\u91cc\u9762\u53c8\u628a\u54cd\u5e94\u4e00\u4e2a\u4e2a\u53d6\u51fa\u6765\u585e\u5230response_\u91cc\uff0c\u5e76\u4e14\u628ais_reply_\u7f6e\u4e3atrue\uff0c\u7136\u540e\u505a\u4e86\u4e00\u4e2aNotifyEpoll\u7684\u64cd\u4f5c\u3002"}),"\n",(0,r.jsx)(a.p,{children:(0,r.jsx)(a.img,{alt:"alt text",src:s(8601).A+"",width:"531",height:"110"})}),"\n",(0,r.jsx)(a.p,{children:"\u53ef\u4ee5\u770b\u5230\uff0c\u8fd9\u91cc\u628a\u5904\u7406\u7ed3\u679c\u53c8\u5c01\u88c5\u6210\u4e00\u4e2aPinkItem\uff0c\u7136\u540e\u548c\u524d\u9762\u4ecb\u7ecd\u7684\u76d1\u542c\u7ebf\u7a0b\u628a\u8fde\u63a5\u8bf7\u6c42\u5206\u53d1\u7ed9WorkerThread\u4e00\u6837\uff0c\u628aPinkItem\u653e\u5230PinkEpoll\u7684\u961f\u5217\u91cc\u9762\uff0c\u7136\u540e\u901a\u8fc7\u5728\u7ba1\u9053\u91cc\u9762\u5199\u4e86\u4e00\u4e2a\u5b57\u8282\u7684\u5b57\u7b26\u89e6\u53d1epoll\u7684\u8bfb\u4e8b\u4ef6\u3002\u6240\u4ee5\u6211\u4eec\u56de\u8fc7\u5934\u6765\u770b\u770bWorkerThread\u7684\u5904\u7406WorkerThread::ThreadMain"}),"\n",(0,r.jsx)(a.p,{children:(0,r.jsx)(a.img,{alt:"alt text",src:s(8037).A+"",width:"522",height:"496"})}),"\n",(0,r.jsx)(a.p,{children:"\u8fd9\u91cc\u7684\u6d41\u7a0b\u548c\u524d\u9762\u4ecb\u7ecd\u7684\u5dee\u4e0d\u591a\uff0c\u53ef\u4ee5\u770b\u5230\u8fd9\u91cc\u628a\u8fd9\u4e2a\u8fde\u63a5\u7684fd\u7684\u8bfb\u5199\u4e8b\u4ef6\u91cd\u65b0\u52a0\u5230epoll\u91cc\u9762\uff0c\u524d\u9762\u6211\u4eec\u7559\u4e86\u4e00\u4e2a\u7591\u95ee\uff0c\u5728\u4e00\u6b21\u547d\u4ee4\u8bfb\u53d6\u7ed3\u675f\u540e\uff0c\u628a\u8fde\u63a5fd\u7684\u8bfb\u5199\u4e8b\u4ef6\u4eceepoll\u91cc\u9762\u5220\u9664\u4e86\uff0c\u8fd9\u662f\u4e3a\u5565\u5462\uff1f\u8fd9\u91cc\u6211\u4eec\u770b\u5230\u547d\u4ee4\u5904\u7406\u7ed3\u675f\u540e\u53c8\u628a\u8bfb\u5199\u4e8b\u4ef6\u52a0\u56de\u6765\u4e86\u3002\u5e94\u8be5\u662f\u56e0\u4e3apika\u7528\u7684\u662f\u5f02\u6b65\u5904\u7406\uff0c\u4e00\u4e2a\u8fde\u63a5\u7684\u547d\u4ee4\u662f\u5f02\u6b65\u5730\u4ea4\u7ed9\u7ebf\u7a0b\u6c60\u5904\u7406\uff0c\u5982\u679c\u540c\u4e2a\u8fde\u63a5\u53d1\u4e862\u4e2a\u547d\u4ee4\uff0c\u56e0\u4e3a\u662f\u5f02\u6b65\u5904\u7406\uff0c\u6ca1\u6709\u529e\u6cd5\u4fdd\u8bc12\u4e2a\u547d\u4ee4\u6ee1\u8db3FIFO\uff0c\u5373\u5148\u6765\u7684\u547d\u4ee4\u9700\u8981\u5148\u56de\u590d\uff0c\u540e\u6765\u7684\u547d\u4ee4\u540e\u56de\u590d\uff0credis\u662f\u5355\u7ebf\u7a0b\u6a21\u578b\uff0c\u56e0\u6b64\u5929\u7136\u6ee1\u8db3\uff0cpika\u662f\u591a\u7ebf\u7a0b\u5f02\u6b65\u5904\u7406\uff0c\u6240\u4ee5\u8fd9\u91cc\u5728\u8bfb\u53d6\u4e86\u7b2c\u4e00\u4e2a\u547d\u4ee4\u540e\uff0c\u628a\u8fde\u63a5\u7684\u8bfb\u5199\u4e8b\u4ef6\u5220\u9664\u4e86\uff0c\u7b49\u524d\u4e00\u4e2a\u547d\u4ee4\u5904\u7406\u5b8c\u4e86\u624d\u52a0\u56de\u6765\uff0c\u8bfb\u53d6\u7b2c\u4e8c\u4e2a\u547d\u4ee4\u6765\u5904\u7406\u3002"}),"\n",(0,r.jsx)(a.p,{children:"\u8fde\u63a5\u7684fd\u52a0\u8fdbepoll\u540e\uff0cfd\u53ef\u5199\u4e86\uff0c\u90a3\u4e48epoll\u4f1a\u8fd4\u56de\u53ef\u5199\u4e8b\u4ef6\uff0c\u7528RedisConn::SendReply\u6765\u53d1\u9001\u54cd\u5e94\u7ed9\u5ba2\u6237\u7aef\uff0c\u5982\u679c\u5199\u5b8c\u4e86\u4f1a\u628afd\u7684\u5199\u4e8b\u4ef6\u7ed9\u5220\u6389\uff0c\u5982\u679c\u6ca1\u5199\u5b8c\uff0c\u5219\u7b49fd\u53ef\u5199\u4e86\u4f1a\u7ee7\u7eed\u89e6\u53d1\u5199\u4e8b\u4ef6\u6765\u5199\u56de\u590d\u3002"}),"\n",(0,r.jsx)(a.p,{children:(0,r.jsx)(a.img,{alt:"alt text",src:s(1547).A+"",width:"486",height:"412"})}),"\n",(0,r.jsx)(a.p,{children:"5.\u603b\u7ed3"}),"\n",(0,r.jsx)(a.p,{children:"\u901a\u8fc7\u4e0a\u9762\u7684\u5206\u6790\u53ef\u4ee5\u77e5\u9053\uff0c\u76d1\u542c\u7ebf\u7a0b\u662f\u7528\u6765\u76d1\u542c\u65b0\u7684\u8fde\u63a5\uff0c\u8fde\u63a5\u6765\u4e86\u4f1a\u4ea4\u7531WorkerThread\u5904\u7406\uff0c\u5df2\u5efa\u7acb\u8fde\u63a5\u7684\u8bf7\u6c42\u4f1a\u7531WorkerThread\u5c01\u88c5\u6210Task\u4ea4\u7ed9\u7ebf\u7a0b\u6c60ThreadPool\u5904\u7406\uff0cThreadPool\u5904\u7406\u5b8c\u4e86\u540e\uff0c\u8fd8\u662f\u7531WorkerThread\u6765\u56de\u590d\u3002WorkerThread\u5c31\u662f\u505a\u63a5\u6536\u6d88\u606f\uff0c\u56de\u590d\u6d88\u606f\u7684\uff0c\u800cThreadPool\u53ea\u662f\u5904\u7406\u6d88\u606f\uff0c\u4e0d\u6d89\u53ca\u63a5\u6536\u548c\u56de\u590d\u7684IO\u64cd\u4f5c\u3002\u8fd93\u8005\u7684\u5173\u7cfb\u5927\u6982\u5982\u4e0b\u56fe\u6240\u793a\uff1a"}),"\n",(0,r.jsx)(a.p,{children:(0,r.jsx)(a.img,{alt:"alt text",src:s(7948).A+"",width:"535",height:"701"})})]})}function l(e={}){const{wrapper:a}={...(0,i.R)(),...e.components};return a?(0,r.jsx)(a,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},5942:(e,a,s)=>{s.d(a,{A:()=>r});const r=s.p+"assets/images/image-1-a332f842fe89f276e7b0704e67b94e36.png"},5636:(e,a,s)=>{s.d(a,{A:()=>r});const r=s.p+"assets/images/image-10-c030289539ccd1bfd2c466f532244db8.png"},6765:(e,a,s)=>{s.d(a,{A:()=>r});const r=s.p+"assets/images/image-11-e54b2b08b0af62f4b08c439611f54d88.png"},5526:(e,a,s)=>{s.d(a,{A:()=>r});const r=s.p+"assets/images/image-12-44e490e98289320f89dea7f9e3b16a34.png"},4543:(e,a,s)=>{s.d(a,{A:()=>r});const r=s.p+"assets/images/image-13-e31f75910036d65c4c0d4eb16a98e1a8.png"},1696:(e,a,s)=>{s.d(a,{A:()=>r});const r=s.p+"assets/images/image-14-278e8a6d45ad7bacd2a18066d3bf8126.png"},8601:(e,a,s)=>{s.d(a,{A:()=>r});const r=s.p+"assets/images/image-15-e5b66129ba4c83d85989a2e28d1245b9.png"},8037:(e,a,s)=>{s.d(a,{A:()=>r});const r=s.p+"assets/images/image-16-5ae3e6f8b377fd0e5765c9b3d6fa6e59.png"},1547:(e,a,s)=>{s.d(a,{A:()=>r});const r=s.p+"assets/images/image-17-8b1b4d5aed4b7446693d24e055341323.png"},7948:(e,a,s)=>{s.d(a,{A:()=>r});const r=s.p+"assets/images/image-18-a67989f901b1d17c080155a1f9da02ff.png"},7149:(e,a,s)=>{s.d(a,{A:()=>r});const r=s.p+"assets/images/image-2-6d00b88b3317a3c154d888ecd9ea975f.png"},468:(e,a,s)=>{s.d(a,{A:()=>r});const r=s.p+"assets/images/image-3-be0cc82886836eb8d98462c90127e71c.png"},379:(e,a,s)=>{s.d(a,{A:()=>r});const r=s.p+"assets/images/image-4-394fe892a14fd4c34996073d516e9a00.png"},9250:(e,a,s)=>{s.d(a,{A:()=>r});const r=s.p+"assets/images/image-5-205daf4b1d81a0d7a5ec68d735eece3f.png"},8985:(e,a,s)=>{s.d(a,{A:()=>r});const r=s.p+"assets/images/image-6-8cdc6045ed69e0d326e027074b83eaba.png"},2736:(e,a,s)=>{s.d(a,{A:()=>r});const r=s.p+"assets/images/image-7-69a4cd17c04a4333dba253ffad7d31fa.png"},2647:(e,a,s)=>{s.d(a,{A:()=>r});const r=s.p+"assets/images/image-8-107930bf4c340996bd0ef9a28abadf41.png"},3422:(e,a,s)=>{s.d(a,{A:()=>r});const r=s.p+"assets/images/image-9-3c65e5a06d50797e839b73b981bfe362.png"},7512:(e,a,s)=>{s.d(a,{A:()=>r});const r=s.p+"assets/images/image-582a537ff7ba027c50ebb695a55ac7bf.png"},8453:(e,a,s)=>{s.d(a,{R:()=>n,x:()=>d});var r=s(6540);const i={},t=r.createContext(i);function n(e){const a=r.useContext(t);return r.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function d(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:n(e.components),r.createElement(t.Provider,{value:a},e.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/7777193d.ef00cbf7.js b/build/assets/js/7777193d.ef00cbf7.js new file mode 100644 index 0000000..f3d2607 --- /dev/null +++ b/build/assets/js/7777193d.ef00cbf7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[6284],{6344:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>o,contentTitle:()=>r,default:()=>x,frontMatter:()=>t,metadata:()=>s,toc:()=>c});var d=i(4848),l=i(8453);const t={title:"\u526f\u672c\u4e00\u81f4\u6027\uff08\u8bbe\u8ba1\u6587\u6863\uff09",sidebar_position:105},r=void 0,s={id:"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u526f\u672c\u4e00\u81f4\u6027\uff08\u8bbe\u8ba1\u6587\u6863\uff09/index",title:"\u526f\u672c\u4e00\u81f4\u6027\uff08\u8bbe\u8ba1\u6587\u6863\uff09",description:"\u76ee\u524d\u7ebf\u7a0b\u6a21\u578b",source:"@site/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u526f\u672c\u4e00\u81f4\u6027\uff08\u8bbe\u8ba1\u6587\u6863\uff09/index.md",sourceDirName:"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u526f\u672c\u4e00\u81f4\u6027\uff08\u8bbe\u8ba1\u6587\u6863\uff09",slug:"/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u526f\u672c\u4e00\u81f4\u6027\uff08\u8bbe\u8ba1\u6587\u6863\uff09/",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u526f\u672c\u4e00\u81f4\u6027\uff08\u8bbe\u8ba1\u6587\u6863\uff09/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u526f\u672c\u4e00\u81f4\u6027\uff08\u8bbe\u8ba1\u6587\u6863\uff09/index.md",tags:[],version:"current",sidebarPosition:105,frontMatter:{title:"\u526f\u672c\u4e00\u81f4\u6027\uff08\u8bbe\u8ba1\u6587\u6863\uff09",sidebar_position:105},sidebar:"tutorialSidebar",previous:{title:"\u5b89\u88c5\u4f7f\u7528",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5b89\u88c5\u4f7f\u7528/"},next:{title:"Pika \u6700\u4f73\u5b9e\u8df5",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/Pika \u6700\u4f73\u5b9e\u8df5/"}},o={},c=[{value:"\u76ee\u524d\u7ebf\u7a0b\u6a21\u578b",id:"\u76ee\u524d\u7ebf\u7a0b\u6a21\u578b",level:3},{value:"Binlog Header\u53d8\u52a8",id:"binlog-header\u53d8\u52a8",level:3},{value:"\u4e00\u81f4\u6027\u534f\u8bae\u7684\u4e09\u9636\u6bb5",id:"\u4e00\u81f4\u6027\u534f\u8bae\u7684\u4e09\u9636\u6bb5",level:3},{value:"\u65e5\u5fd7\u590d\u5236",id:"\u65e5\u5fd7\u590d\u5236",level:3},{value:"\u65e5\u5fd7\u6062\u590d\uff1a",id:"\u65e5\u5fd7\u6062\u590d",level:3},{value:"\u65e5\u5fd7\u534f\u5546\uff1a",id:"\u65e5\u5fd7\u534f\u5546",level:3},{value:"\u5173\u4e8e\u9009\u4e3b\u548c\u6210\u5458\u53d8\u6362",id:"\u5173\u4e8e\u9009\u4e3b\u548c\u6210\u5458\u53d8\u6362",level:3}];function a(e){const n={a:"a",code:"code",h3:"h3",img:"img",p:"p",pre:"pre",...(0,l.R)(),...e.components};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(n.h3,{id:"\u76ee\u524d\u7ebf\u7a0b\u6a21\u578b",children:"\u76ee\u524d\u7ebf\u7a0b\u6a21\u578b"}),"\n",(0,d.jsx)(n.p,{children:"\u975e\u4e00\u81f4\u6027\u573a\u666f"}),"\n",(0,d.jsx)(n.p,{children:"1\uff0c\u5ba2\u6237\u7aef\u8bf7\u6c42\u52a0\u9501\u5199\u5165db\u548cbinlog\u6587\u4ef6"}),"\n",(0,d.jsx)(n.p,{children:"2\uff0c\u5c06\u7ed3\u679c\u8fd4\u56de\u5ba2\u6237\u7aef"}),"\n",(0,d.jsx)(n.p,{children:"3\uff0c\u901a\u8fc7\u53d1\u9001BinlogSync\u8bf7\u6c42\u5411\u4ece\u5e93\u540c\u6b65"}),"\n",(0,d.jsx)(n.p,{children:"4\uff0c\u4ece\u5e93\u8fd4\u56deBinlogSyncAck\u62a5\u544a\u540c\u6b65\u72b6\u51b5"}),"\n",(0,d.jsx)(n.p,{children:(0,d.jsx)(n.img,{src:"https://s1.ax1x.com/2020/03/27/GPVfBj.png",alt:""})}),"\n",(0,d.jsx)(n.p,{children:"\u4e00\u81f4\u6027\u573a\u666f"}),"\n",(0,d.jsx)(n.p,{children:"1\uff0c\u5ba2\u6237\u7aef\u8bf7\u6c42\u5148\u5199\u5165binlog\u6587\u4ef6"}),"\n",(0,d.jsx)(n.p,{children:"2\uff0c\u901a\u8fc7\u53d1\u9001BinlogSync\u8bf7\u6c42\u5411\u4ece\u5e93\u540c\u6b65"}),"\n",(0,d.jsx)(n.p,{children:"3\uff0c\u4ece\u5e93\u8fd4\u56deBinlogSyncAck\u62a5\u544a\u540c\u6b65\u72b6\u51b5"}),"\n",(0,d.jsx)(n.p,{children:"4\uff0c\u5c06\u76f8\u5e94\u7684\u8bf7\u6c42\u5199\u5165db"}),"\n",(0,d.jsx)(n.p,{children:"5\uff0c\u5c06\u7ed3\u679c\u8fd4\u56de\u5ba2\u6237\u7aef"}),"\n",(0,d.jsx)(n.p,{children:(0,d.jsx)(n.img,{src:"https://s1.ax1x.com/2020/03/27/GPVINq.png",alt:""})}),"\n",(0,d.jsx)(n.h3,{id:"binlog-header\u53d8\u52a8",children:"Binlog Header\u53d8\u52a8"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{children:"/*\n* *****************Type First Binlog Item Format******************\n* |||||||||\n* | 2 | 4 | 4 | 8 | 4 | 8 | 4 | ... |\n* |----------------------------------------- 34 Bytes ------------------------------------|\n*/\n"})}),"\n",(0,d.jsxs)(n.p,{children:["\u5176\u4e2d TermId, \u548cLogic id\u662f\u6cbf\u7528",(0,d.jsx)(n.a,{href:"https://raft.github.io/raft.pdf",children:"Raft"}),"\u8bba\u6587\u4e2dterm \u548clog index \u7684\u6982\u5ff5\u3002\u5177\u4f53\u7684\u8be6\u89c1\u8bba\u6587\u3002"]}),"\n",(0,d.jsx)(n.p,{children:"\u5176\u4e2d File Num \u548coffset \u662f\u672c\u6761binlog\u5728\u6587\u4ef6\u4e2d\u7684\u504f\u79fb\u91cf\u3002"}),"\n",(0,d.jsx)(n.p,{children:'Pika\u7684Binlog\u5b58\u5728\u7684\u610f\u4e49\u662f\u4e3a\u4e86\u4fdd\u8bc1\u4e3b\u4ece\u80fd\u591f\u589e\u91cf\u540c\u6b65\uff0c\u800cRaft Log\u5b58\u5728\u7684\u610f\u4e49\u662f\u4e3a\u4e86\u4fdd\u8bc1Leader \u548cFollower \u7684\u6570\u636e\u591f\u4e00\u81f4\u3002\u67d0\u79cd\u610f\u4e49\u4e0a\u8bf4\u8fd9\u4e24\u4e2a"Log"\u7684\u6982\u5ff5\u662f\u4e00\u6837\u7684\uff0c\u6240\u4ee5\u5728\u5b9e\u73b0\u4e0a\uff0c\u5c06binlog \u548c Raft Log \u590d\u7528\u6210\u4e00\u6761log\uff0c\u76ee\u524d\u7684binlog header \u4e2d Term Id \u548c Logic Id \u5c5e\u4e8e Raft Log\uff08\u7b80\u79f0\u65e5\u5fd7\uff09\u7684\u4fe1\u606f\uff0c\u800cFile Num \u548cOffset \u5c5e\u4e8eBinlog \u7684\u4fe1\u606f\u3002'}),"\n",(0,d.jsx)(n.h3,{id:"\u4e00\u81f4\u6027\u534f\u8bae\u7684\u4e09\u9636\u6bb5",children:"\u4e00\u81f4\u6027\u534f\u8bae\u7684\u4e09\u9636\u6bb5"}),"\n",(0,d.jsx)(n.p,{children:"\u65e5\u5fd7\u6062\u590d\u548c\u590d\u5236\u57fa\u672c\u6309\u7167Raft\u8bba\u6587\u5f53\u4e2d\u6240\u505a\u64cd\u4f5c\uff0c\u8fd9\u91cc\u4e0d\u505a\u8fc7\u591a\u89e3\u91ca\u3002\u5b9e\u73b0\u4e0a\uff0c\u8fd9\u91cc\u5206\u4e3a\u4e09\u4e2a\u9636\u6bb5\u3002\u5206\u522b\u662f\u65e5\u5fd7\u7684\u590d\u5236\uff0c\u65e5\u5fd7\u7684\u6062\u590d\uff0c\u65e5\u5fd7\u7684\u534f\u5546\u3002"}),"\n",(0,d.jsx)(n.p,{children:"\u719f\u6089Raft\u534f\u8bae\u7684\u8bfb\u8005\u53ef\u80fd\u4f1a\u53d1\u73b0\uff0c\u8fd9\u91cc\u7684\u4e09\u4e2a\u9636\u6bb5\u8ddfRaft\u65e5\u5fd7\u590d\u5236\u4e0d\u662f\u5b8c\u5168\u4e00\u6837\u3002\u5728Pika\u7684\u5b9e\u73b0\u5f53\u4e2d\uff0c\u57fa\u4e8epika\u73b0\u6709\u7684\u4ee3\u7801\u7ed3\u6784\uff0c\u6211\u4eec\u628aLeader \u548cFollower\u540c\u6b65\u70b9\u4f4d\u56de\u9000\u7684\u903b\u8f91\u5355\u72ec\u63d0\u53d6\u51fa\u6765\uff0c\u5f62\u6210\u4e86Pika Trsysync\u7684\u72b6\u6001\u3002\u4efb\u4f55\u65e5\u5fd7\u7684\u590d\u5236\u51fa\u9519\uff0cpika\u4f1a\u7ec8\u6b62\u5f53\u524d\u7684\u65e5\u5fd7\u590d\u5236\uff08BinlogSync\uff09\u72b6\u6001\uff0c\u8f6c\u800c\u5c06\u72b6\u6001\u673a\u8f6c\u5316\u6210Trysync\u7684\u72b6\u6001\uff0c\u8fdb\u800cLeader \u548cFollower \u4f1a\u8fdb\u5165\u65e5\u5fd7\u7684\u534f\u5546\u903b\u8f91\u3002\u534f\u5546\u6210\u529f\u4e4b\u540e\u4f1a\u8f6c\u5165\u65e5\u5fd7\u590d\u5236\u7684\u903b\u8f91\u3002"}),"\n",(0,d.jsx)(n.p,{children:(0,d.jsx)(n.img,{src:"https://s1.ax1x.com/2020/03/27/GPVl7R.png",alt:""})}),"\n",(0,d.jsx)(n.h3,{id:"\u65e5\u5fd7\u590d\u5236",children:"\u65e5\u5fd7\u590d\u5236"}),"\n",(0,d.jsx)(n.p,{children:"\u65e5\u5fd7\u7684\u903b\u8f91\u7ed3\u6784\u5982\u4e0b\uff0c\u4e0a\u9762\u90e8\u5206\u662fLeader\u53ef\u80fd\u7684log\u70b9\u4f4d\uff0c\u4e0b\u90e8\u5206\u662fFollower\u53ef\u80fd\u7684log\u70b9\u4f4d\u3002"}),"\n",(0,d.jsx)(n.p,{children:(0,d.jsx)(n.img,{src:"https://s1.ax1x.com/2020/03/27/GPVH3T.png",alt:""})}),"\n",(0,d.jsx)(n.p,{children:"1\uff0c\u65e5\u5fd7\u7684\u590d\u5236\u7684\u903b\u8f91\u53ef\u4ee5\u53c2\u8003Raft\u534f\u8bae\u7684\u903b\u8f91\uff0c\u8fd9\u91cc\u4e3e\u4f8b\u8bf4\u8bf4\u660e\u5ba2\u6237\u7aef\u4ece\u8bf7\u6c42\u5230\u8fd4\u56de\uff0c\u65e5\u5fd7\u7ecf\u8fc7\u4e86\u600e\u6837\u7684\u6d41\u7a0b\u3002"}),"\n",(0,d.jsx)(n.p,{children:"Leader Status:"}),"\n",(0,d.jsx)(n.p,{children:"Committed Index : 10"}),"\n",(0,d.jsx)(n.p,{children:"Applied Index\uff1a8"}),"\n",(0,d.jsx)(n.p,{children:"Last Index: 15"}),"\n",(0,d.jsx)(n.p,{children:"Follower Status:"}),"\n",(0,d.jsx)(n.p,{children:"Committed Index : 7"}),"\n",(0,d.jsx)(n.p,{children:"Applied Index\uff1a5"}),"\n",(0,d.jsx)(n.p,{children:"LastIndex: 12"}),"\n",(0,d.jsx)(n.p,{children:"2\uff0c\u5f53Leader \u53d1\u900113-15\u7684\u65e5\u5fd7\u5230Follower\u7684\u65f6\u5019\uff0cFollower\u7684\u72b6\u6001\u4f1a\u505a\u5982\u4e0b\u66f4\u65b0\uff1a"}),"\n",(0,d.jsx)(n.p,{children:"Follower Status:"}),"\n",(0,d.jsx)(n.p,{children:"Committed Index : 10"}),"\n",(0,d.jsx)(n.p,{children:"Applied Index\uff1a5"}),"\n",(0,d.jsx)(n.p,{children:"LastIndex: 15"}),"\n",(0,d.jsx)(n.p,{children:"\u8fd9\u65f6\u5019\u65e5\u5fd76-10\u90fd\u662f\u53ef\u4ee5\u88ab\u5e94\u7528\u5230\u72b6\u6001\u673a\u7684\u3002\u4f46\u662f\u5bf9\u4e8e\u65e5\u5fd711-15\u6765\u8bf4\u53ea\u80fd\u7b49\u5230\u4e0b\u4e00\u6b21\u6536\u5230Leader Committed Index \u5927\u4e8e15\u7684\u65f6\u5019\u8fd9\u4e9b\u65e5\u5fd7\u624d\u80fd\u591f\u88ab\u66f4\u65b0\uff0c\u8fd9\u65f6\u5019\u5982\u679c\u5ba2\u6237\u7aef\u6ca1\u6709\u7ee7\u7eed\u5199\u5165\uff0cFollower\u7684Committed index\u53ef\u4ee5\u4f9d\u9760ping\u6d88\u606f\uff08\u643a\u5e26\u4e86Leader \u7684committed index\uff09\u8fdb\u884c\u66f4\u65b0\u3002"}),"\n",(0,d.jsx)(n.p,{children:"3\uff0c\u5f53Leader \u63a5\u6536\u5230Follower\u7684ack\u4fe1\u606f\u7684\u65f6\u5019\uff0cLeader \u72b6\u6001\u4f1a\u505a\u5982\u4e0b\u66f4\u65b0\uff1a"}),"\n",(0,d.jsx)(n.p,{children:"Leader Status:"}),"\n",(0,d.jsx)(n.p,{children:"Committed Index : 15"}),"\n",(0,d.jsx)(n.p,{children:"Applied Index: 8"}),"\n",(0,d.jsx)(n.p,{children:"Last Index: 15"}),"\n",(0,d.jsx)(n.p,{children:"\u6b64\u65f6\u65e5\u5fd79-15\u90fd\u662f\u53ef\u4ee5\u88ab\u5e94\u7528\u5230\u72b6\u6001\u673a\uff0c\u8fd9\u91cc\u662f\u5199db\uff0c\u5f53\u65e5\u5fd79\u5199\u5165db\u4e4b\u540e\uff0c\u5c31\u4f1a\u8fd4\u56de\u5ba2\u6237\u7aef\uff0c\u76f8\u5e94\u7684Applied Index \u66f4\u65b0\u4e3a9\u3002\u8fd9\u65f6\u5019\u65e5\u5fd79\u5c31\u53ef\u4ee5\u8fd4\u56de\u5ba2\u6237\u7aef\u3002"}),"\n",(0,d.jsx)(n.p,{children:"\u5bf9\u4e8e\u4ece\u6765\u8bf4\uff0c\u6574\u4f53\u7684\u65e5\u5fd7\u590d\u5236\u7684\u903b\u8f91\u8fd8\u662f\u6309\u7167Raft\u8bba\u6587\u5f53\u4e2d\u8fdb\u884c\u7684\u3002\u552f\u4e00\u4e0d\u540c\u7684\u662f\u8bba\u6587\u4e2d\u65e5\u5fd7\u56de\u9000\u7684\u4e00\u90e8\u5206\u903b\u8f91\u653e\u5230\u4e86\u65e5\u5fd7\u534f\u5546\u9636\u6bb5\u8fdb\u884c\u3002"}),"\n",(0,d.jsx)(n.h3,{id:"\u65e5\u5fd7\u6062\u590d",children:"\u65e5\u5fd7\u6062\u590d\uff1a"}),"\n",(0,d.jsx)(n.p,{children:"\u91cd\u542fpika\u7684\u65f6\u5019\uff0c\u6839\u636e\u6301\u4e45\u8bdd\u7684\u4e00\u81f4\u6027\u4fe1\u606f\uff08applied index \u7b49\uff09\u56de\u590d\u51fa\u4e4b\u524d\u7684\u4e00\u81f4\u6027\u72b6\u6001\u3002"}),"\n",(0,d.jsx)(n.h3,{id:"\u65e5\u5fd7\u534f\u5546",children:"\u65e5\u5fd7\u534f\u5546\uff1a"}),"\n",(0,d.jsx)(n.p,{children:"\u8fd9\u4e2a\u9636\u6bb5Follower\u8282\u70b9\u4e3b\u52a8\u53d1\u8d77Trysync\u6d41\u7a0b\uff0c\u643a\u5e26Last Index\uff0c\u5411Leader\u53d1\u9001\u534f\u5546\u540c\u6b65\u70b9\u4f4d\u8bf7\u6c42\u3002\u534f\u5546\u8fc7\u7a0b\u5982\u4e0b\uff1a"}),"\n",(0,d.jsx)(n.p,{children:"Follower\u643a\u5e26last_index\u53d1\u52a8\u5230Leader\uff0c Leader \u901a\u8fc7Follower\u7684last_index\u4f4d\u7f6e\u5224\u65ad\u662f\u5426\u81ea\u5df1\u80fd\u591f\u627e\u5230last_index\u5bf9\u5e94\u7684\u81ea\u5df1\u7684\u76f8\u5e94\u7684log\uff0c\u5982\u679c\u627e\u5230log\u5e76\u4e14\u4e24\u4e2alog\u4e00\u81f4\uff0cLeader\u8fd4\u56deokay\u534f\u5546\u7ed3\u675f\u3002\u5982\u679c\u6ca1\u6709\u627e\u5230\uff0c\u6216\u8005log\u4e0d\u4e00\u81f4\uff0cLeader\u5411Follower\u53d1\u9001hints\uff0chints\u662fLeader\u672c\u5730\u7684\u6700\u65b0\u7684\u65e5\u5fd7\u3002Follower\u901a\u8fc7hints\uff0c\u56de\u9000\u672c\u5730\u65e5\u5fd7\uff0c\u66f4\u65b0\u81ea\u5df1\u7684last_index\uff0c\u91cd\u65b0\u5411\u4e3b\u534f\u5546\u3002\u6700\u7ec8Leader Follower\u8fbe\u6210\u4e00\u81f4\uff0c\u7ed3\u675fTrySync\u6d41\u7a0b\uff0c\u8fdb\u884c\u65e5\u5fd7\u590d\u5236\u6d41\u7a0b\u3002"}),"\n",(0,d.jsx)(n.p,{children:(0,d.jsx)(n.img,{src:"https://s1.ax1x.com/2020/03/27/GPVbgU.png",alt:""})}),"\n",(0,d.jsx)(n.p,{children:"Leader \u65e5\u5fd7\u534f\u5546\u7684\u4f2a\u4ee3\u7801\u5982\u4e0b\uff1a"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-c++",children:"Status LeaderNegotiate() {\n reject = true\n if (follower.last_index > last_index) {\n send[last_index - 100, last_index]\n } else if (follower.last_index < first_index) {\n need dbsync\n }\n if (follower.last_index not found) {\n need dbsync\n }\n if (follower.last_index found but term not equal) {\n send[found_index - 100, found_index]\n }\n reject = false\n return ok;\n}\n"})}),"\n",(0,d.jsx)(n.p,{children:"Follower\u65e5\u5fd7\u534f\u5546\u7684\u4f2a\u4ee3\u7801\u65e5\u4e0b\uff1a"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-c++",children:"Status FollowerNegotiate() {\n if last_index > hints[hints.size() - 1] {\n TruncateTo(hints[hints.size() - 1]);\n }\n for (reverse loop hints) {\n if (hint.index exist && hint.term == term) {\n TruncateTo(hint.index)\n send trysync with log_index = hint.index\n return ok;\n }\n }\n // cant find any match\n TruncateTo(hints[0])\n send trysync with log_index = last_index\n}\n"})}),"\n",(0,d.jsx)(n.p,{children:"\u4ee5\u4e0a\u4ecb\u7ecd\u4e86\u5173\u4e8e\u65e5\u5fd7\u7684\u5177\u4f53\u4e09\u4e2a\u9636\u6bb5\u3002\u6574\u4f53\u7684\u903b\u8f91\u9075\u4ece\u4e0eRaft\u8bba\u6587\u7684\u8bbe\u8ba1\uff0c\u5728\u5b9e\u73b0\u7ec6\u8282\u4e0a\u6839\u636ePika\u76ee\u524d\u7684\u4ee3\u7801\u7ed3\u6784\u8fdb\u884c\u4e86\u4e00\u4e9b\u5217\u7684\u8c03\u6574\u3002"}),"\n",(0,d.jsx)(n.h3,{id:"\u5173\u4e8e\u9009\u4e3b\u548c\u6210\u5458\u53d8\u6362",children:"\u5173\u4e8e\u9009\u4e3b\u548c\u6210\u5458\u53d8\u6362"}),"\n",(0,d.jsxs)(n.p,{children:["\u76ee\u524d\u9009\u4e3b\u9700\u8981\u7ba1\u7406\u5458\u624b\u52a8\u4ecb\u5165\uff0c\u8be6\u89c1",(0,d.jsx)(n.a,{href:"https://github.com/Qihoo360/pika/wiki/%E5%89%AF%E6%9C%AC%E4%B8%80%E8%87%B4%E6%80%A7%E4%BD%BF%E7%94%A8%E6%96%87%E6%A1%A3",children:"\u526f\u672c\u4e00\u81f4\u6027\u4f7f\u7528\u6587\u6863"})," \u3002"]}),"\n",(0,d.jsx)(n.p,{children:"\u6210\u5458\u53d8\u6362\u7684\u529f\u80fd\u76ee\u524d\u6682\u4e0d\u652f\u6301\u3002"})]})}function x(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,d.jsx)(n,{...e,children:(0,d.jsx)(a,{...e})}):a(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>s});var d=i(6540);const l={},t=d.createContext(l);function r(e){const n=d.useContext(t);return d.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:r(e.components),d.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/814f3328.29c9ae20.js b/build/assets/js/814f3328.29c9ae20.js new file mode 100644 index 0000000..73987ea --- /dev/null +++ b/build/assets/js/814f3328.29c9ae20.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[5091],{5513:i=>{i.exports=JSON.parse('{"title":"\u5168\u90e8\u6587\u7ae0","items":[{"title":"What\'s new in PikiwiDB(Pika) v4.0.0","permalink":"/blog/PikiwiDB-Pika--4.0.0","unlisted":false},{"title":"What\'s new in Pika v3.5.4","permalink":"/blog/Pika-3.5.4","unlisted":false},{"title":"What\'s new in Pika v3.5.3 ","permalink":"/blog/Pika-3.5.3","unlisted":false},{"title":"What\'s new in Pika v3.5.0","permalink":"/blog/Pika-3.5.0","unlisted":false},{"title":"What\'s new in Pika v3.5.1","permalink":"/blog/Pika-3.5.1","unlisted":false},{"title":"What\'s new in Pika v3.5.0","permalink":"/blog/Pika-3.5.0","unlisted":false},{"title":"Pika Blackwidow \u5f15\u64ce\u6570\u636e\u5b58\u50a8\u683c\u5f0f","permalink":"/blog/pika-blackwidow","unlisted":false},{"title":"pika_port \u8fc1\u79fb\u5de5\u5177","permalink":"/blog/Pika-Tools-Port-Bin","unlisted":false}]}')}}]); \ No newline at end of file diff --git a/build/assets/js/82bececd.1c5cd812.js b/build/assets/js/82bececd.1c5cd812.js new file mode 100644 index 0000000..27ea751 --- /dev/null +++ b/build/assets/js/82bececd.1c5cd812.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[9595],{8434:(e,d,s)=>{s.r(d),s.d(d,{assets:()=>o,contentTitle:()=>l,default:()=>a,frontMatter:()=>i,metadata:()=>r,toc:()=>t});var n=s(4848),c=s(8453);const i={title:"\u591a\u5e93\u7248\u547d\u4ee4",sidebar_position:80},l=void 0,r={id:"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u591a\u5e93\u7248\u547d\u4ee4/index",title:"\u591a\u5e93\u7248\u547d\u4ee4",description:"Pika\u81ea\u7248\u672c3.1.0\u8d77\u5f00\u59cb\u652f\u6301\u591adb\uff0c\u4e3a\u4e86\u517c\u5bb9\u591adb\u90e8\u5206\u547d\u4ee4\u3001\u914d\u7f6e\u53c2\u6570\u53d1\u751f\u4e86\u53d8\u5316\uff0c\u5177\u4f53\u53d8\u5316\u5982\u4e0b\uff1a",source:"@site/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u591a\u5e93\u7248\u547d\u4ee4/index.md",sourceDirName:"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u591a\u5e93\u7248\u547d\u4ee4",slug:"/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u591a\u5e93\u7248\u547d\u4ee4/",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u591a\u5e93\u7248\u547d\u4ee4/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u591a\u5e93\u7248\u547d\u4ee4/index.md",tags:[],version:"current",sidebarPosition:80,frontMatter:{title:"\u591a\u5e93\u7248\u547d\u4ee4",sidebar_position:80},sidebar:"tutorialSidebar",previous:{title:"\u81ea\u52a8\u5bb9\u707e",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u81ea\u52a8\u5bb9\u707e/"},next:{title:"\u670d\u52a1\u5668\u72b6\u6001\u76d1\u63a7",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u670d\u52a1\u5668\u72b6\u6001\u76d1\u63a7/"}},o={},t=[{value:"Pika\u81ea\u7248\u672c3.1.0\u8d77\u5f00\u59cb\u652f\u6301\u591adb\uff0c\u4e3a\u4e86\u517c\u5bb9\u591adb\u90e8\u5206\u547d\u4ee4\u3001\u914d\u7f6e\u53c2\u6570\u53d1\u751f\u4e86\u53d8\u5316\uff0c\u5177\u4f53\u53d8\u5316\u5982\u4e0b\uff1a",id:"pika\u81ea\u7248\u672c310\u8d77\u5f00\u59cb\u652f\u6301\u591adb\u4e3a\u4e86\u517c\u5bb9\u591adb\u90e8\u5206\u547d\u4ee4\u914d\u7f6e\u53c2\u6570\u53d1\u751f\u4e86\u53d8\u5316\u5177\u4f53\u53d8\u5316\u5982\u4e0b",level:2},{value:"1.info keyspace\u547d\u4ee4\uff1a",id:"1info-keyspace\u547d\u4ee4",level:3},{value:"2.compact\u547d\u4ee4\uff1a",id:"2compact\u547d\u4ee4",level:2},{value:"3.slaveof\u547d\u4ee4:",id:"3slaveof\u547d\u4ee4",level:2},{value:"4.bgsave\u547d\u4ee4:",id:"4bgsave\u547d\u4ee4",level:2},{value:"5.purgelogsto\u547d\u4ee4:",id:"5purgelogsto\u547d\u4ee4",level:2},{value:"6.flushdb\u547d\u4ee4:",id:"6flushdb\u547d\u4ee4",level:2},{value:"7.dbslaveof\u547d\u4ee4:",id:"7dbslaveof\u547d\u4ee4",level:2}];function h(e){const d={code:"code",h2:"h2",h3:"h3",p:"p",strong:"strong",...(0,c.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(d.h2,{id:"pika\u81ea\u7248\u672c310\u8d77\u5f00\u59cb\u652f\u6301\u591adb\u4e3a\u4e86\u517c\u5bb9\u591adb\u90e8\u5206\u547d\u4ee4\u914d\u7f6e\u53c2\u6570\u53d1\u751f\u4e86\u53d8\u5316\u5177\u4f53\u53d8\u5316\u5982\u4e0b",children:"Pika\u81ea\u7248\u672c3.1.0\u8d77\u5f00\u59cb\u652f\u6301\u591adb\uff0c\u4e3a\u4e86\u517c\u5bb9\u591adb\u90e8\u5206\u547d\u4ee4\u3001\u914d\u7f6e\u53c2\u6570\u53d1\u751f\u4e86\u53d8\u5316\uff0c\u5177\u4f53\u53d8\u5316\u5982\u4e0b\uff1a"}),"\n",(0,n.jsxs)(d.h3,{id:"1info-keyspace\u547d\u4ee4",children:["1.",(0,n.jsx)(d.code,{children:"info keyspace"}),"\u547d\u4ee4\uff1a"]}),"\n",(0,n.jsxs)(d.p,{children:[(0,n.jsx)(d.strong,{children:"\u4fdd\u7559"}),"\uff1a"]}),"\n",(0,n.jsxs)(d.p,{children:[(0,n.jsx)(d.code,{children:"info keyspace [1|0]"}),":\u89e6\u53d1\u7edf\u8ba1\u5e76\u5c55\u793a\u3001\u4ec5\u5c55\u793a\u6240\u6709db\u7684key\u4fe1\u606f"]}),"\n",(0,n.jsx)(d.p,{children:(0,n.jsx)(d.strong,{children:"\u65b0\u589e\uff1a"})}),"\n",(0,n.jsxs)(d.p,{children:[(0,n.jsx)(d.code,{children:"info keyspace [1|0] db0"}),":\u89e6\u53d1\u7edf\u8ba1\u5e76\u5c55\u793a\u3001\u4ec5\u5c55\u793adb0\u7684key\u4fe1\u606f"]}),"\n",(0,n.jsxs)(d.p,{children:[(0,n.jsx)(d.code,{children:"info keyspace [1|0] db0,db2"}),":\u89e6\u53d1\u7edf\u8ba1\u5e76\u5c55\u793a\u3001\u4ec5\u5c55\u793adb0\u548cdb2\u7684key\u4fe1\u606f"]}),"\n",(0,n.jsxs)(d.p,{children:["\u6ce8\u610f\uff1adb-name\u4ec5\u5141\u8bb8\u4f7f\u7528",(0,n.jsx)(d.code,{children:"db[0-7]"}),"\u6765\u8868\u793a\uff0c\u591a\u4e2adb-name\u4f7f\u7528",(0,n.jsx)(d.code,{children:"\u9017\u53f7"}),"\u9694\u5f00"]}),"\n",(0,n.jsxs)(d.h2,{id:"2compact\u547d\u4ee4",children:["2.",(0,n.jsx)(d.code,{children:"compact"}),"\u547d\u4ee4\uff1a"]}),"\n",(0,n.jsx)(d.p,{children:(0,n.jsx)(d.strong,{children:"\u4fdd\u7559\uff1a"})}),"\n",(0,n.jsxs)(d.p,{children:[(0,n.jsx)(d.code,{children:"compact"}),":\u5bf9\u6240\u6709db\u8fdb\u884ccompact"]}),"\n",(0,n.jsxs)(d.p,{children:[(0,n.jsx)(d.code,{children:"compact [string/hash/set/zset/list/all]"}),":\u5bf9\u6240\u6709db\u7684\u67d0\u4e2a\u6570\u636e\u7ed3\u6784\u3001\u6240\u6709\u6570\u636e\u7ed3\u6784\u8fdb\u884ccompact"]}),"\n",(0,n.jsx)(d.p,{children:(0,n.jsx)(d.strong,{children:"\u65b0\u589e\uff1a"})}),"\n",(0,n.jsxs)(d.p,{children:[(0,n.jsx)(d.code,{children:"compact db0 all"}),":\u4ec5\u5bf9db0\u7684\u6240\u6709\u6570\u636e\u7ed3\u6784\u8fdb\u884ccompact"]}),"\n",(0,n.jsxs)(d.p,{children:[(0,n.jsx)(d.code,{children:"compact db0,db2 all"}),":\u5bf9db0\u53cadb2\u7684\u6240\u6709\u6570\u636e\u7ed3\u6784\u8fdb\u884ccompact"]}),"\n",(0,n.jsxs)(d.p,{children:[(0,n.jsx)(d.code,{children:"compact db1 string"}),":\u4ec5\u5bf9db1\u7684string\u6570\u636e\u7ed3\u6784\u8fdb\u884ccompact"]}),"\n",(0,n.jsxs)(d.p,{children:[(0,n.jsx)(d.code,{children:"compact db1,db3 hash"}),":\u5bf9db1\u53cadb3\u7684hash\u6570\u636e\u7ed3\u6784\u8fdb\u884ccompact"]}),"\n",(0,n.jsxs)(d.p,{children:["\u6ce8\u610f\uff1adb-name\u4ec5\u5141\u8bb8\u4f7f\u7528",(0,n.jsx)(d.code,{children:"db[0-7]"}),"\u6765\u8868\u793a\uff0c\u591a\u4e2adb-name\u4f7f\u7528",(0,n.jsx)(d.code,{children:"\u9017\u53f7"}),"\u9694\u5f00"]}),"\n",(0,n.jsxs)(d.h2,{id:"3slaveof\u547d\u4ee4",children:["3.",(0,n.jsx)(d.code,{children:"slaveof"}),"\u547d\u4ee4:"]}),"\n",(0,n.jsx)(d.p,{children:(0,n.jsx)(d.strong,{children:"\u4fdd\u7559:"})}),"\n",(0,n.jsxs)(d.p,{children:[(0,n.jsx)(d.code,{children:"slaveof 192.168.1.1 6236 [force]"}),":\u4e3apika\u5b9e\u4f8b\u521b\u5efa\u540c\u6b65\u5173\u7cfb\uff0c\u5f71\u54cd\u6240\u6709db\uff0c\u53ef\u901a\u8fc7force\u53c2\u6570\u8fdb\u884c\u5b9e\u4f8b\u7ea7\u5168\u91cf\u540c\u6b65"]}),"\n",(0,n.jsx)(d.p,{children:(0,n.jsx)(d.strong,{children:"\u5220\u9664:"})}),"\n",(0,n.jsxs)(d.p,{children:[(0,n.jsx)(d.code,{children:"slaveof 192.168.1.1 6236 1234 111222333"}),":\u5168\u5c40\u521b\u5efa\u540c\u6b65\u5173\u7cfb\u65f6\u4e0d\u518d\u5141\u8bb8\u6307\u5b9awrite2file\u6587\u4ef6\u53f7\u3001write2file\u6587\u4ef6\u504f\u79fb\u91cf"]}),"\n",(0,n.jsxs)(d.h2,{id:"4bgsave\u547d\u4ee4",children:["4.",(0,n.jsx)(d.code,{children:"bgsave"}),"\u547d\u4ee4:"]}),"\n",(0,n.jsx)(d.p,{children:(0,n.jsx)(d.strong,{children:"\u4fdd\u7559:"})}),"\n",(0,n.jsxs)(d.p,{children:[(0,n.jsx)(d.code,{children:"bgsave"}),":\u5bf9\u6240\u6709db\u8fdb\u884c\u5feb\u7167\u5f0f\u5907\u4efd"]}),"\n",(0,n.jsx)(d.p,{children:(0,n.jsx)(d.strong,{children:"\u65b0\u589e:"})}),"\n",(0,n.jsxs)(d.p,{children:[(0,n.jsx)(d.code,{children:"bgsave db0"}),":\u4ec5\u5907\u4efddb0"]}),"\n",(0,n.jsxs)(d.p,{children:[(0,n.jsx)(d.code,{children:"bgsave db0,db3"}),":\u4ec5\u5907\u4efddb0\u53cadb3"]}),"\n",(0,n.jsxs)(d.p,{children:["\u6ce8\u610f\uff1adb-name\u4ec5\u5141\u8bb8\u4f7f\u7528",(0,n.jsx)(d.code,{children:"db[0-7]"}),"\u6765\u8868\u793a\uff0c\u591a\u4e2adb-name\u4f7f\u7528",(0,n.jsx)(d.code,{children:"\u9017\u53f7"}),"\u9694\u5f00"]}),"\n",(0,n.jsxs)(d.h2,{id:"5purgelogsto\u547d\u4ee4",children:["5.",(0,n.jsx)(d.code,{children:"purgelogsto"}),"\u547d\u4ee4:"]}),"\n",(0,n.jsx)(d.p,{children:(0,n.jsx)(d.strong,{children:"\u4fdd\u7559:"})}),"\n",(0,n.jsxs)(d.p,{children:[(0,n.jsx)(d.code,{children:"purgelogsto write2file1000"}),":\u5220\u9664db0\u4e2d\u7684write2file1000\u4ee5\u524d\u7684\u6240\u6709write2file"]}),"\n",(0,n.jsx)(d.p,{children:(0,n.jsx)(d.strong,{children:"\u65b0\u589e:"})}),"\n",(0,n.jsxs)(d.p,{children:[(0,n.jsx)(d.code,{children:"purgelogsto write2file1000 db1"}),":\u5220\u9664db1\u4e2d\u7684write2file1000\u4ee5\u524d\u7684\u6240\u6709write2file\uff0c\u6bcf\u6b21\u4ec5\u5141\u8bb8\u64cd\u4f5c\u4e00\u4e2adb"]}),"\n",(0,n.jsxs)(d.p,{children:["\u6ce8\u610f\uff1adb-name\u4ec5\u5141\u8bb8\u4f7f\u7528",(0,n.jsx)(d.code,{children:"db[0-7]"}),"\u6765\u8868\u793a"]}),"\n",(0,n.jsxs)(d.h2,{id:"6flushdb\u547d\u4ee4",children:["6.",(0,n.jsx)(d.code,{children:"flushdb"}),"\u547d\u4ee4:"]}),"\n",(0,n.jsx)(d.p,{children:(0,n.jsx)(d.strong,{children:"\u4fdd\u7559:"})}),"\n",(0,n.jsxs)(d.p,{children:[(0,n.jsx)(d.code,{children:"flushdb [string/hash/set/zset/list]"}),":\u5220\u9664\u67d0\u4e2adb\u4e2d\u7684\u67d0\u4e2a\u6570\u636e\u7ed3\u6784"]}),"\n",(0,n.jsx)(d.p,{children:(0,n.jsx)(d.strong,{children:"\u65b0\u589e:"})}),"\n",(0,n.jsxs)(d.p,{children:[(0,n.jsx)(d.code,{children:"flushdb"}),":\u5220\u9664\u67d0\u4e2adb\u4e2d\u7684\u6240\u6709\u6570\u636e\u7ed3\u6784"]}),"\n",(0,n.jsx)(d.p,{children:"\u6ce8\u610f:\u4e0eredis\u4e00\u81f4\uff0c\u5728pika\u4e2d\u6267\u884cflushdb\u524d\u8bf7\u5148select\u5230\u51c6\u786e\u7684db\uff0c\u4ee5\u9632\u8bef\u5220\u6570\u636e"}),"\n",(0,n.jsxs)(d.h2,{id:"7dbslaveof\u547d\u4ee4",children:["7.",(0,n.jsx)(d.code,{children:"dbslaveof"}),"\u547d\u4ee4:"]}),"\n",(0,n.jsxs)(d.p,{children:[(0,n.jsx)(d.code,{children:"dbslaveof db[0 ~ 7]"}),": \u540c\u6b65\u67d0\u4e00\u4e2adb"]}),"\n",(0,n.jsxs)(d.p,{children:[(0,n.jsx)(d.code,{children:"dbslaveof db[0 ~ 7] force"}),": \u5168\u91cf\u540c\u6b65\u67d0\u4e00\u4e2adb"]}),"\n",(0,n.jsxs)(d.p,{children:[(0,n.jsx)(d.code,{children:"dbslaveof db[0 ~ 7] no one"}),": \u505c\u6b62\u540c\u6b65\u67d0\u4e00\u4e2adb"]}),"\n",(0,n.jsxs)(d.p,{children:[(0,n.jsx)(d.code,{children:"dbslaveof db[0 ~ 7] filenum offset"}),": \u6307\u5b9a\u504f\u79fb\u91cf\u540c\u6b65\u67d0\u4e00\u4e2adb"]}),"\n",(0,n.jsx)(d.p,{children:"\u6ce8\u610f:\u8be5\u547d\u4ee4\u9700\u8981\u5728\u4e24\u4e2aPika\u5b9e\u4f8b\u5df2\u7ecf\u5efa\u7acb\u4e86\u4e3b\u4ece\u5173\u7cfb\u4e4b\u540e\u624d\u80fd\u5bf9\u5355\u4e2adb\u7684\u540c\u6b65\u72b6\u6001\u8fdb\u884c\u63a7\u5236"})]})}function a(e={}){const{wrapper:d}={...(0,c.R)(),...e.components};return d?(0,n.jsx)(d,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},8453:(e,d,s)=>{s.d(d,{R:()=>l,x:()=>r});var n=s(6540);const c={},i=n.createContext(c);function l(e){const d=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(d):{...d,...e}}),[d,e])}function r(e){let d;return d=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:l(e.components),n.createElement(i.Provider,{value:d},e.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/8554.5845e862.js b/build/assets/js/8554.5845e862.js new file mode 100644 index 0000000..8c4a4db --- /dev/null +++ b/build/assets/js/8554.5845e862.js @@ -0,0 +1 @@ +(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[8554],{7293:(e,t,n)=>{"use strict";n.d(t,{A:()=>L});var s=n(6540),a=n(4848);function o(e){const{mdxAdmonitionTitle:t,rest:n}=function(e){const t=s.Children.toArray(e),n=t.find((e=>s.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),o=t.filter((e=>e!==n)),c=n?.props.children;return{mdxAdmonitionTitle:c,rest:o.length>0?(0,a.jsx)(a.Fragment,{children:o}):null}}(e.children),o=e.title??t;return{...e,...o&&{title:o},children:n}}var c=n(4164),i=n(1312),r=n(7559);const l={admonition:"admonition_xJq3",admonitionHeading:"admonitionHeading_Gvgb",admonitionIcon:"admonitionIcon_Rf37",admonitionContent:"admonitionContent_BuS1"};function d(e){let{type:t,className:n,children:s}=e;return(0,a.jsx)("div",{className:(0,c.A)(r.G.common.admonition,r.G.common.admonitionType(t),l.admonition,n),children:s})}function u(e){let{icon:t,title:n}=e;return(0,a.jsxs)("div",{className:l.admonitionHeading,children:[(0,a.jsx)("span",{className:l.admonitionIcon,children:t}),n]})}function m(e){let{children:t}=e;return t?(0,a.jsx)("div",{className:l.admonitionContent,children:t}):null}function h(e){const{type:t,icon:n,title:s,children:o,className:c}=e;return(0,a.jsxs)(d,{type:t,className:c,children:[s||n?(0,a.jsx)(u,{title:s,icon:n}):null,(0,a.jsx)(m,{children:o})]})}function p(e){return(0,a.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const f={icon:(0,a.jsx)(p,{}),title:(0,a.jsx)(i.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function g(e){return(0,a.jsx)(h,{...f,...e,className:(0,c.A)("alert alert--secondary",e.className),children:e.children})}function x(e){return(0,a.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const j={icon:(0,a.jsx)(x,{}),title:(0,a.jsx)(i.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function b(e){return(0,a.jsx)(h,{...j,...e,className:(0,c.A)("alert alert--success",e.className),children:e.children})}function v(e){return(0,a.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const N={icon:(0,a.jsx)(v,{}),title:(0,a.jsx)(i.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function y(e){return(0,a.jsx)(h,{...N,...e,className:(0,c.A)("alert alert--info",e.className),children:e.children})}function A(e){return(0,a.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const k={icon:(0,a.jsx)(A,{}),title:(0,a.jsx)(i.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function B(e){return(0,a.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,a.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const C={icon:(0,a.jsx)(B,{}),title:(0,a.jsx)(i.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const w={icon:(0,a.jsx)(A,{}),title:(0,a.jsx)(i.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const _={...{note:g,tip:b,info:y,warning:function(e){return(0,a.jsx)(h,{...k,...e,className:(0,c.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,a.jsx)(h,{...C,...e,className:(0,c.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,a.jsx)(g,{title:"secondary",...e}),important:e=>(0,a.jsx)(y,{title:"important",...e}),success:e=>(0,a.jsx)(b,{title:"success",...e}),caution:function(e){return(0,a.jsx)(h,{...w,...e,className:(0,c.A)("alert alert--warning",e.className),children:e.children})}}};function L(e){const t=o(e),n=(s=t.type,_[s]||(console.warn(`No admonition component found for admonition type "${s}". Using Info as fallback.`),_.info));var s;return(0,a.jsx)(n,{...t})}},4336:(e,t,n)=>{"use strict";n.d(t,{A:()=>g});n(6540);var s=n(4164),a=n(1312),o=n(7559),c=n(8774);const i={iconEdit:"iconEdit_Z9Sw"};var r=n(4848);function l(e){let{className:t,...n}=e;return(0,r.jsx)("svg",{fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,s.A)(i.iconEdit,t),"aria-hidden":"true",...n,children:(0,r.jsx)("g",{children:(0,r.jsx)("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})})})}function d(e){let{editUrl:t}=e;return(0,r.jsxs)(c.A,{to:t,className:o.G.common.editThisPage,children:[(0,r.jsx)(l,{}),(0,r.jsx)(a.A,{id:"theme.common.editThisPage",description:"The link label to edit the current page",children:"Edit this page"})]})}var u=n(6266);function m(e){let{lastUpdatedAt:t}=e;const n=new Date(t),s=(0,u.i)({day:"numeric",month:"short",year:"numeric",timeZone:"UTC"}).format(n);return(0,r.jsx)(a.A,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:(0,r.jsx)("b",{children:(0,r.jsx)("time",{dateTime:n.toISOString(),itemProp:"dateModified",children:s})})},children:" on {date}"})}function h(e){let{lastUpdatedBy:t}=e;return(0,r.jsx)(a.A,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:(0,r.jsx)("b",{children:t})},children:" by {user}"})}function p(e){let{lastUpdatedAt:t,lastUpdatedBy:n}=e;return(0,r.jsxs)("span",{className:o.G.common.lastUpdated,children:[(0,r.jsx)(a.A,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:t?(0,r.jsx)(m,{lastUpdatedAt:t}):"",byUser:n?(0,r.jsx)(h,{lastUpdatedBy:n}):""},children:"Last updated{atDate}{byUser}"}),!1]})}const f={lastUpdated:"lastUpdated_JAkA"};function g(e){let{className:t,editUrl:n,lastUpdatedAt:a,lastUpdatedBy:o}=e;return(0,r.jsxs)("div",{className:(0,s.A)("row",t),children:[(0,r.jsx)("div",{className:"col",children:n&&(0,r.jsx)(d,{editUrl:n})}),(0,r.jsx)("div",{className:(0,s.A)("col",f.lastUpdated),children:(a||o)&&(0,r.jsx)(p,{lastUpdatedAt:a,lastUpdatedBy:o})})]})}},5533:(e,t,n)=>{"use strict";n.d(t,{A:()=>re});var s=n(6540),a=n(8453),o=n(5260),c=n(2303),i=n(4164),r=n(5293),l=n(6342);function d(){const{prism:e}=(0,l.p)(),{colorMode:t}=(0,r.G)(),n=e.theme,s=e.darkTheme||n;return"dark"===t?s:n}var u=n(7559),m=n(8426),h=n.n(m);const p=/title=(?["'])(?.*?)\1/,f=/\{(?<range>[\d,-]+)\}/,g={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"}},x={...g,lua:{start:"--",end:""},wasm:{start:"\\;\\;",end:""},tex:{start:"%",end:""},vb:{start:"['\u2018\u2019]",end:""},vbnet:{start:"(?:_\\s*)?['\u2018\u2019]",end:""},rem:{start:"[Rr][Ee][Mm]\\b",end:""},f90:{start:"!",end:""},ml:{start:"\\(\\*",end:"\\*\\)"},cobol:{start:"\\*>",end:""}},j=Object.keys(g);function b(e,t){const n=e.map((e=>{const{start:n,end:s}=x[e];return`(?:${n}\\s*(${t.flatMap((e=>[e.line,e.block?.start,e.block?.end].filter(Boolean))).join("|")})\\s*${s})`})).join("|");return new RegExp(`^\\s*(?:${n})\\s*$`)}function v(e,t){let n=e.replace(/\n$/,"");const{language:s,magicComments:a,metastring:o}=t;if(o&&f.test(o)){const e=o.match(f).groups.range;if(0===a.length)throw new Error(`A highlight range has been given in code block's metastring (\`\`\` ${o}), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.`);const t=a[0].className,s=h()(e).filter((e=>e>0)).map((e=>[e-1,[t]]));return{lineClassNames:Object.fromEntries(s),code:n}}if(void 0===s)return{lineClassNames:{},code:n};const c=function(e,t){switch(e){case"js":case"javascript":case"ts":case"typescript":return b(["js","jsBlock"],t);case"jsx":case"tsx":return b(["js","jsBlock","jsx"],t);case"html":return b(["js","jsBlock","html"],t);case"python":case"py":case"bash":return b(["bash"],t);case"markdown":case"md":return b(["html","jsx","bash"],t);case"tex":case"latex":case"matlab":return b(["tex"],t);case"lua":case"haskell":case"sql":return b(["lua"],t);case"wasm":return b(["wasm"],t);case"vb":case"vba":case"visual-basic":return b(["vb","rem"],t);case"vbnet":return b(["vbnet","rem"],t);case"batch":return b(["rem"],t);case"basic":return b(["rem","f90"],t);case"fsharp":return b(["js","ml"],t);case"ocaml":case"sml":return b(["ml"],t);case"fortran":return b(["f90"],t);case"cobol":return b(["cobol"],t);default:return b(j,t)}}(s,a),i=n.split("\n"),r=Object.fromEntries(a.map((e=>[e.className,{start:0,range:""}]))),l=Object.fromEntries(a.filter((e=>e.line)).map((e=>{let{className:t,line:n}=e;return[n,t]}))),d=Object.fromEntries(a.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.start,t]}))),u=Object.fromEntries(a.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.end,t]})));for(let h=0;h<i.length;){const e=i[h].match(c);if(!e){h+=1;continue}const t=e.slice(1).find((e=>void 0!==e));l[t]?r[l[t]].range+=`${h},`:d[t]?r[d[t]].start=h:u[t]&&(r[u[t]].range+=`${r[u[t]].start}-${h-1},`),i.splice(h,1)}n=i.join("\n");const m={};return Object.entries(r).forEach((e=>{let[t,{range:n}]=e;h()(n).forEach((e=>{m[e]??=[],m[e].push(t)}))})),{lineClassNames:m,code:n}}const N={codeBlockContainer:"codeBlockContainer_Ckt0"};var y=n(4848);function A(e){let{as:t,...n}=e;const s=function(e){const t={color:"--prism-color",backgroundColor:"--prism-background-color"},n={};return Object.entries(e.plain).forEach((e=>{let[s,a]=e;const o=t[s];o&&"string"==typeof a&&(n[o]=a)})),n}(d());return(0,y.jsx)(t,{...n,style:s,className:(0,i.A)(n.className,N.codeBlockContainer,u.G.common.codeBlock)})}const k={codeBlockContent:"codeBlockContent_biex",codeBlockTitle:"codeBlockTitle_Ktv7",codeBlock:"codeBlock_bY9V",codeBlockStandalone:"codeBlockStandalone_MEMb",codeBlockLines:"codeBlockLines_e6Vv",codeBlockLinesWithNumbering:"codeBlockLinesWithNumbering_o6Pm",buttonGroup:"buttonGroup__atx"};function B(e){let{children:t,className:n}=e;return(0,y.jsx)(A,{as:"pre",tabIndex:0,className:(0,i.A)(k.codeBlockStandalone,"thin-scrollbar",n),children:(0,y.jsx)("code",{className:k.codeBlockLines,children:t})})}var C=n(9532);const w={attributes:!0,characterData:!0,childList:!0,subtree:!0};function _(e,t){const[n,a]=(0,s.useState)(),o=(0,s.useCallback)((()=>{a(e.current?.closest("[role=tabpanel][hidden]"))}),[e,a]);(0,s.useEffect)((()=>{o()}),[o]),function(e,t,n){void 0===n&&(n=w);const a=(0,C._q)(t),o=(0,C.Be)(n);(0,s.useEffect)((()=>{const t=new MutationObserver(a);return e&&t.observe(e,o),()=>t.disconnect()}),[e,a,o])}(n,(e=>{e.forEach((e=>{"attributes"===e.type&&"hidden"===e.attributeName&&(t(),o())}))}),{attributes:!0,characterData:!1,childList:!1,subtree:!1})}var L=n(1765);const E={codeLine:"codeLine_lJS_",codeLineNumber:"codeLineNumber_Tfdd",codeLineContent:"codeLineContent_feaV"};function T(e){let{line:t,classNames:n,showLineNumbers:s,getLineProps:a,getTokenProps:o}=e;1===t.length&&"\n"===t[0].content&&(t[0].content="");const c=a({line:t,className:(0,i.A)(n,s&&E.codeLine)}),r=t.map(((e,t)=>(0,y.jsx)("span",{...o({token:e})},t)));return(0,y.jsxs)("span",{...c,children:[s?(0,y.jsxs)(y.Fragment,{children:[(0,y.jsx)("span",{className:E.codeLineNumber}),(0,y.jsx)("span",{className:E.codeLineContent,children:r})]}):r,(0,y.jsx)("br",{})]})}var S=n(1312);function U(e){return(0,y.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,y.jsx)("path",{fill:"currentColor",d:"M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"})})}function M(e){return(0,y.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,y.jsx)("path",{fill:"currentColor",d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"})})}const z={copyButtonCopied:"copyButtonCopied_obH4",copyButtonIcons:"copyButtonIcons_eSgA",copyButtonIcon:"copyButtonIcon_y97N",copyButtonSuccessIcon:"copyButtonSuccessIcon_LjdS"};function I(e){let{code:t,className:n}=e;const[a,o]=(0,s.useState)(!1),c=(0,s.useRef)(void 0),r=(0,s.useCallback)((()=>{!function(e,t){let{target:n=document.body}=void 0===t?{}:t;if("string"!=typeof e)throw new TypeError(`Expected parameter \`text\` to be a \`string\`, got \`${typeof e}\`.`);const s=document.createElement("textarea"),a=document.activeElement;s.value=e,s.setAttribute("readonly",""),s.style.contain="strict",s.style.position="absolute",s.style.left="-9999px",s.style.fontSize="12pt";const o=document.getSelection(),c=o.rangeCount>0&&o.getRangeAt(0);n.append(s),s.select(),s.selectionStart=0,s.selectionEnd=e.length;let i=!1;try{i=document.execCommand("copy")}catch{}s.remove(),c&&(o.removeAllRanges(),o.addRange(c)),a&&a.focus()}(t),o(!0),c.current=window.setTimeout((()=>{o(!1)}),1e3)}),[t]);return(0,s.useEffect)((()=>()=>window.clearTimeout(c.current)),[]),(0,y.jsx)("button",{type:"button","aria-label":a?(0,S.T)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,S.T)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,S.T)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,i.A)("clean-btn",n,z.copyButton,a&&z.copyButtonCopied),onClick:r,children:(0,y.jsxs)("span",{className:z.copyButtonIcons,"aria-hidden":"true",children:[(0,y.jsx)(U,{className:z.copyButtonIcon}),(0,y.jsx)(M,{className:z.copyButtonSuccessIcon})]})})}function H(e){return(0,y.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,y.jsx)("path",{fill:"currentColor",d:"M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"})})}const R={wordWrapButtonIcon:"wordWrapButtonIcon_Bwma",wordWrapButtonEnabled:"wordWrapButtonEnabled_EoeP"};function V(e){let{className:t,onClick:n,isEnabled:s}=e;const a=(0,S.T)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return(0,y.jsx)("button",{type:"button",onClick:n,className:(0,i.A)("clean-btn",t,s&&R.wordWrapButtonEnabled),"aria-label":a,title:a,children:(0,y.jsx)(H,{className:R.wordWrapButtonIcon,"aria-hidden":"true"})})}function P(e){let{children:t,className:n="",metastring:a,title:o,showLineNumbers:c,language:r}=e;const{prism:{defaultLanguage:u,magicComments:m}}=(0,l.p)(),h=function(e){return e?.toLowerCase()}(r??function(e){const t=e.split(" ").find((e=>e.startsWith("language-")));return t?.replace(/language-/,"")}(n)??u),f=d(),g=function(){const[e,t]=(0,s.useState)(!1),[n,a]=(0,s.useState)(!1),o=(0,s.useRef)(null),c=(0,s.useCallback)((()=>{const n=o.current.querySelector("code");e?n.removeAttribute("style"):(n.style.whiteSpace="pre-wrap",n.style.overflowWrap="anywhere"),t((e=>!e))}),[o,e]),i=(0,s.useCallback)((()=>{const{scrollWidth:e,clientWidth:t}=o.current,n=e>t||o.current.querySelector("code").hasAttribute("style");a(n)}),[o]);return _(o,i),(0,s.useEffect)((()=>{i()}),[e,i]),(0,s.useEffect)((()=>(window.addEventListener("resize",i,{passive:!0}),()=>{window.removeEventListener("resize",i)})),[i]),{codeBlockRef:o,isEnabled:e,isCodeScrollable:n,toggle:c}}(),x=function(e){return e?.match(p)?.groups.title??""}(a)||o,{lineClassNames:j,code:b}=v(t,{metastring:a,language:h,magicComments:m}),N=c??function(e){return Boolean(e?.includes("showLineNumbers"))}(a);return(0,y.jsxs)(A,{as:"div",className:(0,i.A)(n,h&&!n.includes(`language-${h}`)&&`language-${h}`),children:[x&&(0,y.jsx)("div",{className:k.codeBlockTitle,children:x}),(0,y.jsxs)("div",{className:k.codeBlockContent,children:[(0,y.jsx)(L.f4,{theme:f,code:b,language:h??"text",children:e=>{let{className:t,style:n,tokens:s,getLineProps:a,getTokenProps:o}=e;return(0,y.jsx)("pre",{tabIndex:0,ref:g.codeBlockRef,className:(0,i.A)(t,k.codeBlock,"thin-scrollbar"),style:n,children:(0,y.jsx)("code",{className:(0,i.A)(k.codeBlockLines,N&&k.codeBlockLinesWithNumbering),children:s.map(((e,t)=>(0,y.jsx)(T,{line:e,getLineProps:a,getTokenProps:o,classNames:j[t],showLineNumbers:N},t)))})})}}),(0,y.jsxs)("div",{className:k.buttonGroup,children:[(g.isEnabled||g.isCodeScrollable)&&(0,y.jsx)(V,{className:k.codeButton,onClick:()=>g.toggle(),isEnabled:g.isEnabled}),(0,y.jsx)(I,{className:k.codeButton,code:b})]})]})]})}function W(e){let{children:t,...n}=e;const a=(0,c.A)(),o=function(e){return s.Children.toArray(e).some((e=>(0,s.isValidElement)(e)))?e:Array.isArray(e)?e.join(""):e}(t),i="string"==typeof o?P:B;return(0,y.jsx)(i,{...n,children:o},String(a))}function D(e){return(0,y.jsx)("code",{...e})}var $=n(8774);var G=n(3427),q=n(1422);const O={details:"details_lb9f",isBrowser:"isBrowser_bmU9",collapsibleContent:"collapsibleContent_i85q"};function F(e){return!!e&&("SUMMARY"===e.tagName||F(e.parentElement))}function Z(e,t){return!!e&&(e===t||Z(e.parentElement,t))}function J(e){let{summary:t,children:n,...a}=e;(0,G.A)().collectAnchor(a.id);const o=(0,c.A)(),r=(0,s.useRef)(null),{collapsed:l,setCollapsed:d}=(0,q.u)({initialState:!a.open}),[u,m]=(0,s.useState)(a.open),h=s.isValidElement(t)?t:(0,y.jsx)("summary",{children:t??"Details"});return(0,y.jsxs)("details",{...a,ref:r,open:u,"data-collapsed":l,className:(0,i.A)(O.details,o&&O.isBrowser,a.className),onMouseDown:e=>{F(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const t=e.target;F(t)&&Z(t,r.current)&&(e.preventDefault(),l?(d(!1),m(!0)):d(!0))},children:[h,(0,y.jsx)(q.N,{lazy:!1,collapsed:l,disableSSRStyle:!0,onCollapseTransitionEnd:e=>{d(e),m(!e)},children:(0,y.jsx)("div",{className:O.collapsibleContent,children:n})})]})}const Y={details:"details_b_Ee"},K="alert alert--info";function Q(e){let{...t}=e;return(0,y.jsx)(J,{...t,className:(0,i.A)(K,Y.details,t.className)})}function X(e){const t=s.Children.toArray(e.children),n=t.find((e=>s.isValidElement(e)&&"summary"===e.type)),a=(0,y.jsx)(y.Fragment,{children:t.filter((e=>e!==n))});return(0,y.jsx)(Q,{...e,summary:n,children:a})}var ee=n(1107);function te(e){return(0,y.jsx)(ee.A,{...e})}const ne={containsTaskList:"containsTaskList_mC6p"};function se(e){if(void 0!==e)return(0,i.A)(e,e?.includes("contains-task-list")&&ne.containsTaskList)}const ae={img:"img_ev3q"};var oe=n(7293),ce=n(418);const ie={Head:o.A,details:X,Details:X,code:function(e){return function(e){return void 0!==e.children&&s.Children.toArray(e.children).every((e=>"string"==typeof e&&!e.includes("\n")))}(e)?(0,y.jsx)(D,{...e}):(0,y.jsx)(W,{...e})},a:function(e){return(0,y.jsx)($.A,{...e})},pre:function(e){return(0,y.jsx)(y.Fragment,{children:e.children})},ul:function(e){return(0,y.jsx)("ul",{...e,className:se(e.className)})},li:function(e){return(0,G.A)().collectAnchor(e.id),(0,y.jsx)("li",{...e})},img:function(e){return(0,y.jsx)("img",{decoding:"async",loading:"lazy",...e,className:(t=e.className,(0,i.A)(t,ae.img))});var t},h1:e=>(0,y.jsx)(te,{as:"h1",...e}),h2:e=>(0,y.jsx)(te,{as:"h2",...e}),h3:e=>(0,y.jsx)(te,{as:"h3",...e}),h4:e=>(0,y.jsx)(te,{as:"h4",...e}),h5:e=>(0,y.jsx)(te,{as:"h5",...e}),h6:e=>(0,y.jsx)(te,{as:"h6",...e}),admonition:oe.A,mermaid:ce.A};function re(e){let{children:t}=e;return(0,y.jsx)(a.x,{components:ie,children:t})}},9022:(e,t,n)=>{"use strict";n.d(t,{A:()=>c});n(6540);var s=n(4164),a=n(8774),o=n(4848);function c(e){const{permalink:t,title:n,subLabel:c,isNext:i}=e;return(0,o.jsxs)(a.A,{className:(0,s.A)("pagination-nav__link",i?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[c&&(0,o.jsx)("div",{className:"pagination-nav__sublabel",children:c}),(0,o.jsx)("div",{className:"pagination-nav__label",children:n})]})}},8046:(e,t,n)=>{"use strict";n.d(t,{A:()=>d});n(6540);var s=n(4164),a=n(1312),o=n(8774);const c={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var i=n(4848);function r(e){let{permalink:t,label:n,count:a,description:r}=e;return(0,i.jsxs)(o.A,{href:t,title:r,className:(0,s.A)(c.tag,a?c.tagWithCount:c.tagRegular),children:[n,a&&(0,i.jsx)("span",{children:a})]})}const l={tags:"tags_jXut",tag:"tag_QGVx"};function d(e){let{tags:t}=e;return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)("b",{children:(0,i.jsx)(a.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,i.jsx)("ul",{className:(0,s.A)(l.tags,"padding--none","margin-left--sm"),children:t.map((e=>(0,i.jsx)("li",{className:l.tag,children:(0,i.jsx)(r,{...e})},e.permalink)))})]})}},6266:(e,t,n)=>{"use strict";n.d(t,{i:()=>a});var s=n(4586);function a(e){void 0===e&&(e={});const{i18n:{currentLocale:t}}=(0,s.A)(),n=function(){const{i18n:{currentLocale:e,localeConfigs:t}}=(0,s.A)();return t[e].calendar}();return new Intl.DateTimeFormat(t,{calendar:n,...e})}},8426:(e,t)=>{function n(e){let t,n=[];for(let s of e.split(",").map((e=>e.trim())))if(/^-?\d+$/.test(s))n.push(parseInt(s,10));else if(t=s.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[e,s,a,o]=t;if(s&&o){s=parseInt(s),o=parseInt(o);const e=s<o?1:-1;"-"!==a&&".."!==a&&"\u2025"!==a||(o+=e);for(let t=s;t!==o;t+=e)n.push(t)}}return n}t.default=n,e.exports=n},8453:(e,t,n)=>{"use strict";n.d(t,{R:()=>c,x:()=>i});var s=n(6540);const a={},o=s.createContext(a);function c(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:c(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/87292243.de647f30.js b/build/assets/js/87292243.de647f30.js new file mode 100644 index 0000000..894528a --- /dev/null +++ b/build/assets/js/87292243.de647f30.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[9800],{3802:(t,e,i)=>{i.r(e),i.d(e,{assets:()=>r,contentTitle:()=>n,default:()=>p,frontMatter:()=>c,metadata:()=>d,toc:()=>l});var s=i(4848),a=i(8453);const c={title:"Pika \u7684\u547d\u4ee4\u6267\u884c\u6846\u67b6",sidebar_position:2},n=void 0,d={id:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/Pika \u7684\u547d\u4ee4\u6267\u884c\u6846\u67b6/index",title:"Pika \u7684\u547d\u4ee4\u6267\u884c\u6846\u67b6",description:"\u4eca\u5929\u6211\u4eec\u4e00\u8d77\u6765\u770b\u4e0bpika\u6536\u5230\u4e00\u4e2a\u547d\u4ee4\u540e\uff0c\u662f\u600e\u4e48\u5904\u7406\u8fd9\u4e2a\u547d\u4ee4\u7684\u3002",source:"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/Pika \u7684\u547d\u4ee4\u6267\u884c\u6846\u67b6/index.md",sourceDirName:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/Pika \u7684\u547d\u4ee4\u6267\u884c\u6846\u67b6",slug:"/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/Pika \u7684\u547d\u4ee4\u6267\u884c\u6846\u67b6/",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/Pika \u7684\u547d\u4ee4\u6267\u884c\u6846\u67b6/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/Pika \u7684\u547d\u4ee4\u6267\u884c\u6846\u67b6/index.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Pika \u7684\u547d\u4ee4\u6267\u884c\u6846\u67b6",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Pubsub \u673a\u5236",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/PubSub \u673a\u5236/"},next:{title:"Pika \u548c RockSDB \u7684\u5bf9\u63a5",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/Pika \u548c RockSDB \u7684\u5bf9\u63a5/"}},r={},l=[];function o(t){const e={img:"img",p:"p",...(0,a.R)(),...t.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(e.p,{children:"\u4eca\u5929\u6211\u4eec\u4e00\u8d77\u6765\u770b\u4e0bpika\u6536\u5230\u4e00\u4e2a\u547d\u4ee4\u540e\uff0c\u662f\u600e\u4e48\u5904\u7406\u8fd9\u4e2a\u547d\u4ee4\u7684\u3002\nPika\u73b0\u5728\u652f\u6301\u4e86\u4e24\u79cd\u6a21\u5f0f\uff1a\u4e00\u79cd\u662fclassic\uff0c\u4e00\u79cd\u662fsharding\u3002\u5982\u679c\u662f\u4f7f\u7528classic\u6a21\u5f0f\uff0c\u5219pika\u652f\u6301\u591adb\uff0c\u53ef\u4ee5\u4f7f\u7528databases\u6765\u914d\u7f6edb\u7684\u4e2a\u6570\uff1b\u5982\u679c\u662f\u4f7f\u7528sharding\u6a21\u5f0f\uff0c\u5219\u4f7f\u7528default-slot-num\u6765\u914d\u7f6e\u8be5shard\u8d1f\u8d23\u5904\u7406\u7684slot\u7684\u6570\u91cf\u3002"}),"\n",(0,s.jsx)(e.p,{children:(0,s.jsx)(e.img,{alt:"alt text",src:i(8324).A+"",width:"554",height:"154"})}),"\n",(0,s.jsx)(e.p,{children:"1.db\uff0ctable\uff0cpartition\u7684\u5173\u7cfb"}),"\n",(0,s.jsx)(e.p,{children:"PikaServer\u542f\u52a8\u7684\u65f6\u5019\uff0c\u4f1a\u5148\u521d\u59cb\u5316\u8868\u7ed3\u6784\uff0c\u521d\u59cb\u7684\u8868\u7ed3\u6784\u662f\u7531\u914d\u7f6e\u6587\u4ef6\u51b3\u5b9a\u7684"}),"\n",(0,s.jsx)(e.p,{children:(0,s.jsx)(e.img,{alt:"alt text",src:i(5994).A+"",width:"554",height:"140"})}),"\n",(0,s.jsx)(e.p,{children:"\u52a0\u8f7d\u914d\u7f6e\u6587\u4ef6\u7684\u5165\u53e3\u662fPikaConf::Load\uff0c\u6839\u636e\u914d\u7f6e\u6587\u4ef6\uff0c\u5982\u679c\u914d\u7f6e\u7684\u662fclassic\u6a21\u5f0f\uff0c\u5219\u7528databases\u6765\u521d\u59cb\u5316table_struct\uff0c\u6709\u591a\u5c11\u4e2adb\uff0c\u5219\u6709\u521d\u59cb\u5316\u591a\u5c11\u4e2atable\uff1b\u5982\u679c\u914d\u7f6e\u7684\u662fsharding\u6a21\u5f0f\uff0c\u5219\u83b7\u53d6solt\u7684\u6570\u91cf\uff0c\u521d\u59cb\u5316db0\u3002\u53ef\u4ee5\u770b\u5230\uff0c\u5982\u679c\u662fclassic\u6a21\u5f0f\uff0c\u5219\u4e00\u4e2adb\u5bf9\u5e94\u4e00\u4e2atable\uff0c\u5e76\u4e14\u8fd9\u4e2atable\u53ea\u6709\u4e00\u4e2a\u5206\u533apartition\uff0c\u5982\u679c\u662fsharding\u6a21\u5f0f\uff0c\u5219\u9ed8\u8ba4\u53ea\u6709\u4e00\u4e2adb\uff0c\u5373db0\uff0c\u4e00\u4e2aslot\u5bf9\u5e94\u4e00\u4e2apartition\u3002"}),"\n",(0,s.jsx)(e.p,{children:(0,s.jsx)(e.img,{alt:"alt text",src:i(4305).A+"",width:"554",height:"302"})}),"\n",(0,s.jsx)(e.p,{children:"\u9ed8\u8ba4\u4f7f\u7528\u7684\u8868\u662f\u7b2c\u4e00\u4e2a\u8868\uff0c\u53ef\u4ee5\u4f7f\u7528select dbid\u6765\u9009\u62e9\u662f\u54ea\u4e2a\u8868\uff0cSelectCmd\u4f1a\u4fee\u6539\u4f7f\u7528\u7684\u8868\u3002"}),"\n",(0,s.jsx)(e.p,{children:(0,s.jsx)(e.img,{alt:"alt text",src:i(4360).A+"",width:"458",height:"161"})}),"\n",(0,s.jsx)(e.p,{children:"PikaServer::InitTableStruct\u4e2d\uff0c\u4f1a\u6839\u636e\u751f\u6210\u8868\u7ed3\u6784\u4fe1\u606f\u6765\u751f\u6210table\uff0c\u5e76\u4e14\u7ed9\u8fd9\u4e2atable\u521b\u5efa\u5206\u533a\u3002"}),"\n",(0,s.jsx)(e.p,{children:(0,s.jsx)(e.img,{alt:"alt text",src:i(5879).A+"",width:"554",height:"176"})}),"\n",(0,s.jsx)(e.p,{children:"\u5728Table::AddPartitions\u4e2d\uff0c\u4e3a\u6bcf\u4e2a\u5206\u533a\u521b\u5efa\u4e86\u4e00\u4e2aPartition\uff0c\u4e00\u4e2aPartition\u5bf9\u5e94\u7740\u4e00\u4e2aBlackwidow\uff0cBlackwidow\u4e00\u4e2a\u57fa\u4e8erocksdb\u7684\u5c01\u88c5\u7684\u5b58\u50a8\u5f15\u64ce\uff0c\u6211\u4eec\u5148\u76f4\u63a5\u8ba4\u4e3a\u4ed6\u5c31\u662frocksdb\uff0c\u521b\u5efaPartition\u4f1a\u6253\u5f00rocksdb\uff0c\u7ed9\u540e\u7eed\u7684\u64cd\u4f5c\u4f7f\u7528\u3002"}),"\n",(0,s.jsx)(e.p,{children:(0,s.jsx)(e.img,{alt:"alt text",src:i(8190).A+"",width:"554",height:"344"})}),"\n",(0,s.jsx)(e.p,{children:"2.\u547d\u4ee4\u7684\u6267\u884c\u6d41\u7a0b\n\u5728\u4e86\u89e3\u547d\u4ee4\u7684\u6267\u884c\u6d41\u7a0b\u4e4b\u524d\u8fd8\u9700\u8981\u4e86\u89e3\u4e0b\u547d\u4ee4\u8868CmdTable\u7684\u521d\u59cb\u5316\u3002Main\u51fd\u6570\u91cc\u9762\u542f\u52a8pikaServer\u4e4b\u524d\u4f1a\u5148\u8fdb\u884cCmdTable\u7684\u521d\u59cb\u5316"}),"\n",(0,s.jsx)(e.p,{children:(0,s.jsx)(e.img,{alt:"alt text",src:i(3941).A+"",width:"468",height:"127"})}),"\n",(0,s.jsx)(e.p,{children:"\u5165\u53e3\u662fInitCmdTable\uff0c\u6211\u4eec\u53ef\u4ee5\u770b\u4e00\u4e0b\u8fd9\u4e2a\u51fd\u6570\uff1a"}),"\n",(0,s.jsx)(e.p,{children:(0,s.jsx)(e.img,{alt:"alt text",src:i(1052).A+"",width:"554",height:"354"})}),"\n",(0,s.jsx)(e.p,{children:"\u8fd9\u4e2a\u51fd\u6570\u521b\u5efa\u4e86\u5404\u79cd\u547d\u4ee4\u5bf9\u8c61\uff0c\u7136\u540e\u5f80CmdTable\u91cc\u9762insert\uff0cCmdTable\u662f\u4e00\u4e2amap\uff0ckey\u662f\u547d\u4ee4\u7684\u5b57\u7b26\u4e32\uff0cvalue\u5c31\u662f\u5177\u4f53\u7684Cmd\u5bf9\u8c61\u3002\u6240\u6709\u7684Cmd\u5bf9\u8c61\u90fd\u7ee7\u627f\u4e86\u57fa\u7c7bCmd\uff0c\u771f\u6b63\u6267\u884c\u547d\u4ee4\u7684\u662f\u5404\u4e2aCmd\u7684do\u65b9\u6cd5\u3002\u4e0b\u9762\u6211\u4eec\u4ee5set\u547d\u4ee4\u4e3a\u4f8b\u6765\u8bf4\u660e\u8fd9\u4e9b\u547d\u4ee4\u662f\u600e\u4e48\u6267\u884c\u7684\uff0c\u5728\u300aPika\u6e90\u7801\u5b66\u4e60--pika\u7684\u901a\u4fe1\u548c\u7ebf\u7a0b\u6a21\u578b\u300b\u4e2d\u6211\u4eec\u5df2\u7ecf\u77e5\u9053\u4e86\u8bf7\u6c42\u662f\u600e\u4e48\u8d70\u7684\uff0c\u5e76\u4e14\u77e5\u9053\u6700\u540e\u662f\u7528\u4e86PikaClientConn::DoCmd\u8fd9\u4e2a\u51fd\u6570\u6765\u6267\u884c\u547d\u4ee4\uff0c\u4eca\u5929\u6211\u4eec\u5177\u4f53\u770b\u770b\u8fd9\u4e2aDoCmd\u91cc\u9762\u505a\u4e86\u5565\u3002"}),"\n",(0,s.jsx)(e.p,{children:(0,s.jsx)(e.img,{alt:"alt text",src:i(7291).A+"",width:"554",height:"178"})}),"\n",(0,s.jsx)(e.p,{children:"\u524d\u9762\u89e3\u6790\u8bf7\u6c42\u7684\u65f6\u5019\u5df2\u7ecf\u77e5\u9053\u4e86\u9700\u8981\u6267\u884c\u7684\u662f\u54ea\u4e2a\u547d\u4ee4\uff0c\u8fd9\u91cc\u5148\u6839\u636e\u547d\u4ee4\u7684\u540d\u79f0\u5728CmdTable\u91cc\u9762\u627e\u5230\u5177\u4f53\u5904\u7406\u547d\u4ee4\u7684\u5bf9\u8c61\uff0c\u6bd4\u5982Set\u547d\u4ee4\uff0c\u5c31\u4f1a\u627e\u5230SetCmd\u5bf9\u8c61\u3002\u627e\u5230\u547d\u4ee4\u540e\uff0c\u4f1a\u5148\u6267\u884ccmd\u7684\u521d\u59cb\u5316\uff0c\u505a\u4e00\u4e9b\u6821\u9a8c\u7b49\u5de5\u4f5c\uff0c\u8fd9\u91cccurrent_table_\u9ed8\u8ba4\u662f\u4f7f\u7528\u9ed8\u8ba4\u8868"}),"\n",(0,s.jsx)(e.p,{children:(0,s.jsx)(e.img,{alt:"alt text",src:i(1938).A+"",width:"330",height:"85"})}),"\n",(0,s.jsx)(e.p,{children:"\u7136\u540e\u8c03\u7528Cmd::Execute\uff0c\u8fd9\u91cc\u6839\u636e\u4e0d\u540c\u7684\u547d\u4ee4\u4f1a\u8d70\u4e0d\u540c\u7684\u5206\u652f\uff0c\u662f\u548c\u547d\u4ee4\u7684\u7c7b\u578b\u6216\u8005\u5c5e\u6027\u6709\u5173\u7684\uff0c\u547d\u4ee4\u5c5e\u6027\u5728\u521d\u59cb\u5316CmdTable\u7684\u65f6\u5019\u4f1a\u521d\u59cb\u5316"}),"\n",(0,s.jsx)(e.p,{children:(0,s.jsx)(e.img,{alt:"alt text",src:i(5504).A+"",width:"554",height:"228"})}),"\n",(0,s.jsx)(e.p,{children:"\u6211\u4eec\u4ee5ProcessSinglePartitionCmd\u4e3a\u4f8b\uff0c\u5904\u7406\u547d\u4ee4\u7684\u65f6\u5019\u9700\u8981\u5148\u627e\u5230Partition\uff0c\u5982\u679c\u662fclassic\u6a21\u5f0f\uff0c\u4e00\u4e2atable\u53ea\u6709\u4e00\u4e2a\u5206\u533a\uff0c\u5982\u679c\u662fsharding\u6a21\u5f0f\uff0c\u5219\u6839\u636e\u547d\u4ee4\u7684key\u6765\u51b3\u5b9a"}),"\n",(0,s.jsx)(e.p,{children:(0,s.jsx)(e.img,{alt:"alt text",src:i(6681).A+"",width:"554",height:"361"})}),"\n",(0,s.jsx)(e.p,{children:"\u9700\u8981\u5177\u4f53\u7684\u547d\u4ee4\u5b9e\u73b0\u81ea\u5df1\u7684current_key\u65b9\u6cd5"}),"\n",(0,s.jsx)(e.p,{children:(0,s.jsx)(e.img,{alt:"alt text",src:i(1538).A+"",width:"470",height:"201"})}),"\n",(0,s.jsx)(e.p,{children:"Get partiton\u4f1a\u6839\u636ekey\u6216\u8005table_name\uff0c\u4f7f\u7528\u5177\u4f53\u7684\u6570\u636e\u5206\u5e03\u7b97\u6cd5\u5f97\u5230\u5904\u7406\u7684\u5206\u533a"}),"\n",(0,s.jsx)(e.p,{children:(0,s.jsx)(e.img,{alt:"alt text",src:i(539).A+"",width:"554",height:"179"})}),"\n",(0,s.jsx)(e.p,{children:"\u627e\u5230\u5206\u533a\u540e\uff0c\u5c31\u4f1a\u8c03\u7528\u5177\u4f53\u547d\u4ee4\u5bf9\u8c61\u7684do\u65b9\u6cd5\u6765\u5904\u7406\u3002partiton\u91cc\u9762\u7684db\uff0c\u5c31\u662f\u524d\u9762\u8bf4\u5230\u7684Blackwidow\uff08rocksdb\uff09\u5b58\u50a8\u5f15\u64ce\u3002"}),"\n",(0,s.jsx)(e.p,{children:(0,s.jsx)(e.img,{alt:"alt text",src:i(596).A+"",width:"554",height:"293"})}),"\n",(0,s.jsx)(e.p,{children:"\u7b80\u5355\u603b\u7ed3\u4e00\u4e0b\uff0c\u6267\u884c\u4e00\u4e2a\u547d\u4ee4\u7684\u65f6\u5019\uff0c\u5148\u9700\u8981\u77e5\u9053\u662f\u54ea\u4e2atable\u7684\uff0c\u7136\u540e\u6839\u636e\u547d\u4ee4\u540d\u79f0\u5728CmdTable\u91cc\u9762\u83b7\u53d6\u5904\u7406\u547d\u4ee4\u7684\u5bf9\u8c61\uff0c\u7136\u540e\u627e\u5230\u5904\u7406\u5177\u4f53\u8fd9\u4e2a\u547d\u4ee4\u7684partiton\uff0c\u7136\u540e\u4f7f\u7528Blackwidow\u5f15\u64ce\u6765\u5904\u7406\u547d\u4ee4\u3002"})]})}function p(t={}){const{wrapper:e}={...(0,a.R)(),...t.components};return e?(0,s.jsx)(e,{...t,children:(0,s.jsx)(o,{...t})}):o(t)}},5994:(t,e,i)=>{i.d(e,{A:()=>s});const s=i.p+"assets/images/image-1-401838f772cab32f3d42f1129e1e5731.png"},5504:(t,e,i)=>{i.d(e,{A:()=>s});const s=i.p+"assets/images/image-10-b0202d2aaa9438e0688d28a370e671a6.png"},6681:(t,e,i)=>{i.d(e,{A:()=>s});const s=i.p+"assets/images/image-11-9ff17da57274e9175f8833c28897dc02.png"},1538:(t,e,i)=>{i.d(e,{A:()=>s});const s=i.p+"assets/images/image-12-007503ecaf74ac5cc8c9551a58044eb0.png"},539:(t,e,i)=>{i.d(e,{A:()=>s});const s=i.p+"assets/images/image-13-25cbe0398ddd91047389c2c697ec3cc6.png"},596:(t,e,i)=>{i.d(e,{A:()=>s});const s=i.p+"assets/images/image-14-1d4ae649d228c006018b9ca0ee7a3fa9.png"},4305:(t,e,i)=>{i.d(e,{A:()=>s});const s=i.p+"assets/images/image-2-1625989a3f7b2d85f2b61d387b1ce2f5.png"},4360:(t,e,i)=>{i.d(e,{A:()=>s});const s=i.p+"assets/images/image-3-8713a5b7ac89275609bc66c2d93a911a.png"},5879:(t,e,i)=>{i.d(e,{A:()=>s});const s=i.p+"assets/images/image-4-71f5629b0151c58ff0f44314121cd573.png"},8190:(t,e,i)=>{i.d(e,{A:()=>s});const s=i.p+"assets/images/image-5-21008cb96b438b35658d409705589b9f.png"},3941:(t,e,i)=>{i.d(e,{A:()=>s});const s=i.p+"assets/images/image-6-9e0ae2006a8f90b434122000ce0b857a.png"},1052:(t,e,i)=>{i.d(e,{A:()=>s});const s=i.p+"assets/images/image-7-4c0b8f1c475d8593cc940c8e3b683fb4.png"},7291:(t,e,i)=>{i.d(e,{A:()=>s});const s=i.p+"assets/images/image-8-2adcd43c46ada55771e85607412475e8.png"},1938:(t,e,i)=>{i.d(e,{A:()=>s});const s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUoAAABVCAYAAAAv3q3/AAAABHNCSVQICAgIfAhkiAAAEolJREFUeF7tnTuSo8oShn91tNVyDxMxltq9gNk+WsSUZg/aBLCI0R4GziLAHpmCcVvOmYiuYx61y40sQALES+9XfhGK6BYqKB5KZVVm/jVIko8kDpcYvr1hNETGCsv5HKuRBV3L36vnz58/+Pr1a/1GhmGYO+AJ0KBpK6w+C2cjl3jHK0YdRpJhGOYReAIkpBxi+JKf7grLpYQ2GmHtYBZZLTEP51iuHuHyMAzDAE9hGAN6YdjN3iTDMEyJQZIkySHXhOcoGYa5d57u/QQZhmEOhQ0lwzBMB2woGYZhOmBDuQtRiNnAhe/v0gjYux3DMFfBcxiGwPAVb29ZOpCMEcZy3bnh6xveNpnoF0O6M/gQmNrbyZ1t28pIhOYMQVR4VwjYnn7gecXwBxGMRODQPaUU+6lDHG2/DMPsQyXqLRGHEpqlIzVH1f+3OU/Uu80QtW1rYp82bRx7fzmn2i/DMLvwXP7wC4ZDieVyBY28SCkhh0OMih+ihPO5hFYqeTwt0g0gnXpvrW3bbqRG6YsjETipR60508yDbfbw4slmKB4P3PSQay+1uR1RbEvonk1NGYa5MtTQezO8HmL0ZuElDkEjcmg6rLftoe55kYh9wPhZ14+2bfsQI4gE7ERP5xW/x5C2RUWesBY2rMyYFiHjZjd6fs3tiLRtBs1/mj5iHmYzzNXxbFk64vA3ln9RdU4qhvH+osOyNEgymPPC/CUxHOHNKvmYp8UPEOhj2EbNYdq27YUOkc9XGhq0KAL5lnUm+ij4PtxJXNjVcWY4GYY5Ls+pKEYMqUQx/oVcadAzL1LT3/A6n2MpR50qQqdBInQlxj/rDEjbtlsghj+RGJOnqn4E0qE/wzDXR40oxic+14IXn1itioIZwFlFMaIYEQzodd5k27aLICGL0fQdiSc+ir4lwzDXwzOJYmi6lWlRjvC/V4n5PMR71sfNtvMTuwE0264d+rZta6acHqSCL73Sg8jb2xgy1c4YY7qg+UtCx9gJMDNdBPTvep9t7XQYwoeftdGcMXT/I+t6WzuGYc7N9YpiUHDjOyDWxqhA2zaGYZgjc72GkmEY5krgEkaGYZgOKgnnDHOPDO7xpG6Qg6RvLwp7lNdM5MIcDDDZWYRjz3adpMGw8IDoPvPolAOVt8ITVeaE8yXWGUFqTRyqzKHXPa6NE2Pi+tjV9uxHBNccYDAovHa2enX4mAwmRzyHYj+b9xtPZoiEyPI+mVMxGQBmVg27Czu3iwBzgMYfYtcEBoP0dZTHVkFFHYBvhqqY41Z4siwLVq4cRCWB8xVG9J56X4P8XTCiTC2+P4BZ62YZsBcJksSDgICXJEi8HYq5DRuLJMEuTRQ7tyv2swGfflzq1ZuY+8ReAMkCqEtjPgghIPQAwXm8laNQHnqTCIZGlc0Zw7+gQeLf4oqLZ16F0fddDNzs5fdJyU49RjecrduZYfrble6LvvD0me19+v4MbhzCzLfNQvrR7USIBURkYrCTUGXqFbquufY4TTc/WrOH50/IOyWvj9pnnur65765HZG23Xi3u3gJsR9DF9UKKQl3Vrg/rru+1vSjS9vMMNxc66InH/ub+5pdb7pPkbpvM7hrdyO9V/k9PISihzSYZHuqelV+6kHlt4LakHdH3lruXeXf77ZtRLHN2kPMjue6m/3lffEn6Xu0/8jJtpvofAa72pXOu85bjVPPUp1ffl16UHt+PaFnKXZrvEql+Tq7vumdIAiSX+//0RpjSfLfe/IriJKP9L8k+YiSIPiV5Js3n9m8988//+SfPjqe5yTwoh33GyXCKbaj/38kzvqk6H8v8Wr2qo73I0gW2Tb6X+xw+EVgJHBEzb69RKD6Pr2HBCLrycJJDMNZHzulrh3R9H5O1/YkUcer7VO1n0SUePCSzksReQnW1/YjcX44CdbXPr0vRkA3Iv07v7aL4Efhuhc/Rx+lfRbv3z4oRz6BgUQ5+MXXAokBJMLL3vdUxCFxFun/jlH+n+6Z4XRvK36udIzseHQMLx1slI5HfSu1rfa35f9e7bLzU8eu9qV6LQqfWV+f7PiN59fSvzINz9QiSH7gRxLkX8IroSKKQZU5czVHqdBe8TpUReAbziaKEcOPNTjTqhfTBx3e2vvRYGgSUU91CzG21kMNIWzkA+UoNGGuFX8FPJuG02UMa4FEm2DgmnCmC9RoDFcQ8PJxtaFDj9Lqn6MPdXL8CcpzpNUz2APyDEuevgal+5wPS0jQRP2tw7Pt7ABts1M66NZNPtKd+BEtpyx6XMt2yNk3nD2HkQJrURavGrit2+Yj9TrJK3Q2/So+yTRPd4Sr3w/ykiueYlwYKq37YtBdAuKugVuP8+tHVvZbfOANC9PE6tf8jJRFMYYkDvSGjTgQCfe+QBuesUcltCOJcZCxPOwclBHsuH+pMSWDsDjfl6A3PiaTGM4iyb70NHQ/cJJIhjD9WP2gKNElZTTbjGBOZgxpWkW9RT+IhR8oQwf8SBkbssFia8h/GziLjYFd02cu55jQUH8CZQzVb3KN0dyX2vPbCQ3aybyC41IjipFDkmsxPl9H5Vrrs81R0pcphpvNL+5NHMCRVYMrU6/niKiAzoeNpMbTPA1xySvYFX/SHN3eRsMXI0ZUtavyo/C9l3CDLlckQ4Zw1WiBrhe9pmWPUR/D0WL4oUScGdUSJE+349pFhpHO+1VPoepF0dzhwYjUW3T23Jfq6x4GtbZdXJ7jbDu/yE09YfGt4woceH6KSEIaX7Z1HLJ1qWabSeqr4IlEMaCTFiX1h4zjJjVoNbIuul6OEAJ6sAnK9AvmEMVgDeDZFHPO0WGPAScPQvQKELVDRtL9skCyJU+eB1cKwZdeEZQ8UFNoZ7oFoyRgO4CTpx6t99nWTkCIaN3GNZzCNWlrR2iw7JrJd2XQkAXJZoiMcb9pA02H0OTmHqhgTjGAo+GbocEPAmA83vbO9fQLJgtrO3VBEVx6BtYBiEKQhK5lHjyJxJ7D8woeRYuzwFA1CNSFmqHI2/YI5uTUthOAY1AgLw0O1Z1fvs10Us8z135V1yo7fv6ZPMh1yPkRqahNLipTgHRgKRSo5squiEPnSk8ZzNmP5mANcxiRcJIfm6jY3qjgTSmgVgngdEKBACfx6iJytVQCOPx/OaB1tuuR4XmJYwSboHGJjyQwjvOcHZMbLGFsSRjXhQoZMqdB96aQpo/w2/SgpHPDGkMEvkobWkP3zuqeSKYVN2eOTNczeqB7Td7d1rQBQeFn7zT3ex+6+0mC1YBIarzJTPF/s1bV9cDqQcwDwLXe10E1ZeB2uEGPkmF25Xa/oMx18NiiGGrlw5rqAOYBYcEPppnrN5RRCHPgwjx6ukAM36SlJmrmSpg9qTM2l1KL2bUvFNnXENCSwXuePXO/3Lh6UIzJwMUge/XKvMmgxbykM6X6/G0kGeZd8gwPoSU4dWPUqwsdWy2GUq7MdZpKE3v1RQhMHQm/tIRwf+KJq/I7ry0HkDmcJ0vXgJcXKspRQgbx/B0vekE9aB63FpydHMPCIrGxqKkH9CckDaHDS2wkid1fZScKEfg6xjX7VGj6Ta+w3axmdELa1IXOrRZzQF80mxZ5C3YXZaBnKh5jmtiYNj1XzM3ytFx+4nWUpWWQetDwFfm/q38lVlSPWcz9PFtljoRr9vAWjS87GzX5dwQpjJ3bEbeuZuRPTLh+KuyrdDJLiewFRaKqYHAmBpxra26UjlLq1YU2NKrFNFE5XtNoIVLqS2UP87C+0OqYEtHfV5bwzFyUp/eXUVaVA6w+P9fepYxDzKWG1+7UthOhwV7YSBY11R6+r4bb6ssTBWoOc2D2k0RTXrMvoe1R/E1GcgKRld3ZSHrXIMdwPsZZO6o28pWMGNVIJ6pqKBWMUOV8pX1KOAHwU5X52fC0AG6vCTQD9jTB4gtVvFSnECJVWvczyzL2dAeuStCjIa0Psc4+9oB1mWME97sPUZDeWeTlGwoqbyQD0/Io0A9T9NFzdOJjQn3Jj7dwEJOBr5T1kZE0fYFFslhXkxyjL/RsSH/HkVT8AakXJAqZu+JJ08qWcDiEKmNcDt+UoO9L9XSVelBe8rg/f/782Xr1RojNUNsYq6F5stiIKvRBoymHncjUjMZHVDPqQVXNSIlPkFkLTQzcQfaqGsMUJeQhgIlrFvQdAWHbG4UkLxMGjv6GHxU9StpnXk9u4BuVwpmDLU9yNzK1mC5o6CzsjfEzbNgiAgkJpaSlmMpILjbnshvNfdnt2aCgkQvXN2DnN4e5O57yYTYxfHnB6j0u1HivQE7mqfj69WvpdU7a64TrZdSo5nln+1rLkdSM7ATpa1vyjVDGVNW695F8I2V0Rymqb+rbNp6aYacCjT/xPR1+N42FWzmWWowBxxFKOaKXg11Lc1/Us9HbO9RgLVJD7u4ZBGKun6eSgppSNx9imLuRcol3bOYsFWebozwVGnShtRfdq6h32QtTa33cs5qR0sPMh+HNKIO5cGDEcUGko0FdqEiTWkxM+p0DlGyMbsDw3c1QO0o9NlJfW/PNU6V722sHHdCXDBJk2HlqhoQ6YtlzaoG5NSp5lBp0WicnVxBSwkKjLCJ+brLUHzNQX0h/kgZ29nJkKmjfDGj+7t7I7asZtSHgqbnAwkJo60BPOcgzoPnDn8Uhb4O6UIFGtZg6aM0fT9+oI6n5yuI8ZAbJbitjWVyp8tC+0HyrBuPbrlMzzF1zqMLGvupB+7Y7FsdSwunmcdSMGq9pq1rMadi3Lx+07MQu63/kqCUMeiyXwdwkD1vrrXsC0WAGX7frk85705Iw/mBqRvXqQi1qMSdkr774PmaOBpHsEbAzLIyFC3/gXqX6DXMYF1MPoqg3BXMuCtV6fwfEgssYGYpe+8DPwyTkmPvksQ0lwzBMD65fFINhGObCsKFkGIbpYFs9qLDA2A5rN90JaUrS8SXdroWWwBPDMI1U1INoFcbfwP/e8HqxtbwZhmGui8H7r18JGcZ0udocMphzVcq4VbJHlTlzCe0tbbNv9Hrfdt2Q6tAMvhhDd4JsQSaSYsuXrCWvkeTZUgxnqiTcKKF9K5md6siphpzEg80AupdJuZEox0TCWUxhGy3HU+0iCEeD42TFdlSn3rMmWIlw5DV6KtWoK22FPMYIxpjENFL1G2M8xcLSyvvKKezT92eIDQO+nyb4QxtjMS3Uzys1+AjGgqPCzONRUg+6JyKHvtSkU0kGMoarFNJTIxk7UyWqQcpEcGbKQAov/yyVPOfb+wtt1B+PkHAcpJqZZCD9YEsFp47bUSpimPvnuaoe1IlSDxp1fuziiHGmPpMK+yr8zMN0Zhg4mx52+Wm9qDteJgsmvNyb7UumVDTdp2c6vLXnSeIbksqsSc+jk6pSUUk1zbAwTazOfTDMPfJcVA96DLRsyHztZ3s9SkUM8+iU1YP6cMvqQcKAoKFwo/qtBsMg9a6KurWhKa8zVmkAEm5j+2NxhUpFNEfJ68EwD0ql1jsN4ryvsqsRhwjJs7H0PiO3G0CHtxjDNEkhPe9uMdCjwbZ1OJNsex7MgQ7b0WBmQ3bhjGFEFbntI0NKRb47wyDIdtwrmENQQMfNG8FTCuqbc7XHAcyZCzXz0HufNHGbqnfHfcfxDHNHcAnjXZFGvUXJOB6LdPnXSEx58Szm4XhY9aDbpCVh/JRKRb6v1Ls1h40k85iwR8kwDNMB13ozDMN0wIaSYRimg21RDJX+EyKk13yJPAB+CaQ7gztweXU7hmEuyrYoxu8VRpYFy7Kgv7zj9/JyplKzp7CTKcZxgPC02TgMwzCNPC2Xn3hdl+cMMXrb5Ey+DIdYrSoLe5894VyDtk8lH8MwzJFoFcX4XK2wcy34SZD42H+le4ZhmIN4ajKEq+Uc8ecrtmrBlShGVZbttJC8meG7cM2QF5hnGObs1IpikJGcSw1vbyNcg35vPHERCRt2Sc6GYRjmPGyJYnQaybPPURIavvA8JcMwF6JSwiixVIoYK8zD96xL9ySKwTAMszsVQ0lGsUOc9YjCvbQcRM7Xr18bei8hOZDDMMwFuZgoRrNh3EAJ5zNHgtaZsa9eaJdhmHvlYqIYDMMwtwLXejMMw3TAhpJhGKaDZxK/wPA1y5msLAWBIV6z9bsZhmEelWdL1xDKlyyxnGq9LawXo5UxwqXESO+x1inDMMydUhHFKLP6/MRw+FJ5k2TY5rigqBDDMMxZeX5/GcEq1SlKxGGc1lSrIfk1FDEyDMNcjkH0kSSNI2s19B621nxT0nifnEiGYZhb5WlLHaiIpkFbSfx7Oe1ehmGYi7MlilFCSsihhr+Ko2+eo2QY5sHYEsVYz08S67QhhmGYx4VLGBmGYTr4P5QptWx/ijS8AAAAAElFTkSuQmCC"},8324:(t,e,i)=>{i.d(e,{A:()=>s});const s=i.p+"assets/images/image-6b13d65ff73adb4a7c55002725a8aecf.png"},8453:(t,e,i)=>{i.d(e,{R:()=>n,x:()=>d});var s=i(6540);const a={},c=s.createContext(a);function n(t){const e=s.useContext(c);return s.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function d(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(a):t.components||a:n(t.components),s.createElement(c.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/878f190b.3d1a7843.js b/build/assets/js/878f190b.3d1a7843.js new file mode 100644 index 0000000..0c3f52d --- /dev/null +++ b/build/assets/js/878f190b.3d1a7843.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[154],{4076:(n,i,t)=>{t.r(i),t.d(i,{assets:()=>h,contentTitle:()=>l,default:()=>c,frontMatter:()=>p,metadata:()=>s,toc:()=>a});var o=t(4848),e=t(8453);const p={title:"What's new in PikiwiDB(Pika) v4.0.0",slug:"PikiwiDB-Pika--4.0.0",authors:[{name:"360 \u8f66\u91d1\u9e3d",title:"Pika \u5f00\u6e90\u793e\u533a"}],hide_table_of_contents:!1},l=void 0,s={permalink:"/blog/PikiwiDB-Pika--4.0.0",source:"@site/blog/2024-07-08-PikiwiDB(Pika)-4.0.0.md",title:"What's new in PikiwiDB(Pika) v4.0.0",description:"\u5c0a\u656c\u7684\u793e\u533a\u6210\u5458\u53ca\u6280\u672f\u7231\u597d\u8005\u4eec\uff1a",date:"2024-07-08T00:00:00.000Z",tags:[],readingTime:17.085,hasTruncateMarker:!1,authors:[{name:"360 \u8f66\u91d1\u9e3d",title:"Pika \u5f00\u6e90\u793e\u533a"}],frontMatter:{title:"What's new in PikiwiDB(Pika) v4.0.0",slug:"PikiwiDB-Pika--4.0.0",authors:[{name:"360 \u8f66\u91d1\u9e3d",title:"Pika \u5f00\u6e90\u793e\u533a"}],hide_table_of_contents:!1},unlisted:!1,nextItem:{title:"What's new in Pika v3.5.4",permalink:"/blog/Pika-3.5.4"}},h={authorsImageUrls:[void 0]},a=[{value:"1 \u91cd\u5927\u6539\u8fdb",id:"1-\u91cd\u5927\u6539\u8fdb",level:2}];function u(n){const i={a:"a",br:"br",h2:"h2",img:"img",li:"li",p:"p",ul:"ul",...(0,e.R)(),...n.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.p,{children:"\u5c0a\u656c\u7684\u793e\u533a\u6210\u5458\u53ca\u6280\u672f\u7231\u597d\u8005\u4eec\uff1a\nPikiwiDB \u793e\u533a\u8363\u8000\u5730\u5ba3\u544a\u2014\u2014\u7ecf\u8fc7 9 \u4e2a\u6708\u6253\u78e8\u5e76\u5728\u751f\u4ea7\u73af\u5883\u7a33\u5b9a\u8fd0\u884c 5 \u4e2a\u6708\u7684 PikiwiDB(Pika) v4.0.0 \u3010\u4e0b\u6587\u7b80\u79f0 Pika\u3011\u4eca\u5929\u6b63\u5f0f\u53d1\u5e03\u3002\u5e0c\u671b\u57fa\u4e8e\u7b2c\u4e09\u4ee3\u5b58\u50a8\u5f15\u64ce Floyd \u7684\u8fd9\u4e2a\u65b0\u7248\u672c\u80fd\u4e3a\u793e\u533a\u7528\u6237\u4eec\u5e26\u6765\u66f4\u5353\u8d8a\u7684\u4f53\u9a8c\u3002"}),"\n",(0,o.jsx)(i.h2,{id:"1-\u91cd\u5927\u6539\u8fdb",children:"1 \u91cd\u5927\u6539\u8fdb"}),"\n",(0,o.jsx)(i.p,{children:"1.1 \u7b2c\u4e09\u4ee3\u5b58\u50a8\u5f15\u64ce Floyd\nFloyd \u5982\u540c\u5176\u524d\u4ee3 Blackwidow\uff0c\u57fa\u4e8e RocksDB\uff0c\u4e0d\u4ec5\u652f\u6301\u57fa\u7840\u7684 String \u7ed3\u6784\uff0c\u4e5f\u539f\u751f\u652f\u6301\u4e86 Hash\u3001List\u3001Set\u3001Stream\u53ca ZSet \u7b49 KKV \u5f62\u5f0f\u7684\u590d\u5408\u6570\u636e\u7ed3\u6784\u3002"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsx)(i.li,{children:"RocksDB \u5b9e\u4f8b\u6570\u53ef\u914d\u7f6e"}),"\n"]}),"\n",(0,o.jsx)(i.p,{children:"\u6452\u5f03\u4e86 Blackwidow \u6309\u6570\u636e\u7c7b\u578b\u91c7\u7528 RocksDB \u5b9e\u4f8b\u7684\u7269\u7406\u9694\u79bb\u6a21\u5f0f\uff0cFloyd \u91c7\u7528\u4e86 RocksDB \u7684 Column-Family \u865a\u62df\u9694\u79bb\u673a\u5236\uff0c\u5728\u5355\u4e2a RocksDB \u5b9e\u4f8b\u4e0b\u53ef\u5b58\u50a8\u6240\u6709\u7c7b\u578b\u7684\u6570\u636e\u3002\u7528\u6237\u53ef\u81ea\u7531\u8bbe\u5b9a Pika \u5b9e\u4f8b\u4e2d\u6bcf\u4e2a DB\u3010\u7b49\u540c\u4e8eRedis DB\u3011\u4e2d RocksDB \u5b9e\u4f8b\u7684\u6570\u91cf\uff0c\u800c\u6570\u636e\u7684\u5b58\u50a8\u5219\u4f9d\u636e key \u7684 hash \u503c\u5206\u914d\u81f3\u76f8\u5e94\u7684 RocksDB \u5b9e\u4f8b\uff0c\u51cf\u5c0f\u4e86\u6570\u636e\u7684\u7a7a\u95f4\u653e\u5927\u548c\u8bfb\u653e\u5927\u6548\u5e94\uff0c\u5b9e\u73b0\u4e86\u673a\u5668\u8d44\u6e90\u7684\u9ad8\u6548\u5229\u7528\u3002"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsx)(i.li,{children:"\u7981\u6b62\u91cd\u590d key"}),"\n"]}),"\n",(0,o.jsxs)(i.p,{children:[(0,o.jsx)(i.img,{alt:"2024-05-16-PikiwiDB(Pika)-4.0.0-key",src:t(9805).A+"",width:"1080",height:"1006"}),"\n\u57fa\u4e8e RocksDB \u7684 Column-Family \u865a\u62df\u9694\u79bb\u673a\u5236\uff0cFloyd \u628a\u6240\u6709\u7c7b\u578b\u7684 key \u548c string \u4e00\u8d77\u5b58\u50a8\u5728 Column-Family 0\u3002\u5728\u6b64\u5b58\u50a8\u57fa\u7840\u4e4b\u4e0a\uff0c\u53ef\u660e\u786e\u7981\u6b62\u4e0d\u540c\u7c7b\u578b\u7684 key \u91cd\u590d\uff0c\u8fd9\u4e00\u8bbe\u8ba1\u65e8\u5728\u675c\u7edd\u6f5c\u5728\u7684\u6570\u636e\u5197\u4f59\u4e0e\u4e0d\u4e00\u81f4\u6027\uff0c\u4e0e Redis \u670d\u52a1\u7279\u6027\u4fdd\u6301\u4e00\u81f4\uff0c\u8fdb\u4e00\u6b65\u63d0\u5347\u4e86\u7cfb\u7edf\u7684\u6574\u4f53\u6548\u7387\u4e0e\u6570\u636e\u8d28\u91cf\u3002"]}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsx)(i.li,{children:"Floyd \u8be6\u7ec6\u8bf4\u660e"}),"\n"]}),"\n",(0,o.jsxs)(i.p,{children:["\u5982\u679c\u5bf9 Floyd \u5b58\u50a8\u5f15\u64ce\u611f\u5174\u8da3\uff0c\u8bf7\u8be6\u9605\u300aFloyd \u5b58\u50a8\u5f15\u64ce\u300b\u3010\u94fe\u63a5\uff1a",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/discussions/2052%E3%80%91%E3%80%82%E7%94%B1%E4%BA%8E",children:"https://github.com/OpenAtomFoundation/pika/discussions/2052\u3011\u3002\u7531\u4e8e"})," Floyd \u524d\u540e\u8fdb\u884c\u4e86\u591a\u4e2a\u7248\u672c\u7684\u8fed\u4ee3\uff0c\u6240\u4ee5\u9605\u8bfb\u8be5 github discussion \u6587\u6863\u65f6\u8bf7\u6ce8\u610f\u524d\u540e\u65f6\u95f4\uff0c\u5982\u6709\u76f8\u5173\u51b2\u7a81\u6027\u8bf4\u6cd5\uff0c\u4ee5\u6700\u65b0\u65e5\u671f\u7684\u6587\u5b57\u4e3a\u51c6\u3002"]}),"\n",(0,o.jsx)(i.p,{children:"\u5173\u952e PR\uff1a"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:["PikiwiDB(Pika) \u652f\u6301 Floyd \u5b58\u50a8\u5f15\u64ce",(0,o.jsx)(i.br,{}),"\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2413",children:"https://github.com/OpenAtomFoundation/pika/pull/2413"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u6dfb\u52a0 Floyd \u7684 compaction-filter \u7684 Gtest",(0,o.jsx)(i.br,{}),"\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2669",children:"https://github.com/OpenAtomFoundation/pika/pull/2669"})]}),"\n",(0,o.jsxs)(i.li,{children:["Pika \u4e0d\u652f\u6301\u4e0d\u540c\u7c7b\u578b\u7684\u91cd\u590d key, \u5199\u5165\u91cd\u590d key \u8fd4\u56de\u975e\u6cd5\u7c7b\u578b",(0,o.jsx)(i.br,{}),"\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2609",children:"https://github.com/OpenAtomFoundation/pika/pull/2609"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u5bf9 HyperLogLog \u548c String \u8fdb\u884c\u7c7b\u578b\u9694\u79bb\uff0c\u786e\u4fdd HyperLogLog \u64cd\u4f5c\u4e0e String \u64cd\u4f5c\u660e\u786e\u533a\u5206\u5f00",(0,o.jsx)(i.br,{}),"\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2720",children:"https://github.com/OpenAtomFoundation/pika/pull/2720"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u6dfb\u52a0\u652f\u6301\u5206\u533a\u7d22\u5f15\u8fc7\u6ee4\u7684\u529f\u80fd",(0,o.jsx)(i.br,{}),"\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2601",children:"https://github.com/OpenAtomFoundation/pika/pull/2601"})]}),"\n"]}),"\n",(0,o.jsx)(i.p,{children:"1.2 Mget \u6279\u91cf\u67e5\u8be2\u7f13\u5b58"}),"\n",(0,o.jsx)(i.p,{children:"Pika v3.5.2 \u7684\u70ed\u6570\u636e\u7f13\u5b58\u53ea\u5b9e\u73b0\u4e86\u5bf9\u70ed\u70b9 Key \u7684\u70b9\u67e5(\u5982get/hget)\uff0c\u5728\u540e\u7eed\u7684 v3.5.3 \u548c v3.5.4 \u4fee\u590d\u82e5\u5e72 bug \u540e\uff0c\u5bf9\u70ed\u6570\u636e\u7684\u70b9\u67e5\u76ee\u524d\u5df2\u7ecf\u975e\u5e38\u7a33\u5b9a\u3002\u7136\u800c\u5e76\u672a\u652f\u6301\u6279\u91cf\u67e5\u8be2(\u5982 mget etc)\u3002\n\u5185\u90e8\u4e1a\u52a1\u4fa7\u53cd\u9988\u6279\u91cf\u67e5\u8be2\u901f\u5ea6\u6bd4\u8f83\u6162\uff0c\u5728 40C/256GiB/2TiB SATA SSD \u89c4\u683c\u673a\u5668\u4e0a\u6570\u636e\u91cf\u8d85\u8fc7 100GiB \u65f6\uff0cPika v3.3.6 30% \u6279\u91cf\u67e5\u8be2\u5ef6\u8fdf\u8d85\u8fc7 35ms\u3002\u4f46\u7531\u4e8e Pika \u70ed\u6570\u636e\u7f13\u5b58\u5c1a\u672a\u652f\u6301\u6279\u91cf\u67e5\u8be2\uff0c\u6027\u80fd\u5e76\u672a\u6539\u5584\u3002"}),"\n",(0,o.jsxs)(i.p,{children:["\u4e3a\u4e86\u6ee1\u8db3\u4e1a\u52a1\u9700\u6c42\uff0cPika \u56e2\u961f\u5f00\u53d1\u4e86\u6279\u91cf\u67e5\u8be2\u70ed\u6570\u636e\u7f13\u5b58\u529f\u80fd\uff0c\u663e\u8457\u63d0\u5347\u4e86\u6279\u91cf\u67e5\u8be2\u6027\u80fd\uff0c\u964d\u4f4e\u4e86\u67e5\u8be2\u5ef6\u8fdf\u548c\u5931\u8d25\u7387\u3002\u76f8\u5173\u6280\u672f\u7ec6\u8282\u8bf7\u9605\u8bfb\u300aPikiwiDB (Pika) \u6df7\u5408\u5b58\u50a8\u4e4b\u6279\u91cf\u67e5\u8be2\u300b \u3010\u94fe\u63a5\uff1a",(0,o.jsx)(i.a,{href:"https://mp.weixin.qq.com/s/KFLPruSdB66TMRxUfR9PbQ",children:"https://mp.weixin.qq.com/s/KFLPruSdB66TMRxUfR9PbQ"})," \u3011\u3002"]}),"\n",(0,o.jsx)(i.p,{children:"\u5173\u952e PR \uff1a"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:["Mget \u652f\u6301\u591a key \u67e5\u8be2\u7f13\u5b58, \u8bb0\u5f55\u672a\u547d\u4e2d\u7684 key \u53bb DB \u4e2d\u67e5\u8be2\uff0c\u63d0\u5347 Pika \u670d\u52a1\u7684\u8bfb\u6027\u80fd",(0,o.jsx)(i.br,{}),"\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2675",children:"https://github.com/OpenAtomFoundation/pika/pull/2675"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d Mget \u6ca1\u6709\u4f7f\u7528\u89e3\u6790 ttl \u7684\u51fd\u6570\u5bfc\u81f4\u51fa\u73b0\u90e8\u5206key\u7684ttl\u672a\u88ab\u66f4\u65b0\uff0c\u6570\u636e\u4e0d\u4e00\u81f4\u7684\u95ee\u9898",(0,o.jsx)(i.br,{}),"\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2730",children:"https://github.com/OpenAtomFoundation/pika/pull/2730"})]}),"\n"]}),"\n",(0,o.jsx)(i.p,{children:"1.3 \u4e3b\u4ece\u590d\u5236"}),"\n",(0,o.jsx)(i.p,{children:'Pika v3.3.6 \u6709\u5f88\u591a\u4e3b\u4ece\u590d\u5236\u7684\u7f3a\u9677\u3002v4.0.0 \u7248\u672c\u5bf9 Pika \u5168\u91cf\u590d\u5236\u53ca\u589e\u91cf\u590d\u5236\u8fdb\u884c\u4e86\u5927\u91cf\u4f18\u5316\u548c bug \u4fee\u590d\uff0c\u53d6\u5f97\u4e86\u975e\u5e38\u597d\u7684\u6548\u679c\u3002\n\u5e76\u5728 info \u547d\u4ee4\u4e2d\u8f93\u51fa\u4e86 "repl_connect_status" \u6307\u6807(PR 2638)\uff0c\u4ee5\u65b9\u4fbf\u7528\u6237\u66f4\u52a0\u660e\u786e\u6e05\u6670\u7684\u786e\u5b9a\u5f53\u524d\u7684\u4e3b\u4ece\u590d\u5236\u72b6\u6001\u3002'}),"\n",(0,o.jsx)(i.p,{children:"\u5173\u952e PR \uff1a"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d\u6279\u91cf\u6269\u5bb9\u65f6\uff0c\u591a\u4e2a slave \u540c\u65f6\u8fde\u63a5 master, \u77ed\u65f6\u95f4\u591a\u6b21 bgsave \u5bfc\u81f4\u90e8\u5206\u4ece\u8282\u70b9\u6570\u636e\u4e0d\u5b8c\u6574\u7684\u95ee\u9898",(0,o.jsx)(i.br,{}),"\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2746",children:"https://github.com/OpenAtomFoundation/pika/pull/2746"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d Spop \u5728\u5199 binlog \u65f6\u53ef\u80fd\u4f1a\u51fa\u73b0\u7ade\u6001\u95ee\u9898",(0,o.jsx)(i.br,{}),"\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2647",children:"https://github.com/OpenAtomFoundation/pika/pull/2647"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d\u591a DB \u4e0b\u5168\u91cf\u540c\u6b65\u8d85\u65f6\u540e\u4e0d\u91cd\u8bd5\u7684\u95ee\u9898",(0,o.jsx)(i.br,{}),"\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2667",children:"https://github.com/OpenAtomFoundation/pika/pull/2667"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d\u591a DB \u4e3b\u4ece\u8d85\u65f6\u573a\u666f\u4e0b\uff0c\u53ef\u80fd\u4f1a\u51fa\u73b0\u7a97\u53e3\u5d29\u6e83\u7684\u95ee\u9898",(0,o.jsx)(i.br,{}),"\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2666",children:"https://github.com/OpenAtomFoundation/pika/pull/2666"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d\u4e3b\u4ece\u540c\u6b65\u9650\u901f\u903b\u8f91\u4e2d\u91cd\u590d\u89e3\u9501\u7684\u95ee\u9898",(0,o.jsx)(i.br,{}),"\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2657",children:"https://github.com/OpenAtomFoundation/pika/pull/2657"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u91cd\u6784\u4e3b\u4ece\u590d\u5236\u6a21\u5f0f slave \u8282\u70b9\u7684\u4e3b\u4ece\u540c\u6b65\u7ebf\u7a0b\u6a21\u578b\uff0c\u5c3d\u53ef\u80fd\u51cf\u5c11 binlog \u6d88\u8d39\u963b\u585e\u95ee\u9898",(0,o.jsx)(i.br,{}),"\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2638",children:"https://github.com/OpenAtomFoundation/pika/pull/2638"})]}),"\n"]}),"\n",(0,o.jsx)(i.p,{children:"1.4 Redis Stream"}),"\n",(0,o.jsx)(i.p,{children:"Redis Stream \u7c7b\u4f3c\u4e8e\u6d88\u606f\u961f\u5217\uff08MQ\uff09\uff0c\u4ee5\u4fbf\u66f4\u5b89\u5168\u5730\u4f20\u9012\u6d88\u606f\u3002\u4e3a\u4e86\u786e\u4fdd\u6570\u636e\u7684\u5b89\u5168\u6027\uff0c\u5e95\u5c42\u5f15\u64ce BlackWidow \u548c Floyd \u4e2d\u7279\u522b\u6dfb\u52a0\u4e86\u5bf9 Stream \u6570\u636e\u7c7b\u578b\u7684\u652f\u6301\u3002\n\u5173\u952e PR\uff1a"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d pkpatternmatchdel \u547d\u4ee4\u4f7f\u7528\u9519\u8bef\u5bfc\u81f4\u7684 stream \u7c7b\u578b\u6570\u636e\u5220\u9664\u5f02\u5e38\u7684\u95ee\u9898",(0,o.jsx)(i.br,{}),"\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2726",children:"https://github.com/OpenAtomFoundation/pika/pull/2726"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d Keyspace \u547d\u4ee4\u672a\u8ba1\u7b97 Stream \u7c7b\u578b\u6570\u636e\u7684\u95ee\u9898",(0,o.jsx)(i.br,{}),"\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2705",children:"https://github.com/OpenAtomFoundation/pika/pull/2705"})]}),"\n"]}),"\n",(0,o.jsx)(i.p,{children:"1.5 Compaction"}),"\n",(0,o.jsx)(i.p,{children:"PikiwiDB(Pika) \u7684\u5e95\u5c42\u78c1\u76d8\u5b58\u50a8\u5f15\u64ce RocksDB \u5728\u8fdb\u884c compaction \u65f6\u4f1a\u663e\u8457\u5f71\u54cd PikiwiDB(Pika) \u7684\u8bfb\u5199\u6027\u80fd\u3002\u56e0\u6b64\uff0c\u63a7\u5236\u597d compaction \u662f\u4f18\u5316 Pika \u8bfb\u5199\u6027\u80fd\u7684\u5173\u952e\u3002"}),"\n",(0,o.jsx)(i.p,{children:"Floyd \u4f7f\u7528\u4e86 v8.7.3 \u7248\u672c\u7684 RocksDB\uff0c\u5f00\u653e\u4e86\u66f4\u591a RocksDB \u53c2\u6570\uff0c\u4ee5\u65b9\u4fbf\u7528\u6237\u4f18\u5316 RocksDB \u6027\u80fd\uff1a"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsx)(i.li,{children:"enable-partitioned-index-filters\uff1a \u652f\u6301\u52a0\u8f7d\u5206\u533a\u7d22\u5f15\u8fc7\u6ee4\u5668\uff0c\u52a0\u5feb RocksDB \u67e5\u627e\u901f\u5ea6\u3002"}),"\n",(0,o.jsx)(i.li,{children:"min-write-buffer-number-to-merge: \u9ed8\u8ba4\u503c\u4e3a 1\uff0c\u5982\u679c\u5c06\u6b64\u503c\u8bbe\u7f6e\u5f97\u66f4\u5927\uff0c\u610f\u5473\u7740\u9700\u8981\u66f4\u591a\u7684\u5199\u7f13\u51b2\u533a\u88ab\u586b\u6ee1\u540e\u624d\u8fdb\u884c flush\u3002\u8fd9\u6837\u53ef\u4ee5\u51cf\u5c11 flush \u7684\u9891\u7387\uff0c\u589e\u52a0\u6570\u636e\u5728\u5185\u5b58\u4e2d\u7684\u7d2f\u79ef\u91cf\uff0c\u4ece\u800c\u53ef\u80fd\u63d0\u9ad8\u5199\u5165\u541e\u5410\u91cf\u3002"}),"\n",(0,o.jsx)(i.li,{children:"level0-stop-writes-trigger: \u9ed8\u8ba4\u503c\u4e3a 36\uff0c\u5b9a\u4e49\u4e86 L0 \u5c42\u4e2d sst \u6587\u4ef6\u7684\u6700\u5927\u6570\u91cf\uff0c\u4e00\u65e6\u8fbe\u5230\u8fd9\u4e2a\u6570\u91cf\uff0cRocksDB \u5c06\u4f1a\u91c7\u53d6 \u6682\u505c\u5199\u5165\u3001\u5f3a\u5236 compaction \u7b49\u63aa\u65bd\u6765\u9632\u6b62\u5199\u5165\u64cd\u4f5c\u7ee7\u7eed\u7d2f\u79ef\uff0c\u4ee5\u907f\u514d L0 \u5c42\u53d8\u5f97\u8fc7\u4e8e\u5e9e\u5927\uff0c\u8fdb\u800c\u53ef\u80fd\u5bfc\u81f4\u5199\u5165\u653e\u5927\u3001\u67e5\u8be2\u6027\u80fd\u4e0b\u964d\u7b49\u95ee\u9898\u3002"}),"\n",(0,o.jsx)(i.li,{children:"level0-slowdown-writes-trigger\uff1a\u9ed8\u8ba4\u503c\u4e3a 20\uff0c\u7528\u4e8e\u63a7\u5236\u5f53 Level 0 \u7684 SST \u6587\u4ef6\u6570\u91cf\u8fbe\u5230\u8fd9\u4e2a\u9608\u503c\u65f6\uff0c\u89e6\u53d1\u5199\u51cf\u901f\uff08write slowdown\uff09\uff0c\u9632\u6b62 Level 0 \u7684\u6587\u4ef6\u6570\u91cf\u8fc7\u591a\uff0c\u5bfc\u81f4\u540e\u7eed compaction \u64cd\u4f5c\u7684\u538b\u529b\u8fc7\u5927\u3002"}),"\n",(0,o.jsx)(i.li,{children:"level0-file-num-compaction-trigger\uff1a\u9ed8\u8ba4\u503c\u4e3a 4\uff0c\u5f53 Level 0 \u7684 SST \u6587\u4ef6\u6570\u91cf\u8fbe\u5230\u8fd9\u4e2a\u53c2\u6570\u8bbe\u5b9a\u7684\u9608\u503c\u65f6\uff0cRocksDB \u4f1a\u5f00\u59cb\u6267\u884c compaction \u64cd\u4f5c\uff0c\u5c06 Level 0 \u7684\u6587\u4ef6\u5408\u5e76\u5230 Level 1\uff0c\u4ee5\u51cf\u5c11 Level 0 \u7684\u6587\u4ef6\u6570\u91cf\uff0c\u964d\u4f4e\u8bfb\u53d6\u5ef6\u8fdf\uff0c\u5e76\u4f18\u5316\u5b58\u50a8\u7a7a\u95f4\u7684\u5229\u7528\u7387\u3002"}),"\n",(0,o.jsx)(i.li,{children:"max-subcompactions\uff1a\u9ed8\u8ba4\u503c\u4e3a 1\uff0c\u7528\u4e8e\u63a7\u5236RocksDB \u4e2d\u5e76\u53d1\u6267\u884c\u7684 sub-compaction \u4efb\u52a1\u6570\u91cf\uff0c\u5176\u503c\u4e3a 1 \u8868\u793a\u5173\u95ed sub-compaction\u3002\u5982\u679c\u7cfb\u7edf\u8d44\u6e90\u5145\u8db3\uff0c\u5efa\u8bae\u63d0\u5347\u8be5\u53c2\u6570\u4ee5\u4f18\u5316 compaction \u6548\u7387\u3002"}),"\n",(0,o.jsx)(i.li,{children:"max-bytes-for-level-base\uff1a\u6307\u5b9a\u4e86 L1 SST \u6587\u4ef6\u603b\u7684\u5927\u5c0f\u3002\u8fd9\u4e2a\u5927\u5c0f\u662f RocksDB \u8fdb\u884c\u6570\u636e\u5206\u5c42\u7ba1\u7406\u548c compaction \u51b3\u7b56\u7684\u91cd\u8981\u4f9d\u636e\uff1a\u5982\u679c L1 \u5c42\u7684\u5927\u5c0f\u8bbe\u7f6e\u5f97\u592a\u5c0f\uff0c\u53ef\u80fd\u4f1a\u5bfc\u81f4 L0 \u5c42\u7684 compaction \u8fc7\u4e8e\u9891\u7e41\uff0c\u8fdb\u800c\u5f71\u54cd\u5199\u6027\u80fd\u3002\u53cd\u4e4b\uff0c\u5982\u679c\u8bbe\u7f6e\u5f97\u592a\u5927\uff0c\u53ef\u80fd\u4f1a\u5360\u7528\u8f83\u591a\u7684\u78c1\u76d8\u7a7a\u95f4\uff0c\u5e76\u4e14\u5f71\u54cd\u8bfb\u53d6\u6027\u80fd\uff0c\u56e0\u4e3a\u8bfb\u53d6\u64cd\u4f5c\u53ef\u80fd\u9700\u8981\u8de8\u8d8a\u66f4\u591a\u7684\u5c42\u7ea7\u3002Pika \u6ca1\u6709\u5728 pika.conf \u4e2d\u5f00\u653e\u6b64\u53c2\u6570\u7ed9\u7528\u6237\u914d\u7f6e\uff0c\u800c\u662f\u4f7f\u7528\u5176\u4ed6\u53c2\u6570\uff08level0-file-num-compaction-trigger \u548c write-buffer-size\uff09\u8ba1\u7b97\u540e\u7684\u7ed3\u679c\u3002"}),"\n"]}),"\n",(0,o.jsx)(i.p,{children:"storage_options_.options.max_bytes_for_level_base = g_pika_conf->level0_file_num_compaction_trigger() * g_pika_conf->write_buffer_size()"}),"\n",(0,o.jsxs)(i.p,{children:["\u5173\u952e PR\uff1a\n\u6dfb\u52a0 Floyd \u7684 compaction-filter \u7684 Gtest\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2669",children:"https://github.com/OpenAtomFoundation/pika/pull/2669"}),"\n\u6dfb\u52a0\u652f\u6301\u5206\u533a\u7d22\u5f15\u8fc7\u6ee4\u7684\u529f\u80fd\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2601",children:"https://github.com/OpenAtomFoundation/pika/pull/2601"}),"\n\u65b0\u589e RocksDB Compaction \u7b56\u7565\u52a8\u6001\u8c03\u6574\u53c2\u6570\uff0c\u7528\u6237\u53ef\u4ee5\u6839\u636e\u4e1a\u52a1\u8c03\u6574 Compaction \u7b56\u7565\uff0c\u964d\u4f4e Compaction \u64cd\u4f5c\u5bf9\u670d\u52a1\u6027\u80fd\u7684\u635f\u8017\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2538",children:"https://github.com/OpenAtomFoundation/pika/pull/2538"}),"\n1.6 \u53ef\u89c2\u6d4b\u6027\nv3.5 \u7248\u672c\u589e\u52a0\u4e86\u5305\u62ec\u547d\u4e2d\u7387\u3001\u6bcf\u79d2\u547d\u4e2d\u6b21\u6570\u3001Redis Cache \u5185\u5b58\u4f7f\u7528\u91cf\u3001Redis Cache \u4e2a\u6570\u3001Redis Cache DB \u4e2a\u6570 \u7b49\u6307\u6807\uff0c\u4f46\u662f\u5728\u96c6\u7fa4\u65b9\u9762\u7684\u53ef\u89c2\u6d4b\u6027\u662f\u7f3a\u5931\u7684\u3002v4.0.0 \u5bf9 Codis-Proxy \u7684 P99\u3001P999\u3001\u5ef6\u8fdf\u7b49\u76d1\u63a7\u6307\u6807\u8fdb\u884c\u91c7\u96c6\u548c\u5c55\u793a\uff0c\u53ef\u4ee5\u76f4\u89c2\u5730\u53cd\u6620\u7ebf\u4e0a Codis-proxy \u7684\u8fd0\u884c\u60c5\u51b5\u3002"]}),"\n",(0,o.jsx)(i.p,{children:"v4.0.0 \u5f00\u59cb\u8fd8\u63d0\u4f9b\u65b0\u7684\u5de5\u5177\uff1a\u6839\u636e pika benchmark \u5de5\u5177\u538b\u6d4b\u7ed3\u679c\u81ea\u52a8\u751f\u6210\u53ef\u89c6\u5316\u7684\u7edf\u8ba1\u56fe\u8868\u3002"}),"\n",(0,o.jsxs)(i.p,{children:["\u5173\u952e PR\uff1a\nCodis \u652f\u6301 info \u547d\u4ee4, \u53ef\u4ee5\u901a\u8fc7\u8be5\u547d\u4ee4\u67e5\u8be2 Codis-proxy \u7684 info \u4fe1\u606f\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2688",children:"https://github.com/OpenAtomFoundation/pika/pull/2688"}),"\nCodis-proxy \u65b0\u589e P99 P95 \u7b49\u76d1\u63a7\u8017\u65f6\u6307\u6807\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2668",children:"https://github.com/OpenAtomFoundation/pika/pull/2668"}),"\n\u6dfb\u52a0 Pika \u538b\u6d4b\u6307\u6807\uff0c\u63d0\u5347 Pika \u538b\u6d4b\u6548\u7387\uff0c\u5e76\u8f93\u51fa\u53ef\u89c6\u5316\u7684\u7edf\u8ba1\u56fe\u8868\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2663",children:"https://github.com/OpenAtomFoundation/pika/pull/2663"})]}),"\n",(0,o.jsxs)(i.p,{children:["1.7 \u6d4b\u8bd5\u96c6\nPikiwiDB(Pika) \u6d4b\u8bd5\u96c6\u7531 gtest \u5355\u6d4b\u3001Redis TCL \u6d4b\u8bd5\u96c6\u548c Go \u6d4b\u8bd5\u96c6\u7ec4\u6210\u3002v4.0.0 \u4e2d\u4e30\u5bcc\u4e86\u8bf8\u591a\u7279\u6027\u7684 go test \u529f\u80fd\uff0c\u5e76\u8fdb\u4e00\u6b65\u5b8c\u5584\u4e86\u57fa\u672c\u6570\u636e\u7c7b\u578b\u7684 TCL \u6d4b\u8bd5\u3002\n\u5173\u952e PR\uff1a\n\u6dfb\u52a0 Floyd \u7684 compaction-filter \u7684 Gtest\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2669",children:"https://github.com/OpenAtomFoundation/pika/pull/2669"}),"\nPika Geo \u6570\u636e\u7c7b\u578b\u589e\u52a0 TCL \u6d4b\u8bd5\uff0c\u5e76\u4fee\u590d\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9047\u5230\u7684\u7f3a\u9677\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2753",children:"https://github.com/OpenAtomFoundation/pika/pull/2753"}),"\n1.8 \u8de8\u5e73\u53f0\nPikiwiDB(Pika) \u4ee5\u5f80\u4ec5\u652f\u6301 centos \u548c ubuntu \u7b49 linux \u5e73\u53f0\uff0cv3.5 \u5f00\u59cb\u652f\u6301 Mac \u7b49\u5e73\u53f0\u3002v4.0.0 \u5c06\u5bf9 Mac \u5e73\u53f0\u7684\u652f\u6301\u6269\u5c55\u81f3 FreeBSD \u5e73\u53f0\u3002\n\u5173\u952e PR\uff1a\nPika \u652f\u6301\u5728 FreeBSD14 \u5e73\u53f0\u4e0a\u8fdb\u884c\u7f16\u8bd1\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2711",children:"https://github.com/OpenAtomFoundation/pika/pull/2711"}),"\n2 \u6539\u8fdb\u5217\u8868\n\u4e0b\u9762\u8be6\u7ec6\u5217\u51fa\u4e86\u672c\u6b21\u53d1\u7248\u7684\u4e3b\u8981\u529f\u80fd\u5347\u7ea7\u548c\u6539\u8fdb\u3002\n2.1 \u65b0\u7279\u6027"]}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:["Pika Geo \u6570\u636e\u7c7b\u578b\u589e\u52a0 TCL \u6d4b\u8bd5\uff0c\u5e76\u4fee\u590d\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9047\u5230\u7684\u7f3a\u9677\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2753",children:"https://github.com/OpenAtomFoundation/pika/pull/2753"})]}),"\n",(0,o.jsxs)(i.li,{children:["Pika \u652f\u6301\u5728 FreeBSD14 \u5e73\u53f0\u4e0a\u8fdb\u884c\u7f16\u8bd1\u6253\u5305\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2711",children:"https://github.com/OpenAtomFoundation/pika/pull/2711"})]}),"\n",(0,o.jsxs)(i.li,{children:["Pika \u7ebf\u7a0b\u6574\u7406\uff0c\u907f\u514d\u542f\u52a8\u8fc7\u591a\u65e0\u7528\u7ebf\u7a0b\uff0c\u5bf9\u4e0d\u540c\u7684\u7ebf\u7a0b\u8fdb\u884c\u547d\u540d\uff0c\u65b9\u4fbf\u95ee\u9898\u5b9a\u4f4d\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2697",children:"https://github.com/OpenAtomFoundation/pika/pull/2697"})]}),"\n",(0,o.jsxs)(i.li,{children:["Mget \u652f\u6301\u591a key \u67e5\u8be2\u7f13\u5b58, \u8bb0\u5f55\u672a\u547d\u4e2d\u7684 key \u53bb DB \u4e2d\u67e5\u8be2\uff0c\u63d0\u5347 Pika \u670d\u52a1\u7684\u8bfb\u6027\u80fd\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2675",children:"https://github.com/OpenAtomFoundation/pika/pull/2675"})]}),"\n",(0,o.jsxs)(i.li,{children:["Codis \u652f\u6301 info \u547d\u4ee4, \u53ef\u4ee5\u901a\u8fc7\u8be5\u547d\u4ee4\u67e5\u8be2 Codis-proxy \u7684 info \u4fe1\u606f\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2688",children:"https://github.com/OpenAtomFoundation/pika/pull/2688"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u6dfb\u52a0 Floyd \u7684 compaction-filter \u7684 Gtest\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2669",children:"https://github.com/OpenAtomFoundation/pika/pull/2669"})]}),"\n",(0,o.jsxs)(i.li,{children:["Codis-proxy \u65b0\u589e P99 P95 \u7b49\u76d1\u63a7\u8017\u65f6\u6307\u6807\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2668",children:"https://github.com/OpenAtomFoundation/pika/pull/2668"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u6dfb\u52a0 Pika \u538b\u6d4b\u6307\u6807\uff0c\u63d0\u5347 Pika \u538b\u6d4b\u6548\u7387\uff0c\u5e76\u8f93\u51fa\u53ef\u89c6\u5316\u7684\u7edf\u8ba1\u56fe\u8868\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2663",children:"https://github.com/OpenAtomFoundation/pika/pull/2663"})]}),"\n",(0,o.jsxs)(i.li,{children:["Pika \u4e3b\u4ece\u590d\u5236\u65b0\u589e\u76d1\u63a7\u6307\u6807 repl_connect_status, \u53ef\u4ee5\u66f4\u52a0\u660e\u786e\u6e05\u6670\u7684\u786e\u5b9a\u5f53\u524d\u7684\u4e3b\u4ece\u590d\u5236\u7684\u72b6\u6001\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2638",children:"https://github.com/OpenAtomFoundation/pika/pull/2638"})]}),"\n",(0,o.jsxs)(i.li,{children:["Pika \u4e0d\u652f\u6301\u4e0d\u540c\u7c7b\u578b\u7684\u91cd\u590d key, \u5199\u5165\u91cd\u590d key \u8fd4\u56de\u975e\u6cd5\u7c7b\u578b\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2609",children:"https://github.com/OpenAtomFoundation/pika/pull/2609"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u6dfb\u52a0\u652f\u6301\u5206\u533a\u7d22\u5f15\u8fc7\u6ee4\u7684\u529f\u80fd\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2601",children:"https://github.com/OpenAtomFoundation/pika/pull/2601"})]}),"\n",(0,o.jsxs)(i.li,{children:["Pika \u652f\u6301\u7b2c\u4e09\u4ee3\u5b58\u50a8\u5f15\u64ce Floyd, \u901a\u8fc7\u652f\u6301\u591a rocksdb \u5b9e\u4f8b\u3001\u5bf9 Blob \u7684\u4f7f\u7528\u8fdb\u884c\u4f18\u5316\u3001\u5bf9\u8fc7\u671f\u6570\u636e\u7684\u6e05\u7406\u8fdb\u884c\u4f18\u5316\uff0c\u63d0\u5347\u4e86 Pika \u5b9e\u4f8b\u7684\u8bfb\u5199\u6027\u80fd\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2413",children:"https://github.com/OpenAtomFoundation/pika/pull/2413"})]}),"\n"]}),"\n",(0,o.jsx)(i.p,{children:"2.2 bug \u4fee\u590d"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d iter \u672a\u88ab\u6790\u6784\uff0c\u5bfc\u81f4 pkpatternmatchdel \u5728\u8fd4\u56de\u4e4b\u524d\u4e0d\u4f1a\u5220\u9664 iter\uff0c\u8fd9\u53ef\u80fd\u4f1a\u5bfc\u81f4 rocksdb \u6c38\u8fdc\u5f15\u7528\u4e00\u4e2a\u7248\u672c\uff0c\u5bfc\u81f4\u6570\u636e\u4e0d\u7b26\u5408\u9884\u671f\u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2785",children:"https://github.com/OpenAtomFoundation/pika/pull/2785"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d config \u53c2\u6570 min-blob-size \u5e26\u5355\u4f4d\u65f6\u89e3\u6790\u9519\u8bef\u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2767",children:"https://github.com/OpenAtomFoundation/pika/pull/2767"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d zverank \u8fd4\u56de\u503c\u5f02\u5e38\u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2673",children:"https://github.com/OpenAtomFoundation/pika/pull/2673"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d Pika-port \u4f20\u8f93\u6570\u636e\u8fc7\u7a0b\u4e2d\u62a5\u9519\u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2758",children:"https://github.com/OpenAtomFoundation/pika/pull/2758"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d\u56e0\u4e3a\u5806\u4e0a\u5206\u914d\u7684\u7f13\u51b2\u533a\u8d8a\u754c\u5bfc\u81f4 Dbsize \u547d\u4ee4\u8fd0\u884c\u65f6\u5d29\u6e83\u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2749",children:"https://github.com/OpenAtomFoundation/pika/pull/2749"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d\u6279\u91cf\u6269\u5bb9\u65f6\uff0c\u591a\u4e2a slave \u540c\u65f6\u8fde\u63a5 master, \u77ed\u65f6\u95f4\u591a\u6b21 bgsave \u5bfc\u81f4\u90e8\u5206\u4ece\u8282\u70b9\u6570\u636e\u4e0d\u5b8c\u6574\u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2746",children:"https://github.com/OpenAtomFoundation/pika/pull/2746"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d\u53c2\u6570\u672a\u521d\u59cb\u5316\u5bfc\u81f4 slotsscan \u7b49\u547d\u4ee4\u4e0d\u80fd\u548c bgsave \u547d\u4ee4\u76f8\u4e92\u5236\u8861\u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2745",children:"https://github.com/OpenAtomFoundation/pika/pull/2745"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d Slotmigrate \u8fc1\u79fb\u6570\u636e\u7684\u8fc7\u7a0b\u4e2d\uff0c\u8fd4\u56de\u503c\u8bbe\u7f6e\u9519\u8bef\uff0c\u5f02\u5e38\u573a\u666f\u4e0b\u4f1a\u7ec8\u6b62\u6570\u636e\u8fc1\u79fb\u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2741",children:"https://github.com/OpenAtomFoundation/pika/pull/2741"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d Mget \u6ca1\u6709\u4f7f\u7528\u89e3\u6790 ttl \u7684\u51fd\u6570\u5bfc\u81f4\u51fa\u73b0\u90e8\u5206key\u7684ttl\u672a\u88ab\u66f4\u65b0\uff0c\u6570\u636e\u4e0d\u4e00\u81f4\u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2730",children:"https://github.com/OpenAtomFoundation/pika/pull/2730"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d pkpatternmatchdel \u547d\u4ee4\u4f7f\u7528\u9519\u8bef\u5bfc\u81f4\u7684 stream \u7c7b\u578b\u6570\u636e\u5220\u9664\u5f02\u5e38\u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2726",children:"https://github.com/OpenAtomFoundation/pika/pull/2726"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d pkpatternmatchdel \u4e0d\u80fd\u6b63\u786e\u5220\u9664\u6389\u5bf9\u5e94\u7684 keys \u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2717",children:"https://github.com/OpenAtomFoundation/pika/pull/2717"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d ACL \u5bc6\u7801\u9a8c\u8bc1\u9519\u8bef\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2714",children:"https://github.com/OpenAtomFoundation/pika/pull/2714"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d Keyspace \u547d\u4ee4\u672a\u8ba1\u7b97 Stream \u7c7b\u578b\u6570\u636e\u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2705",children:"https://github.com/OpenAtomFoundation/pika/pull/2705"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u5bf9\u90e8\u5206\u547d\u4ee4\u5b9a\u5236\u5316\u5904\u7406\u903b\u8f91\uff0c\u907f\u514d\u5199 binlog \u5bfc\u81f4\u4ece\u8282\u70b9\u7684 binlog \u89e3\u6790\u5931\u8d25\u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2793",children:"https://github.com/OpenAtomFoundation/pika/pull/2793"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d Pika cmdID \u8d4b\u503c\u5728 Cmd \u521d\u59cb\u51fd\u6570\u4e2d\uff0c\u53ef\u80fd\u4f1a\u5bfc\u81f4\u5e76\u53d1\u6784\u9020\u7684\u65f6\u5019\u51fa\u73b0\u5185\u5b58\u6cc4\u6f0f\u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2692",children:"https://github.com/OpenAtomFoundation/pika/pull/2692"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d ExpectedStale \u672a\u8003\u8651 String \u7c7b\u578b, \u5982\u679c\u5b58\u5728\u5df2\u7ecf\u8fc7\u671f\u7684 String \u7c7b\u578b\u7684 key, ExpectedStale \u4f1a\u8fd4\u56de\u9519\u8bef\u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2682",children:"https://github.com/OpenAtomFoundation/pika/pull/2682"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d Spop \u5728\u5199 binlog \u65f6\u53ef\u80fd\u4f1a\u51fa\u73b0\u7ade\u6001\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2674",children:"https://github.com/OpenAtomFoundation/pika/pull/2674"})]}),"\n",(0,o.jsxs)(i.li,{children:["db instance \u8bbe\u7f6e\u4e0d\u5408\u7406\u65f6\uff0c\u7ed9\u7528\u6237\u9519\u8bef\u63d0\u793a\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2672",children:"https://github.com/OpenAtomFoundation/pika/pull/2672"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d server_stat \u4e2d\u7684\u6570\u636e\u7ade\u6001\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2671",children:"https://github.com/OpenAtomFoundation/pika/pull/2671"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d\u591a DB \u4e0b\u5168\u91cf\u540c\u6b65\u8d85\u65f6\u540e\u4e0d\u91cd\u8bd5\u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2667",children:"https://github.com/OpenAtomFoundation/pika/pull/2667"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d\u591a DB \u4e0b\u5168\u91cf\u540c\u6b65\u8d85\u65f6\u540e\u4e0d\u91cd\u8bd5\u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2666",children:"https://github.com/OpenAtomFoundation/pika/pull/2666"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d\u4e3b\u4ece\u540c\u6b65\u9650\u901f\u903b\u8f91\u4e2d\u91cd\u590d\u89e3\u9501\u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2657",children:"https://github.com/OpenAtomFoundation/pika/pull/2657"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u53d1\u7248\u652f\u6301\u81ea\u52a8\u6253\u5305 centos7 \u548c centos8 \u5e73\u53f0\u7684\u4e8c\u8fdb\u5236\u7f16\u8bd1\u5305\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2535",children:"https://github.com/OpenAtomFoundation/pika/pull/2535"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4fee\u590d Codis \u4fa7\u7684 getrange \u547d\u4ee4\u6ca1\u6709\u8fd4\u56de\u9884\u671f\u7ed3\u679c\u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2510",children:"https://github.com/OpenAtomFoundation/pika/pull/2510"})]}),"\n"]}),"\n",(0,o.jsx)(i.p,{children:"2.3 \u63d0\u5347\u6539\u8fdb\u9879"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:["\u66f4\u65b0 Pika Docker Readme, \u53ef\u4ee5\u6309\u7167 Readme \u5728 Docker \u4e2d\u90e8\u7f72 Pika \u670d\u52a1\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2743",children:"https://github.com/OpenAtomFoundation/pika/pull/2743"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u4f18\u5316\u91cd\u590d\u67e5\u8be2 meta value \u5bfc\u81f4\u5f71\u54cd Pika \u670d\u52a1\u8bfb\u5199\u6027\u80fd\u7684\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2735",children:"https://github.com/OpenAtomFoundation/pika/pull/2735"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u652f\u6301\u5bf9\u66f4\u591a\u7684 RocksDB \u53c2\u6570\u8fdb\u884c\u52a8\u6001\u8c03\u6574\uff0c\u7528\u6237\u6839\u636e\u4e0d\u540c\u7684\u4e1a\u52a1\u4f7f\u7528\u573a\u666f\u8c03\u6574\u53c2\u6570\u63d0\u5347 Pika \u7684\u8bfb\u5199\u6027\u80fd\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2728",children:"https://github.com/OpenAtomFoundation/pika/pull/2728"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u5bf9 HyperLogLog \u548c String \u8fdb\u884c\u7c7b\u578b\u9694\u79bb\uff0c\u786e\u4fdd HyperLogLog \u64cd\u4f5c\u4e0e String \u64cd\u4f5c\u660e\u786e\u533a\u5206\u5f00\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2720",children:"https://github.com/OpenAtomFoundation/pika/pull/2720"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u66f4\u65b0\u4e86 PR \u6807\u9898\u9a8c\u8bc1\uff0c\u4e0d\u5141\u8bb8\u5728\u6807\u9898\u672b\u5c3e\u51fa\u73b0\u4e2d\u6587\u5b57\u7b26\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2718",children:"https://github.com/OpenAtomFoundation/pika/pull/2718"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u91cd\u6784\u4e3b\u4ece\u590d\u5236\u6a21\u5f0f slave \u8282\u70b9\u7684\u4e3b\u4ece\u540c\u6b65\u7ebf\u7a0b\u6a21\u578b\uff0c\u5c3d\u53ef\u80fd\u51cf\u5c11 binlog \u6d88\u8d39\u963b\u585e\u95ee\u9898\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2638",children:"https://github.com/OpenAtomFoundation/pika/pull/2638"})]}),"\n",(0,o.jsxs)(i.li,{children:["\u65b0\u589e RocksDB Compaction \u7b56\u7565\u52a8\u6001\u8c03\u6574\u53c2\u6570\uff0c\u7528\u6237\u53ef\u4ee5\u6839\u636e\u4e1a\u52a1\u8c03\u6574 Compaction \u7b56\u7565\uff0c\u964d\u4f4e Compaction \u64cd\u4f5c\u5bf9\u670d\u52a1\u6027\u80fd\u7684\u635f\u8017\n",(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2538",children:"https://github.com/OpenAtomFoundation/pika/pull/2538"})]}),"\n"]}),"\n",(0,o.jsx)(i.p,{children:"2.4 \u53d1\u7248 tag"}),"\n",(0,o.jsxs)(i.p,{children:[(0,o.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/releases/tag/v4.0.0",children:"https://github.com/OpenAtomFoundation/pika/releases/tag/v4.0.0"}),"\n3 \u793e\u533a\n\u611f\u8c22\u6240\u6709\u4e3a v4.0.0 \u505a\u51fa\u8d21\u732e\u7684\u793e\u533a\u6210\u5458\uff0c\u5305\u62ec issue/PR \u63d0\u4ea4\u8005\u3001\u4ee3\u7801 reviewer \u3010\u6392\u540d\u4e0d\u5206\u5148\u540e\uff0c\u4f9d\u636e\u5b57\u6bcd\u5e8f\u5217\u3011\uff1a"]}),"\n",(0,o.jsx)(i.p,{children:"AlexStocks"}),"\n",(0,o.jsx)(i.p,{children:"baerwang"}),"\n",(0,o.jsx)(i.p,{children:"chejinge"}),"\n",(0,o.jsx)(i.p,{children:"cheniujh"}),"\n",(0,o.jsx)(i.p,{children:"chienguo"}),"\n",(0,o.jsx)(i.p,{children:"guangkun123"}),"\n",(0,o.jsx)(i.p,{children:"gukj-spel"}),"\n",(0,o.jsx)(i.p,{children:"longfar-ncy"}),"\n",(0,o.jsx)(i.p,{children:"lqxhub"}),"\n",(0,o.jsx)(i.p,{children:"luky116"}),"\n",(0,o.jsx)(i.p,{children:"Mixficsol"}),"\n",(0,o.jsx)(i.p,{children:"saz97"}),"\n",(0,o.jsx)(i.p,{children:"wangshao1"}),"\n",(0,o.jsx)(i.p,{children:"PikiwiDB (Pika) \u5f00\u6e90\u793e\u533a\u70ed\u70c8\u6b22\u8fce\u60a8\u7684\u53c2\u4e0e\u548c\u652f\u6301\u3002\u5982\u679c\u60a8\u6709\u4efb\u4f55\u95ee\u9898\u3001\u610f\u89c1\u6216\u5efa\u8bae\uff0c\u8bf7\u626b\u7801\u6dfb\u52a0 PikiwiDB \u5c0f\u52a9\u624b\u3010\u5fae\u4fe1\u53f7: PikiwiDB\u3011\u4e3a\u597d\u53cb\uff0c\u5b83\u4f1a\u62c9\u60a8\u52a0\u5165\u5b98\u65b9\u5fae\u4fe1\u7fa4\u3002"}),"\n",(0,o.jsx)(i.p,{children:(0,o.jsx)(i.img,{alt:"2024-07-08-PikiwiDB(Pika)-4.0.0-connect",src:t(3654).A+"",width:"747",height:"431"})})]})}function c(n={}){const{wrapper:i}={...(0,e.R)(),...n.components};return i?(0,o.jsx)(i,{...n,children:(0,o.jsx)(u,{...n})}):u(n)}},3654:(n,i,t)=>{t.d(i,{A:()=>o});const o=t.p+"assets/images/2024-07-08-PikiwiDB(Pika)-4.0.0-connect-c43aca0eeeb5cd09cc60b55f9a3df4e5.png"},9805:(n,i,t)=>{t.d(i,{A:()=>o});const o=t.p+"assets/images/2024-07-08-PikiwiDB(Pika)-4.0.0-key-357e46564ca61e525f598aa7ac52b886.png"},8453:(n,i,t)=>{t.d(i,{R:()=>l,x:()=>s});var o=t(6540);const e={},p=o.createContext(e);function l(n){const i=o.useContext(p);return o.useMemo((function(){return"function"==typeof n?n(i):{...i,...n}}),[i,n])}function s(n){let i;return i=n.disableParentContext?"function"==typeof n.components?n.components(e):n.components||e:l(n.components),o.createElement(p.Provider,{value:i},n.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/8ad00878.27a2486f.js b/build/assets/js/8ad00878.27a2486f.js new file mode 100644 index 0000000..fd4bc97 --- /dev/null +++ b/build/assets/js/8ad00878.27a2486f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[9419],{4093:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>B,frontMatter:()=>r,metadata:()=>t,toc:()=>a});var i=s(4848),c=s(8453);const r={title:"\u65b0\u5b58\u50a8\u7ed3\u6784",sidebar_position:15},l=void 0,t={id:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65b0\u5b58\u50a8\u7ed3\u6784/index",title:"\u65b0\u5b58\u50a8\u7ed3\u6784",description:"\u6574\u4f53\u67b6\u6784",source:"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65b0\u5b58\u50a8\u7ed3\u6784/index.md",sourceDirName:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65b0\u5b58\u50a8\u7ed3\u6784",slug:"/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65b0\u5b58\u50a8\u7ed3\u6784/",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65b0\u5b58\u50a8\u7ed3\u6784/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65b0\u5b58\u50a8\u7ed3\u6784/index.md",tags:[],version:"current",sidebarPosition:15,frontMatter:{title:"\u65b0\u5b58\u50a8\u7ed3\u6784",sidebar_position:15},sidebar:"tutorialSidebar",previous:{title:"\u65e7\u5b58\u50a8\u7ed3\u6784",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65e7\u5b58\u50a8\u7ed3\u6784/"},next:{title:"\u65b0\u5b58\u50a8\u7ed3\u6784\uff1a\u8be6\u7ec6\u89e3\u6790",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65b0\u5b58\u50a8\u65b9\u6848\uff1a\u8be6\u7ec6\u89e3\u6790/"}},o={},a=[{value:"\u6574\u4f53\u67b6\u6784",id:"\u6574\u4f53\u67b6\u6784",level:2},{value:"\u6570\u636e\u683c\u5f0f",id:"\u6570\u636e\u683c\u5f0f",level:2},{value:"\u65e0\u6548\u6570\u636e\u6e05\u7406",id:"\u65e0\u6548\u6570\u636e\u6e05\u7406",level:2},{value:"RocksDB\u4f7f\u7528\u4f18\u5316",id:"rocksdb\u4f7f\u7528\u4f18\u5316",level:2},{value:"blobdb\u4f7f\u7528\u4f18\u5316",id:"blobdb\u4f7f\u7528\u4f18\u5316",level:3},{value:"dealslowkey",id:"dealslowkey",level:2},{value:"compact\u8001\u7684sst\u6587\u4ef6",id:"compact\u8001\u7684sst\u6587\u4ef6",level:3},{value:"\u65b0\u6280\u672f\u63a2\u7d22",id:"\u65b0\u6280\u672f\u63a2\u7d22",level:2}];function d(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",p:"p",pre:"pre",strong:"strong",...(0,c.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"\u6574\u4f53\u67b6\u6784",children:"\u6574\u4f53\u67b6\u6784"}),"\n",(0,i.jsx)(n.p,{children:"\u65b0\u7684\u5b58\u50a8\u67b6\u6784\u4e2d\uff0cpika\u5b9e\u4f8b\u5b58\u50a8\u5f15\u64ce\u5305\u62ec\u5185\u5b58\u7f13\u5b58redis\u548c\u786c\u76d8\u6301\u4e45\u5b58\u50a8RocksDB\u3002\u6bcf\u4e2apika\u5b9e\u4f8b\u7531\u4e00\u4e2aredis\u548c\u591a\u4e2aRocksDB\u5b9e\u4f8b\u6784\u6210\u3002"}),"\n",(0,i.jsx)(n.p,{children:"pika\u5f53\u524d\u662f\u5c06\u4e0d\u540c\u7684\u6570\u636e\u7c7b\u578b\u653e\u5728\u4e0d\u540c\u7684RocksDB\u5b9e\u4f8b\u4e2d\uff0c\u7ebf\u4e0a\u4f7f\u7528\u8fc7\u7a0b\u4e2d\u53d1\u73b0\uff0c\u540c\u4e00\u4e2a\u4e1a\u52a1\u670d\u52a1\u4f7f\u7528\u7684\u6570\u636e\u7c7b\u578b\u4e00\u822c\u96c6\u4e2d\u5728\u4e00\u4e24\u4e2a\u6570\u636e\u7c7b\u578b\u4e2d\uff0c\u65e0\u6cd5\u53d1\u6325\u591aRocksDB\u5b9e\u4f8b\u7684\u4f18\u52bf\u3002\u56e0\u6b64\uff0cpika\u65b0\u7248\u672c\u4e2d\u8ba1\u5212\u4e0d\u518d\u6309\u7167\u6570\u636e\u7c7b\u578b\u533a\u5206RocksDB\u5b9e\u4f8b\uff0c\u800c\u662f\u901a\u8fc7column-family\u533a\u5206\u3002\u5355\u4e2apika\u8282\u70b9\u7684RocksDB\u5b9e\u4f8b\u4e2a\u6570\u6839\u636e\u7269\u7406\u673a\u786c\u4ef6\u914d\u7f6e\u51b3\u5b9a\uff0c\u6bcf\u4e2aRocksDB\u5b9e\u4f8b\u4f7f\u7528\u72ec\u7acb\u7684compaction\u7ebf\u7a0b\u6c60\u548cflush\u7ebf\u7a0b\u6c60\uff0c\u521d\u6b21\u4e4b\u5916\u6bcf\u4e2aRocksDB\u5b9e\u4f8b\u4f7f\u7528\u4e00\u4e2a\u540e\u53f0\u7ebf\u7a0b\uff0c\u8be5\u540e\u53f0\u7ebf\u7a0b\u7528\u6765\u53d1\u8d77manual compaction\u4ee5\u53ca\u5bf9RocksDB\u4e2d\u5b58\u50a8\u7684\u6570\u636e\u8fdb\u884c\u5b9a\u671f\u7684\u7edf\u8ba1\u548c\u5de1\u68c0\u3002"}),"\n",(0,i.jsx)(n.p,{children:"\u6bcf\u4e2a\u8282\u70b9\u5728\u542f\u52a8\u65f6\u83b7\u53d6\u5230\u5f53\u524d\u8282\u70b9\u6301\u6709\u7684\u5206\u7247\uff08\u76ee\u524d\u4e0d\u652f\u6301\uff0c\u9700\u8981\u8fdb\u884c\u4ee3\u7801\u5f00\u53d1\uff09\uff0c\u5c06\u5206\u7247\u6392\u5e8f\u5e76\u7b49\u5206\u4e3aRocksDB\u5b9e\u4f8b\u4e2a\u6570\uff0c\u4fdd\u8bc1\u6bcf\u4e2a\u5206\u7247\u6301\u6709\u7684RocksDB\u5b9e\u4f8b\u4e2a\u6570\u8fd1\u4f3c\u76f8\u540c\u3002"}),"\n",(0,i.jsx)(n.h2,{id:"\u6570\u636e\u683c\u5f0f",children:"\u6570\u636e\u683c\u5f0f"}),"\n",(0,i.jsx)(n.p,{children:"\u4e3a\u4e86\u517c\u5bb9redis\u534f\u8bae\uff0c\u5373\u4e3a\u540c\u4e00\u4e2a\u6570\u636e\u7c7b\u578b\u7684\u6570\u636e\u8bbe\u7f6e\u7edf\u4e00\u7684\u8fc7\u671f\u65f6\u95f4\u503c\uff0c\u590d\u5408\u6570\u636e\u7c7b\u578b\u4e2d\u7684meta\u4fe1\u606f\u8fd8\u662f\u9700\u8981\u4fdd\u7559\uff0c\u5426\u5219ttl/expire\u63a5\u53e3\u64cd\u4f5c\u6027\u80fd\u8017\u65f6\u589e\u52a0\u3002\u589e\u52a0meta\u4fe1\u606f\u5bfc\u81f4\u7684\u6570\u636e\u5199\u5165\u8fc7\u7a0b\u4e2d\u4ea7\u751f\u7684\u67e5\u8be2\u5f00\u9500\uff0c\u8ba1\u5212\u901a\u8fc7\u589e\u52a0\u5185\u5b58cache\u7684\u65b9\u5f0f\u8fdb\u884c\u7f13\u89e3\uff0c\u5373\u8bfbmeta\u65f6\u4e5f\u662f\u4f18\u5148\u8bfb\u5185\u5b58\u7f13\u5b58cache\uff0c\u8bfb\u4e0d\u5230\u518d\u67e5\u786c\u76d8\u3002\u4e0d\u540c\u7684\u6570\u636e\u7c7b\u578b\u6df7\u5408\u4f7f\u7528RocksDB\u5b9e\u4f8b\uff0c\u901a\u8fc7column family\u4e2d\u8fdb\u884c\u533a\u5206\u3002"}),"\n",(0,i.jsx)(n.p,{children:"\u6570\u636e\u5b58\u50a8\u683c\u5f0f\u4e0e\u4e4b\u524d\u7684blackwidow\u57fa\u672c\u76f8\u540c\uff0c\u53ea\u662fkey\uff0cvalue\u589e\u52a0\u4e00\u4e9b\u5b57\u6bb5\u3002"}),"\n",(0,i.jsx)(n.p,{children:"\u5bf9\u4e8ekey\u6765\u8bb2\uff0c\u524d\u7f00\u589e\u52a08\u5b57\u8282\u7684reserve\u4fdd\u7559\u5b57\u6bb5\u4ee5\u53ca4\u5b57\u8282\u7684slotID\uff0c\u540e\u7f00\u589e\u52a016\u5b57\u8282\u7684\u4fdd\u7559\u5b57\u6bb5\u3002"}),"\n",(0,i.jsx)(n.p,{children:"\u5bf9\u4e8evalue\u6765\u8bb2\uff0c\u5728value\u6700\u540e\u7edf\u4e00\u589e\u52a0\uff1a16\u5b57\u8282\u7684\u4fdd\u7559\u5b57\u6bb5\uff0c8\u5b57\u8282\u7684\u6570\u636e\u7684\u5199\u5165\u65f6\u95f4cdate\uff0c8\u5b57\u8282\u7684\u6570\u636e\u8fc7\u671f\u65f6\u95f4\u3002"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"string\u7ed3\u6784"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-c",children:"key\u683c\u5f0f\n| reserve1 | db_id | slot_id | key | reserve2 | \n| 8B | 2B | 2B | | 16B |\n\nvalue\u683c\u5f0f\n| value | reserve | cdate | timestamp | \n| | 16B | 8B | 8B |\n\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"hash\u7ed3\u6784"})}),"\n",(0,i.jsx)(n.p,{children:"meta\u6570\u636e\u683c\u5f0f"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-c",children:"key\u683c\u5f0f\n| reserve1 | db_id | slot_id | key | reserve2 | \n| 8B | 2B | 2B | | 16B |\n\nvalue\u683c\u5f0f\n| hash_size | version | reserve | cdate | timestamp | \n| 4B | 8B | 16B | 8B | 8B |\n\n"})}),"\n",(0,i.jsx)(n.p,{children:"data\u6570\u636e\u683c\u5f0f"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-c",children:"key\u683c\u5f0f\n| reserve1 | db_id | slot_id | key size | key | version | field | reserve2 |\n| 8B | 2B | 2B | 4B | | 8B | | 16B |\n\nvalue\u683c\u5f0f\n| hash value | reserved | cdate |\n| | 16B | 8B | \n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"List\u7ed3\u6784"})}),"\n",(0,i.jsx)(n.p,{children:"meta\u6570\u636e\u683c\u5f0f"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-c",children:"key\u683c\u5f0f\n| reserve1 | db_id | slot_id | key | reserve2 |\n| 8B | 2B | 2B | | 16B |\n\nvalue\u683c\u5f0f\n| list_size | version | left index | right index | reserve | cdate | timestamp | \n| 4B | 8B | 8B | 8B | 16B | 8B | 8B |\n"})}),"\n",(0,i.jsx)(n.p,{children:"data\u6570\u636e\u683c\u5f0f"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-c",children:"key\u683c\u5f0f\n| reserve1 | db_id | slot_id | key size | key | version | index | reserve2 | \n| 8B | 2B | 2B | 4B | | 8B | 8B | 16B |\n\nvalue\u683c\u5f0f\n| value | reserve | cdate |\n| | 16B | 8B | \n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"set\u7ed3\u6784"})}),"\n",(0,i.jsx)(n.p,{children:"meta\u6570\u636e\u683c\u5f0f"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-c",children:"key\u683c\u5f0f\n| reserve1 | db_id | slot_id | key | Reserved2 |\n| 8B | 2B | 2B | | 16B |\n\nvalue\u683c\u5f0f\n| set_size | version | reserve | cdate | timestamp | \n| 4B | 8B | 16B | 8B | 8B |\n\n"})}),"\n",(0,i.jsx)(n.p,{children:"data\u6570\u636e\u683c\u5f0f"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-c",children:"key\u683c\u5f0f\n| reserve1 | db_id | slot_id | key size | key | Version | member | reserve2 |\n| 8B | 2B | 2B | 4B | | 8B | | 16B | \n\nvalue\u683c\u5f0f\n| reserve | cdate |\n| 16B | 8B | \n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"zset\u7ed3\u6784"})}),"\n",(0,i.jsx)(n.p,{children:"meta\u6570\u636e\u683c\u5f0f"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-c",children:"key\u683c\u5f0f\n| reserve1 | db_id | slot_id | key | reserve2 |\n| 8B | 2B | 2B | | 16B | \n\nvalue\u683c\u5f0f\n| zset_size | version | reserved | cdate | timestamp | \n| 4B | 8B | 16B | 8B | 8B |\n\n"})}),"\n",(0,i.jsx)(n.p,{children:"member to score\u6570\u636e\u683c\u5f0f"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-c",children:"key\u683c\u5f0f\n| reserve1 | db_id | slot_id | key size | key | version | Field | reserve2 |\n| 8B | 2B | 2B | 4B | | 8B | | 16B | \n\nvalue\u683c\u5f0f\n| score value | reserve | cdate |\n| 8B | 16B | 8B | \n"})}),"\n",(0,i.jsx)(n.p,{children:"score to member\u6570\u636e\u683c\u5f0f"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-c",children:"key\u683c\u5f0f\n| reserve1 | db_id | slot_id | key size | key | version | score | member | reserve2 |\n| 8B | 2B | 2B | 4B | | 8B | 8B | | 16B |\n\nvalue\u683c\u5f0f\n| reserve | cdate |\n| 16B | 8B | \n"})}),"\n",(0,i.jsx)(n.h2,{id:"\u65e0\u6548\u6570\u636e\u6e05\u7406",children:"\u65e0\u6548\u6570\u636e\u6e05\u7406"}),"\n",(0,i.jsx)(n.p,{children:"\u65e0\u6548\u6570\u636e\u5305\u62ec: 1. \u8bbe\u7f6e\u4e86\u8fc7\u671f\u65f6\u95f4\u4e14\u5df2\u7ecf\u8fc7\u671f\u7684\u6570\u636e. 2. \u4e1a\u52a1\u91cd\u590d\u5199\u5bfc\u81f4\u7684\u76f8\u540ckey\u7684\u8001\u7248\u672c\u6570\u636e\u30023. \u5df2\u7ecf\u8fc1\u51fa\u7684\u5206\u7247\u7684\u65e7\u6570\u636e\u3002\u7531\u4e8e\u5168\u91cf\u6570\u636e\u4fdd\u5b58\u5728RocksDB\u4e2d\uff0c\u56e0\u6b64\u65e0\u6548\u6570\u636e\u7684\u6e05\u7406\u4e3b\u8981\u662f\u901a\u8fc7\u81ea\u5b9a\u4e49\u7684compactionFIlter\u5b9e\u73b0\u3002"}),"\n",(0,i.jsx)(n.p,{children:"\u5bf9\u4e8estring\u7c7b\u578b\u6570\u636e\uff0ccompactionFIlter\u53ea\u9700\u8981\u6bd4\u5bf9value\u4e2d\u7684ttl\u503c\u5373\u53ef\u51b3\u5b9a\u3002\u5bf9\u4e8e\u590d\u6742\u6570\u636e\u7c7b\u578b\uff0c\u7531\u4e8edata\u6570\u636e\u662f\u6309\u7167field\u5355\u72ec\u5b58\u50a8\u800c\u4e14\u6ca1\u6709\u8bbe\u7f6e\u8fc7\u671f\u65f6\u95f4\uff0c\u56e0\u6b64\u5728compaction\u590d\u6742\u6570\u636e\u7c7b\u578b\u7684data\u6570\u636e\u65f6\uff0c\u9700\u8981\u83b7\u53d6meta\u4fe1\u606f\uff0c\u5305\u62eckey\u7684ttl\u4ee5\u53caversion\u3002\u4e3a\u51cf\u5c11compaction\u4e2d\u8bfbRocksDB\u5bfc\u81f4\u7684\u989d\u5916\u78c1\u76d8IO\u5f00\u9500\uff0c\u5c06\u590d\u6742\u6570\u636e\u7c7b\u578b\u7684\u5143\u4fe1\u606f\u7f13\u5b58\u5728\u5185\u5b58\u5b58\u50a8\u5f15\u64ce\u4e2d\u3002"}),"\n",(0,i.jsx)(n.p,{children:"\u5bf9\u4e8e\u5df2\u7ecf\u8fc1\u51fa\u7684\u5206\u7247\u7684\u65e7\u6570\u636e\uff0c\u9700\u8981\u8003\u8651\u5b58\u91cf\u7684\u5df2\u7ecf\u8fc1\u51fa\u7684\u65e0\u6548\u6570\u636e\u7684\u6e05\u7406\uff0c\u540c\u65f6\u8fd8\u8981\u4fdd\u8bc1\u5982\u679c\u8def\u7531\u8868\u518d\u4e00\u6b21\u53d8\u66f4\uff0c\u8fc1\u51fa\u7684\u5206\u7247\u91cd\u65b0\u8fc1\u56de\u5230\u5f53\u524d\u8282\u70b9\u4e4b\u540e\uff0c\u4e4b\u524d\u7684\u65e0\u6548\u6570\u636e\u4e0d\u8981\u88ab\u8bfb\u5230\u3002\u56e0\u6b64\uff0c\u5728\u5206\u7247\u8fc1\u79fb\u5b8c\u6210\u8def\u7531\u8868\u53d1\u751f\u53d8\u66f4\u4e4b\u540e\uff0c\u8fc1\u51fa\u70b9\u8282\u70b9\u5728\u672c\u5730\u78c1\u76d8\u6587\u4ef6\u4e2d\u8bb0\u5f55\u4e00\u4e2a\u8fc1\u51fa\u7684slot_id\uff0c\u5f53\u524d\u7684sequence_number\uff0c\u4ee5\u53ca\u6700\u65b0\u7684RocksDB filenumber\u3002\u5728\u81ea\u5b9a\u4e49\u7684compactionFilter\u6267\u884c\u65f6\uff0c\u4f1a\u53bb\u68c0\u6d4b\u5f53\u524dkey\u662f\u5426\u5c5e\u4e8e\u8be5slot_id\uff0c\u4ee5\u53casequence_number\u662f\u5426\u5c0f\u4e8e\u8bb0\u5f55\u7684sequence_number\uff0c\u53ea\u6709\u4e24\u4e2a\u6761\u4ef6\u90fd\u6ee1\u8db3\uff0c\u624d\u8ba4\u4e3a\u8fd9\u662f\u6570\u636e\u662f\u65e0\u6548\u6570\u636e\uff0c\u624d\u53ef\u4ee5\u5c06\u6570\u636e\u6e05\u9664\u6389\u3002\u5bf9\u4e8e\u5ba2\u6237\u7aef\u7684\u8bfb\u8bf7\u6c42\u548c\u904d\u5386\u8bf7\u6c42\uff0c\u5728\u8bfb\u51fa\u6570\u636e\u4e4b\u540e\u4e5f\u8981\u6bd4\u5bf9\u662f\u5426\u5c5e\u4e8e\u65e0\u6548\u6570\u636e\u3002\u5224\u65ad\u65b9\u5f0f\u540c\u7406\uff0c\u4e5f\u662f\u6bd4\u5bf9\u8bb0\u5f55\u7684slot_id, sequence_number\uff0c\u4ee5\u53caRocksDB filenumber\u3002"}),"\n",(0,i.jsx)(n.p,{children:"\u65e0\u6548\u6570\u636e\u6e05\u7406\u7684\u89e6\u53d1\u89c4\u5219\u5206\u4e3a\u4e24\u4e2a\uff0c\u4e00\u4e2a\u662fRocksDB\u7684auto compaction\u3002\u53e6\u4e00\u4e2a\u662fpika\u53d1\u8d77\u7684manual compaction\u3002"}),"\n",(0,i.jsx)(n.p,{children:"\u4e3a\u51cf\u5c11manual compaction\u5bf9\u5728\u7ebf\u670d\u52a1\u7684\u5f71\u54cd\uff0cmanual compaction\u7684\u6267\u884c\u9700\u8981\u6ee1\u8db3\u4e24\u4e2a\u6761\u4ef6\uff1a1. \u81ea\u5b9a\u4e49\u89e6\u53d1\u65f6\u95f4\u6bb5\u548c\u89e6\u53d1\u95f4\u9694\uff0c\u5982\u6bcf\u9694\u4e24\u5929\u6267\u884c\u4e00\u6b21\uff0c\u6267\u884c\u65f6\u95f4\u6307\u5b9a\u5728\u51cc\u6668\u4f4e\u5cf0\u671f\u30022. \u9650\u5236\u6bcf\u6b21\u6267\u884ccompaction\u7684\u6570\u636e\u91cf\uff0c\u9632\u6b62manual compaction\u6267\u884c\u65f6\u95f4\u8fc7\u957f\u963b\u585eauto compaction\u3002"}),"\n",(0,i.jsx)(n.h2,{id:"rocksdb\u4f7f\u7528\u4f18\u5316",children:"RocksDB\u4f7f\u7528\u4f18\u5316"}),"\n",(0,i.jsx)(n.h3,{id:"blobdb\u4f7f\u7528\u4f18\u5316",children:"blobdb\u4f7f\u7528\u4f18\u5316"}),"\n",(0,i.jsx)(n.p,{children:"RocksDB\u652f\u6301\u4e86key-value\u5206\u79bb\u7684\u5b9e\u73b0\uff0c\u5373\u901a\u8fc7\u5c06\u5927value\u5b58\u50a8\u5230blob\u6587\u4ef6\u4e2d\uff0c\u5728sst\u6587\u4ef6\u4e2d\u5b58\u50a8\u5927value\u5728blob\u6587\u4ef6\u7684\u7d22\u5f15\u4fe1\u606f\uff0c\u4ece\u800c\u51cf\u5c11\u5199\u5199\u653e\u5927\uff0c\u6709\u6548\u63d0\u5347\u5927value\u573a\u666f\u4e0b\u7684\u5199\u5165\u6027\u80fd\u3002pika\u4f9d\u8d56\u81ea\u5b9a\u4e49\u7684compactionFilter\u5b9e\u73b0\u8fc7\u671f\u6570\u636e\u7684\u5904\u7406\uff0cttl\u5b58\u50a8\u5728value\u4e2d\uff0c\u56e0\u6b64\u5728compaction\u8fc7\u7a0b\u4e2d\u4e0d\u53ef\u907f\u514d\u5bfc\u81f4\u989d\u5916\u7684blob\u6587\u4ef6IO\u3002\u4e00\u79cd\u65b9\u6cd5\u662f\u4fee\u6539sst\u6587\u4ef6\u4e2d\u5b58\u50a8\u7684blobindex\uff0c\u5728blobindex\u7684\u76f8\u540coffset\u4f4d\u7f6e\u5b58\u50a8value\u7684ttl\u503c\uff0c\u8fd9\u6837compaction\u8fc7\u7a0b\u4e2d\u5bf9\u8fc7\u671f\u6570\u636e\u7684\u6e05\u7406\u7684\u903b\u8f91\uff0c\u5c31\u4e0d\u9700\u8981\u67e5\u8be2blob\u6587\u4ef6\uff0c\u51cf\u5c11\u989d\u5916\u7684\u78c1\u76d8IO\u3002"}),"\n",(0,i.jsx)(n.h2,{id:"dealslowkey",children:"dealslowkey"}),"\n",(0,i.jsx)(n.p,{children:"\u53c2\u8003\u65b0\u6d6a\u5fae\u535a\u7684\u7ecf\u9a8c\uff0c\u5f53pika\u4e0a\u5c42\u4ee3\u7801\u53d1\u73b0\u4e00\u4e2a\u6162\u67e5\u8be2key\u65f6\uff0c\u53d1\u8d77\u4e00\u6b21manual compaction\uff0ccompaction\u7684\u8303\u56f4\u5373\u5bf9\u5e94\u7684key\u524d\u7f00\u5bf9\u5e94\u7684\u6570\u636e\u8303\u56f4\u3002\u6027\u80fd\u5f85\u9a8c\u8bc1\u3002"}),"\n",(0,i.jsx)(n.h3,{id:"compact\u8001\u7684sst\u6587\u4ef6",children:"compact\u8001\u7684sst\u6587\u4ef6"}),"\n",(0,i.jsxs)(n.p,{children:["\u53c2\u8003\u65b0\u6d6a\u5fae\u535a\u7684\u7ecf\u9a8c\uff0c\u5b9a\u671f\u5bf9\u6700\u8001\u7684sst\u6587\u4ef6\u8fdb\u884ccompaction\u53ef\u660e\u663e\u63d0\u5347\u96c6\u7fa4\u6027\u80fd\u3002\u770b\u5b98\u65b9\u6587\u6863\uff0c\u8c8c\u4f3c\u7c7b\u4f3c\u7684\u529f\u80fdRocksDB\u5df2\u7ecf\u652f\u6301\uff0c\u94fe\u63a5\u5982\u4e0b\uff1a",(0,i.jsx)(n.a,{href:"https://github.com/facebook/rocksdb/wiki/Leveled-Compaction#ttl%E3%80%82%E8%AE%A1%E5%88%92%E4%BD%BF%E7%94%A8RocksDB%E5%AE%98%E6%96%B9%E7%9A%84%E5%AE%9E%E7%8E%B0%E3%80%82",children:"https://github.com/facebook/rocksdb/wiki/Leveled-Compaction#ttl\u3002\u8ba1\u5212\u4f7f\u7528RocksDB\u5b98\u65b9\u7684\u5b9e\u73b0\u3002"})]}),"\n",(0,i.jsx)(n.h2,{id:"\u65b0\u6280\u672f\u63a2\u7d22",children:"\u65b0\u6280\u672f\u63a2\u7d22"}),"\n",(0,i.jsx)(n.p,{children:"\u4e3b\u8981\u662f\u5305\u62ec\u4e86RocksDB\u7684\u5f02\u6b65IO\uff0c\u534f\u7a0b\uff0cremote compaction\u7b49\u65b0\u6280\u672f\u7684\u6d4b\u8bd5\u548c\u843d\u5730\u3002"})]})}function B(e={}){const{wrapper:n}={...(0,c.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>l,x:()=>t});var i=s(6540);const c={},r=i.createContext(c);function l(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function t(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:l(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/8cf6d7a7.10b5258b.js b/build/assets/js/8cf6d7a7.10b5258b.js new file mode 100644 index 0000000..7851af0 --- /dev/null +++ b/build/assets/js/8cf6d7a7.10b5258b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[6871],{4538:(i,n,e)=>{e.r(n),e.d(n,{assets:()=>r,contentTitle:()=>s,default:()=>d,frontMatter:()=>a,metadata:()=>o,toc:()=>c});var t=e(4848),l=e(8453);const a={title:"What's new in Pika v3.5.1",slug:"Pika-3.5.1",authors:[{name:"\u4e8e\u96e8",title:"dubbo-go\u5f00\u6e90\u793e\u533a"}],hide_table_of_contents:!1},s=void 0,o={permalink:"/blog/Pika-3.5.1",source:"@site/blog/2023-09-28-Pika-3.5.1.md",title:"What's new in Pika v3.5.1",description:"Pika \u793e\u533a\u5f88\u9ad8\u5174\u5ba3\u5e03\uff0c\u6211\u4eec\u4eca\u5929\u53d1\u5e03\u5df2\u7ecf\u8fc7\u6211\u4eec\u751f\u4ea7\u73af\u5883\u9a8c\u8bc1 v3.5.1 \u7248\u672c https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.1 \u3002",date:"2023-09-28T00:00:00.000Z",tags:[],readingTime:4.385,hasTruncateMarker:!1,authors:[{name:"\u4e8e\u96e8",title:"dubbo-go\u5f00\u6e90\u793e\u533a"}],frontMatter:{title:"What's new in Pika v3.5.1",slug:"Pika-3.5.1",authors:[{name:"\u4e8e\u96e8",title:"dubbo-go\u5f00\u6e90\u793e\u533a"}],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"What's new in Pika v3.5.0",permalink:"/blog/Pika-3.5.0"},nextItem:{title:"What's new in Pika v3.5.0",permalink:"/blog/Pika-3.5.0"}},r={authorsImageUrls:[void 0]},c=[{value:"\u65b0\u7279\u6027",id:"\u65b0\u7279\u6027",level:2},{value:"2 bug \u4fee\u590d",id:"2-bug-\u4fee\u590d",level:2},{value:"3 \u4f7f\u7528\u5efa\u8bae",id:"3-\u4f7f\u7528\u5efa\u8bae",level:2}];function h(i){const n={a:"a",h2:"h2",img:"img",li:"li",p:"p",ul:"ul",...(0,l.R)(),...i.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.p,{children:["Pika \u793e\u533a\u5f88\u9ad8\u5174\u5ba3\u5e03\uff0c\u6211\u4eec\u4eca\u5929\u53d1\u5e03\u5df2\u7ecf\u8fc7\u6211\u4eec\u751f\u4ea7\u73af\u5883\u9a8c\u8bc1 v3.5.1 \u7248\u672c ",(0,t.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.1",children:"https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.1"})," \u3002"]}),"\n",(0,t.jsx)(n.p,{children:"\u8be5\u7248\u672c\u4e0d\u4ec5\u505a\u4e86\u5f88\u591a\u4f18\u5316\u5de5\u4f5c\uff0c\u8fd8\u5f15\u5165\u4e86\u591a\u9879\u65b0\u529f\u80fd\u3002\u8fd9\u4e9b\u65b0\u529f\u80fd\u5305\u62ec \u52a8\u6001\u5173\u95ed WAL\u3001ReplicationID \u68c0\u6d4b\u662f\u5426\u589e\u91cf\u590d\u5236\u3001\u5728 K8s \u73af\u5883\u4e0a Pika \u670d\u52a1\u7684\u81ea\u52a8\u6ce8\u518c\u4ece\u800c\u5b9e\u73b0\u96c6\u7fa4\u7684\u81ea\u7ec4\u7ec7\u3001\u4ee5\u53ca exporter \u68c0\u6d4b\u96c6\u7fa4\u6307\u6807\u7b49\u7b49\uff0c\u65e0\u7591\u5c06\u4f1a\u8ba9\u7528\u6237\u4eab\u53d7\u5230\u66f4\u4e3a\u7a33\u5b9a\u548c\u9ad8\u6548\u7684 NoSQL \u4f7f\u7528\u4f53\u9a8c\u3002"}),"\n",(0,t.jsx)(n.h2,{id:"\u65b0\u7279\u6027",children:"\u65b0\u7279\u6027"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"1 Slow log \u589e\u52a0\u961f\u5217\u7b49\u5f85\u65f6\u95f4\u7edf\u8ba1\uff0c\u5728\u961f\u5217\u963b\u585e\u7684\u65f6\u5019\u65b9\u4fbf\u6211\u4eec\u8fdb\u884c\u95ee\u9898\u5b9a\u4f4d\u3002PR 1997\uff0c \u4f5c\u8005 wangshao1\u3002"}),"\n",(0,t.jsx)(n.li,{children:"2 \u4e3b\u4ece\u590d\u5236\u4f7f\u7528 ReplicationID \u5224\u65ad\u662f\u5426\u8fdb\u884c\u589e\u91cf\u540c\u6b65\uff0c\u89e3\u51b3\u539f\u4e3b\u4ece\u540c\u6b65\u65b9\u5f0f\u5207\u4e3b\u540e\u6574\u4e2a\u6570\u636e\u96c6\u4f1a\u8fdb\u884c\u5168\u91cf\u590d\u5236\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u63d0\u5347 Pika \u6027\u80fd\u3002PR 1951\uff0c \u4f5c\u8005 Mixficsol\u3002"}),"\n",(0,t.jsx)(n.li,{children:"3 WAL \u4ee5 'disablewal' \u547d\u4ee4\u65b9\u5f0f\u652f\u6301\u52a8\u6001\u5173\u95ed\uff0c\u5728\u5199\u6027\u80fd\u9047\u5230\u74f6\u9888\u7684\u65f6\u5019\uff0c\u53ef\u4ee5\u901a\u8fc7\u547d\u4ee4\u5173\u95ed WAL \u7f13\u89e3\u5199\u6027\u80fd\u4e0b\u964d\u7684\u95ee\u9898\uff0c\u5173\u95ed WAL \u6709\u673a\u5668\u5b95\u673a\u540e\u4e22\u5931\u6570\u636e\u7684\u98ce\u9669\uff0c\u7528\u6237\u9700\u8981\u6839\u636e\u81ea\u5df1\u7684\u4f7f\u7528\u4e60\u60ef\u6743\u8861\u3002PR 2015\uff0c\u4f5c\u8005 Mixficsol\u3002"}),"\n",(0,t.jsx)(n.li,{children:"4 flush \u7ebf\u7a0b\u6570\u548c compaction \u7ebf\u7a0b\u6570\u5408\u4e8c\u4e3a\u4e00\uff0c\u5728 Compaction \u6027\u80fd\u74f6\u9888\u65f6\uff0c\u53ef\u4ee5\u52a8\u6001\u8c03\u6574\u7ebf\u7a0b\u6570\uff0c\u7f13\u89e3 Comapction \u635f\u8017 Pika \u6027\u80fd\u7684\u95ee\u9898\u3002PR 2014\uff0c \u4f5c\u8005 Tianpingan\u3002"}),"\n",(0,t.jsx)(n.li,{children:"5 \u5347\u7ea7\u4e86 RocksDB \u7248\u672c\u5230 v8.3.3\u3002PR 2000\uff0c \u4f5c\u8005 dingxiaoshuai123\u3002"}),"\n",(0,t.jsx)(n.li,{children:"6 \u65b0\u589e\u5468\u671f\u6027\u6253\u5370\u5de5\u4f5c\u961f\u5217\u7684\u957f\u5ea6\u529f\u80fd\uff0c\u5728\u961f\u5217\u963b\u585e\u7684\u65f6\u5019\u53ef\u4ee5\u5feb\u901f\u5b9a\u4f4d\u95ee\u9898\u3002PR 1978\uff0c \u4f5c\u8005 Tianpingan\u3002"}),"\n",(0,t.jsx)(n.li,{children:"7 \u65b0\u589e\u5229\u7528\u4e00\u4e2a pika_exporter \u76d1\u6d4b\u6574\u4e2a\u96c6\u7fa4\u7684\u6307\u6807\uff0c\u5b9e\u73b0\u4e00\u4e2a Pika Exporter \u5b9e\u4f8b\u76d1\u63a7\u6574\u4e2a\u96c6\u7fa4\uff0c\u89e3\u51b3\u4e86 3.5.0 \u7248\u672c\u4e00\u4e2a Pika Exporter \u76d1\u6d4b\u4e00\u4e2a Pika \u5b9e\u4f8b\u6d88\u8017\u8d44\u6e90\u7684\u95ee\u9898\u3002PR 1953\uff0c \u4f5c\u8005 chenbt-hz\u3002"}),"\n",(0,t.jsx)(n.li,{children:"8 \u5b9e\u73b0\u5728 K8s \u73af\u5883\u4e0a Pika \u670d\u52a1\u7684\u81ea\u52a8\u6ce8\u518c\uff0c\u5728\u542f\u52a8\u65f6\u81ea\u52a8\u6ce8\u518c\uff0c\u4ece\u800c\u5b9e\u73b0\u96c6\u7fa4\u7684\u81ea\u7ec4\u7ec7 \uff0c\u5b9e\u73b0\u4e86\u901a\u8fc7\u547d\u4ee4\u62c9\u8d77\u6574\u4e2a Pika Cluster \u96c6\u7fa4\u3002PR 1931\uff0c \u4f5c\u8005 machinly\u3002"}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"2-bug-\u4fee\u590d",children:"2 bug \u4fee\u590d"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"1 \u8c03\u6574\u4e86 Rate_limit \u53c2\u6570\uff0c\u4fee\u590d\u4e86\u538b\u6d4b\u65f6\u51fa\u73b0 RPS \u4e3a 0 \u7684\u60c5\u51b5 \u3002PR 2009\uff0c \u4f5c\u8005 Mixficsol\u3002"}),"\n",(0,t.jsx)(n.li,{children:"2 \u4fee\u590d\u4e86 INFODATA \u547d\u4ee4\u4e2d\u5bf9\u4e8e\u904d\u5386\u6570\u636e\u6587\u4ef6\u65f6\u51fa\u73b0\u7a7a\u8def\u5f84\u7684\u903b\u8f91\u5224\u65ad\u3002PR 1996\uff0c \u4f5c\u8005 Mixficsol\u3002"}),"\n",(0,t.jsx)(n.li,{children:"3 \u4fee\u590d\u4e86 Codis \u5728\u7ebf\u4e0a\u51fa\u73b0\u5927\u6bdb\u523a\u7684\u95ee\u9898\u3002PR 2016\uff0c \u4f5c\u8005 chejinge\u3002"}),"\n",(0,t.jsx)(n.li,{children:"4 \u4fee\u590d\u4e86 macOS \u73af\u5883\u4e0b\u7f16\u8bd1\u4f7f\u7528 tools \u5bfc\u81f4\u7f16\u8bd1\u4e0d\u8fc7\u7684\u95ee\u9898 \u3002PR 2011\uff0c \u4f5c\u8005 A2ureStone\u3002"}),"\n",(0,t.jsx)(n.li,{children:"5 \u51cf\u5c11\u4e86 exporter \u975e\u5fc5\u8981\u65e5\u5fd7\u7684\u6253\u5370\uff0c\u964d\u4f4e \u4e86\u8d44\u6e90\u5229\u7528\u7387\u3002PR 1945\uff0c \u4f5c\u8005 Mixficsol\u3002"}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"3-\u4f7f\u7528\u5efa\u8bae",children:"3 \u4f7f\u7528\u5efa\u8bae"}),"\n",(0,t.jsx)(n.p,{children:"\u672c\u6b21\u65b0\u589e\u4e86\u51e0\u4e2a\u914d\u7f6e\u53c2\u6570\uff0c\u5927\u5bb6\u5728\u4f7f\u7528\u8fc7\u7a0b\u4e2d\uff0c\u9700\u8981\u6839\u636e\u4f7f\u7528\u60c5\u51b5\u6309\u9700\u8c03\u6574\uff1a"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"1 max-rsync-parallel-num\uff1a\u4e3b\u4ece\u5168\u91cf\u590d\u5236\u7ebf\u7a0b\u6570\uff0c\u9700\u8981\u6839\u636e\u81ea\u5df1\u673a\u5668 CPU \u6838\u6570\u548c\u90e8\u7f72\u5b9e\u4f8b\u4e2a\u6570\u8fdb\u884c\u8c03\u6574\uff0c\u5efa\u8bae\u6700\u5c0f\u8bbe\u7f6e\u4e3a 2\u3002"}),"\n",(0,t.jsx)(n.li,{children:"2 rate-limiter-bandwidth: \u9650\u5236 RocksDB \u6570\u636e\u5e93\u8bfb\u5199\u901f\u5ea6\uff0c\u9650\u5236\u6570\u636e\u5e93\u5728\u4e00\u5b9a\u65f6\u95f4\u5185\u53ef\u4ee5\u8bfb\u5199\u7684\u6570\u636e\u91cf\uff0c\u9ed8\u8ba4 2000MiB/s\uff0c\u9700\u8981\u6839\u636e\u81ea\u5df1\u7684\u673a\u5668\u6027\u80fd\u548c\u90e8\u7f72\u5b9e\u4f8b\u505a\u8c03\u6574\u3002"}),"\n",(0,t.jsx)(n.li,{children:"max-background-jobs: compaction \u548c flushdb \u7ebf\u7a0b\u6570\uff0c\u8981\u6839\u636e\u81ea\u5df1\u673a\u5668 CPU \u6838\u6570\u548c\u90e8\u7f72\u5b9e\u4f8b\u4e2a\u6570\u8fdb\u884c\u8c03\u6574\uff0c\u5efa\u8bae\u6700\u5c0f\u8bbe\u7f6e\u4e3a 4\u3002"}),"\n",(0,t.jsx)(n.li,{children:"3 throttle-bytes-per-second: \u4e3b\u4ece\u590d\u5236\u4f20\u8f93\u9650\u901f\u53c2\u6570\uff0c\u9ed8\u8ba4\u4e3a 200MiB/s\uff0c\u8be5\u53c2\u6570\u53ef\u4ee5\u6839\u636e\u673a\u5668\u7f51\u5361\u7684\u914d\u7f6e\u53ca\u90e8\u7f72 pika \u5b9e\u4f8b\u7684\u4e2a\u6570\u8fdb\u884c\u8c03\u6574\u3002"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"2023-09-28-Pika-3.5.1-connect.png",src:e(2312).A+"",width:"644",height:"271"})})]})}function d(i={}){const{wrapper:n}={...(0,l.R)(),...i.components};return n?(0,t.jsx)(n,{...i,children:(0,t.jsx)(h,{...i})}):h(i)}},2312:(i,n,e)=>{e.d(n,{A:()=>t});const t=e.p+"assets/images/2023-09-28-Pika-3.5.1-connect-65452ee30b0e2dff6c5affd2ee5406a1.png"},8453:(i,n,e)=>{e.d(n,{R:()=>s,x:()=>o});var t=e(6540);const l={},a=t.createContext(l);function s(i){const n=t.useContext(a);return t.useMemo((function(){return"function"==typeof i?i(n):{...n,...i}}),[n,i])}function o(i){let n;return n=i.disableParentContext?"function"==typeof i.components?i.components(l):i.components||l:s(i.components),t.createElement(a.Provider,{value:n},i.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/8d7aab24.d707aca5.js b/build/assets/js/8d7aab24.d707aca5.js new file mode 100644 index 0000000..8b1c391 --- /dev/null +++ b/build/assets/js/8d7aab24.d707aca5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[5496],{7542:(t,e,i)=>{i.r(e),i.d(e,{assets:()=>c,contentTitle:()=>s,default:()=>l,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var n=i(4848),o=i(8453);const r={title:"Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0",sidebar_position:17},s=void 0,a={id:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/index",title:"Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0",description:"",source:"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/index.md",sourceDirName:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0",slug:"/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/index.md",tags:[],version:"current",sidebarPosition:17,frontMatter:{title:"Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0",sidebar_position:17},sidebar:"tutorialSidebar",previous:{title:"\u65b0\u5b58\u50a8\u7ed3\u6784\uff1a\u8be6\u7ec6\u89e3\u6790",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65b0\u5b58\u50a8\u65b9\u6848\uff1a\u8be6\u7ec6\u89e3\u6790/"},next:{title:"\u901a\u4fe1\u548c\u7ebf\u7a0b\u6a21\u578b",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/\u901a\u4fe1\u548c\u7ebf\u7a0b\u6a21\u578b/"}},c={},d=[];function u(t){return(0,n.jsx)(n.Fragment,{})}function l(t={}){const{wrapper:e}={...(0,o.R)(),...t.components};return e?(0,n.jsx)(e,{...t,children:(0,n.jsx)(u,{...t})}):u()}},8453:(t,e,i)=>{i.d(e,{R:()=>s,x:()=>a});var n=i(6540);const o={},r=n.createContext(o);function s(t){const e=n.useContext(r);return n.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function a(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(o):t.components||o:s(t.components),n.createElement(r.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/937cdc77.685ed5fa.js b/build/assets/js/937cdc77.685ed5fa.js new file mode 100644 index 0000000..cd061c1 --- /dev/null +++ b/build/assets/js/937cdc77.685ed5fa.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[9044],{3789:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>o,contentTitle:()=>c,default:()=>u,frontMatter:()=>r,metadata:()=>l,toc:()=>d});var t=i(4848),s=i(8453);const r={title:"\u5feb\u7167\u5f0f\u5907\u4efd",sidebar_position:12},c=void 0,l={id:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u5feb\u7167\u5f0f\u5907\u4efd/index",title:"\u5feb\u7167\u5f0f\u5907\u4efd",description:"\u539f\u7406",source:"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u5feb\u7167\u5f0f\u5907\u4efd/index.md",sourceDirName:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u5feb\u7167\u5f0f\u5907\u4efd",slug:"/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u5feb\u7167\u5f0f\u5907\u4efd/",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u5feb\u7167\u5f0f\u5907\u4efd/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u5feb\u7167\u5f0f\u5907\u4efd/index.md",tags:[],version:"current",sidebarPosition:12,frontMatter:{title:"\u5feb\u7167\u5f0f\u5907\u4efd",sidebar_position:12},sidebar:"tutorialSidebar",previous:{title:"Pika \u4e0e Codis",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4e0e Codis/"},next:{title:"NoSQL \u539f\u7406\u6982\u8ff0",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/NoSQL \u539f\u7406\u6982\u8ff0/"}},o={},d=[{value:"\u539f\u7406",id:"\u539f\u7406",level:2},{value:"\u6d41\u7a0b",id:"\u6d41\u7a0b",level:2},{value:"\u5feb\u7167\u5185\u5bb9",id:"\u5feb\u7167\u5185\u5bb9",level:2}];function a(e){const n={h2:"h2",img:"img",li:"li",p:"p",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h2,{id:"\u539f\u7406",children:"\u539f\u7406"}),"\n",(0,t.jsx)(n.p,{children:"\u4e0d\u540c\u4e8e Redis\uff0cPika \u7684\u6570\u636e\u4e3b\u8981\u5b58\u50a8\u5728\u78c1\u76d8\u4e2d\uff0c\u8fd9\u5c31\u4f7f\u5f97\u5176\u5728\u505a\u6570\u636e\u5907\u4efd\u65f6\u6709\u5929\u7136\u7684\u4f18\u52bf\uff0c\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7\u6587\u4ef6\u62f7\u8d1d\u5b9e\u73b0 \u5b9e\u73b0"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{src:"https://camo.githubusercontent.com/3dd59576cdef9a74b8b15f43e636621b5e617e5085ccf0f1989b26ae567db74e/687474703a2f2f7777342e73696e61696d672e636e2f6c617267652f633263643433303767773166366d373435637378736a3230666c30696f6a73732e6a7067",alt:""})}),"\n",(0,t.jsx)(n.h2,{id:"\u6d41\u7a0b",children:"\u6d41\u7a0b"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"\u6253\u5feb\u7167\uff1a\u963b\u5199(\u963b\u6b62\u5ba2\u6237\u7aef\u8fdb\u884c\u5199 db \u64cd\u4f5c)\uff0c\u5e76\u5728\u8fd9\u4e2a\u8fc7\u7a0b\u4e2d\u83b7\u53d6\u5feb\u7167\u5185\u5bb9"}),"\n",(0,t.jsx)(n.li,{children:"\u5f02\u6b65\u7ebf\u7a0b\u62f7\u8d1d\u6587\u4ef6\uff1a\u901a\u8fc7\u4fee\u6539 Rocksdb \u63d0\u4f9b\u7684 BackupEngine \u62f7\u8d1d\u5feb\u7167\u4e2d\u6587\u4ef6\uff0c\u8fd9\u4e2a\u8fc7\u7a0b\u4e2d\u4f1a\u963b\u6b62\u6587\u4ef6\u7684\u5220\u9664"}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"\u5feb\u7167\u5185\u5bb9",children:"\u5feb\u7167\u5185\u5bb9"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"\u5f53\u524d db \u7684\u6240\u6709\u6587\u4ef6\u540d"}),"\n",(0,t.jsx)(n.li,{children:"manifest \u6587\u4ef6\u5927\u5c0f"}),"\n",(0,t.jsx)(n.li,{children:"sequence_number"}),"\n",(0,t.jsxs)(n.li,{children:["\u540c\u6b65\u70b9","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"binlog filenum"}),"\n",(0,t.jsx)(n.li,{children:"offset"}),"\n"]}),"\n"]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>c,x:()=>l});var t=i(6540);const s={},r=t.createContext(s);function c(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:c(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/94717405.3af1cfa9.js b/build/assets/js/94717405.3af1cfa9.js new file mode 100644 index 0000000..ca6403f --- /dev/null +++ b/build/assets/js/94717405.3af1cfa9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[6824],{1510:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>t,contentTitle:()=>r,default:()=>h,frontMatter:()=>l,metadata:()=>a,toc:()=>o});var n=s(4848),d=s(8453);const l={title:"FAQ",sidebar_position:3},r=void 0,a={id:"\u5e8f\u8a00/FAQ/index",title:"FAQ",description:"1 \u7f16\u8bd1\u5b89\u88c5",source:"@site/docs/\u5e8f\u8a00/FAQ/index.md",sourceDirName:"\u5e8f\u8a00/FAQ",slug:"/\u5e8f\u8a00/FAQ/",permalink:"/docs/\u5e8f\u8a00/FAQ/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u5e8f\u8a00/FAQ/index.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{title:"FAQ",sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"\u652f\u6301\u7684 Redis \u63a5\u53e3\u4e0e\u517c\u5bb9\u60c5\u51b5",permalink:"/docs/\u5e8f\u8a00/\u652f\u6301\u7684 Redis \u63a5\u53e3\u4e0e\u517c\u5bb9\u60c5\u51b5/"},next:{title:"\u4f7f\u7528\u4e0e\u8fd0\u7ef4",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/"}},t={},o=[{value:"1 \u7f16\u8bd1\u5b89\u88c5",id:"1-\u7f16\u8bd1\u5b89\u88c5",level:3},{value:"Q1: \u652f\u6301\u7684\u7cfb\u7edf\uff1f",id:"q1-\u652f\u6301\u7684\u7cfb\u7edf",level:4},{value:"Q2: \u600e\u4e48\u7f16\u8bd1\u5b89\u88c5\uff1f",id:"q2-\u600e\u4e48\u7f16\u8bd1\u5b89\u88c5",level:4},{value:"Q3\uff1a Ubuntu \u7f16\u8bd1\u5076\u5c14\u62a5\u9519 isnan isinf was not declared\uff1f",id:"q3-ubuntu-\u7f16\u8bd1\u5076\u5c14\u62a5\u9519-isnan-isinf-was-not-declared",level:4},{value:"2 \u8bbe\u8ba1\u4e0e\u5b9e\u73b0",id:"2-\u8bbe\u8ba1\u4e0e\u5b9e\u73b0",level:3},{value:"Q1: \u4e3a\u4ec0\u4e48\u8981\u5f00\u90a3\u4e48\u591a\u7ebf\u7a0b\uff1f\u6bd4\u5982 purge\uff0c\u641e\u4e2a\u5b9a\u65f6\u4efb\u52a1\u4e0d\u5c31\u597d\u4e86\u3002\u96be\u9053\u7f16\u7a0b\u6846\u67b6\u4e0d\u652f\u6301\u5b9a\u65f6\u5668\uff1f",id:"q1-\u4e3a\u4ec0\u4e48\u8981\u5f00\u90a3\u4e48\u591a\u7ebf\u7a0b\u6bd4\u5982-purge\u641e\u4e2a\u5b9a\u65f6\u4efb\u52a1\u4e0d\u5c31\u597d\u4e86\u96be\u9053\u7f16\u7a0b\u6846\u67b6\u4e0d\u652f\u6301\u5b9a\u65f6\u5668",level:4},{value:"Q2: heartbeat \u8ba9 sender \u505a\u4e0d\u5c31\u597d\u4e86\uff1f\u6216\u8005\u8bf4 sender \u6709\u5fc5\u8981\u90a3\u4e48\u591a\u7ebf\u7a0b\u5417\uff1f",id:"q2-heartbeat-\u8ba9-sender-\u505a\u4e0d\u5c31\u597d\u4e86\u6216\u8005\u8bf4-sender-\u6709\u5fc5\u8981\u90a3\u4e48\u591a\u7ebf\u7a0b\u5417",level:4},{value:"Q3: nemo \u5b58\u50a8 hash \u7684\u5b9e\u9645 key\uff0c\u7b2c\u4e00\u4e2a\u5b57\u8282\u662f\uff1fheader\uff1f\u4e00\u4e2a\u7c7b\u578b\u6807\u8bb0\uff1f\u662f\u8bf4\u4ed6\u662f\u4e2a hash \u7c7b\u578b\uff1f",id:"q3-nemo-\u5b58\u50a8-hash-\u7684\u5b9e\u9645-key\u7b2c\u4e00\u4e2a\u5b57\u8282\u662fheader\u4e00\u4e2a\u7c7b\u578b\u6807\u8bb0\u662f\u8bf4\u4ed6\u662f\u4e2a-hash-\u7c7b\u578b",level:4},{value:"Q4: list \u6570\u636e\u7ed3\u6784\u91cc\u9762\u7684 curr_seq \u662f\u4e2a\u4ec0\u4e48\u4e1c\u897f\uff1f",id:"q4-list-\u6570\u636e\u7ed3\u6784\u91cc\u9762\u7684-curr_seq-\u662f\u4e2a\u4ec0\u4e48\u4e1c\u897f",level:4},{value:"Q5: binlog \u91cc\u9762\u5b58\u50a8\u7684\u662f\u8f6c\u5316\u540e\u7684 put\uff0cdelete\uff1f\u8fd8\u662f\u5b58\u50a8\u7684\u539f\u751f redis \u547d\u4ee4\uff1f",id:"q5-binlog-\u91cc\u9762\u5b58\u50a8\u7684\u662f\u8f6c\u5316\u540e\u7684-putdelete\u8fd8\u662f\u5b58\u50a8\u7684\u539f\u751f-redis-\u547d\u4ee4",level:4},{value:"Q6: rsync \u7684 deamon \u6a21\u5f0f\uff0c\u8fd9\u4e2a rsync \u662f linux \u4e0a\u7684 rsync \u547d\u4ee4\uff1f",id:"q6-rsync-\u7684-deamon-\u6a21\u5f0f\u8fd9\u4e2a-rsync-\u662f-linux-\u4e0a\u7684-rsync-\u547d\u4ee4",level:4},{value:"Q7: dump db \u6587\u4ef6\u662f rocksdb \u672c\u8eab\u5c31\u5e26\u7684\u529f\u80fd\uff1f\u5177\u4f53\u600e\u4e48\u641e\u7684\uff1f",id:"q7-dump-db-\u6587\u4ef6\u662f-rocksdb-\u672c\u8eab\u5c31\u5e26\u7684\u529f\u80fd\u5177\u4f53\u600e\u4e48\u641e\u7684",level:4},{value:"Q8: \u5148\u5199 binlog \u518d\u6267\u884c\uff0c\u5982\u679c\u8fd9\u65f6\u5019\u6302\u4e86\uff0c\u547d\u4ee4\u8fd8\u6ca1\u6267\u884c\uff0c\u4f46\u662f\u5199\u5165\u5230 binlog \u91cc\u9762\u4e86\u600e\u4e48\u529e\uff1f",id:"q8-\u5148\u5199-binlog-\u518d\u6267\u884c\u5982\u679c\u8fd9\u65f6\u5019\u6302\u4e86\u547d\u4ee4\u8fd8\u6ca1\u6267\u884c\u4f46\u662f\u5199\u5165\u5230-binlog-\u91cc\u9762\u4e86\u600e\u4e48\u529e",level:4},{value:"Q9: BinlogBGWorker \u7ebf\u7a0b\u4e4b\u95f4\u8fd8\u662f\u8981\u6309\u7167 binlog \u987a\u5e8f\u6267\u884c\uff0c\u8fd9\u5757\u5e76\u53d1\u80fd\u63d0\u9ad8\u591a\u5c11\u6027\u80fd\uff1f",id:"q9-binlogbgworker-\u7ebf\u7a0b\u4e4b\u95f4\u8fd8\u662f\u8981\u6309\u7167-binlog-\u987a\u5e8f\u6267\u884c\u8fd9\u5757\u5e76\u53d1\u80fd\u63d0\u9ad8\u591a\u5c11\u6027\u80fd",level:4},{value:"Q10: \u79d2\u5220\uff0c\u6bcf\u6b21 put \u90fd\u8981\u53bb\u67e5\u8be2 key \u7684\u6700\u65b0\u7248\u672c\uff1f\u4e5f\u5c31\u662f\u8bf4\u6bcf\u6b21\u5199\u907f\u514d\u4f34\u968f\u4e00\u6b21\u8bfb\uff1f",id:"q10-\u79d2\u5220\u6bcf\u6b21-put-\u90fd\u8981\u53bb\u67e5\u8be2-key-\u7684\u6700\u65b0\u7248\u672c\u4e5f\u5c31\u662f\u8bf4\u6bcf\u6b21\u5199\u907f\u514d\u4f34\u968f\u4e00\u6b21\u8bfb",level:4},{value:"Q11: \u4e3a\u4ec0\u4e48 Pika \u4f7f\u7528\u591a\u7ebf\u7a0b\u800c\u4e0d\u662f\u50cf Redis \u5355\u7ebf\u7a0b\u7684\u7ed3\u6784\uff1f",id:"q11-\u4e3a\u4ec0\u4e48-pika-\u4f7f\u7528\u591a\u7ebf\u7a0b\u800c\u4e0d\u662f\u50cf-redis-\u5355\u7ebf\u7a0b\u7684\u7ed3\u6784",level:4},{value:"Q12: \u6570\u636e\u5206\u7247\u662f\u5728\u4ee3\u7406\u5c42\u505a\u7684\uff1f\u96c6\u5408\u64cd\u4f5c\u843d\u5728\u4e0d\u540c\u7684\u69fd\uff0c\u6bd4\u5982 mget\uff0c\u662f\u5728\u4ee3\u7406\u5c42\u805a\u5408\u7684\uff1f",id:"q12-\u6570\u636e\u5206\u7247\u662f\u5728\u4ee3\u7406\u5c42\u505a\u7684\u96c6\u5408\u64cd\u4f5c\u843d\u5728\u4e0d\u540c\u7684\u69fd\u6bd4\u5982-mget\u662f\u5728\u4ee3\u7406\u5c42\u805a\u5408\u7684",level:4},{value:"Q13: pika \u652f\u6301\u7684\u5ba2\u6237\u7aef\u6709\u54ea\u4e9b\uff0c\u662f\u5426\u652f\u6301 pipelining\uff1f",id:"q13-pika-\u652f\u6301\u7684\u5ba2\u6237\u7aef\u6709\u54ea\u4e9b\u662f\u5426\u652f\u6301-pipelining",level:4},{value:"Q14: \u4e3a\u4ec0\u4e48\u4e0d\u8003\u8651 Redis cluster shard \u5462\uff1f",id:"q14-\u4e3a\u4ec0\u4e48\u4e0d\u8003\u8651-redis-cluster-shard-\u5462",level:4},{value:"Q15: \u4e0d\u7406\u89e3\u524d\u9762\u4e3a\u4ec0\u4e48\u52a0 LVS\uff1fRedis \u7c7b\u670d\u52a1\u90fd\u662f\u5e26\u72b6\u6001\uff0c\u8d1f\u8f7d\u53cd\u800c\u7528\u5427\uff1f",id:"q15-\u4e0d\u7406\u89e3\u524d\u9762\u4e3a\u4ec0\u4e48\u52a0-lvsredis-\u7c7b\u670d\u52a1\u90fd\u662f\u5e26\u72b6\u6001\u8d1f\u8f7d\u53cd\u800c\u7528\u5427",level:4},{value:"Q16: \u6709\u6ca1\u6709\u5bf9\u6bd4\u8fc7 ssdb\uff0cLevelDB\uff1f\u4f18\u52bf\u662f\u4ec0\u4e48\uff1f",id:"q16-\u6709\u6ca1\u6709\u5bf9\u6bd4\u8fc7-ssdbleveldb\u4f18\u52bf\u662f\u4ec0\u4e48",level:4},{value:"Q17: \u5b58\u50a8\u5f15\u64ce\u4e3a\u4ec0\u4e48\u6ca1\u6709\u9009\u62e9 LevelDB \u5462\uff0c\u53e6\u5916\u5e02\u9762\u4e0a\u6709\u7c7b\u4f3c\u7684\u65b9\u6848\u5982 ssdb\uff0c\u6709\u4ec0\u4e48\u4e0d\u540c\u4e4b\u5904\u5417\uff1f",id:"q17-\u5b58\u50a8\u5f15\u64ce\u4e3a\u4ec0\u4e48\u6ca1\u6709\u9009\u62e9-leveldb-\u5462\u53e6\u5916\u5e02\u9762\u4e0a\u6709\u7c7b\u4f3c\u7684\u65b9\u6848\u5982-ssdb\u6709\u4ec0\u4e48\u4e0d\u540c\u4e4b\u5904\u5417",level:4},{value:"Q18: \u82e5\u7c7b\u4f3c\u4e8e\u5355\u673a Redis\uff0c\u90a3\u4e48\u5355\u673a\u6027\u80fd\u662f\u4e2a\u74f6\u9888\u5427\uff1f\u5927\u91cf\u7684\u5ba2\u6237\u7aef\u8fde\u63a5\uff0c\u547d\u4ee4\u5904\u7406\uff0c\u4ee5\u53ca\u7f51\u5361\u6d41\u91cf\u7b49",id:"q18-\u82e5\u7c7b\u4f3c\u4e8e\u5355\u673a-redis\u90a3\u4e48\u5355\u673a\u6027\u80fd\u662f\u4e2a\u74f6\u9888\u5427\u5927\u91cf\u7684\u5ba2\u6237\u7aef\u8fde\u63a5\u547d\u4ee4\u5904\u7406\u4ee5\u53ca\u7f51\u5361\u6d41\u91cf\u7b49",level:4},{value:"Q19: pika \u7684\u591a\u7ebf\u7a0b\u6bd4 Redis \u7684\u5168\u5185\u5b58\uff0c\u5728 get \u4e0a\u7adf\u7136\u5feb\u4e24\u500d\uff1fset \u4e5f\u5feb\uff0c\u4e0d\u5b58\u5728\u591a\u7ebf\u7a0b\u7684\u9501\u6d88\u8017\u5417\uff1f",id:"q19-pika-\u7684\u591a\u7ebf\u7a0b\u6bd4-redis-\u7684\u5168\u5185\u5b58\u5728-get-\u4e0a\u7adf\u7136\u5feb\u4e24\u500dset-\u4e5f\u5feb\u4e0d\u5b58\u5728\u591a\u7ebf\u7a0b\u7684\u9501\u6d88\u8017\u5417",level:4},{value:"Q20: \u5b8c\u5168\u662f\u56e0\u4e3a\u5206\u5e03\u5f0f\u5207\u7247\u4e0d\u5747\u7684\u7f18\u6545\uff0c\u800c\u653e\u5f03\u5206\u5e03\u5f0f\u96c6\u7fa4\u5417\uff1fm-s \u67b6\u6784\u6bcf\u4e2a\u8282\u70b9\u4e0d\u90fd\u662f\u5168\u91cf\u6570\u636e\uff0c\u5360\u7528\u66f4\u591a\u8d44\u6e90\u5417\uff1f",id:"q20-\u5b8c\u5168\u662f\u56e0\u4e3a\u5206\u5e03\u5f0f\u5207\u7247\u4e0d\u5747\u7684\u7f18\u6545\u800c\u653e\u5f03\u5206\u5e03\u5f0f\u96c6\u7fa4\u5417m-s-\u67b6\u6784\u6bcf\u4e2a\u8282\u70b9\u4e0d\u90fd\u662f\u5168\u91cf\u6570\u636e\u5360\u7528\u66f4\u591a\u8d44\u6e90\u5417",level:4},{value:"Q21: \u9664\u4e86\u7c7b\u6bd4\u4e3a\u5355\u673a Redis \u5916\uff0c\u6709\u6ca1\u6709\u8003\u8651\u5206\u5e03\u5f0f\u652f\u6301\uff1f\u6bd4\u5982 Redis \u7684 sentinel \u6216\u8005\u652f\u6301 Codis \u8fd9\u6837\u53ef\u80fd\u5176\u5b83 Redis \u96c6\u7fa4\u53ef\u4ee5\u65e0\u7f1d\u8fc1\u79fb\u3002",id:"q21-\u9664\u4e86\u7c7b\u6bd4\u4e3a\u5355\u673a-redis-\u5916\u6709\u6ca1\u6709\u8003\u8651\u5206\u5e03\u5f0f\u652f\u6301\u6bd4\u5982-redis-\u7684-sentinel-\u6216\u8005\u652f\u6301-codis-\u8fd9\u6837\u53ef\u80fd\u5176\u5b83-redis-\u96c6\u7fa4\u53ef\u4ee5\u65e0\u7f1d\u8fc1\u79fb",level:4},{value:"Q22: \u4e00\u4e3b 14 \u4e2a\u4ece\uff1f\u4e3b\u4ece\u540c\u6b65\u5c82\u4e0d\u662f\u5f88\u6162\uff1f\u53e6\u5916\uff0c\u4ece\u662f\u53ea\u8bfb\u7684\u5427\uff0c\u8bfb\u4ece\u7684\u8bdd\uff0c\u4ece\u7684\u6570\u636e\u53ef\u80fd\u662f\u8fc7\u671f\u7684\uff0c\u6570\u636e\u4e00\u81f4\u6027\u600e\u4e48\u89e3\u51b3\uff1f",id:"q22-\u4e00\u4e3b-14-\u4e2a\u4ece\u4e3b\u4ece\u540c\u6b65\u5c82\u4e0d\u662f\u5f88\u6162\u53e6\u5916\u4ece\u662f\u53ea\u8bfb\u7684\u5427\u8bfb\u4ece\u7684\u8bdd\u4ece\u7684\u6570\u636e\u53ef\u80fd\u662f\u8fc7\u671f\u7684\u6570\u636e\u4e00\u81f4\u6027\u600e\u4e48\u89e3\u51b3",level:4},{value:"Q23: \u8bbe\u7f6e\u4e86 expire-logs-nums (\u81f3\u5c11\u4e3a 10) \u548c binlog \u8fc7\u671f\u65f6\u95f4\uff0c\u4e3a\u4f55 master \u4e2d\u4ecd\u7136\u6709\u5927\u91cf\u7684 write2file \u6587\u4ef6\uff1f",id:"q23-\u8bbe\u7f6e\u4e86-expire-logs-nums-\u81f3\u5c11\u4e3a-10-\u548c-binlog-\u8fc7\u671f\u65f6\u95f4\u4e3a\u4f55-master-\u4e2d\u4ecd\u7136\u6709\u5927\u91cf\u7684-write2file-\u6587\u4ef6",level:4},{value:"Q24 3.0 \u8fdb\u884c\u8bfb\u5199\u65f6\uff0cblackwidow \u53ea\u5bf9\u5199\u52a0\u9501\uff0c\u5bf9\u8bfb\u4e0d\u52a0\u9501\uff0c\u662f\u5426\u4f1a\u53d1\u751f\u810f\u8bfb\uff1f",id:"q24-30-\u8fdb\u884c\u8bfb\u5199\u65f6blackwidow-\u53ea\u5bf9\u5199\u52a0\u9501\u5bf9\u8bfb\u4e0d\u52a0\u9501\u662f\u5426\u4f1a\u53d1\u751f\u810f\u8bfb",level:4}];function c(e){const i={a:"a",code:"code",h3:"h3",h4:"h4",p:"p",...(0,d.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.h3,{id:"1-\u7f16\u8bd1\u5b89\u88c5",children:"1 \u7f16\u8bd1\u5b89\u88c5"}),"\n",(0,n.jsx)(i.h4,{id:"q1-\u652f\u6301\u7684\u7cfb\u7edf",children:"Q1: \u652f\u6301\u7684\u7cfb\u7edf\uff1f"}),"\n",(0,n.jsx)(i.p,{children:"A1\uff1a \u76ee\u524d\u652f\u6301 Linux \u548c MacOS \u7cfb\u7edf\uff0c\u4e0d\u652f\u6301 Windows"}),"\n",(0,n.jsx)(i.h4,{id:"q2-\u600e\u4e48\u7f16\u8bd1\u5b89\u88c5",children:"Q2: \u600e\u4e48\u7f16\u8bd1\u5b89\u88c5\uff1f"}),"\n",(0,n.jsx)(i.p,{children:"A2\uff1a \u53c2\u8003\u7f16\u8bd1\u5b89\u88c5 wiki"}),"\n",(0,n.jsx)(i.h4,{id:"q3-ubuntu-\u7f16\u8bd1\u5076\u5c14\u62a5\u9519-isnan-isinf-was-not-declared",children:"Q3\uff1a Ubuntu \u7f16\u8bd1\u5076\u5c14\u62a5\u9519 isnan isinf was not declared\uff1f"}),"\n",(0,n.jsxs)(i.p,{children:["A3\uff1a \u4e00\u4e9b\u65e7\u7248\u672c\u7684 pika \u5bf9 Ubuntu \u73af\u5883\u517c\u5bb9\u4e0d\u597d\uff0c\u67d0\u4e9b\u60c5\u51b5\u4e0b\u4f1a\u51fa\u73b0\uff1b\u53ef\u4ee5\u5148\u4fee\u6539\u4ee3\u7801\uff0c\u7528 std::isnan \u548c std::isinf \u66ff\u4ee3 isnan\uff0cisinf, \u5e76\u5305\u542b\u5934\u6587\u4ef6 ",(0,n.jsx)(i.code,{children:"#include <cmath>"}),"\u3002 \u6211\u4eec\u4f1a\u5728\u65b0\u7248\u517c\u5bb9\u8fd9\u4e2a\u3002"]}),"\n",(0,n.jsx)(i.h3,{id:"2-\u8bbe\u8ba1\u4e0e\u5b9e\u73b0",children:"2 \u8bbe\u8ba1\u4e0e\u5b9e\u73b0"}),"\n",(0,n.jsx)(i.h4,{id:"q1-\u4e3a\u4ec0\u4e48\u8981\u5f00\u90a3\u4e48\u591a\u7ebf\u7a0b\u6bd4\u5982-purge\u641e\u4e2a\u5b9a\u65f6\u4efb\u52a1\u4e0d\u5c31\u597d\u4e86\u96be\u9053\u7f16\u7a0b\u6846\u67b6\u4e0d\u652f\u6301\u5b9a\u65f6\u5668",children:"Q1: \u4e3a\u4ec0\u4e48\u8981\u5f00\u90a3\u4e48\u591a\u7ebf\u7a0b\uff1f\u6bd4\u5982 purge\uff0c\u641e\u4e2a\u5b9a\u65f6\u4efb\u52a1\u4e0d\u5c31\u597d\u4e86\u3002\u96be\u9053\u7f16\u7a0b\u6846\u67b6\u4e0d\u652f\u6301\u5b9a\u65f6\u5668\uff1f"}),"\n",(0,n.jsx)(i.p,{children:"A1: pika \u6709\u4e00\u4e9b\u6bd4\u8f83\u8017\u65f6\u7684\u4efb\u52a1\uff0c\u5982\u5220 binlog\uff0c\u626b\u63cf key\uff0c\u5907\u4efd\uff0c\u540c\u6b65\u6570\u636e\u6587\u4ef6\u7b49\u7b49\uff0c\u4e3a\u4e86\u4e0d\u5f71\u54cd\u6b63\u5e38\u7684\u7528\u6237\u8bf7\u6c42\uff0c\u8fd9\u4e9b\u4efb\u52a1\u90fd\u662f\u653e\u5230\u540e\u53f0\u6267\u884c\u7684\uff0c\u5e76\u4e14\u5c06\u80fd\u5e76\u884c\u7684\u90fd\u653e\u5230\u4e0d\u540c\u7ebf\u7a0b\u91cc\u6765\u6700\u5927\u7a0b\u5ea6\u4e0a\u63d0\u5347\u540e\u53f0\u4efb\u52a1\u7684\u6267\u884c\u901f\u5ea6\uff1b\u4f60\u8bf4\u7684\u53d8\u6210\u6846\u67b6\u662f pink \u5417\uff1fpink \u662f\u652f\u6301\u5b9a\u65f6\u5668\u7684\uff0c\u6bcf\u4e00\u4e2a workerthread \u53ea\u8981\u7528\u6237\u5b9a\u4e49\u4e86 cronhandle \u548c\u9891\u7387\uff0c\u5c31\u4f1a\u5b9a\u65f6\u6267\u884c\u8981\u6267\u884c\u7684\u5185\u5bb9\uff0c\u4e0d\u8fc7\u8fd9\u65f6\u5019 worker \u662f\u88ab\u72ec\u5360\u7684\uff0c\u54cd\u5e94\u4e0d\u4e86\u7528\u6237\u8bf7\u6c42\uff0c\u6240\u4ee5\u5360\u65f6\u7684\u4efb\u52a1\u6700\u597d\u8fd8\u662f\u5355\u72ec\u5f00\u7ebf\u7a0b\u53bb\u505a\uff0credis \u7684 bio \u4e5f\u662f\u8fd9\u4e2a\u539f\u56e0"}),"\n",(0,n.jsx)(i.h4,{id:"q2-heartbeat-\u8ba9-sender-\u505a\u4e0d\u5c31\u597d\u4e86\u6216\u8005\u8bf4-sender-\u6709\u5fc5\u8981\u90a3\u4e48\u591a\u7ebf\u7a0b\u5417",children:"Q2: heartbeat \u8ba9 sender \u505a\u4e0d\u5c31\u597d\u4e86\uff1f\u6216\u8005\u8bf4 sender \u6709\u5fc5\u8981\u90a3\u4e48\u591a\u7ebf\u7a0b\u5417\uff1f"}),"\n",(0,n.jsx)(i.p,{children:"A2: \u8fd9\u4e3b\u8981\u6709\u4e24\u4e2a\u539f\u56e0\uff0c\u7b2c\u4e00\u4e3a\u4e86\u63d0\u9ad8\u540c\u6b65\u901f\u5ea6\uff0csender \u53ea\u53d1\u4e0d\u6536\uff0creceiver \u53ea\u6536\u4e0d\u53d1\uff0c\u5fc3\u8df3\u662f\u53c8\u5355\u72ec\u7684\u7ebf\u7a0b\u53bb\u505a\uff0c\u5982\u679c\u5fc3\u8df3\u53c8 sender \u6765\u505a\uff0c\u90a3\u4e48\u4e3a\u4e86\u4e00\u79d2\u4ec5\u6709\u4e00\u6b21\u7684\u5fc3\u8df3\u8fd8\u8981\u53bb\u590d\u6742\u5316 sender \u548c receiver \u7684\u903b\u8f91\uff1b\u7b2c\u4e8c\u5176\u5b9e\u524d\u671f\u5c1d\u8bd5\u8fc7\u5408\u5e76\u5728\u4e00\u8d77\u6765\u8fdb\u884c\u8fde\u63a5\u7ea7\u522b\u7684\u5b58\u6d3b\u68c0\u6d4b\uff0c\u5f53\u5199\u5165\u538b\u529b\u8fc7\u5927\u7684\u65f6\u5019\u4f1a\u5fc3\u8df3\u5305\u7684\u6536\u53d1\u4f1a\u5ef6\u540e\uff0c\u5bfc\u81f4\u5b58\u6d3b\u68c0\u6d4b\u88ab\u5f71\u54cd\uff0cslave \u8bef\u5224 master \u8d85\u65f6\u800c\u8fdb\u884c\u4e0d\u5fc5\u8981\u7684\u91cd\u8fde"}),"\n",(0,n.jsx)(i.h4,{id:"q3-nemo-\u5b58\u50a8-hash-\u7684\u5b9e\u9645-key\u7b2c\u4e00\u4e2a\u5b57\u8282\u662fheader\u4e00\u4e2a\u7c7b\u578b\u6807\u8bb0\u662f\u8bf4\u4ed6\u662f\u4e2a-hash-\u7c7b\u578b",children:"Q3: nemo \u5b58\u50a8 hash \u7684\u5b9e\u9645 key\uff0c\u7b2c\u4e00\u4e2a\u5b57\u8282\u662f\uff1fheader\uff1f\u4e00\u4e2a\u7c7b\u578b\u6807\u8bb0\uff1f\u662f\u8bf4\u4ed6\u662f\u4e2a hash \u7c7b\u578b\uff1f"}),"\n",(0,n.jsx)(i.p,{children:"A3: \u7684\u786e\u662f\u4e00\u4e2a header\uff0c\u4e0d\u8fc7\u4e0d\u662f\u4e3a\u4e86\u6807\u8bb0\u5b83\u662f hash\uff0c\u56e0\u4e3a nemo \u5e95\u4e0b\u5df2\u7ecf\u5c06 string\uff0chash\uff0clist\uff0czset\uff0cset \u8fd9\u4e94\u4e2a\u6570\u636e\u7ed3\u6784\u5206\u6210\u7684 5 \u4e2a\u5e93\uff0c\u4e92\u4e0d\u5f71\u54cd\uff0c\u4e4b\u6240\u4ee5\u6709 header \u662f\u56e0\u4e3a\u4e00\u4e2a hash \u6709\u4e00\u4e2a meta key \u548c\u4e00\u5806 field key\uff0cmeta key \u5bf9\u5e94\u7684 value \u8bb0\u5f55\u7684\u662f\u8fd9\u4e2a hash \u7684\u57fa\u7840\u4fe1\u606f\uff0c\u5982 hash \u7684 size \u7b49\u7b49\uff0c\u8fd9\u4e2a header \u4e5f\u662f\u533a\u5206 meta key \u548c field key \u7528\u7684"}),"\n",(0,n.jsx)(i.h4,{id:"q4-list-\u6570\u636e\u7ed3\u6784\u91cc\u9762\u7684-curr_seq-\u662f\u4e2a\u4ec0\u4e48\u4e1c\u897f",children:"Q4: list \u6570\u636e\u7ed3\u6784\u91cc\u9762\u7684 curr_seq \u662f\u4e2a\u4ec0\u4e48\u4e1c\u897f\uff1f"}),"\n",(0,n.jsx)(i.p,{children:"A4: list \u7684\u5b9e\u73b0\u662f\u5b8c\u5168\u57fa\u4e8e kv \u5b9e\u73b0\u7684 list\uff0c\u901a\u8fc7 seq \u6765\u5b9e\u73b0 list \u7c7b\u4f3c prev \u548c next \u6307\u9488\uff0ccur_seq \u662f\u5728 meta \u4fe1\u606f\u91cc\u7684\uff0c\u4e5f\u5c31\u662f\u5f53\u524d\u5df2\u7ecf\u7528\u5230\u90a3\u4e2a seq \u4e86\uff0c\u65b0\u6765\u7684\u8282\u70b9\u4ece\u8fd9\u4e2a seq \u5f00\u59cb\u9012\u589e\u63a5\u7740\u7528"}),"\n",(0,n.jsx)(i.h4,{id:"q5-binlog-\u91cc\u9762\u5b58\u50a8\u7684\u662f\u8f6c\u5316\u540e\u7684-putdelete\u8fd8\u662f\u5b58\u50a8\u7684\u539f\u751f-redis-\u547d\u4ee4",children:"Q5: binlog \u91cc\u9762\u5b58\u50a8\u7684\u662f\u8f6c\u5316\u540e\u7684 put\uff0cdelete\uff1f\u8fd8\u662f\u5b58\u50a8\u7684\u539f\u751f redis \u547d\u4ee4\uff1f"}),"\n",(0,n.jsx)(i.p,{children:"A5: \u5b58\u7684\u662f redis \u7684\u547d\u4ee4"}),"\n",(0,n.jsx)(i.h4,{id:"q6-rsync-\u7684-deamon-\u6a21\u5f0f\u8fd9\u4e2a-rsync-\u662f-linux-\u4e0a\u7684-rsync-\u547d\u4ee4",children:"Q6: rsync \u7684 deamon \u6a21\u5f0f\uff0c\u8fd9\u4e2a rsync \u662f linux \u4e0a\u7684 rsync \u547d\u4ee4\uff1f"}),"\n",(0,n.jsx)(i.p,{children:"A6: \u662f\u7684\uff0cpika \u524d\u671f\u4e3a\u4e86\u66f4\u5feb\u7684\u5b9e\u73b0\u5168\u540c\u6b65\u7684\u529f\u80fd\uff0c\u6b64\u5904\u662f\u76f4\u63a5\u8c03\u7528 rsync \u547d\u4ee4\u6765\u5b8c\u6210\u6570\u636e\u6587\u4ef6\u7684\u6536\u53d1\uff0c\u4e5f\u662f\u7531\u5b83\u6765\u8fdb\u884c\u6587\u4ef6\u7684\u7eed\u4f20\u6821\u9a8c\u7b49"}),"\n",(0,n.jsx)(i.h4,{id:"q7-dump-db-\u6587\u4ef6\u662f-rocksdb-\u672c\u8eab\u5c31\u5e26\u7684\u529f\u80fd\u5177\u4f53\u600e\u4e48\u641e\u7684",children:"Q7: dump db \u6587\u4ef6\u662f rocksdb \u672c\u8eab\u5c31\u5e26\u7684\u529f\u80fd\uff1f\u5177\u4f53\u600e\u4e48\u641e\u7684\uff1f"}),"\n",(0,n.jsx)(i.p,{children:"A7: rocksdb \u63d0\u4f9b\u5bf9\u5f53\u524d db \u5feb\u7167\u5907\u4efd\u7684\u529f\u80fd\uff0c\u6211\u4eec\u57fa\u4e8e\u6b64\uff0c\u5728 dump \u65f6\u5148\u5bf9 pika \u963b\u4f4f\u7528\u6237\u7684\u5199\uff0c\u7136\u540e\u8bb0\u5f55\u5f53\u524d\u7684 binlog \u504f\u79fb\u91cf\u5e76\u4e14\u8c03\u7528 rocksdb \u7684\u63a5\u53e3\u6765\u62ff\u5230\u5f53\u524d db \u7684\u5143\u4fe1\u606f\uff0c\u8fd9\u4e2a\u65f6\u5019\u5c31\u53ef\u4ee5\u653e\u5f00\u7528\u6237\u5199\uff0c\u7136\u540e\u57fa\u4e8e\u8fd9\u4e2a\u5143\u4fe1\u606f\u6765\u8fdb\u884c\u5feb\u7167\u6570\u636e\u7684\u540e\u53f0\u62f7\u8d1d\uff0c\u963b\u5199\u7684\u65f6\u95f4\u5f88\u77ed"}),"\n",(0,n.jsx)(i.h4,{id:"q8-\u5148\u5199-binlog-\u518d\u6267\u884c\u5982\u679c\u8fd9\u65f6\u5019\u6302\u4e86\u547d\u4ee4\u8fd8\u6ca1\u6267\u884c\u4f46\u662f\u5199\u5165\u5230-binlog-\u91cc\u9762\u4e86\u600e\u4e48\u529e",children:"Q8: \u5148\u5199 binlog \u518d\u6267\u884c\uff0c\u5982\u679c\u8fd9\u65f6\u5019\u6302\u4e86\uff0c\u547d\u4ee4\u8fd8\u6ca1\u6267\u884c\uff0c\u4f46\u662f\u5199\u5165\u5230 binlog \u91cc\u9762\u4e86\u600e\u4e48\u529e\uff1f"}),"\n",(0,n.jsx)(i.p,{children:"A8: master \u662f\u5148\u5199 db \u518d\u5199 binlog\uff0c\u4e4b\u524d slave \u53ea\u7528\u4e00\u4e2a worker \u6765\u540c\u6b65\u4f1a\u5728 master \u5199\u5165\u538b\u529b\u5f88\u5927\u7684\u60c5\u51b5\u4e0b\u7531\u4e8e slave \u4e00\u4e2a worker \u5199\u5165\u592a\u6162\u800c\u9020\u6210\u540c\u6b65\u5dee\u8ddd\u8fc7\u5927\uff0c\u540e\u6765\u6211\u4eec\u8c03\u6574\u7ed3\u6784\uff0c\u8ba9 slave \u901a\u8fc7\u591a\u4e2a worker \u6765\u5199\u63d0\u9ad8\u5199\u5165\u901f\u5ea6\uff0c\u4e0d\u8fc7\u8fd9\u65f6\u5019\u6709\u4e00\u4e2a\u95ee\u9898\uff0c\u4e3a\u4e86\u4fdd\u8bc1\u4e3b\u4ece binlog \u987a\u5e8f\u4e00\u81f4\uff0c\u5199 binlog \u7684\u64cd\u4f5c\u8fd8\u662f\u53ea\u80fd\u53c8\u4e00\u4e2a\u7ebf\u7a0b\u6765\u505a\uff0c\u4e5f\u5c31\u662f receiver\uff0c\u6240\u4ee5 slave \u8fd9\u8fb9\u662f\u5148\u5199 binlog \u518d\u5199 db\uff0c\u6240\u4ee5 slave \u5b58\u5728\u5199\u5b8c binlog \u6302\u6389\u5bfc\u81f4\u4e22\u5931\u6570\u636e\u7684\u95ee\u9898\uff0c\u4e0d\u8fc7 redis \u5728 master \u5199\u5b8c db \u540e\u6302\u6389\u540c\u6837\u4f1a\u4e22\u5931\u6570\u636e\uff0c\u6240\u4ee5 redis \u91c7\u7528\u5168\u540c\u6b65\u7684\u529e\u6cd5\u6765\u89e3\u51b3\u8fd9\u4e00\u95ee\u9898\uff0cpika \u540c\u6837\uff0c\u9ed8\u8ba4\u4f7f\u7528\u90e8\u5206\u540c\u6b65\u6765\u7ee7\u7eed\uff0c\u5982\u679c\u4e1a\u52a1\u5bf9\u6570\u636e\u5341\u5206\u654f\u611f\uff0c\u6b64\u5904\u53ef\u4ee5\u5f3a\u5236 slave \u91cd\u542f\u540e\u8fdb\u884c\u5168\u540c\u6b65\u5373\u53ef"}),"\n",(0,n.jsx)(i.h4,{id:"q9-binlogbgworker-\u7ebf\u7a0b\u4e4b\u95f4\u8fd8\u662f\u8981\u6309\u7167-binlog-\u987a\u5e8f\u6267\u884c\u8fd9\u5757\u5e76\u53d1\u80fd\u63d0\u9ad8\u591a\u5c11\u6027\u80fd",children:"Q9: BinlogBGWorker \u7ebf\u7a0b\u4e4b\u95f4\u8fd8\u662f\u8981\u6309\u7167 binlog \u987a\u5e8f\u6267\u884c\uff0c\u8fd9\u5757\u5e76\u53d1\u80fd\u63d0\u9ad8\u591a\u5c11\u6027\u80fd\uff1f"}),"\n",(0,n.jsx)(i.p,{children:"A9: \u4e4b\u524d\u4e3b\u4ece\u540c\u6b65\u7684\u5dee\u5f02\u662f\u7531\u4e3b\u7684\u591a\u4e2a worker \u5199\u5165\u800c\u4ece\u53ea\u6709\u4e00\u4e2a worker \u5199\u5165\u5e26\u6765\u7684\uff0c\u73b0\u5728\u7684\u505a\u6cd5\u63d0\u9ad8\u4e86\u4ece\u5199 db \u7684\u901f\u5ea6\uff0c\u4e0d\u8fc7\u534f\u8bae\u89e3\u6790\u8fd8\u662f\u6709\u4e00\u4e2a\u7ebf\u7a0b\u6765\u505a\uff0c\u8fd8\u662f\u6709\u74f6\u9888\uff0c\u4e0d\u8fc7\u8fd9\u6837\u7684\u4f18\u5316\u4e3b\u4ece\u540c\u6b65\u7684\u6027\u80fd\u63d0\u9ad8\u4e86 3~5 \u500d\u5de6\u53f3\uff0c\u5982\u679c key \u5f88\u5c11\u7684\u8bdd\uff0c\u4f18\u5316\u4e0d\u660e\u663e\uff0c\u56e0\u4e3a slave \u8fd9\u9762\u662f\u901a\u8fc7 key \u7684 hash \u503c\u6765 sharding \u5230\u5176\u4e2d\u4e00\u4e2a worker \u4e0a\u7684"}),"\n",(0,n.jsx)(i.h4,{id:"q10-\u79d2\u5220\u6bcf\u6b21-put-\u90fd\u8981\u53bb\u67e5\u8be2-key-\u7684\u6700\u65b0\u7248\u672c\u4e5f\u5c31\u662f\u8bf4\u6bcf\u6b21\u5199\u907f\u514d\u4f34\u968f\u4e00\u6b21\u8bfb",children:"Q10: \u79d2\u5220\uff0c\u6bcf\u6b21 put \u90fd\u8981\u53bb\u67e5\u8be2 key \u7684\u6700\u65b0\u7248\u672c\uff1f\u4e5f\u5c31\u662f\u8bf4\u6bcf\u6b21\u5199\u907f\u514d\u4f34\u968f\u4e00\u6b21\u8bfb\uff1f"}),"\n",(0,n.jsx)(i.p,{children:"A10: pika \u591a\u6570\u636e\u7ed3\u6784\u7684\u5b9e\u73b0\u4e3b\u8981\u662f \u201cmeta key + \u666e\u901a key\u201d \u6765\u5b9e\u73b0\u7684\uff0c\u6240\u4ee5\u5bf9\u4e8e\u591a\u6570\u636e\u7ed3\u6784\u7684\u8bfb\u5199\uff0c\u80af\u5b9a\u90fd\u662f\u5bf9 rocksdb \u8fdb\u884c 2 \u6b21\u53ca\u4ee5\u4e0a\u7684\u8bfb\u5199\u6b21\u6570\uff0c\u4f60\u8bf4\u7684\u7248\u672c\u4fe1\u606f\u6211\u4eec\u662f\u5b58\u5728 meta_key \u4e2d\u7684\uff0c\u548c\u5176\u4ed6 meta \u4fe1\u606f\u4e00\u8d77\u88ab\u8bfb\u51fa\u6765\uff0c\u5176\u5b9e\u5e76\u6ca1\u6709\u56e0\u4e3a\u7248\u672c\u53f7\u800c\u989d\u5916\u589e\u52a0\u8bfb\u5199\u6b21\u6570"}),"\n",(0,n.jsx)(i.h4,{id:"q11-\u4e3a\u4ec0\u4e48-pika-\u4f7f\u7528\u591a\u7ebf\u7a0b\u800c\u4e0d\u662f\u50cf-redis-\u5355\u7ebf\u7a0b\u7684\u7ed3\u6784",children:"Q11: \u4e3a\u4ec0\u4e48 Pika \u4f7f\u7528\u591a\u7ebf\u7a0b\u800c\u4e0d\u662f\u50cf Redis \u5355\u7ebf\u7a0b\u7684\u7ed3\u6784\uff1f"}),"\n",(0,n.jsx)(i.p,{children:"A11: \u56e0\u4e3a Redis \u6240\u6709\u7684\u64cd\u4f5c\u90fd\u662f\u5bf9\u4e8e\u5185\u5b58\u7684\u64cd\u4f5c\uff0c\u56e0\u6b64\u7406\u8bba\u4e0a Redis \u7684\u6bcf\u6b21\u64cd\u4f5c\u5f88\u77ed\u7684\u3002"}),"\n",(0,n.jsx)(i.h4,{id:"q12-\u6570\u636e\u5206\u7247\u662f\u5728\u4ee3\u7406\u5c42\u505a\u7684\u96c6\u5408\u64cd\u4f5c\u843d\u5728\u4e0d\u540c\u7684\u69fd\u6bd4\u5982-mget\u662f\u5728\u4ee3\u7406\u5c42\u805a\u5408\u7684",children:"Q12: \u6570\u636e\u5206\u7247\u662f\u5728\u4ee3\u7406\u5c42\u505a\u7684\uff1f\u96c6\u5408\u64cd\u4f5c\u843d\u5728\u4e0d\u540c\u7684\u69fd\uff0c\u6bd4\u5982 mget\uff0c\u662f\u5728\u4ee3\u7406\u5c42\u805a\u5408\u7684\uff1f"}),"\n",(0,n.jsx)(i.p,{children:"A12: \u76ee\u524d\u6ca1\u6709\u5bf9\u6570\u636e\u8fdb\u884c\u5206\u7247\uff0c\u4f60\u53ef\u4ee5\u7406\u89e3\u6210\u548c\u5355\u673a Redis \u7c7b\u4f3c\uff0c\u652f\u6301 master-slave \u7684\u67b6\u6784\uff0c\u56e0\u6b64\u5355\u4e2a pika \u5b9e\u4f8b\u5b58\u50a8\u7684\u5927\u5c0f\u7684\u9650\u5236\u662f\u78c1\u76d8\u5927\u5c0f\u7684\u9650\u5236\u3002"}),"\n",(0,n.jsx)(i.h4,{id:"q13-pika-\u652f\u6301\u7684\u5ba2\u6237\u7aef\u6709\u54ea\u4e9b\u662f\u5426\u652f\u6301-pipelining",children:"Q13: pika \u652f\u6301\u7684\u5ba2\u6237\u7aef\u6709\u54ea\u4e9b\uff0c\u662f\u5426\u652f\u6301 pipelining\uff1f"}),"\n",(0,n.jsx)(i.p,{children:"A13: pika \u652f\u6301\u6240\u6709\u7684 Redis \u5ba2\u6237\u7aef\uff0c\u56e0\u4e3a pika \u8bbe\u8ba1\u4e4b\u521d\u5c31\u8003\u8651\u5230\u4e86\u7528\u6237\u7684\u8fc1\u79fb\u6210\u672c\uff0c\u56e0\u6b64\u5404\u79cd\u8bed\u8a00\u7684\u5ba2\u6237\u7aef\u90fd\u652f\u6301\u3002pipelining \u662f\u5ba2\u6237\u7aef\u6765\u505a\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u662f\u652f\u6301 pipelining \u7684\u3002"}),"\n",(0,n.jsx)(i.h4,{id:"q14-\u4e3a\u4ec0\u4e48\u4e0d\u8003\u8651-redis-cluster-shard-\u5462",children:"Q14: \u4e3a\u4ec0\u4e48\u4e0d\u8003\u8651 Redis cluster shard \u5462\uff1f"}),"\n",(0,n.jsx)(i.p,{children:"A14: \u6211\u4eec\u5f00\u59cb\u505a pika \u7684\u65f6\u5019\uff0cRedis cluster shard \u8fd8\u4e0d\u5b8c\u5584\uff0c\u800c\u4e14 Redis cluster \u5b9a\u4f4d\u7684\u573a\u666f\u548c pika \u8fd8\u662f\u6709\u533a\u522b\u3002\u76ee\u524d\u6211\u4eec\u5185\u90e8\u8fd8\u6ca1\u5927\u8303\u56f4\u4f7f\u7528 Redis cluster\u3002"}),"\n",(0,n.jsx)(i.h4,{id:"q15-\u4e0d\u7406\u89e3\u524d\u9762\u4e3a\u4ec0\u4e48\u52a0-lvsredis-\u7c7b\u670d\u52a1\u90fd\u662f\u5e26\u72b6\u6001\u8d1f\u8f7d\u53cd\u800c\u7528\u5427",children:"Q15: \u4e0d\u7406\u89e3\u524d\u9762\u4e3a\u4ec0\u4e48\u52a0 LVS\uff1fRedis \u7c7b\u670d\u52a1\u90fd\u662f\u5e26\u72b6\u6001\uff0c\u8d1f\u8f7d\u53cd\u800c\u7528\u5427\uff1f"}),"\n",(0,n.jsx)(i.p,{children:"A15: \u6211\u4eec\u66b4\u9732\u7ed9\u7528\u6237\u7684 ip \u662f\u6211\u4eec LVS \u7684 ip\u3002\u5728 Redis \u524d\u9762 LVS \u662f\u4e3a\u4e86\u65b9\u4fbf\u4e3b\u4ece\u5207\u6362\uff0c\u8fd9\u6837\u53ef\u4ee5\u505a\u5230\u7528\u6237\u5b8c\u5168\u4e0d\u611f\u77e5\u3002\u8fd9\u91cc LVS \u4e0b\u9762\u6302\u7684\u591a\u4e2a Redis \u5b9e\u4f8b\uff0c\u90fd\u662f master-slave \u7ed3\u6784\u7684\u3002"}),"\n",(0,n.jsx)(i.h4,{id:"q16-\u6709\u6ca1\u6709\u5bf9\u6bd4\u8fc7-ssdbleveldb\u4f18\u52bf\u662f\u4ec0\u4e48",children:"Q16: \u6709\u6ca1\u6709\u5bf9\u6bd4\u8fc7 ssdb\uff0cLevelDB\uff1f\u4f18\u52bf\u662f\u4ec0\u4e48\uff1f"}),"\n",(0,n.jsx)(i.p,{children:"A16: \u6211\u4eec\u516c\u53f8\u5185\u90e8\u6709\u4e1a\u52a1\u90e8\u95e8\u7528 ssdb\uff0c\u76ee\u524d\u9664\u4e86\u6e38\u620f\u5927\u90e8\u5206\u7684 ssdb \u5df2\u7ecf\u8fc1\u79fb\u5230 pika \u4e0a\u6765\u3002\u6211\u89c9\u5f97 pika \u7684\u4f18\u52bf\u5728\u4e8e\u6211\u4eec\u4ee3\u7801\u5b9e\u73b0\u7684\u6bd4\u8f83\u7ec6\uff0c\u6027\u80fd\u4f1a\u6bd4\u8f83\u597d\u3002"}),"\n",(0,n.jsx)(i.h4,{id:"q17-\u5b58\u50a8\u5f15\u64ce\u4e3a\u4ec0\u4e48\u6ca1\u6709\u9009\u62e9-leveldb-\u5462\u53e6\u5916\u5e02\u9762\u4e0a\u6709\u7c7b\u4f3c\u7684\u65b9\u6848\u5982-ssdb\u6709\u4ec0\u4e48\u4e0d\u540c\u4e4b\u5904\u5417",children:"Q17: \u5b58\u50a8\u5f15\u64ce\u4e3a\u4ec0\u4e48\u6ca1\u6709\u9009\u62e9 LevelDB \u5462\uff0c\u53e6\u5916\u5e02\u9762\u4e0a\u6709\u7c7b\u4f3c\u7684\u65b9\u6848\u5982 ssdb\uff0c\u6709\u4ec0\u4e48\u4e0d\u540c\u4e4b\u5904\u5417\uff1f"}),"\n",(0,n.jsx)(i.p,{children:"A17: \u5b58\u50a8\u5f15\u64ce\u4e0a\u6211\u4eec\u5728 LevelDB\uff0cRocksDB \u4e0a\u9762\u505a\u8fc7\u5bf9\u6bd4\u3002LevelDB\uff0cRocksDB \u5728\u6570\u636e\u91cf\u6bd4\u8f83\u5c0f\u7684\u65f6\u5019\u6027\u80fd\u5dee\u5f02\u4e0d\u5927\uff0c\u4f46\u662f\u5728\u6570\u636e\u91cf\u6bd4\u8f83\u5927\u7684\u60c5\u51b5\u4e0b\uff0c\u6bd4\u5982 200G \u7684\u65f6\u5019\uff0cRocksDB \u7684\u6027\u80fd\u4f1a\u6bd4 LevelDB \u8981\u6765\u5f97\u597d\u3002\u4f46\u662f RocksDB \u4e5f\u6709\u4ed6\u7684\u7f3a\u70b9\uff0c\u5c31\u662f\u4ee3\u7801\u6ca1\u6709 LevelDB \u6765\u7684\u90a3\u4e48\u4f18\u96c5\uff0c\u6211\u4e00\u76f4\u89c9\u5f97\u4e00\u4e2a\u597d\u7684 c++ \u7a0b\u5e8f\u5458\u770b LevelDB \u4ee3\u7801\u548c effective c++ \u5c31\u597d\u4e86\u3002"}),"\n",(0,n.jsx)(i.h4,{id:"q18-\u82e5\u7c7b\u4f3c\u4e8e\u5355\u673a-redis\u90a3\u4e48\u5355\u673a\u6027\u80fd\u662f\u4e2a\u74f6\u9888\u5427\u5927\u91cf\u7684\u5ba2\u6237\u7aef\u8fde\u63a5\u547d\u4ee4\u5904\u7406\u4ee5\u53ca\u7f51\u5361\u6d41\u91cf\u7b49",children:"Q18: \u82e5\u7c7b\u4f3c\u4e8e\u5355\u673a Redis\uff0c\u90a3\u4e48\u5355\u673a\u6027\u80fd\u662f\u4e2a\u74f6\u9888\u5427\uff1f\u5927\u91cf\u7684\u5ba2\u6237\u7aef\u8fde\u63a5\uff0c\u547d\u4ee4\u5904\u7406\uff0c\u4ee5\u53ca\u7f51\u5361\u6d41\u91cf\u7b49"}),"\n",(0,n.jsx)(i.p,{children:"A18: \u662f\u7684\u3002\u6240\u4ee5\u76ee\u524d\u5185\u90e8\u7684 pika \u7684\u67b6\u6784\u662f\u652f\u6301\u4e00\u4e3b\u591a\u4ece\u3001\u591a\u673a\u623f\u81ea\u6d3d\u7684\u65b9\u6848\u3002\u76ee\u524d\u7ebf\u4e0a\u6700\u591a\u4e00\u4e2a\u4e3b 14 \u4e2a\u4ece\u8fd9\u6837\u7684\u7ed3\u6784\u3002DBA \u53ef\u4ee5\u5f88\u5bb9\u6613\u7684 slaveof \u7ed9\u4e00\u4e2a\u4e3b\u6302\u4e0a slave\uff0c\u7136\u540e\u8fdb\u884c\u6570\u636e\u7684\u5168\u540c\u6b65\u8fc7\u7a0b\u3002"}),"\n",(0,n.jsx)(i.h4,{id:"q19-pika-\u7684\u591a\u7ebf\u7a0b\u6bd4-redis-\u7684\u5168\u5185\u5b58\u5728-get-\u4e0a\u7adf\u7136\u5feb\u4e24\u500dset-\u4e5f\u5feb\u4e0d\u5b58\u5728\u591a\u7ebf\u7a0b\u7684\u9501\u6d88\u8017\u5417",children:"Q19: pika \u7684\u591a\u7ebf\u7a0b\u6bd4 Redis \u7684\u5168\u5185\u5b58\uff0c\u5728 get \u4e0a\u7adf\u7136\u5feb\u4e24\u500d\uff1fset \u4e5f\u5feb\uff0c\u4e0d\u5b58\u5728\u591a\u7ebf\u7a0b\u7684\u9501\u6d88\u8017\u5417\uff1f"}),"\n",(0,n.jsx)(i.p,{children:"A19: \u8fd9\u91cc\u5927\u5bb6\u53ef\u4ee5\u770b\u5230\uff0c\u8fd9\u4e2a\u6d4b\u8bd5\u7ed3\u679c\u662f pika work thread \u5f00\u4e86 18 \u4e2a\u3002"}),"\n",(0,n.jsx)(i.p,{children:"\u5728\u591a\u6570\u636e\u7ed3\u6784\u7684\u63a5\u53e3\u91cc\u9762 kv \u7684\u7ed3\u6784\u7684\u6027\u80fd\u662f\u6700\u597d\u7684\uff0c\u800c\u591a\u6570\u636e\u7ed3\u6784\u7684\u63a5\u53e3\u6bd4\u5982 hash\u3001zset \u7b49\u7b49\u5c31\u7b97\u5f00\u4e86 18 \u4e2a\u7ebf\u7a0b\uff0c\u6027\u80fd\u4f9d\u7136\u4e0d\u5982 Redis \u8981\u6765\u5f97\u597d\u3002\u56e0\u4e3a hash\u3001zset \u7b49\u6570\u636e\u7ed3\u6784\u9700\u8981\u6709\u62a2\u5360\u591a\u6570\u636e\u7ed3\u6784\u5143\u6570\u636e\u9501\u7684\u5f00\u9500\uff0c\u56e0\u6b64\u6027\u80fd\u5f88\u5bb9\u6613\u4e0b\u6765\u3002\u4f46\u662f kv \u63a5\u53e3\u57fa\u672c\u6ca1\u6709\u9501\u7684\u5f00\u9500\u3002\u552f\u4e00\u7684\u9501\u5f00\u9500\u5c31\u662f RocksDB \u4e3a\u4e86\u5b9e\u73b0\u7ebf\u7a0b\u5b89\u5168\u589e\u52a0\u7684\u9501\uff0c\u56e0\u6b64\u8fd9\u4e2a\u7ed3\u679c\u4e5f\u662f\u53ef\u4ee5\u7406\u89e3\u4e86\u3002"}),"\n",(0,n.jsx)(i.h4,{id:"q20-\u5b8c\u5168\u662f\u56e0\u4e3a\u5206\u5e03\u5f0f\u5207\u7247\u4e0d\u5747\u7684\u7f18\u6545\u800c\u653e\u5f03\u5206\u5e03\u5f0f\u96c6\u7fa4\u5417m-s-\u67b6\u6784\u6bcf\u4e2a\u8282\u70b9\u4e0d\u90fd\u662f\u5168\u91cf\u6570\u636e\u5360\u7528\u66f4\u591a\u8d44\u6e90\u5417",children:"Q20: \u5b8c\u5168\u662f\u56e0\u4e3a\u5206\u5e03\u5f0f\u5207\u7247\u4e0d\u5747\u7684\u7f18\u6545\uff0c\u800c\u653e\u5f03\u5206\u5e03\u5f0f\u96c6\u7fa4\u5417\uff1fm-s \u67b6\u6784\u6bcf\u4e2a\u8282\u70b9\u4e0d\u90fd\u662f\u5168\u91cf\u6570\u636e\uff0c\u5360\u7528\u66f4\u591a\u8d44\u6e90\u5417\uff1f"}),"\n",(0,n.jsx)(i.p,{children:"A20: \u5176\u5b9e\u6211\u4eec\u5728 bada \u91cc\u9762\u589e\u52a0\u4e86\u591a\u6570\u636e\u7ed3\u6784\u7684\u63a5\u53e3\uff0c\u5e76\u4e14\u517c\u5bb9\u4e86 Redis \u7684\u534f\u8bae\uff0c\u4f46\u662f\u540e\u6765\u7528\u6237\u7684\u4f7f\u7528\u4e2d\uff0c\u53d1\u73b0\u5176\u5b9e\u4f7f\u7528\u591a\u6570\u636e\u7ed3\u6784\u63a5\u53e3\u7684\u7528\u6237\u6570\u636e\u91cf\u5176\u5b9e\u4e0d\u662f\u7279\u522b\u5927\u3002\u5355\u673a 1T \u7684\u76d8\u57fa\u672c\u90fd\u80fd\u591f\u627f\u53d7\u4e0b\u6765\u3002\u4f46\u662f\u8fd8\u662f\u56e0\u4e3a Hash \u5206\u5e03\u5f0f\u5207\u7247\u4e0d\u5747\u8861\uff0c\u5bfc\u81f4\u6211\u4eec\u7684\u7ef4\u62a4\u6210\u672c\u589e\u52a0\uff0c\u56e0\u6b64\u6211\u4eec\u53bb\u5b9e\u73b0\u4e86 m-s \u67b6\u6784\u65b9\u6848\u3002"}),"\n",(0,n.jsx)(i.p,{children:"\u76ee\u524d bada \u7684\u65b9\u6848\u4e5f\u662f\u548c pika \u5e76\u5b58\u7684\u65b9\u6848\uff0c\u6211\u4eec\u4f1a\u6839\u636e\u7528\u6237\u5177\u4f53\u7684\u4f7f\u7528\u573a\u666f\u63a8\u8350\u4f7f\u7528\u7684\u5b58\u50a8\u65b9\u6848\u3002\u6211\u4e00\u76f4\u89c9\u5f97\u80af\u5b9a\u4e0d\u662f\u4e00\u5957\u5b58\u50a8\u65b9\u6848\u89e3\u51b3\u516c\u53f8\u5185\u90e8\u7684\u6240\u6709\u9700\u6c42\uff0c\u4e00\u5b9a\u662f\u67d0\u4e00\u4e2a\u65b9\u6848\u66f4\u9002\u7528\u4e8e\u67d0\u4e00\u79cd\u5b58\u50a8\u65b9\u6848\u3002"}),"\n",(0,n.jsx)(i.h4,{id:"q21-\u9664\u4e86\u7c7b\u6bd4\u4e3a\u5355\u673a-redis-\u5916\u6709\u6ca1\u6709\u8003\u8651\u5206\u5e03\u5f0f\u652f\u6301\u6bd4\u5982-redis-\u7684-sentinel-\u6216\u8005\u652f\u6301-codis-\u8fd9\u6837\u53ef\u80fd\u5176\u5b83-redis-\u96c6\u7fa4\u53ef\u4ee5\u65e0\u7f1d\u8fc1\u79fb",children:"Q21: \u9664\u4e86\u7c7b\u6bd4\u4e3a\u5355\u673a Redis \u5916\uff0c\u6709\u6ca1\u6709\u8003\u8651\u5206\u5e03\u5f0f\u652f\u6301\uff1f\u6bd4\u5982 Redis \u7684 sentinel \u6216\u8005\u652f\u6301 Codis \u8fd9\u6837\u53ef\u80fd\u5176\u5b83 Redis \u96c6\u7fa4\u53ef\u4ee5\u65e0\u7f1d\u8fc1\u79fb\u3002"}),"\n",(0,n.jsx)(i.p,{children:"A21: Pika \u76ee\u524d\u5e76\u6ca1\u6709\u4f7f\u7528\u7c7b\u4f3c Redis \u7684 sentinel\uff0cpika \u524d\u9762\u662f\u6302 LVS \u6765\u8d1f\u8d23\u4e3b\u4ece\u5207\u6362\u3002\u76ee\u524d\u4e5f\u6ca1\u6709\u4f7f\u7528 Codis \u8fd9\u6837\u7684 proxy \u65b9\u6848\u3002"}),"\n",(0,n.jsx)(i.h4,{id:"q22-\u4e00\u4e3b-14-\u4e2a\u4ece\u4e3b\u4ece\u540c\u6b65\u5c82\u4e0d\u662f\u5f88\u6162\u53e6\u5916\u4ece\u662f\u53ea\u8bfb\u7684\u5427\u8bfb\u4ece\u7684\u8bdd\u4ece\u7684\u6570\u636e\u53ef\u80fd\u662f\u8fc7\u671f\u7684\u6570\u636e\u4e00\u81f4\u6027\u600e\u4e48\u89e3\u51b3",children:"Q22: \u4e00\u4e3b 14 \u4e2a\u4ece\uff1f\u4e3b\u4ece\u540c\u6b65\u5c82\u4e0d\u662f\u5f88\u6162\uff1f\u53e6\u5916\uff0c\u4ece\u662f\u53ea\u8bfb\u7684\u5427\uff0c\u8bfb\u4ece\u7684\u8bdd\uff0c\u4ece\u7684\u6570\u636e\u53ef\u80fd\u662f\u8fc7\u671f\u7684\uff0c\u6570\u636e\u4e00\u81f4\u6027\u600e\u4e48\u89e3\u51b3\uff1f"}),"\n",(0,n.jsx)(i.p,{children:"A22: \u4e00\u4e3b 14 \u4ece\u7684\u573a\u666f\u662f\u7528\u6237\u7684\u5199\u5165\u90fd\u662f\u665a\u4e0a\u5b9a\u671f\u7684\u704c\u6570\u636e\uff0c\u8bfb\u53d6\u7684\u8bdd\u4ece\u5404\u4e2a\u4ece\u5e93\u8fdb\u884c\u8bfb\u53d6\u3002\u56e0\u6b64\u8fd9\u4e2a\u6570\u636e\u4e00\u81f4\u6027\u662f\u7528\u6237\u53ef\u4ee5\u63a5\u53d7\u7684\u573a\u666f\u3002"}),"\n",(0,n.jsx)(i.h4,{id:"q23-\u8bbe\u7f6e\u4e86-expire-logs-nums-\u81f3\u5c11\u4e3a-10-\u548c-binlog-\u8fc7\u671f\u65f6\u95f4\u4e3a\u4f55-master-\u4e2d\u4ecd\u7136\u6709\u5927\u91cf\u7684-write2file-\u6587\u4ef6",children:"Q23: \u8bbe\u7f6e\u4e86 expire-logs-nums (\u81f3\u5c11\u4e3a 10) \u548c binlog \u8fc7\u671f\u65f6\u95f4\uff0c\u4e3a\u4f55 master \u4e2d\u4ecd\u7136\u6709\u5927\u91cf\u7684 write2file \u6587\u4ef6\uff1f"}),"\n",(0,n.jsx)(i.p,{children:"A23: pika \u4f1a\u5b9a\u671f\u68c0\u67e5 binlog \u6587\u4ef6\uff0c\u5982\u679c binlog \u6570\u76ee\u8d85\u8fc7\u4e86 expire-logs-nums \u6216\u8005\u8fc7\u671f\u65f6\u95f4\uff0c\u5e76\u4e14\u6240\u6709\u7684\u4ece\u8282\u70b9\u90fd\u5df2\u7ecf\u5bf9\u8be5 binlog \u6587\u4ef6\u8fdb\u884c\u8fc7\u540c\u6b65\uff0c\u90a3\u4e48 binlog \u6587\u4ef6\u5c31\u4f1a\u88ab\u5220\u9664\u3002\u786e\u8ba4\u8fc7 expire-logs-nums \u548c\u8fc7\u671f\u65f6\u95f4\u8bbe\u7f6e\u6b63\u786e\uff0c\u53ef\u4ee5\u901a\u8fc7 info \u547d\u4ee4\u67e5\u770b\u662f\u5426\u6709\u4ece\u8282\u70b9\u540c\u6b65\u5ef6\u8fdf\u6bd4\u8f83\u5927\uff0c\u5bfc\u81f4 binlog \u65e0\u6cd5\u88ab\u5220\u9664\u3002"}),"\n",(0,n.jsxs)(i.h4,{id:"q24-30-\u8fdb\u884c\u8bfb\u5199\u65f6blackwidow-\u53ea\u5bf9\u5199\u52a0\u9501\u5bf9\u8bfb\u4e0d\u52a0\u9501\u662f\u5426\u4f1a\u53d1\u751f\u810f\u8bfb",children:["Q24",":Pika"," 3.0 \u8fdb\u884c\u8bfb\u5199\u65f6\uff0cblackwidow \u53ea\u5bf9\u5199\u52a0\u9501\uff0c\u5bf9\u8bfb\u4e0d\u52a0\u9501\uff0c\u662f\u5426\u4f1a\u53d1\u751f\u810f\u8bfb\uff1f"]}),"\n",(0,n.jsxs)(i.p,{children:["A24: \u4e0d\u4f1a\u6709\u810f\u8bfb\u95ee\u9898\uff0c Pika Blackwidow (\u6700\u65b0\u4ee3\u7801\u5728 src/storage) \u8fdb\u884c Get \u64cd\u4f5c\u4f7f\u7528\u7684\u662f default_read_options_, snapshot \u662f nullptr, \u6240\u4ee5\u662f\u8c03\u7528\u65f6\u523b\u7684\u9690\u5f0f\u5feb\u7167\u3002\u66f4\u8be6\u7ec6\u89e3\u91ca\u8be6\u89c1 ",(0,n.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/issues/185#issuecomment-1548935380",children:"issue 185"}),"\u3002"]}),"\n",(0,n.jsx)(i.p,{children:"\u5982\u679c\u60a8\u6709\u5176\u4ed6\u95ee\u9898\uff0c\u8bf7\u8054\u7cfb\u76f4\u63a5\u5728 github issue \u4e0a\u63cf\u8ff0\u60a8\u7684\u95ee\u9898\uff0c\u6211\u4eec\u7b2c\u4e00\u65f6\u95f4\u56de\u590d\u3002"})]})}function h(e={}){const{wrapper:i}={...(0,d.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},8453:(e,i,s)=>{s.d(i,{R:()=>r,x:()=>a});var n=s(6540);const d={},l=n.createContext(d);function r(e){const i=n.useContext(l);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:r(e.components),n.createElement(l.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/9805f35a.e06ac37e.js b/build/assets/js/9805f35a.e06ac37e.js new file mode 100644 index 0000000..ce10c30 --- /dev/null +++ b/build/assets/js/9805f35a.e06ac37e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[4538],{9265:(i,e,t)=>{t.r(e),t.d(e,{assets:()=>a,contentTitle:()=>o,default:()=>u,frontMatter:()=>r,metadata:()=>c,toc:()=>l});var n=t(4848),s=t(8453);const r={title:"\u5e8f\u8a00",sidebar_position:10},o=void 0,c={id:"\u5e8f\u8a00/index",title:"\u5e8f\u8a00",description:"\u6b22\u8fce\u6765\u5230 PikiwiDB(Pika) \u7684\u4e16\u754c\u3002\u63a5\u4e0b\u6765\u7684\u7bc7\u7ae0\u65e8\u5728\u4e8e\u5e2e\u52a9\u4f60\u5efa\u7acb\u5bf9 PikiwiDB \u6570\u636e\u5e93\u7684\u57fa\u672c\u4e86\u89e3\uff0c\u4f60\u5c06\u4f1a\u9605\u8bfb\u5230\uff1a",source:"@site/docs/\u5e8f\u8a00/index.md",sourceDirName:"\u5e8f\u8a00",slug:"/\u5e8f\u8a00/",permalink:"/docs/\u5e8f\u8a00/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u5e8f\u8a00/index.md",tags:[],version:"current",sidebarPosition:10,frontMatter:{title:"\u5e8f\u8a00",sidebar_position:10},sidebar:"tutorialSidebar",next:{title:"PikiwiDB(Pika) \u7b80\u4ecb",permalink:"/docs/\u5e8f\u8a00/\u7b80\u4ecb/"}},a={},l=[];function d(i){const e={li:"li",p:"p",ul:"ul",...(0,s.R)(),...i.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(e.p,{children:"\u6b22\u8fce\u6765\u5230 PikiwiDB(Pika) \u7684\u4e16\u754c\u3002\u63a5\u4e0b\u6765\u7684\u7bc7\u7ae0\u65e8\u5728\u4e8e\u5e2e\u52a9\u4f60\u5efa\u7acb\u5bf9 PikiwiDB \u6570\u636e\u5e93\u7684\u57fa\u672c\u4e86\u89e3\uff0c\u4f60\u5c06\u4f1a\u9605\u8bfb\u5230\uff1a"}),"\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsx)(e.li,{children:"PikiwiDB(Pika) \u6570\u636e\u5e93\u7684\u7b80\u4ecb"}),"\n",(0,n.jsx)(e.li,{children:"PikiwiDB(Pika) \u6570\u636e\u5e93\u7684\u53d1\u5c55\u5386\u7a0b"}),"\n",(0,n.jsx)(e.li,{children:"PikiwiDB(Pika) \u6570\u636e\u5e93\u7684\u4f7f\u7528\u65b9\u5f0f"}),"\n",(0,n.jsx)(e.li,{children:"PikiwiDB(Pika) \u793e\u533a\u7684\u8fd0\u4f5c\u6a21\u5f0f"}),"\n"]}),"\n",(0,n.jsx)(e.p,{children:"\u5728\u9605\u8bfb\u5b8c\u6210\u8fd9\u4e00\u90e8\u5206\u4e4b\u540e\uff0c\u4f60\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u60f3\u6cd5\u4e0e\u9700\u6c42\uff0c\u9009\u62e9\u6027\u5730\u9605\u8bfb\u540e\u9762\u7684\u5185\u5bb9\uff0c\u5b83\u4eec\u5728\u4e0d\u540c\u7684\u65b9\u9762\u9610\u8ff0\u4e86 PikiwiDB \u7684\u5e94\u7528\u573a\u666f\u3002"})]})}function u(i={}){const{wrapper:e}={...(0,s.R)(),...i.components};return e?(0,n.jsx)(e,{...i,children:(0,n.jsx)(d,{...i})}):d(i)}},8453:(i,e,t)=>{t.d(e,{R:()=>o,x:()=>c});var n=t(6540);const s={},r=n.createContext(s);function o(i){const e=n.useContext(r);return n.useMemo((function(){return"function"==typeof i?i(e):{...e,...i}}),[e,i])}function c(i){let e;return e=i.disableParentContext?"function"==typeof i.components?i.components(s):i.components||s:o(i.components),n.createElement(r.Provider,{value:e},i.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/9994e0b3.349859dc.js b/build/assets/js/9994e0b3.349859dc.js new file mode 100644 index 0000000..c79f1ab --- /dev/null +++ b/build/assets/js/9994e0b3.349859dc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[7084],{1541:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>l,frontMatter:()=>r,metadata:()=>a,toc:()=>u});var n=i(4848),o=i(8453);const r={title:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0",sidebar_position:40},s=void 0,a={id:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/index",title:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0",description:"",source:"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/index.md",sourceDirName:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0",slug:"/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/index.md",tags:[],version:"current",sidebarPosition:40,frontMatter:{title:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0",sidebar_position:40},sidebar:"tutorialSidebar",previous:{title:"\u8c03\u6574 max-write-buffer-size \u4f18\u5316 pika \u6027\u80fd10\u500d\u7684\u6848\u4f8b",permalink:"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/\u8c03\u6574 max-write-buffer-size \u4f18\u5316 pika \u6027\u80fd10\u500d\u7684\u6848\u4f8b/"},next:{title:"\u6574\u4f53\u6280\u672f\u67b6\u6784",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u6574\u4f53\u6280\u672f\u67b6\u6784/"}},c={},u=[];function d(e){return(0,n.jsx)(n.Fragment,{})}function l(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d()}},8453:(e,t,i)=>{i.d(t,{R:()=>s,x:()=>a});var n=i(6540);const o={},r=n.createContext(o);function s(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/9b4df08c.2ee68b93.js b/build/assets/js/9b4df08c.2ee68b93.js new file mode 100644 index 0000000..6e6ba41 --- /dev/null +++ b/build/assets/js/9b4df08c.2ee68b93.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[3215],{801:(t,i,e)=>{e.r(i),e.d(i,{assets:()=>c,contentTitle:()=>r,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>k});var n=e(4848),o=e(8453);const a={title:"Pika \u4f20\u706b\u8ba1\u5212",sidebar_position:18},r=void 0,s={id:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/index",title:"Pika \u4f20\u706b\u8ba1\u5212",description:"\u4e3a\u65b9\u4fbf\u521a\u63a5\u89e6Pika\u7684\u540c\u5b66\u80fd\u591f\u66f4\u5feb\u7684\u4e0a\u624b\u63d0\u4ea4\u7b2c\u4e00\u4e2aPika PR\u3002\u57fa\u4e8ev3.3.4\u4ee3\u7801\uff0c\u4ece\u4ee3\u7801\u5c42\u9762\u5bf9Pika\u8fdb\u884c\u4e86\u5168\u65b9\u9762\u7684\u68b3\u7406\u3002\u8fd9\u4e2a\u60f3\u6cd5\u53eb\u4f20\u706b\u8ba1\u5212\uff0c\u5e0c\u671bPika\u661f\u661f\u4e4b\u706b\u53ef\u4ee5\u71ce\u539f\u3002",source:"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/index.md",sourceDirName:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212",slug:"/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/index.md",tags:[],version:"current",sidebarPosition:18,frontMatter:{title:"Pika \u4f20\u706b\u8ba1\u5212",sidebar_position:18},sidebar:"tutorialSidebar",previous:{title:"Pika \u548c RockSDB \u7684\u5bf9\u63a5",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/Pika \u548c RockSDB \u7684\u5bf9\u63a5/"},next:{title:"Pika \u7ebf\u7a0b\u6a21\u578b\u7b80\u4ecb",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u7ebf\u7a0b\u6a21\u578b/"}},c={},k=[];function P(t){const i={p:"p",...(0,o.R)(),...t.components};return(0,n.jsx)(i.p,{children:"\u4e3a\u65b9\u4fbf\u521a\u63a5\u89e6Pika\u7684\u540c\u5b66\u80fd\u591f\u66f4\u5feb\u7684\u4e0a\u624b\u63d0\u4ea4\u7b2c\u4e00\u4e2aPika PR\u3002\u57fa\u4e8ev3.3.4\u4ee3\u7801\uff0c\u4ece\u4ee3\u7801\u5c42\u9762\u5bf9Pika\u8fdb\u884c\u4e86\u5168\u65b9\u9762\u7684\u68b3\u7406\u3002\u8fd9\u4e2a\u60f3\u6cd5\u53eb\u4f20\u706b\u8ba1\u5212\uff0c\u5e0c\u671bPika\u661f\u661f\u4e4b\u706b\u53ef\u4ee5\u71ce\u539f\u3002"})}function d(t={}){const{wrapper:i}={...(0,o.R)(),...t.components};return i?(0,n.jsx)(i,{...t,children:(0,n.jsx)(P,{...t})}):P(t)}},8453:(t,i,e)=>{e.d(i,{R:()=>r,x:()=>s});var n=e(6540);const o={},a=n.createContext(o);function r(t){const i=n.useContext(a);return n.useMemo((function(){return"function"==typeof t?t(i):{...i,...t}}),[i,t])}function s(t){let i;return i=t.disableParentContext?"function"==typeof t.components?t.components(o):t.components||o:r(t.components),n.createElement(a.Provider,{value:i},t.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/9e4087bc.59edf690.js b/build/assets/js/9e4087bc.59edf690.js new file mode 100644 index 0000000..e58c0de --- /dev/null +++ b/build/assets/js/9e4087bc.59edf690.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[2711],{9331:(e,r,t)=>{t.r(r),t.d(r,{default:()=>m});t(6540);var a=t(8774),i=t(1312),n=t(1213),s=t(6266),c=t(781),l=t(1107),o=t(4848);function d(e){let{year:r,posts:t}=e;const i=(0,s.i)({day:"numeric",month:"long",timeZone:"UTC"});return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(l.A,{as:"h3",id:r,children:r}),(0,o.jsx)("ul",{children:t.map((e=>{return(0,o.jsx)("li",{children:(0,o.jsxs)(a.A,{to:e.metadata.permalink,children:[(r=e.metadata.date,i.format(new Date(r)))," - ",e.metadata.title]})},e.metadata.date);var r}))})]})}function h(e){let{years:r}=e;return(0,o.jsx)("section",{className:"margin-vert--lg",children:(0,o.jsx)("div",{className:"container",children:(0,o.jsx)("div",{className:"row",children:r.map(((e,r)=>(0,o.jsx)("div",{className:"col col--4 margin-vert--lg",children:(0,o.jsx)(d,{...e})},r)))})})})}function m(e){let{archive:r}=e;const t=(0,i.T)({id:"theme.blog.archive.title",message:"Archive",description:"The page & hero title of the blog archive page"}),a=(0,i.T)({id:"theme.blog.archive.description",message:"Archive",description:"The page & hero description of the blog archive page"}),s=function(e){const r=e.reduce(((e,r)=>{const t=r.metadata.date.split("-")[0],a=e.get(t)??[];return e.set(t,[r,...a])}),new Map);return Array.from(r,(e=>{let[r,t]=e;return{year:r,posts:t}}))}(r.blogPosts);return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.be,{title:t,description:a}),(0,o.jsxs)(c.A,{children:[(0,o.jsx)("header",{className:"hero hero--primary",children:(0,o.jsxs)("div",{className:"container",children:[(0,o.jsx)(l.A,{as:"h1",className:"hero__title",children:t}),(0,o.jsx)("p",{className:"hero__subtitle",children:a})]})}),(0,o.jsx)("main",{children:s.length>0&&(0,o.jsx)(h,{years:s})})]})]})}},6266:(e,r,t)=>{t.d(r,{i:()=>i});var a=t(4586);function i(e){void 0===e&&(e={});const{i18n:{currentLocale:r}}=(0,a.A)(),t=function(){const{i18n:{currentLocale:e,localeConfigs:r}}=(0,a.A)();return r[e].calendar}();return new Intl.DateTimeFormat(r,{calendar:t,...e})}}}]); \ No newline at end of file diff --git a/build/assets/js/a3821efb.66699296.js b/build/assets/js/a3821efb.66699296.js new file mode 100644 index 0000000..929016e --- /dev/null +++ b/build/assets/js/a3821efb.66699296.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[2995],{2336:(n,e,r)=>{r.r(e),r.d(e,{assets:()=>a,contentTitle:()=>o,default:()=>p,frontMatter:()=>t,metadata:()=>d,toc:()=>c});var s=r(4848),i=r(8453);const t={title:"Pika \u7ebf\u7a0b\u6a21\u578b\u7b80\u4ecb",sidebar_position:0},o=void 0,d={id:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u7ebf\u7a0b\u6a21\u578b/index",title:"Pika \u7ebf\u7a0b\u6a21\u578b\u7b80\u4ecb",description:"alt text",source:"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u7ebf\u7a0b\u6a21\u578b/index.md",sourceDirName:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u7ebf\u7a0b\u6a21\u578b",slug:"/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u7ebf\u7a0b\u6a21\u578b/",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u7ebf\u7a0b\u6a21\u578b/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u7ebf\u7a0b\u6a21\u578b/index.md",tags:[],version:"current",sidebarPosition:0,frontMatter:{title:"Pika \u7ebf\u7a0b\u6a21\u578b\u7b80\u4ecb",sidebar_position:0},sidebar:"tutorialSidebar",previous:{title:"Pika \u4f20\u706b\u8ba1\u5212",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/"},next:{title:"Pika \u8bfb\u5199\u6d41\u7a0b\u7b80\u4ecb",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u8bfb\u5199\u6d41\u7a0b/"}},a={},c=[{value:"Introduction",id:"introduction",level:2},{value:"\u7ebf\u7a0b\u6a21\u578b",id:"\u7ebf\u7a0b\u6a21\u578b",level:2},{value:"ServerThread",id:"serverthread",level:2},{value:"DispatchThread",id:"dispatchthread",level:3},{value:"Connection",id:"connection",level:3},{value:"Pika \u7ebf\u7a0b\u6a21\u578b\u4ee5\u53caCmd\u5904\u7406\u987a\u5e8f",id:"pika-\u7ebf\u7a0b\u6a21\u578b\u4ee5\u53cacmd\u5904\u7406\u987a\u5e8f",level:2},{value:"Reference",id:"reference",level:2}];function l(n){const e={a:"a",code:"code",h2:"h2",h3:"h3",img:"img",p:"p",pre:"pre",...(0,i.R)(),...n.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(e.p,{children:(0,s.jsx)(e.img,{alt:"alt text",src:r(5546).A+"",width:"572",height:"175"})}),"\n",(0,s.jsx)(e.h2,{id:"introduction",children:"Introduction"}),"\n",(0,s.jsx)(e.p,{children:"Pika\u662fQihoo360 \u5f00\u6e90\u7684\u4e00\u6b3e\u517c\u5bb9redis\u534f\u8bae\u7684\u9ad8\u6027\u80fdkv\u5b58\u50a8\u670d\u52a1\uff0c\u5176\u4e0eredis\u6700\u5927\u7684\u4e0d\u7528\u70b9\u662f\u5176\u6570\u636e\u662f\u57fa\u4e8e\u78c1\u76d8\u800c\u4e0d\u662f\u57fa\u4e8e\u5185\u5b58\u3002\u540c\u65f6\u4f7f\u7528\u4e86\u591a\u7ebf\u7a0b\u7684\u65b9\u5f0f\u63d0\u9ad8\u4e86\u8bfb\u5199\u6548\u7387\u3002\u66f4\u591a\u7684\u6574\u4f53\u8bbe\u8ba1\u548c\u5b9e\u8df5\u7ec6\u8282\u53c2\u89c1Wiki\u7684\u8bbe\u8ba1\u5b9e\u73b0\u677f\u5757\u3002\u8fd9\u91cc\u662f\u66f4\u591a\u505a\u4ee3\u7801\u5c42\u9762\u5206\u6790\uff0c\u9002\u5408\u60f3\u8981\u4ece\u4e8bPika\u5f00\u53d1\u7684\u540c\u5b66\u3002"}),"\n",(0,s.jsx)(e.p,{children:"Pika\u4f7f\u7528\u4e86\u540c\u6837\u662fQihoo360 \u5f00\u6e90\u7684Pink \u7f51\u7edc\u5e93\uff0c\u5982\u679c\u8981\u4e86\u89e3pika\u7684\u4ee3\u7801\uff0c\u9996\u5148\u8981\u4e86\u89e3\u5176\u7f51\u7edc\u5e93\u7684\u7f51\u7edc\u6a21\u578b\uff0c\u548c\u8c03\u7528\u5173\u7cfb\uff0c\u4e0b\u9762\u6211\u4eec\u6765\u770b\u4e00\u4e0bPink\u7684\u7f51\u7edc\u6a21\u578b\u3002"}),"\n",(0,s.jsx)(e.h2,{id:"\u7ebf\u7a0b\u6a21\u578b",children:"\u7ebf\u7a0b\u6a21\u578b"}),"\n",(0,s.jsx)(e.p,{children:"\u4e00\u5207\u4eceThread \u5f00\u59cb"}),"\n",(0,s.jsx)(e.pre,{children:(0,s.jsx)(e.code,{className:"language-c++",children:"class Thread {\n int Thread::StartThread() {\n return pthread_create(&thread_id_, nullptr, RunThread, (void *)this);\n }\n void* Thread::RunThread(void *arg) {\n // thread \u7684\u6267\u884c\u51fd\u6570\n thread->ThreadMain()\n }\n virtual void *ThreadMain() = 0;\n}\n"})}),"\n",(0,s.jsx)(e.p,{children:"Tread \u7c7b\u53ea\u662f\u5bf9pthread \u8c03\u7528\u8fdb\u884c\u4e86\u4e00\u5c42\u5c01\u88c5\uff0c\u503c\u5f97\u6ce8\u610f\u7684\u662fThreadMain \u662f\u5404\u7ebf\u7a0b\u7684\u5165\u53e3\u51fd\u6570\u3002"}),"\n",(0,s.jsx)(e.h2,{id:"serverthread",children:"ServerThread"}),"\n",(0,s.jsx)(e.pre,{children:(0,s.jsx)(e.code,{className:"language-c++",children:"class ServerThread : public Thread {\n const ServerHandle *handle_;\n \n void ServerThread::DoCronTask();\n void ServerThread::ProcessNotifyEvents(const PinkFiredEvent* pfe);\n virtual void HandleConnEvent(PinkFiredEvent *pfe) = 0;\n virtual void HandleNewConn(int connfd, const std::string& ip_port) = 0;\n \n void *ServerThread::ThreadMain() {\n while (!should_stop()) {\n DoCronTask();\n // epoll_wait\n nfds = pink_epoll_->PinkPoll(timeout);\n for (int i = 0; i < nfds; i++) {\n if (pfe->fd == pink_epoll_->notify_receive_fd()) {\n ProcessNotifyEvents(pfe);\n continue;\n }\n if (/*is listening fd*/) {\n connfd = accept(fd, (struct sockaddr *) &cliaddr, &clilen);\n handle_->AccessHandle(ip_port);\n /*\n * Handle new connection,\n * implemented in derived class\n */\n HandleNewConn(connfd, ip_port);\n } else {\n /*\n * Handle connection's event\n * implemented in derived class\n */\n HandleConnEvent(pfe);\n }\n }\n }\n } \n}\n"})}),"\n",(0,s.jsx)(e.p,{children:"ServerThread\u7c7b\u4e3b\u8981\u63d0\u4f9b\u4e00\u4e2aserver\u7684\u6846\u67b6\uff0c\u4e5f\u662f\u4e00\u4e2a\u865a\u7c7b\uff0c\u884d\u751f\u7c7b\u9700\u8981\u5b9e\u73b0HandleConnEvent HandleNewConn \u7b49\u51fd\u6570\u3002"}),"\n",(0,s.jsx)(e.p,{children:"1\uff0c\u5176\u4e2dServerHandle \u662f\u5404\u79cd\u4e8b\u4ef6\u53d1\u751f\u4e4b\u540e\u7684\u56de\u8c03\u51fd\u6570\uff0c\u8fd9\u4e2a\u7c7b\u7531\u4f7f\u7528\u8005\u5b9e\u73b0\u5e76\u4f20\u5165serverthread\uff0c\u5404\u7c7b\u4e8b\u4ef6\uff08\u4f8b\u5982\u94fe\u63a5\u5173\u95ed\uff09\u53d1\u751f\u65f6\uff0cserverthread \u4f1a\u8c03\u7528\u76f8\u5e94\u7684\u56de\u8c03\u51fd\u6570\u901a\u77e5serverthread \u7684\u4f7f\u7528\u8005\u3002ServerHandle\u5305\u542b\u7684\u51fd\u6570\u6709\u5904\u7406\u8fde\u63a5\u8d85\u65f6\u7684FdTimeoutHandle\uff0c\u5904\u7406\u8fde\u63a5\u88ab\u5173\u95ed\u7684FdClosedHandle \u7b49\u7b49\u3002"}),"\n",(0,s.jsx)(e.pre,{children:(0,s.jsx)(e.code,{className:"language-c++",children:"class ServerHandle {\n virtual void FdTimeoutHandle(int fd, const std::string& ip_port) const {\n UNUSED(fd);\n UNUSED(ip_port);\n }\n virtual void FdClosedHandle(int fd, const std::string& ip_port) const {\n UNUSED(fd);\n UNUSED(ip_port);\n }\n ...\n}\n"})}),"\n",(0,s.jsx)(e.p,{children:"2\uff0cProcessNotifyEvents \u51fd\u6570\u4e3b\u8981\u662fserverthread\u5904\u7406\u5f02\u6b65\u901a\u4fe1\u7528\u7684\uff0c\u5176\u4ed6\u7ebf\u7a0b\u53ef\u4ee5\u901a\u8fc7\u5199\u5165PinkEpoll \u7684notify_send_fd\uff08\u5177\u4f53\u7684\u6d88\u606f\u5185\u5bb9\u5b58\u5230\u4e86notify_queue\u91cc\u9762\uff09\uff0c\u5728\u4e0b\u4e00\u6b21serverthread epoll \u5faa\u73af\u7684\u65f6\u5019\u5c31\u53ef\u4ee5\u901a\u8fc7notify_receive_fd\u8bfb\u5230\u6709\u6d88\u606f\u8981\u5904\u7406\uff0c\u4ecenotify_queue\u8bfb\u51fa\u6d88\u606f\uff0c\u5904\u7406\u5176\u4ed6\u7ebf\u7a0b\u7684\u4e8b\u4ef6\u3002"}),"\n",(0,s.jsx)(e.pre,{children:(0,s.jsx)(e.code,{className:"language-c++",children:"class PinkEpoll {\n // fds is pipe\n notify_receive_fd_ = fds[0];\n notify_send_fd_ = fds[1];\n std::queue<PinkItem> notify_queue_;\n}\n"})}),"\n",(0,s.jsx)(e.h3,{id:"dispatchthread",children:"DispatchThread"}),"\n",(0,s.jsx)(e.p,{children:"DispatchThread\u7ef4\u62a4\u4e00\u7ec4worker thread\uff0cworker thread \u7528\u6765\u5904\u7406\u5ba2\u6237\u7aef\u8fde\u63a5\u7684\u8bfb\u5199\uff0cDispatchThread\u4e3b\u8981\u8d1f\u8d23accept \u5ba2\u6237\u7aefsocket\u8fde\u63a5\uff0c\u7136\u540e\u901a\u8fc7worker\u7ebf\u7a0b\u7684pink_epoll \u901a\u77e5worker\u7ebf\u7a0b\u3002DispatchThread\u7ee7\u627f\u4e8eServerThread\u53ea\u662f\u5b9e\u73b0\u4e86HandleNewConn \u7528\u4e8e\u5904\u7406\u65b0\u8fde\u63a5\u3002"}),"\n",(0,s.jsx)(e.p,{children:(0,s.jsx)(e.img,{alt:"alt text",src:r(9384).A+"",width:"630",height:"383"})}),"\n",(0,s.jsx)(e.pre,{children:(0,s.jsx)(e.code,{className:"language-c++",children:"class DispatchThread : public ServerThread {\n void DispatchThread::HandleNewConn() {\n // schedule this conn to one of worker\n PinkItem ti(connfd, ip_port, kNotiConnect);\n std::queue<PinkItem> *q\n = &(worker_thread_[next_thread]->pink_epoll()->notify_queue_);\n q->push(ti);\n }\n}\n\n// \u5176\u672c\u8d28\u662f\u4e00\u4e2a server \u7ebf\u7a0b\u7684\u7f29\u5199\u7248\u672c \u53ea\u5904\u7406conn \u7684\u8bfb\u5199\nclass WorkerThread : public Thread {\n // pink_epoll \u4e3a\u4e86Dispatch \u7ebf\u7a0baccept \u4e4b\u540e\u53ef\u4ee5\u901a\u77e5\u7ed9worker\u7ebf\u7a0b\n PinkEpoll *pink_epoll_;\n void *WorkerThread::ThreadMain() {\n while(!should_stop) {\n nfds = pink_epoll_->PinkPoll(timeout);\n for (int i = 0; i < nfds; i++) {\n if (pfe->fd == pink_epoll_->notify_receive_fd()) {\n if (ti.notify_type() == kNotiConnect) {\n // \u5c06accept \u7684fd \u6536\u5165\u5230\u81ea\u5df1\u7684conn\u7ed3\u6784\u91cc\u9762\uff0c\u4e4b\u540e\u8d1f\u8d23\u8fd9\u4e2aconn\u7684\u8bfb\u5199\n std::shared_ptr<PinkConn> tc = conn_factory_->NewPinkConn(\n ti.fd(), ti.ip_port(),\n server_thread_, private_data_, pink_epoll_);\n } else if (ti.notify_type() == kNotiEpollout) {\n pink_epoll_->PinkModEvent(ti.fd(), 0, EPOLLOUT);\n } else if (....) {\n ....\n }\n } else {\n if ((pfe->mask & EPOLLOUT) && in_conn->is_reply()) {\n WriteStatus write_status = in_conn->SendReply();\n ...\n }\n if (!should_close && (pfe->mask & EPOLLIN)) {\n ReadStatus read_status = in_conn->GetRequest();\n\t\t\t\t\t\t...\n }\n }\n }\n }\n }\n}\n"})}),"\n",(0,s.jsx)(e.p,{children:"1\uff0c\u65b0\u5efa\u5ba2\u6237\u7aef\u8fde\u63a5\u65f6\u5019Dispatch Thread\u8c03\u7528HandleNewConn \u5411worker thread \u4f20\u5165fd\u6d88\u606f\uff0cworker thread \u8d1f\u8d23\u8c03\u7528conn_factory \u4e2d\u7684NewPinkConn\u65b9\u6cd5\uff0c\u6309\u7167\u4f7f\u7528\u8005\u7684\u5b9e\u73b0\u65b9\u5f0f\u65b0\u5efa\u4e00\u4e2aconnection\u8d1f\u8d23\u540e\u7eed\u7684\u6570\u636e\u8bfb\u5199\u3002"}),"\n",(0,s.jsx)(e.p,{children:"ConnFactory \u662f\u4e00\u4e2a\u5de5\u5382\u7c7b\uff0c\u7528\u4e8e\u521b\u5efa\u8fde\u63a5\uff0cDispatchThread \u7684\u4f7f\u7528\u8005\u5fc5\u987b\u81ea\u5df1\u5b9e\u73b0\u5176ConnFactory::NewPinkConn \u51fd\u6570\u3002"}),"\n",(0,s.jsx)(e.pre,{children:(0,s.jsx)(e.code,{className:"language-c++",children:"\n\n/*\n * for every conn, we need create a corresponding ConnFactory\n */\nclass ConnFactory {\n public:\n virtual ~ConnFactory() {}\n virtual std::shared_ptr<PinkConn> NewPinkConn(\n int connfd,\n const std::string &ip_port,\n Thread *thread,\n void* worker_private_data, /* Has set in ThreadEnvHandle */\n PinkEpoll* pink_epoll = nullptr) const = 0;\n};\n"})}),"\n",(0,s.jsx)(e.p,{children:"2\uff0c\u540e\u7eed\u901a\u8fc7\u8c03\u7528\u4e0d\u540cconnection\u5b9e\u73b0\u7684SendReply \u548cGetRequest \u8fdb\u884c\u8bfb\u5199\u64cd\u4f5c\u3002"}),"\n",(0,s.jsx)(e.h3,{id:"connection",children:"Connection"}),"\n",(0,s.jsx)(e.p,{children:"PinkConn\u7c7b\u662f\u5bf9\u5ba2\u6237\u7aef\u8fde\u63a5\u7684\u62bd\u8c61\uff0c\u63a7\u5236\u5ba2\u6237\u7aef\u6570\u636e\u7684\u8bfb\u53d6\uff0c\u89e3\u6790\uff0c\u4ee5\u53ca\u7ed3\u679c\u7684\u7f13\u5b58\uff0c\u5199\u56de\u3002\u4e0d\u540c\u534f\u8bae\u7684connection\u56de\u6709\u76f8\u5e94\u7684\u81ea\u5df1\u5b9e\u73b0\uff0c\u8fd9\u91cc\u4ee5RedisConn\u4e3a\u4f8b\u3002"}),"\n",(0,s.jsx)(e.pre,{children:(0,s.jsx)(e.code,{className:"language-c++",children:"class PinkConn : public std::enable_shared_from_this<PinkConn> {\n virtual ReadStatus GetRequest() = 0;\n virtual WriteStatus SendReply() = 0;\n int fd_;\n std::string ip_port_;\n bool is_reply_;\n struct timeval last_interaction_;\n int flags_;\n}\n"})}),"\n",(0,s.jsx)(e.p,{children:"PinkConn \u5f53\u4e2d\u5305\u542b\u4e86GetRequest SendReply\u4e24\u4e2a\u7eaf\u865a\u51fd\u6570\uff0c\u63a7\u5236\u6570\u636e\u5982\u4f55\u8bfb\u53d6\u548c\u5199\u56de\u3002"}),"\n",(0,s.jsx)(e.pre,{children:(0,s.jsx)(e.code,{className:"language-c++",children:"class RedisConn: public PinkConn {\n RedisConn(const int fd,\n const std::string& ip_port,\n ...\n const HandleType& handle_type = kSynchronous,\n const int rbuf_max_len = REDIS_MAX_MESSAGE);\n // serverthread \u6216\u8005 worker thread \u8c03\u7528\n virtual ReadStatus GetRequest() {\n // read from socket\n // forward to redis_parser_, redis_parser will invoke callback\n // when one command is completely parsed\n redis_parser_.ProcessInputBuffer();\n }\n virtual WriteStatus SendReply() {\n // write response back\n while() {\n nwritten = write(fd(), response_.data() + wbuf_pos_,\n wbuf_len - wbuf_pos_);\n }\n }\n \n // RedisConn \u4f7f\u7528\u8005\u8c03\u7528\n int RedisConn::WriteResp(const std::string& resp) {\n response_.append(resp);\n set_is_reply(true);\n return 0;\n }\n // kAsynchronous \u8c03\u7528\u63a5\u53e3\n virtual void AsynProcessRedisCmds(\n const std::vector<RedisCmdArgsType>& argvs, std::string* response);\n void NotifyEpoll(bool success) {\n // write to server thread or worker thread(conn holder) notify_send_fd\n // if success true tell conn holder set fd kEpolloutAndEpollin\n // if success false close conn holder this conn\n } \n //kSynchronous \u8c03\u7528\u63a5\u53e3\n virtual int DealMessage(\n const RedisCmdArgsType& argv, std::string* response) = 0;\n \n RedisParser redis_parser_;\n std::string response_;\n}\n\nRedisConn::RedisConn() {\n // \u521d\u59cb\u5316 \u5c06redis conn\u7684ParserDealMessageCb ParserCompleteCb\u6302\u8f7d\u5230\n // redis parser\u4e2d\uff0credis parser \u89e3\u6790\u51fa\u5b8c\u6574\u7684\u4e00\u6761redis \u547d\u4ee4\u4f1a\u8c03\u7528\u76f8\n // \u5e94\u7684ParserDealMessageCb \u6216\u8005ParserCompleteCb \u51fd\u6570\n RedisParserSettings settings;\n settings.DealMessage = ParserDealMessageCb;\n settings.Complete = ParserCompleteCb;\n}\n\n// \u6839\u636e\u5177\u4f53\u7684RedisConn \u7684\u914d\u7f6e\u662f\u5426\u4e3a\u5f02\u6b65\u6a21\u5f0f \u8c03\u7528RedisConn\u7684DealMessage\n// \u51fd\u6570\u6216\u8005AsynProcessRedisCmds\nint RedisConn::ParserDealMessageCb(\n RedisParser* parser, const RedisCmdArgsType& argv) {\n RedisConn* conn = reinterpret_cast<RedisConn*>(parser->data);\n if (conn->GetHandleType() == HandleType::kSynchronous) {\n return conn->DealMessage(argv, &(conn->response_));\n } else {\n return 0;\n }\n}\nint RedisConn::ParserCompleteCb(\n RedisParser* parser, const std::vector<RedisCmdArgsType>& argvs) {\n RedisConn* conn = reinterpret_cast<RedisConn*>(parser->data);\n if (conn->GetHandleType() == HandleType::kAsynchronous) {\n conn->AsynProcessRedisCmds(argvs, &(conn->response_));\n }\n return 0;\n}\n"})}),"\n",(0,s.jsx)(e.p,{children:"RedisConn \u4e2d\u7684redis_parser \u7ed3\u6784\u7528\u4e8e\u89e3\u6790redis \u547d\u4ee4\uff0c\u6bcf\u5f53\u89e3\u6790\u5b8c\u4e00\u6761\u5b8c\u6574\u7684redis \u547d\u4ee4\u540e\u56de\u8c03\u76f8\u5e94\u7684\u56de\u8c03\u51fd\u6570\u3002"}),"\n",(0,s.jsx)(e.p,{children:"1\uff0cGetRequest \u51fd\u6570\u4f1a\u4e0d\u505c\u7684\u4ecesocket\u8bfb\u6570\u636e\uff0c\u653e\u5165redis_parser\u89e3\u6790\u3002redis_parser\u6839\u636e\u89e3\u6790\u60c5\u51b5\u5728\u5408\u9002\u7684\u65f6\u5019\u8c03\u7528\u5176DealMessage Complete\u56de\u8c03\u3002"}),"\n",(0,s.jsx)(e.p,{children:"2\uff0cSendReply \u51fd\u6570\uff0c\u4f1a\u5728\u5408\u9002\u7684\u65f6\u673a\u8c03\u7528write \u5c06response \u7f13\u5b58\u7684\u8fd4\u56de\u6570\u636e\u5199\u5411\u5ba2\u6237\u7aef\u3002"}),"\n",(0,s.jsx)(e.p,{children:"\u4f7f\u7528\u8005\u9700\u8981\u7ee7\u627fRedisConn \u5b9e\u73b0\u7c7b\u4f3cMyRedisConn \u7684\u7c7b\uff0c\u5e76\u4e14\u5728\u5176\u5185\u90e8\u5b9e\u73b0 DealMessage \u51fd\u6570\u6216\u8005AsynProcessRedisCmds\u3002\u53d6\u51b3\u4e8e\u5f53\u524d\u4f7f\u7528\u7684Conn\u7684\u6a21\u5f0f\u3002"}),"\n",(0,s.jsx)(e.p,{children:"kAsynchronous\u6a21\u5f0f\u4e0bAsynProcessRedisCmds \u7684\u5b9e\u73b0\u901a\u5e38\u628a\u89e3\u6790\u597d\u7684Cmd \u4ea4\u4ed8\u7ed9\u53e6\u5916\u7684\u7ebf\u7a0b\u5904\u7406\uff0c\u4f8b\u5982T1\uff0cT1\u5728\u5904\u7406\u5b8c\u547d\u4ee4\u4e4b\u540e\uff0c\u8c03\u7528WriteResp\u63a5\u53e3\u5c06\u7ed3\u679c\u5199\u5165RedisConn\uff0c\u518d\u8c03\u7528NotifyEpoll \u5c06\u8fd9\u4e2aRedisConn \u7684EPOLLOUT\u76d1\u542c\u6253\u5f00\uff0cserverthread \u6216\u8005worker thread\u7684\u4e0b\u4e00\u4e2aepoll \u5faa\u73af \u53ef\u4ee5\u5c06\u7ed3\u679c\u5199\u56de\u3002"}),"\n",(0,s.jsx)(e.p,{children:"kSynchronous \u6a21\u5f0f\u4e0bDealMessage \u7684\u5b9e\u73b0\u901a\u5e38\u4f1a\u76f4\u63a5\u5904\u7406\u547d\u4ee4\u8c03\u7528WriteResp\uff0c\u8fd4\u56deworker thread \u7684ThreadMain \u51fd\u6570\u4e4b\u540e\uff0c\u5728\u4e0b\u4e00\u4e2aepoll\u5faa\u73af\u5c06\u7ed3\u679c\u5199\u56de\u3002"}),"\n",(0,s.jsx)(e.h2,{id:"pika-\u7ebf\u7a0b\u6a21\u578b\u4ee5\u53cacmd\u5904\u7406\u987a\u5e8f",children:"Pika \u7ebf\u7a0b\u6a21\u578b\u4ee5\u53caCmd\u5904\u7406\u987a\u5e8f"}),"\n",(0,s.jsx)(e.p,{children:"Pika \u7684PikaDispatchThread \u662fDispatchThread \u7684\u5b9a\u5236\u5b9e\u73b0\uff0cPikaClientConn\u662fRedisConn \u7684\u5b9a\u5236\u5b9e\u73b0\u3002"}),"\n",(0,s.jsx)(e.p,{children:(0,s.jsx)(e.img,{alt:"alt text",src:r(3875).A+"",width:"1218",height:"385"})}),"\n",(0,s.jsx)(e.pre,{children:(0,s.jsx)(e.code,{className:"language-c++",children:"class PikaDispatchThread {\n class ClientConnFactory : public pink::ConnFactory {\n virtual std::shared_ptr<pink::PinkConn> NewPinkConn() {\n return std::static_pointer_cast<pink::PinkConn>\n (std::make_shared<PikaClientConn>())\n }\n }\n class Handles : public pink::ServerHandle {}\n}\n\nclass PikaClientConn: public pink::RedisConn {\n void AsynProcessRedisCmds(\n const std::vector<pink::RedisCmdArgsType>& argvs,\n std::string* response) override;\n};\nvoid PikaClientConn::AsynProcessRedisCmds() {\n // schedule to thread pool\n g_pika_server->ScheduleClientPool(&DoBackgroundTask, arg);\n}\n// thread pool thead start processing cmd\nvoid PikaClientConn::DoBackgroundTask(void* arg) {\n if (error) {\n // close conn\n conn_ptr->NotifyEpoll(false);\n }\n conn_ptr->BatchExecRedisCmd(bg_arg->redis_cmds);\n}\nvoid PikaClientConn::BatchExecRedisCmd(\n const std::vector<pink::RedisCmdArgsType>& argvs) {\n // process cmd...\n TryWriteResp();\n}\nvoid PikaClientConn::TryWriteResp() {\n // write response to local resp\n ...\n // notify worker thread open fd EPOLLOUT and ready to write back\n NotifyEpoll(true);\n}\n"})}),"\n",(0,s.jsx)(e.p,{children:(0,s.jsx)(e.img,{alt:"alt text",src:r(3114).A+"",width:"908",height:"601"})}),"\n",(0,s.jsx)(e.p,{children:"1\uff0c\u65b0\u7684\u5ba2\u6237\u7aef\u8fde\u63a5\u63a5\u5165\u5230DispatchThread\uff0cDispatchThread accept \u5e76\u751f\u6210fd\uff0c\u4f20\u9012\u5230worker thread\u3002"}),"\n",(0,s.jsx)(e.p,{children:"2\uff0cworker thread \u8c03\u7528ClientConnFactory \u7684NewPinkConn \u751f\u6210PikaClientConn\uff0c\u4ece\u6b64\u7ef4\u62a4\u6b64PikaClientConn\u7684\u8bfb\u5199\u884c\u4e3a\u3002"}),"\n",(0,s.jsx)(e.p,{children:"3\uff0cworker thread\u8c03\u7528GetRequest\u8bfb\u53d6\u5ba2\u6237\u7aef\u8bf7\u6c42\u653e\u5165redis_parser \u8fdb\u884c\u89e3\u6790\uff0credis_parser \u8c03\u7528PikaClientConn::AsynProcessRedisCmds\u5b9e\u73b0\u3002\u5c06\u6b64cmd \u653e\u5165thread pool queue\u3002"}),"\n",(0,s.jsx)(e.p,{children:"4\uff0cthread pool thread \u5904\u7406cmd\uff0c\u8c03\u7528PikaClientConn::WriteResp\u5c06\u5904\u7406\u7ed3\u679c\u5199\u5165PikaClientConn\u7684resp \u7ed3\u6784\uff0c\u8c03\u7528PikaClientConn::NotifyEpoll \u901a\u77e5worker thread \u53ef\u4ee5\u8fd4\u56de\u5ba2\u6237\u7aef\u3002"}),"\n",(0,s.jsx)(e.p,{children:"5\uff0cworker thread \u63a5\u6536kNotiEpollout\u4e8b\u4ef6\uff0c\u6253\u5f00\u8fd9\u4e2aconn fd \u7684EPOLLOUT \uff0c\u4e0b\u4e00\u4e2aepoll_wait \u5468\u671f\u68c0\u6d4b\u5230\u8fd9\u4e2aconn\u53ef\u5199\uff0c\u8c03\u7528WriteResp\u5c06resp\u7684\u5185\u5bb9\u8fd4\u56de\u7ed9\u5ba2\u6237\u7aef\u3002"}),"\n",(0,s.jsx)(e.h2,{id:"reference",children:"Reference"}),"\n",(0,s.jsxs)(e.p,{children:[(0,s.jsx)(e.a,{href:"https://github.com/Qihoo360/pika/tree/v3.3.4",children:"https://github.com/Qihoo360/pika/tree/v3.3.4"}),"\n",(0,s.jsx)(e.a,{href:"https://github.com/Qihoo360/pink",children:"https://github.com/Qihoo360/pink"})]})]})}function p(n={}){const{wrapper:e}={...(0,i.R)(),...n.components};return e?(0,s.jsx)(e,{...n,children:(0,s.jsx)(l,{...n})}):l(n)}},9384:(n,e,r)=>{r.d(e,{A:()=>s});const s=r.p+"assets/images/image-1-9a1126eeffd6d9e00382d9ea0facef6a.png"},3875:(n,e,r)=>{r.d(e,{A:()=>s});const s=r.p+"assets/images/image-2-d22dac95c46ec5e9cec11a24fcd80157.png"},3114:(n,e,r)=>{r.d(e,{A:()=>s});const s=r.p+"assets/images/image-3-2010433160c1cee4c06a1058f6f052bd.png"},5546:(n,e,r)=>{r.d(e,{A:()=>s});const s=r.p+"assets/images/image-aad65eec86e42083a83018a4357d882b.png"},8453:(n,e,r)=>{r.d(e,{R:()=>o,x:()=>d});var s=r(6540);const i={},t=s.createContext(i);function o(n){const e=s.useContext(t);return s.useMemo((function(){return"function"==typeof n?n(e):{...e,...n}}),[e,n])}function d(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(i):n.components||i:o(n.components),s.createElement(t.Provider,{value:e},n.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/a5dfed40.a6c5c98b.js b/build/assets/js/a5dfed40.a6c5c98b.js new file mode 100644 index 0000000..a97c7b2 --- /dev/null +++ b/build/assets/js/a5dfed40.a6c5c98b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[4196],{1234:(i,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>l,default:()=>c,frontMatter:()=>s,metadata:()=>e,toc:()=>a});var o=t(4848),p=t(8453);const s={title:"What's new in Pika v3.5.3 ",slug:"Pika-3.5.3",authors:[{name:"360 \u4e2d\u95f4\u4ef6\u56e2\u961f",title:"Pika \u5f00\u6e90\u793e\u533a"}],hide_table_of_contents:!1},l=void 0,e={permalink:"/blog/Pika-3.5.3",source:"@site/blog/2024-03-27-Pika-3.5.3.md",title:"What's new in Pika v3.5.3 ",description:"\u968f\u7740 Redis \u5ba3\u5e03\u91c7\u7528\u53cc\u534f\u8bae\u4ee5\u7ef4\u62a4\u5176\u5546\u4e1a\u5229\u76ca\u4e4b\u9645\uff0cPikiwiDB(Pika) \u793e\u533a\u975e\u5e38\u8363\u5e78\u5730\u5ba3\u5e03\uff0c\u6211\u4eec\u7684\u6700\u65b0 v3.5.3 \u6b63\u5f0f\u751f\u4ea7\u53ef\u7528\u7248\u672c\u73b0\u5df2\u53d1\u5e03\u3002",date:"2024-03-27T00:00:00.000Z",tags:[],readingTime:14.535,hasTruncateMarker:!1,authors:[{name:"360 \u4e2d\u95f4\u4ef6\u56e2\u961f",title:"Pika \u5f00\u6e90\u793e\u533a"}],frontMatter:{title:"What's new in Pika v3.5.3 ",slug:"Pika-3.5.3",authors:[{name:"360 \u4e2d\u95f4\u4ef6\u56e2\u961f",title:"Pika \u5f00\u6e90\u793e\u533a"}],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"What's new in Pika v3.5.4",permalink:"/blog/Pika-3.5.4"},nextItem:{title:"What's new in Pika v3.5.0",permalink:"/blog/Pika-3.5.0"}},h={authorsImageUrls:[void 0]},a=[];function u(i){const n={a:"a",br:"br",img:"img",li:"li",ol:"ol",p:"p",ul:"ul",...(0,p.R)(),...i.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.p,{children:"\u968f\u7740 Redis \u5ba3\u5e03\u91c7\u7528\u53cc\u534f\u8bae\u4ee5\u7ef4\u62a4\u5176\u5546\u4e1a\u5229\u76ca\u4e4b\u9645\uff0cPikiwiDB(Pika) \u793e\u533a\u975e\u5e38\u8363\u5e78\u5730\u5ba3\u5e03\uff0c\u6211\u4eec\u7684\u6700\u65b0 v3.5.3 \u6b63\u5f0f\u751f\u4ea7\u53ef\u7528\u7248\u672c\u73b0\u5df2\u53d1\u5e03\u3002"}),"\n",(0,o.jsx)(n.p,{children:"v3.5.3 \u89e3\u51b3\u4e86\u5386\u53f2\u9057\u7559\u7684 Bug\uff0c\u5f15\u5165\u4e86\u591a\u9879\u65b0\u7279\u6027\u3002\u8fd9\u4e9b\u7279\u6027\u4e3b\u8981\u5305\u62ec Pika \u652f\u6301 ACL\u3001\u5220\u9664 Sharing \u6a21\u5f0f\u6b8b\u7559\u7684 Slot \u4ee3\u7801\u3001\u5feb\u6162\u547d\u4ee4\u5206\u79bb\u3001 Redis Stream\u3001\u5927 key \u5206\u6790\u5de5\u5177\u3001Pika \u5206\u5e03\u5f0f\u96c6\u7fa4\u652f\u6301\u5168\u81ea\u52a8\u5316 failover \u7b49\u529f\u80fd\uff0c\u540c\u65f6\uff0c\u6211\u4eec\u5728 3.5.3 \u7248\u672c\u4e30\u5bcc\u4e86\u66f4\u591a\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5 case\uff0c\u63d0\u5347 Pika \u670d\u52a1\u7684\u7a33\u5b9a\u6027\u548c\u5065\u58ee\u6027\uff0c\u4f1a\u8ba9\u7528\u6237\u611f\u53d7\u5230\u66f4\u4e3a\u9ad8\u6548\u548c\u7a33\u5b9a\u7684\u4f7f\u7528\u4f53\u9a8c\uff0c\u672c\u6587\u4e3b\u8981\u9610\u8ff0\u672c\u6b21\u6539\u52a8\u7684\u76f8\u5173\u91cd\u5927 feature\u3001bugfix \u6027\u80fd\u63d0\u5347\u9879\u3002"}),"\n",(0,o.jsx)(n.p,{children:"\u5728\u6df1\u5165\u63a2\u8ba8 3.5.3 \u7248\u672c\u7684\u66f4\u65b0\u5185\u5bb9\u4e4b\u524d\uff0c\u8bf7\u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\u58f0\u660e\uff1a"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\u7531\u4e8e\u5546\u6807\u95ee\u9898\uff0cPika \u9879\u76ee\u5df2\u66f4\u540d\u4e3a PikiwiDB\u3002\u6587\u4e2d\u4ee5 PikiwiDB(Pika) \u6307\u4ee3\u9879\u76ee",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika",children:"https://github.com/OpenAtomFoundation/pika"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u6211\u4eec\u65b0\u521b\u5efa\u4e86\u4e00\u4e2a\u9879\u76ee",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pikiwidb",children:"https://github.com/OpenAtomFoundation/pikiwidb"}),"\n\u8fd9\u662f\u4e00\u4e2a\u57fa\u4e8e Raft \u534f\u8bae\u5b9e\u73b0\u7684\u517c\u5bb9 Redis \u534f\u8bae\u7684\u5927\u5bb9\u91cf KV \u6570\u636e\u5e93\uff0c\u4e3b\u8981\u9762\u5411\u5f3a\u4e00\u81f4\u6027\u6570\u636e\u573a\u666f\uff0c\u4f8b\u5982\u5b58\u50a8\u7ea6 10TiB \u89c4\u6a21\u7684\u5143\u6570\u636e\u3002PikiwiDB \u5c06\u4e13\u95e8\u7528\u4e8e\u6307\u4ee3\u6b64\u9879\u76ee\u3002"]}),"\n",(0,o.jsx)(n.li,{children:"\u6211\u4eec\u4e3a PikiwiDB \u8bbe\u8ba1\u4e86\u4e00\u4e2a\u65b0\u7684 logo\uff0c\u4f5c\u4e3a\u5176\u5546\u6807\uff0c\u5e76\u5df2\u5728\u76f8\u5173\u653f\u5e9c\u673a\u6784\u6ce8\u518c\u3002"}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"2024-03-27-Pika-3.5.3-logo",src:t(1001).A+"",width:"1080",height:"451"})}),"\n",(0,o.jsx)(n.p,{children:"1 \u91cd\u5927\u6539\u8fdb"}),"\n",(0,o.jsx)(n.p,{children:"1.1 PikiwiDB(Pika) \u652f\u6301 ACL"}),"\n",(0,o.jsx)(n.p,{children:"PikiwiDB(Pika) 3.5.3 \u7248\u672c\u6b63\u5f0f\u5168\u9762\u652f\u6301 Redis ACL\uff0c\u4e3a\u672a\u6765\u5728\u4e91\u539f\u751f Pika \u96c6\u7fa4\u4e2d\u652f\u6301\u591a\u79df\u6237\u573a\u666f\u5960\u5b9a\u4e86\u57fa\u7840\u3002\u5728\u6b64\u4e4b\u524d\uff0cPika \u5df2\u7ecf\u652f\u6301\u4e86 Redis \u7684\u7528\u6237\u8ba4\u8bc1\u65b9\u5f0f\uff0c\u5982 auth/userpass/requirepass\uff0c\u4ee5\u53ca\u901a\u8fc7 pika.conf \u4e2d\u7684 userblacklist \u914d\u7f6e\u547d\u4ee4\u9ed1\u540d\u5355\u6a21\u5f0f\u3002\u672c\u6b21\u66f4\u65b0\u4fdd\u6301\u4e86\u5411\u540e\u517c\u5bb9\uff0c\u5e76\u652f\u6301\u8fd9\u4e9b\u5df2\u6709\u7684\u4f7f\u7528\u65b9\u5f0f\u3002"}),"\n",(0,o.jsx)(n.p,{children:"\u6211\u4eec\u8fd8\u786e\u4fdd PikiwiDB(Pika) \u7684 ACL \u5b9e\u73b0\u4e0e Redis ACL \u5b8c\u5168\u517c\u5bb9\uff0c\u901a\u8fc7\u5c06 Redis \u7684\u6240\u6709 ACL TCL \u6d4b\u8bd5\u96c6\u7eb3\u5165 PikiwiDB(Pika) \u7684\u6d4b\u8bd5\u96c6\u4e2d\u3002"}),"\n",(0,o.jsx)(n.p,{children:"\u5173\u952e PR\uff1a"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["PikiwiDB(Pika) \u652f\u6301 ACL\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2013",children:"https://github.com/OpenAtomFoundation/pika/pull/2013"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u6b63 ACL \u7528\u6237\u8ba4\u8bc1\u9519\u8bef\u95ee\u9898\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2449",children:"https://github.com/OpenAtomFoundation/pika/pull/2449"})]}),"\n",(0,o.jsxs)(n.li,{children:["ACL \u5411\u524d\u517c\u5bb9 userblacklist\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2459",children:"https://github.com/OpenAtomFoundation/pika/pull/2459"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u6dfb\u52a0 Redis ACL \u6d4b\u8bd5\u96c6\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2495",children:"https://github.com/OpenAtomFoundation/pika/pull/2495"})]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"1.2 \u6df7\u5408\u5b58\u50a8\u6a21\u578b\u652f\u6301 bitmap"}),"\n",(0,o.jsx)(n.p,{children:"\u5728\u5355\u4f53\u73af\u5883\u4e0b\uff0c\u540c\u65f6\u4f18\u5316 PikiwiDB(Pika) \u7684\u8bfb/\u5199/compaction \u662f\u4e00\u9879\u6311\u6218\u3002\u5728 v3.5.2 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u5f15\u5165\u4e86\u7531\u7f13\u5b58 Redis \u548c RocksDB \u6784\u6210\u7684\u6df7\u5408\u5b58\u50a8\u6a21\u578b\uff0c\u5e76\u652f\u6301\u4e86 string/list/set/zset/hashtable \u4e94\u79cd\u6570\u636e\u7ed3\u6784\u3002\u5728 3.5.3 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u589e\u52a0\u4e86\u5bf9 bitmap \u7684\u652f\u6301\u3002"}),"\n",(0,o.jsx)(n.p,{children:"\u6b64\u5916\uff0c\u6211\u4eec\u5728 3.5.3 \u7248\u672c\u4e2d\u652f\u6301\u5bf9 Redis \u7f13\u5b58\u8fdb\u884c\u52a8\u6001\u53c2\u6570\u8c03\u6574\u3002"}),"\n",(0,o.jsx)(n.p,{children:"\u5173\u952e PR \u94fe\u63a5\uff1a"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["\u652f\u6301 bitmap \u7684\u652f\u6301\uff1a\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2253",children:"https://github.com/OpenAtomFoundation/pika/pull/2253"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["\u53e6\u5916\uff0c\u6211\u4eec\u5728 3.5.3 \u7248\u672c\u4e2d\u652f\u6301\u5bf9 Redis \u7f13\u5b58\u8fdb\u884c\u52a8\u6001\u8c03\u53c2\uff1a\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2197",children:"https://github.com/OpenAtomFoundation/pika/pull/2197"})]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"1.3 \u5feb\u6162\u547d\u4ee4\u5206\u79bb"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\u4e3a\u4e86\u9632\u6b62\u6162\u547d\u4ee4\u628a\u5feb\u547d\u4ee4\u6267\u884c\u5361\u6b7b\uff0c\u6211\u4eec\u5728 Codis-Proxy \u548c PikiwiDB(Pika) \u4e24\u4e2a\u5c42\u9762\u90fd\u5b9e\u73b0\u4e86\u5feb\u6162\u547d\u4ee4\u5206\u79bb\u3002\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2162",children:"https://github.com/OpenAtomFoundation/pika/pull/2162"})]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"1.4 Redis Stream"}),"\n",(0,o.jsx)(n.p,{children:"\u867d\u7136 PikiwiDB(Pika) \u4e4b\u524d\u652f\u6301\u4e86 Redis pubsub\uff0c\u4f46\u5b83\u53ea\u80fd\u8fdb\u884c\u5728\u7ebf\u6d88\u606f\u4f20\u9012\u3002\u5728 3.5.3 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u589e\u52a0\u4e86\u5bf9 Redis Stream \u7684\u6709\u9650\u652f\u6301\uff0c\u7c7b\u4f3c\u4e8e\u6d88\u606f\u961f\u5217\uff08MQ\uff09\uff0c\u4ee5\u4fbf\u66f4\u5b89\u5168\u5730\u4f20\u9012\u6d88\u606f\u3002\u4e3a\u4e86\u786e\u4fdd\u6570\u636e\u7684\u5b89\u5168\u6027\uff0c\u6211\u4eec\u5728\u5e95\u5c42\u5f15\u64ce BlackWidow \u4e2d\u7279\u522b\u6dfb\u52a0\u4e86\u5bf9 Stream \u6570\u636e\u7c7b\u578b\u7684\u652f\u6301\u3002\n\u5173\u952e PR\uff1a"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Pika \u652f\u6301 Redis Stream\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1955",children:"https://github.com/OpenAtomFoundation/pika/pull/1955"}),"\n\u8bf7\u6ce8\u610f\uff0cPika Stream \u76ee\u524d\u8fd8\u4e0d\u652f\u6301\u6d88\u8d39\u7ec4\u6d88\u8d39\uff0c\u8fd9\u5c06\u5728\u540e\u7eed\u7248\u672c\u4e2d\u5b9e\u73b0\u3002"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"1.5 \u4e91\u539f\u751f\u96c6\u7fa4"}),"\n",(0,o.jsx)(n.p,{children:"\u5728 PikiwiDB(Pika) 3.5.0 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u5f00\u6e90\u4e86 Pika-Operator\uff0c\u5b83\u652f\u6301\u5728 K8s \u4e0a\u90e8\u7f72 Pika \u4e3b\u4ece\u5bf9\u3002\u5728 3.5.2 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u57fa\u4e8e Kubeblocks \u7684 Pika-Operator \u652f\u6301\u4e86\u5728 K8s \u4e0a\u90e8\u7f72\u7c7b\u4f3c Codis \u7684 Pika Cluster\uff0c\u4f46\u5f53\u65f6\u8fd8\u4e0d\u652f\u6301\u52a8\u6001\u6269\u7f29\u5bb9\u3002"}),"\n",(0,o.jsx)(n.p,{children:"\u5728 3.5.3 \u7248\u672c\u4e2d\uff0c\u6700\u65b0\u7684 Pika-Operator \u5df2\u7ecf\u652f\u6301\u4e86 Codis Group \u7ea7\u522b\u7684\u8282\u70b9\u6269\u7f29\u5bb9\uff0c\u5e76\u4e14\u652f\u6301\u6570\u636e\u7684 Rebalance\u3002\n\u5173\u952e PR\uff1a"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["PikiwiDB(Pika) Operator \u652f\u6301 pika \u96c6\u7fa4\u81ea\u52a8\u6269\u5bb9\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2121",children:"https://github.com/OpenAtomFoundation/pika/pull/2121"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["\u4f18\u5316 codis slot \u8fc1\u79fb\u901f\u5ea6\uff0c\u652f\u6301\u52a8\u6001\u4fee\u6539\u8fc1\u79fb\u7ebf\u7a0b\u548c\u901f\u5ea6\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2486",children:"https://github.com/OpenAtomFoundation/pika/pull/2486"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Pika-operator \u652f\u6301 namespace\uff0c\u5728\u4e0d\u540c\u7684 namespace \u4e0b\u90e8\u7f72\u4e0d\u540c\u7684\u96c6\u7fa4\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2480",children:"https://github.com/OpenAtomFoundation/pika/pull/2480"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Pika-operator \u652f\u6301\u76d1\u63a7\u6307\u6807\u91c7\u96c6\uff0c\u81ea\u52a8\u62c9\u8d77 pika-expoter"}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2451",children:"https://github.com/OpenAtomFoundation/pika/pull/2451"}),"\n1.6 Compaction \u6539\u8fdb"]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"PikiwiDB(Pika) \u7684\u5e95\u5c42\u78c1\u76d8\u5b58\u50a8\u5f15\u64ce RocksDB \u5728\u8fdb\u884c compaction \u65f6\u4f1a\u663e\u8457\u5f71\u54cd PikiwiDB(Pika) \u7684\u8bfb\u5199\u6027\u80fd\u3002\u56e0\u6b64\uff0c\u63a7\u5236\u597d compaction \u662f\u4f18\u5316 Pika \u8bfb\u5199\u6027\u80fd\u7684\u5173\u952e\u3002\n\u6709\u5173 compaction \u7684\u5173\u952e\u4f18\u5316 PR \u5982\u4e0b\uff1a"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\u6dfb\u52a0 CompactRange \u547d\u4ee4\u652f\u6301\u5bf9\u4e00\u5b9a\u8303\u56f4\u5185\u7684 key \u8fdb\u884c compact\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2163",children:"https://github.com/OpenAtomFoundation/pika/pull/2163"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u63d0\u5347 Compaction \u901f\u5ea6\u51cf\u5c11 Compaction \u8017\u65f6\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2172",children:"https://github.com/OpenAtomFoundation/pika/pull/2172"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u6267\u884c shutdown \u547d\u4ee4\u65f6\u8c03\u7528 disable compaction, \u63d0\u5347\u8fdb\u7a0b\u9000\u51fa\u901f\u5ea6\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2345",children:"https://github.com/OpenAtomFoundation/pika/pull/2345"})]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"1.7 \u81ea\u52a8 Failover"}),"\n",(0,o.jsx)(n.p,{children:"PikiwiDB(Pika) \u96c6\u7fa4\u76ee\u524d\u662f\u57fa\u4e8e Codis \u5b9e\u73b0\u7684\u3002\u4e3a\u4e86\u63d0\u9ad8\u57fa\u4e8e Codis \u7684 PikiwiDB(Pika) Cluster \u7684\u6613\u7528\u6027\uff0c\u6211\u4eec\u5bf9 Codis \u8fdb\u884c\u4e86\u8bb8\u591a\u6269\u5c55\u3002"}),"\n",(0,o.jsx)(n.p,{children:"\u539f\u59cb\u7684 Codis \u4e0d\u652f\u6301 Group \u5185\u7684 Failover\uff0c\u9700\u8981\u4f7f\u7528 Redis Sentinel\uff0c\u8fd9\u4f1a\u5bfc\u81f4\u8fd0\u7ef4\u6210\u672c\u589e\u52a0\u3002\u6211\u4eec\u5728 Codis Dashboard \u4e2d\u52a0\u5165\u4e86 sentinel \u7684\u529f\u80fd\uff0c\u5b9e\u73b0\u4e86\u5bf9 Group \u5185\u4e3b\u4ece\u7684\u81ea\u52a8 failover\u3002"}),"\n",(0,o.jsx)(n.p,{children:"\u5173\u952e PR\uff1a"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["PikiwiDB(Pika) \u5206\u5e03\u5f0f\u96c6\u7fa4\u652f\u6301\u81ea\u52a8 failover\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2386",children:"https://github.com/OpenAtomFoundation/pika/pull/2386"})]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"1.8 \u53ef\u89c2\u6d4b\u6027\u63d0\u5347"}),"\n",(0,o.jsx)(n.p,{children:"PikiwiDB(Pika) \u7684\u53ef\u89c2\u6d4b\u6027\u5173\u952e\u7ec4\u4ef6\u662f Pika-Exporter\u3002\u5728 3.5.2 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u867d\u7136\u6dfb\u52a0\u4e86 Redis Cache \u7f13\u5b58\u70ed\u6570\u636e\uff0c\u4f46\u7f3a\u5c11\u76d1\u63a7\u6307\u6807\u3002\u5728 3.5.3 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u589e\u52a0\u4e86\u5305\u62ec\u547d\u4e2d\u7387\u3001\u6bcf\u79d2\u547d\u4e2d\u6b21\u6570\u3001Redis Cache \u5185\u5b58\u4f7f\u7528\u91cf\u3001Redis Cache \u4e2a\u6570\u3001Redis Cache DB \u4e2a\u6570 \u7b49\u6307\u6807\u3002"}),"\n",(0,o.jsx)(n.p,{children:"\u5173\u952e PR\uff1a"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["PikiwiDB(Pika) exporter \u66b4\u9732 cache \u76f8\u5173\u7684\u6570\u636e\u91c7\u96c6\u6307\u6807",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2318",children:"https://github.com/OpenAtomFoundation/pika/pull/2318"})]}),"\n",(0,o.jsxs)(n.li,{children:["PikiwiDB(Pika) \u5206\u5e03\u5f0f\u96c6\u7fa4 Codis proxy \u65b0\u589e\u53ef\u89c2\u6d4b\u6307\u6807",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2199",children:"https://github.com/OpenAtomFoundation/pika/pull/2199"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590ddbsize \u8ba1\u7b97\u9519\u8bef\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2494",children:"https://github.com/OpenAtomFoundation/pika/pull/2494"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u7f51\u7edc\u76d1\u63a7\u6307\u6807\u7edf\u8ba1\u4e0d\u51c6\u786e\u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2234",children:"https://github.com/OpenAtomFoundation/pika/pull/2234"}),"\n1.9 \u6570\u636e\u4e00\u81f4\u6027\n3.5.3 \u7248\u672c\u4fee\u590d\u4e86\u8bb8\u591a PikiwiDB(Pika) \u4e3b\u4ece\u540c\u6b65\u95ee\u9898\uff0c\u786e\u4fdd\u6570\u636e\u7684\u4e00\u81f4\u6027\u3002"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"\u5173\u952e PR\uff1a"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u4e3b\u4ece\u590d\u5236\u8fc7\u7a0b\u4e2d, slave \u8282\u70b9\u6536\u5230 master \u5f02\u5e38\u56de\u5305\u540e\u7684\u5904\u7406\u903b\u8f91",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2319",children:"https://github.com/OpenAtomFoundation/pika/pull/2319"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d Pika cache \u90e8\u5206\u573a\u666f\u4e0b cache \u548c DB \u6570\u636e\u4e0d\u4e00\u81f4\u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2225",children:"https://github.com/OpenAtomFoundation/pika/pull/2225"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u5168\u91cf\u590d\u5236\u5931\u8d25\u540e\uff0c\u672a\u505a\u5904\u7406\u5bfc\u81f4\u6570\u636e\u4e22\u5931\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2439",children:"https://github.com/OpenAtomFoundation/pika/pull/2439"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u4e3b\u4ece\u590d\u5236\u8fc7\u7a0b\u4e2d\uff0c\u4e3b\u5b9e\u4f8b\u6267\u884c bgsave \u8fc7\u7a0b\u4e2d\uff0c\u6ca1\u6709\u6b63\u786e\u56de\u5e94\u4ece\u7684\u540c\u6b65\u8bf7\u6c42",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2437",children:"https://github.com/OpenAtomFoundation/pika/pull/2437"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u5168\u91cf\u590d\u5236\u8fc7\u7a0b\u4e2d\uff0c\u6dfb\u52a0\u6570\u636e\u540c\u6b65\u72b6\u6001\uff0c\u660e\u786e\u6570\u636e\u540c\u6b65\u8fdb\u5ea6",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2430",children:"https://github.com/OpenAtomFoundation/pika/pull/2430"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u4ece\u5e93\u5728 Apply binlog \u65f6\uff0c\u6ca1\u6709\u5bf9\u64cd\u4f5c\u7684 key \u52a0\u9501\uff0c\u5bfc\u81f4\u6570\u636e\u4e0d\u4e00\u81f4\u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2409",children:"https://github.com/OpenAtomFoundation/pika/pull/2409"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u8fc1\u79fb\u6570\u636e\u540e\u6570\u636e\u4e0d\u4e00\u81f4\u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2485",children:"https://github.com/OpenAtomFoundation/pika/pull/2485"})]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"1.10 \u6dfb\u52a0\u6d4b\u8bd5\u96c6"}),"\n",(0,o.jsx)(n.p,{children:"PikiwiDB(Pika) \u6d4b\u8bd5\u96c6\u7531 gtest \u5355\u6d4b\u3001Redis TCL \u6d4b\u8bd5\u96c6\u548c Go \u6d4b\u8bd5\u96c6\u7ec4\u6210\uff1a"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"gtest \u5355\u6d4b\u4e3b\u8981\u6d4b\u8bd5 Pika C++ \u4ee3\u7801"}),"\n",(0,o.jsx)(n.li,{children:"Redis TCL \u6d4b\u8bd5\u96c6\u6765\u81ea Redis\uff0c\u7528\u4e8e\u6d4b\u8bd5 PikiwiDB(Pika) \u5bf9 Redis \u6807\u51c6\u547d\u4ee4\u517c\u5bb9\u5ea6"}),"\n",(0,o.jsx)(n.li,{children:"Go \u6d4b\u8bd5\u96c6\u53ef\u5bf9 Pika \u8fdb\u884c Redis \u547d\u4ee4\u6d4b\u8bd5\u3001\u4e3b\u4ece\u548c Codis \u96c6\u7fa4 e2e \u6d4b\u8bd5"}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"3.5.3 \u4e2d\u6dfb\u52a0\u4e86 Codis \u96c6\u7fa4 e2e \u6d4b\u8bd5\uff0c\u5173\u952e PR \u5982\u4e0b\uff1a"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\u4e30\u5bcc\u4e86 Pika TCL \u6d4b\u8bd5\u96c6",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2497",children:"https://github.com/OpenAtomFoundation/pika/pull/2497"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4e30\u5bcc\u4e86 Pika Gotest \u6d4b\u8bd5\u96c6",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2502",children:"https://github.com/OpenAtomFoundation/pika/pull/2502"})]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["1.11 \u5de5\u5177\u96c6\nPikiwiDB(Pika) \u4e00\u76f4\u91cd\u89c6\u5de5\u5177\u96c6\u7684\u5efa\u8bbe\uff0c\u6240\u6709\u76f8\u5173\u5de5\u5177\u90fd\u53ef\u4ee5\u5728 ",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/tree/unstable/tools",children:"https://github.com/OpenAtomFoundation/pika/tree/unstable/tools"})," \u4e2d\u627e\u5230\u3002\u5728 3.5.3 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u65b0\u589e\u4e86\u4e00\u4e2a\u5de5\u5177\uff1a"]}),"\n",(0,o.jsxs)(n.p,{children:["PikiwiDB(Pika) \u652f\u6301\u5927 key \u5206\u6790\u5de5\u5177\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2195",children:"https://github.com/OpenAtomFoundation/pika/pull/2195"})]}),"\n",(0,o.jsx)(n.p,{children:"1.12 \u6587\u6863\u66f4\u65b0"}),"\n",(0,o.jsx)(n.p,{children:"PikiwiDB(Pika) \u7684\u6587\u6863\u4e3b\u8981\u662f wiki \u6587\u6863\u3002\u5728 3.5.3 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u66f4\u65b0\u4e86 Pika \u652f\u6301\u7684 Redis \u547d\u4ee4\u6587\u6863\u3002"}),"\n",(0,o.jsxs)(n.p,{children:["\u6587\u6863\u94fe\u63a5\uff1a ",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/wiki/pika-%E6%94%AF%E6%8C%81%E7%9A%84redis%E6%8E%A5%E5%8F%A3%E5%8F%8A%E5%85%BC%E5%AE%B9%E6%83%85%E5%86%B5",children:"https://github.com/OpenAtomFoundation/pika/wiki/pika-%E6%94%AF%E6%8C%81%E7%9A%84redis%E6%8E%A5%E5%8F%A3%E5%8F%8A%E5%85%BC%E5%AE%B9%E6%83%85%E5%86%B5"}),"\n2 \u6539\u8fdb\u5217\u8868"]}),"\n",(0,o.jsx)(n.p,{children:"\u5728\u7b2c\u4e00\u7ae0\u8282\u4e2d\uff0c\u6211\u4eec\u6982\u8ff0\u4e86 3.5.3 \u7248\u672c\u7684\u4e3b\u8981\u529f\u80fd\u5347\u7ea7\u548c\u6539\u8fdb\u3002\u4e0b\u9762\u8be6\u7ec6\u5217\u51fa\u4e86\u672c\u6b21\u53d1\u7248\u7684\u76f8\u5173 PR\u3002"}),"\n",(0,o.jsx)(n.p,{children:"2.1 \u65b0\u7279\u6027"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Pika \u652f\u6301 ACL"}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2013",children:"https://github.com/OpenAtomFoundation/pika/pull/2013"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"\u5728\u5168\u91cf\u590d\u5236\u7684\u8fc7\u7a0b\u4e2d\uff0cpika \u670d\u52a1\u7684\u4ece\u8282\u70b9\u4e0d\u63a5\u6536\u8bfb\u8bf7\u6c42"}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2197",children:"https://github.com/OpenAtomFoundation/pika/pull/2197"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["\u5220\u9664 Sharing \u6a21\u5f0f\u6b8b\u7559\u7684 Slot \u4ee3\u7801\uff0c\u56de\u5f52 3.0\uff0c\u4ee5\u540e\u4e00\u4e2a Pika \u4e0b\u6709\u591a\u4e2a DB\uff0c\u6bcf\u4e2a DB \u53ea\u6709\u4e00\u4e2a Blackwidow",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2251",children:"https://github.com/OpenAtomFoundation/pika/pull/2251"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["\u5728 Codis dashboard \u534f\u7a0b panic \u65f6\u81ea\u52a8\u6062\u590d\u670d\u52a1",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2349",children:"https://github.com/OpenAtomFoundation/pika/pull/2349"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Pika cache \u65b0\u589e bimap\u6570\u636e\u7c7b\u578b",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2253",children:"https://github.com/OpenAtomFoundation/pika/pull/2253"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Pika \u652f\u6301\u5feb\u6162\u547d\u4ee4\u5206\u79bb",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2162",children:"https://github.com/OpenAtomFoundation/pika/pull/2162"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Pika exporter \u66b4\u9732 cache \u76f8\u5173\u7684\u6570\u636e\u91c7\u96c6\u6307\u6807",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2318",children:"https://github.com/OpenAtomFoundation/pika/pull/2318"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Pika \u6267\u884c\u5b8c\u6210 Bgsave \u540e, \u4fdd\u7559 unix timepoint",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2167",children:"https://github.com/OpenAtomFoundation/pika/pull/2167"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Pika \u652f\u6301\u52a8\u6001\u914d\u7f6e disable_auto_compations \u53c2\u6570",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2257",children:"https://github.com/OpenAtomFoundation/pika/pull/2257"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Pika \u652f\u6301 Redis Stream",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1955",children:"https://github.com/OpenAtomFoundation/pika/pull/1955"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Pika \u652f\u6301\u5927 key \u5206\u6790\u5de5\u5177",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2195",children:"https://github.com/OpenAtomFoundation/pika/pull/2195"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Pika \u652f\u6301\u52a8\u6001\u8c03\u6574 Pika cache \u53c2\u6570",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2197",children:"https://github.com/OpenAtomFoundation/pika/pull/2197"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["\u66f4\u65b0 Pika benchmark \u5de5\u5177\u652f\u6301\u66f4\u591a\u7684\u63a5\u53e3\u538b\u6d4b",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2222",children:"https://github.com/OpenAtomFoundation/pika/pull/2222"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Pika Operator \u652f\u6301 pika \u96c6\u7fa4\u81ea\u52a8\u6269\u5bb9",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2121",children:"https://github.com/OpenAtomFoundation/pika/pull/2121"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["\u6dfb\u52a0 CompactRange \u547d\u4ee4\u652f\u6301\u5bf9\u4e00\u5b9a\u8303\u56f4\u5185\u7684 key \u8fdb\u884c compact",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2163",children:"https://github.com/OpenAtomFoundation/pika/pull/2163"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["\u63d0\u5347 Compaction \u901f\u5ea6\u51cf\u5c11 Compaction \u8017\u65f6",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2172",children:"https://github.com/OpenAtomFoundation/pika/pull/2172"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["\u5347\u7ea7 RocksDB \u7248\u672c\u5230 v8.7.3",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2157",children:"https://github.com/OpenAtomFoundation/pika/pull/2157"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Pika \u5206\u5e03\u5f0f\u96c6\u7fa4 Codis proxy \u65b0\u589e\u53ef\u89c2\u6d4b\u6307\u6807",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2199",children:"https://github.com/OpenAtomFoundation/pika/pull/2199"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Pika \u5206\u5e03\u5f0f\u96c6\u7fa4\u652f\u6301\u81ea\u52a8 failover",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2386",children:"https://github.com/OpenAtomFoundation/pika/pull/2386"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Pika \u652f\u6301 redis rename-command \u529f\u80fd",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2455",children:"https://github.com/OpenAtomFoundation/pika/pull/2455"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["\u4f18\u5316 codis slot \u8fc1\u79fb\u901f\u5ea6\uff0c\u652f\u6301\u52a8\u6001\u4fee\u6539\u8fc1\u79fb\u7ebf\u7a0b\u548c\u901f\u5ea6",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2486",children:"https://github.com/OpenAtomFoundation/pika/pull/2486"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Pika \u652f\u6301\u52a8\u6001\u8c03\u6574 max-conn-rbuf-size \u53c2\u6570",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2434",children:"https://github.com/OpenAtomFoundation/pika/pull/2434"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Pika-operator \u652f\u6301 namespace\uff0c\u53ef\u4ee5\u5728\u4e0d\u540c\u7684 namespace \u4e0b\u90e8\u7f72\u4e0d\u540c\u7684\u96c6\u7fa4",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2480",children:"https://github.com/OpenAtomFoundation/pika/pull/2480"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Pika-operator \u652f\u6301\u76d1\u63a7\u6307\u6807\u91c7\u96c6\uff0c\u81ea\u52a8\u62c9\u8d77 pika-expoter",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2451",children:"https://github.com/OpenAtomFoundation/pika/pull/2451"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["ACL \u5411\u524d\u517c\u5bb9 userblacklist",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2459",children:"https://github.com/OpenAtomFoundation/pika/pull/2459"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["\u4e30\u5bcc\u4e86 Pika TCL \u6d4b\u8bd5\u96c6",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2497",children:"https://github.com/OpenAtomFoundation/pika/pull/2497"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["\u4e30\u5bcc\u4e86 Pika Gotest \u6d4b\u8bd5\u96c6",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2502",children:"https://github.com/OpenAtomFoundation/pika/pull/2502"})]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"2.2 bug \u4fee\u590d"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d Pika \u6709\u4ece\u8282\u70b9\u8fdb\u884c\u5168\u91cf\u590d\u5236\u671f\u95f4\u4f1a\u8bef\u5220\u9664 dump \u6587\u4ef6\u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2377",children:"https://github.com/OpenAtomFoundation/pika/pull/2377"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u4e3b\u4ece\u590d\u5236\u8fc7\u7a0b\u4e2d, slave \u8282\u70b9\u6536\u5230 master \u5f02\u5e38\u56de\u5305\u540e\u7684\u5904\u7406\u903b\u8f91",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2319",children:"https://github.com/OpenAtomFoundation/pika/pull/2319"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u5728 Pika \u6267\u884c shutdown \u547d\u4ee4\u65f6\u8c03\u7528 disable compaction, \u63d0\u5347\u8fdb\u7a0b\u9000\u51fa\u901f\u5ea6",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2345",children:"https://github.com/OpenAtomFoundation/pika/pull/2345"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d Codis-dashboard Redis Memory \u503c\u4e0d\u51c6\u786e\u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2337",children:"https://github.com/OpenAtomFoundation/pika/pull/2337"})]}),"\n",(0,o.jsxs)(n.li,{children:["INFO \u547d\u4ee4\u8017\u65f6\u4f18\u5316\uff0c\u964d\u4f4e\u67e5\u78c1\u76d8\u4f7f\u7528\u91cf\u7684\u9891\u7387",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2197",children:"https://github.com/OpenAtomFoundation/pika/pull/2197"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d Rsync \u5220\u9664\u4e34\u65f6\u6587\u4ef6\u8def\u5f84\u4e0d\u5bf9\uff0c\u5220\u9664\u5931\u8d25\uff0c\u5bfc\u81f4rocksdb\u6253\u5f00\u5931\u8d25\u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2186",children:"https://github.com/OpenAtomFoundation/pika/pull/2186"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d Compact ,Bgsave ,Info keyspace \u547d\u4ee4\u672a\u6307\u5b9adb\u540d\u79f0\uff0c\u5bfc\u81f4\u90e8\u5206\u547d\u4ee4 coredump \u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2194",children:"https://github.com/OpenAtomFoundation/pika/pull/2194"})]}),"\n",(0,o.jsxs)(n.li,{children:["Codis dashboard \u7528 info replication \u66ff\u4ee3 info \u547d\u4ee4\u67e5\u5bfb master ip \u964d\u4f4e\u5bf9 Pika \u7684\u6027\u80fd\u5f71\u54cd",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2198",children:"https://github.com/OpenAtomFoundation/pika/pull/2198"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d Pika cache \u4f7f\u7528\u8fb9\u7f18case\uff0c\u89e3\u51b3\u90e8\u5206\u573a\u666f\u4e0b cache \u548c DB \u6570\u636e\u4e0d\u4e00\u81f4\u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2225",children:"https://github.com/OpenAtomFoundation/pika/pull/2225"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u5f53 dump \u6587\u4ef6\u5939\u4e3a\u7a7a\u65f6\uff0c\u4f1a\u542f\u52a8\u62a5\u9519 Segmentation fault \u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2265",children:"https://github.com/OpenAtomFoundation/pika/pull/2265"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u56e0\u4e3a flag \u8ba1\u7b97\u9519\u8bef\uff0c\u5bfc\u81f4\u7684\u90e8\u5206\u547d\u4ee4\u7f13\u5b58\u6ca1\u6709\u751f\u6548\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2217",children:"https://github.com/OpenAtomFoundation/pika/pull/2217"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u4e3b\u4ece\u590d\u5236\u6a21\u5f0f\u4e0b\uff0c\u4e3b\u5b9e\u4f8b flushdb \u540e\uff0c\u4ece\u5b9e\u4f8b\u56e0\u4e3a\u6b7b\u9501\u5bfc\u81f4\u7684\u4e0d\u80fd\u8bbf\u95ee\u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2249",children:"https://github.com/OpenAtomFoundation/pika/pull/2249"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u90e8\u5206\u547d\u4ee4\u672a\u5bf9 RocksDB \u7684\u8fd4\u56de\u503c\u8fdb\u884c\u5224\u65ad\u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2187",children:"https://github.com/OpenAtomFoundation/pika/pull/2187"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u89c4\u8303\u51fd\u6570\u7684\u8fd4\u56de\u503c\u53ca\u521d\u59cb\u503c",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2176",children:"https://github.com/OpenAtomFoundation/pika/pull/2176"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u7f51\u7edc\u76d1\u63a7\u6307\u6807\u7edf\u8ba1\u4e0d\u51c6\u786e\u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2234",children:"https://github.com/OpenAtomFoundation/pika/pull/2234"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u914d\u7f6e\u6587\u4ef6\u52a0\u8f7d\u90e8\u5206\u53c2\u6570\u5f02\u5e38\u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2218",children:"https://github.com/OpenAtomFoundation/pika/pull/2218"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d Codis dashboard cpu 100% \u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2393",children:"https://github.com/OpenAtomFoundation/pika/pull/2393"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d Codis fe pika \u4e3b\u4ece\u89d2\u8272\u663e\u793a\u5f02\u5e38\u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2387",children:"https://github.com/OpenAtomFoundation/pika/pull/2387"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u8fc1\u79fb\u6570\u636e\u540e\u6570\u636e\u4e0d\u4e00\u81f4\u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2485",children:"https://github.com/OpenAtomFoundation/pika/pull/2485"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590ddbsize \u8ba1\u7b97\u9519\u8bef\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2494",children:"https://github.com/OpenAtomFoundation/pika/pull/2494"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u6269\u7f29\u5bb9\u6216\u8005 pod \u8d77\u505c\u540e\uff0cCodis-dashboard \u754c\u9762\u663e\u793a\u4e0d\u51c6\u786e\u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2475",children:"https://github.com/OpenAtomFoundation/pika/pull/2475"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d DB \u5c42\u91cd\u590d\u4e0a\u9501\u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2372",children:"https://github.com/OpenAtomFoundation/pika/pull/2372"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u5168\u91cf\u590d\u5236\u5931\u8d25\u540e\uff0c\u672a\u505a\u5904\u7406\u5bfc\u81f4\u6570\u636e\u4e22\u5931\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2439",children:"https://github.com/OpenAtomFoundation/pika/pull/2439"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u4e3b\u4ece\u590d\u5236\u8fc7\u7a0b\u4e2d\uff0c\u4e3b\u5b9e\u4f8b\u6267\u884c bgsave \u8fc7\u7a0b\u4e2d\uff0c\u6ca1\u6709\u6b63\u786e\u56de\u5e94\u4ece\u7684\u540c\u6b65\u8bf7\u6c42",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2437",children:"https://github.com/OpenAtomFoundation/pika/pull/2437"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u5168\u91cf\u590d\u5236\u8fc7\u7a0b\u4e2d\uff0c\u6dfb\u52a0\u6570\u636e\u540c\u6b65\u72b6\u6001\uff0c\u660e\u786e\u6570\u636e\u540c\u6b65\u8fdb\u5ea6",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2430",children:"https://github.com/OpenAtomFoundation/pika/pull/2430"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u4ece\u5e93\u5728 Apply binlog \u65f6\uff0c\u6ca1\u6709\u5bf9\u64cd\u4f5c\u7684 key \u52a0\u9501\uff0c\u5bfc\u81f4\u6570\u636e\u4e0d\u4e00\u81f4\u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2409",children:"https://github.com/OpenAtomFoundation/pika/pull/2409"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d codis slot \u8fc1\u79fb\u8fc7\u7a0b\u4e2d master \u5b9e\u4f8b coredump \u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2415",children:"https://github.com/OpenAtomFoundation/pika/pull/2415"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u5728\u4e3b\u4ece\u590d\u5236\u8fc7\u7a0b\u4e2d\uff0c\u5220\u9664\u6b63\u5728\u4f7f\u7528\u7684 dump \u6587\u4ef6\u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2377",children:"https://github.com/OpenAtomFoundation/pika/pull/2377"})]}),"\n",(0,o.jsxs)(n.li,{children:["\u4fee\u590d\u4e3b\u4ece\u590d\u5236\u8fc7\u7a0b\u4e2d\u4ece\u5b9e\u4f8b rsync \u54cd\u5e94\u9519\u8bef\u7684\u95ee\u9898",(0,o.jsx)(n.br,{}),"\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2319",children:"https://github.com/OpenAtomFoundation/pika/pull/2319"})]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["2.3 \u53d1\u7248 tag\n",(0,o.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.3",children:"https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.3"}),"\n3 \u793e\u533a"]}),"\n",(0,o.jsx)(n.p,{children:"\u5982\u679c\u4f60\u6709\u4efb\u4f55\u7591\u95ee\uff0c\u6b22\u8fce\u52a0\u5165\u4ea4\u6d41\u7fa4\uff0cPikiwiDB(Pika) \u5f00\u6e90\u793e\u533a\u611f\u8c22\u5927\u5bb6\u7684\u652f\u6301\u548c\u5e2e\u52a9\u3002"}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"2024-03-27-Pika-3.5.3-connect",src:t(3228).A+"",width:"747",height:"431"})})]})}function c(i={}){const{wrapper:n}={...(0,p.R)(),...i.components};return n?(0,o.jsx)(n,{...i,children:(0,o.jsx)(u,{...i})}):u(i)}},3228:(i,n,t)=>{t.d(n,{A:()=>o});const o=t.p+"assets/images/2024-03-27-Pika-3.5.3-connect-c43aca0eeeb5cd09cc60b55f9a3df4e5.png"},1001:(i,n,t)=>{t.d(n,{A:()=>o});const o=t.p+"assets/images/2024-03-27-Pika-3.5.3-logo-b2c4565b5d1adebda975b365a3bcf337.png"},8453:(i,n,t)=>{t.d(n,{R:()=>l,x:()=>e});var o=t(6540);const p={},s=o.createContext(p);function l(i){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof i?i(n):{...n,...i}}),[n,i])}function e(i){let n;return n=i.disableParentContext?"function"==typeof i.components?i.components(p):i.components||p:l(i.components),o.createElement(s.Provider,{value:n},i.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/a605574d.4eb228bb.js b/build/assets/js/a605574d.4eb228bb.js new file mode 100644 index 0000000..0c3aaad --- /dev/null +++ b/build/assets/js/a605574d.4eb228bb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[4487],{7012:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>c,contentTitle:()=>d,default:()=>u,frontMatter:()=>a,metadata:()=>r,toc:()=>b});var t=s(4848),n=s(8453);const a={title:"Pubsub \u673a\u5236",sidebar_position:1},d=void 0,r={id:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/PubSub \u673a\u5236/index",title:"Pubsub \u673a\u5236",description:"\u524d\u4e00\u7bc7\u300aPika\u6e90\u7801\u5b66\u4e60--pika\u7684\u901a\u4fe1\u548c\u7ebf\u7a0b\u6a21\u578b\u300b\u91cc\u8bf4\u5230WorkerThread\u91cc\u9762\u6709\u4e24\u79cd\u5904\u7406\u547d\u4ee4\u7684\u65b9\u5f0f\uff0c\u4e00\u79cd\u662f\u540c\u6b65\uff0c\u4e00\u79cd\u662f\u5f02\u6b65\u3002\u90a3\u4ec0\u4e48\u65f6\u5019\u662f\u540c\u6b65\u5904\u7406\uff0c\u4ec0\u4e48\u65f6\u5019\u662f\u5f02\u6b65\u5904\u7406\u5462\uff1f\u5176\u5b9e",source:"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/PubSub \u673a\u5236/index.md",sourceDirName:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/PubSub \u673a\u5236",slug:"/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/PubSub \u673a\u5236/",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/PubSub \u673a\u5236/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/PubSub \u673a\u5236/index.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"Pubsub \u673a\u5236",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"\u901a\u4fe1\u548c\u7ebf\u7a0b\u6a21\u578b",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/\u901a\u4fe1\u548c\u7ebf\u7a0b\u6a21\u578b/"},next:{title:"Pika \u7684\u547d\u4ee4\u6267\u884c\u6846\u67b6",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/Pika \u7684\u547d\u4ee4\u6267\u884c\u6846\u67b6/"}},c={},b=[];function h(e){const i={img:"img",p:"p",...(0,n.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.p,{children:"\u524d\u4e00\u7bc7\u300aPika\u6e90\u7801\u5b66\u4e60--pika\u7684\u901a\u4fe1\u548c\u7ebf\u7a0b\u6a21\u578b\u300b\u91cc\u8bf4\u5230WorkerThread\u91cc\u9762\u6709\u4e24\u79cd\u5904\u7406\u547d\u4ee4\u7684\u65b9\u5f0f\uff0c\u4e00\u79cd\u662f\u540c\u6b65\uff0c\u4e00\u79cd\u662f\u5f02\u6b65\u3002\u90a3\u4ec0\u4e48\u65f6\u5019\u662f\u540c\u6b65\u5904\u7406\uff0c\u4ec0\u4e48\u65f6\u5019\u662f\u5f02\u6b65\u5904\u7406\u5462\uff1f\u5176\u5b9e\nClientConnFactory\u8fd4\u56de\u7684PikaClientConn\u9ed8\u8ba4\u90fd\u662f\u5f02\u6b65\u7684\u3002"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"alt text",src:s(8644).A+"",width:"554",height:"140"})}),"\n",(0,t.jsx)(i.p,{children:"\u540c\u6b65\u662f\u5728\u8ba2\u9605\u63a8\u9001\u91cc\u9762\u7528\u5230\uff0c\u6211\u4eec\u6765\u4e86\u89e3\u4e00\u4e0bpika\u7684PubSub\u673a\u5236\uff0c\u8fd9\u91cc\u4ee5Subscribe/UnSubscribe\u547d\u4ee4\u4e3a\u4f8b\u3002"}),"\n",(0,t.jsx)(i.p,{children:"1\u3001PubSub\u7ebf\u7a0b"}),"\n",(0,t.jsx)(i.p,{children:"PikaServer\u91cc\u9762\u5355\u72ec\u8d77\u4e86\u4e00\u4e2a\u7ebf\u7a0b\u7528\u6765\u5904\u7406\u8ba2\u9605\u63a8\u9001\u7684\u6d88\u606f"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"alt text",src:s(1402).A+"",width:"554",height:"96"})}),"\n",(0,t.jsx)(i.p,{children:"PubSubThread\u6784\u9020\u51fd\u6570\u91cc\u9762\u521b\u5efa\u4e86\u4e24\u4e2a\u7ba1\u9053\uff0c\u548c\u524d\u9762\u4ecb\u7ecd\u7684\u4e00\u6837\uff0c\u8fd9\u91cc\u7684\u7ba1\u9053\u662f\u7528\u6765\u7ebf\u7a0b\u95f4\u901a\u4fe1\u7528\u7684\uff0c\u5176\u4e2dmsg_pfd_\u662f\u6709\u63a8\u9001\u6d88\u606f\u5230\u6765\u65f6\u901a\u77e5\u8fdb\u884c\u63a8\u9001\uff0cnotify_pfd_\u662f\u7528\u4e8e\u8fde\u63a5\u7684\u52a0\u5165\u3002"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"alt text",src:s(1985).A+"",width:"554",height:"266"})}),"\n",(0,t.jsx)(i.p,{children:"PubSubThread\u7ee7\u627fThread\uff0c\u4e3b\u903b\u8f91\u5165\u53e3\u662fPubSubThread::ThreadMain\uff0c\u5728ThreadMain\u91cc\u9762\u4e3b\u8981\u5904\u7406\u65b0\u8fde\u63a5\u52a0\u5165\uff0c\u63a8\u9001\uff0c\u4ee5\u53ca\u8fde\u63a5\u7684\u6d88\u606f\uff0c\u8fd9\u51e0\u90e8\u5206\u9700\u8981\u5206\u522b\u7ed3\u5408\u4e0b\u9762\u7684\u4ecb\u7ecd\u6765\u8bf4\u660e\u3002"}),"\n",(0,t.jsx)(i.p,{children:"2\u3001Subscribe"}),"\n",(0,t.jsx)(i.p,{children:"Subscribe\u547d\u4ee4\u7684\u5165\u53e3\u662fSubscribeCmd::Do\uff0c\u8fd9\u91cc\u9664\u4e86\u6267\u884cSubscribe\u4e3b\u903b\u8f91\u5916\uff0c\u8fd8\u505a\u4e86\u4e0b\u56fe\u6846\u8d77\u6765\u7684\u4e24\u4e2a\u5173\u952e\u7684\u52a8\u4f5c"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"alt text",src:s(856).A+"",width:"554",height:"243"})}),"\n",(0,t.jsx)(i.p,{children:"\u628a\u8fde\u63a5\u7684fd\u4eceWorkerThread\u7ebf\u7a0b\u7684epoll\u4e2d\u5220\u9664WorkerThread::MoveConnOut\uff0c\u8bbe\u7f6ePubSub\u6807\u8bb0\u5e76\u4e14\u628a\u8fde\u63a5\u7684HandleType\u6539\u4e3a\u540c\u6b65\u6a21\u5f0f\u3002\u6211\u4eec\u518d\u770b\u4e0bSubscribe\u91cc\u9762\u505a\u4e86\u5565\u3002\u8ba2\u9605\u672c\u8eab\u7684\u903b\u8f91\u6bd4\u8f83\u7b80\u5355\uff0c\u5c31\u662f\u6784\u9020\u4e86\u4e00\u4e2achannel\u548cconn\u6570\u7ec4\u7684Map pubsub_channel_\uff0c\u7136\u540e\u628achannel\u548cconn\u5f80\u8fd9\u4e2amap\u4e0a\u52a0\u3002"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"alt text",src:s(3495).A+"",width:"554",height:"598"})}),"\n",(0,t.jsx)(i.p,{children:"\u6211\u4eec\u770b\u4e0b\u6700\u4e0b\u9762\u7684\u7ea2\u6846\uff0c\u524d\u9762\u628a\u8fde\u63a5\u7684fd\u4eceWorkerThread\u91cc\u9762\u5220\u9664\uff0c\u8fd9\u91cc\u628a\u8fd9\u4e2afd\u653e\u5230fd_queue\uff0c\u7136\u540e\u5199\u4e86\u4e00\u4e2a\u7ba1\u9053\u6d88\u606f\u901a\u77e5PubSub\u7ebf\u7a0b\u5904\u7406\uff0c\u6211\u4eec\u770b\u4e0bPubSubThread::ThreadMain\uff0c\u5982\u679c\u662fnotify_pfd_\u6765\u7684\u6d88\u606f\uff0c\u4f1a\u628afd\u52a0\u5230PubSubThread\u81ea\u5df1\u7684epoll\uff0c\u6240\u4ee5\u5982\u679c\u6709subscribe\u547d\u4ee4\u8fc7\u6765\u7684\u65f6\u5019\uff0c\u4f1a\u628a\u8fd9\u4e2a\u8fde\u63a5\u7684fd\u4eceWorkerThread\u8f6c\u79fb\u5230PubSubThread\u8fd9\u4e2a\u5355\u72ec\u7684\u7ebf\u7a0b\u6765\u5904\u7406\u3002"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"alt text",src:s(4270).A+"",width:"554",height:"276"})}),"\n",(0,t.jsx)(i.p,{children:"3\u3001UnSubscribe\nUnSubscribe\u547d\u4ee4\u7684\u5165\u53e3\u662fSubscribeCmd::Do\uff0c\u7406\u89e3\u4e86Subscribe\u7684\u903b\u8f91\u540e\uff0cUnSubscribe\u7684\u903b\u8f91\u5c31\u6bd4\u8f83\u597d\u7406\u89e3\u4e86\uff0c\u56e0\u4e3a\u4ed6\u505a\u4e86\u548cSubscribe\u76f8\u53cd\u7684\u64cd\u4f5c\uff1aPubSubThread::UnSubscribe\u91cc\u9762\u4f1aRemoveConn\uff0c\u628a\u8fde\u63a5fd\u4ecePubSubThread\u7684epoll\u5220\u9664\uff1b\u7136\u540e\u628a\u8fde\u63a5\u52a0\u56deWorkerThread\u7684epoll\uff0cPubSub\u6807\u8bb0\u7f6e\u4e3afalse"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"alt text",src:s(8277).A+"",width:"554",height:"264"})}),"\n",(0,t.jsx)(i.p,{children:"4\u3001Publish\nPublish\u547d\u4ee4\u7684\u5165\u53e3\u662fPublishCmd::Do\uff0c\u4e3b\u8981\u903b\u8f91\u662f\u53d1\u7ba1\u9053\u6d88\u606f\u901a\u77e5PubSubThread\u4e3b\u7ebf\u7a0b\u6765\u5904\u7406\u63a8\u9001"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"alt text",src:s(5388).A+"",width:"554",height:"234"})}),"\n",(0,t.jsx)(i.p,{children:"PubSubThread::ThreadMain\u5982\u679c\u6536\u5230\u63a8\u9001\u7684\u901a\u77e5\uff0c\u5219\u6839\u636e\u8ba2\u9605\u5173\u7cfb\u8fdb\u884c\u63a8\u9001"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"alt text",src:s(1227).A+"",width:"554",height:"366"})}),"\n",(0,t.jsx)(i.p,{children:"5\u3001\u5df2\u8ba2\u9605\u8fde\u63a5\u547d\u4ee4\u7684\u5904\u7406\n\u4e3a\u5565\u9700\u8981\u628a\u8ba2\u9605\u7684fd\u79fb\u5230\u5355\u72ec\u7684PubSubThread\u7ebf\u7a0b\uff0c\u5e76\u4e14\u7528\u540c\u6b65\u5904\u7406\u5462\uff1f\u628a\u8ba2\u9605\u8fde\u63a5fd\u79fb\u5230PubSubThread\u7ebf\u7a0b\u540e\uff0c\u5904\u7406\u5df2\u6709\u8fde\u63a5\u7684\u6d88\u606f\u7684\u903b\u8f91\u5176\u5b9e\u548c\u5728WorkerThread\u7c7b\u4f3c\uff0c\u4e5f\u662f\u7528RedisConn::GetRequest\u6765\u5904\u7406\u8bf7\u6c42\uff0c\u53ea\u4e0d\u8fc7\u5904\u7406\u7c7b\u578b\u53d8\u6210\u4e86\u540c\u6b65\u3002"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"alt text",src:s(98).A+"",width:"494",height:"539"})}),"\n",(0,t.jsx)(i.p,{children:"\u4ece\u524d\u4e00\u7bc7\u6587\u7ae0\u6211\u4eec\u53ef\u4ee5\u77e5\u9053\uff0c\u540c\u6b65\u7684\u5904\u7406\u662f\u5728ParserDealMessageCb\u51fd\u6570"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"alt text",src:s(3072).A+"",width:"554",height:"108"})}),"\n",(0,t.jsx)(i.p,{children:"\u7406\u8bba\u4e0a\u8bb2\u8fd9\u4e2aPikaClientConn::DealMessage\u5e94\u8be5\u662f\u8981\u5b9e\u73b0\u7684\u624d\u5bf9\uff0c\u4f46\u662f\u6211\u4e0b\u7684\u6700\u65b0\u7684\u4ee3\u7801\u53d1\u73b0\u8fd9\u4e2a\u51fd\u6570\u88ab\u6539\u6ca1\u4e86\uff08commitid: c9f2a66b1741a9148402b42128f46c36d3d83444\uff09"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"alt text",src:s(9321).A+"",width:"554",height:"48"})}),"\n",(0,t.jsx)(i.p,{children:"\u5728commit\u8bb0\u5f55\u91cc\u9762\u627e\u5230\u4e86\u4e4b\u524d\u7684\u5b9e\u73b0\uff0c\u6682\u65f6\u6ca1\u6709\u7814\u7a76\u8fd9\u4e2a\u4e3a\u5565\u8fd9\u6837\u6539\uff0c\u5148\u6309\u4ee5\u524d\u7684\u4ee3\u7801\u770b\uff0c\u4e0d\u5f71\u54cd\u5bf9\u6574\u4e2a\u903b\u8f91\u7684\u7406\u89e3\u3002\u53ef\u4ee5\u770b\u5230DealMessage\u5b9e\u9645\u4e0a\u4e5f\u662f\u8c03\u7528\u4e86PikaClientConn::DoCmd\u3002"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"alt text",src:s(2738).A+"",width:"554",height:"307"})}),"\n",(0,t.jsx)(i.p,{children:"\u56e0\u4e3aredis\u7684PubSub\u5b9e\u73b0\u662f\u8fd9\u6837\u7684\uff0c\u5982\u679c\u4e00\u4e2a\u5ba2\u6237\u7aef\u6b63\u5728\u8ba2\u9605\uff0c\u90a3\u4e48\u8fd9\u4e2a\u5ba2\u6237\u7aef\u53ea\u80fd\u6267\u884cSubscribe/UnSubscribe/PSubscribe/UnSubscribe/Ping\u8fd9\u51e0\u4e2a\u547d\u4ee4\uff0c\u8ba2\u9605\u548c\u53d6\u6d88\u8ba2\u9605\u662f\u6709\u65f6\u5e8f\u5173\u7cfb\u7684\uff0c\u800cping\u547d\u4ee4\u662f\u53ef\u4ee5\u76f4\u63a5\u5904\u7406\u7684\uff0c\u6240\u4ee5\u8fd9\u91cc\u5e94\u8be5\u662f\u4e3a\u4e86\u907f\u514d\u8ba2\u9605\u548c\u53d6\u6d88\u8ba2\u9605\u53d1\u751f\u65f6\u5e8f\u9519\u8bef\uff0c\u6240\u4ee5\u628a\u8ba2\u9605\u7684\u8fde\u63a5\u79fb\u5230\u5355\u72ec\u7684\u7ebf\u7a0bPubSubThread\u6765\u5904\u7406\uff0c\u5e76\u4e14\u4f7f\u7528\u540c\u6b65\u7684\u5904\u7406\u65b9\u5f0f\u3002"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"alt text",src:s(6891).A+"",width:"554",height:"159"})})]})}function u(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},1402:(e,i,s)=>{s.d(i,{A:()=>t});const t=s.p+"assets/images/image-1-73f773e065a7f4db8e884c876767aa6d.png"},3072:(e,i,s)=>{s.d(i,{A:()=>t});const t=s.p+"assets/images/image-10-5469cee1ab6d47996e06cce5681cfde4.png"},9321:(e,i,s)=>{s.d(i,{A:()=>t});const t=s.p+"assets/images/image-11-16e9fbeada8c7a1b6db7949bffee597a.png"},2738:(e,i,s)=>{s.d(i,{A:()=>t});const t=s.p+"assets/images/image-12-8e255fa3b354119ac26c7f09de1a26b6.png"},6891:(e,i,s)=>{s.d(i,{A:()=>t});const t=s.p+"assets/images/image-13-0fea61a46c039eff667cf42449fdc7dc.png"},1985:(e,i,s)=>{s.d(i,{A:()=>t});const t=s.p+"assets/images/image-2-4f3ceaebe71d52832af642ed1720bfaf.png"},856:(e,i,s)=>{s.d(i,{A:()=>t});const t=s.p+"assets/images/image-3-24ad1477d3eae8722a90467818d9c69c.png"},3495:(e,i,s)=>{s.d(i,{A:()=>t});const t=s.p+"assets/images/image-4-a5c268580385ecbd02dd7078aa328259.png"},4270:(e,i,s)=>{s.d(i,{A:()=>t});const t=s.p+"assets/images/image-5-37862647d0f631499532685d0e88b27e.png"},8277:(e,i,s)=>{s.d(i,{A:()=>t});const t=s.p+"assets/images/image-6-082780f16045bddafcca6f4adad51ed7.png"},5388:(e,i,s)=>{s.d(i,{A:()=>t});const t=s.p+"assets/images/image-7-68db181908ccd6249f1d2b31f8cd6d97.png"},1227:(e,i,s)=>{s.d(i,{A:()=>t});const t=s.p+"assets/images/image-8-6c0e3de67866aabdf733d6ffd7c304c6.png"},98:(e,i,s)=>{s.d(i,{A:()=>t});const t=s.p+"assets/images/image-9-2e2593ad7ed0974d5f98456801ba4e24.png"},8644:(e,i,s)=>{s.d(i,{A:()=>t});const t=s.p+"assets/images/image-0f19e5ab8e50d1da87f1f2e510633680.png"},8453:(e,i,s)=>{s.d(i,{R:()=>d,x:()=>r});var t=s(6540);const n={},a=t.createContext(n);function d(e){const i=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:d(e.components),t.createElement(a.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/a6aa9e1f.66477f6d.js b/build/assets/js/a6aa9e1f.66477f6d.js new file mode 100644 index 0000000..a71e1aa --- /dev/null +++ b/build/assets/js/a6aa9e1f.66477f6d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[7643],{2052:(e,t,i)=>{i.r(t),i.d(t,{default:()=>f});i(6540);var n=i(4164),a=i(4586),s=i(1213),r=i(7559),l=i(6535),o=i(1312),c=i(9022),g=i(4848);function p(e){const{metadata:t}=e,{previousPage:i,nextPage:n}=t;return(0,g.jsxs)("nav",{className:"pagination-nav","aria-label":(0,o.T)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[i&&(0,g.jsx)(c.A,{permalink:i,title:(0,g.jsx)(o.A,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)",children:"Newer Entries"})}),n&&(0,g.jsx)(c.A,{permalink:n,title:(0,g.jsx)(o.A,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)",children:"Older Entries"}),isNext:!0})]})}var d=i(1463),x=i(7131),h=i(6609);function j(e){let{items:t,component:i=h.A}=e;return(0,g.jsx)(g.Fragment,{children:t.map((e=>{let{content:t}=e;return(0,g.jsx)(x.i,{content:t,children:(0,g.jsx)(i,{children:(0,g.jsx)(t,{})})},t.metadata.permalink)}))})}var m=i(5260),u=i(6676);function b(e){const t=(0,u.k)(e);return(0,g.jsx)(m.A,{children:(0,g.jsx)("script",{type:"application/ld+json",children:JSON.stringify(t)})})}function k(e){const{metadata:t}=e,{siteConfig:{title:i}}=(0,a.A)(),{blogDescription:n,blogTitle:r,permalink:l}=t,o="/"===l?i:r;return(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(s.be,{title:o,description:n}),(0,g.jsx)(d.A,{tag:"blog_posts_list"})]})}function A(e){const{metadata:t,items:i,sidebar:n}=e;return(0,g.jsxs)(l.A,{sidebar:n,children:[(0,g.jsx)(j,{items:i}),(0,g.jsx)(p,{metadata:t})]})}function f(e){return(0,g.jsxs)(s.e3,{className:(0,n.A)(r.G.wrapper.blogPages,r.G.page.blogListPage),children:[(0,g.jsx)(k,{...e}),(0,g.jsx)(b,{...e}),(0,g.jsx)(A,{...e})]})}}}]); \ No newline at end of file diff --git a/build/assets/js/a7456010.2a0622b5.js b/build/assets/js/a7456010.2a0622b5.js new file mode 100644 index 0000000..6fc739e --- /dev/null +++ b/build/assets/js/a7456010.2a0622b5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[1235],{8552:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-pages","id":"default"}')}}]); \ No newline at end of file diff --git a/build/assets/js/a74ce679.5c25c20b.js b/build/assets/js/a74ce679.5c25c20b.js new file mode 100644 index 0000000..10c9d28 --- /dev/null +++ b/build/assets/js/a74ce679.5c25c20b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[7257],{4110:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>c,contentTitle:()=>s,default:()=>l,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var i=n(4848),o=n(8453);const r={title:"\u6027\u80fd\u4e0e\u4f18\u5316",sidebar_position:30},s=void 0,a={id:"\u6027\u80fd\u4e0e\u4f18\u5316/index",title:"\u6027\u80fd\u4e0e\u4f18\u5316",description:"",source:"@site/docs/\u6027\u80fd\u4e0e\u4f18\u5316/index.md",sourceDirName:"\u6027\u80fd\u4e0e\u4f18\u5316",slug:"/\u6027\u80fd\u4e0e\u4f18\u5316/",permalink:"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u6027\u80fd\u4e0e\u4f18\u5316/index.md",tags:[],version:"current",sidebarPosition:30,frontMatter:{title:"\u6027\u80fd\u4e0e\u4f18\u5316",sidebar_position:30},sidebar:"tutorialSidebar",previous:{title:"Pika \u6700\u4f73\u5b9e\u8df5",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/Pika \u6700\u4f73\u5b9e\u8df5/"},next:{title:"3.2.x \u6027\u80fd",permalink:"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/3.2.x \u6027\u80fd/"}},c={},d=[];function u(t){return(0,i.jsx)(i.Fragment,{})}function l(t={}){const{wrapper:e}={...(0,o.R)(),...t.components};return e?(0,i.jsx)(e,{...t,children:(0,i.jsx)(u,{...t})}):u()}},8453:(t,e,n)=>{n.d(e,{R:()=>s,x:()=>a});var i=n(6540);const o={},r=i.createContext(o);function s(t){const e=i.useContext(r);return i.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function a(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(o):t.components||o:s(t.components),i.createElement(r.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/a7776ad8.cf330829.js b/build/assets/js/a7776ad8.cf330829.js new file mode 100644 index 0000000..1ddb7fe --- /dev/null +++ b/build/assets/js/a7776ad8.cf330829.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[6230],{1005:(e,l,s)=>{s.r(l),s.d(l,{assets:()=>r,contentTitle:()=>c,default:()=>h,frontMatter:()=>i,metadata:()=>n,toc:()=>o});var d=s(4848),t=s(8453);const i={title:"\u5206\u7247\u6559\u7a0b(3.1.2 \u2010 3.3.6)",sidebar_position:90},c=void 0,n={id:"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5206\u7247\u6559\u7a0b/index",title:"\u5206\u7247\u6559\u7a0b(3.1.2 \u2010 3.3.6)",description:"Pika\u81ea\u7248\u672c3.1.2\u8d77\u5f00\u59cb\u5bf9\u5206\u7247\u505a\u4e86\u4e00\u7cfb\u5217\u652f\u6301\uff0c\u4e3a\u6b64\u6211\u4eec\u4e3a\u5206\u7247\u6a21\u5f0f\u6dfb\u52a0\u4e86\u4e00\u7cfb\u5217\u7684\u547d\u4ee4.",source:"@site/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5206\u7247\u6559\u7a0b/index.md",sourceDirName:"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5206\u7247\u6559\u7a0b",slug:"/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5206\u7247\u6559\u7a0b/",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5206\u7247\u6559\u7a0b/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5206\u7247\u6559\u7a0b/index.md",tags:[],version:"current",sidebarPosition:90,frontMatter:{title:"\u5206\u7247\u6559\u7a0b(3.1.2 \u2010 3.3.6)",sidebar_position:90},sidebar:"tutorialSidebar",previous:{title:"\u670d\u52a1\u5668\u72b6\u6001\u76d1\u63a7",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u670d\u52a1\u5668\u72b6\u6001\u76d1\u63a7/"},next:{title:"\u526f\u672c\u4e00\u81f4\u6027\uff08\u4f7f\u7528\u6587\u6863\uff09",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u526f\u672c\u4e00\u81f4\u6027\uff08\u4f7f\u7528\u6587\u6863\uff09/"}},r={},o=[{value:"Pika\u81ea\u7248\u672c3.1.2\u8d77\u5f00\u59cb\u5bf9\u5206\u7247\u505a\u4e86\u4e00\u7cfb\u5217\u652f\u6301\uff0c\u4e3a\u6b64\u6211\u4eec\u4e3a\u5206\u7247\u6a21\u5f0f\u6dfb\u52a0\u4e86\u4e00\u7cfb\u5217\u7684\u547d\u4ee4.",id:"pika\u81ea\u7248\u672c312\u8d77\u5f00\u59cb\u5bf9\u5206\u7247\u505a\u4e86\u4e00\u7cfb\u5217\u652f\u6301\u4e3a\u6b64\u6211\u4eec\u4e3a\u5206\u7247\u6a21\u5f0f\u6dfb\u52a0\u4e86\u4e00\u7cfb\u5217\u7684\u547d\u4ee4",level:2},{value:"1.<code>pkcluster info</code>\u547d\u4ee4\uff1a",id:"1pkcluster-info\u547d\u4ee4",level:3},{value:"2.<code>pkcluster addslots</code>\u547d\u4ee4\uff1a",id:"2pkcluster-addslots\u547d\u4ee4",level:3},{value:"3.<code>pkcluster delslots</code>\u547d\u4ee4\uff1a",id:"3pkcluster-delslots\u547d\u4ee4",level:3},{value:"4.<code>pkcluster slotsslaveof</code>\u547d\u4ee4\uff1a",id:"4pkcluster-slotsslaveof\u547d\u4ee4",level:3},{value:"5.<code>slaveof</code> \u547d\u4ee4",id:"5slaveof-\u547d\u4ee4",level:3},{value:"\u81eapika3.3\u5f00\u59cb\uff0c\u5206\u7247\u6a21\u5f0f\u652f\u6301\u52a8\u6001\u521b\u5efatable\u7684\u529f\u80fd\u3002\u4e3a\u4e86\u4fdd\u6301\u4e0e\u539f\u547d\u4ee4\u7684\u517c\u5bb9\u6027\u548c\u51cf\u5c11\u5bf9\u591atable\u4e0d\u4f7f\u7528\u8005\u7684\u5b66\u4e60\u6210\u672c\uff0cpika\u9ed8\u8ba4\u4f1a\u81ea\u52a8\u521b\u5efatable 0\uff0cslot num\u4e3a\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u914d\u7f6e\u3002\u4f7f\u7528\u5176\u4ed6table\u65f6\uff0c\u9700\u8981\u624b\u52a8\u521b\u5efa\u3002",id:"\u81eapika33\u5f00\u59cb\u5206\u7247\u6a21\u5f0f\u652f\u6301\u52a8\u6001\u521b\u5efatable\u7684\u529f\u80fd\u4e3a\u4e86\u4fdd\u6301\u4e0e\u539f\u547d\u4ee4\u7684\u517c\u5bb9\u6027\u548c\u51cf\u5c11\u5bf9\u591atable\u4e0d\u4f7f\u7528\u8005\u7684\u5b66\u4e60\u6210\u672cpika\u9ed8\u8ba4\u4f1a\u81ea\u52a8\u521b\u5efatable-0slot-num\u4e3a\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u914d\u7f6e\u4f7f\u7528\u5176\u4ed6table\u65f6\u9700\u8981\u624b\u52a8\u521b\u5efa",level:2},{value:"1. <code>pkcluster addtable</code> \u547d\u4ee4\uff1a",id:"1-pkcluster-addtable-\u547d\u4ee4",level:3},{value:"2. <code>pkcluster deltalbe</code> \u547d\u4ee4\uff1a",id:"2-pkcluster-deltalbe-\u547d\u4ee4",level:3},{value:"3.<code>pkcluster addslots</code>\u547d\u4ee4\uff1a",id:"3pkcluster-addslots\u547d\u4ee4",level:3},{value:"4.<code>pkcluster delslots</code>\u547d\u4ee4\uff1a",id:"4pkcluster-delslots\u547d\u4ee4",level:3},{value:"5.<code>pkcluster slotsslaveof</code>\u547d\u4ee4\uff1a",id:"5pkcluster-slotsslaveof\u547d\u4ee4",level:3},{value:"\u6ce8\u610f\uff1a",id:"\u6ce8\u610f",level:2},{value:"\u5728\u5206\u7247\u6a21\u5f0f\u4e0b\uff0cpika\u5168\u9762\u652f\u6301\u8f93\u5165\u53c2\u6570\u4e3a\u5355\u4e2akey\u7684\u547d\u4ee4\u3002",id:"\u5728\u5206\u7247\u6a21\u5f0f\u4e0bpika\u5168\u9762\u652f\u6301\u8f93\u5165\u53c2\u6570\u4e3a\u5355\u4e2akey\u7684\u547d\u4ee4",level:3},{value:"\u4f46\u5bf9\u4e8e\u8f93\u5165\u53c2\u6570\u53ef\u4ee5\u662f\u591a\u4e2akey\u7684\u547d\u4ee4\uff0c\u5728\u5206\u7247\u6a21\u5f0f\u4e0b\u8fdb\u884c\u4e86\u90e8\u5206\u652f\u6301",id:"\u4f46\u5bf9\u4e8e\u8f93\u5165\u53c2\u6570\u53ef\u4ee5\u662f\u591a\u4e2akey\u7684\u547d\u4ee4\u5728\u5206\u7247\u6a21\u5f0f\u4e0b\u8fdb\u884c\u4e86\u90e8\u5206\u652f\u6301",level:3},{value:"\u76ee\u524d\u5206\u7247\u6a21\u5f0f\u4e0d\u652f\u6301\u7684\u547d\u4ee4",id:"\u76ee\u524d\u5206\u7247\u6a21\u5f0f\u4e0d\u652f\u6301\u7684\u547d\u4ee4",level:4},{value:"\u5206\u7247\u6a21\u5f0f\u547d\u4ee4\u652f\u6301\u8ba1\u5212",id:"\u5206\u7247\u6a21\u5f0f\u547d\u4ee4\u652f\u6301\u8ba1\u5212",level:4}];function a(e){const l={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,t.R)(),...e.components};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(l.h2,{id:"pika\u81ea\u7248\u672c312\u8d77\u5f00\u59cb\u5bf9\u5206\u7247\u505a\u4e86\u4e00\u7cfb\u5217\u652f\u6301\u4e3a\u6b64\u6211\u4eec\u4e3a\u5206\u7247\u6a21\u5f0f\u6dfb\u52a0\u4e86\u4e00\u7cfb\u5217\u7684\u547d\u4ee4",children:"Pika\u81ea\u7248\u672c3.1.2\u8d77\u5f00\u59cb\u5bf9\u5206\u7247\u505a\u4e86\u4e00\u7cfb\u5217\u652f\u6301\uff0c\u4e3a\u6b64\u6211\u4eec\u4e3a\u5206\u7247\u6a21\u5f0f\u6dfb\u52a0\u4e86\u4e00\u7cfb\u5217\u7684\u547d\u4ee4."}),"\n",(0,d.jsx)(l.p,{children:"\u5728Pika\u5206\u7247\u7248\u672c\u6211\u4eec\u5f15\u5165\u4e86Table\u7684\u6982\u5ff5\uff0c\u4e00\u4e2aTable\u4e0b\u9762\u53ef\u4ee5\u6709\u82e5\u5e72\u4e2aslot(slot\u7684\u6570\u91cf\u53d7\u914d\u7f6e\u6587\u4ef6\u4e2ddefault-slot-num\u9650\u5236)\u5ba2\u6237\u7aef\u8fc7\u6765\u7684\u8bfb\u5199\u8bf7\u6c42\u4f1a\u6839\u636eKey\u8fdb\u884c\u6620\u5c04\uff0c\u5982\u679c\u8be5pika\u8d1f\u8d23\u8fd9\u4e2aslot\uff0c\u8be5key\u4f1a\u6253\u5230\u5bf9\u5e94\u7684slot\u4e0a\u6267\u884c."}),"\n",(0,d.jsx)(l.p,{children:"\u7528\u5206\u7247\u6a21\u5f0f\u542f\u52a8\uff0cPika\u4f1a\u4e3a\u6211\u4eec\u521b\u5efa\u4e00\u4e2a\u9ed8\u8ba4\u7684Table(\u540d\u79f0\u4e3adb0)\uff0c\u7528\u6237\u53ef\u4ee5\u6267\u884caddslots\u547d\u4ee4\u5411\u8fd9\u4e2aTable\u4e0a\u589e\u52a0slot\uff0cPika\u4f1a\u5c06Table\u5bf9\u5e94\u7684slot\u4fe1\u606f\u8bb0\u5f55\u5230db-path\u76ee\u5f55\u4e0b\u7684meta\u6587\u4ef6\u91cc."}),"\n",(0,d.jsx)(l.p,{children:"\u4e0d\u540cPika\u5b9e\u4f8b\u4e4b\u95f4\u7684slot\u662f\u53ef\u4ee5\u540c\u6b65\u6570\u636e\u7684\uff0cslot\u7684\u8eab\u4efd\u53ef\u4ee5\u662f\u4e3b\u53ef\u4ee5\u662f\u4ece\uff0c\u4e5f\u53ef\u4ee5\u65e2\u662f\u4e3b\u4e5f\u662f\u4ece\uff0c\u4e00\u65e6slot\u6709\u4ece\u7684\u8eab\u4efd\u90a3\u4e48\u5c31\u662f\u4e0d\u53ef\u5199\u7684."}),"\n",(0,d.jsxs)(l.h3,{id:"1pkcluster-info\u547d\u4ee4",children:["1.",(0,d.jsx)(l.code,{children:"pkcluster info"}),"\u547d\u4ee4\uff1a"]}),"\n",(0,d.jsx)(l.p,{children:"\u4f5c\u7528:\u7528\u4e8e\u5c55\u793aslot\u7684\u540c\u6b65\u4fe1\u606f(\u5305\u62ecBinlog\u504f\u79fb\u91cf\uff0c\u4e3b\u4ece\u8eab\u4efd\u7b49)"}),"\n",(0,d.jsxs)(l.p,{children:[(0,d.jsx)(l.code,{children:"pkcluster info slot"}),": \u67e5\u770b\u9ed8\u8ba4table\u4e2d\u6240\u6709slot\u7684\u540c\u6b65\u4fe1\u606f"]}),"\n",(0,d.jsxs)(l.p,{children:[(0,d.jsx)(l.code,{children:"pkcluster info slot db0:0-6,7,8"}),": \u67e5\u770btable0\u4e0bID\u4e3a0-6,7,8\u5bf9\u5e94slot\u7684\u540c\u6b65\u4fe1\u606f"]}),"\n",(0,d.jsxs)(l.p,{children:[(0,d.jsx)(l.code,{children:"pkcluster info table 1"}),": \u67e5\u770btable1\u7684\u4fe1\u606f\uff0c\u5305\u62ecQPS\uff0ctable\u5206\u7247\u4e2a\u6570\u7b49\u4fe1\u606f\u3002"]}),"\n",(0,d.jsxs)(l.h3,{id:"2pkcluster-addslots\u547d\u4ee4",children:["2.",(0,d.jsx)(l.code,{children:"pkcluster addslots"}),"\u547d\u4ee4\uff1a"]}),"\n",(0,d.jsx)(l.p,{children:"\u4f5c\u7528:\u5728\u9ed8\u8ba4table\u4e2d\u6dfb\u52a0\u6307\u5b9aID\u7684slot\uff0cID\u7684\u533a\u95f4\u4e3a[0\uff0cdefault-slot-num - 1]\uff0c\u652f\u6301\u4ee5\u4e0b\u4e09\u79cd\u6307\u5b9aID\u7684\u8bed\u6cd5"}),"\n",(0,d.jsxs)(l.p,{children:[(0,d.jsx)(l.code,{children:"pkcluster addslots 0-2"}),": \u5728\u9ed8\u8ba4\u7684table\u4e2d\u6dfb\u52a0id\u4e3a0,1,2\u7684\u4e09\u4e2aslot"]}),"\n",(0,d.jsxs)(l.p,{children:[(0,d.jsx)(l.code,{children:"pkcluster addslots 0-2,3"}),": \u5728\u9ed8\u8ba4\u7684table\u4e2d\u6dfb\u52a0id\u4e3a0,1,2,3\u7684\u56db\u4e2aslot"]}),"\n",(0,d.jsxs)(l.p,{children:[(0,d.jsx)(l.code,{children:"pkcluster addslots 0,1,2,3,4"}),": \u5728\u9ed8\u8ba4\u7684table\u4e2d\u6dfb\u52a0id\u4e3a0,1,2,3,4\u7684\u4e94\u4e2aslot"]}),"\n",(0,d.jsxs)(l.h3,{id:"3pkcluster-delslots\u547d\u4ee4",children:["3.",(0,d.jsx)(l.code,{children:"pkcluster delslots"}),"\u547d\u4ee4\uff1a"]}),"\n",(0,d.jsx)(l.p,{children:"\u4f5c\u7528:\u5728\u9ed8\u8ba4table\u4e2d\u5220\u9664\u6307\u5b9aID\u7684slot\uff0cID\u7684\u533a\u95f4\u4e3a[0\uff0cdefault-slot-num - 1]\uff0c\u652f\u6301\u4ee5\u4e0b\u4e09\u79cd\u6307\u5b9aID\u7684\u8bed\u6cd5"}),"\n",(0,d.jsxs)(l.p,{children:[(0,d.jsx)(l.code,{children:"pkcluster delslots 0-2"}),": \u5728\u9ed8\u8ba4\u7684table\u4e2d\u5220\u9664id\u4e3a0,1,2\u7684\u4e09\u4e2aslot"]}),"\n",(0,d.jsxs)(l.p,{children:[(0,d.jsx)(l.code,{children:"pkcluster delslots 0-2,3"}),": \u5728\u9ed8\u8ba4\u7684table\u4e2d\u5220\u9664id\u4e3a0,1,2,3\u7684\u56db\u4e2aslot"]}),"\n",(0,d.jsxs)(l.p,{children:[(0,d.jsx)(l.code,{children:"pkcluster delslots 0,1,2,3,4"}),": \u5728\u9ed8\u8ba4\u7684table\u4e2d\u5220\u9664id\u4e3a0,1,2,3,4\u7684\u4e94\u4e2aslot"]}),"\n",(0,d.jsxs)(l.h3,{id:"4pkcluster-slotsslaveof\u547d\u4ee4",children:["4.",(0,d.jsx)(l.code,{children:"pkcluster slotsslaveof"}),"\u547d\u4ee4\uff1a"]}),"\n",(0,d.jsx)(l.p,{children:"\u4f5c\u7528:\u7528\u4e8e\u9ed8\u8ba4table\u4e0b\u67d0\u4e9bslot\u5411\u5176\u4ed6Pika\u5b9e\u4f8b\u5bf9\u5e94slot\u53d1\u8d77\u540c\u6b65\u6570\u636e\u8bf7\u6c42\u6216\u8005\u53d6\u6d88\u540c\u6b65\u8bf7\u6c42\uff0c\u6307\u5b9aslot\u7684\u8bed\u6cd5\u548c\u4e0a\u9762addslots/delslots\u7c7b\u4f3c\uff0c\u4f46\u662f\u8fd9\u4e2a\u547d\u4ee4\u4e2d\u8fd8\u652f\u6301\u4f7f\u7528all\uff0c\u8868\u793a\u9ed8\u8ba4table\u4e0b\u7684\u6240\u6709slot"}),"\n",(0,d.jsxs)(l.p,{children:[(0,d.jsx)(l.code,{children:"pkcluster slotsslaveof no one [0-3,8-11 | all]"})," \u6307\u5b9a\u7684slot\u65ad\u5f00\u4e3b\u4ece\u540c\u6b65"]}),"\n",(0,d.jsxs)(l.p,{children:[(0,d.jsx)(l.code,{children:"pkcluster slotsslaveof ip port [0-3,8,9,10,11 | all]"})," \u6307\u5b9a\u7684slot\u5efa\u7acb\u4e3b\u4ece\u540c\u6b65"]}),"\n",(0,d.jsxs)(l.p,{children:[(0,d.jsx)(l.code,{children:"pkcluster slotsslaveof ip port [0,2,4,6,7,8,9 | all] force"})," \u6307\u5b9a\u7684slot\u8fdb\u884c\u5168\u540c\u6b65"]}),"\n",(0,d.jsxs)(l.h3,{id:"5slaveof-\u547d\u4ee4",children:["5.",(0,d.jsx)(l.code,{children:"slaveof"})," \u547d\u4ee4"]}),"\n",(0,d.jsxs)(l.p,{children:["\u7b49\u4ef7\u4e8e ",(0,d.jsx)(l.code,{children:"pkcluster slotsslave ip port all"})," \u547d\u4ee4"]}),"\n",(0,d.jsx)(l.h2,{id:"\u81eapika33\u5f00\u59cb\u5206\u7247\u6a21\u5f0f\u652f\u6301\u52a8\u6001\u521b\u5efatable\u7684\u529f\u80fd\u4e3a\u4e86\u4fdd\u6301\u4e0e\u539f\u547d\u4ee4\u7684\u517c\u5bb9\u6027\u548c\u51cf\u5c11\u5bf9\u591atable\u4e0d\u4f7f\u7528\u8005\u7684\u5b66\u4e60\u6210\u672cpika\u9ed8\u8ba4\u4f1a\u81ea\u52a8\u521b\u5efatable-0slot-num\u4e3a\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u914d\u7f6e\u4f7f\u7528\u5176\u4ed6table\u65f6\u9700\u8981\u624b\u52a8\u521b\u5efa",children:"\u81eapika3.3\u5f00\u59cb\uff0c\u5206\u7247\u6a21\u5f0f\u652f\u6301\u52a8\u6001\u521b\u5efatable\u7684\u529f\u80fd\u3002\u4e3a\u4e86\u4fdd\u6301\u4e0e\u539f\u547d\u4ee4\u7684\u517c\u5bb9\u6027\u548c\u51cf\u5c11\u5bf9\u591atable\u4e0d\u4f7f\u7528\u8005\u7684\u5b66\u4e60\u6210\u672c\uff0cpika\u9ed8\u8ba4\u4f1a\u81ea\u52a8\u521b\u5efatable 0\uff0cslot num\u4e3a\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u914d\u7f6e\u3002\u4f7f\u7528\u5176\u4ed6table\u65f6\uff0c\u9700\u8981\u624b\u52a8\u521b\u5efa\u3002"}),"\n",(0,d.jsxs)(l.h3,{id:"1-pkcluster-addtable-\u547d\u4ee4",children:["1. ",(0,d.jsx)(l.code,{children:"pkcluster addtable"})," \u547d\u4ee4\uff1a"]}),"\n",(0,d.jsx)(l.p,{children:"\u4f5c\u7528\uff1a\u7528\u4e8e\u521b\u5efatable\uff0c\u521b\u5efa\u65f6\u9700\u6307\u5b9atable-id,max-slot-num\u3002\u9ed8\u8ba4table-id\u4e3a0\u3002"}),"\n",(0,d.jsxs)(l.p,{children:[(0,d.jsx)(l.code,{children:"pkcluster addtable 1 64"}),":\u521b\u5efatable-id\u4e3a1\uff0cmax-slot-num\u4e3a64\u7684\u8868\u3002"]}),"\n",(0,d.jsxs)(l.h3,{id:"2-pkcluster-deltalbe-\u547d\u4ee4",children:["2. ",(0,d.jsx)(l.code,{children:"pkcluster deltalbe"})," \u547d\u4ee4\uff1a"]}),"\n",(0,d.jsx)(l.p,{children:"\u4f5c\u7528\uff1a\u7528\u4e8e\u5220\u9664table-id\u7684\u8868\uff0c\u5e76\u5220\u9664\u8868\u4e2d\u6240\u6709slot"}),"\n",(0,d.jsxs)(l.p,{children:[(0,d.jsx)(l.code,{children:" pkcluster deltable 1"})," :\u5220\u9664table-id \u4e3a1\u7684\u8868\uff0c\u5e76\u5220\u9664\u8868\u4e2d\u6240\u6709slot\u3002"]}),"\n",(0,d.jsxs)(l.h3,{id:"3pkcluster-addslots\u547d\u4ee4",children:["3.",(0,d.jsx)(l.code,{children:"pkcluster addslots"}),"\u547d\u4ee4\uff1a"]}),"\n",(0,d.jsx)(l.p,{children:"\u4f5c\u7528:\u5728table-id\u7684\u8868\u4e2d\u4e2d\u6dfb\u52a0\u6307\u5b9aID\u7684slot\uff0cID\u7684\u533a\u95f4\u4e3a[0\uff0cmax-slot-num - 1]\uff0c\u652f\u6301\u4ee5\u4e0b\u4e09\u79cd\u6307\u5b9aID\u7684\u8bed\u6cd5.\u4e0d\u6307\u5b9atable-id\u65f6\u5728\u9ed8\u8ba4\u8868\u4e2d\u6dfb\u52a0\u3002"}),"\n",(0,d.jsxs)(l.p,{children:[(0,d.jsx)(l.code,{children:"pkcluster addslots 0-2 1"}),": \u5728table-id\u4e3a1\u7684\u8868\u4e2d\u6dfb\u52a0id\u4e3a0,1,2\u7684\u4e09\u4e2aslot"]}),"\n",(0,d.jsxs)(l.p,{children:[(0,d.jsx)(l.code,{children:"pkcluster addslots 0-2,3 1"}),": \u5728table-id\u4e3a1\u7684\u8868\u4e2d\u6dfb\u52a0id\u4e3a0,1,2,3\u7684\u56db\u4e2aslot"]}),"\n",(0,d.jsxs)(l.p,{children:[(0,d.jsx)(l.code,{children:"pkcluster addslots 0,1,2,3,4 1"}),": \u5728table-id\u4e3a1\u7684\u8868\u4e2d\u6dfb\u52a0id\u4e3a0,1,2,3,4\u7684\u4e94\u4e2aslot"]}),"\n",(0,d.jsxs)(l.h3,{id:"4pkcluster-delslots\u547d\u4ee4",children:["4.",(0,d.jsx)(l.code,{children:"pkcluster delslots"}),"\u547d\u4ee4\uff1a"]}),"\n",(0,d.jsx)(l.p,{children:"\u4f5c\u7528:\u5728table-id\u7684\u8868\u4e2d\u5220\u9664\u6307\u5b9aID\u7684slot\uff0cID\u7684\u533a\u95f4\u4e3a[0\uff0cmax-slot-num - 1]\uff0c\u652f\u6301\u4ee5\u4e0b\u4e09\u79cd\u6307\u5b9aID\u7684\u8bed\u6cd5"}),"\n",(0,d.jsxs)(l.p,{children:[(0,d.jsx)(l.code,{children:"pkcluster delslots 0-2 1"}),": \u5728table-id\u4e3a1\u7684\u8868\u4e2d\u5220\u9664id\u4e3a0,1,2\u7684\u4e09\u4e2aslot"]}),"\n",(0,d.jsxs)(l.p,{children:[(0,d.jsx)(l.code,{children:"pkcluster delslots 0-2,3 1"}),": \u5728table-id\u4e3a1\u7684\u8868\u4e2d\u5220\u9664id\u4e3a0,1,2,3\u7684\u56db\u4e2aslot"]}),"\n",(0,d.jsxs)(l.p,{children:[(0,d.jsx)(l.code,{children:"pkcluster delslots 0,1,2,3,4 1"}),": \u5728table-id\u4e3a1\u7684\u8868\u4e2d\u5220\u9664id\u4e3a0,1,2,3,4\u7684\u4e94\u4e2aslot"]}),"\n",(0,d.jsxs)(l.h3,{id:"5pkcluster-slotsslaveof\u547d\u4ee4",children:["5.",(0,d.jsx)(l.code,{children:"pkcluster slotsslaveof"}),"\u547d\u4ee4\uff1a"]}),"\n",(0,d.jsx)(l.p,{children:"\u4f5c\u7528:\u7528\u4e8etable-id\u7684\u8868\u4e0b\u67d0\u4e9bslot\u5411\u5176\u4ed6Pika\u5b9e\u4f8b\u5bf9\u5e94slot\u53d1\u8d77\u540c\u6b65\u6570\u636e\u8bf7\u6c42\u6216\u8005\u53d6\u6d88\u540c\u6b65\u8bf7\u6c42\uff0c\u6307\u5b9aslot\u7684\u8bed\u6cd5\u548c\u4e0a\u9762addslots/delslots\u7c7b\u4f3c\uff0c\u4f46\u662f\u8fd9\u4e2a\u547d\u4ee4\u4e2d\u8fd8\u652f\u6301\u4f7f\u7528all\uff0c\u8868\u793atable-id\u4e0b\u7684\u6240\u6709slot"}),"\n",(0,d.jsxs)(l.p,{children:[(0,d.jsx)(l.code,{children:"pkcluster slotsslaveof no one [0-3,8-11 | all] 1 "})," \u6307\u5b9atable-id\u4e3a1\u7684\u8868\u4e2dslot\u65ad\u5f00\u4e3b\u4ece\u540c\u6b65"]}),"\n",(0,d.jsxs)(l.p,{children:[(0,d.jsx)(l.code,{children:"pkcluster slotsslaveof ip port [0-3,8,9,10,11 | all] 1"})," \u6307\u5b9atable-id\u4e3a1\u7684\u8868\u4e2dslot\u5efa\u7acb\u4e3b\u4ece\u540c\u6b65"]}),"\n",(0,d.jsxs)(l.p,{children:[(0,d.jsx)(l.code,{children:"pkcluster slotsslaveof ip port [0,2,4,6,7,8,9 | all] force 1"})," \u6307\u5b9atable-id\u4e3a1\u7684\u8868\u4e2dslot\u8fdb\u884c\u5168\u540c\u6b65"]}),"\n",(0,d.jsx)("br",{}),"\n",(0,d.jsx)(l.h2,{id:"\u6ce8\u610f",children:"\u6ce8\u610f\uff1a"}),"\n",(0,d.jsx)(l.h3,{id:"\u5728\u5206\u7247\u6a21\u5f0f\u4e0bpika\u5168\u9762\u652f\u6301\u8f93\u5165\u53c2\u6570\u4e3a\u5355\u4e2akey\u7684\u547d\u4ee4",children:"\u5728\u5206\u7247\u6a21\u5f0f\u4e0b\uff0cpika\u5168\u9762\u652f\u6301\u8f93\u5165\u53c2\u6570\u4e3a\u5355\u4e2akey\u7684\u547d\u4ee4\u3002"}),"\n",(0,d.jsx)(l.h3,{id:"\u4f46\u5bf9\u4e8e\u8f93\u5165\u53c2\u6570\u53ef\u4ee5\u662f\u591a\u4e2akey\u7684\u547d\u4ee4\u5728\u5206\u7247\u6a21\u5f0f\u4e0b\u8fdb\u884c\u4e86\u90e8\u5206\u652f\u6301",children:"\u4f46\u5bf9\u4e8e\u8f93\u5165\u53c2\u6570\u53ef\u4ee5\u662f\u591a\u4e2akey\u7684\u547d\u4ee4\uff0c\u5728\u5206\u7247\u6a21\u5f0f\u4e0b\u8fdb\u884c\u4e86\u90e8\u5206\u652f\u6301"}),"\n",(0,d.jsx)("br",{}),"\n",(0,d.jsx)(l.h4,{id:"\u76ee\u524d\u5206\u7247\u6a21\u5f0f\u4e0d\u652f\u6301\u7684\u547d\u4ee4",children:"\u76ee\u524d\u5206\u7247\u6a21\u5f0f\u4e0d\u652f\u6301\u7684\u547d\u4ee4"}),"\n",(0,d.jsxs)(l.table,{children:[(0,d.jsx)(l.thead,{children:(0,d.jsxs)(l.tr,{children:[(0,d.jsx)(l.th,{children:"\u2014"}),(0,d.jsx)(l.th,{children:"\u2014"}),(0,d.jsx)(l.th,{children:"\u2014"})]})}),(0,d.jsxs)(l.tbody,{children:[(0,d.jsxs)(l.tr,{children:[(0,d.jsx)(l.td,{children:"Msetnx"}),(0,d.jsx)(l.td,{children:"Scan"}),(0,d.jsx)(l.td,{children:"Keys"})]}),(0,d.jsxs)(l.tr,{children:[(0,d.jsx)(l.td,{children:"Scanx"}),(0,d.jsx)(l.td,{children:"PKScanRange"}),(0,d.jsx)(l.td,{children:"PKRScanRange"})]}),(0,d.jsxs)(l.tr,{children:[(0,d.jsx)(l.td,{children:"RPopLPush"}),(0,d.jsx)(l.td,{children:"ZUnionstore"}),(0,d.jsx)(l.td,{children:"ZInterstore"})]}),(0,d.jsxs)(l.tr,{children:[(0,d.jsx)(l.td,{children:"SUnion"}),(0,d.jsx)(l.td,{children:"SUnionstore"}),(0,d.jsx)(l.td,{children:"SInter"})]}),(0,d.jsxs)(l.tr,{children:[(0,d.jsx)(l.td,{children:"SInterstore"}),(0,d.jsx)(l.td,{children:"SDiff"}),(0,d.jsx)(l.td,{children:"SDiffstore"})]}),(0,d.jsxs)(l.tr,{children:[(0,d.jsx)(l.td,{children:"SMove"}),(0,d.jsx)(l.td,{children:"BitOp"}),(0,d.jsx)(l.td,{children:"PfAdd"})]}),(0,d.jsxs)(l.tr,{children:[(0,d.jsx)(l.td,{children:"PfCount"}),(0,d.jsx)(l.td,{children:"PfMerge"}),(0,d.jsx)(l.td,{children:"GeoAdd"})]}),(0,d.jsxs)(l.tr,{children:[(0,d.jsx)(l.td,{children:"GeoPos"}),(0,d.jsx)(l.td,{children:"GeoDist"}),(0,d.jsx)(l.td,{children:"GeoHash"})]}),(0,d.jsxs)(l.tr,{children:[(0,d.jsx)(l.td,{children:"GeoRadius"}),(0,d.jsx)(l.td,{children:"GeoRadiusByMember"}),(0,d.jsx)(l.td,{})]})]})]}),"\n",(0,d.jsx)(l.h4,{id:"\u5206\u7247\u6a21\u5f0f\u547d\u4ee4\u652f\u6301\u8ba1\u5212",children:"\u5206\u7247\u6a21\u5f0f\u547d\u4ee4\u652f\u6301\u8ba1\u5212"}),"\n",(0,d.jsxs)(l.p,{children:["\u57fa\u7840\u8bbe\u65bd\uff1a\u652f\u6301",(0,d.jsx)(l.a,{href:"https://redis.io/topics/cluster-spec",children:"hash tags"}),"\u6570\u636e\u5206\u7247\u3002\u7528\u6237\u53ef\u4ee5\u9488\u5bf9\u5177\u4f53\u7684\u4f7f\u7528\u573a\u666f\uff0c\u4e00\u5b9a\u7a0b\u5ea6\u4e0a\u63a7\u5236\u6570\u636e\u5728\u96c6\u7fa4\u4e2d\u7684\u5206\u5e03\u3002"]}),"\n",(0,d.jsx)(l.p,{children:"\u57fa\u672c\u65b9\u9488\uff1a\u9488\u5bf9\u6d89\u53ca\u591a\u4e2aKey\u7684\u547d\u4ee4\uff0cKeys\u9700\u8981\u4f4d\u4e8e\u540c\u4e00\u5206\u7247\u4e0a\uff0c\u5373\u53ea\u652f\u6301\u5206\u7247\u5185\u7684\u64cd\u4f5c\u3002\u800c\u5168\u5c40\u7a7a\u95f4\u7684\u547d\u4ee4\u5c06\u6682\u4e0d\u652f\u6301\u3002"}),"\n",(0,d.jsx)(l.p,{children:"\u4f8b\u5982\uff1a\u652f\u6301'RPOPLPUSH src dst'\uff0c\u9700\u8981src\u548cdst\u5217\u8868\u4f4d\u4e8e\u540c\u4e00\u5206\u7247\u4e0a\uff0c\u800c\u7528\u6237\u53ef\u4ee5\u901a\u8fc7\u52a0\u5165hash tag\u7684\u65b9\u5f0f\u8fbe\u5230\u8be5\u76ee\u7684\u3002"})]})}function h(e={}){const{wrapper:l}={...(0,t.R)(),...e.components};return l?(0,d.jsx)(l,{...e,children:(0,d.jsx)(a,{...e})}):a(e)}},8453:(e,l,s)=>{s.d(l,{R:()=>c,x:()=>n});var d=s(6540);const t={},i=d.createContext(t);function c(e){const l=d.useContext(i);return d.useMemo((function(){return"function"==typeof e?e(l):{...l,...e}}),[l,e])}function n(e){let l;return l=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:c(e.components),d.createElement(i.Provider,{value:l},e.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/a7bd4aaa.b940ea01.js b/build/assets/js/a7bd4aaa.b940ea01.js new file mode 100644 index 0000000..4c964ed --- /dev/null +++ b/build/assets/js/a7bd4aaa.b940ea01.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[7098],{4532:(n,e,s)=>{s.r(e),s.d(e,{default:()=>x});s(6540);var i=s(1213),r=s(2967),o=s(2252),t=s(2831),c=s(1463),a=s(4848);function u(n){const{version:e}=n;return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(c.A,{version:e.version,tag:(0,r.tU)(e.pluginId,e.version)}),(0,a.jsx)(i.be,{children:e.noIndex&&(0,a.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})]})}function l(n){const{version:e,route:s}=n;return(0,a.jsx)(i.e3,{className:e.className,children:(0,a.jsx)(o.n,{version:e,children:(0,t.v)(s.routes)})})}function x(n){return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(u,{...n}),(0,a.jsx)(l,{...n})]})}}}]); \ No newline at end of file diff --git a/build/assets/js/a94703ab.d79ecc22.js b/build/assets/js/a94703ab.d79ecc22.js new file mode 100644 index 0000000..e130028 --- /dev/null +++ b/build/assets/js/a94703ab.d79ecc22.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[9048],{2559:(e,t,n)=>{n.r(t),n.d(t,{default:()=>be});var a=n(6540),o=n(4164),i=n(1213),s=n(7559),l=n(1754),r=n(6588),c=n(1312),d=n(3104),u=n(5062);const m={backToTopButton:"backToTopButton_sjWU",backToTopButtonShow:"backToTopButtonShow_xfvO"};var b=n(4848);function h(){const{shown:e,scrollToTop:t}=function(e){let{threshold:t}=e;const[n,o]=(0,a.useState)(!1),i=(0,a.useRef)(!1),{startScroll:s,cancelScroll:l}=(0,d.gk)();return(0,d.Mq)(((e,n)=>{let{scrollY:a}=e;const s=n?.scrollY;s&&(i.current?i.current=!1:a>=s?(l(),o(!1)):a<t?o(!1):a+window.innerHeight<document.documentElement.scrollHeight&&o(!0))})),(0,u.$)((e=>{e.location.hash&&(i.current=!0,o(!1))})),{shown:n,scrollToTop:()=>s(0)}}({threshold:300});return(0,b.jsx)("button",{"aria-label":(0,c.T)({id:"theme.BackToTopButton.buttonAriaLabel",message:"Scroll back to top",description:"The ARIA label for the back to top button"}),className:(0,o.A)("clean-btn",s.G.common.backToTopButton,m.backToTopButton,e&&m.backToTopButtonShow),type:"button",onClick:t})}var p=n(3109),x=n(6347),f=n(4581),j=n(6342),_=n(3465);function v(e){return(0,b.jsx)("svg",{width:"20",height:"20","aria-hidden":"true",...e,children:(0,b.jsxs)("g",{fill:"#7a7a7a",children:[(0,b.jsx)("path",{d:"M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"}),(0,b.jsx)("path",{d:"M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"})]})})}const k={collapseSidebarButton:"collapseSidebarButton_PEFL",collapseSidebarButtonIcon:"collapseSidebarButtonIcon_kv0_"};function A(e){let{onClick:t}=e;return(0,b.jsx)("button",{type:"button",title:(0,c.T)({id:"theme.docs.sidebar.collapseButtonTitle",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),"aria-label":(0,c.T)({id:"theme.docs.sidebar.collapseButtonAriaLabel",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),className:(0,o.A)("button button--secondary button--outline",k.collapseSidebarButton),onClick:t,children:(0,b.jsx)(v,{className:k.collapseSidebarButtonIcon})})}var g=n(5041),C=n(9532);const S=Symbol("EmptyContext"),T=a.createContext(S);function N(e){let{children:t}=e;const[n,o]=(0,a.useState)(null),i=(0,a.useMemo)((()=>({expandedItem:n,setExpandedItem:o})),[n]);return(0,b.jsx)(T.Provider,{value:i,children:t})}var I=n(1422),B=n(9169),y=n(8774),w=n(2303);function L(e){let{collapsed:t,categoryLabel:n,onClick:a}=e;return(0,b.jsx)("button",{"aria-label":t?(0,c.T)({id:"theme.DocSidebarItem.expandCategoryAriaLabel",message:"Expand sidebar category '{label}'",description:"The ARIA label to expand the sidebar category"},{label:n}):(0,c.T)({id:"theme.DocSidebarItem.collapseCategoryAriaLabel",message:"Collapse sidebar category '{label}'",description:"The ARIA label to collapse the sidebar category"},{label:n}),"aria-expanded":!t,type:"button",className:"clean-btn menu__caret",onClick:a})}function E(e){let{item:t,onItemClick:n,activePath:i,level:r,index:c,...d}=e;const{items:u,label:m,collapsible:h,className:p,href:x}=t,{docs:{sidebar:{autoCollapseCategories:f}}}=(0,j.p)(),_=function(e){const t=(0,w.A)();return(0,a.useMemo)((()=>e.href&&!e.linkUnlisted?e.href:!t&&e.collapsible?(0,l.Nr)(e):void 0),[e,t])}(t),v=(0,l.w8)(t,i),k=(0,B.ys)(x,i),{collapsed:A,setCollapsed:g}=(0,I.u)({initialState:()=>!!h&&(!v&&t.collapsed)}),{expandedItem:N,setExpandedItem:E}=function(){const e=(0,a.useContext)(T);if(e===S)throw new C.dV("DocSidebarItemsExpandedStateProvider");return e}(),M=function(e){void 0===e&&(e=!A),E(e?null:c),g(e)};return function(e){let{isActive:t,collapsed:n,updateCollapsed:o}=e;const i=(0,C.ZC)(t);(0,a.useEffect)((()=>{t&&!i&&n&&o(!1)}),[t,i,n,o])}({isActive:v,collapsed:A,updateCollapsed:M}),(0,a.useEffect)((()=>{h&&null!=N&&N!==c&&f&&g(!0)}),[h,N,c,g,f]),(0,b.jsxs)("li",{className:(0,o.A)(s.G.docs.docSidebarItemCategory,s.G.docs.docSidebarItemCategoryLevel(r),"menu__list-item",{"menu__list-item--collapsed":A},p),children:[(0,b.jsxs)("div",{className:(0,o.A)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":k}),children:[(0,b.jsx)(y.A,{className:(0,o.A)("menu__link",{"menu__link--sublist":h,"menu__link--sublist-caret":!x&&h,"menu__link--active":v}),onClick:h?e=>{n?.(t),x?M(!1):(e.preventDefault(),M())}:()=>{n?.(t)},"aria-current":k?"page":void 0,role:h&&!x?"button":void 0,"aria-expanded":h&&!x?!A:void 0,href:h?_??"#":_,...d,children:m}),x&&h&&(0,b.jsx)(L,{collapsed:A,categoryLabel:m,onClick:e=>{e.preventDefault(),M()}})]}),(0,b.jsx)(I.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:A,children:(0,b.jsx)(U,{items:u,tabIndex:A?-1:0,onItemClick:n,activePath:i,level:r+1})})]})}var M=n(6654),H=n(3186);const P={menuExternalLink:"menuExternalLink_NmtK"};function G(e){let{item:t,onItemClick:n,activePath:a,level:i,index:r,...c}=e;const{href:d,label:u,className:m,autoAddBaseUrl:h}=t,p=(0,l.w8)(t,a),x=(0,M.A)(d);return(0,b.jsx)("li",{className:(0,o.A)(s.G.docs.docSidebarItemLink,s.G.docs.docSidebarItemLinkLevel(i),"menu__list-item",m),children:(0,b.jsxs)(y.A,{className:(0,o.A)("menu__link",!x&&P.menuExternalLink,{"menu__link--active":p}),autoAddBaseUrl:h,"aria-current":p?"page":void 0,to:d,...x&&{onClick:n?()=>n(t):void 0},...c,children:[u,!x&&(0,b.jsx)(H.A,{})]})},u)}const W={menuHtmlItem:"menuHtmlItem_M9Kj"};function R(e){let{item:t,level:n,index:a}=e;const{value:i,defaultStyle:l,className:r}=t;return(0,b.jsx)("li",{className:(0,o.A)(s.G.docs.docSidebarItemLink,s.G.docs.docSidebarItemLinkLevel(n),l&&[W.menuHtmlItem,"menu__list-item"],r),dangerouslySetInnerHTML:{__html:i}},a)}function D(e){let{item:t,...n}=e;switch(t.type){case"category":return(0,b.jsx)(E,{item:t,...n});case"html":return(0,b.jsx)(R,{item:t,...n});default:return(0,b.jsx)(G,{item:t,...n})}}function F(e){let{items:t,...n}=e;const a=(0,l.Y)(t,n.activePath);return(0,b.jsx)(N,{children:a.map(((e,t)=>(0,b.jsx)(D,{item:e,index:t,...n},t)))})}const U=(0,a.memo)(F),V={menu:"menu_SIkG",menuWithAnnouncementBar:"menuWithAnnouncementBar_GW3s"};function Y(e){let{path:t,sidebar:n,className:i}=e;const l=function(){const{isActive:e}=(0,g.M)(),[t,n]=(0,a.useState)(e);return(0,d.Mq)((t=>{let{scrollY:a}=t;e&&n(0===a)}),[e]),e&&t}();return(0,b.jsx)("nav",{"aria-label":(0,c.T)({id:"theme.docs.sidebar.navAriaLabel",message:"Docs sidebar",description:"The ARIA label for the sidebar navigation"}),className:(0,o.A)("menu thin-scrollbar",V.menu,l&&V.menuWithAnnouncementBar,i),children:(0,b.jsx)("ul",{className:(0,o.A)(s.G.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(U,{items:n,activePath:t,level:1})})})}const K="sidebar_njMd",z="sidebarWithHideableNavbar_wUlq",q="sidebarHidden_VK0M",O="sidebarLogo_isFc";function J(e){let{path:t,sidebar:n,onCollapse:a,isHidden:i}=e;const{navbar:{hideOnScroll:s},docs:{sidebar:{hideable:l}}}=(0,j.p)();return(0,b.jsxs)("div",{className:(0,o.A)(K,s&&z,i&&q),children:[s&&(0,b.jsx)(_.A,{tabIndex:-1,className:O}),(0,b.jsx)(Y,{path:t,sidebar:n}),l&&(0,b.jsx)(A,{onClick:a})]})}const Q=a.memo(J);var X=n(5600),Z=n(9876);const $=e=>{let{sidebar:t,path:n}=e;const a=(0,Z.M)();return(0,b.jsx)("ul",{className:(0,o.A)(s.G.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(U,{items:t,activePath:n,onItemClick:e=>{"category"===e.type&&e.href&&a.toggle(),"link"===e.type&&a.toggle()},level:1})})};function ee(e){return(0,b.jsx)(X.GX,{component:$,props:e})}const te=a.memo(ee);function ne(e){const t=(0,f.l)(),n="desktop"===t||"ssr"===t,a="mobile"===t;return(0,b.jsxs)(b.Fragment,{children:[n&&(0,b.jsx)(Q,{...e}),a&&(0,b.jsx)(te,{...e})]})}const ae={expandButton:"expandButton_TmdG",expandButtonIcon:"expandButtonIcon_i1dp"};function oe(e){let{toggleSidebar:t}=e;return(0,b.jsx)("div",{className:ae.expandButton,title:(0,c.T)({id:"theme.docs.sidebar.expandButtonTitle",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),"aria-label":(0,c.T)({id:"theme.docs.sidebar.expandButtonAriaLabel",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),tabIndex:0,role:"button",onKeyDown:t,onClick:t,children:(0,b.jsx)(v,{className:ae.expandButtonIcon})})}const ie={docSidebarContainer:"docSidebarContainer_YfHR",docSidebarContainerHidden:"docSidebarContainerHidden_DPk8",sidebarViewport:"sidebarViewport_aRkj"};function se(e){let{children:t}=e;const n=(0,r.t)();return(0,b.jsx)(a.Fragment,{children:t},n?.name??"noSidebar")}function le(e){let{sidebar:t,hiddenSidebarContainer:n,setHiddenSidebarContainer:i}=e;const{pathname:l}=(0,x.zy)(),[r,c]=(0,a.useState)(!1),d=(0,a.useCallback)((()=>{r&&c(!1),!r&&(0,p.O)()&&c(!0),i((e=>!e))}),[i,r]);return(0,b.jsx)("aside",{className:(0,o.A)(s.G.docs.docSidebarContainer,ie.docSidebarContainer,n&&ie.docSidebarContainerHidden),onTransitionEnd:e=>{e.currentTarget.classList.contains(ie.docSidebarContainer)&&n&&c(!0)},children:(0,b.jsx)(se,{children:(0,b.jsxs)("div",{className:(0,o.A)(ie.sidebarViewport,r&&ie.sidebarViewportHidden),children:[(0,b.jsx)(ne,{sidebar:t,path:l,onCollapse:d,isHidden:r}),r&&(0,b.jsx)(oe,{toggleSidebar:d})]})})})}const re={docMainContainer:"docMainContainer_TBSr",docMainContainerEnhanced:"docMainContainerEnhanced_lQrH",docItemWrapperEnhanced:"docItemWrapperEnhanced_JWYK"};function ce(e){let{hiddenSidebarContainer:t,children:n}=e;const a=(0,r.t)();return(0,b.jsx)("main",{className:(0,o.A)(re.docMainContainer,(t||!a)&&re.docMainContainerEnhanced),children:(0,b.jsx)("div",{className:(0,o.A)("container padding-top--md padding-bottom--lg",re.docItemWrapper,t&&re.docItemWrapperEnhanced),children:n})})}const de={docRoot:"docRoot_UBD9",docsWrapper:"docsWrapper_hBAB"};function ue(e){let{children:t}=e;const n=(0,r.t)(),[o,i]=(0,a.useState)(!1);return(0,b.jsxs)("div",{className:de.docsWrapper,children:[(0,b.jsx)(h,{}),(0,b.jsxs)("div",{className:de.docRoot,children:[n&&(0,b.jsx)(le,{sidebar:n.items,hiddenSidebarContainer:o,setHiddenSidebarContainer:i}),(0,b.jsx)(ce,{hiddenSidebarContainer:o,children:t})]})]})}var me=n(3363);function be(e){const t=(0,l.B5)(e);if(!t)return(0,b.jsx)(me.A,{});const{docElement:n,sidebarName:a,sidebarItems:c}=t;return(0,b.jsx)(i.e3,{className:(0,o.A)(s.G.page.docsDocPage),children:(0,b.jsx)(r.V,{name:a,items:c,children:(0,b.jsx)(ue,{children:n})})})}},3363:(e,t,n)=>{n.d(t,{A:()=>l});n(6540);var a=n(4164),o=n(1312),i=n(1107),s=n(4848);function l(e){let{className:t}=e;return(0,s.jsx)("main",{className:(0,a.A)("container margin-vert--xl",t),children:(0,s.jsx)("div",{className:"row",children:(0,s.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,s.jsx)(i.A,{as:"h1",className:"hero__title",children:(0,s.jsx)(o.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}}}]); \ No newline at end of file diff --git a/build/assets/js/a950bb08.7dd7756a.js b/build/assets/js/a950bb08.7dd7756a.js new file mode 100644 index 0000000..fbee2d2 --- /dev/null +++ b/build/assets/js/a950bb08.7dd7756a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[2978],{702:(n,e,r)=>{r.r(e),r.d(e,{assets:()=>a,contentTitle:()=>o,default:()=>p,frontMatter:()=>t,metadata:()=>d,toc:()=>c});var i=r(4848),s=r(8453);const t={title:"Pika \u8bfb\u5199\u6d41\u7a0b\u7b80\u4ecb",sidebar_position:1},o=void 0,d={id:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u8bfb\u5199\u6d41\u7a0b/index",title:"Pika \u8bfb\u5199\u6d41\u7a0b\u7b80\u4ecb",description:"alt text",source:"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u8bfb\u5199\u6d41\u7a0b/index.md",sourceDirName:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u8bfb\u5199\u6d41\u7a0b",slug:"/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u8bfb\u5199\u6d41\u7a0b/",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u8bfb\u5199\u6d41\u7a0b/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u8bfb\u5199\u6d41\u7a0b/index.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"Pika \u8bfb\u5199\u6d41\u7a0b\u7b80\u4ecb",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"Pika \u7ebf\u7a0b\u6a21\u578b\u7b80\u4ecb",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u7ebf\u7a0b\u6a21\u578b/"},next:{title:"Pika \u4e3b\u4ece\u540c\u6bd4",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u4e3b\u4ece\u540c\u6b65/"}},a={},c=[{value:"Introduction",id:"introduction",level:2},{value:"PikaClientConn\u548cCmd\u901a\u7528\u5904\u7406\u6d41\u7a0b",id:"pikaclientconn\u548ccmd\u901a\u7528\u5904\u7406\u6d41\u7a0b",level:2},{value:"WorkerThread \u5904\u7406\u6d41\u7a0b",id:"workerthread-\u5904\u7406\u6d41\u7a0b",level:3},{value:"ThreadPoolThread \u5904\u7406\u6d41\u7a0b",id:"threadpoolthread-\u5904\u7406\u6d41\u7a0b",level:2},{value:"Cmd \u901a\u7528\u5904\u7406\u6d41\u7a0b",id:"cmd-\u901a\u7528\u5904\u7406\u6d41\u7a0b",level:2},{value:"DoCommand",id:"docommand",level:3},{value:"DoBinlog",id:"dobinlog",level:3},{value:"\u547d\u4ee4\u6267\u884c\u8fc7\u7a0b\u7684\u5dee\u5f02\u5316\u5904\u7406",id:"\u547d\u4ee4\u6267\u884c\u8fc7\u7a0b\u7684\u5dee\u5f02\u5316\u5904\u7406",level:2},{value:"\u4e00\u81f4\u6027\u5b9e\u73b0\u4e2d\u7684\u6570\u636e\u5199\u5165",id:"\u4e00\u81f4\u6027\u5b9e\u73b0\u4e2d\u7684\u6570\u636e\u5199\u5165",level:2},{value:"Reference",id:"reference",level:2}];function l(n){const e={a:"a",code:"code",h2:"h2",h3:"h3",img:"img",p:"p",pre:"pre",...(0,s.R)(),...n.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(e.p,{children:(0,i.jsx)(e.img,{alt:"alt text",src:r(5140).A+"",width:"572",height:"175"})}),"\n",(0,i.jsx)(e.h2,{id:"introduction",children:"Introduction"}),"\n",(0,i.jsx)(e.p,{children:"\u901a\u8fc7\u4e0a\u6b21Pika\u7ebf\u7a0b\u6a21\u578b\u7684\u5206\u4eab\uff0c\u5f97\u77e5\u4e3b\u8981\u7684\u547d\u4ee4\u5904\u7406\u662f\u7531\u7ebf\u7a0b\u6c60\u7684\u7ebf\u7a0b\u8d1f\u8d23\u7684\u3002\u800c\u547d\u4ee4\u7684\u901a\u7528\u5904\u7406\u6d41\u7a0b\u4e3b\u8981\u662f\u7531PikaClientConn\u51b3\u5b9a\u7684\uff0c\u5728\u5176\u5904\u7406\u8fc7\u7a0b\u5f53\u4e2d\u5bf9\u4e8e\u4e0d\u540c\u7684\u547d\u4ee4\uff0c\u901a\u8fc7\u591a\u6001\u7684\u65b9\u5f0f\u8c03class Cmd\u5904\u7406\u63a5\u53e3\uff0c\u52a8\u6001\u9009\u62e9\u4e0d\u540c\u547d\u4ee4\u7684\u5904\u7406\u51fd\u6570\u3002\u8fd9\u91cc\u4e3b\u8981\u68b3\u7406pika\u7684\u4e3b\u8981\u8bfb\u5199\u6d41\u7a0b\u3002"}),"\n",(0,i.jsx)(e.h2,{id:"pikaclientconn\u548ccmd\u901a\u7528\u5904\u7406\u6d41\u7a0b",children:"PikaClientConn\u548cCmd\u901a\u7528\u5904\u7406\u6d41\u7a0b"}),"\n",(0,i.jsx)(e.h3,{id:"workerthread-\u5904\u7406\u6d41\u7a0b",children:"WorkerThread \u5904\u7406\u6d41\u7a0b"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-c++",children:"class PikaClientConn: public pink::RedisConn {\n void AsynProcessRedisCmds(const std::vector<pink::RedisCmdArgsType>& argvs,\n std::string* response) override;\n std::atomic<int> resp_num;\n std::vector<std::shared_ptr<std::string>> resp_array;\n std::shared_ptr<Cmd> DoCmd(const PikaCmdArgsType& argv,\n const std::string& opt,\n std::shared_ptr<std::string> resp_ptr);\n}\n"})}),"\n",(0,i.jsx)(e.p,{children:"Pink\u5c42\u901a\u8fc7AsynProcessRedisCmds\u7684\u8c03\u7528\uff0cPika\u4e0a\u5c42\u53ef\u4ee5\u81ea\u5df1\u5b9a\u4e49\u5bf9\u4e8e\u63a5\u53d7\u547d\u4ee4\u540e\u7684\u540e\u7eed\u5904\u7406\u6d41\u7a0b\u3002"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-c++",children:"void PikaClientConn::AsynProcessRedisCmds(\n const std::vector<pink::RedisCmdArgsType>& argvs, std::string* response){\n BgTaskArg* arg = new BgTaskArg();\n arg->redis_cmds = argvs;\n arg->conn_ptr =\n std::dynamic_pointer_cast<PikaClientConn>(shared_from_this());\n g_pika_server->ScheduleClientPool(&DoBackgroundTask, arg);\n}\n"})}),"\n",(0,i.jsx)(e.p,{children:"1\uff0cworker thread \u8c03\u7528AsynProcessRedisCmds\uff0c\u5c06\u5f85\u5904\u7406Cmd\u5c01\u88c5\u6210BgTaskArg\u3002"}),"\n",(0,i.jsx)(e.p,{children:"2\uff0cBgTaskArg\u4efb\u52a1\u653e\u5165\u7ebf\u7a0b\u6c60\u4e2d\uff0c\u540e\u7eed\u7531\u7ebf\u7a0b\u6c60\u4e2d\u7684\u4e00\u4e2a\u7ebf\u7a0b\u7ee7\u7eed\u5904\u7406\u8fd9\u4e2a\u8bf7\u6c42\u3002"}),"\n",(0,i.jsx)(e.p,{children:"3\uff0cworker thread \u7684\u8c03\u7528\u8fd4\u56de\uff0cworker thread \u7ee7\u7eed\u8fd0\u884c\u81ea\u5df1\u6d41\u7a0b\u3002"}),"\n",(0,i.jsx)(e.h2,{id:"threadpoolthread-\u5904\u7406\u6d41\u7a0b",children:"ThreadPoolThread \u5904\u7406\u6d41\u7a0b"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-c++",children:"void PikaClientConn::DoBackgroundTask(void* arg) {\n // sanity check\n // ...\n BgTaskArg* bg_arg = reinterpret_cast<BgTaskArg*>(arg);\n std::shared_ptr<PikaClientConn> conn_ptr = bg_arg->conn_ptr;\n conn_ptr->BatchExecRedisCmd(bg_arg->redis_cmds);\n delete bg_arg;\n}\n\nvoid PikaClientConn::BatchExecRedisCmd(\n const std::vector<pink::RedisCmdArgsType>& argvs) {\n resp_num.store(argvs.size());\n for (size_t i = 0; i < argvs.size(); ++i) {\n std::shared_ptr<std::string> resp_ptr = std::make_shared<std::string>();\n resp_array.push_back(resp_ptr);\n ExecRedisCmd(argvs[i], resp_ptr);\n }\n TryWriteResp();\n}\n\nvoid PikaClientConn::ExecRedisCmd(\n const PikaCmdArgsType& argv, std::shared_ptr<std::string> resp_ptr) {\n std::string opt = argv[0];\n slash::StringToLower(opt);\n std::shared_ptr<Cmd> cmd_ptr = DoCmd(argv, opt, resp_ptr);\n}\n"})}),"\n",(0,i.jsx)(e.p,{children:"1\uff0cThreadPoolThread\u8c03\u7528DoBackgroundTask\uff0c\u68c0\u67e5BgTaskArg \u7684\u5408\u6cd5\u6027\u3002"}),"\n",(0,i.jsx)(e.p,{children:"2\uff0c\u8c03\u7528BatchExecRedisCmd\uff0c\u5728\u6b64\u7ebf\u7a0b\u4e2d\u5bf9\u6240\u6709\u547d\u4ee4\u8fdb\u884c\u9010\u4e00\u5904\u7406\u3002"}),"\n",(0,i.jsx)(e.p,{children:"3\uff0c\u8c03\u7528DoCmd \u8fdb\u884c\u547d\u4ee4\u7684\u5177\u4f53\u5904\u7406\u3002"}),"\n",(0,i.jsx)(e.p,{children:"4\uff0c\u8c03\u7528TryWriteResp \u5bf9\u4e8e\u8fd4\u56de\u7684\u6240\u6709\u7ed3\u679c\u6574\u5408\uff0c\u4e4b\u540e\u901a\u77e5WorkerThread \u8be5PikaClientConn\u5185\u7684\u7ed3\u679c\u53ef\u4ee5\u5199\u56de\u5ba2\u6237\u7aef\u3002"}),"\n",(0,i.jsx)(e.p,{children:"DoCmd\u7684\u5904\u7406\u6d41\u7a0b\u5982\u4e0b\u3002"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-c++",children:'std::shared_ptr<Cmd> PikaClientConn::DoCmd(\n const PikaCmdArgsType& argv,\n const std::string& opt,\n std::shared_ptr<std::string> resp_ptr) {\n std::shared_ptr<Cmd> c_ptr = g_pika_cmd_table_manager->GetCmd(opt);\n \n if (!auth_stat_.IsAuthed(c_ptr)) {\n c_ptr->res().SetRes(CmdRes::kErrOther,"NOAUTH Authentication required.");\n return c_ptr;\n }\n // lock free\n // slowlog_slower_thann is atomic int\n if (g_pika_conf->slowlog_slower_than() >= 0) {\n start_us = slash::NowMicros();\n }\n // lock free\n // HasMonitorClients return atomic bool\n bool is_monitoring = g_pika_server->HasMonitorClients();\n if (is_monitoring) {\n ProcessMonitor(argv);\n }\n \n // Initial\n c_ptr->Initial(argv, current_table_);\n if (!c_ptr->res().ok()) {\n return c_ptr;\n }\n // partial lock free\n // update server statistic lock free\n // pdateTableQps NOT lock free\n g_pika_server->UpdateQueryNumAndExecCountTable(\n current_table_, opt, c_ptr->is_write());\n // sanity check\n ... \n // Process Command\n c_ptr->Execute();\n\n if (g_pika_conf->slowlog_slower_than() >= 0) {\n ProcessSlowlog(argv, start_us);\n }\n}\n'})}),"\n",(0,i.jsxs)(e.p,{children:["1\uff0c\u6839\u636e\u5177\u4f53\u547d\u4ee4\u751f\u6210\u5176\u57fa\u7c7b\u7684",(0,i.jsx)(e.code,{children:"std::shared_ptr<Cmd>"})," \u65b9\u4fbf\u591a\u6001\u5b9e\u73b0\u3002"]}),"\n",(0,i.jsx)(e.p,{children:"2\uff0c\u5bf9\u4e8e\u8fde\u63a5\u8fdb\u884c\u6743\u9650\u8ba4\u8bc1\uff0c\u5bf9\u5e94\u547d\u4ee4\u53ef\u4ee5\u67e5\u770bRedis Auth\u547d\u4ee4\uff0c\u548cPika\u914d\u7f6e\u6587\u4ef6Pika\u914d\u7f6e\u6587\u4ef6\u8bf4\u660e \u4e2d\u5bf9\u4e8e\u5bc6\u7801\u7684\u76f8\u5173\u914d\u7f6e\u3002"}),"\n",(0,i.jsx)(e.p,{children:"3\uff0c\u5c06\u547d\u4ee4\u653e\u5165monitor\u7ebf\u7a0b\uff0c\u5bf9\u5e94\u547d\u4ee4\u53ef\u4ee5\u67e5\u770bRedis Monitor \u547d\u4ee4\u3002"}),"\n",(0,i.jsx)(e.p,{children:"4\uff0c\u8c03\u7528Cmd::Initial\u3002"}),"\n",(0,i.jsx)(e.p,{children:"5\uff0c\u8c03\u7528Cmd::Execute\u3002"}),"\n",(0,i.jsx)(e.p,{children:"6\uff0c\u5982\u679c\u5f00\u542fSlowlog\uff0c\u5219\u8bb0\u5f55Slowlog\uff0c\u5bf9\u5e94\u547d\u4ee4\u53ef\u4ee5\u67e5\u770bSlowlog\u547d\u4ee4\u3002"}),"\n",(0,i.jsx)(e.h2,{id:"cmd-\u901a\u7528\u5904\u7406\u6d41\u7a0b",children:"Cmd \u901a\u7528\u5904\u7406\u6d41\u7a0b"}),"\n",(0,i.jsx)(e.p,{children:"\u5728PikaClientConn\u7684\u901a\u7528\u5904\u7406\u6d41\u7a0b\u4e2d\uff0c\u5bf9\u4e8e\u4e0d\u540cCmd\u7684\u64cd\u4f5c\u90fd\u662f\u8c03\u7528\u5176\u57fa\u7c7b\u5904\u7406\u51fd\u6570Initial\u548cExecute\uff0cInitial\u548cExecute\u51fd\u6570\u5185\u90e8\u4f1a\u8c03\u7528\u7eaf\u865a\u51fd\u6570DoInitial\u548cDo\uff0c\u901a\u8fc7\u591a\u6001\u67e5\u627e\u6d3e\u751f\u7c7b\u7684\u771f\u6b63\u5b9e\u73b0\u3002"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-c++",children:"class Cmd: public std::enable_shared_from_this<Cmd> {\n virtual void DoInitial() = 0;\n virtual void Do(std::shared_ptr<Partition> partition = nullptr) = 0;\n void Cmd::Initial(const PikaCmdArgsType& argv,\n const std::string& table_name) {\n argv_ = argv;\n table_name_ = table_name;\n res_.clear(); // Clear res content\n Clear(); // Clear cmd, Derived class can has own implement\n DoInitial();\n };\n void Cmd::Execute() {\n ...\n if (g_pika_conf->classic_mode()...) {\n // invoke InternalProcessCommand and Cmd::Do\n ProcessSinglePartitionCmd();\n } else {\n ...\n }\n };\n void Cmd::InternalProcessCommand(std::shared_ptr<Partition> partition,\n std::shared_ptr<SyncMasterPartition> sync_partition) {\n slash::lock::MultiRecordLock record_lock(partition->LockMgr());\n if (is_write()) {\n record_lock.Lock(current_key());\n }\n // invoke Cmd::Do\n DoCommand(partition, hint_keys);\n DoBinlog(sync_partition);\n if (is_write()) {\n record_lock.Unlock(current_key());\n }\n }\n}\n"})}),"\n",(0,i.jsx)(e.p,{children:"\u4efb\u4f55\u5177\u4f53\u7684\u547d\u4ee4\u7ee7\u627fCmd\u4e4b\u540e\uff0c\u9700\u8981\u5b9e\u73b0DoInitial\u548cDo \u4e24\u4e2a\u7eaf\u865a\u51fd\u6570\u3002\u5728\u4e4b\u540e\u7684\u901a\u7528\u5904\u7406\u6d41\u7a0b\u4e2dCmd\u4f1a\u505a\u76f8\u5e94\u7684\u8c03\u7528\u3002Cmd\u5bf9\u5916\u4e3b\u8981\u66b4\u9732Initial \u548cExecute \u4e24\u4e2a\u63a5\u53e3\u3002"}),"\n",(0,i.jsx)(e.p,{children:"1\uff0cInitial\u6e05\u9664\u524d\u4e00\u6b21\u8c03\u7528\u7684\u6b8b\u7559\u6570\u636e\uff0c\u540c\u65f6\u8c03\u7528DoInitial\u865a\u51fd\u6570\u3002"}),"\n",(0,i.jsx)(e.p,{children:"2\uff0cExecute\u5224\u65adpika\u8fd0\u884c\u6a21\u5f0f\uff0c\u4e3b\u8981\u8c03\u7528InternalProcessCommand\u3002"}),"\n",(0,i.jsx)(e.p,{children:"2.1\uff0c\u5bf9\u4e8e\u64cd\u4f5cDB \u548cBinlog \u8fd9\u4e24\u4e2a\u52a8\u4f5c\u52a0\u9501\uff0c\u786e\u4fddDB \u548cBinlog \u662f\u4e00\u81f4\u7684\u3002"}),"\n",(0,i.jsx)(e.p,{children:"2.2\uff0c\u8c03\u7528DoCommand\uff0c\u5176\u5185\u90e8\u4e3b\u8981\u8c03\u7528Do \u865a\u51fd\u6570\u3002"}),"\n",(0,i.jsx)(e.p,{children:"2.3\uff0c\u8c03\u7528DoBinlog\uff0c\u5c06\u547d\u4ee4\u5904\u7406\u540e\u5199\u5165Binlog\u3002"}),"\n",(0,i.jsx)(e.h3,{id:"docommand",children:"DoCommand"}),"\n",(0,i.jsx)(e.p,{children:"DoCommand\u7684\u4f5c\u7528\u4e3b\u8981\u662f\u5c06\u547d\u4ee4\u5199\u5165DB\u3002"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-c++",children:"void Cmd::DoCommand(\n std::shared_ptr<Partition> partition, const HintKeys& hint_keys) {\n if (!is_suspend()) {\n partition->DbRWLockReader();\n }\n Do(partition);\n if (!is_suspend()) {\n partition->DbRWUnLock();\n }\n}\n"})}),"\n",(0,i.jsx)(e.p,{children:"BGSAVE\uff0cFLUSHALL\uff0cFLUSHDB\u9664\u4e86\u4e4b\u5916\uff0c\u5176\u4f59\u6240\u6709\u547d\u4ee4\u5728\u6267\u884cDo\u51fd\u6570\u4e4b\u524d\u90fd\u9700\u8981\u52a0\u8bfb\u9501\u3002\u5bf9\u4e8e\u8fd9\u51e0\u4e2a\u7279\u6b8a\u7684\u547d\u4ee4\u800c\u8a00\uff0c\u5b83\u4eec\u7684\u5171\u540c\u70b9\u662f\u90fd\u9700\u8981\u6e05\u9664\u6570\u636e\uff0c\u4e3a\u4fdd\u8bc1\u6e05\u9664\u8fc7\u7a0b\u6ca1\u6709\u5176\u5b83\u64cd\u4f5c\u540c\u65f6\u8fdb\u884c\uff0c\u9700\u8981\u5bf9\u76f8\u5e94\u7684\u5206\u7247\u6216\u8005db\u52a0\u4e0a\u5199\u9501\u963b\u585e\u5176\u4ed6\u64cd\u4f5c\u3002\u5177\u4f53\u6765\u8bf4\uff0c\u5b83\u4eecDo\u7684\u51fd\u6570\u5b9e\u73b0\u5185\u90e8\u4f1a\u76f4\u63a5\u8c03DbRWLockWriter\uff0c\u963b\u585e\u5176\u5b83\u64cd\u4f5c\u3002"}),"\n",(0,i.jsx)(e.h3,{id:"dobinlog",children:"DoBinlog"}),"\n",(0,i.jsx)(e.p,{children:"DoBinlog\u7684\u4f5c\u7528\u4e3b\u8981\u662f\u5c06\u547d\u4ee4\u5199\u5165Binlog\u3002"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-c++",children:"void Cmd::DoBinlog(std::shared_ptr<SyncMasterPartition> partition) {\n Status s = partition->ConsensusProposeLog(shared_from_this(),\n std::dynamic_pointer_cast<PikaClientConn>(conn_ptr), resp_ptr);\n}\n"})}),"\n",(0,i.jsxs)(e.p,{children:["\u901a\u8fc7 ",(0,i.jsx)(e.code,{children:"ConsensusProposeLog => InternalAppendBinlog => (std::shared_ptr<Binlog>)Logger()->Put(binlog)"})," \u4e00\u7cfb\u5217\u7684\u51fd\u6570\u8c03\u7528\uff0c\u6700\u7ec8\u8c03\u7528class Binlog\u7684Put\u63a5\u53e3\u5c06\uff0cbinlog \u5b57\u7b26\u4e32\u5199\u5165Binlog \u6587\u4ef6\u5f53\u4e2d\u3002"]}),"\n",(0,i.jsx)(e.p,{children:(0,i.jsx)(e.img,{alt:"alt text",src:r(3226).A+"",width:"1070",height:"538"})}),"\n",(0,i.jsx)(e.p,{children:"Binlog\u6587\u4ef6\u662f\u7531\u4e00\u4e2a\u4e00\u4e2aBlocks\u7ec4\u6210\u7684\uff0c\u8fd9\u6837\u7ec4\u7ec7\u4e3b\u8981\u9632\u6b62binlog\u6587\u4ef6\u7684\u67d0\u4e00\u4e2a\u70b9\u635f\u574f\u9020\u6210\u6574\u4e2a\u6587\u4ef6\u4e0d\u53ef\u8bfb\u3002\u6bcf\u4e00\u4e2abinlog \u5b57\u7b26\u4e32\u5148\u5e8f\u5217\u5316\u6210BinlogItem \u7ed3\u6784\uff0c\u5982\u9ec4\u8272\u677f\u5757\u6240\u793a\uff0c\u7ec4\u6210BinlogItem\u4e4b\u540e\uff0c\u518d\u52a0\u4e0a8\u4e2abytes\uff08Length\uff0cTime\uff0cType\uff09\u7ec4\u6210\u5b8c\u6574\u7684\u53ef\u4ee5\u843d\u76d8\u7684\u6570\u636e\u3002"}),"\n",(0,i.jsx)(e.h2,{id:"\u547d\u4ee4\u6267\u884c\u8fc7\u7a0b\u7684\u5dee\u5f02\u5316\u5904\u7406",children:"\u547d\u4ee4\u6267\u884c\u8fc7\u7a0b\u7684\u5dee\u5f02\u5316\u5904\u7406"}),"\n",(0,i.jsx)(e.p,{children:"\u4ee5\u4e0a\u8ba8\u8bba\u4e86Pika\u7684\u901a\u7528\u5904\u7406\u6d41\u7a0b\uff0c\u6240\u6709\u547d\u4ee4\u7684\u5904\u7406\u90fd\u8981\u7ecf\u8fc7\u4ee5\u4e0a\u7684\u5904\u7406\u6d41\u7a0b\uff0c\u5bf9\u4e8e\u6bcf\u4e00\u6761\u547d\u4ee4\u7684\u5177\u4f53\u5904\u7406\u7ec6\u8282\uff0c\u7531\u5177\u4f53\u7684\u547d\u4ee4\u5b9e\u73b0\u51b3\u5b9a\u3002\u4e0b\u9762\u4ee5SetCmd\u4e3a\u4f8b\u3002"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-c++",children:"class SetCmd : public Cmd {\n virtual void DoInitial() override;\n virtual void Do(std::shared_ptr<Partition> partition = nullptr);\n void GetCmd::DoInitial() {\n if (!CheckArg(argv_.size())) {\n res_.SetRes(CmdRes::kWrongNum, kCmdNameGet);\n return;\n }\n key_ = argv_[1];\n return;\n }\n void SetCmd::Do(std::shared_ptr<Partition> partition) {\n switch (condition_) {\n ...\n case SetCmd::kNX:\n s = partition->db()->Setnx(key_, value_, &res, sec_);\n break;\n default:\n s = partition->db()->Set(key_, value_);\n break;\n }\n ...\n }\n}\n"})}),"\n",(0,i.jsx)(e.p,{children:"SetCmd\u7684DoInitial\u5b9e\u73b0\u4e3b\u8981\u521d\u59cb\u5316\u672a\u7ee7\u627f\u81eaCmd\u7684\u6570\u636e\u3002"}),"\n",(0,i.jsx)(e.p,{children:"SetCmd\u7684Do\u5b9e\u73b0\u4e3b\u8981\u662f\u6839\u636eSet\u547d\u4ee4\u7684\u51e0\u79cd\u53d8\u5f62\u8fdb\u884c\u4e0d\u540c\u7684Blackwidow\u63a5\u53e3\u8c03\u7528\u3002"}),"\n",(0,i.jsx)(e.p,{children:"\u4ee5\u4e0a\u6211\u4eec\u4ecb\u7ecd\u4e86Pika\u4e3b\u8981\u7684\u8bfb\u5199\u6d41\u7a0b\uff0c\u4f46\u662f\u5728\u4e00\u81f4\u6027\u573a\u666f\u4e0b\u6211\u4eec\u4e0d\u80fd\u591f\u5b8c\u5168\u6309\u7167\u4ee5\u4e0a\u7684\u8bfb\u5199\u8def\u5f84\u8fdb\u884c\u5904\u7406\uff0c\u4e0b\u9762\u6211\u4eec\u6765\u770b\u4e00\u4e0b\u4e00\u81f4\u6027\u573a\u666f\u4e0b\u6570\u636e\u7684\u8bfb\u5199\u6d41\u7a0b\u3002"}),"\n",(0,i.jsx)(e.h2,{id:"\u4e00\u81f4\u6027\u5b9e\u73b0\u4e2d\u7684\u6570\u636e\u5199\u5165",children:"\u4e00\u81f4\u6027\u5b9e\u73b0\u4e2d\u7684\u6570\u636e\u5199\u5165"}),"\n",(0,i.jsx)(e.p,{children:"\u4e00\u81f4\u6027\u573a\u666f\u4e0b\uff0c\u5e76\u4e0d\u662f\u50cf\u4e0a\u9762\u6240\u8bf4DoCommand \u548cDoBinlog \u5728\u4e00\u8d77\u6267\u884c\u7684\u3002\u4e00\u81f4\u6027\u573a\u666f\u4e0b\uff0c\u9700\u8981\u5728Leader\u7684Execute\u4e2d\u505aDoBinlog\uff0c\u7136\u540e\u5bf9\u4e8e\u8fd9\u6761Binlog\u5728\u5f97\u5230\u4e00\u5b9a\u6570\u76ee\u7684Follower\u786e\u8ba4\u4e4b\u540e\uff0c\u5229\u7528\u5b58\u4e0b\u6765\u7684MemLog::LogItem\u4e2d\u7684PikaClientConn \u548cCmd\u6307\u9488\uff0c\u8c03\u7528DoExecTask\uff0c\u5176\u4e2d\u518d\u6b21\u8c03\u7528Execute\uff0c\u8fdb\u884cDoCommand \u7684\u64cd\u4f5c\u3002"}),"\n",(0,i.jsx)(e.p,{children:"\u7531\u4e8e\u6027\u80fd\u8003\u8651\uff0cDoCommand\u7684\u64cd\u4f5c\u9700\u8981\u591a\u7ebf\u7a0b\u5e76\u53d1\u6267\u884c\uff0c\u8fd9\u6837\u4e00\u6761Conn\u7684\u547d\u4ee4\u5c31\u6709\u53ef\u80fd\u88ab\u51e0\u4e2a\u7ebf\u7a0b\u540c\u65f6\u6267\u884c\uff0c\u90a3\u4e48\u5982\u4f55\u4fdd\u8bc1\u8fd0\u884c\u7ed3\u679c\u7684\u6b63\u786e\u6027\u5462\u3002"}),"\n",(0,i.jsx)(e.p,{children:"\u5728PikaClientConn \u4e2d\u8bb0\u5f55\u4e86\u5f53\u524dConn\u9700\u8981\u6267\u884c\u7684\u5b50\u547d\u4ee4\u7684\u4e2a\u6570\u548c\u6240\u6709\u5b50\u547d\u4ee4\u7684response\u6307\u9488\u6570\u7ec4\u3002\u4e00\u81f4\u6027\u573a\u666f\u4e2d\u4f1a\u5c06\u8be5\u5b50\u547d\u4ee4\u5bf9\u5e94\u7684resp_ptr\u6307\u9488\u4e0ePikaClientConn \u548cCmd \u5b58\u6210MemLog::LogItem\u5b58\u4e0b\u6765\uff0c\u5f53\u8fd9\u6761\u5b50\u547d\u4ee4\u5728\u5f97\u5230\u4e00\u5b9a\u6570\u76ee\u7684Follower\u786e\u8ba4\u4e4b\u540e\uff0c\u5c06\u5f53\u524dLogItem\u6267\u884c\u7684\u7ed3\u679c\u5199\u5165LogItem \u4e2d\u7684resp_ptr \u4e2d\u5e76\u4e14resp_num \u81ea\u51cf\uff0c\u6267\u884c\u6700\u540e\u4e00\u4e2a\u547d\u4ee4\u7684\u7ebf\u7a0b\u8d1f\u8d23\u5c06\u5176\u4ed6\u6240\u6709\u7ebf\u7a0b\u7684\u6267\u884c\u7ed3\u679c\u7ec4\u5408\uff0c\u8fd4\u56de\u5ba2\u6237\u7aef\u3002"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-c++",children:"void PikaClientConn::BatchExecRedisCmd(\n const std::vector<pink::RedisCmdArgsType>& argvs) {\n resp_num.store(argvs.size());\n for (size_t i = 0; i < argvs.size(); ++i) {\n std::shared_ptr<std::string> resp_ptr = std::make_shared<std::string>();\n resp_array.push_back(resp_ptr);\n ExecRedisCmd(argvs[i], resp_ptr);\n }\n TryWriteResp();\n}\n\nvoid PikaClientConn::ExecRedisCmd(\n const PikaCmdArgsType& argv, std::shared_ptr<std::string> resp_ptr) {\n std::shared_ptr<Cmd> cmd_ptr = DoCmd(argv, opt, resp_ptr);\n // level == 0 or (cmd error) or (is_read)\n if (g_pika_conf->consensus_level() == 0\n || !cmd_ptr->res().ok() || !cmd_ptr->is_write()) {\n *resp_ptr = std::move(cmd_ptr->res().message());\n resp_num--;\n }\n}\n"})}),"\n",(0,i.jsx)(e.p,{children:"1\uff0c\u8c03\u7528BatchExecRedisCmd\uff0c\u521d\u59cb\u5316resp_num\uff0c\u4e3a\u6b64\u6b21\u8bf7\u6c42\u5b50\u547d\u4ee4\u7684\u4e2a\u6570\u3002"}),"\n",(0,i.jsx)(e.p,{children:"2\uff0c\u521d\u59cb\u5316resp_ptr\uff0c\u5b58\u5165PikaClientConn\u6307\u9488\u6570\u7ec4\uff0c\u4f20\u5165ExecRedisCmd\u3002"}),"\n",(0,i.jsx)(e.p,{children:"3\uff0c\u5728ExecRedisCmd\u4e2d\uff0c\u8c03\u7528DoCmd\uff0c\u5982\u679c\u8fd4\u56de\u6b63\u5e38\uff0c\u5219\u7b49\u5f85Follower\u786e\u8ba4\uff0c\u518d\u6267\u884cDoCommand\u3002\u5982\u679c\u8fd4\u56de\u5f02\u5e38\uff0c\u76f4\u63a5\u6807\u8bb0\u5f53\u524d\u5b50\u547d\u4ee4\u5f02\u5e38\uff0c\u5e76\u4e14resp_num \u81ea\u51cf\uff0c\u5982\u679c\u662fPikaClientConn \u662f\u5355\u6761\u547d\u4ee4\u7684\u60c5\u51b5\uff0c\u8fd9\u65f6\u5019\u8c03\u7528BatchExecRedisCmd\u4e2d\u7684TryWriteResp \u5c31\u53ef\u4ee5\u76f4\u63a5\u8fd4\u56de\u5ba2\u6237\u7aef\u4e86\uff0c\u6ca1\u6709\u5fc5\u8981\u540c\u6b65\u5230\u4ece\u3002"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-c++",children:"void PikaClientConn::DoExecTask(void* arg) {\n cmd_ptr->Execute();\n *resp_ptr = std::move(cmd_ptr->res().message());\n conn_ptr->resp_num--;\n conn_ptr->TryWriteResp();\n}\n\nvoid PikaClientConn::TryWriteResp() {\n int expected = 0;\n if (resp_num.compare_exchange_strong(expected, -1)) {\n for (auto& resp : resp_array) {\n WriteResp(std::move(*resp));\n }\n resp_array.clear();\n NotifyEpoll(true);\n }\n}\n"})}),"\n",(0,i.jsx)(e.p,{children:"1\uff0c\u5982\u679cDoCmd\u8fd4\u56de\u6b63\u5e38\uff0c\u4e00\u81f4\u6027\u6a21\u5757\u4f1a\u6700\u7ec8\u5bf9\u4e8e\u6bcf\u4e00\u6761\u5b50\u547d\u4ee4\u8c03\u7528\u4e00\u6b21DoExecTask\u3002"}),"\n",(0,i.jsx)(e.p,{children:"2\uff0c\u6bcf\u6b21\u5904\u7406\u5b50\u547d\u4ee4\u90fd\u5c1d\u8bd5TryWriteResp\uff0c\u53ea\u6709\u5f53\u524dresp_num \u662f0 \u624d\u53ef\u4ee5\u6574\u5408PikaClientConn\u4e2d\u6240\u6709\u5b50\u547d\u4ee4\u6267\u884c\u7ed3\u679c\uff0c\u901a\u77e5WorkerThread\u5199\u56de\u5ba2\u6237\u7aef\u3002"}),"\n",(0,i.jsx)(e.h2,{id:"reference",children:"Reference"}),"\n",(0,i.jsx)(e.p,{children:(0,i.jsx)(e.a,{href:"https://github.com/Qihoo360/pika/tree/v3.3.4",children:"https://github.com/Qihoo360/pika/tree/v3.3.4"})})]})}function p(n={}){const{wrapper:e}={...(0,s.R)(),...n.components};return e?(0,i.jsx)(e,{...n,children:(0,i.jsx)(l,{...n})}):l(n)}},3226:(n,e,r)=>{r.d(e,{A:()=>i});const i=r.p+"assets/images/image-1-b89be591bc8c74504d87cca233c6c56a.png"},5140:(n,e,r)=>{r.d(e,{A:()=>i});const i=r.p+"assets/images/image-aad65eec86e42083a83018a4357d882b.png"},8453:(n,e,r)=>{r.d(e,{R:()=>o,x:()=>d});var i=r(6540);const s={},t=i.createContext(s);function o(n){const e=i.useContext(t);return i.useMemo((function(){return"function"==typeof n?n(e):{...e,...n}}),[e,n])}function d(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(s):n.components||s:o(n.components),i.createElement(t.Provider,{value:e},n.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/ab946cbc.1916eb51.js b/build/assets/js/ab946cbc.1916eb51.js new file mode 100644 index 0000000..032f636 --- /dev/null +++ b/build/assets/js/ab946cbc.1916eb51.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[5533],{7496:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>l,contentTitle:()=>d,default:()=>m,frontMatter:()=>c,metadata:()=>n,toc:()=>o});var a=s(4848),i=s(8453);const c={title:"\u65e7\u5b58\u50a8\u7ed3\u6784",sidebar_position:14},d=void 0,n={id:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65e7\u5b58\u50a8\u7ed3\u6784/index",title:"\u65e7\u5b58\u50a8\u7ed3\u6784",description:"Blackwidow \u672c\u8d28\u4e0a\u662f\u57fa\u4e8e rocksdb \u7684\u5c01\u88c5\uff0c\u4f7f\u672c\u8eab\u53ea\u652f\u6301 kv \u5b58\u50a8\u7684 rocksdb \u80fd\u591f\u652f\u6301\u591a\u79cd\u6570\u636e\u7ed3\u6784, \u76ee\u524d Blackwidow \u652f\u6301\u4e94\u79cd\u6570\u636e\u7ed3\u6784\u7684\u5b58\u50a8\uff1aString \u7ed3\u6784(\u5b9e\u9645\u4e0a\u5c31\u662f\u5b58\u50a8 key, value), Hash \u7ed3\u6784\uff0cList \u7ed3\u6784\uff0cSet \u7ed3\u6784\u548c ZSet \u7ed3\u6784\uff0c \u56e0\u4e3a Rocksdb \u7684\u5b58\u50a8\u65b9\u5f0f\u53ea\u6709 kv \u4e00\u79cd\uff0c \u6240\u4ee5\u4e0a\u8ff0\u4e94\u79cd\u6570\u636e\u7ed3\u6784\u6700\u7ec8\u90fd\u8981\u843d\u76d8\u5230 Rocksdb \u7684 kv \u5b58\u50a8\u65b9\u5f0f\u4e0a\uff0c\u4e0b\u9762\u6211\u4eec\u5c55\u793a Blackwidow \u548c rocksdb \u7684\u5173\u7cfb\u5e76\u4e14\u8bf4\u660e\u6211\u4eec\u662f\u5982\u4f55\u7528 kv \u6765\u6a21\u62df\u591a\u6570\u636e\u7ed3\u6784\u7684\u3002",source:"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65e7\u5b58\u50a8\u7ed3\u6784/index.md",sourceDirName:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65e7\u5b58\u50a8\u7ed3\u6784",slug:"/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65e7\u5b58\u50a8\u7ed3\u6784/",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65e7\u5b58\u50a8\u7ed3\u6784/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65e7\u5b58\u50a8\u7ed3\u6784/index.md",tags:[],version:"current",sidebarPosition:14,frontMatter:{title:"\u65e7\u5b58\u50a8\u7ed3\u6784",sidebar_position:14},sidebar:"tutorialSidebar",previous:{title:"NoSQL \u539f\u7406\u6982\u8ff0",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/NoSQL \u539f\u7406\u6982\u8ff0/"},next:{title:"\u65b0\u5b58\u50a8\u7ed3\u6784",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65b0\u5b58\u50a8\u7ed3\u6784/"}},l={},o=[{value:"1. String \u7ed3\u6784\u7684\u5b58\u50a8",id:"1-string-\u7ed3\u6784\u7684\u5b58\u50a8",level:2},{value:"2. Hash \u7ed3\u6784\u7684\u5b58\u50a8",id:"2-hash-\u7ed3\u6784\u7684\u5b58\u50a8",level:2},{value:"3. List \u7ed3\u6784\u7684\u5b58\u50a8",id:"3-list-\u7ed3\u6784\u7684\u5b58\u50a8",level:2},{value:"4. Set \u7ed3\u6784\u7684\u5b58\u50a8",id:"4-set-\u7ed3\u6784\u7684\u5b58\u50a8",level:2},{value:"5. ZSet \u7ed3\u6784\u7684\u5b58\u50a8",id:"5-zset-\u7ed3\u6784\u7684\u5b58\u50a8",level:2},{value:"Blackwidow \u76f8\u5bf9\u4e8e Nemo \u6709\u54ea\u4e9b\u4f18\u52bf",id:"blackwidow-\u76f8\u5bf9\u4e8e-nemo-\u6709\u54ea\u4e9b\u4f18\u52bf",level:2}];function r(e){const t={h2:"h2",img:"img",li:"li",ol:"ol",p:"p",...(0,i.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(t.p,{children:["Blackwidow \u672c\u8d28\u4e0a\u662f\u57fa\u4e8e rocksdb \u7684\u5c01\u88c5\uff0c\u4f7f\u672c\u8eab\u53ea\u652f\u6301 kv \u5b58\u50a8\u7684 rocksdb \u80fd\u591f\u652f\u6301\u591a\u79cd\u6570\u636e\u7ed3\u6784, \u76ee\u524d Blackwidow \u652f\u6301\u4e94\u79cd\u6570\u636e\u7ed3\u6784\u7684\u5b58\u50a8\uff1aString \u7ed3\u6784(\u5b9e\u9645\u4e0a\u5c31\u662f\u5b58\u50a8 key, value), Hash \u7ed3\u6784\uff0cList \u7ed3\u6784\uff0cSet \u7ed3\u6784\u548c ZSet \u7ed3\u6784\uff0c \u56e0\u4e3a Rocksdb \u7684\u5b58\u50a8\u65b9\u5f0f\u53ea\u6709 kv \u4e00\u79cd\uff0c \u6240\u4ee5\u4e0a\u8ff0\u4e94\u79cd\u6570\u636e\u7ed3\u6784\u6700\u7ec8\u90fd\u8981\u843d\u76d8\u5230 Rocksdb \u7684 kv \u5b58\u50a8\u65b9\u5f0f\u4e0a\uff0c\u4e0b\u9762\u6211\u4eec\u5c55\u793a Blackwidow \u548c rocksdb \u7684\u5173\u7cfb\u5e76\u4e14\u8bf4\u660e\u6211\u4eec\u662f\u5982\u4f55\u7528 kv \u6765\u6a21\u62df\u591a\u6570\u636e\u7ed3\u6784\u7684\u3002 ",(0,a.jsx)(t.img,{src:"https://camo.githubusercontent.com/331c73e57e3c93ce0eb4661c0fbca74e1881b79af43e0237807c650c760a4fab/68747470733a2f2f692e696d6775722e636f6d2f6e71656c6975762e706e67",alt:""})]}),"\n",(0,a.jsx)(t.h2,{id:"1-string-\u7ed3\u6784\u7684\u5b58\u50a8",children:"1. String \u7ed3\u6784\u7684\u5b58\u50a8"}),"\n",(0,a.jsx)(t.p,{children:"String \u672c\u8d28\u4e0a\u5c31\u662f Key, Value, \u6211\u4eec\u77e5\u9053 Rocksdb \u672c\u8eab\u5c31\u662f\u652f\u6301 kv \u5b58\u50a8\u7684\uff0c \u6211\u4eec\u4e3a\u4e86\u5b9e\u73b0 Redis \u4e2d\u7684 expire \u529f\u80fd\uff0c\u6240\u4ee5\u5728 value \u540e\u9762\u6dfb\u52a0\u4e86 4 Bytes \u7528\u4e8e\u5b58\u50a8 timestamp, \u4f5c\u4e3a\u6700\u540e Rocksdb \u843d\u76d8\u7684 kv \u683c\u5f0f\uff0c\u4e0b\u9762\u662f\u5177\u4f53\u7684\u5b9e\u73b0\u65b9\u5f0f:"}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{src:"https://camo.githubusercontent.com/24ea0bc73f9b3ca36e92e18415dae3f8d0da2be3f8760b745e8cd33f1b28e216/68747470733a2f2f692e696d6775722e636f6d2f4b6e41373037612e706e67",alt:""})}),"\n",(0,a.jsx)(t.p,{children:"\u5982\u679c\u6211\u4eec\u6ca1\u6709\u5bf9\u8be5 String \u5bf9\u8c61\u8bbe\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u5219 timestamp \u5b58\u50a8\u7684\u503c\u5c31\u662f\u9ed8\u8ba4\u503c 0\uff0c \u5426\u5219\u5c31\u662f\u8be5\u5bf9\u8c61\u8fc7\u671f\u65f6\u95f4\u7684\u65f6\u95f4\u6233\uff0c \u6bcf\u6b21\u6211\u4eec\u83b7\u53d6\u4e00\u4e2a String \u5bf9\u8c61\u7684\u65f6\u5019\uff0c \u9996\u5148\u4f1a\u89e3\u6790 Value \u90e8\u5206\u7684\u540e\u56db\u5b57\u8282\uff0c \u83b7\u53d6\u5230 timestamp \u505a\u51fa\u5224\u65ad\u4e4b\u540e\u518d\u8fd4\u56de\u7ed3\u679c\u3002"}),"\n",(0,a.jsx)(t.h2,{id:"2-hash-\u7ed3\u6784\u7684\u5b58\u50a8",children:"2. Hash \u7ed3\u6784\u7684\u5b58\u50a8"}),"\n",(0,a.jsx)(t.p,{children:"blackwidow \u4e2d\u7684 hash \u8868\u7531\u4e24\u90e8\u5206\u6784\u6210\uff0c\u5143\u6570\u636e(meta_key, meta_value), \u548c\u666e\u901a\u6570\u636e(data_key, data_value), \u5143\u6570\u636e\u4e2d\u5b58\u50a8\u7684\u4e3b\u8981\u662f hash \u8868\u7684\u4e00\u4e9b\u4fe1\u606f\uff0c \u6bd4\u5982\u8bf4\u5f53\u524d hash \u8868\u7684\u57df\u7684\u6570\u91cf\u4ee5\u53ca\u5f53\u524d hash \u8868\u7684\u7248\u672c\u53f7\u548c\u8fc7\u671f\u65f6\u95f4(\u7528\u505a\u79d2\u5220\u529f\u80fd), \u800c\u666e\u901a\u6570\u636e\u4e3b\u8981\u5c31\u662f\u6307\u7684\u540c\u4e00\u4e2a hash \u8868\u4e2d\u4e00\u4e00\u5bf9\u5e94\u7684 field \u548c value\uff0c\u4f5c\u4e3a\u5177\u4f53\u6700\u540e Rocksdb \u843d\u76d8\u7684 kv \u683c\u5f0f\uff0c\u4e0b\u9762\u662f\u5177\u4f53\u7684\u5b9e\u73b0\u65b9\u5f0f:"}),"\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsxs)(t.li,{children:["\u6bcf\u4e2a hash \u8868\u7684 meta_key \u548c meta_value \u7684\u843d\u76d8\u65b9\u5f0f: ",(0,a.jsx)(t.img,{src:"https://camo.githubusercontent.com/b77cc4f678067be6a8b1198baa566b10cc2c938a4635f4ec6234d9d38d5c2e65/68747470733a2f2f692e696d6775722e636f6d2f594c50343872672e706e67",alt:""})]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"meta_key \u5b9e\u9645\u4e0a\u5c31\u662f hash \u8868\u7684 key, \u800c meta_value \u7531\u4e09\u4e2a\u90e8\u5206\u6784\u6210: 4Bytes \u7684 Hash size(\u7528\u4e8e\u5b58\u50a8\u5f53\u524d hash \u8868\u7684\u5927\u5c0f) + 4Bytes \u7684 Version(\u7528\u4e8e\u79d2\u5220\u529f\u80fd) + 4Bytes \u7684 Timestamp(\u7528\u4e8e\u8bb0\u5f55\u6211\u4eec\u7ed9\u8fd9\u4e2a Hash \u8868\u8bbe\u7f6e\u7684\u8d85\u65f6\u65f6\u95f4\u7684\u65f6\u95f4\u6233\uff0c \u9ed8\u8ba4\u4e3a 0)"}),"\n",(0,a.jsxs)(t.ol,{start:"2",children:["\n",(0,a.jsxs)(t.li,{children:["hash \u8868\u4e2d data_key \u548c data_value \u7684\u843d\u76d8\u65b9\u5f0f: ",(0,a.jsx)(t.img,{src:"https://camo.githubusercontent.com/cafbc8c87956df45017a94963c3a0f539ca9c0a14f8eacfbeb2cc007740ed2f4/68747470733a2f2f692e696d6775722e636f6d2f706869427371642e706e67",alt:""})]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"data_key \u7531\u56db\u4e2a\u90e8\u5206\u6784\u6210: 4Bytes \u7684 Key size(\u7528\u4e8e\u8bb0\u5f55\u540e\u9762\u8ffd\u52a0\u7684 key \u7684\u957f\u5ea6\uff0c\u4fbf\u4e0e\u89e3\u6790) + key \u7684\u5185\u5bb9 + 4Bytes \u7684 Version + Field \u7684\u5185\u5bb9\uff0c \u800c data_value \u5c31\u662f hash \u8868\u67d0\u4e2a field \u5bf9\u5e94\u7684 value\u3002"}),"\n",(0,a.jsxs)(t.ol,{start:"3",children:["\n",(0,a.jsx)(t.li,{children:"\u5982\u679c\u6211\u4eec\u9700\u8981\u67e5\u627e\u4e00\u4e2a hash \u8868\u4e2d\u7684\u67d0\u4e00\u4e2a field \u5bf9\u5e94\u7684 value, \u6211\u4eec\u9996\u5148\u4f1a\u83b7\u53d6\u5230 meta_value \u89e3\u6790\u51fa\u5176\u4e2d\u7684 timestamp \u5224\u65ad\u8fd9\u4e2a hash \u8868\u662f\u5426\u8fc7\u671f\uff0c \u5982\u679c\u6ca1\u6709\u8fc7\u671f\uff0c \u6211\u4eec\u53ef\u4ee5\u62ff\u5230\u5176\u4e2d\u7684 version, \u7136\u540e\u6211\u4eec\u4f7f\u7528 key, version\uff0c\u548c field \u62fc\u51fa data_key, \u8fdb\u800c\u627e\u5230\u5bf9\u5e94\u7684 data_value\uff08\u5982\u679c\u5b58\u5728\u7684\u8bdd)"}),"\n"]}),"\n",(0,a.jsx)(t.h2,{id:"3-list-\u7ed3\u6784\u7684\u5b58\u50a8",children:"3. List \u7ed3\u6784\u7684\u5b58\u50a8"}),"\n",(0,a.jsx)(t.p,{children:"blackwidow \u4e2d\u7684 list \u7531\u4e24\u90e8\u5206\u6784\u6210\uff0c\u5143\u6570\u636e(meta_key, meta_value), \u548c\u666e\u901a\u6570\u636e(data_key, data_value), \u5143\u6570\u636e\u4e2d\u5b58\u50a8\u7684\u4e3b\u8981\u662f list \u94fe\u8868\u7684\u4e00\u4e9b\u4fe1\u606f\uff0c \u6bd4\u5982\u8bf4\u5f53\u524d list \u94fe\u8868\u7ed3\u70b9\u7684\u7684\u6570\u91cf\u4ee5\u53ca\u5f53\u524d list \u94fe\u8868\u7684\u7248\u672c\u53f7\u548c\u8fc7\u671f\u65f6\u95f4(\u7528\u505a\u79d2\u5220\u529f\u80fd), \u8fd8\u6709\u5f53\u524d list \u94fe\u8868\u7684\u5de6\u53f3\u8fb9\u754c(\u7531\u4e8e nemo \u5b9e\u73b0\u7684\u94fe\u8868\u7ed3\u6784\u88ab\u5410\u69fd lrange \u6548\u7387\u4f4e\u4e0b\uff0c\u6240\u4ee5\u8fd9\u6b21 blackwidow \u6211\u4eec\u5e95\u5c42\u7528\u6570\u7ec4\u6765\u6a21\u62df\u94fe\u8868\uff0c\u8fd9\u6837 lrange \u901f\u5ea6\u4f1a\u5927\u5927\u63d0\u5347\uff0c\u56e0\u4e3a\u7ed3\u70b9\u5b58\u50a8\u90fd\u662f\u6709\u5e8f\u7684), \u666e\u901a\u6570\u636e\u5b9e\u9645\u4e0a\u5c31\u662f\u6307\u7684 list \u4e2d\u6bcf\u4e00\u4e2a\u7ed3\u70b9\u4e2d\u7684\u6570\u636e\uff0c\u4f5c\u4e3a\u5177\u4f53\u6700\u540e Rocksdb \u843d\u76d8\u7684 kv \u683c\u5f0f\uff0c\u4e0b\u9762\u662f\u5177\u4f53\u7684\u5b9e\u73b0\u65b9\u5f0f"}),"\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsxs)(t.li,{children:["\u6bcf\u4e2a list \u94fe\u8868\u7684 meta_key \u548c meta_value \u7684\u843d\u76d8\u65b9\u5f0f: ",(0,a.jsx)(t.img,{src:"https://camo.githubusercontent.com/6ab6eedc64e22d524e216867772a3a3f0a7f1909d7b3b939bb6b46d150df42a3/68747470733a2f2f692e696d6775722e636f6d2f303833536a49632e706e67",alt:""})]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"meta_key \u5b9e\u9645\u4e0a\u5c31\u662f list \u94fe\u8868\u7684 key, \u800c meta_value \u7531\u4e94\u4e2a\u90e8\u5206\u6784\u6210: 8Bytes \u7684 List size(\u7528\u4e8e\u5b58\u50a8\u5f53\u524d\u94fe\u8868\u4e2d\u603b\u5171\u6709\u591a\u5c11\u4e2a\u7ed3\u70b9) + 4Bytes \u7684 Version(\u7528\u4e8e\u79d2\u5220\u529f\u80fd) + 4Bytes \u7684 Timestamp(\u7528\u4e8e\u8bb0\u5f55\u6211\u4eec\u7ed9\u8fd9\u4e2a List \u94fe\u8868\u8bbe\u7f6e\u7684\u8d85\u65f6\u65f6\u95f4\u7684\u65f6\u95f4\u6233\uff0c \u9ed8\u8ba4\u4e3a 0) + 8Bytes \u7684 Left Index\uff08\u6570\u7ec4\u7684\u5de6\u8fb9\u754c) + 8Bytes \u7684 Right Index(\u6570\u7ec4\u7684\u53f3\u8fb9\u754c)"}),"\n",(0,a.jsxs)(t.ol,{start:"2",children:["\n",(0,a.jsxs)(t.li,{children:["list \u94fe\u8868\u4e2d data_key \u548c data_value \u7684\u843d\u76d8\u65b9\u5f0f: ",(0,a.jsx)(t.img,{src:"https://camo.githubusercontent.com/e39c47b452e1eb53b098644a81d284f162d309231dcc0980f49fc33079c95e96/68747470733a2f2f692e696d6775722e636f6d2f4642426e366b642e706e67",alt:""})]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"data_key \u7531\u56db\u4e2a\u90e8\u5206\u6784\u6210: 4Bytes \u7684 Key size(\u7528\u4e8e\u8bb0\u5f55\u540e\u9762\u8ffd\u52a0\u7684 key \u7684\u957f\u5ea6\uff0c\u4fbf\u4e0e\u89e3\u6790) + key \u7684\u5185\u5bb9 + 4Bytes \u7684 Version + 8Bytes \u7684 Index(\u8fd9\u4e2a\u8bb0\u5f55\u7684\u5c31\u662f\u5f53\u524d\u7ed3\u70b9\u7684\u5728\u8fd9\u4e2a list \u94fe\u8868\u4e2d\u7684\u7d22\u5f15)\uff0c \u800c data_value \u5c31\u662f list \u94fe\u8868\u8be5 node \u4e2d\u5b58\u50a8\u7684\u503c"}),"\n",(0,a.jsx)(t.h2,{id:"4-set-\u7ed3\u6784\u7684\u5b58\u50a8",children:"4. Set \u7ed3\u6784\u7684\u5b58\u50a8"}),"\n",(0,a.jsx)(t.p,{children:"blackwidow \u4e2d\u7684 set \u7531\u4e24\u90e8\u5206\u6784\u6210\uff0c\u5143\u6570\u636e(meta_key, meta_value), \u548c\u666e\u901a\u6570\u636e(data_key, data_value), \u5143\u6570\u636e\u4e2d\u5b58\u50a8\u7684\u4e3b\u8981\u662f set \u96c6\u5408\u7684\u4e00\u4e9b\u4fe1\u606f\uff0c \u6bd4\u5982\u8bf4\u5f53\u524d set \u96c6\u5408 member \u7684\u6570\u91cf\u4ee5\u53ca\u5f53\u524d set \u96c6\u5408\u7684\u7248\u672c\u53f7\u548c\u8fc7\u671f\u65f6\u95f4(\u7528\u505a\u79d2\u5220\u529f\u80fd), \u666e\u901a\u6570\u636e\u5b9e\u9645\u4e0a\u5c31\u662f\u6307\u7684 set \u96c6\u5408\u4e2d\u7684 member\uff0c\u4f5c\u4e3a\u5177\u4f53\u6700\u540e Rocksdb \u843d\u76d8\u7684 kv \u683c\u5f0f\uff0c\u4e0b\u9762\u662f\u5177\u4f53\u7684\u5b9e\u73b0\u65b9\u5f0f\uff1a"}),"\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsxs)(t.li,{children:["\u6bcf\u4e2a set \u96c6\u5408\u7684 meta_key \u548c meta_value \u7684\u843d\u76d8\u65b9\u5f0f: ",(0,a.jsx)(t.img,{src:"https://camo.githubusercontent.com/2ba8bc8d101143aa1df9e148de7914718dee68ae5aad709dfd145014432fc9fe/68747470733a2f2f692e696d6775722e636f6d2f6251655676536a2e706e67",alt:""})]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"meta_key \u5b9e\u9645\u4e0a\u5c31\u662f set \u96c6\u5408\u7684 key, \u800c meta_value \u7531\u4e09\u4e2a\u90e8\u5206\u6784\u6210: 4Bytes \u7684 Set size(\u7528\u4e8e\u5b58\u50a8\u5f53\u524d Set \u96c6\u5408\u7684\u5927\u5c0f) + 4Bytes \u7684 Version(\u7528\u4e8e\u79d2\u5220\u529f\u80fd) + 4Bytes \u7684 Timestamp(\u7528\u4e8e\u8bb0\u5f55\u6211\u4eec\u7ed9\u8fd9\u4e2a set \u96c6\u5408\u8bbe\u7f6e\u7684\u8d85\u65f6\u65f6\u95f4\u7684\u65f6\u95f4\u6233\uff0c \u9ed8\u8ba4\u4e3a 0)"}),"\n",(0,a.jsxs)(t.ol,{start:"2",children:["\n",(0,a.jsxs)(t.li,{children:["set \u96c6\u5408\u4e2d data_key \u548c data_value \u7684\u843d\u76d8\u65b9\u5f0f: ",(0,a.jsx)(t.img,{src:"https://camo.githubusercontent.com/f51fea5da2f158cb3307736964e651b9ce346fa93ea43abaafe5568d92f64b80/68747470733a2f2f692e696d6775722e636f6d2f6432637471506f2e706e67",alt:""})]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"data_key \u7531\u56db\u4e2a\u90e8\u5206\u6784\u6210: 4Bytes \u7684 Key size(\u7528\u4e8e\u8bb0\u5f55\u540e\u9762\u8ffd\u52a0\u7684 key \u7684\u957f\u5ea6\uff0c\u4fbf\u4e0e\u89e3\u6790) + key \u7684\u5185\u5bb9 + 4Bytes \u7684 Version + member \u7684\u5185\u5bb9\uff0c \u7531\u4e8e set \u96c6\u5408\u53ea\u9700\u8981\u5b58\u50a8 member, \u6240\u4ee5 data_value \u5b9e\u9645\u4e0a\u5c31\u662f\u7a7a\u4e32"}),"\n",(0,a.jsx)(t.h2,{id:"5-zset-\u7ed3\u6784\u7684\u5b58\u50a8",children:"5. ZSet \u7ed3\u6784\u7684\u5b58\u50a8"}),"\n",(0,a.jsx)(t.p,{children:"blackwidow \u4e2d\u7684 zset \u7531\u4e24\u90e8\u90e8\u5206\u6784\u6210\uff0c\u5143\u6570\u636e(meta_key, meta_value), \u548c\u666e\u901a\u6570\u636e(data_key, data_value), \u5143\u6570\u636e\u4e2d\u5b58\u50a8\u7684\u4e3b\u8981\u662f zset \u96c6\u5408\u7684\u4e00\u4e9b\u4fe1\u606f\uff0c \u6bd4\u5982\u8bf4\u5f53\u524d zset \u96c6\u5408 member \u7684\u6570\u91cf\u4ee5\u53ca\u5f53\u524d zset \u96c6\u5408\u7684\u7248\u672c\u53f7\u548c\u8fc7\u671f\u65f6\u95f4(\u7528\u505a\u79d2\u5220\u529f\u80fd), \u800c\u666e\u901a\u6570\u636e\u5c31\u662f\u6307\u7684 zset \u4e2d\u6bcf\u4e2a member \u4ee5\u53ca\u5bf9\u5e94\u7684 score, \u7531\u4e8e zset \u8fd9\u79cd\u6570\u636e\u7ed3\u6784\u6bd4\u8f83\u7279\u6b8a\uff0c\u9700\u8981\u6309\u7167 memer \u8fdb\u884c\u6392\u5e8f\uff0c\u4e5f\u9700\u8981\u6309\u7167 score \u8fdb\u884c\u6392\u5e8f\uff0c \u6240\u4ee5\u6211\u4eec\u5bf9\u4e8e\u6bcf\u4e00\u4e2a zset \u6211\u4eec\u4f1a\u6309\u7167\u4e0d\u540c\u7684\u683c\u5f0f\u5b58\u50a8\u4e24\u4efd\u666e\u901a\u6570\u636e, \u5728\u8fd9\u91cc\u6211\u4eec\u79f0\u4e3a member to score \u548c score to member\uff0c\u4f5c\u4e3a\u5177\u4f53\u6700\u540e Rocksdb \u843d\u76d8\u7684 kv \u683c\u5f0f\uff0c\u4e0b\u9762\u662f\u5177\u4f53\u7684\u5b9e\u73b0\u65b9\u5f0f\uff1a"}),"\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsxs)(t.li,{children:["\u6bcf\u4e2a zset \u96c6\u5408\u7684 meta_key \u548c meta_value \u7684\u843d\u76d8\u65b9\u5f0f: ",(0,a.jsx)(t.img,{src:"https://camo.githubusercontent.com/ef672f1a699febc2c0a941b4b1044e52e88829a491e66770b9e04d44b1da01d6/68747470733a2f2f692e696d6775722e636f6d2f52685a384b4d772e706e67",alt:""})]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"meta_key \u5b9e\u9645\u4e0a\u5c31\u662f zset \u96c6\u5408\u7684 key, \u800c meta_value \u7531\u4e09\u4e2a\u90e8\u5206\u6784\u6210: 4Bytes \u7684 ZSet size(\u7528\u4e8e\u5b58\u50a8\u5f53\u524d zSet \u96c6\u5408\u7684\u5927\u5c0f) + 4Bytes \u7684 Version(\u7528\u4e8e\u79d2\u5220\u529f\u80fd) + 4Bytes \u7684 Timestamp(\u7528\u4e8e\u8bb0\u5f55\u6211\u4eec\u7ed9\u8fd9\u4e2a Zset \u96c6\u5408\u8bbe\u7f6e\u7684\u8d85\u65f6\u65f6\u95f4\u7684\u65f6\u95f4\u6233\uff0c \u9ed8\u8ba4\u4e3a 0)"}),"\n",(0,a.jsxs)(t.ol,{start:"2",children:["\n",(0,a.jsxs)(t.li,{children:["\u6bcf\u4e2a zset \u96c6\u5408\u7684 data_key \u548c data_value \u7684\u843d\u76d8\u65b9\u5f0f(member to score): ",(0,a.jsx)(t.img,{src:"https://camo.githubusercontent.com/72f31e9af4e24f9cc224eec299904e514543a28360f6632b86ee48303cdea1f0/68747470733a2f2f692e696d6775722e636f6d2f4338354261355a2e706e67",alt:""})]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"member to socre \u7684 data_key \u7531\u56db\u4e2a\u90e8\u5206\u6784\u6210\uff1a4Bytes \u7684 Key size(\u7528\u4e8e\u8bb0\u5f55\u540e\u9762\u8ffd\u52a0\u7684 key \u7684\u957f\u5ea6\uff0c\u4fbf\u4e0e\u89e3\u6790) + key \u7684\u5185\u5bb9 + 4Bytes \u7684 Version + member \u7684\u5185\u5bb9\uff0c data_value \u4e2d\u5b58\u50a8\u7684\u5176 member \u5bf9\u5e94\u7684 score \u7684\u503c\uff0c\u5927\u5c0f\u4e3a 8 \u4e2a\u5b57\u8282\uff0c\u7531\u4e8e rocksdb \u9ed8\u8ba4\u662f\u6309\u7167\u5b57\u5178\u5e8f\u8fdb\u884c\u6392\u5217\u7684\uff0c\u6240\u4ee5\u540c\u4e00\u4e2a zset \u4e2d\u4e0d\u540c\u7684 member \u5c31\u662f\u6309\u7167 member \u7684\u5b57\u5178\u5e8f\u6765\u6392\u5217\u7684(\u540c\u4e00\u4e2a zset \u7684 key size, key, \u4ee5\u53ca version\uff0c\u4e5f\u5c31\u662f\u524d\u7f00\u90fd\u662f\u4e00\u81f4\u7684\uff0c\u4e0d\u540c\u7684\u53ea\u6709\u672b\u7aef\u7684 member)."}),"\n",(0,a.jsxs)(t.ol,{start:"3",children:["\n",(0,a.jsxs)(t.li,{children:["\u6bcf\u4e2a zset \u96c6\u5408\u7684 data_key \u548c data_value \u7684\u843d\u76d8\u65b9\u5f0f(score to member): ",(0,a.jsx)(t.img,{src:"https://camo.githubusercontent.com/e6722072aa2fc2043c9b0a4e40fcca103e7244dcb28a7f6f949459b7f1b01eec/68747470733a2f2f692e696d6775722e636f6d2f5156395848456b2e706e67",alt:""})]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"score to member \u7684 data_key \u7531\u4e94\u4e2a\u90e8\u5206\u6784\u6210\uff1a4Bytes \u7684 Key size(\u7528\u4e8e\u8bb0\u5f55\u540e\u9762\u8ffd\u52a0\u7684 key \u7684\u957f\u5ea6\uff0c\u4fbf\u4e0e\u89e3\u6790) + key \u7684\u5185\u5bb9 + 4Bytes \u7684 Version + 8Bytes \u7684 Score + member \u7684\u5185\u5bb9\uff0c \u7531\u4e8e score \u548c member \u90fd\u5df2\u7ecf\u653e\u5728 data_key \u4e2d\u8fdb\u884c\u5b58\u50a8\u4e86\u6240\u4ee5 data_value \u5c31\u662f\u4e00\u4e2a\u7a7a\u4e32\uff0c\u65e0\u9700\u5b58\u50a8\u5176\u4ed6\u5185\u5bb9\u4e86\uff0c\u5bf9\u4e8e score to member \u4e2d\u7684 data_key \u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u4e86 rocksdb \u7684 comparator\uff0c\u540c\u4e00\u4e2a zset \u4e2d score to member \u7684 data_key \u4f1a\u9996\u5148\u6309\u7167 score \u6765\u6392\u5e8f\uff0c \u5728 score \u76f8\u540c\u7684\u60c5\u51b5\u4e0b\u518d\u6309\u7167 member \u6765\u6392\u5e8f"}),"\n",(0,a.jsx)(t.h2,{id:"blackwidow-\u76f8\u5bf9\u4e8e-nemo-\u6709\u54ea\u4e9b\u4f18\u52bf",children:"Blackwidow \u76f8\u5bf9\u4e8e Nemo \u6709\u54ea\u4e9b\u4f18\u52bf"}),"\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsx)(t.li,{children:"Blackwidow \u91c7\u7528\u4e86 rocksdb \u7684 column families \u7684\u65b0\u7279\u6027\uff0c\u5c06\u5143\u6570\u636e\u548c\u5b9e\u9645\u6570\u636e\u5206\u5f00\u5b58\u653e(\u5bf9\u5e94\u4e8e\u4e0a\u9762\u7684 meta \u6570\u636e\u548c data \u6570\u636e), \u8fd9\u79cd\u5b58\u50a8\u65b9\u5f0f\u76f8\u5bf9\u4e8e Nemo \u5c06 meta, data \u6df7\u5728\u4e00\u8d77\u5b58\u653e\u66f4\u52a0\u5408\u7406\uff0c \u5e76\u4e14\u53ef\u4ee5\u63d0\u5347\u67e5\u627e\u6548\u7387(\u6bd4\u5982 info keyspace \u7684\u6548\u7387\u4f1a\u5927\u5927\u63d0\u5347)"}),"\n",(0,a.jsx)(t.li,{children:"Blackwidow \u4e2d\u53c2\u6570\u4f20\u9012\u5927\u91cf\u91c7\u7528 Slice \u800c Nemo \u4e2d\u91c7\u7528\u7684\u662f std::string, \u6240\u4ee5 Nemo \u4f1a\u6709\u5f88\u591a\u6ca1\u6709\u5fc5\u8981\u7684 string \u5bf9\u8c61\u7684\u6784\u9020\u51fd\u6570\u4ee5\u53ca\u6790\u6784\u51fd\u6570\u7684\u8c03\u7528\uff0c\u9020\u6210\u989d\u5916\u7684\u8d44\u6e90\u6d88\u8017\uff0c\u800c Blackwidow \u5219\u4e0d\u4f1a\u6709\u8fd9\u4e2a\u95ee\u9898"}),"\n",(0,a.jsx)(t.li,{children:"Blackwidow \u5bf9 kv \u6a21\u62df\u591a\u6570\u636e\u7ed3\u6784\u7684\u5b58\u50a8\u683c\u5f0f\u4e0a\u505a\u4e86\u91cd\u65b0\u8bbe\u8ba1(\u5177\u4f53\u53ef\u4ee5\u53c2\u8003 Nemo \u5f15\u64ce\u6570\u636e\u5b58\u50a8\u683c\u5f0f\u548c\u672c\u7bc7\u6587\u7ae0)\uff0c\u4f7f\u4e4b\u524d\u5728 Nemo \u4e0a\u51fa\u73b0\u7684\u4e00\u4e9b\u65e0\u6cd5\u89e3\u51b3\u7684\u6027\u80fd\u95ee\u9898\u5f97\u4ee5\u89e3\u51b3\uff0c\u6240\u4ee5 Blackwidow \u7684\u591a\u6570\u636e\u7ed3\u6784\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u6027\u80fd\u8fdc\u8fdc\u4f18\u4e8e Nemo"}),"\n",(0,a.jsx)(t.li,{children:"\u539f\u6765 Nemo \u5bf9\u591a\u6570\u636e\u7ed3\u6784\u7684 Key \u7684\u957f\u5ea6\u6700\u5927\u53ea\u80fd\u652f\u6301\u5230 256 Bytes\uff0c\u800c Blackwidow \u7ecf\u8fc7\u91cd\u65b0\u8bbe\u8ba1\uff0c\u653e\u5f00\u4e86\u591a\u6570\u636e\u7ed3\u6784 Key \u957f\u5ea6\u7684\u8fd9\u4e2a\u9650\u5236"}),"\n",(0,a.jsx)(t.li,{children:"Blackwidow \u76f8\u5bf9\u4e8e Nemo \u66f4\u52a0\u8282\u7701\u7a7a\u95f4\uff0cNemo \u7531\u4e8e\u9700\u8981 nemo-rocksdb \u7684\u652f\u6301\uff0c\u6240\u4ee5\u4e0d\u7ba1\u5728 meta \u8fd8\u662f data \u6570\u636e\u90e8\u5206\u90fd\u8ffd\u52a0\u4e86 version \u548c timestamp \u8fd9\u4e9b\u4fe1\u606f\uff0c\u5e76\u4e14\u4e3a\u4e86\u533a\u5206 meta_key \u548c data_key, \u5728\u6700\u524d\u9762\u52a0\u5165 s \u548c S(\u62ff Set \u6570\u636e\u7ed3\u6784\u6253\u6bd4\u65b9)\uff0cBlackwidow \u5728\u8fd9\u65b9\u9762\u505a\u4e86\u4f18\u5316\uff0c\u4f7f\u540c\u6837\u7684\u6570\u636e\u91cf\u4e0b Blackwidow \u6240\u5360\u7528\u7684\u7a7a\u95f4\u6bd4 Nemo \u8981\u5c0f(\u4e3e\u4e2a\u4f8b\u5b50\uff0cBlackwidow \u4e2d List \u7ed3\u6784\u4e2d\u7684\u4e00\u4e2a Node \u5c31\u6bd4 Nemo \u4e2d\u7684\u4e00\u4e2a Node \u8282\u7701\u4e86 16 Bytes \u7684\u7a7a\u95f4)"}),"\n",(0,a.jsx)(t.li,{children:"Blackwidow \u5728\u9501\u7684\u5b9e\u73b0\u4e0a\u53c2\u7167\u4e86 RocksDB \u4e8b\u52a1\u91cc\u9501\u7684\u5b9e\u73b0\u65b9\u6cd5\uff0c\u800c\u5f03\u7528\u4e86\u4e4b\u524d Nemo \u7684\u884c\u9501\uff0c\u6240\u4ee5\u5728\u591a\u7ebf\u7a0b\u5bf9\u540c\u4e00\u628a\u9501\u6709\u62a2\u5360\u7684\u60c5\u51b5\u4e0b\u6027\u80fd\u4f1a\u6709\u6240\u63d0\u5347"}),"\n"]})]})}function m(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(r,{...e})}):r(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>d,x:()=>n});var a=s(6540);const i={},c=a.createContext(i);function d(e){const t=a.useContext(c);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function n(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:d(e.components),a.createElement(c.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/aba21aa0.1ad3e19a.js b/build/assets/js/aba21aa0.1ad3e19a.js new file mode 100644 index 0000000..45bb2c4 --- /dev/null +++ b/build/assets/js/aba21aa0.1ad3e19a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[5742],{7093:i=>{i.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"default"}')}}]); \ No newline at end of file diff --git a/build/assets/js/acecf23e.0e0d3ee9.js b/build/assets/js/acecf23e.0e0d3ee9.js new file mode 100644 index 0000000..a722251 --- /dev/null +++ b/build/assets/js/acecf23e.0e0d3ee9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[4284],{1912:i=>{i.exports=JSON.parse('{"blogBasePath":"/blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/build/assets/js/adc1ab20.088767d8.js b/build/assets/js/adc1ab20.088767d8.js new file mode 100644 index 0000000..6b7de3f --- /dev/null +++ b/build/assets/js/adc1ab20.088767d8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[539],{1602:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>h,contentTitle:()=>r,default:()=>j,frontMatter:()=>t,metadata:()=>l,toc:()=>c});var d=s(4848),n=s(8453);const t={title:"3.2.x \u6027\u80fd",sidebar_position:0},r=void 0,l={id:"\u6027\u80fd\u4e0e\u4f18\u5316/3.2.x \u6027\u80fd/index",title:"3.2.x \u6027\u80fd",description:"Performance\uff1a",source:"@site/docs/\u6027\u80fd\u4e0e\u4f18\u5316/3.2.x \u6027\u80fd/index.md",sourceDirName:"\u6027\u80fd\u4e0e\u4f18\u5316/3.2.x \u6027\u80fd",slug:"/\u6027\u80fd\u4e0e\u4f18\u5316/3.2.x \u6027\u80fd/",permalink:"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/3.2.x \u6027\u80fd/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u6027\u80fd\u4e0e\u4f18\u5316/3.2.x \u6027\u80fd/index.md",tags:[],version:"current",sidebarPosition:0,frontMatter:{title:"3.2.x \u6027\u80fd",sidebar_position:0},sidebar:"tutorialSidebar",previous:{title:"\u6027\u80fd\u4e0e\u4f18\u5316",permalink:"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/"},next:{title:"Pika \u5185\u5b58\u4f7f\u7528",permalink:"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u5185\u5b58\u4f7f\u7528/"}},h={},c=[{value:"Performance\uff1a",id:"performance",level:2},{value:"0. Env",id:"0-env",level:3},{value:"1. Single Db",id:"1-single-db",level:3},{value:"1.1 Write binlog with one slave",id:"11-write-binlog-with-one-slave",level:4},{value:"1.2 No binlog No slave",id:"12-no-binlog-no-slave",level:4},{value:"1.3 Benchmark Result",id:"13-benchmark-result",level:4},{value:"1.4 Compare Wiht Redis",id:"14-compare-wiht-redis",level:4},{value:"2. Cluster (Codis)",id:"2-cluster-codis",level:3},{value:"2.1 Topology:",id:"21-topology",level:4},{value:"2.2 WithBinlog&Slave",id:"22-withbinlogslave",level:4},{value:"2.3 NoBinlog&Slave",id:"23-nobinlogslave",level:4},{value:"2.4 Get Command",id:"24-get-command",level:4}];function x(e){const i={code:"code",h2:"h2",h3:"h3",h4:"h4",img:"img",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,n.R)(),...e.components};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(i.h2,{id:"performance",children:"Performance\uff1a"}),"\n",(0,d.jsx)(i.h3,{id:"0-env",children:"0. Env"}),"\n",(0,d.jsx)(i.p,{children:"Disk: 2T NVME"}),"\n",(0,d.jsx)(i.p,{children:"CPU: Intel(R) Xeon(R) CPU E5-2630 v4 @ 2.20GHz * 40"}),"\n",(0,d.jsx)(i.p,{children:"Memory: 256G"}),"\n",(0,d.jsx)(i.p,{children:"Network Card: 10-Gigabit"}),"\n",(0,d.jsx)(i.p,{children:"OS\uff1a CentOS Linux release 7.4"}),"\n",(0,d.jsx)(i.h3,{id:"1-single-db",children:"1. Single Db"}),"\n",(0,d.jsx)(i.h4,{id:"11-write-binlog-with-one-slave",children:"1.1 Write binlog with one slave"}),"\n",(0,d.jsx)(i.p,{children:"data size: 64bytes"}),"\n",(0,d.jsx)(i.p,{children:"key num: 1,000,000"}),"\n",(0,d.jsxs)(i.table,{children:[(0,d.jsx)(i.thead,{children:(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.th,{children:"TEST"}),(0,d.jsx)(i.th,{children:"QPS"})]})}),(0,d.jsxs)(i.tbody,{children:[(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.td,{children:"set"}),(0,d.jsx)(i.td,{children:"124347"})]}),(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.td,{children:"get"}),(0,d.jsx)(i.td,{children:"283849"})]})]})]}),"\n",(0,d.jsx)(i.h4,{id:"12-no-binlog-no-slave",children:"1.2 No binlog No slave"}),"\n",(0,d.jsx)(i.p,{children:(0,d.jsx)(i.img,{src:"https://whoiami.github.io/public/images/images/singleDb.png",alt:"singleDb"})}),"\n",(0,d.jsx)(i.h4,{id:"13-benchmark-result",children:"1.3 Benchmark Result"}),"\n",(0,d.jsxs)(i.table,{children:[(0,d.jsx)(i.thead,{children:(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.th,{}),(0,d.jsx)(i.th,{children:"WithBinlog&Slave QPS"}),(0,d.jsx)(i.th,{children:"NoBinlog&Slave QPS"})]})}),(0,d.jsxs)(i.tbody,{children:[(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.td,{children:"PING_INLINE"}),(0,d.jsx)(i.td,{children:"262329"}),(0,d.jsx)(i.td,{children:"272479"})]}),(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.td,{children:"PING_BULK"}),(0,d.jsx)(i.td,{children:"262467"}),(0,d.jsx)(i.td,{children:"270562"})]}),(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.td,{children:"SET"}),(0,d.jsx)(i.td,{children:"124953"}),(0,d.jsx)(i.td,{children:"211327"})]}),(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.td,{children:"GET"}),(0,d.jsx)(i.td,{children:"284900"}),(0,d.jsx)(i.td,{children:"292568"})]}),(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.td,{children:"INCR"}),(0,d.jsx)(i.td,{children:"120004"}),(0,d.jsx)(i.td,{children:"213766"})]}),(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.td,{children:"MSET (10 keys)"}),(0,d.jsx)(i.td,{children:"64863"}),(0,d.jsx)(i.td,{children:"111578"})]}),(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.td,{children:"MGET (10 keys)"}),(0,d.jsx)(i.td,{children:"224416"}),(0,d.jsx)(i.td,{children:"223513"})]}),(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.td,{children:"MGET (100 keys)"}),(0,d.jsx)(i.td,{children:"29935"}),(0,d.jsx)(i.td,{children:"29550"})]}),(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.td,{children:"MGET (200 keys)"}),(0,d.jsx)(i.td,{children:"15128"}),(0,d.jsx)(i.td,{children:"14912"})]}),(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.td,{children:"LPUSH"}),(0,d.jsx)(i.td,{children:"117799"}),(0,d.jsx)(i.td,{children:"205380"})]}),(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.td,{children:"RPUSH"}),(0,d.jsx)(i.td,{children:"117481"}),(0,d.jsx)(i.td,{children:"205212"})]}),(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.td,{children:"LPOP"}),(0,d.jsx)(i.td,{children:"112120"}),(0,d.jsx)(i.td,{children:"200320"})]}),(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.td,{children:"RPOP"}),(0,d.jsx)(i.td,{children:"119932"}),(0,d.jsx)(i.td,{children:"207986"})]}),(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.td,{children:"LRANGE_10 (first 10 elements)"}),(0,d.jsx)(i.td,{children:"277932"}),(0,d.jsx)(i.td,{children:"284414"})]}),(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.td,{children:"LRANGE_100 (first 100 elements)"}),(0,d.jsx)(i.td,{children:"165118"}),(0,d.jsx)(i.td,{children:"164355"})]}),(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.td,{children:"LRANGE_300 (first 300 elements)"}),(0,d.jsx)(i.td,{children:"54907"}),(0,d.jsx)(i.td,{children:"55096"})]}),(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.td,{children:"LRANGE_450 (first 450 elements)"}),(0,d.jsx)(i.td,{children:"36656"}),(0,d.jsx)(i.td,{children:"36630"})]}),(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.td,{children:"LRANGE_600 (first 600 elements)"}),(0,d.jsx)(i.td,{children:"27540"}),(0,d.jsx)(i.td,{children:"27510"})]}),(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.td,{children:"SADD"}),(0,d.jsx)(i.td,{children:"126230"}),(0,d.jsx)(i.td,{children:"208768"})]}),(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.td,{children:"SPOP"}),(0,d.jsx)(i.td,{children:"103135"}),(0,d.jsx)(i.td,{children:"166555"})]}),(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.td,{children:"HSET"}),(0,d.jsx)(i.td,{children:"122443"}),(0,d.jsx)(i.td,{children:"214362"})]}),(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.td,{children:"HINCRBY"}),(0,d.jsx)(i.td,{children:"114757"}),(0,d.jsx)(i.td,{children:"208942"})]}),(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.td,{children:"HINCRBYFLOAT"}),(0,d.jsx)(i.td,{children:"114377"}),(0,d.jsx)(i.td,{children:"208550"})]}),(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.td,{children:"HGET"}),(0,d.jsx)(i.td,{children:"284900"}),(0,d.jsx)(i.td,{children:"290951"})]}),(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.td,{children:"HMSET (10 fields)"}),(0,d.jsx)(i.td,{children:"58937"}),(0,d.jsx)(i.td,{children:"111445"})]}),(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.td,{children:"HMGET (10 fields)"}),(0,d.jsx)(i.td,{children:"203624"}),(0,d.jsx)(i.td,{children:"205592"})]}),(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.td,{children:"HGETALL"}),(0,d.jsx)(i.td,{children:"166861"}),(0,d.jsx)(i.td,{children:"160797"})]}),(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.td,{children:"ZADD"}),(0,d.jsx)(i.td,{children:"106780"}),(0,d.jsx)(i.td,{children:"189178"})]}),(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.td,{children:"ZREM"}),(0,d.jsx)(i.td,{children:"112866"}),(0,d.jsx)(i.td,{children:"201938"})]}),(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.td,{children:"PFADD"}),(0,d.jsx)(i.td,{children:"4708"}),(0,d.jsx)(i.td,{children:"4692"})]}),(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.td,{children:"PFCOUNT"}),(0,d.jsx)(i.td,{children:"27412"}),(0,d.jsx)(i.td,{children:"27345"})]}),(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.td,{children:"PFMERGE"}),(0,d.jsx)(i.td,{children:"478"}),(0,d.jsx)(i.td,{children:"494"})]})]})]}),"\n",(0,d.jsx)(i.h4,{id:"14-compare-wiht-redis",children:"1.4 Compare Wiht Redis"}),"\n",(0,d.jsxs)(i.p,{children:["With Redis AOF configuration ",(0,d.jsx)(i.code,{children:"appendfsync everysec"}),", redis basically write data into memeory. However, pika uses rocksdb, which writes WAL on ssd druing every write batch. That comparation becomes multiple threads sequential write into ssd and one thread write into memory."]}),"\n",(0,d.jsx)(i.p,{children:"Put the fairness or unfairness aside. Here is the performance."}),"\n",(0,d.jsx)(i.p,{children:(0,d.jsx)(i.img,{src:"https://whoiami.github.io/public/images/images/CompareWithRedis.png",alt:""})}),"\n",(0,d.jsx)(i.h3,{id:"2-cluster-codis",children:"2. Cluster (Codis)"}),"\n",(0,d.jsx)(i.h4,{id:"21-topology",children:"2.1 Topology:"}),"\n",(0,d.jsx)(i.p,{children:"WithBInlog&Slave"}),"\n",(0,d.jsx)(i.p,{children:"4 machine * 2 pika instance (Master)"}),"\n",(0,d.jsx)(i.p,{children:"4 machine * 2 pika instance (Slave)"}),"\n",(0,d.jsx)(i.p,{children:"NoBinlog&Slave"}),"\n",(0,d.jsx)(i.p,{children:"4 machine * 2 pika instance (Master)"}),"\n",(0,d.jsx)(i.p,{children:"Slots Distribution:"}),"\n",(0,d.jsx)(i.p,{children:(0,d.jsx)(i.img,{src:"https://whoiami.github.io/public/images/images/new_topo.png",alt:""})}),"\n",(0,d.jsx)(i.h4,{id:"22-withbinlogslave",children:"2.2 WithBinlog&Slave"}),"\n",(0,d.jsx)(i.p,{children:(0,d.jsx)(i.img,{src:"https://whoiami.github.io/public/images/images/new_withbinlogslave.png",alt:"Set"})}),"\n",(0,d.jsxs)(i.table,{children:[(0,d.jsx)(i.thead,{children:(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.th,{children:"Command"}),(0,d.jsx)(i.th,{children:"QPS"})]})}),(0,d.jsx)(i.tbody,{children:(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.td,{children:"Set"}),(0,d.jsx)(i.td,{children:"1,400,000+"})]})})]}),"\n",(0,d.jsx)(i.h4,{id:"23-nobinlogslave",children:"2.3 NoBinlog&Slave"}),"\n",(0,d.jsx)(i.p,{children:(0,d.jsx)(i.img,{src:"https://whoiami.github.io/public/images/images/new_nobinlog.png",alt:""})}),"\n",(0,d.jsxs)(i.table,{children:[(0,d.jsx)(i.thead,{children:(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.th,{children:"Command"}),(0,d.jsx)(i.th,{children:"QPS"})]})}),(0,d.jsx)(i.tbody,{children:(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.td,{children:"Set"}),(0,d.jsx)(i.td,{children:"1,600,000+"})]})})]}),"\n",(0,d.jsx)(i.h4,{id:"24-get-command",children:"2.4 Get Command"}),"\n",(0,d.jsx)(i.p,{children:(0,d.jsx)(i.img,{src:"https://whoiami.github.io/public/images/images/new_get.png",alt:""})}),"\n",(0,d.jsxs)(i.table,{children:[(0,d.jsx)(i.thead,{children:(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.th,{children:"Command"}),(0,d.jsx)(i.th,{children:"QPS"})]})}),(0,d.jsx)(i.tbody,{children:(0,d.jsxs)(i.tr,{children:[(0,d.jsx)(i.td,{children:"Get"}),(0,d.jsx)(i.td,{children:"2,300,000+"})]})})]}),"\n",(0,d.jsx)(i.p,{children:"With or without binlog, for Get command, QPS is approximately the same."})]})}function j(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,d.jsx)(i,{...e,children:(0,d.jsx)(x,{...e})}):x(e)}},8453:(e,i,s)=>{s.d(i,{R:()=>r,x:()=>l});var d=s(6540);const n={},t=d.createContext(n);function r(e){const i=d.useContext(t);return d.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function l(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),d.createElement(t.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/ae7197e3.0752e912.js b/build/assets/js/ae7197e3.0752e912.js new file mode 100644 index 0000000..2dc9a7e --- /dev/null +++ b/build/assets/js/ae7197e3.0752e912.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[3365],{7229:(e,d,s)=>{s.r(d),s.d(d,{assets:()=>c,contentTitle:()=>r,default:()=>x,frontMatter:()=>l,metadata:()=>n,toc:()=>h});var i=s(4848),t=s(8453);const l={title:"\u5dee\u5f02\u5316\u547d\u4ee4",sidebar_position:50},r=void 0,n={id:"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5dee\u5f02\u5316\u547d\u4ee4/index",title:"\u5dee\u5f02\u5316\u547d\u4ee4",description:"config [get | set | rewrite]",source:"@site/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5dee\u5f02\u5316\u547d\u4ee4/index.md",sourceDirName:"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5dee\u5f02\u5316\u547d\u4ee4",slug:"/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5dee\u5f02\u5316\u547d\u4ee4/",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5dee\u5f02\u5316\u547d\u4ee4/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5dee\u5f02\u5316\u547d\u4ee4/index.md",tags:[],version:"current",sidebarPosition:50,frontMatter:{title:"\u5dee\u5f02\u5316\u547d\u4ee4",sidebar_position:50},sidebar:"tutorialSidebar",previous:{title:"\u7ba1\u7406\u6307\u4ee4",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u7ba1\u7406\u6307\u4ee4/"},next:{title:"\u8ba2\u9605",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u8ba2\u9605/"}},c={},h=[{value:"config [get | set | rewrite]",id:"config-get--set--rewrite",level:4},{value:"purgelogsto [write2file-name]",id:"purgelogsto-write2file-name",level:3},{value:"client list",id:"client-list",level:3},{value:"client list order by [addr|idle]",id:"client-list-order-by-addridle",level:3},{value:"client kill all",id:"client-kill-all",level:3},{value:"\u6162\u65e5\u5fd7(slowlog)",id:"\u6162\u65e5\u5fd7slowlog",level:3},{value:"bgsave",id:"bgsave",level:3},{value:"dumpoff",id:"dumpoff",level:3},{value:"delbackup",id:"delbackup",level:3},{value:"compact",id:"compact",level:3},{value:"compact [string | hash | set | zset | list ]",id:"compact-string--hash--set--zset--list-",level:3},{value:"compact $db [string | hash | set | zset | list ]",id:"compact-db-string--hash--set--zset--list-",level:3},{value:"flushdb [string | hash | set | zset | list ]",id:"flushdb-string--hash--set--zset--list-",level:3},{value:"keys pattern [string | hash | set | zset | list ]",id:"keys-pattern-string--hash--set--zset--list-",level:3},{value:"slaveof ip port [write2file-name] [write2file-pos] [force]",id:"slaveof-ip-port-write2file-name-write2file-pos-force",level:3},{value:"sort",id:"sort",level:3},{value:"dbslaveof db[0 ~ 7] filenum offset",id:"dbslaveof-db0--7-filenum-offset",level:3},{value:"pkscanrange type key_start key_end [MATCH pattern] [LIMIT limit]",id:"pkscanrange-type-key_start-key_end-match-pattern-limit-limit",level:3},{value:"pkrscanrange type key_start key_end [MATCH pattern] [LIMIT limit]",id:"pkrscanrange-type-key_start-key_end-match-pattern-limit-limit",level:3},{value:"pkhscanrange key field_start field_end [MATCH pattern] [LIMIT limit]",id:"pkhscanrange-key-field_start-field_end--match-pattern-limit-limit",level:3},{value:"pkhrscanrange key field_start field_end [MATCH pattern] [LIMIT limit]",id:"pkhrscanrange-key-field_start-field_end--match-pattern-limit-limit",level:3},{value:"diskrecovery",id:"diskrecovery",level:3},{value:"clearreplicationid",id:"clearreplicationid",level:3},{value:"DisableWal",id:"disablewal",level:3}];function a(e){const d={code:"code",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(d.h4,{id:"config-get--set--rewrite",children:"config [get | set | rewrite]"}),"\n",(0,i.jsx)(d.p,{children:"\u5728\u670d\u52a1\u5668\u914d\u7f6e\u4e2d\uff0c\u652f\u6301\u53c2\u6570\u7684get\u3001set\u3001rewrite\uff0c\u652f\u6301\u7684\u53c2\u6570\u5982\u4e0b\uff1a"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"-"}),(0,i.jsx)(d.th,{children:"GET"}),(0,i.jsx)(d.th,{children:"SET"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"binlog-file-size"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"x"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"compact-cron"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"o"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"compact-interval"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"o"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"compression"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"x"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"daemonize"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"x"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"db-path"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"x"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"db-sync-path"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"x"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"db-sync-speed"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"x"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"double-master-ip"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"o"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"double-master-port"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"x"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"double-master-sid"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"x"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"dump-expire"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"o"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"dump-path"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"x"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"dump-prefix"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"o"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"expire-logs-days"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"o"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"expire-logs-nums"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"o"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"identify-binlog-type"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"o"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"loglevel"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"o"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"log-path"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"x"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"masterauth"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"o"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"max-background-compactions"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"x"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"max-background-flushes"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"x"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"max-bytes-for-level-multiplier"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"x"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"max-cache-files"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"x"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"maxclients"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"o"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"maxmemory"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"x"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"network-interface"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"x"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"pidfile"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"x"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"port"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"x"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"requirepass"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"o"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"root-connection-num"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"o"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"slaveof"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"x"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"slave-priority"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"o"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"slave-read-only"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"o"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"slotmigrate"}),(0,i.jsx)(d.td,{children:"o (\u5c0f\u4e8e 3.0.0)"}),(0,i.jsx)(d.td,{children:"o (\u5c0f\u4e8e 3.0.0)"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"slowlog-log-slower-than"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"o"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"slowlog-write-errorlog"}),(0,i.jsx)(d.td,{children:"o (\u5c0f\u4e8e 3.0.2)"}),(0,i.jsx)(d.td,{children:"o(\u5c0f\u4e8e3.0.2)"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"sync-buffer-size"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"x"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"sync-thread-num"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"x"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"target-file-size-base"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"x"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"thread-num"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"x"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"timeout"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"o"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"userblacklist"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"o"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"userpass"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"o"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"write-buffer-size"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"x"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"max-cache-statistic-keys"}),(0,i.jsx)(d.td,{children:"o(\u5c0f\u4e8e3.0.6)"}),(0,i.jsx)(d.td,{children:"o(\u5c0f\u4e8e3.0.6)"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"small-compaction-threshold"}),(0,i.jsx)(d.td,{children:"o(\u5c0f\u4e8e3.0.6)"}),(0,i.jsx)(d.td,{children:"o(\u5c0f\u4e8e3.0.6)"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"databases"}),(0,i.jsx)(d.td,{children:"o(\u5c0f\u4e8e3.1.0)"}),(0,i.jsx)(d.td,{children:"x"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"write-binlog"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"o"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"thread-pool-size"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"x"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"slowlog-max-len"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"o"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"share-block-cache"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"x"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"optimize-filters-for-hits"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"x"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"level-compaction-dynamic-level-bytes"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"x"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"cache-index-and-filter-blocks"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"x"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"block-size"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"x"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"block-cache"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"x"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"sync-window-size"}),(0,i.jsx)(d.td,{children:"o"}),(0,i.jsx)(d.td,{children:"o"})]})]})]}),"\n",(0,i.jsx)(d.h3,{id:"purgelogsto-write2file-name",children:"purgelogsto [write2file-name]"}),"\n",(0,i.jsx)(d.p,{children:"purgelogsto\u4e3apika\u539f\u521b\u547d\u4ee4, \u529f\u80fd\u4e3a\u624b\u52a8\u6e05\u7406\u65e5\u5fd7, \u7c7b\u4f3cmysql\u7684purge master logs to\u547d\u4ee4, \u8be5\u547d\u4ee4\u6709\u591a\u91cd\u68c0\u6d4b\u673a\u5236\u4ee5\u786e\u4fdd\u65e5\u5fd7\u4e00\u5b9a\u4e3a\u5b89\u5168\u6e05\u7406"}),"\n",(0,i.jsx)(d.h3,{id:"client-list",children:"client list"}),"\n",(0,i.jsx)(d.p,{children:"\u4e0eredis\u76f8\u6bd4, \u5c55\u793a\u7684\u4fe1\u606f\u5c11\u4e8eredis"}),"\n",(0,i.jsx)(d.h3,{id:"client-list-order-by-addridle",children:"client list order by [addr|idle]"}),"\n",(0,i.jsx)(d.p,{children:"pika\u539f\u521b\u547d\u4ee4\uff0c\u529f\u80fd\u4e3a\u6309\u7167ip address \u6216\u8005 connection idle\u65f6\u95f4\u6392\u5e8f"}),"\n",(0,i.jsx)(d.h3,{id:"client-kill-all",children:"client kill all"}),"\n",(0,i.jsx)(d.p,{children:"pika\u539f\u521b\u547d\u4ee4, \u529f\u80fd\u4e3a\u6740\u6b7b\u5f53\u524d\u6240\u6709\u94fe\u63a5\uff08\u4e0d\u5305\u62ec\u540c\u6b65\u8fdb\u7a0b\u4f46\u5305\u542b\u81ea\u5df1\uff09"}),"\n",(0,i.jsx)(d.h3,{id:"\u6162\u65e5\u5fd7slowlog",children:"\u6162\u65e5\u5fd7(slowlog)"}),"\n",(0,i.jsx)(d.p,{children:"\u4e0eredis\u4e0d\u540c, pika\u7684\u6162\u65e5\u5fd7\u4e0d\u4ec5\u5b58\u653e\u5185\u5b58\u4e2d\u5141\u8bb8\u901a\u8fc7slow log\u547d\u4ee4\u67e5\u770b\uff0c\u540c\u65f6\u4e5f\u5141\u8bb8\u5b58\u653e\u5728error log\u4e2d\u5e76\u65e0\u6761\u6570\u9650\u5236\u65b9\u4fbf\u63a5\u5206\u6790\uff0c\u4f46\u9700\u8981\u6253\u5f00slowlog-write-errorlog\u53c2\u6570"}),"\n",(0,i.jsx)(d.h3,{id:"bgsave",children:"bgsave"}),"\n",(0,i.jsx)(d.p,{children:"\u7c7b\u4f3credis\u7684bgsave, \u5148\u751f\u6210\u4e00\u4e2a\u5feb\u7167, \u7136\u540e\u518d\u5c06\u5feb\u7167\u6570\u636e\u8fdb\u884c\u5907\u4efd, \u5907\u4efd\u6587\u4ef6\u5b58\u653e\u5728dump\u76ee\u5f55\u4e0b"}),"\n",(0,i.jsx)(d.h3,{id:"dumpoff",children:"dumpoff"}),"\n",(0,i.jsx)(d.p,{children:"\u5f3a\u884c\u7ec8\u6b62\u6b63\u5728\u6267\u884c\u7684dump\u8fdb\u7a0b(bgsave), \u6267\u884c\u8be5\u547d\u4ee4\u540e\u5907\u4efd\u4f1a\u7acb\u5373\u505c\u6b62\u7136\u540e\u5728dump\u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2adump-failed\u6587\u4ef6\u5939(Deprecated from v2.0)"}),"\n",(0,i.jsx)(d.h3,{id:"delbackup",children:"delbackup"}),"\n",(0,i.jsx)(d.p,{children:"\u5220\u9664dump\u76ee\u5f55\u4e0b\u9664\u6b63\u5728\u4f7f\u7528\uff08\u5168\u540c\u6b65\u4e2d\uff09\u7684db\u5feb\u7167\u5916\u7684\u5176\u4ed6\u5feb\u7167"}),"\n",(0,i.jsx)(d.h3,{id:"compact",children:"compact"}),"\n",(0,i.jsx)(d.p,{children:"\u7acb\u5373\u89e6\u53d1\u5f15\u64ce\u5c42(rocksdb)\u6240\u6709\u6570\u636e\u7ed3\u6784\u6267\u884c\u5168\u91cfcompact\u64cd\u4f5c, \u5168\u91cfcompact\u80fd\u591f\u901a\u8fc7sst\u6587\u4ef6\u7684\u5408\u5e76\u6d88\u9664\u5df2\u5220\u9664\u6216\u8fc7\u671f\u4f46\u672a\u5373\u65f6\u6e05\u7406\u7684\u6570\u636e, \u80fd\u591f\u5728\u4e00\u5b9a\u7a0b\u5ea6\u4e0a\u964d\u4f4e\u6570\u636e\u4f53\u79ef, \u9700\u8981\u6ce8\u610f\u7684\u662f, \u5168\u91cfcompact\u4f1a\u6d88\u8017\u4e00\u5b9aio\u8d44\u6e90"}),"\n",(0,i.jsx)(d.h3,{id:"compact-string--hash--set--zset--list-",children:"compact [string | hash | set | zset | list ]"}),"\n",(0,i.jsx)(d.p,{children:"\u7acb\u5373\u89e6\u53d1\u5f15\u64ce\u5c42(rocksdb)\u5bf9\u6307\u5b9a\u6570\u636e\u7ed3\u6784\u6267\u884c\u5168\u91cfcompact\u64cd\u4f5c, \u6307\u5b9a\u6570\u636e\u7ed3\u6784\u7684\u5168\u91cfcompact\u80fd\u591f\u901a\u8fc7sst\u6587\u4ef6\u7684\u5408\u5e76\u6d88\u9664\u5df2\u5220\u9664\u6216\u8fc7\u671f\u4f46\u672a\u5373\u65f6\u6e05\u7406\u7684\u6570\u636e, \u80fd\u591f\u5728\u4e00\u5b9a\u7a0b\u5ea6\u4e0a\u964d\u4f4e\u8be5\u7ed3\u6784\u6570\u636e\u7684\u6570\u636e\u4f53\u79ef, \u9700\u8981\u6ce8\u610f\u7684\u662f, \u5168\u91cfcompact\u4f1a\u6d88\u8017\u4e00\u5b9aio\u8d44\u6e90"}),"\n",(0,i.jsx)(d.h3,{id:"compact-db-string--hash--set--zset--list-",children:"compact $db [string | hash | set | zset | list ]"}),"\n",(0,i.jsx)(d.p,{children:"\u5bf9\u6307\u5b9a\u7684db\u8fdb\u884c\u5168\u91cfcompact\u3002\u4f8b\u5982 compact db0 all\u4f1a\u5bf9db0\u4e0a\u6240\u6709\u6570\u636e\u7ed3\u6784\u8fdb\u884c\u5168\u91cfcompact\u3002"}),"\n",(0,i.jsx)(d.h3,{id:"flushdb-string--hash--set--zset--list-",children:"flushdb [string | hash | set | zset | list ]"}),"\n",(0,i.jsx)(d.p,{children:"flushdb\u547d\u4ee4\u5141\u8bb8\u53ea\u6e05\u9664\u6307\u5b9a\u6570\u636e\u7ed3\u6784\u7684\u6240\u6709\u6570\u636e, \u5982\u9700\u5220\u9664\u6240\u6709\u6570\u636e\u8bf7\u4f7f\u7528flushall"}),"\n",(0,i.jsx)(d.h3,{id:"keys-pattern-string--hash--set--zset--list-",children:"keys pattern [string | hash | set | zset | list ]"}),"\n",(0,i.jsx)(d.p,{children:"keys\u547d\u4ee4\u5141\u8bb8\u53ea\u8f93\u51fa\u6307\u5b9a\u6570\u636e\u7ed3\u6784\u7684\u6240\u6709key, \u5982\u9700\u8f93\u51fa\u6240\u6709\u7ed3\u6784\u7684key\u8bf7\u4e0d\u8981\u4f7f\u7528\u53c2\u6570"}),"\n",(0,i.jsx)(d.h3,{id:"slaveof-ip-port-write2file-name-write2file-pos-force",children:"slaveof ip port [write2file-name] [write2file-pos] [force]"}),"\n",(0,i.jsx)(d.p,{children:"force\u53c2\u6570\u7528\u4e8e\u89e6\u53d1\u5f3a\u884c\u5168\u91cf\u540c\u6b65(\u9002\u7528\u4e8e\u4e3b\u5e93write2file\u88ab\u6e05\u7406\u65e0\u6cd5\u4e3a\u4ece\u5e93\u63d0\u4f9b\u589e\u91cf\u540c\u6b65\u7684\u573a\u666f), \u5168\u91cf\u540c\u6b65\u540epika\u4f1a\u81ea\u52a8\u5207\u6362\u81f3\u589e\u91cf\u540c\u6b65"}),"\n",(0,i.jsx)(d.h3,{id:"sort",children:"sort"}),"\n",(0,i.jsx)(d.p,{children:"pika \u4e0d\u652f\u6301 sort \u547d\u4ee4"}),"\n",(0,i.jsx)(d.h3,{id:"dbslaveof-db0--7-filenum-offset",children:"dbslaveof db[0 ~ 7] filenum offset"}),"\n",(0,i.jsx)(d.p,{children:"\u9700\u8981\u4e0eslaveof\u914d\u5408\u4f7f\u7528\u3002dbslaveof\u547d\u4ee4\u5141\u8bb8\u901a\u8fc7\u6307\u5b9awrite2file(binlog)\u7684\u6587\u4ef6\u540d\u79f0\u53ca\u540c\u6b65\u4f4d\u7f6e\u6765\u5b9e\u73b0\u589e\u91cf\u540c\u6b65\u3002\u8fd9\u79cd\u64cd\u4f5c\u5206\u4e24\u6b65\uff1a\u7b2c\u4e00\u6b65\u6b63\u5e38slaveof ip port \u4f1a\u4e0emaster\u5339\u914dmeta\u662f\u5426\u4e00\u81f4\uff08db\u6570\u76ee\u53ca\u7f16\u53f7\u662f\u5426\u4e00\u81f4\uff09\u3002\u6b64\u65f6slave\u8282\u70b9binlog\u540c\u6b65\u53ef\u80fd\u8fd8\u662f\u5f02\u5e38\u72b6\u6001\u3002\u7b2c\u4e8c\u6b65\u6267\u884cdbslaveof \u8bbe\u7f6e\u5bf9\u5e94db\u7684\u540c\u6b65\u70b9\u4f4d\u3002"}),"\n",(0,i.jsx)(d.h3,{id:"pkscanrange-type-key_start-key_end-match-pattern-limit-limit",children:"pkscanrange type key_start key_end [MATCH pattern] [LIMIT limit]"}),"\n",(0,i.jsx)(d.p,{children:'\u5bf9\u6307\u5b9a\u6570\u636e\u7ed3\u6784\u8fdb\u884c\u6b63\u5411scan, \u5217\u51fa\u5904\u4e8e\u533a\u95f4 [key_start, key_end] \u7684Key\u5217\u8868(\u5982\u679ctype\u4e3astring_with_value\uff0c\u5219\u5217\u51fa\u7684\u662fkey-value\u5217\u8868) ("", ""] \u8868\u793a\u6574\u4e2a\u533a\u95f4\u3002'}),"\n",(0,i.jsxs)(d.ul,{children:["\n",(0,i.jsx)(d.li,{children:"type\uff1a \u6307\u5b9a\u9700\u8981scan\u6570\u636e\u7ed3\u6784\u7684\u7c7b\u578b\uff0c{ string_with_value | string | hash| list | zset | set }"}),"\n",(0,i.jsx)(d.li,{children:"key_start\uff1a \u8fd4\u56de\u7684\u8d77\u59cbKey, \u7a7a\u5b57\u7b26\u4e32\u8868\u793a -inf(\u65e0\u9650\u5c0f)"}),"\n",(0,i.jsx)(d.li,{children:"key_end\uff1a\u8fd4\u56de\u7684\u7ed3\u675fKey, \u7a7a\u5b57\u7b26\u4e32\u8868\u793a +inf(\u65e0\u9650\u5927)"}),"\n"]}),"\n",(0,i.jsx)(d.h3,{id:"pkrscanrange-type-key_start-key_end-match-pattern-limit-limit",children:"pkrscanrange type key_start key_end [MATCH pattern] [LIMIT limit]"}),"\n",(0,i.jsx)(d.p,{children:"\u7c7b\u4f3c\u4e8epkscanrange, \u9006\u5e8f"}),"\n",(0,i.jsx)(d.h3,{id:"pkhscanrange-key-field_start-field_end--match-pattern-limit-limit",children:"pkhscanrange key field_start field_end [MATCH pattern] [LIMIT limit]"}),"\n",(0,i.jsx)(d.p,{children:"\u5217\u51fa\u6307\u5b9ahash table\u4e2d\u5904\u4e8e\u533a\u95f4 [field_start, field_end] \u7684 field-value \u5217\u8868."}),"\n",(0,i.jsxs)(d.ul,{children:["\n",(0,i.jsx)(d.li,{children:"key\uff1ahash table\u5bf9\u5e94\u7684key"}),"\n",(0,i.jsx)(d.li,{children:"field_start\uff1a \u8fd4\u56de\u7684\u8d77\u59cbField, \u7a7a\u5b57\u7b26\u4e32\u8868\u793a -inf(\u65e0\u9650\u5c0f)"}),"\n",(0,i.jsx)(d.li,{children:"field_end\uff1a\u8fd4\u56de\u7684\u7ed3\u675fField, \u7a7a\u5b57\u7b26\u4e32\u8868\u793a +inf(\u65e0\u9650\u5927)"}),"\n"]}),"\n",(0,i.jsx)(d.h3,{id:"pkhrscanrange-key-field_start-field_end--match-pattern-limit-limit",children:"pkhrscanrange key field_start field_end [MATCH pattern] [LIMIT limit]"}),"\n",(0,i.jsx)(d.p,{children:"\u7c7b\u4f3c\u4e8epkhscanrange, \u9006\u5e8f"}),"\n",(0,i.jsx)(d.h3,{id:"diskrecovery",children:"diskrecovery"}),"\n",(0,i.jsxs)(d.p,{children:["Pika \u539f\u521b\u547d\u4ee4\uff0c\u529f\u80fd\u4e3a\u5f53\u78c1\u76d8\u610f\u5916\u5199\u6ee1\u540e\uff0cRocksDB \u4f1a\u8fdb\u5165\u5199\u4fdd\u62a4\u72b6\u6001\uff0c\u5f53\u6211\u4eec\u5c06\u7a7a\u95f4\u8c03\u6574\u4e3a\u5145\u8db3\u7a7a\u95f4\u65f6\uff0c\u8fd9\u4e2a\u547d\u4ee4\u53ef\u4ee5\u5c06 RocksDB \u7684\u5199\u4fdd\u62a4\u72b6\u6001\u89e3\u9664\uff0c\u53d8\u4e3a\u53ef\u4ee5\u7ee7\u7eed\u5199\u7684\u72b6\u6001, \u907f\u514d\u4e86 Pika \u56e0\u4e3a\u78c1\u76d8\u5199\u6ee1\u540e\u9700\u8981\u91cd\u542f\u624d\u80fd\u6062\u590d\u5199\u7684\u60c5\u51b5\uff0c\u6267\u884c\u6210\u529f\u65f6\u8fd4\u56de OK\uff0c\u5982\u679c\u5f53\u524d\u78c1\u76d8\u7a7a\u95f4\u4f9d\u7136\u4e0d\u8db3\uff0c\u6267\u884c\u8fd9\u4e2a\u547d\u4ee4\u8fd4\u56de",(0,i.jsx)(d.code,{children:'"The available disk capacity is insufficient'}),"\uff0c\u8be5\u547d\u4ee4\u6267\u884c\u65f6\u4e0d\u9700\u8981\u989d\u5916\u53c2\u6570\uff0c\u53ea\u9700\u8981\u6267\u884c diskrecovery \u5373\u53ef\u3002"]}),"\n",(0,i.jsx)(d.pre,{children:(0,i.jsx)(d.code,{className:"language-bash",children:"> diskrecovery \n> OK\n"})}),"\n",(0,i.jsx)(d.h3,{id:"clearreplicationid",children:"clearreplicationid"}),"\n",(0,i.jsx)(d.p,{children:"Pika \u539f\u521b\u547d\u4ee4\uff0c\u529f\u80fd\u662f\u6e05\u7a7a Pika \u5b9e\u4f8b\u7684 replicationid \u7684\u503c\u5e76\u6301\u4e45\u5316\u5230\u914d\u7f6e\u6587\u4ef6\u4e2d"}),"\n",(0,i.jsx)(d.pre,{children:(0,i.jsx)(d.code,{className:"language-bash",children:"> clearreplicationid\n> OK\n"})}),"\n",(0,i.jsx)(d.h3,{id:"disablewal",children:"DisableWal"}),"\n",(0,i.jsx)(d.p,{children:"\u6211\u4eec\u53ef\u4ee5\u6839\u636e disablewal (true/false) \u63a5\u53d7\u4e24\u4e2a\u53c2\u6570\u6765\u51b3\u5b9a WAL \u9009\u9879\u7684\u5f00\u5173\uff0ctrue \u8868\u793a\u5199 WAL \u529f\u80fd\u5173\u95ed\uff0cfalse \u8868\u793a\u5199 WAL \u529f\u80fd\u5f00\u542f\uff0c\u9700\u8981\u6ce8\u610f\u7684\u662f\u5199 WAL \u9ed8\u8ba4\u662f\u5f00\u542f\u7684"}),"\n",(0,i.jsx)(d.pre,{children:(0,i.jsx)(d.code,{className:"language-bash",children:"> disablewal true // \u5199 WAL \u5173\u95ed\n> OK\n> disablewal false // \u5199 WAL \u5f00\u542f\n> OK\n> disablewal asdfs // \u8bc6\u522b\u5230\u5f02\u5e38\u53c2\u6570\n> (error) ERR Invalid parameter\n> disable false dasfasd // \u53c2\u6570\u6570\u76ee\u5f02\u5e38\n> (error) ERR wrong number of arguments for 'disablewal' command\n"})})]})}function x(e={}){const{wrapper:d}={...(0,t.R)(),...e.components};return d?(0,i.jsx)(d,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},8453:(e,d,s)=>{s.d(d,{R:()=>r,x:()=>n});var i=s(6540);const t={},l=i.createContext(t);function r(e){const d=i.useContext(l);return i.useMemo((function(){return"function"==typeof e?e(d):{...d,...e}}),[d,e])}function n(e){let d;return d=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),i.createElement(l.Provider,{value:d},e.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/affdd1e0.cf591274.js b/build/assets/js/affdd1e0.cf591274.js new file mode 100644 index 0000000..225fefe --- /dev/null +++ b/build/assets/js/affdd1e0.cf591274.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[7938],{4050:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>s,default:()=>h,frontMatter:()=>t,metadata:()=>c,toc:()=>o});var r=i(4848),l=i(8453);const t={title:"c++ coding style",sidebar_position:1},s=void 0,c={id:"\u5f00\u53d1\u6587\u6863/coding-style/index",title:"c++ coding style",description:"header file",source:"@site/docs/\u5f00\u53d1\u6587\u6863/coding-style/index.md",sourceDirName:"\u5f00\u53d1\u6587\u6863/coding-style",slug:"/\u5f00\u53d1\u6587\u6863/coding-style/",permalink:"/docs/\u5f00\u53d1\u6587\u6863/coding-style/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u5f00\u53d1\u6587\u6863/coding-style/index.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"c++ coding style",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"\u7f16\u7801\u89c4\u8303",permalink:"/docs/\u5f00\u53d1\u6587\u6863/\u7f16\u7801\u89c4\u8303/"}},d={},o=[{value:"header file",id:"header-file",level:3},{value:"Name and order of includes",id:"name-and-order-of-includes",level:4},{value:"class",id:"class",level:3},{value:"Doing work in constructors",id:"doing-work-in-constructors",level:4},{value:"Inheritance",id:"inheritance",level:4},{value:"Function",id:"function",level:3},{value:"parameter Ordering",id:"parameter-ordering",level:4},{value:"reference Arguments",id:"reference-arguments",level:4},{value:"function overloading",id:"function-overloading",level:4},{value:"default value",id:"default-value",level:4},{value:"scoping",id:"scoping",level:3},{value:"Nonmember, static member, global function",id:"nonmember-static-member-global-function",level:4},{value:"other",id:"other",level:3},{value:"\u5173\u4e8eexception \u7684\u4f7f\u7528",id:"\u5173\u4e8eexception-\u7684\u4f7f\u7528",level:4},{value:"\u5173\u4e8e\u8fd4\u56de\u503c",id:"\u5173\u4e8e\u8fd4\u56de\u503c",level:4},{value:"brace initializer List",id:"brace-initializer-list",level:4},{value:"sizeof",id:"sizeof",level:4},{value:"Run-Time Type Information(RTTI)",id:"run-time-type-informationrtti",level:4},{value:"cast",id:"cast",level:4},{value:"stream",id:"stream",level:4},{value:"Friend",id:"friend",level:4},{value:"use of const",id:"use-of-const",level:4},{value:"Integer type",id:"integer-type",level:4},{value:"0 and nullptr/NULL",id:"0-and-nullptrnull",level:4},{value:"Comments",id:"comments",level:3},{value:"TODO comment",id:"todo-comment",level:4},{value:"\u603b\u7ed3",id:"\u603b\u7ed3",level:3}];function a(e){const n={a:"a",code:"code",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,l.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h3,{id:"header-file",children:"header file"}),"\n",(0,r.jsx)(n.h4,{id:"name-and-order-of-includes",children:"Name and order of includes"}),"\n",(0,r.jsx)(n.p,{children:"\u987a\u5e8f\u662f"}),"\n",(0,r.jsxs)(n.p,{children:["Related header, C library, C++ library, other libraries'.h",(0,r.jsx)(n.code,{children:", your project's "}),".h`."]}),"\n",(0,r.jsx)(n.p,{children:"\u4e0d\u8981\u4f7f\u7528 . \u4ee5\u53ca .. \u8fd9\u6837\u7684\u7b26\u53f7"}),"\n",(0,r.jsx)(n.p,{children:"\u6bd4\u5982\u4e00\u4e2a\u9879\u76ee\u7684include \u5934\u6587\u4ef6\u5e94\u8be5\u662f\u8fd9\u6837"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-c++",children:'#include "foo/server/fooserver.h"\n\n#include <sys/types.h>\n#include <unistd.h>\n\n#include <hash_map>\n#include <vector>\n\n#include "base/basictypes.h"\n#include "base/commandlineflags.h"\n#include "foo/server/bar.h"\n\n'})}),"\n",(0,r.jsx)(n.h3,{id:"class",children:"class"}),"\n",(0,r.jsx)(n.h4,{id:"doing-work-in-constructors",children:"Doing work in constructors"}),"\n",(0,r.jsx)(n.p,{children:"constructor \u4e0d\u80fd\u8c03\u7528\u865a\u51fd\u6570, \u56e0\u4e3a\u5728\u6784\u9020\u7684\u65f6\u5019, \u8fd9\u4e2a\u5bf9\u8c61\u8fd8\u6ca1\u6709\u5b8c\u5168\u751f\u6210, \u56e0\u6b64\u8c03\u7528\u865a\u51fd\u6570\u80af\u5b9a\u662f\u4e0d\u5bf9\u7684"}),"\n",(0,r.jsx)(n.h4,{id:"inheritance",children:"Inheritance"}),"\n",(0,r.jsx)(n.p,{children:"\u4f7f\u7528 override \u6765\u8868\u793a\u67d0\u4e00\u4e2a\u51fd\u6570\u662fvirtual \u51fd\u6570\u7684\u91cd\u65b0\u5b9e\u73b0, \u8fd9\u6837\u5c31\u4e0d\u9700\u8981\u5728\u770b\u4ee3\u7801\u7684\u65f6\u5019\u786e\u8ba4\u8fd9\u4e2a\u51fd\u6570\u662f\u5426\u662f\u91cd\u8f7d, \u5982\u679c\u5728\u5b50\u7c7b\u91cc\u9762\u5bf9\u4e00\u4e2a\u7236\u7c7b\u6ca1\u6709\u7684\u51fd\u6570\u8fdb\u884coverride\u4e5f\u662f\u4f1a\u76f4\u63a5\u62a5\u9519\u7684"}),"\n",(0,r.jsx)(n.p,{children:"\u5728\u4f7f\u7528struct\u7684\u65f6\u5019 \u53ea\u7528\u5728\u53ea\u5b9a\u4e49\u6570\u636e,\u4e0d\u5305\u542b\u4efb\u4f55\u65b9\u6cd5\u7684\u7ed3\u6784\u4f53\u91cc\u9762\uff0c\u51fa\u4e86\u7b80\u5355\u7684\u6784\u9020\u51fd\u6570\u6216\u8005init\u51fd\u6570."}),"\n",(0,r.jsx)(n.p,{children:"\u901a\u8fc7\u4f7f\u7528\u7ee7\u627f\u53ef\u4ee5\u6709\u6548\u7684\u51cf\u5c11\u4ee3\u7801\u91cf \u5e76\u4e14\u56e0\u4e3a\u7ee7\u627f\u662f\u7f16\u8bd1\u65f6\u671f\u7684 \u56e0\u6b64\u5728\u7f16\u8bd1\u5668\u80fd\u591f\u8bc6\u522b\u8fd9\u4e9b\u9519\u8bef \u63a5\u53e3\u7ee7\u627f(\u4e5f\u5c31\u662f\u5b9a\u4e49\u7eaf\u865a\u51fd\u6570) \u66f4\u662f\u80fd\u591f\u5728\u7f16\u8bd1\u671f\u5c31\u8bc6\u522b\u4e00\u4e2a\u7ee7\u627f\u7684\u7c7b\u662f\u5426\u5b9e\u73b0\u4e86\u5168\u90e8\u7684\u63a5\u53e3"}),"\n",(0,r.jsx)(n.p,{children:"\u4f46\u662f\u7531\u4e8e\u7ee7\u627f\u628a\u4e00\u4e2a\u7c7b\u7684\u4ee3\u7801\u5206\u6563\u5728\u5404\u4e2a\u6587\u4ef6\u91cc\u9762\u4e86 \u56e0\u6b64\u589e\u52a0\u4e86\u770b\u4ee3\u7801\u7684\u96be\u5ea6 \u5e76\u4e14\u7236\u7c7b\u5b9a\u4e49\u81ea\u5df1\u7684\u6210\u5458\u53d8\u91cf \u56e0\u6b64\u8bbf\u95ee\u7684\u65f6\u5019\u4e0d\u662f\u5f88\u65b9\u4fbf"}),"\n",(0,r.jsxs)(n.p,{children:["\u6240\u4ee5\u4e00\u5b9a\u8981\u8d26\u53f7 is-a \u548c has-a\u7684\u5173\u7cfb \u4e00\u5b9a\u786e\u5b9a\u662f a\u662fb\u7684\u4e00\u79cd\u7684\u65f6\u5019\u624d\u53ef\u4ee5\u4f7f\u7528 \u7ee7\u627f ",(0,r.jsx)(n.strong,{children:"\u5426\u5219\u5c3d\u53ef\u80fd\u7684\u4f7f\u7528\u7ec4\u5408"})," \u4e5f\u5c31\u662fb\u91cc\u9762\u6709\u4e00\u4e2aa\u7684\u6210\u5458\u53d8\u91cf"]}),"\n",(0,r.jsx)(n.h3,{id:"function",children:"Function"}),"\n",(0,r.jsx)(n.h4,{id:"parameter-ordering",children:"parameter Ordering"}),"\n",(0,r.jsx)(n.p,{children:"\u51fd\u6570\u7684\u53d8\u91cf\u7684\u987a\u5e8f: input, \u7136\u540e\u662foutput"}),"\n",(0,r.jsx)(n.p,{children:"\u5c3d\u91cf\u628a\u4e00\u4e2a\u51fd\u6570\u63a7\u5236\u572840\u884c\u4ee5\u5185"}),"\n",(0,r.jsx)(n.h4,{id:"reference-arguments",children:"reference Arguments"}),"\n",(0,r.jsx)(n.p,{children:"\u6240\u6709\u901a\u8fc7\u5f15\u7528\u4f20\u53c2\u7684\u53d8\u91cf\u90fd\u9700\u8981\u52a0\u4e0aconst, \u4e5f\u5c31\u662f const type &in"}),"\n",(0,r.jsx)(n.p,{children:"\u5c3d\u53ef\u80fd\u7684input argument \u7528value \u6216\u8005 const reference(\u5f53\u7136\u5982\u679c\u8fd9\u4e2a\u53d8\u91cf\u5c31\u662f\u6307\u9488, \u90a3\u4e48\u4f20\u8fdb\u6765\u7684\u65f6\u5019\u5c31\u7528\u6307\u9488), \u7136\u540eoutput argument \u7528\u6307\u9488"}),"\n",(0,r.jsx)(n.p,{children:"\u8fd8\u6709\u5c31\u662f\u5982\u679c\u53d8\u91cf\u9700\u8981\u4f20\u8fdb\u6765NULL\u7684\u65f6\u5019, \u53ef\u80fd\u4f1a\u7528const T*"}),"\n",(0,r.jsx)(n.h4,{id:"function-overloading",children:"function overloading"}),"\n",(0,r.jsx)(n.p,{children:"\u5c3d\u53ef\u80fd\u7684\u4e0d\u8981\u4f7f\u7528 function overloading, \u56e0\u4e3afunction overloading \u589e\u52a0\u4e86c++ \u7684\u590d\u6742\u6027. \u7279\u522b\u662f\u5f53\u7ee7\u627f\u7684\u65f6\u5019, \u5b50\u7c7b\u53ea\u5b9e\u73b0\u4e86\u7236\u7c7b\u7684\u67d0\u4e00\u4e2afunction \u7684\u65f6\u5019, \u8fd9\u6837\u4ee3\u7801\u7684\u590d\u6742\u5ea6\u5c31\u66f4\u9ebb\u70e6\u4e86. \u56e0\u4e3a\u4e0d\u77e5\u9053\u91cd\u8f7d\u7684\u662f\u54ea\u4e00\u4e2a\u51fd\u6570, \u56e0\u6b64"}),"\n",(0,r.jsx)(n.p,{children:"\u5c3d\u53ef\u80fd\u7684\u4e0d\u8981\u4f7f\u7528function overloading, \u5f53\u9047\u5230\u51fd\u6570\u9700\u8981\u4e0d\u7528\u7684\u53d8\u91cf\u7c7b\u578b\u7684\u65f6\u5019, \u53ef\u4ee5\u5199\u6210\u8fd9\u79cdAppendString(), AppendInt() \u8fd9\u79cd"}),"\n",(0,r.jsx)(n.h4,{id:"default-value",children:"default value"}),"\n",(0,r.jsx)(n.p,{children:"\u5141\u8bb8\u5728\u975enon-virtual \u51fd\u6570\u91cc\u9762\u4f7f\u7528 default value"}),"\n",(0,r.jsx)(n.h3,{id:"scoping",children:"scoping"}),"\n",(0,r.jsx)(n.h4,{id:"nonmember-static-member-global-function",children:"Nonmember, static member, global function"}),"\n",(0,r.jsx)(n.p,{children:"\u5982\u679c\u6709\u4e00\u4e2a\u51fd\u6570\u548c\u4e00\u4e2a\u7c7b\u7684\u5bf9\u8c61\u91cc\u9762\u7684\u5185\u5bb9\u5e76\u4e0d\u76f8\u5173"}),"\n",(0,r.jsx)(n.p,{children:"\u90a3\u4e48\u8fd9\u4e2a\u65f6\u5019\u6709\u4e24\u4e2a\u9009\u62e9, \u53ef\u4ee5\u5b9a\u4e49\u6210class static member function, nonmember function. \u90a3\u4e48\u8fd9\u4e2a\u65f6\u5019\u5982\u4f55\u9009\u62e9?"}),"\n",(0,r.jsx)(n.p,{children:"\u5982\u679c\u8fd9\u4e2a\u51fd\u6570\u548c\u8fd9\u4e2a\u5bf9\u8c61\u5f3a\u76f8\u5173, \u6bd4\u5982\u662f\u5efa\u7acb\u4e00\u4e2a\u8fd9\u4e2a\u5bf9\u8c61, \u6216\u8005\u64cd\u4f5c\u8fd9\u4e2a\u7c7b\u7684\u9759\u6001\u6210\u5458\u51fd\u6570\u7684\u65f6\u5019, \u5c06\u8fd9\u4e2a\u51fd\u6570\u58f0\u660e\u6210class static member function"}),"\n",(0,r.jsx)(n.p,{children:"\u5426\u5219\u5c06\u8fd9\u4e2a\u51fd\u6570\u58f0\u660e\u6210nonmember function, \u7136\u540e\u7528namespace \u9694\u79bb\u5f00\u6765"}),"\n",(0,r.jsx)(n.p,{children:"\u5982\u679c\u6709\u4e00\u4e2a\u51fd\u6570\u53ea\u5728\u67d0\u4e00\u4e2a.cc \u6587\u4ef6\u91cc\u9762\u4f7f\u7528, \u90a3\u4e48\u53ef\u4ee5\u5c06\u8fd9\u4e2a\u51fd\u6570\u653e\u5728unnamed namespace \u6216\u8005\u7528static \u58f0\u660e static int foo() \u8fd9\u79cd"}),"\n",(0,r.jsx)(n.h3,{id:"other",children:"other"}),"\n",(0,r.jsx)(n.h4,{id:"\u5173\u4e8eexception-\u7684\u4f7f\u7528",children:"\u5173\u4e8eexception \u7684\u4f7f\u7528"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["pros:","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"exception \u53ef\u4ee5\u53d1\u73b0\u66f4\u6df1\u5c42\u6b21\u7684\u9519\u8bef, \u6bd4\u5982a()->b()->c()->d() \u90a3\u4e48\u5728d\u91cc\u9762\u629b\u51fa\u7684exception \u5728a\u91cc\u9762\u662f\u53ef\u4ee5\u76f4\u63a5\u6355\u83b7\u7684"}),"\n",(0,r.jsx)(n.li,{children:"\u6bd4\u5982\u5728c++ \u7684construction \u91cc\u9762, \u6211\u4eec\u662f\u65e0\u6cd5\u77e5\u9053\u8fd9\u4e2aconstruction \u662f\u5426\u6784\u9020\u6210\u529f,"}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["cons","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"\u200b"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h4,{id:"\u5173\u4e8e\u8fd4\u56de\u503c",children:"\u5173\u4e8e\u8fd4\u56de\u503c"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsx)(n.li,{children:"\u5728\u4e00\u4e2a\u51fd\u6570\u5185\u90e8\u8c03\u7528"}),"\n"]}),"\n",(0,r.jsx)(n.h4,{id:"brace-initializer-list",children:"brace initializer List"}),"\n",(0,r.jsxs)(n.p,{children:["\u5728c++11 \u91cc\u9762\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7"," \u6765\u521d\u59cb\u5316\u4e00\u4e2alist, \u8fd9\u4e2a\u662f\u5728c++ 11 \u4e4b\u524d\u90fd\u4e0d\u53ef\u4ee5\u7684, \u6bd4\u5982:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-c++",children:"int main()\n{\n std::vector<int> v{1, 2, 3};\n std::map<int, int> mp{{1, 2}, {1, 3}, {1, 4}};\n return 0;\n}\n"})}),"\n",(0,r.jsx)(n.h4,{id:"sizeof",children:"sizeof"}),"\n",(0,r.jsx)(n.p,{children:"\u5728\u4f7f\u7528sizeof \u7684\u65f6\u5019\u5c3d\u53ef\u80fd\u7684\u53bbsizeof(varname), \u800c\u4e0d\u662f\u53bbsizeof(type). \u56e0\u6b64\u8fd9\u4e2avarname \u968f\u65f6\u4f1a\u66f4\u65b0, \u5982\u679cvarname \u8fd9\u4e2a\u53d8\u91cf\u88ab\u8d4b\u503c\u7ed9\u5176\u4ed6\u5bf9\u8c61\u7684\u65f6\u5019"}),"\n",(0,r.jsx)(n.p,{children:"\u6ce8\u610fsizeof \u7684\u65f6\u5019\u8003\u8651\u5bf9\u9f50\u7684\u95ee\u9898"}),"\n",(0,r.jsx)(n.h4,{id:"run-time-type-informationrtti",children:"Run-Time Type Information(RTTI)"}),"\n",(0,r.jsx)(n.p,{children:"c++ \u5141\u8bb8\u5728\u8fd0\u884c\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528typeid, dynamic_cast \u6765\u68c0\u67e5\u4e00\u4e2a\u53d8\u91cf\u7684\u7c7b\u578b, \u901a\u8fc7dynamic_cast \u5728\u7c7b\u578b\u8f6c\u6362\u7684\u65f6\u5019\u8fdb\u884c\u68c0\u67e5, \u53ea\u5141\u8bb8\u7236\u7c7b\u7684\u6307\u9488\u6307\u5411\u5b50\u7c7b, \u800c\u4e0d\u5141\u8bb8\u5b50\u7c7b\u7684\u6307\u9488\u6307\u5411\u7236\u7c7b"}),"\n",(0,r.jsx)(n.p,{children:"\u4f46\u662f\u5176\u5b9e\u7528RTTI \u7684\u4ee3\u7801\u90fd\u53ef\u4ee5\u7528\u5176\u4ed6\u7684\u65b9\u5f0f\u6765\u5199, \u800cRTTI \u4e0d\u662f\u5f88\u9ad8\u6548, \u56e0\u6b64\u5c3d\u53ef\u80fd\u7528 virtual method, \u6216\u8005 Visitor pattern \u6a21\u5f0f\u6765\u5b9e\u73b0\u6bd4\u8f83\u597d"}),"\n",(0,r.jsx)(n.h4,{id:"cast",children:"cast"}),"\n",(0,r.jsx)(n.p,{children:"\u5c3d\u53ef\u80fd\u7684\u4f7f\u7528 c++ \u7684static_cast, const_cast, reinterpret_cast \u800c\u4e0d\u662f\u7528c \u91cc\u9762\u7684cast"}),"\n",(0,r.jsx)(n.h4,{id:"stream",children:"stream"}),"\n",(0,r.jsx)(n.p,{children:"\u5982\u679c\u4f60\u4e3a\u4e86debug\u60f3\u8981\u6253\u5370\u4e00\u4e2a\u5bf9\u8c61\u5185\u90e8\u7684\u7ec6\u8282, \u90a3\u4e48\u7ecf\u5e38\u4f1a\u63d0\u4f9b\u4e00\u4e2aDebugString() \u662f\u6700\u7ecf\u5e38\u7684"}),"\n",(0,r.jsx)(n.p,{children:"\u4e0d\u8981\u4f7f\u7528stream \u4f5c\u4e3a\u5916\u90e8\u7528\u6237\u7684IO, stream \u6027\u80fd\u8fd8\u662f\u4e0d\u884c\u7684"}),"\n",(0,r.jsx)(n.h4,{id:"friend",children:"Friend"}),"\n",(0,r.jsx)(n.p,{children:"\u5141\u8bb8\u4f7f\u7528 Friend class, function"}),"\n",(0,r.jsx)(n.p,{children:"Friend class \u867d\u7136\u4f1a\u7834\u574f\u4e86\u7c7b\u5c01\u88c5, \u5141\u8bb8\u5916\u90e8\u7c7b\u76f4\u63a5\u8bbf\u95ee\u5f53\u524d\u8fd9\u4e2a\u7c7b\u91cc\u9762\u7684\u79c1\u6709\u6210\u5458, \u5e38\u89c1\u7684\u7528\u6cd5\u5c31\u662fFooBuilder \u5e94\u8be5\u80fd\u591f\u8bbf\u95eeFoo \u91cc\u9762\u7684\u79c1\u6709\u6210\u5458. \u5982\u679c\u6ca1\u6709Friend class, \u8981\u4e48\u628aFoo \u7684\u6210\u5458\u90fd\u8bbe\u7f6e\u6210public, \u8981\u4e48\u7ed9\u6240\u6709\u7684\u6210\u5458\u53d8\u91cf\u90fd\u6dfb\u52a0get, set \u51fd\u6570. \u8fd8\u662f\u5f88\u4e0d\u65b9\u4fbf\u7684."}),"\n",(0,r.jsx)(n.p,{children:"Friend class \u53ea\u662f\u8ba9\u67d0\u4e00\u4e2a\u7c7b\u53ef\u4ee5\u8bbf\u95ee\u8fd9\u4e2a\u7c7b, \u8fd8\u662f\u6bd4\u8ba9\u6240\u6709\u7684\u6210\u5458\u53d8\u91cf\u90fdpublic \u6765\u8bf4, \u5c01\u88c5\u66f4\u597d\u4e00\u4e9b"}),"\n",(0,r.jsx)(n.p,{children:"\u56e0\u6b64Friend class \u9700\u8981\u770b\u5230Foo \u7684\u79c1\u6709\u53d8\u91cf, \u56e0\u6b64\u7ecf\u5e38\u5c06Friend class \u653e\u5728\u540c\u4e00\u4e2a\u5934\u6587\u4ef6\u91cc\u9762"}),"\n",(0,r.jsx)(n.h4,{id:"use-of-const",children:"use of const"}),"\n",(0,r.jsx)(n.p,{children:"\u80fd\u7528const \u7684\u5730\u65b9\u5c3d\u53ef\u80fd\u7684\u4f7f\u7528const"}),"\n",(0,r.jsx)(n.h4,{id:"integer-type",children:"Integer type"}),"\n",(0,r.jsxs)(n.p,{children:["\u7528 ",(0,r.jsx)(n.code,{children:"<stdint.h>"})," \u91cc\u9762\u5b9a\u4e49\u7684int32_t, int64_t \u7b49\u7b49, \u800c\u4e0d\u9002\u7528short, long, long long \u8fd9\u79cd\u7c7b\u578b, \u56e0\u4e3ashort, long \u7b49\u662f\u6839\u636e\u7f16\u8bd1\u5668\u548c\u5e73\u53f0\u662f\u4e0d\u4e00\u6837\u7684"]}),"\n",(0,r.jsx)(n.h4,{id:"0-and-nullptrnull",children:"0 and nullptr/NULL"}),"\n",(0,r.jsx)(n.p,{children:"Use 0 for integers, 0.0 for reals, nullptr (or NULL) for pointers, and '\\0' for chars."}),"\n",(0,r.jsx)(n.p,{children:"\u5728\u652f\u6301c++11 \u7684\u9879\u76ee\u91cc\u9762\u5c3d\u53ef\u80fd\u4f7f\u7528nullptr"}),"\n",(0,r.jsx)(n.h3,{id:"comments",children:"Comments"}),"\n",(0,r.jsx)(n.h4,{id:"todo-comment",children:"TODO comment"}),"\n",(0,r.jsx)(n.p,{children:"\u5199TODO comment \u7684\u65f6\u5019\u8bb0\u5f97\u5199\u4e0a\u8c01\u5199\u7684\u8fd9\u4e2aTODO"}),"\n",(0,r.jsxs)(n.p,{children:["// TODO(",(0,r.jsx)(n.a,{href:"mailto:kl@gmail.com",children:"kl@gmail.com"}),'): Use a "*" here for concatenation operator.']}),"\n",(0,r.jsx)(n.h3,{id:"\u603b\u7ed3",children:"\u603b\u7ed3"}),"\n",(0,r.jsx)(n.p,{children:"\u6700\u540e\u53ef\u4ee5\u7528 cpplint.py \u8dd1\u4e00\u4e0b, \u5c3d\u53ef\u80fd\u628a\u9519\u8bef\u662f4, \u4ee5\u53ca4\u4ee5\u4e0a\u7684\u7ed9\u6392\u9664\u6389"})]})}function h(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>c});var r=i(6540);const l={},t=r.createContext(l);function s(e){const n=r.useContext(t);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:s(e.components),r.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/b50c085f.4327eff2.js b/build/assets/js/b50c085f.4327eff2.js new file mode 100644 index 0000000..3ce9b10 --- /dev/null +++ b/build/assets/js/b50c085f.4327eff2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[4434],{5459:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>c,toc:()=>d});var s=i(4848),t=i(8453);const r={title:"\u9501\u7684\u5e94\u7528",sidebar_position:2},o=void 0,c={id:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u9501\u7684\u5e94\u7528/index",title:"\u9501\u7684\u5e94\u7528",description:"pika\u4f5c\u4e3a\u7c7bredis\u7684\u5b58\u50a8\u7cfb\u7edf\uff0c\u4e3a\u4e86\u5f25\u8865\u5728\u6027\u80fd\u4e0a\u7684\u4e0d\u8db3\uff0c\u5728\u6574\u4e2a\u7cfb\u7edf\u4e2d\u5927\u91cf\u4f7f\u7528\u591a\u7ebf\u7a0b\u7684\u7ed3\u6784\uff0c\u6d89\u53ca\u5230\u591a\u7ebf\u7a0b\u7f16\u7a0b\uff0c\u52bf\u5fc5\u9700\u8981\u4e3a\u7ebf\u7a0b\u52a0\u9501\u6765\u4fdd\u8bc1\u6570\u636e\u8bbf\u95ee\u7684\u4e00\u81f4\u6027\u548c\u6709\u6548\u6027\u3002\u5176\u4e2d\u4e3b\u8981\u7528\u5230\u4e86\u4e09\u79cd\u9501",source:"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u9501\u7684\u5e94\u7528/index.md",sourceDirName:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u9501\u7684\u5e94\u7528",slug:"/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u9501\u7684\u5e94\u7528/",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u9501\u7684\u5e94\u7528/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u9501\u7684\u5e94\u7528/index.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"\u9501\u7684\u5e94\u7528",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"\u7ebf\u7a0b\u6a21\u578b",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u7ebf\u7a0b\u6a21\u578b/"},next:{title:"\u5168\u540c\u6b65",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u5168\u540c\u6b65/"}},l={},d=[{value:"\u8bfb\u5199\u9501",id:"\u8bfb\u5199\u9501",level:2},{value:"\u5e94\u7528\u573a\u666f",id:"\u5e94\u7528\u573a\u666f",level:3},{value:"\u4f5c\u7528\u548c\u610f\u4e49",id:"\u4f5c\u7528\u548c\u610f\u4e49",level:4},{value:"\u884c\u9501",id:"\u884c\u9501",level:2},{value:"\u4f5c\u7528\u548c\u610f\u4e49\uff1a",id:"\u4f5c\u7528\u548c\u610f\u4e49-1",level:3},{value:"\u5e94\u7528\u573a\u666f",id:"\u5e94\u7528\u573a\u666f-1",level:3},{value:"\u8bbe\u8ba1\u7684\u5e73\u8861",id:"\u8bbe\u8ba1\u7684\u5e73\u8861",level:4},{value:"\u5177\u4f53\u5b9e\u73b0",id:"\u5177\u4f53\u5b9e\u73b0",level:3}];function a(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["pika\u4f5c\u4e3a\u7c7bredis\u7684\u5b58\u50a8\u7cfb\u7edf\uff0c\u4e3a\u4e86\u5f25\u8865\u5728\u6027\u80fd\u4e0a\u7684\u4e0d\u8db3\uff0c\u5728\u6574\u4e2a\u7cfb\u7edf\u4e2d\u5927\u91cf\u4f7f\u7528",(0,s.jsx)(n.a,{href:"https://github.com/Qihoo360/pika/wiki/pika-%E7%BA%BF%E7%A8%8B%E6%A8%A1%E5%9E%8B",children:"\u591a\u7ebf\u7a0b\u7684\u7ed3\u6784"}),"\uff0c\u6d89\u53ca\u5230\u591a\u7ebf\u7a0b\u7f16\u7a0b\uff0c\u52bf\u5fc5\u9700\u8981\u4e3a\u7ebf\u7a0b\u52a0\u9501\u6765\u4fdd\u8bc1\u6570\u636e\u8bbf\u95ee\u7684\u4e00\u81f4\u6027\u548c\u6709\u6548\u6027\u3002\u5176\u4e2d\u4e3b\u8981\u7528\u5230\u4e86\u4e09\u79cd\u9501"]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"\u4e92\u65a5\u9501"}),"\n",(0,s.jsx)(n.li,{children:"\u8bfb\u5199\u9501"}),"\n",(0,s.jsx)(n.li,{children:"\u884c\u9501"}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"\u8bfb\u5199\u9501",children:"\u8bfb\u5199\u9501"}),"\n",(0,s.jsx)(n.h3,{id:"\u5e94\u7528\u573a\u666f",children:"\u5e94\u7528\u573a\u666f"}),"\n",(0,s.jsx)(n.p,{children:"\u5e94\u7528\u6302\u8d77\u6307\u4ee4\uff0c\u5728\u6302\u8d77\u6307\u4ee4\u7684\u6267\u884c\u4e2d\uff0c\u4f1a\u6dfb\u52a0\u5199\u9501\uff0c\u4ee5\u786e\u4fdd\uff0c\u6b64\u65f6\u6ca1\u6709\u5176\u4ed6\u6307\u4ee4\u6267\u884c\u3002\u5176\u4ed6\u7684\u666e\u901a\u6307\u4ee4\u5728\u4f1a\u6dfb\u52a0\u8bfb\u9501\uff0c\u53ef\u4ee5\u5e76\u884c\u8bbf\u95ee\u3002\n\u5176\u4e2d\u6302\u8d77\u6307\u4ee4\u6709\uff1a"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"trysync"}),"\n",(0,s.jsx)(n.li,{children:"bgsave"}),"\n",(0,s.jsx)(n.li,{children:"flushall"}),"\n",(0,s.jsx)(n.li,{children:"readonly"}),"\n"]}),"\n",(0,s.jsx)(n.h4,{id:"\u4f5c\u7528\u548c\u610f\u4e49",children:"\u4f5c\u7528\u548c\u610f\u4e49"}),"\n",(0,s.jsx)(n.p,{children:"\u4fdd\u8bc1\u5f53\u524d\u670d\u52a1\u5668\u5728\u6267\u884c\u6302\u8d77\u6307\u4ee4\u65f6\uff0c\u8d77\u5230\u963b\u5199\u4f5c\u7528\u3002"}),"\n",(0,s.jsx)(n.h2,{id:"\u884c\u9501",children:"\u884c\u9501"}),"\n",(0,s.jsx)(n.p,{children:"\u884c\u9501\uff0c\u7528\u4e8e\u5bf9\u4e00\u4e2akey\u52a0\u9501\uff0c\u4fdd\u8bc1\u540c\u4e00\u65f6\u95f4\u53ea\u6709\u4e00\u4e2a\u7ebf\u7a0b\u5bf9\u4e00\u4e2akey\u8fdb\u884c\u64cd\u4f5c\u3002"}),"\n",(0,s.jsx)(n.h3,{id:"\u4f5c\u7528\u548c\u610f\u4e49-1",children:"\u4f5c\u7528\u548c\u610f\u4e49\uff1a"}),"\n",(0,s.jsx)(n.p,{children:"pika\u4e2d\u5b58\u53d6\u7684\u6570\u636e\u90fd\u662f\u7c7bkey\uff0cvalue\u6570\u636e\uff0c\u4e0d\u540ckey\u6240\u5bf9\u5e94\u7684\u6570\u636e\u5b8c\u5168\u72ec\u7acb\uff0c\u6240\u4ee5\u53ea\u9700\u8981\u5bf9key\u52a0\u9501\u53ef\u4ee5\u4fdd\u8bc1\u6570\u636e\u5728\u5e76\u53d1\u8bbf\u95ee\u65f6\u7684\u4e00\u81f4\u6027\uff0c\u884c\u9501\u76f8\u5bf9\u6765\u8bf4\uff0c\u9501\u5b9a\u7c92\u5ea6\u5c0f\uff0c\u4e5f\u53ef\u4ee5\u4fdd\u8bc1\u6570\u636e\u8bbf\u95ee\u7684\u9ad8\u6548\u6027\u3002"}),"\n",(0,s.jsx)(n.h3,{id:"\u5e94\u7528\u573a\u666f-1",children:"\u5e94\u7528\u573a\u666f"}),"\n",(0,s.jsxs)(n.p,{children:["\u5728pika\u7cfb\u7edf\u4e2d\uff0c\u5bf9\u4e8e\u6570\u636e\u5e93\u7684\u64cd\u4f5c\u90fd\u9700\u8981\u6dfb\u52a0\u884c\u9501\uff0c\u4e3b\u8981\u5728\u5e94\u7528\u4e8e\u4e24\u4e2a\u5730\u65b9\uff0c\u5728\u7cfb\u7edf\u4e0a\u5c42\u6307\u4ee4\u8fc7\u7a0b\u4e2d\u548c\u5728\u6570\u636e\u5f15\u64ce\u5c42\u9762\u3002\u5728pika\u7cfb\u7edf\u4e2d\uff0c\u5bf9\u4e8e\u5199\u6307\u4ee4(\u4f1a\u6539\u53d8\u6570\u636e\u72b6\u6001\uff0c\u5982SET,HSET)\u9700\u8981\u9664\u4e86\u66f4\u65b0\u6570\u636e\u5e93\u72b6\u6001\uff0c\u8fd8\u6d89\u53ca\u5230pika\u7684",(0,s.jsx)(n.a,{href:"https://github.com/Qihoo360/pika/wiki/pika-%E4%B8%BB%E4%BB%8E%E5%90%8C%E6%AD%A5%E5%8A%9F%E8%83%BD",children:"\u589e\u91cf\u540c\u6b65"}),",\u9700\u8981\u5728binlog\u4e2d\u6dfb\u52a0\u6240\u6267\u884c\u7684\u5199\u6307\u4ee4\uff0c\u7528\u4e8e\u4fdd\u8bc1master\u548cslave\u7684\u6570\u636e\u5e93\u72b6\u6001\u4e00\u81f4\u3002\u6545\u4e00\u6761\u5199\u6307\u4ee4\u7684\u6267\u884c\uff0c\u4e3b\u8981\u6709\u4e24\u4e2a\u90e8\u5206\uff1a"]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"\u66f4\u6539\u6570\u636e\u5e93\u72b6\u6001"}),"\n",(0,s.jsx)(n.li,{children:"\u5c06\u6307\u4ee4\u6dfb\u52a0\u5230binlog\u4e2d"}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["\u5176\u52a0\u9501\u60c5\u51b5\uff0c\u5982\u4e0b\u56fe\uff1a\n",(0,s.jsx)(n.img,{src:"http://ww4.sinaimg.cn/large/c2cd4307jw1f6no7d5557j20fa0ma74x.jpg",alt:""})]}),"\n",(0,s.jsx)(n.h4,{id:"\u8bbe\u8ba1\u7684\u5e73\u8861",children:"\u8bbe\u8ba1\u7684\u5e73\u8861"}),"\n",(0,s.jsxs)(n.p,{children:["\u5728\u56fe\u4e2d\u53ef\u4ee5\u770b\u5230\uff0c\u5bf9\u540c\u4e00\u4e2akey\uff0c\u52a0\u4e86\u4e24\u6b21\u884c\u9501\uff0c\u5728\u5b9e\u9645\u5e94\u7528\u4e2d\uff0cpika\u4e0a\u6240\u52a0\u7684\u9501\u5c31\u5df2\u7ecf\u80fd\u591f\u4fdd\u8bc1\u6570\u636e\u8bbf\u95ee\u7684\u6b63\u786e\u6027\u3002\u5982\u679c\u53ea\u662f\u4e3a\u4e86pika\u6240\u9700\u8981\u7684\u4e1a\u52a1\uff0cblackwidow\u5c42\u9762\u4f7f\u7528\u884c\u9501\u662f\u591a\u4f59\u7684\uff0c\u4f46\u662f",(0,s.jsx)(n.a,{href:"https://github.com/Qihoo360/pika/wiki/pika-blackwidow%E5%BC%95%E6%93%8E%E6%95%B0%E6%8D%AE%E5%AD%98%E5%82%A8%E6%A0%BC%E5%BC%8F",children:"blackwidow\u7684\u8bbe\u8ba1"}),"\u521d\u8877\u5c31\u662f\u901a\u8fc7\u5bf9rocksdb\u7684\u6539\u9020\u548c\u5c01\u88c5\u63d0\u4f9b\u4e00\u5957\u5b8c\u6574\u7684\u7c7bredis\u6570\u636e\u8bbf\u95ee\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u800c\u4e0d\u4ec5\u4ec5\u662f\u4e3apika\u63d0\u4f9b\u6570\u636e\u5e93\u5f15\u64ce\u3002\u8fd9\u79cd\u8bbe\u8ba1\u601d\u8def\u4e5f\u662f\u79c9\u627f\u4e86Unix\u4e2d\u7684\u8bbe\u8ba1\u539f\u5219\uff1aWrite programs that do one thing and do it well\u3002"]}),"\n",(0,s.jsxs)(n.p,{children:["\u8fd9\u6837\u8bbe\u8ba1\u5927\u5927\u964d\u4f4e\u4e86pika\u4e0eblackwidow\u4e4b\u95f4\u7684\u8026\u5408\uff0c\u4e5f\u4f7f\u5f97blackwidow\u53ef\u4ee5\u88ab\u5355\u72ec\u62ff\u51fa\u6765\u6d4b\u8bd5\u548c\u4f7f\u7528\uff0c\u5728pika\u4e2d\u7684",(0,s.jsx)(n.a,{href:"https://github.com/Qihoo360/pika/wiki/pika%E5%88%B0redis%E8%BF%81%E7%A7%BB%E5%B7%A5%E5%85%B7",children:"\u6570\u636e\u8fc1\u79fb\u5de5\u5177"}),"\u5c31\u662f\u5b8c\u5168\u4f7f\u7528blackwidow\u6765\u5b8c\u6210\uff0c\u4e0d\u5fc5\u4f9d\u8d56\u4efb\u4f55pika\u76f8\u5173\u7684\u4e1c\u897f\u3002\u53e6\u5916\u5bf9\u4e8eblackwidow\u611f\u5174\u8da3\u6216\u8005\u6709\u9700\u6c42\u7684\u56e2\u961f\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5c06blackwidow\u4f5c\u4e3a\u6570\u636e\u5e93\u5f15\u64ce\u800c\u4e0d\u9700\u8981\u4fee\u6539\u4efb\u4f55\u4ee3\u7801\u5c31\u80fd\u4f7f\u7528\u5b8c\u6574\u7684\u6570\u636e\u8bbf\u95ee\u529f\u80fd\u3002"]}),"\n",(0,s.jsx)(n.h3,{id:"\u5177\u4f53\u5b9e\u73b0",children:"\u5177\u4f53\u5b9e\u73b0"}),"\n",(0,s.jsx)(n.p,{children:"\u5728pika\u7cfb\u7edf\u4e2d\uff0c\u4e00\u628a\u884c\u9501\u5c31\u53ef\u4ee5\u7ef4\u62a4\u6240\u6709key\u3002\u5728\u884c\u9501\u7684\u5b9e\u73b0\u4e0a\u662f\u5c06\u4e00\u4e2akey\u4e0e\u4e00\u628a\u4e92\u65a5\u9501\u76f8\u7ed1\u5b9a\uff0c\u5e76\u5c06\u5176\u653e\u5165\u54c8\u5e0c\u8868\u4e2d\u7ef4\u62a4\uff0c\u6765\u4fdd\u8bc1\u6bcf\u6b21\u8bbf\u95eekey\u7684\u7ebf\u7a0b\u53ea\u6709\u4e00\u4e2a\uff0c\u4f46\u662f\u4e0d\u53ef\u80fd\u4e5f\u4e0d\u9700\u8981\u4e3a\u6bcf\u4e00\u4e2akey\u4fdd\u7559\u4e00\u628a\u4e92\u65a5\u9501\uff0c\u53ea\u9700\u8981\u5f53\u6709\u591a\u6761\u7ebf\u7a0b\u8bbf\u95ee\u540c\u4e00\u4e2akey\u65f6\u624d\u9700\u8981\u9501\uff0c\u5728\u6240\u6709\u7ebf\u7a0b\u90fd\u8bbf\u95ee\u7ed3\u675f\u4e4b\u540e\uff0c\u5c31\u53ef\u4ee5\u9500\u6bc1\u8fd9\u4e2a\u7ed1\u5b9akey\u7684\u4e92\u65a5\u9501\uff0c\u91ca\u653e\u8d44\u6e90\u3002\u5177\u4f53\u5b9e\u73b0\u5982\u4e0b\uff1a"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-C++",children:'class RecordLock {\n public:\n RecordLock(port::RecordMutex *mu, const std::string &key)\n : mu_(mu), key_(key) {\n mu_->Lock(key_);\n }\n ~RecordLock() { mu_->Unlock(key_); }\n\n private:\n port::RecordMutex *const mu_;\n std::string key_;\n\n // No copying allowed\n RecordLock(const RecordLock&);\n void operator=(const RecordLock&);\n};\n\nvoid RecordMutex::Lock(const std::string &key) {\n mutex_.Lock();\n std::unordered_map<std::string, RefMutex *>::const_iterator it = records_.find(key);\n\n if (it != records_.end()) {\n //log_info ("tid=(%u) >Lock key=(%s) exist, map_size=%u", pthread_self(), key.c_str(), records_.size());\n RefMutex *ref_mutex = it->second;\n ref_mutex->Ref();\n mutex_.Unlock();\n\n ref_mutex->Lock();\n //log_info ("tid=(%u) <Lock key=(%s) exist", pthread_self(), key.c_str());\n } else {\n //log_info ("tid=(%u) >Lock key=(%s) new, map_size=%u ++", pthread_self(), key.c_str(), records_.size());\n RefMutex *ref_mutex = new RefMutex();\n\n records_.insert(std::make_pair(key, ref_mutex));\n ref_mutex->Ref();\n mutex_.Unlock();\n\n ref_mutex->Lock();\n //log_info ("tid=(%u) <Lock key=(%s) new", pthread_self(), key.c_str());\n }\n}\n\n'})}),"\n",(0,s.jsxs)(n.p,{children:["\u5b8c\u6574\u4ee3\u7801\u53ef\u53c2\u8003\uff1a",(0,s.jsx)(n.a,{href:"https://github.com/baotiao/slash/blob/master/src/slash_mutex.cc",children:"slash_mutex.cc"})," ",(0,s.jsx)(n.a,{href:"https://github.com/baotiao/slash/blob/master/include/slash_mutex.h",children:"slash_mutex.h"})]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>c});var s=i(6540);const t={},r=s.createContext(t);function o(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/bb6459ea.8bfab866.js b/build/assets/js/bb6459ea.8bfab866.js new file mode 100644 index 0000000..db2af8a --- /dev/null +++ b/build/assets/js/bb6459ea.8bfab866.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[1169],{8015:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>k,frontMatter:()=>a,metadata:()=>s,toc:()=>d});var n=i(4848),o=i(8453);const a={title:"Pika \u4f18\u5316\u6848\u4f8b",sidebar_position:4},r=void 0,s={id:"\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/index",title:"Pika \u4f18\u5316\u6848\u4f8b",description:"",source:"@site/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/index.md",sourceDirName:"\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b",slug:"/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/",permalink:"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/index.md",tags:[],version:"current",sidebarPosition:4,frontMatter:{title:"Pika \u4f18\u5316\u6848\u4f8b",sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"Pika 3.5 \u53c2\u6570\u4f18\u5316\u624b\u518c",permalink:"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika 3.5 \u53c2\u6570\u4f18\u5316\u624b\u518c/"},next:{title:"\u559c\u9a6c\u62c9\u96c5 Redis \u4e0e Pika \u7f13\u5b58\u4f7f\u7528\u519b\u89c4",permalink:"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/\u559c\u9a6c\u62c9\u96c5 Redis \u4e0e Pika \u7f13\u5b58\u4f7f\u7528\u519b\u89c4/"}},c={},d=[];function u(e){return(0,n.jsx)(n.Fragment,{})}function k(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u()}},8453:(e,t,i)=>{i.d(t,{R:()=>r,x:()=>s});var n=i(6540);const o={},a=n.createContext(o);function r(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/bbb97d2b.7b5cadc5.js b/build/assets/js/bbb97d2b.7b5cadc5.js new file mode 100644 index 0000000..7ff419e --- /dev/null +++ b/build/assets/js/bbb97d2b.7b5cadc5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[7381],{6182:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>r,contentTitle:()=>c,default:()=>k,frontMatter:()=>a,metadata:()=>o,toc:()=>d});var t=n(4848),s=n(8453);const a={title:"Pika \u5185\u5b58\u4f7f\u7528",sidebar_position:1},c=void 0,o={id:"\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u5185\u5b58\u4f7f\u7528/index",title:"Pika \u5185\u5b58\u4f7f\u7528",description:"Pika\u5185\u5b58\u5360\u7528",source:"@site/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u5185\u5b58\u4f7f\u7528/index.md",sourceDirName:"\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u5185\u5b58\u4f7f\u7528",slug:"/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u5185\u5b58\u4f7f\u7528/",permalink:"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u5185\u5b58\u4f7f\u7528/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u5185\u5b58\u4f7f\u7528/index.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"Pika \u5185\u5b58\u4f7f\u7528",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"3.2.x \u6027\u80fd",permalink:"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/3.2.x \u6027\u80fd/"},next:{title:"Redis \u4e0e Pika scan \u6027\u80fd\u5bf9\u6bd4",permalink:"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Redis \u4e0e Pika scan \u6027\u80fd\u5bf9\u6bd4/"}},r={},d=[{value:"Pika\u5185\u5b58\u5360\u7528",id:"pika\u5185\u5b58\u5360\u7528",level:3},{value:"1. rocksdb \u5185\u5b58\u5360\u7528",id:"1-rocksdb-\u5185\u5b58\u5360\u7528",level:4},{value:"2. pika \u5185\u5b58\u5360\u7528",id:"2-pika-\u5185\u5b58\u5360\u7528",level:4}];function l(e){const i={a:"a",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.h3,{id:"pika\u5185\u5b58\u5360\u7528",children:"Pika\u5185\u5b58\u5360\u7528"}),"\n",(0,t.jsxs)(i.ol,{children:["\n",(0,t.jsx)(i.li,{children:"rocksdb \u5185\u5b58\u5360\u7528"}),"\n",(0,t.jsx)(i.li,{children:"pika \u5185\u5b58\u5360\u7528(tcmalloc \u5360\u7528)"}),"\n"]}),"\n",(0,t.jsx)(i.h4,{id:"1-rocksdb-\u5185\u5b58\u5360\u7528",children:"1. rocksdb \u5185\u5b58\u5360\u7528"}),"\n",(0,t.jsx)(i.p,{children:"\u547d\u4ee4\u884c\u547d\u4ee4 info data"}),"\n",(0,t.jsx)(i.p,{children:"used_memory_human = db_memtable_usage + db_tablereader_usage"}),"\n",(0,t.jsx)(i.p,{children:"\u76f8\u5e94\u914d\u7f6e\u53ca\u5bf9\u5e94\u5f71\u54cd\u53c2\u6570"}),"\n",(0,t.jsx)(i.p,{children:"write-buffer-size => db_memtable_usage"}),"\n",(0,t.jsx)(i.p,{children:"max-write-buffer-size => db_memtable_usage"}),"\n",(0,t.jsx)(i.p,{children:"max-cache-files => db_tablereader_usage"}),"\n",(0,t.jsx)(i.p,{children:"\u5bf9\u5e94rocksdb\u914d\u7f6e\u89e3\u91ca"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.a,{href:"https://github.com/facebook/rocksdb/wiki/Setup-Options-and-Basic-Tuning",children:"https://github.com/facebook/rocksdb/wiki/Setup-Options-and-Basic-Tuning"})}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.a,{href:"https://github.com/facebook/rocksdb/wiki/Memory-usage-in-RocksDB",children:"https://github.com/facebook/rocksdb/wiki/Memory-usage-in-RocksDB"})}),"\n",(0,t.jsx)(i.h4,{id:"2-pika-\u5185\u5b58\u5360\u7528",children:"2. pika \u5185\u5b58\u5360\u7528"}),"\n",(0,t.jsx)(i.p,{children:"\u5982\u679c\u4f7f\u7528tcmalloc\uff0c\u7edd\u5927\u591a\u6570\u60c5\u51b5\u4e0b\u662ftcmalloc\u6682\u65f6\u5360\u7528\u5185\u5b58\u3002"}),"\n",(0,t.jsx)(i.p,{children:"\u547d\u4ee4\u884c\u547d\u4ee4\uff1atcmalloc stats"}),"\n",(0,t.jsx)(i.p,{children:"\u547d\u4ee4\u884c\u547d\u4ee4\uff1atcmalloc free \u91ca\u653etcmalloc \u5360\u7528\u5185\u5b58"})]})}function k(e={}){const{wrapper:i}={...(0,s.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>c,x:()=>o});var t=n(6540);const s={},a=t.createContext(s);function c(e){const i=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function o(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:c(e.components),t.createElement(a.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/c15d9823.1bfda436.js b/build/assets/js/c15d9823.1bfda436.js new file mode 100644 index 0000000..7af87fc --- /dev/null +++ b/build/assets/js/c15d9823.1bfda436.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[8146],{9328:e=>{e.exports=JSON.parse('{"metadata":{"permalink":"/blog","page":1,"postsPerPage":10,"totalPages":1,"totalCount":8,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/build/assets/js/c3d344d9.92c897fc.js b/build/assets/js/c3d344d9.92c897fc.js new file mode 100644 index 0000000..b56b32d --- /dev/null +++ b/build/assets/js/c3d344d9.92c897fc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[7043],{4630:(n,e,r)=>{r.r(e),r.d(e,{assets:()=>_,contentTitle:()=>a,default:()=>p,frontMatter:()=>s,metadata:()=>o,toc:()=>d});var t=r(4848),i=r(8453);const s={title:"NoSQL \u539f\u7406\u6982\u8ff0",sidebar_position:13},a=void 0,o={id:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/NoSQL \u539f\u7406\u6982\u8ff0/index",title:"NoSQL \u539f\u7406\u6982\u8ff0",description:"pika \u8bbe\u8ba1",source:"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/NoSQL \u539f\u7406\u6982\u8ff0/index.md",sourceDirName:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/NoSQL \u539f\u7406\u6982\u8ff0",slug:"/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/NoSQL \u539f\u7406\u6982\u8ff0/",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/NoSQL \u539f\u7406\u6982\u8ff0/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/NoSQL \u539f\u7406\u6982\u8ff0/index.md",tags:[],version:"current",sidebarPosition:13,frontMatter:{title:"NoSQL \u539f\u7406\u6982\u8ff0",sidebar_position:13},sidebar:"tutorialSidebar",previous:{title:"\u5feb\u7167\u5f0f\u5907\u4efd",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u5feb\u7167\u5f0f\u5907\u4efd/"},next:{title:"\u65e7\u5b58\u50a8\u7ed3\u6784",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65e7\u5b58\u50a8\u7ed3\u6784/"}},_={},d=[{value:"pika \u8bbe\u8ba1",id:"pika-\u8bbe\u8ba1",level:2},{value:"pika \u542f\u52a8\u6d41\u7a0b",id:"pika-\u542f\u52a8\u6d41\u7a0b",level:2},{value:"PikaServer \u529f\u80fd",id:"pikaserver-\u529f\u80fd",level:2},{value:"PikaDispatchThread",id:"pikadispatchthread",level:2},{value:"PikaClientProcessor",id:"pikaclientprocessor",level:3},{value:"\u603b\u7ed3",id:"\u603b\u7ed3",level:2}];function c(n){const e={br:"br",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...n.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(e.h2,{id:"pika-\u8bbe\u8ba1",children:"pika \u8bbe\u8ba1"}),"\n",(0,t.jsx)(e.p,{children:"pika \u5728\u8bbe\u8ba1\u7684\u65f6\u5019\u652f\u6301\u4e86\u4e24\u79cd\u8fd0\u884c\u6a21\u5f0f\uff0c\u5373\u7ecf\u5178\u6a21\u5f0f\u548c\u5206\u5e03\u5f0f\u6a21\u5f0f\u3002"}),"\n",(0,t.jsxs)(e.table,{children:[(0,t.jsx)(e.thead,{children:(0,t.jsxs)(e.tr,{children:[(0,t.jsx)(e.th,{children:"\u6a21\u5f0f"}),(0,t.jsx)(e.th,{children:"\u539f\u7406"})]})}),(0,t.jsxs)(e.tbody,{children:[(0,t.jsxs)(e.tr,{children:[(0,t.jsx)(e.td,{children:"\u7ecf\u5178\u6a21\u5f0f"}),(0,t.jsx)(e.td,{children:"\u5373\u4e00\u4e3b\u591a\u4ece\u6a21\u5f0f\uff0c\u5b89\u88c5 pika \u5b9e\u4f8b\u7ef4\u5ea6\uff0c\u5373 1 \u4e2a pika \u5b9e\u4f8b\u7684\u6570\u636e\u53ef\u4ee5\u88ab\u591a\u4e2a\u4ece\u5b9e\u4f8b\u6570\u636e\u540c\u6b65\u3002"})]}),(0,t.jsxs)(e.tr,{children:[(0,t.jsx)(e.td,{children:"\u5206\u5e03\u5f0f\u6a21\u5f0f"}),(0,t.jsx)(e.td,{children:"\u5373\u7528\u6237\u7684\u6570\u636e\u96c6\u5408\u79f0\u4e3a table\uff0c\u5c06 table \u5207\u5206\u6210\u591a\u4e2a\u5206\u7247\uff0c\u6bcf\u4e2a\u5206\u7247\u79f0\u4e3a slot\uff0c\u5bf9\u4e8e\u67d0\u4e2a key \u7684\u6570\u636e\u662f\u7531\u54c8\u5e0c\u7b97\u6cd5\u8ba1\u7b97\u6765\u51b3\u5b9a\u5c5e\u4e8e\u54ea\u4e2a slot\uff0c\u5c06\u6240\u6709 slots \u53ca\u5176\u526f\u672c\u6309\u7167\u4e00\u5b9a\u7b56\u7565\u5206\u6563\u5230\u6240\u6709\u7684 pika \u5b9e\u4f8b\u4e2d\uff0c\u6bcf\u4e2a pika \u5b9e\u4f8b\u6709\u4e00\u90e8\u5206\u7684\u4e3b slot \u548c\u4e00\u90e8\u5206\u4ece slot\uff0c\u4e3b\u4ece\u7684\u7ef4\u5ea6\u4e3a slot\u3002"})]})]})]}),"\n",(0,t.jsx)(e.p,{children:"\u5b98\u7f51\u539f\u7406\u56fe\u5982\u4e0b"}),"\n",(0,t.jsxs)(e.p,{children:["\u7ecf\u5178\u6a21\u5f0f\n",(0,t.jsx)(e.img,{alt:"alt text",src:r(588).A+"",width:"2404",height:"1232"})]}),"\n",(0,t.jsxs)(e.p,{children:["\u5206\u5e03\u5f0f\u6a21\u5f0f",(0,t.jsx)(e.br,{}),"\n",(0,t.jsx)(e.img,{alt:"alt text",src:r(3570).A+"",width:"2408",height:"1946"})]}),"\n",(0,t.jsx)(e.p,{children:"\u4ece\u539f\u7406\u56fe\u4e2d\uff0c\u4e5f\u53ef\u4ee5\u6e05\u6670\u7684\u770b\u51fa\u7ecf\u5178\u6a21\u5f0f\u4ee5\u5b9e\u4f8b\u4e3a\u7ef4\u5ea6\uff0c\u5206\u5e03\u5f0f\u6a21\u5f0f\u4ee5 slot \u4e3a\u7ef4\u5ea6\u3002"}),"\n",(0,t.jsx)(e.h2,{id:"pika-\u542f\u52a8\u6d41\u7a0b",children:"pika \u542f\u52a8\u6d41\u7a0b"}),"\n",(0,t.jsx)(e.p,{children:"\u57fa\u4e8e pika-3.4.0 \u7248\u672c\u7684\u4ee3\u7801\u7ed3\u6784\uff0c\u5176\u4e2d pika \u5f15\u7528\u4e86\u56db\u4e2a\u7b2c\u4e09\u65b9\u7684\u5e93\uff0c\u5206\u522b\u5982\u4e0b\uff1a"}),"\n",(0,t.jsxs)(e.ol,{children:["\n",(0,t.jsx)(e.li,{children:"Blackwidow\uff0c\u7531 piak \u81ea\u884c\u7ef4\u62a4\u7684\u57fa\u4e8e rocksdb \u7684\u5b58\u50a8\u7ba1\u7406\uff0c\u6240\u6709 pika \u7684\u6570\u636e\u64cd\u4f5c\u90fd\u4f1a\u901a\u8fc7 blackwidow \u7684\u5c01\u88c5\u6700\u7ec8\u843d\u5165 rocksdb\u3002"}),"\n",(0,t.jsx)(e.li,{children:"Glog\uff0c\u65e5\u5fd7\u5e93\uff0c\u7528\u4e8e pika \u9879\u76ee\u8f93\u5165\u4e0d\u540c\u7b49\u7ea7\u7684\u65e5\u5fd7\u3002"}),"\n",(0,t.jsx)(e.li,{children:"Pink\uff0c\u7531 pika \u81ea\u884c\u7ef4\u62a4\u7684\u4e8b\u4ef6\u9a71\u52a8\u6846\u67b6\uff0c\u5c01\u88c5\u4e86 redis \u534f\u8bae\u7684\u89e3\u6790\u5206\u53d1\u529f\u80fd\uff0c\u5e76\u63d0\u4f9b\u56de\u8c03\u51fd\u6570\u8fdb\u884c\u5904\u7406\u3002"}),"\n",(0,t.jsx)(e.li,{children:"Slash\uff0c\u4e00\u4e9b\u5904\u7406\u5de5\u5177\u51fd\u6570\uff0c\u4f8b\u5982\u540c\u6b65\u7684\u6216\u8005\u6570\u636e\u7c7b\u578b\u7684\u5de5\u5177\u51fd\u6570\u3002"}),"\n"]}),"\n",(0,t.jsx)(e.p,{children:"\u542f\u52a8\u6d41\u7a0b\u4e2d\u6700\u4e3b\u8981\u7684\u51e0\u4e2a\u51fd\u6570\u5982\u4e0b\uff1a"}),"\n",(0,t.jsx)(e.pre,{children:(0,t.jsx)(e.code,{className:"language-c++",children:'int main(int argc, char *argv[]) {\n ...\n LOG(INFO) << "Server at: " << path;\n g_pika_cmd_table_manager = new PikaCmdTableManager();\n g_pika_server = new PikaServer();\n g_pika_rm = new PikaReplicaManager();\n g_pika_proxy = new PikaProxy();\n\n if (g_pika_conf->daemonize()) {\n close_std();\n }\n\n g_pika_proxy->Start();\n g_pika_rm->Start();\n g_pika_server->Start();\n ...\n}\n\n'})}),"\n",(0,t.jsx)(e.p,{children:"\u5206\u4e3a\u56db\u6b65\uff0c\u5373\u9996\u5148\u521d\u59cb\u5316 cmd \u7684\u547d\u4ee4\uff0c\u7136\u540e\u521d\u59cb\u5316 PikaServer\uff0c\u63a5\u7740\u521d\u59cb\u5316 PikaReplicaManager\uff0c\u6700\u540e\u521d\u59cb\u5316 PikaProxy\uff0c\u4e3b\u8981\u7684\u542f\u52a8\u51fd\u6570\u5c31\u662f\u5982\u4e0a\u51e0\u6b65\uff0c\u63a5\u7740\u5c31\u7ee7\u7eed\u5206\u6790\u4e00\u4e0b\u3002"}),"\n",(0,t.jsx)(e.h2,{id:"pikaserver-\u529f\u80fd",children:"PikaServer \u529f\u80fd"}),"\n",(0,t.jsx)(e.pre,{children:(0,t.jsx)(e.code,{className:"language-c++",children:'PikaServer::PikaServer() :\n exit_(false),\n slot_state_(INFREE),\n have_scheduled_crontask_(false),\n last_check_compact_time_({0, 0}),\n master_ip_(""),\n master_port_(0),\n repl_state_(PIKA_REPL_NO_CONNECT),\n role_(PIKA_ROLE_SINGLE),\n last_meta_sync_timestamp_(0),\n first_meta_sync_(false),\n loop_partition_state_machine_(false),\n force_full_sync_(false),\n slowlog_entry_id_(0) {\n\n //Init server ip host\n if (!ServerInit()) { // \u521d\u59cb\u5316\u76d1\u542c\u7684\u7aef\u53e3\u548cIP\n LOG(FATAL) << "ServerInit iotcl error";\n }\n\n ...\n InitBlackwidowOptions(); // \u521d\u59cb\u5316Blackwidow\u7684\u53c2\u6570\u9879\uff0c\u4e3b\u8981\u914d\u7f6erocksdb\u7684\u76f8\u5173\u53c2\u6570\n\t...\n\n // Create thread \u6839\u636e\u914d\u7f6e\u6765\u67e5\u770b\u6709\u591a\u5c11\u7684\u5de5\u4f5c\u7ebf\u7a0b\u6570\n worker_num_ = std::min(g_pika_conf->thread_num(),\n PIKA_MAX_WORKER_THREAD_NUM);\n\n std::set<std::string> ips;\n if (g_pika_conf->network_interface().empty()) {\n ips.insert("0.0.0.0");\n } else {\n ips.insert("127.0.0.1");\n ips.insert(host_);\n }\n // We estimate the queue size \u83b7\u53d6\u5904\u7406\u7684\u961f\u5217\u7684\u5927\u5c0f\n int worker_queue_limit = g_pika_conf->maxclients() / worker_num_ + 100;\n LOG(INFO) << "Worker queue limit is " << worker_queue_limit;\n pika_dispatch_thread_ = new PikaDispatchThread(ips, port_, worker_num_, 3000,\n worker_queue_limit, g_pika_conf->max_conn_rbuf_size()); // \u8bbe\u7f6e\u5904\u7406\u54cd\u5e94\u8bf7\u6c42\u7684\u7ebf\u7a0b\u6c60\n pika_monitor_thread_ = new PikaMonitorThread(); // \u76d1\u63a7\u7684\u7ebf\u7a0b\u6c60\n pika_rsync_service_ = new PikaRsyncService(g_pika_conf->db_sync_path(),\n g_pika_conf->port() + kPortShiftRSync); // \u540c\u6b65\u7684\u7ebf\u7a0b\u6c60\n pika_pubsub_thread_ = new pink::PubSubThread(); // \u8ba2\u9605\u53d1\u5e03\u5904\u7406\u7ebf\u7a0b\n pika_auxiliary_thread_ = new PikaAuxiliaryThread(); // \u5fc3\u8df3\u8f85\u52a9\u7684\u72b6\u6001\u6539\u53d8\u5904\u7406\u7ebf\u7a0b\n\n pika_client_processor_ = new PikaClientProcessor(g_pika_conf->thread_pool_size(), 100000); // \u5904\u7406\u5f02\u6b65\u7684task\n\n pthread_rwlock_init(&state_protector_, NULL);\n pthread_rwlock_init(&slowlog_protector_, NULL);\n}\n'})}),"\n",(0,t.jsx)(e.p,{children:"\u8fd9\u5176\u4e2d\u521d\u59cb\u5316\u4e86\u5927\u91cf\u7684\u5de5\u4f5c\u7ebf\u7a0b\uff0c\u6765\u542f\u52a8\u534f\u540c\u5904\u7406\u5206\u522b\u542f\u52a8\u4e86 6 \u4e2a\u4e0d\u540c\u7684\u7ebf\u7a0b\u6c60\u6216\u8005\u7ebf\u7a0b\u6765\u8fdb\u884c\u4e0d\u540c\u7684\u5904\u7406\u5de5\u4f5c\u3002"}),"\n",(0,t.jsx)(e.h2,{id:"pikadispatchthread",children:"PikaDispatchThread"}),"\n",(0,t.jsx)(e.pre,{children:(0,t.jsx)(e.code,{className:"language-c++",children:'PikaDispatchThread::PikaDispatchThread(std::set<std::string> &ips, int port, int work_num,\n int cron_interval, int queue_limit, int max_conn_rbuf_size)\n : conn_factory_(max_conn_rbuf_size),\n handles_(this) {\n thread_rep_ = pink::NewDispatchThread(ips, port, work_num, &conn_factory_,\n cron_interval, queue_limit, &handles_);\n thread_rep_->set_thread_name("Dispatcher");\n}\n\n...\nprivate:\n class ClientConnFactory : public pink::ConnFactory {\n public:\n explicit ClientConnFactory(int max_conn_rbuf_size)\n : max_conn_rbuf_size_(max_conn_rbuf_size) {\n }\n virtual std::shared_ptr<pink::PinkConn> NewPinkConn(\n int connfd,\n const std::string &ip_port,\n pink::Thread* server_thread,\n void* worker_specific_data,\n pink::PinkEpoll* pink_epoll) const {\n return std::static_pointer_cast<pink::PinkConn>\n (std::make_shared<PikaClientConn>(connfd, ip_port, server_thread, pink_epoll, pink::HandleType::kAsynchronous, max_conn_rbuf_size_));\n }\n private:\n int max_conn_rbuf_size_;\n ...\n\n\t...\n extern ServerThread *NewDispatchThread(\n const std::set<std::string>& ips, int port,\n int work_num, ConnFactory* conn_factory,\n int cron_interval, int queue_limit,\n const ServerHandle* handle) {\n return new DispatchThread(ips, port, work_num, conn_factory,\n cron_interval, queue_limit, handle);\n ...\n\n ...\n DispatchThread::DispatchThread(const std::set<std::string>& ips, int port,\n int work_num, ConnFactory* conn_factory,\n int cron_interval, int queue_limit,\n const ServerHandle* handle)\n : ServerThread::ServerThread(ips, port, cron_interval, handle),\n last_thread_(0),\n work_num_(work_num),\n queue_limit_(queue_limit) {\n worker_thread_ = new WorkerThread*[work_num_];\n for (int i = 0; i < work_num_; i++) {\n worker_thread_[i] = new WorkerThread(conn_factory, this, queue_limit, cron_interval); // \u751f\u6210\u591a\u4e2a\u5de5\u4f5c\u7ebf\u7a0b\uff0c\u5de5\u4f5c\u7ebf\u7a0b\u8fdb\u6765\u7684\u8bf7\u6c42\u901a\u8fc7conn_factory\u6765\u8fdb\u884c\u5904\u7406\n }\n}\n\nDispatchThread::~DispatchThread() {\n for (int i = 0; i < work_num_; i++) {\n delete worker_thread_[i];\n }\n delete[] worker_thread_;\n}\n\nint DispatchThread::StartThread() {\n for (int i = 0; i < work_num_; i++) { // \u6839\u636e\u8bbe\u7f6e\u7684\u5de5\u4f5c\u7ebf\u7a0b\u7684\u6570\u91cf\u6765\u8fdb\u884c\u5904\u7406\n int ret = handle_->CreateWorkerSpecificData(\n &(worker_thread_[i]->private_data_));\n if (ret != 0) {\n return ret;\n }\n\n if (!thread_name().empty()) {\n worker_thread_[i]->set_thread_name("WorkerThread");\n }\n ret = worker_thread_[i]->StartThread(); // \u5f00\u542f\u6bcf\u4e00\u4e2a\u5de5\u4f5c\u7ebf\u7a0b\n if (ret != 0) {\n return ret;\n }\n }\n return ServerThread::StartThread();\n}\n...\n'})}),"\n",(0,t.jsx)(e.p,{children:"\u6b64\u65f6\u4f1a\u4f7f\u7528 PikaDispatchThread \u7684\u5de5\u5382\u65b9\u6cd5\u6765\u5904\u7406\u65b0\u63a5\u5165\u7684\u8fde\u63a5\uff0c\u5e76\u4e14\u6bcf\u4e00\u4e2a\u65b0\u8fdb\u6765\u7684\u8bf7\u6c42\u901a\u8fc7 NewPinkConn \u6765\u8fdb\u884c\u521d\u59cb\u5316\uff0c\u5e76\u63a5\u5165\u5904\u7406\u3002\u5176\u4e2d DispatchThread \u5c31\u662f\u4f4d\u4e8e pink \u7684\u5e93\u4e2d\u5b9e\u73b0\u7684\u65b9\u6cd5\u5176\u4e2d ServerThread \u673a\u4f1a\u5728\u521d\u59cb\u5316\u7684\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u7aef\u53e3 IP \u7684\u76d1\u542c\uff0c\u5728\u4e8b\u4ef6\u54cd\u5e94\u4e4b\u540e\u5c31\u4f1a\u8c03\u7528 HandleNewConn \u65b9\u6cd5\u6765\u5904\u7406\u65b0\u52a0\u5165\u7684\u8fde\u63a5\u4fe1\u606f\uff0c\u4f1a\u5728\u5904\u7406\u7684\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u4e00\u4e2a\u8f6e\u8bad\u7684\u64cd\u4f5c\u6765\u5206\u914d\u5230\u5de5\u4f5c\u7ebf\u7a0b\uff0c\u5728\u52a0\u5165\u4e8b\u4ef6\u4e4b\u540e\u5c31\u4f1a\u901a\u8fc7\u65b0\u751f\u6210\u4e00\u4e2a PikaClientConn \u6765\u8fdb\u884c\u4e8b\u4ef6\u5904\u7406\uff0c\u5f53 pink \u4e2d\u7684 redisconn \u89e3\u6790\u5230\u4e86\u5b8c\u6574\u7684\u547d\u4ee4\u7684\u65f6\u5019\u5c31\u4f1a\u8c03\u7528 PikaClientConn \u7684 ProcessRedisCmds \u65b9\u6cd5\u6765\u5904\u7406\uff08\u4e2d\u95f4\u7684\u903b\u8f91\u6709\u70b9\u590d\u6742\u5927\u5bb6\u6709\u5174\u8da3\u53ef\u4ee5\u81ea\u884c\u67e5\u627e\u6e90\u7801\u9605\u8bfb\u4e00\u4e0b\uff09\u3002"}),"\n",(0,t.jsx)(e.pre,{children:(0,t.jsx)(e.code,{className:"language-c++",children:'void PikaClientConn::ProcessRedisCmds(const std::vector<pink::RedisCmdArgsType>& argvs, bool async, std::string* response) {\n if (async) { // \u662f\u5426\u662f\u540e\u53f0\u4efb\u52a1\n BgTaskArg* arg = new BgTaskArg(); // \u65b0\u5efa\u4e00\u4e2a\u540e\u53f0\u4efb\u52a1\n arg->redis_cmds = argvs;\n arg->conn_ptr = std::dynamic_pointer_cast<PikaClientConn>(shared_from_this());\n g_pika_server->ScheduleClientPool(&DoBackgroundTask, arg); // \u653e\u5165PikaClientProcessor\u7684\u7ebf\u7a0b\u6c60\u6765\u8fdb\u884c\u5904\u7406\n return;\n }\n BatchExecRedisCmd(argvs); // \u5982\u679c\u4e0d\u662f\u5219\u8c03\u7528\u54cd\u5e94\u7684\u7ebf\u7a0b\u6c60\u76f4\u63a5\u5904\u7406\n}\n\n...\nvoid PikaClientConn::BatchExecRedisCmd(const std::vector<pink::RedisCmdArgsType>& argvs) {\n resp_num.store(argvs.size());\n for (size_t i = 0; i < argvs.size(); ++i) { // \u6839\u636e\u89e3\u6790\u7684\u8f93\u5165\u53c2\u6570\u5927\u5c0f\u6765\u5904\u7406\n std::shared_ptr<std::string> resp_ptr = std::make_shared<std::string>();\n resp_array.push_back(resp_ptr);\n ExecRedisCmd(argvs[i], resp_ptr); // \u5904\u7406\u5bf9\u5e94\u7684\u547d\u4ee4\n }\n TryWriteResp();\n}\n...\nvoid PikaClientConn::ExecRedisCmd(const PikaCmdArgsType& argv, std::shared_ptr<std::string> resp_ptr) {\n // get opt\n std::string opt = argv[0];\n slash::StringToLower(opt);\n if (opt == kClusterPrefix) { // \u68c0\u67e5\u662f\u5426\u662f\u96c6\u7fa4\u540d\u79f0\u5f00\u5934\n if (argv.size() >= 2 ) {\n opt += argv[1];\n slash::StringToLower(opt);\n }\n }\n\n std::shared_ptr<Cmd> cmd_ptr = DoCmd(argv, opt, resp_ptr); // \u6267\u884c\u547d\u4ee4\n // level == 0 or (cmd error) or (is_read)\n if (g_pika_conf->consensus_level() == 0 || !cmd_ptr->res().ok() || !cmd_ptr->is_write()) {\n *resp_ptr = std::move(cmd_ptr->res().message());\n resp_num--;\n }\n}\n...\n\nstd::shared_ptr<Cmd> PikaClientConn::DoCmd(\n const PikaCmdArgsType& argv,\n const std::string& opt,\n std::shared_ptr<std::string> resp_ptr) {\n // Get command info\n std::shared_ptr<Cmd> c_ptr = g_pika_cmd_table_manager->GetCmd(opt); // \u4ece\u547d\u4ee4\u5217\u8868\u4e2d\u67e5\u627e\u547d\u4ee4\n if (!c_ptr) {\n std::shared_ptr<Cmd> tmp_ptr = std::make_shared<DummyCmd>(DummyCmd());\n tmp_ptr->res().SetRes(CmdRes::kErrOther,\n "unknown or unsupported command \\\'" + opt + "\\"");\n return tmp_ptr;\n }\n c_ptr->SetConn(std::dynamic_pointer_cast<PikaClientConn>(shared_from_this()));\n c_ptr->SetResp(resp_ptr);\n\n // Check authed\n // AuthCmd will set stat_\n if (!auth_stat_.IsAuthed(c_ptr)) { // \u68c0\u67e5\u662f\u5426\u8ba4\u8bc1\n c_ptr->res().SetRes(CmdRes::kErrOther, "NOAUTH Authentication required.");\n return c_ptr;\n }\n\n uint64_t start_us = 0;\n if (g_pika_conf->slowlog_slower_than() >= 0) {\n start_us = slash::NowMicros();\n }\n\n bool is_monitoring = g_pika_server->HasMonitorClients(); // \u662f\u5426\u662f\u76d1\u63a7\u7684\u5ba2\u6237\u7aef\n if (is_monitoring) {\n ProcessMonitor(argv);\n }\n\n // Initial\n c_ptr->Initial(argv, current_table_); // \u521d\u59cb\u5316\u547d\u4ee4\u4fe1\u606f\n if (!c_ptr->res().ok()) {\n return c_ptr;\n }\n\n g_pika_server->UpdateQueryNumAndExecCountTable(current_table_, opt, c_ptr->is_write());\n\n // PubSub connection\n // (P)SubscribeCmd will set is_pubsub_\n if (this->IsPubSub()) {\n if (opt != kCmdNameSubscribe &&\n opt != kCmdNameUnSubscribe &&\n opt != kCmdNamePing &&\n opt != kCmdNamePSubscribe &&\n opt != kCmdNamePUnSubscribe) {\n c_ptr->res().SetRes(CmdRes::kErrOther,\n "only (P)SUBSCRIBE / (P)UNSUBSCRIBE / PING / QUIT allowed in this context");\n return c_ptr;\n }\n }\n\n if (g_pika_conf->consensus_level() != 0 && c_ptr->is_write()) {\n c_ptr->SetStage(Cmd::kBinlogStage);\n }\n if (!g_pika_server->IsCommandSupport(opt)) {\n c_ptr->res().SetRes(CmdRes::kErrOther,\n "This command is not supported in current configuration");\n return c_ptr;\n }\n\n if (!g_pika_server->IsTableExist(current_table_)) {\n c_ptr->res().SetRes(CmdRes::kErrOther, "Table not found");\n return c_ptr;\n }\n\n // TODO: Consider special commands, like flushall, flushdb?\n if (c_ptr->is_write()) {\n if (g_pika_server->IsTableBinlogIoError(current_table_)) {\n c_ptr->res().SetRes(CmdRes::kErrOther, "Writing binlog failed, maybe no space left on device");\n return c_ptr;\n }\n std::vector<std::string> cur_key = c_ptr->current_key();\n if (cur_key.empty()) {\n c_ptr->res().SetRes(CmdRes::kErrOther, "Internal ERROR");\n return c_ptr;\n }\n if (g_pika_server->readonly(current_table_, cur_key.front())) {\n c_ptr->res().SetRes(CmdRes::kErrOther, "Server in read-only");\n return c_ptr;\n }\n if (!g_pika_server->ConsensusCheck(current_table_, cur_key.front())) {\n c_ptr->res().SetRes(CmdRes::kErrOther, "Consensus level not match");\n }\n }\n\n // Process Command \u6267\u884c\u547d\u4ee4\n c_ptr->Execute();\n\n if (g_pika_conf->slowlog_slower_than() >= 0) {\n ProcessSlowlog(argv, start_us);\n }\n if (g_pika_conf->consensus_level() != 0 && c_ptr->is_write()) {\n c_ptr->SetStage(Cmd::kExecuteStage);\n }\n\n return c_ptr;\n}\n...\n'})}),"\n",(0,t.jsx)(e.p,{children:"\u901a\u8fc7\u5c42\u5c42\u7684\u8c03\u7528\u5173\u7cfb\u6700\u7ec8\u8c03\u7528\u5230\u4e86 Cmd \u7c7b\u7684 Do \u65b9\u6cd5\uff0c\u4f8b\u5982 SetCmd \u7684\u6267\u884c\u6d41\u7a0b\u5982\u4e0b\uff1a"}),"\n",(0,t.jsx)(e.pre,{children:(0,t.jsx)(e.code,{className:"language-c++",children:"void SetCmd::Do(std::shared_ptr<Partition> partition) {\n rocksdb::Status s;\n int32_t res = 1;\n switch (condition_) {\n case SetCmd::kXX:\n s = partition->db()->Setxx(key_, value_, &res, sec_); // \u901a\u8fc7db\u6765\u8bbe\u7f6ekey\u76f8\u5173\u7684\u4fe1\u606f\n break;\n case SetCmd::kNX:\n s = partition->db()->Setnx(key_, value_, &res, sec_);\n break;\n case SetCmd::kVX:\n s = partition->db()->Setvx(key_, target_, value_, &success_, sec_);\n break;\n case SetCmd::kEXORPX:\n s = partition->db()->Setex(key_, value_, sec_);\n break;\n default:\n s = partition->db()->Set(key_, value_);\n break;\n }\n\n if (s.ok() || s.IsNotFound()) {\n if (condition_ == SetCmd::kVX) {\n res_.AppendInteger(success_);\n } else {\n if (res == 1) {\n res_.SetRes(CmdRes::kOk);\n } else {\n res_.AppendArrayLen(-1);;\n }\n }\n } else {\n res_.SetRes(CmdRes::kErrOther, s.ToString());\n }\n}\n"})}),"\n",(0,t.jsx)(e.p,{children:"\u81f3\u6b64\u5c31\u662f\u901a\u8fc7\u4e00\u4e2a\u7b80\u5355\u7684 set \u547d\u4ee4\u6765\u8fdb\u884c\u7684\u6d41\u7a0b\uff0c\u5f53\u7136\u4e2d\u95f4\u7701\u7565\u4e86\u5f88\u591a\u590d\u6742\u7684\u4ea4\u4e92\u7ec6\u8282\uff0c\u5e76\u4e14\u8df3\u8fc7\u4e86 pink \u5e93\u7684\u4e00\u4e2a\u5904\u7406\u6d41\u7a0b\uff0c\u6700\u7ec8\u4f1a\u56de\u8c03\u5728 pika \u4e2d\u7684 ProcessRedisCmds \u5904\u7406\u3002"}),"\n",(0,t.jsx)(e.h3,{id:"pikaclientprocessor",children:"PikaClientProcessor"}),"\n",(0,t.jsx)(e.pre,{children:(0,t.jsx)(e.code,{className:"language-c++",children:'PikaClientProcessor::PikaClientProcessor(\n size_t worker_num, size_t max_queue_size, const std::string& name_prefix) {\n pool_ = new pink::ThreadPool(\n worker_num, max_queue_size, name_prefix + "Pool"); // \u751f\u6210\u4e00\u4e2a\u7ebf\u7a0b\u6c60\n for (size_t i = 0; i < worker_num; ++i) { \t\t\t// \u6839\u636e\u8bbe\u7f6e\u7684\u7ebf\u7a0b\u6c60\u6570\u91cf\u6765\u521d\u59cb\u5316\n pink::BGThread* bg_thread = new pink::BGThread(max_queue_size); // \u521d\u59cb\u5316bg\u5de5\u4f5c\u7ebf\u7a0b\n bg_threads_.push_back(bg_thread); \t// \u4fdd\u5b58\u6bcf\u4e2a\u7ebf\u7a0b\n bg_thread->set_thread_name(name_prefix + "BgThread");\n }\n}\n'})}),"\n",(0,t.jsx)(e.p,{children:"\u4e3b\u8981\u662f\u751f\u6210\u7ebf\u7a0b\u6c60\u6765\u8fdb\u884c\u540e\u53f0\u8fd0\u884c\u3002\u5728\u4e0a\u4e00\u8282\u4e2d\u5206\u6790\u7684 task \u5c31\u662f\u4ea4\u7ed9\u4e86 pool_\u7ebf\u7a0b\u6c60\u6765\u8fdb\u884c\u6570\u636e\u7684\u5904\u7406\u3002\u4e00\u4e9b\u534f\u8c03\u6570\u636e\u540c\u6b65\u7684\u5de5\u4f5c\u5c31\u4ea4\u7ed9\u4e86 bg_threads \u7ebf\u7a0b\u6c60\u5904\u7406\u3002"}),"\n",(0,t.jsx)(e.p,{children:(0,t.jsx)(e.img,{alt:"alt text",src:r(3305).A+"",width:"1830",height:"1102"})}),"\n",(0,t.jsx)(e.h2,{id:"\u603b\u7ed3",children:"\u603b\u7ed3"}),"\n",(0,t.jsx)(e.p,{children:"\u672c\u6587\u4e3b\u8981\u7b80\u5355\u7684\u63cf\u8ff0\u4e86\u6709\u5173 piak \u7684\u603b\u4f53\u8bbe\u8ba1\u6846\u67b6\uff08\u53c2\u8003\u5b98\u7f51\u67b6\u6784\uff09\uff0c\u7b80\u5355\u7684\u901a\u8fc7 PikaServer \u7684\u542f\u52a8\u8fc7\u7a0b\u6765\u63cf\u8ff0\u4e86\u4e00\u4e0b\u57fa\u7840\u7684\u5904\u7406\u903b\u8f91\uff0c\u56e0\u4e3a\u8fd9\u5176\u4e2d\u6d89\u53ca\u5230\u5927\u91cf\u7684\u7ec6\u8282\u6545\u5e76\u6ca1\u6709\u8be6\u5c3d\u7684\u53bb\u5206\u6790\uff0c\u5e76\u4e14\u4e5f\u6ca1\u6709\u6d89\u53ca\u5230\u5176\u4ed6\u7684\u529f\u80fd\u6bd4\u5982 slot \u7684\u6570\u636e\u4e00\u81f4\u6027\u4fdd\u8bc1\u7b49\u7b49\u7ec6\u8282\uff0c\u540e\u7eed\u6709\u7ee7\u7eed\u518d\u7ee7\u7eed\u67e5\u9605\u76f8\u5173\u5185\u5bb9\u3002\u7531\u4e8e\u672c\u4eba\u624d\u758f\u5b66\u6d45\uff0c\u5982\u6709\u9519\u8bef\u8bf7\u6279\u8bc4\u6307\u6b63\u3002"})]})}function p(n={}){const{wrapper:e}={...(0,i.R)(),...n.components};return e?(0,t.jsx)(e,{...n,children:(0,t.jsx)(c,{...n})}):c(n)}},3570:(n,e,r)=>{r.d(e,{A:()=>t});const t=r.p+"assets/images/image-1-50d7e9a7e987a96739e213f2cc79e3a4.png"},3305:(n,e,r)=>{r.d(e,{A:()=>t});const t=r.p+"assets/images/image-2-7170d56872bf3b1b9f58c4a5d54b6a38.png"},588:(n,e,r)=>{r.d(e,{A:()=>t});const t=r.p+"assets/images/image-390cbcfad0906bae06cd24d4463c1a36.png"},8453:(n,e,r)=>{r.d(e,{R:()=>a,x:()=>o});var t=r(6540);const i={},s=t.createContext(i);function a(n){const e=t.useContext(s);return t.useMemo((function(){return"function"==typeof n?n(e):{...e,...n}}),[e,n])}function o(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(i):n.components||i:a(n.components),t.createElement(s.Provider,{value:e},n.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/c4f5d8e4.af8bc74d.js b/build/assets/js/c4f5d8e4.af8bc74d.js new file mode 100644 index 0000000..26494a5 --- /dev/null +++ b/build/assets/js/c4f5d8e4.af8bc74d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[2634],{6467:(e,i,s)=>{s.r(i),s.d(i,{default:()=>m});var t=s(4164),n=s(8774),r=s(4586),c=s(781),a=s(1107);const l={features:"features_t9lD",featureSvg:"featureSvg_GfXr"};var d=s(4848);const o=[{title:"\u5206\u5e03\u5f0f\u67b6\u6784",description:(0,d.jsx)(d.Fragment,{children:"\u4e3a\u5927\u89c4\u6a21\u6570\u636e\u5b58\u50a8\u800c\u89c4\u5212\uff0c\u652f\u6301\u7ed3\u5408 Proxy \u6620\u5c04\u8f6f\u4ef6\u6784\u5efa\u5206\u5e03\u5f0f\u6570\u636e\u96c6\u7fa4"})},{title:"\u5927\u89c4\u6a21\u6570\u636e\u5b58\u50a8",description:(0,d.jsx)(d.Fragment,{children:"\u652f\u6301TB\u7ea7\u522b\u7684\u9ad8\u6027\u80fd\u6570\u636e\u5b58\u50a8"})},{title:"\u5feb\u901f\u6545\u969c\u8f6c\u79fb",description:(0,d.jsx)(d.Fragment,{children:"\u5728\u5355\u70b9\u6545\u969c\u4ea7\u751f\u4e4b\u65f6\u53ef\u4ee5\u5feb\u901f\u6062\u590d\u670d\u52a1\uff0c\u6700\u5927\u7a0b\u5ea6\u51cf\u5c11\u5bf9\u4e1a\u52a1\u7684\u51b2\u51fb"})},{title:"\u517c\u5bb9 Redis",description:(0,d.jsx)(d.Fragment,{children:"\u7f18\u8d77\u4e8e\u5bf9\u63a5 360 \u5185\u90e8\u7684\u6570\u636e\u5b58\u50a8\u9700\u6c42\uff0c\u5e76\u88ab\u5e94\u7528\u4e8e\u66ff\u6362 360 \u5185\u90e8\u7684 Redis \u670d\u52a1\uff0c\u987a\u5229\u5b9e\u73b0\u8fc1\u79fb"})},{title:"\u793e\u533a\u9a71\u52a8\u53d1\u5c55",description:(0,d.jsx)(d.Fragment,{children:"\u5728\u5f00\u653e\u539f\u5b50\u57fa\u91d1\u4f1a\u6307\u5bfc\u4e0b\u7531\u5f00\u6e90\u793e\u533a\u9a71\u52a8\u9879\u76ee\u6539\u8fdb\uff0c\u5438\u6536\u5916\u90e8\u53cd\u9988\uff0c\u6ee1\u8db3\u884c\u4e1a\u9700\u6c42"})},{title:"\u534f\u8bae\u53cb\u597d",description:(0,d.jsx)(d.Fragment,{children:"\u91c7\u884c BSD \u534f\u8bae\u5f00\u653e\u6e90\u4ee3\u7801\uff0c\u6b22\u8fce\u6839\u636e\u81ea\u8eab\u9700\u8981\u5b9a\u5236 PikiwiDB"})}];function h(e){let{Svg:i,title:s,description:n}=e;return(0,d.jsx)("div",{className:(0,t.A)("col col--4"),children:(0,d.jsxs)("div",{className:"text--center padding-horiz--md",children:[(0,d.jsx)(a.A,{as:"h3",children:s}),(0,d.jsx)("p",{children:n})]})})}function x(){return(0,d.jsx)("section",{className:l.features,children:(0,d.jsx)("div",{className:"container",children:(0,d.jsx)("div",{className:"row",children:o.map(((e,i)=>(0,d.jsx)(h,{...e},i)))})})})}const j={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"};function u(){const{siteConfig:e}=(0,r.A)();return(0,d.jsx)("header",{className:(0,t.A)("hero hero--body",j.heroBanner),children:(0,d.jsxs)("div",{className:"container",children:[(0,d.jsx)(a.A,{as:"h1",className:"hero__title",children:(0,d.jsx)("img",{src:"/img/PikiwiDB-Logo.png"})}),(0,d.jsx)("p",{className:"hero__subtitle",children:e.tagline}),(0,d.jsx)("div",{className:j.buttons,children:(0,d.jsx)(n.A,{className:"button button--secondary button--lg",to:"/docs/\u5e8f\u8a00",children:"\u9605\u8bfb\u6587\u6863"})})]})})}function m(){const{siteConfig:e}=(0,r.A)();return(0,d.jsxs)(c.A,{title:`${e.title}`,description:"PikiwiDB \u662f\u4e00\u6b3e\u652f\u6301\u6301\u4e45\u5316\u5b58\u50a8\u7684\u952e\u503c\u6570\u636e\u5e93",children:[(0,d.jsx)(u,{}),(0,d.jsx)("main",{children:(0,d.jsx)(x,{})})]})}}}]); \ No newline at end of file diff --git a/build/assets/js/c6bc127f.1e31d41b.js b/build/assets/js/c6bc127f.1e31d41b.js new file mode 100644 index 0000000..e00be6a --- /dev/null +++ b/build/assets/js/c6bc127f.1e31d41b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[8183],{9182:(n,e,s)=>{s.r(e),s.d(e,{assets:()=>c,contentTitle:()=>o,default:()=>d,frontMatter:()=>a,metadata:()=>r,toc:()=>p});var i=s(4848),t=s(8453);const a={title:"\u914d\u7f6e\u6587\u4ef6\u8bf4\u660e",sidebar_position:20},o=void 0,r={id:"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u914d\u7f6e\u6587\u4ef6\u8bf4\u660e/index",title:"\u914d\u7f6e\u6587\u4ef6\u8bf4\u660e",description:"",source:"@site/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u914d\u7f6e\u6587\u4ef6\u8bf4\u660e/index.md",sourceDirName:"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u914d\u7f6e\u6587\u4ef6\u8bf4\u660e",slug:"/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u914d\u7f6e\u6587\u4ef6\u8bf4\u660e/",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u914d\u7f6e\u6587\u4ef6\u8bf4\u660e/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u914d\u7f6e\u6587\u4ef6\u8bf4\u660e/index.md",tags:[],version:"current",sidebarPosition:20,frontMatter:{title:"\u914d\u7f6e\u6587\u4ef6\u8bf4\u660e",sidebar_position:20},sidebar:"tutorialSidebar",previous:{title:"\u4f7f\u7528\u4e0e\u8fd0\u7ef4",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/"},next:{title:"page info \u4fe1\u606f\u8bf4\u660e",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/page info \u4fe1\u606f\u8bf4\u660e/"}},c={},p=[];function l(n){const e={code:"code",pre:"pre",...(0,t.R)(),...n.components};return(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-yaml",children:'# pika \u7aef\u53e3\nport : 9221\n\n# pika\u662f\u591a\u7ebf\u7a0b\u7684, \u8be5\u53c2\u6570\u80fd\u591f\u914d\u7f6epika\u7684\u7ebf\u7a0b\u6570\u91cf, \u4e0d\u5efa\u8bae\u914d\u7f6e\u503c\u8d85\u8fc7\u90e8\u7f72\u670d\u52a1\u5668\u7684CPU\u6838\u5fc3\u6570\u91cf \nthread-num : 1\n\n# \u5904\u7406\u547d\u4ee4\u7528\u6237\u8bf7\u6c42\u547d\u4ee4\u7ebf\u7a0b\u6c60\u7684\u5927\u5c0f\nthread-pool-size : 8\n\n# sync \u4e3b\u4ece\u540c\u6b65\u65f6\u5019\u4ece\u5e93\u6267\u884c\u4e3b\u5e93\u4f20\u9012\u8fc7\u6765\u547d\u4ee4\u7684\u7ebf\u7a0b\u6570\u91cf\nsync-thread-num : 6\n\n# sync \u5904\u7406\u7ebf\u7a0b\u7684\u4efb\u52a1\u961f\u5217\u5927\u5c0f, \u4e0d\u5efa\u8bae\u4fee\u6539\nsync-buffer-size : 10\n\n# Pika\u65e5\u5fd7\u76ee\u5f55, \u7528\u4e8e\u5b58\u653eINFO, WARNING, ERROR\u65e5\u5fd7\u4ee5\u53ca\u7528\u4e8e\u540c\u6b65\u7684binlog(write2fine)\u6587\u4ef6\nlog-path : ./log/\n\n# Pika\u6570\u636e\u76ee\u5f55\ndb-path : ./db/\n\n# Pika \u5e95\u5c42\u5355\u4e2arocksdb\u5355\u4e2amemtable\u7684\u5927\u5c0f, \u8bbe\u7f6e\u8d8a\u5927\u5199\u5165\u6027\u80fd\u8d8a\u597d\u4f46\u4f1a\u5728buffer\u5237\u76d8\u65f6\u5e26\u6765\u66f4\u5927\u7684IO\u8d1f\u8f7d, \u8bf7\u4f9d\u636e\u4f7f\u7528\u573a\u666f\u5408\u7406\u914d\u7f6e\n[RocksDb-Tuning-Guide](https://github.com/facebook/rocksdb/wiki/RocksDB-Tuning-Guide)\nwrite-buffer-size : 268435456\n\n# \u5728\u5185\u5b58\u4e2d\u4e3a db \u4e2d\u7684\u4e00\u4e2a\u5217\u65cf\u5efa\u7acb\u7684\u5199\u5165\u7f13\u51b2\u533a memtables \u7684\u6700\u5927\u6570\u91cf,\u9ed8\u8ba4\u548c\u6700\u5c0f\u6570\u91cf\u4e3a 2 \n# \u5982\u679c\u8fd9\u4e2a\u914d\u7f6e\u8d85\u8fc73\uff0c\u5199\u5165\u7684\u6027\u80fd\u4f1a\u53d8\u6162\nmax-write-buffer-num: 2\n\n# Pika \u7684\u8fde\u63a5\u8d85\u65f6\u65f6\u95f4\u914d\u7f6e, \u5355\u4f4d\u4e3a\u79d2, \u5f53\u8fde\u63a5\u65e0\u8bf7\u6c42\u65f6(\u8fdb\u5165sleep\u72b6\u6001)\u5f00\u59cb\u4ece\u914d\u7f6e\u65f6\u95f4\u5012\u8ba1\u65f6, \u5f53\u5012\u8ba1\u65f6\u4e3a0\u65f6pika\u5c06\u5f3a\u884c\n# \u65ad\u5f00\u8be5\u8fde\u63a5, \u53ef\u4ee5\u901a\u8fc7\u5408\u7406\u914d\u7f6e\u8be5\u53c2\u6570\u907f\u514d\u53ef\u80fd\u51fa\u73b0\u7684pika\u8fde\u63a5\u6570\u7528\u5c3d\u95ee\u9898, \u8be5\u53c2\u6570\u9ed8\u8ba4\u503c\u4e3a60\ntimeout : 60\n\n# \u5bc6\u7801\u7ba1\u7406\u5458\u5bc6\u7801, \u9ed8\u8ba4\u4e3a\u7a7a, \u5982\u679c\u8be5\u53c2\u6570\u4e0e\u4e0b\u65b9\u7684userpass\u53c2\u6570\u76f8\u540c(\u5305\u62ec\u540c\u65f6\u4e3a\u7a7a), \u5219userpass\u53c2\u6570\u5c06\u81ea\u52a8\u5931\u6548, \u6240\u6709\u7528\u6237\u5747\u4e3a\n# \u7ba1\u7406\u5458\u8eab\u4efd\u4e0d\u53d7userblacklist\u53c2\u6570\u7684\u9650\u5236\nrequirepass : password\n\n# \u540c\u6b65\u9a8c\u8bc1\u5bc6\u7801, \u7528\u4e8eslave(\u4ece\u5e93)\u8fde\u63a5master(\u4e3b\u5e93)\u8bf7\u6c42\u540c\u6b65\u65f6\u8fdb\u884c\u9a8c\u8bc1, \u8be5\u53c2\u6570\u9700\u8981\u4e0emaster(\u4e3b\u5e93)\u7684requirepass\u4e00\u81f4\nmasterauth :\n\n# \u7528\u6237\u5bc6\u7801, \u9ed8\u8ba4\u4e3a\u7a7a, \u5982\u679c\u8be5\u53c2\u6570\u4e0e\u4e0a\u65b9\u7684userpass\u53c2\u6570\u76f8\u540c(\u5305\u62ec\u540c\u65f6\u4e3a\u7a7a), \u5219\u672c\u53c2\u6570\u5c06\u81ea\u52a8\u5931\u6548, \u6240\u6709\u7528\u6237\u5747\u4e3a\u7ba1\u7406\u5458\u8eab\u4efd\u4e0d\n# \u53d7userblacklist\u53c2\u6570\u7684\u9650\u5236\nuserpass : userpass\n \n# \u6307\u4ee4\u9ed1\u540d\u5355, \u80fd\u591f\u9650\u5236\u901a\u8fc7userpass\u767b\u5f55\u7684\u7528\u6237, \u8fd9\u4e9b\u7528\u6237\u5c06\u4e0d\u80fd\u4f7f\u7528\u9ed1\u540d\u5355\u4e2d\u7684\u6307\u4ee4, \u6307\u4ee4\u4e4b\u95f4\u4f7f\u7528","\u9694\u5f00, \u9ed8\u8ba4\u4e3a\u7a7a\n# \u5efa\u8bae\u5c06\u9ad8\u98ce\u9669\u547d\u4ee4\u914d\u7f6e\u5728\u8be5\u53c2\u6570\u4e2d\nuserblacklist : FLUSHALL, SHUTDOWN, KEYS, CONFIG\n\n# \u5206\u4e3a\u7ecf\u5178\u6a21\u5f0f\u548c\u5206\u7247\u6a21\u5f0f\uff0c[classic | sharding]\uff0c\u7ecf\u5178\u6a21\u5f0f\u4e2d\u652f\u6301\u591adb\u7684\u914d\u7f6e\ninstance-mode : classic\n\n# \u7ecf\u5178\u6a21\u5f0f\u4e0b\u4e0b\u6307\u5b9adb\u7684\u6570\u91cf\uff0c\u4f7f\u7528\u65b9\u5f0f\u548credis\u4e00\u81f4\ndatabases : 1\n\n# \u5206\u7247\u6a21\u5f0f\u4e0b\u6bcf\u4e00\u4e2atable\u4e2d\u9ed8\u8ba4\u7684slot\u6570\u91cf\ndefault-slot-num\uff1a16\n\n# \u5b9a\u4e49\u4e00\u4e2a\u526f\u672c\u7ec4\u53c8\u591a\u5c11\u4e2a\u4ece\u526f\u672c\uff0c\u76ee\u524d\u652f\u6301\u7684\u914d\u7f6e\u9009\u9879\u8303\u56f4[0, 1, 2, 3, 4], 0\u4ee3\u8868\u4e0d\u5f00\u542f\u6b64\u529f\u80fd\nreplication-num : 0\n\n# \u5b9a\u4e49\u5728\u8fd4\u56de\u5ba2\u6237\u7aef\u4e4b\u524d\u4e3b\u526f\u672c\u6536\u5230\u591a\u5c11\u4e2a\u4ece\u526f\u672c\u7684ACK\u53cd\u9988\u4fe1\u606f\u3002\u76ee\u524d\u53ef\u4ee5\u914d\u7f6e\u7684\u9009\u9879\u8303\u56f4[0, ...replicaiton-num]\uff0c0\u4ee3\u8868\u4e0d\u5f00\u542f\u6b64\u529f\u80fd\u3002\nconsensus-level : 0\n\n# Pika\u7684dump\u6587\u4ef6\u540d\u79f0\u524d\u7f00, bgsave\u540e\u751f\u6210\u7684\u6587\u4ef6\u5c06\u4ee5\u8be5\u524d\u7f00\u547d\u540d\ndump-prefix : backup-\n \n# \u5b88\u62a4\u8fdb\u7a0b\u6a21\u5f0f [yes | no]\ndaemonize : yes\n \n# slotmigrate [yes | no], pika3.0.0\u6682\u4e0d\u652f\u6301\u8be5\u53c2\u6570\n#slotmigrate : no\n\n# Pika dump\u76ee\u5f55\u8bbe\u7f6e, bgsave\u540e\u751f\u6210\u7684\u6587\u4ef6\u5c06\u5b58\u653e\u5728\u8be5\u76ee\u5f55\u4e2d\ndump-path : /data1/pika9001/dump/\n\n# dump\u76ee\u5f55\u8fc7\u671f\u65f6\u95f4, \u5355\u4f4d\u4e3a\u5929, \u9ed8\u8ba4\u4e3a0\u5373\u6c38\u4e0d\u8fc7\u671f\ndump-expire: 0\n\n# pidfile Path pid\u6587\u4ef6\u76ee\u5f55\npidfile : /data1/pika9001/pid/9001.pid\n \n# pika\u6700\u5927\u8fde\u63a5\u6570\u914d\u7f6e\u53c2\u6570\nmaxclients : 20000\n \n# rocks-db\u7684sst\u6587\u4ef6\u4f53\u79ef, sst\u6587\u4ef6\u662f\u5c42\u7ea7\u7684, \u6587\u4ef6\u8d8a\u5c0f, \u901f\u5ea6\u8d8a\u5feb, \u5408\u5e76\u4ee3\u4ef7\u8d8a\u4f4e, \u4f46\u6587\u4ef6\u6570\u91cf\u5c31\u4f1a\u8d85\u591a, \u800c\u6587\u4ef6\u8d8a\u5927, \u901f\u5ea6\u76f8\u5bf9\u53d8\u6162, \u5408\u5e76\u4ee3\u4ef7\u5927, \u4f46\u6587\u4ef6\u6570\u91cf\u4f1a\u5f88\u5c11, \u9ed8\u8ba4\u662f 20M\ntarget-file-size-base : 20971520\n\n# binlog(write2file)\u6587\u4ef6\u4fdd\u7559\u65f6\u95f4, 7\u5929, \u6700\u5c0f\u4e3a1, \u8d85\u8fc77\u5929\u7684\u6587\u4ef6\u4f1a\u88ab\u81ea\u52a8\u6e05\u7406\nexpire-logs-days : 7\n \n# binlog(write2file)\u6587\u4ef6\u6700\u5927\u6570\u91cf, 200\u4e2a, \u6700\u5c0f\u4e3a10, \u8d85\u8fc7200\u4e2a\u5c31\u5f00\u59cb\u81ea\u52a8\u6e05\u7406, \u59cb\u7ec8\u4fdd\u7559200\u4e2a\nexpire-logs-nums : 200\n \n# root\u7528\u6237\u8fde\u63a5\u4fdd\u8bc1\u6570\u91cf\uff1a2\u4e2a, \u5373\u65f6Max Connection\u7528\u5b8c, \u8be5\u53c2\u6570\u4e5f\u80fd\u786e\u4fdd\u672c\u5730\uff08127.0.0.1\uff09\u67092\u4e2a\u8fde\u63a5\u53ef\u4ee5\u540c\u6765\u767b\u9646pika\nroot-connection-num : 2\n \n# \u6162\u65e5\u5fd7\u8bb0\u5f55\u65f6\u95f4, \u5355\u4f4d\u4e3a\u5fae\u79d2, pika\u7684\u6162\u65e5\u5fd7\u8bb0\u5f55\u5728pika-ERROR.log\u4e2d, pika\u6ca1\u6709\u7c7b\u4f3credis slow log\u7684\u6162\u65e5\u5fd7\u63d0\u53d6api\nslowlog-log-slower-than : 10000\n\n# slave\u662f\u5426\u662f\u53ea\u8bfb\u72b6\u6001(yes/no, 1/0)\n# slave-read-only : 0\n\n# Pika db \u540c\u6b65\u8def\u5f84\u914d\u7f6e\u53c2\u6570\ndb-sync-path : ./dbsync/\n\n# \u8be5\u53c2\u6570\u80fd\u591f\u63a7\u5236\u5168\u91cf\u540c\u6b65\u65f6\u7684\u4f20\u8f93\u901f\u5ea6, \u5408\u7406\u914d\u7f6e\u8be5\u53c2\u6570\u80fd\u591f\u907f\u514d\u7f51\u5361\u88ab\u7528\u5c3d, \u8be5\u53c2\u6570\u8303\u56f4\u4e3a1~1024, \u610f\u4e3a:1MB/s~1024MB/s\uff0c\u5f53\u8be5\u53c2\u6570\n# \u88ab\u914d\u7f6e\u4e3a\u5c0f\u4e8e0\u6216\u5927\u4e8e1024\u65f6, \u8be5\u53c2\u6570\u4f1a\u88ab\u81ea\u52a8\u914d\u7f6e\u4e3a1024\ndb-sync-speed : -1 (1024MB/s)\n\n# \u6307\u5b9a\u7f51\u5361\n# network-interface : eth1\n\n# \u540c\u6b65\u53c2\u6570\u914d\u7f6e, \u9002\u7528\u4e8e\u4ece\u5e93\u8282\u70b9(slave), \u8be5\u53c2\u6570\u683c\u5f0f\u4e3aip:port, \u4f8b\u5982192.168.1.2:6666, \u542f\u52a8\u540e\u8be5\u793a\u4f8b\u4f1a\u81ea\u52a8\u5411192.168.1.2\u7684\n# 6666\u7aef\u53e3\u53d1\u9001\u540c\u6b65\u8bf7\u6c42\n# slaveof : master-ip:master-port\n\n# \u914d\u7f6e\u53cc\u4e3b\u6216Hub\u9700\u8981\u7684server id, \u4e0d\u4f7f\u7528\u53cc\u4e3b\u6216Hub\u8bf7\u5ffd\u7565\u8be5\u53c2\u6570\nserver-id : 1\n\n# \u53cc\u4e3b\u914d\u7f6e, \u4e0d\u4f7f\u7528\u53cc\u4e3b\u8bf7\u5ffd\u7565\u4ee5\u4e0b\u914d\u7f6e\ndouble-master-ip :\t\u53cc\u4e3b\u5bf9\u7aefIp\ndouble-master-port :\t\u53cc\u4e3b\u5bf9\u7aefPort\ndouble-master-server-id :\t\u53cc\u4e3b\u5bf9\u7aefserver id\n \n# \u81ea\u52a8\u5168\u91cfcompact, \u901a\u8fc7\u914d\u7f6e\u7684\u53c2\u6570\u6bcf\u5929\u5b9a\u65f6\u89e6\u53d1\u4e00\u6b21\u81ea\u52a8\u5168\u91cfcompact, \u7279\u522b\u9002\u5408\u5b58\u5728\u591a\u6570\u636e\u7ed3\u6784\u5927\u91cf\u8fc7\u671f\u3001\u5220\u9664\u3001key\u540d\u79f0\u590d\u7528\u7684\u573a\u666f\n# \u53c2\u6570\u683c\u5f0f\u4e3a:"\u542f\u52a8\u65f6\u95f4(\u5c0f\u65f6)-\u7ed3\u675f\u65f6\u95f4(\u5c0f\u65f6)/\u78c1\u76d8\u7a7a\u4f59\u7a7a\u95f4\u767e\u5206\u6bd4", \u4f8b\u5982\u4f60\u9700\u8981\u914d\u7f6e\u4e00\u4e2a\u6bcf\u5929\u5728\u51cc\u66683\u70b9~4\u70b9\u4e4b\u95f4\u81ea\u52a8compact\u7684\u4efb\u52a1\n# \u540c\u65f6\u8be5\u4efb\u52a1\u4ec5\u4ec5\u5728\u78c1\u76d8\u7a7a\u4f59\u7a7a\u95f4\u4e0d\u4f4e\u4e8e30%\u7684\u65f6\u5019\u6267\u884c, \u90a3\u4e48\u5e94\u914d\u7f6e\u4e3a:03-04/30, \u8be5\u53c2\u6570\u9ed8\u8ba4\u4e3a\u7a7a\ncompact-cron : \n\n# \u81ea\u52a8\u5168\u91cfcompact, \u8be5\u53c2\u4e0e\u4e0ecompact-cron\u7684\u533a\u522b\u4e3a, compact-cron\u6bcf\u5929\u4ec5\u5728\u6307\u5b9a\u65f6\u95f4\u6bb5\u6267\u884c, \u800ccompact-interval\u5219\u4ee5\u914d\u7f6e\u65f6\u95f4\u4e3a\u5468\u671f\n# \u5faa\u73af\u6267\u884c, \u4f8b\u5982\u4f60\u9700\u8981\u914d\u7f6e\u4e00\u4e2a\u6bcf4\u5c0f\u65f6\u6267\u884c\u4e00\u6b21\u7684\u81ea\u52a8compact\u4efb\u52a1, \u540c\u65f6\u8be5\u4efb\u52a1\u4ec5\u4ec5\u5728\u78c1\u76d8\u7a7a\u4f59\u7a7a\u95f4\u4e0d\u4f4e\u4e8e30%\u7684\u65f6\u5019\u6267\u884c, \u90a3\u4e48\u8be5\u53c2\n# \u6570\u5e94\u914d\u7f6e\u4e3a:4/30, \u8be5\u53c2\u6570\u9ed8\u8ba4\u4e3a\u7a7a\ncompact-interval :\n\n# \u4ece\u5e93\u5b9e\u4f8b\u6743\u91cd\u8bbe\u7f6e, \u4ec5\u914d\u5408\u54e8\u5175\u4f7f\u7528,\u65e0\u5176\u5b83\u529f\u80fd, \u6743\u91cd\u4f4e\u7684slave\u4f1a\u4f18\u5148\u9009\u4e3e\u4e3a\u4e3b\u5e93, \u8be5\u53c2\u6570\u9ed8\u8ba4\u4e3a0(\u4e0d\u53c2\u4e0e\u9009\u4e3e)\nslave-priority : \n\n# \u8be5\u53c2\u6570\u4ec5\u9002\u7528\u4e8epika\u8de8\u7248\u672c\u540c\u6b65\u65f6\u4e0d\u540c\u7248\u672c\u7684binlog\u80fd\u591f\u517c\u5bb9\u5e76\u6210\u529f\u89e3\u6790, \u8be5\u53c2\u6570\u53ef\u914d\u7f6e\u4e3a[new | old]\n# \u5f53\u8be5\u53c2\u6570\u88ab\u914d\u7f6e\u4e3anew\u65f6, \u8be5\u5b9e\u4f8b\u4ec5\u80fd\u4f5c\u4e3a3.0.0\u53ca\u4ee5\u4e0a\u7248\u672cpika\u7684\u4ece\u5e93, \u4e0epika2.3.3~2.3.5\u4e0d\u517c\u5bb9\n# \u5f53\u8be5\u53c2\u6570\u88ab\u914d\u7f6e\u4e3aold\u65f6, \u8be5\u65f6\u5019\u4ec5\u80fd\u4f5c\u4e3a2.3.3~2.3.5\u7248\u672cpika\u7684\u4ece\u5e93, \u4e0epika3.0.0\u53ca\u4ee5\u4e0a\u7248\u672c\u4e0d\u517c\u5bb9\n# \u8be5\u53c2\u6570\u9ed8\u8ba4\u503c\u4e3anew, \u8be5\u53c2\u6570\u53ef\u5728\u6ca1\u6709\u914d\u7f6e\u540c\u6b65\u5173\u7cfb\u7684\u65f6\u5019\u901a\u8fc7config set\u52a8\u6001\u8c03\u6574, \u4e00\u65e6\u914d\u7f6e\u4e86\u540c\u6b65\u5173\u7cfb\u5219\u4e0d\u53ef\u52a8\u6001\u4fee\u6539\n# \u9700\u8981\u5148\u6267\u884cslaveof no one\u5173\u95ed\u540c\u6b65\u914d\u7f6e, \u4e4b\u540e\u5373\u53ef\u901a\u8fc7config set\u52a8\u6001\u4fee\u6539\nidentify-binlog-type : new\n\n# \u4e3b\u4ece\u540c\u6b65\u6d41\u91cf\u63a7\u5236\u7684\u7684\u7a97\u53e3\uff0c\u4e3b\u4ece\u9ad8\u5ef6\u8fdf\u60c5\u5f62\u4e0b\u53ef\u4ee5\u901a\u8fc7\u63d0\u9ad8\u8be5\u53c2\u6570\u63d0\u9ad8\u540c\u6b65\u6027\u80fd\u3002\u9ed8\u8ba4\u503c9000\u6700\u5927\u503c90000\u3002\nsync-window-size : 9000\n\n# \u5904\u7406\u5ba2\u6237\u7aef\u8fde\u63a5\u8bf7\u6c42\u7684\u6700\u5927\u7f13\u5b58\u5927\u5c0f\uff0c\u53ef\u914d\u7f6e\u7684\u6570\u503c\u4e3a67108864(64MB) \u6216 268435456(256MB) \u6216 536870912(512MB)\n# \u9ed8\u8ba4\u662f268435456(256MB)\uff0c\u9700\u8981\u6ce8\u610f\u7684\u662f\u4e3b\u4ece\u7684\u914d\u7f6e\u9700\u8981\u4e00\u81f4\u3002\n# \u5355\u6761\u547d\u4ee4\u8d85\u8fc7\u6b64buffer\u5927\u5c0f\uff0c\u670d\u52a1\u7aef\u4f1a\u81ea\u52a8\u5173\u95ed\u4e0e\u5ba2\u6237\u7aef\u7684\u8fde\u63a5\u3002\nmax-conn-rbuf-size : 268435456\n\n###################\n#Critical Settings#\n# \u5371\u9669\u53c2\u6570 #\n###################\n# write2file\u6587\u4ef6\u4f53\u79ef, \u9ed8\u8ba4\u4e3a100MB, \u4e00\u65e6\u542f\u52a8\u4e0d\u53ef\u4fee\u6539, limited in [1K, 2G]\nbinlog-file-size : 104857600\n\n# \u538b\u7f29\u65b9\u5f0f[snappy, zlib, lz4, zstd]\u9ed8\u8ba4\u4e3asnappy, \u4e00\u65e6\u542f\u52a8\u4e0d\u53ef\u4fee\u6539\n# \u5b98\u65b9\u53d1\u5e03\u7684\u4e8c\u8fdb\u5236\u63d0\u4f9b\u9ed8\u8ba4\u7684snaapy\u7684\u9759\u6001\u8fde\u63a5\u3002\u5982\u679c\u9700\u8981\u5176\u4ed6\u538b\u7f29\u65b9\u5f0f\u8bf7\u81ea\u884c\u4e0b\u8f7d\u76f8\u5e94\u9759\u6001\u5e93\u5e76\u8fdb\u884c\u7f16\u8bd1\u3002\ncompression : snappy\n\n# \u6307\u5b9a\u540e\u53f0flush\u7ebf\u7a0b\u6570\u91cf, \u9ed8\u8ba4\u4e3a1, \u8303\u56f4\u4e3a[1, 4]\nmax-background-flushes : 1\n\n# \u6307\u5b9a\u540e\u53f0\u538b\u7f29\u7ebf\u7a0b\u6570\u91cf, \u9ed8\u8ba4\u4e3a1, \u8303\u56f4\u4e3a[1, 4]\nmax-background-compactions : 1\n\n# DB\u53ef\u4ee5\u4f7f\u7528\u7684\u6253\u5f00\u6587\u4ef6\u7684\u6570\u91cf, \u9ed8\u8ba4\u4e3a5000\nmax-cache-files : 5000\n\n# pika\u5b9e\u4f8b\u6240\u62e5\u6709\u7684rocksdb\u5b9e\u4f8b\u4f7f\u7528\u7684memtable\u5927\u5c0f\u4e0a\u9650\uff0c\u5982\u679crocksdb\u5b9e\u9645\u4f7f\u7528\u8d85\u8fc7\u8fd9\u4e2a\u6570\u503c\uff0c\u4e0b\u4e00\u6b21\u5199\u5165\u4f1a\u9020\u6210\u5237\u76d8\n[Rocksdb-Basic-Tuning](https://github.com/facebook/rocksdb/wiki/Setup-Options-and-Basic-Tuning)\nmax-write-buffer-size : 10737418240\n\n# \u9650\u5236\u547d\u4ee4\u8fd4\u56de\u6570\u636e\u7684\u5927\u5c0f\uff0c\u5e94\u5bf9\u7c7b\u4f3c\u4e8ekeys *\u7b49\u547d\u4ee4\uff0c\u8fd4\u56de\u503c\u8fc7\u5927\u5c06\u5185\u5b58\u8017\u5c3d\u3002\nmax-client-response-size : 1073741824\n\n# pika\u5f15\u64ce\u4e2d\u5c42\u7ea7\u56e0\u5b50, \u7528\u4e8e\u63a7\u5236\u6bcf\u4e2a\u5c42\u7ea7\u4e0e\u4e0a\u4e00\u5c42\u7ea7\u603b\u5bb9\u91cf\u7684\u500d\u6570\u5173\u7cfb, \u9ed8\u8ba4\u4e3a10(\u500d), \u5141\u8bb8\u8c03\u6574\u4e3a5(\u500d) \nmax-bytes-for-level-multiplier : 10\n\n# \u7edf\u8ba1\u5bf9\u4e8ekey\u7684\u64cd\u4f5c\u6b21\u6570\uff0c\u5bf9\u4e8e\u64cd\u4f5c\u9891\u7e41\u7684\u4e00\u90e8\u5206key\u505a\u5c0f\u89c4\u6a21compaction\n# max-cache-statistic-keys \u4e3a\u53d7\u76d1\u63a7key\u7684\u6570\u91cf\uff0c\u914d\u7f6e\u4e3a0\u4ee3\u8868\u5173\u95ed\u6b64\u529f\u80fd\nmax-cache-statistic-keys : 0\n\n# \u5982\u679c\u5f00\u542f\u5c0f\u89c4\u6a21compaction\uff0c\u5982\u679c\u5bf9\u4e8ekey\u64cd\u4f5c\u6b21\u6570\u8d85\u8fc7small-compaction-threshold\u4e0a\u9650\uff0c\u90a3\u4e48\u5bf9\u8be5key\u8fdb\u884ccompaction\nsmall-compaction-threshold : 5000\n\n# LRU \u7f13\u5b58\uff0c\u591a\u4e2a RocksDB \u53ef\u4ee5\u5171\u4eab\uff0c\u4e5f\u53ef\u4ee5\u5355\u72ec\u62e5\u6709\u3002\u8fd9\u4e2a\u7531 share-block-cache \u53c2\u6570\u51b3\u5b9a\n# \u53c2\u8003\u6587\u6863\uff1ahttp://alexstocks.github.io/html/rocksdb.html\nblock-cache: 8388608\n\n# \u5757\u7f13\u5b58\u662f\u5426\u5728 RocksDB \u5b9e\u4f8b\u4e4b\u95f4\u5171\u4eab\uff0c\u9ed8\u8ba4\u662f\u6bcf\u4e2a\u72ec\u4eab\nshare-block-cache: no\n\n# arena\u5185\u5b58\u5206\u914d\u4e2d\u4e00\u4e2a\u5185\u5b58\u5757\u7684\u5927\u5c0f\uff1b\u5982\u679c\u4e3a0\u5219\u81ea\u52a8\u8ba1\u7b97\u51fa\u5408\u9002\u7684\u503c\narena-block-size: 33554432\n'})})}function d(n={}){const{wrapper:e}={...(0,t.R)(),...n.components};return e?(0,i.jsx)(e,{...n,children:(0,i.jsx)(l,{...n})}):l(n)}},8453:(n,e,s)=>{s.d(e,{R:()=>o,x:()=>r});var i=s(6540);const t={},a=i.createContext(t);function o(n){const e=i.useContext(a);return i.useMemo((function(){return"function"==typeof n?n(e):{...e,...n}}),[e,n])}function r(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(t):n.components||t:o(n.components),i.createElement(a.Provider,{value:e},n.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/c823c29b.818d0605.js b/build/assets/js/c823c29b.818d0605.js new file mode 100644 index 0000000..64370fc --- /dev/null +++ b/build/assets/js/c823c29b.818d0605.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[321],{3560:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>a,contentTitle:()=>s,default:()=>h,frontMatter:()=>t,metadata:()=>o,toc:()=>d});var r=n(4848),l=n(8453);const t={title:"pika_port \u8fc1\u79fb\u5de5\u5177",slug:"Pika-Tools-Port-Bin",authors:[{name:"\u4e8e\u96e8",title:"Pika \u5f00\u6e90\u793e\u533a"}],hide_table_of_contents:!1},s=void 0,o={permalink:"/blog/Pika-Tools-Port-Bin",source:"@site/blog/2020-04-26-Pika-Tools-Port-Bin.md",title:"pika_port \u8fc1\u79fb\u5de5\u5177",description:"\u9879\u76ee\u4f5c\u8005\uff1a",date:"2020-04-26T00:00:00.000Z",tags:[],readingTime:2.56,hasTruncateMarker:!1,authors:[{name:"\u4e8e\u96e8",title:"Pika \u5f00\u6e90\u793e\u533a"}],frontMatter:{title:"pika_port \u8fc1\u79fb\u5de5\u5177",slug:"Pika-Tools-Port-Bin",authors:[{name:"\u4e8e\u96e8",title:"Pika \u5f00\u6e90\u793e\u533a"}],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Pika Blackwidow \u5f15\u64ce\u6570\u636e\u5b58\u50a8\u683c\u5f0f",permalink:"/blog/pika-blackwidow"}},a={authorsImageUrls:[void 0]},d=[{value:"\u9879\u76ee\u4f5c\u8005\uff1a",id:"\u9879\u76ee\u4f5c\u8005",level:2},{value:"\u9002\u7528\u7248\u672c\uff1a",id:"\u9002\u7528\u7248\u672c",level:2},{value:"\u9879\u76ee\u5730\u5740\uff1a",id:"\u9879\u76ee\u5730\u5740",level:2},{value:"\u4e8c\u8fdb\u5236\u5305\uff1a",id:"\u4e8c\u8fdb\u5236\u5305",level:2},{value:"\u529f\u80fd\uff1a",id:"\u529f\u80fd",level:2},{value:"\u5f00\u53d1\u80cc\u666f\uff1a",id:"\u5f00\u53d1\u80cc\u666f",level:2},{value:"\u5b9e\u73b0\uff1a",id:"\u5b9e\u73b0",level:2},{value:"trysync\u7ebf\u7a0b",id:"trysync\u7ebf\u7a0b",level:3},{value:"binlog_receiver\u7ebf\u7a0b",id:"binlog_receiver\u7ebf\u7a0b",level:3},{value:"migrator\u7ebf\u7a0b",id:"migrator\u7ebf\u7a0b",level:3},{value:"sender\u7ebf\u7a0b",id:"sender\u7ebf\u7a0b",level:3},{value:"\u4f7f\u7528\u5e2e\u52a9\uff1a",id:"\u4f7f\u7528\u5e2e\u52a9",level:2}];function c(e){const i={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",...(0,l.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(i.h2,{id:"\u9879\u76ee\u4f5c\u8005",children:"\u9879\u76ee\u4f5c\u8005\uff1a"}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.a,{href:"https://github.com/alexstocks",children:"AlexStocks"})}),"\n",(0,r.jsx)(i.h2,{id:"\u9002\u7528\u7248\u672c",children:"\u9002\u7528\u7248\u672c\uff1a"}),"\n",(0,r.jsx)(i.p,{children:"3.1 \u548c 2.x"}),"\n",(0,r.jsx)(i.h2,{id:"\u9879\u76ee\u5730\u5740",children:"\u9879\u76ee\u5730\u5740\uff1a"}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.a,{href:"https://github.com/ipixiu/pika-tools",children:"https://github.com/ipixiu/pika-tools"})}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.a,{href:"https://github.com/Axlgrep/pika-tools",children:"https://github.com/Axlgrep/pika-tools \u957f\u671f\u7ef4\u62a4\u5730\u5740\u9700\u81ea\u884c\u7f16\u8bd1"})}),"\n",(0,r.jsx)(i.h2,{id:"\u4e8c\u8fdb\u5236\u5305",children:"\u4e8c\u8fdb\u5236\u5305\uff1a"}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.a,{href:"https://github.com/ipixiu/pika-port-bin",children:"https://github.com/ipixiu/pika-port-bin"})}),"\n",(0,r.jsx)(i.h2,{id:"\u529f\u80fd",children:"\u529f\u80fd\uff1a"}),"\n",(0,r.jsx)(i.p,{children:"\u5c06Pika\u4e2d\u7684\u6570\u636e\u5728\u7ebf\u8fc1\u79fb\u5230Pika\u3001Redis\uff08\u652f\u6301\u5168\u91cf\u3001\u589e\u91cf\u540c\u6b65\uff09"}),"\n",(0,r.jsx)(i.h2,{id:"\u5f00\u53d1\u80cc\u666f",children:"\u5f00\u53d1\u80cc\u666f\uff1a"}),"\n",(0,r.jsx)(i.p,{children:"\u4e4b\u524dPika\u9879\u76ee\u5b98\u65b9\u63d0\u4f9b\u7684pika_to_redis\u5de5\u5177\u4ec5\u652f\u6301\u79bb\u7ebf\u5c06Pika\u7684DB\u4e2d\u7684\u6570\u636e\u8fc1\u79fb\u5230Pika\u3001Redis, \u4e14\u65e0\u6cd5\u589e\u91cf\u540c\u6b65\uff0c\u8be5\u5de5\u5177\u53ef\u4ee5\u76f4\u63a5\u4f2a\u88c5\u4e3a\u4e00\u4e2aPika\u7684\u4ece\u5e93\uff0c\u5c06\u4e3b\u5e93\u6570\u636e\u901a\u8fc7\u540c\u6b65\u83b7\u53d6\u5e76\u8f6c\u53d1\u7ed9Pika\u3001Redis\uff0c\u540c\u65f6\u5e76\u652f\u6301\u589e\u91cf\u540c\u6b65"}),"\n",(0,r.jsx)(i.h2,{id:"\u5b9e\u73b0",children:"\u5b9e\u73b0\uff1a"}),"\n",(0,r.jsx)(i.h3,{id:"trysync\u7ebf\u7a0b",children:"trysync\u7ebf\u7a0b"}),"\n",(0,r.jsxs)(i.ol,{children:["\n",(0,r.jsx)(i.li,{children:"\u5c1d\u8bd5\u4e0e\u4e3b\u5e93\u5efa\u7acb\u540c\u6b65\u5173\u7cfb"}),"\n",(0,r.jsx)(i.li,{children:"\u5982\u679c\u9700\u8981\u5168\u540c\u6b65\uff0c\u5219\u5728\u63a5\u6536\u5230master\u7684db\u4e4b\u540e\uff0c\u542f\u52a8migrator\u548csender\u7ebf\u7a0b\u5c06db\u91cc\u9762\u7684\u6570\u636e\u53d1\u9001\u7ed9Pika\u3001Redis"}),"\n",(0,r.jsx)(i.li,{children:"\u542f\u52a8Slaveping\u7ebf\u7a0b\u5b9a\u671f\u7ed9\u4e3b\u5e93\u53d1\u9001\u5fc3\u8df3\uff0c\u5b8c\u6210\u5efa\u7acb\u4e3b\u4ece\u5173\u7cfb"}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"binlog_receiver\u7ebf\u7a0b",children:"binlog_receiver\u7ebf\u7a0b"}),"\n",(0,r.jsxs)(i.ol,{children:["\n",(0,r.jsx)(i.li,{children:"\u63a5\u6536\u4e3b\u5e93\u53d1\u9001\u8fc7\u6765\u7684binlog\u5e76\u4e14\u5c06\u5176\u89e3\u6790\u6210redis\u547d\u4ee4"}),"\n",(0,r.jsx)(i.li,{children:"\u5c06redis\u547d\u4ee4\u8f6c\u53d1\u7ed9Pika\u3001Redis"}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"migrator\u7ebf\u7a0b",children:"migrator\u7ebf\u7a0b"}),"\n",(0,r.jsxs)(i.ol,{children:["\n",(0,r.jsx)(i.li,{children:"\u626b\u63cf\u4e0d\u540c\u6570\u636e\u7c7b\u578b\u7684\u5206\u5e93"}),"\n",(0,r.jsx)(i.li,{children:"\u5c06key\u8fdb\u884c\u89e3\u6790\u6210\u54cd\u5e94\u6570\u636ePika\u3001redis\u6307\u4ee4"}),"\n",(0,r.jsx)(i.li,{children:"\u5c06\u89e3\u6790\u597d\u7684redis\u6307\u4ee4\u52a0\u8f7d\u5230sender\u7684\u53d1\u9001buf\u4e2d"}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"sender\u7ebf\u7a0b",children:"sender\u7ebf\u7a0b"}),"\n",(0,r.jsxs)(i.ol,{children:["\n",(0,r.jsx)(i.li,{children:"\u4ece\u53d1\u9001buf\u4e2d\u8bfb\u53d6\u6570\u636e\uff0c\u4ee5\u975e\u963b\u585e\u65b9\u5f0f\u5411Pika\u3001redis\u53d1\u9001\u6570\u636e"}),"\n",(0,r.jsx)(i.li,{children:"\u63a5\u6536Pika\u3001redis\u8fd4\u56de\u7684\u7ed3\u679c\u5e76\u89e3\u6790\uff0c\u5982\u679c\u51fa\u73b0\u9519\u8bef\u5219\u663e\u793a\u9519\u8bef\u7ed3\u679c"}),"\n"]}),"\n",(0,r.jsx)(i.h2,{id:"\u4f7f\u7528\u5e2e\u52a9",children:"\u4f7f\u7528\u5e2e\u52a9\uff1a"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"Usage: \n pika_port [-h] [-t local_ip -p local_port -i master_ip -o master_port\n -m forward_ip -n forward_port -x forward_thread_num -y forward_passwd]\n -f filenum -s offset -w password -r rsync_dump_path -l log_path\n -h -- show this help\n -t -- local host ip(OPTIONAL default: 127.0.0.1)\n -p -- local port(OPTIONAL)\n -i -- master ip(OPTIONAL default: 127.0.0.1)\n -o -- master port(REQUIRED)\n -m -- forward ip(OPTIONAL default: 127.0.0.1)\n -n -- forward port(REQUIRED)\n -x -- forward thread num(OPTIONAL default: 1)\n -y -- forward password(OPTIONAL)\n -f -- binlog filenum(OPTIONAL default: local offset)\n -s -- binlog offset(OPTIONAL default: local offset)\n -w -- password for master(OPTIONAL)\n -r -- rsync dump data path(OPTIONAL default: ./rsync_dump)\n -l -- local log path(OPTIONAL default: ./log)\n -b -- max batch number when port rsync dump data (OPTIONAL default: 512)\n -d -- daemonize(OPTIONAL)\n example: ./pika_port -t 127.0.0.1 -p 12345 -i 127.0.0.1 -o 9221 -m 127.0.0.1 -n 6379 -x 7 -f 0 -s 0 -w abc -l ./log -r ./rsync_dump -b 512 -d\n"})})]})}function h(e={}){const{wrapper:i}={...(0,l.R)(),...e.components};return i?(0,r.jsx)(i,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>s,x:()=>o});var r=n(6540);const l={},t=r.createContext(l);function s(e){const i=r.useContext(t);return r.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function o(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:s(e.components),r.createElement(t.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/c8b8756d.9cc0a977.js b/build/assets/js/c8b8756d.9cc0a977.js new file mode 100644 index 0000000..5c2571f --- /dev/null +++ b/build/assets/js/c8b8756d.9cc0a977.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[5970],{4178:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>l,contentTitle:()=>o,default:()=>k,frontMatter:()=>n,metadata:()=>d,toc:()=>r});var a=t(4848),s=t(8453);const n={title:"Pika Blackwidow \u5f15\u64ce\u6570\u636e\u5b58\u50a8\u683c\u5f0f",slug:"pika-blackwidow",authors:[{name:"Axlgrep",title:"Pika \u5f00\u6e90\u793e\u533a"}],hide_table_of_contents:!1},o=void 0,d={permalink:"/blog/pika-blackwidow",source:"@site/blog/2020-7-16-pika-blackwidow.md",title:"Pika Blackwidow \u5f15\u64ce\u6570\u636e\u5b58\u50a8\u683c\u5f0f",description:"\bBlackwidow\u672c\u8d28\u4e0a\u662f\u57fa\u4e8erocksdb\u7684\u5c01\u88c5\uff0c\u4f7f\u672c\u8eab\u53ea\u652f\u6301kv\u5b58\u50a8\u7684rocksdb\u80fd\u591f\u652f\u6301\u591a\u79cd\u6570\u636e\u7ed3\u6784, \u76ee\u524dBlackwidow\u652f\u6301\u4e94\u79cd\u6570\u636e\u7ed3\u6784\u7684\u5b58\u50a8\uff1aString\u7ed3\u6784(\u5b9e\u9645\u4e0a\u5c31\u662f\u5b58\u50a8key, value), Hash\u7ed3\u6784\uff0cList\u7ed3\u6784\uff0cSet\u7ed3\u6784\u548cZSet\u7ed3\u6784\uff0c \u56e0\u4e3aRocksdb\u7684\u5b58\u50a8\u65b9\u5f0f\u53ea\u6709kv\u4e00\u79cd\uff0c \u6240\u4ee5\u4e0a\u8ff0\u4e94\u79cd\u6570\u636e\u7ed3\u6784\u6700\u7ec8\u90fd\u8981\u843d\u76d8\u5230Rocksdb\u7684kv\u5b58\u50a8\u65b9\u5f0f\u4e0a\uff0c\u4e0b\u9762\u6211\u4eec\u5c55\u793aBlackwidow\u548crocksdb\u7684\u5173\u7cfb\u5e76\u4e14\u8bf4\u660e\u6211\u4eec\u662f\u5982\u4f55\u7528kv\u6765\u6a21\u62df\u591a\u6570\u636e\u7ed3\u6784\u7684\u3002",date:"2020-07-16T00:00:00.000Z",tags:[],readingTime:12.29,hasTruncateMarker:!1,authors:[{name:"Axlgrep",title:"Pika \u5f00\u6e90\u793e\u533a"}],frontMatter:{title:"Pika Blackwidow \u5f15\u64ce\u6570\u636e\u5b58\u50a8\u683c\u5f0f",slug:"pika-blackwidow",authors:[{name:"Axlgrep",title:"Pika \u5f00\u6e90\u793e\u533a"}],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"What's new in Pika v3.5.0",permalink:"/blog/Pika-3.5.0"},nextItem:{title:"pika_port \u8fc1\u79fb\u5de5\u5177",permalink:"/blog/Pika-Tools-Port-Bin"}},l={authorsImageUrls:[void 0]},r=[{value:"1. String\u7ed3\u6784\u7684\u5b58\u50a8",id:"1-string\u7ed3\u6784\u7684\u5b58\u50a8",level:2},{value:"2. Hash\u7ed3\u6784\u7684\u5b58\u50a8",id:"2-hash\u7ed3\u6784\u7684\u5b58\u50a8",level:2},{value:"3. List\u7ed3\u6784\u7684\u5b58\u50a8",id:"3-list\u7ed3\u6784\u7684\u5b58\u50a8",level:2},{value:"4. Set\u7ed3\u6784\u7684\u5b58\u50a8",id:"4-set\u7ed3\u6784\u7684\u5b58\u50a8",level:2},{value:"5. ZSet\u7ed3\u6784\u7684\u5b58\u50a8",id:"5-zset\u7ed3\u6784\u7684\u5b58\u50a8",level:2},{value:"Blackwidow\u76f8\u5bf9\u4e8eNemo\u6709\u54ea\u4e9b\u4f18\u52bf",id:"blackwidow\u76f8\u5bf9\u4e8enemo\u6709\u54ea\u4e9b\u4f18\u52bf",level:2}];function c(e){const i={h2:"h2",img:"img",li:"li",ol:"ol",p:"p",...(0,s.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(i.p,{children:"\bBlackwidow\u672c\u8d28\u4e0a\u662f\u57fa\u4e8erocksdb\u7684\u5c01\u88c5\uff0c\u4f7f\u672c\u8eab\u53ea\u652f\u6301kv\u5b58\u50a8\u7684rocksdb\u80fd\u591f\u652f\u6301\u591a\u79cd\u6570\u636e\u7ed3\u6784, \u76ee\u524dBlackwidow\u652f\u6301\u4e94\u79cd\u6570\u636e\u7ed3\u6784\u7684\u5b58\u50a8\uff1aString\u7ed3\u6784(\u5b9e\u9645\u4e0a\u5c31\u662f\u5b58\u50a8key, value), Hash\u7ed3\u6784\uff0cList\u7ed3\u6784\uff0cSet\u7ed3\u6784\u548cZSet\u7ed3\u6784\uff0c \u56e0\u4e3aRocksdb\u7684\u5b58\u50a8\u65b9\u5f0f\u53ea\u6709kv\u4e00\u79cd\uff0c \u6240\u4ee5\u4e0a\u8ff0\u4e94\u79cd\u6570\u636e\u7ed3\u6784\u6700\u7ec8\u90fd\u8981\u843d\u76d8\u5230Rocksdb\u7684kv\u5b58\u50a8\u65b9\u5f0f\u4e0a\uff0c\u4e0b\u9762\u6211\u4eec\u5c55\u793aBlackwidow\u548crocksdb\u7684\u5173\u7cfb\u5e76\u4e14\u8bf4\u660e\u6211\u4eec\u662f\u5982\u4f55\u7528kv\u6765\u6a21\u62df\u591a\u6570\u636e\u7ed3\u6784\u7684\u3002"}),"\n",(0,a.jsx)(i.p,{children:(0,a.jsx)(i.img,{alt:"pika-blackwidow-1",src:t(8120).A+"",width:"877",height:"1053"})}),"\n",(0,a.jsx)(i.h2,{id:"1-string\u7ed3\u6784\u7684\u5b58\u50a8",children:"1. String\u7ed3\u6784\u7684\u5b58\u50a8"}),"\n",(0,a.jsx)(i.p,{children:"String\u672c\u8d28\u4e0a\u5c31\u662fKey, Value, \u6211\u4eec\u77e5\u9053Rocksdb\u672c\u8eab\u5c31\u662f\u652f\u6301kv\u5b58\u50a8\u7684\uff0c \u6211\u4eec\u4e3a\u4e86\u5b9e\u73b0Redis\u4e2d\u7684expire\u529f\u80fd\uff0c\u6240\u4ee5\u5728value\u540e\u9762\u6dfb\u52a0\u4e864 Bytes\u7528\u4e8e\u5b58\u50a8timestamp, \u4f5c\u4e3a\u6700\u540eRocksdb\u843d\u76d8\u7684kv\u683c\u5f0f\uff0c\u4e0b\u9762\u662f\u5177\u4f53\u7684\u5b9e\u73b0\u65b9\u5f0f:"}),"\n",(0,a.jsx)(i.p,{children:(0,a.jsx)(i.img,{alt:"pika-blackwidow-2",src:t(4979).A+"",width:"750",height:"100"})}),"\n",(0,a.jsx)(i.p,{children:"\u5982\u679c\u6211\u4eec\u6ca1\u6709\u5bf9\u8be5String\u5bf9\u8c61\u8bbe\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u5219timestamp\u5b58\u50a8\u7684\u503c\u5c31\u662f\u9ed8\u8ba4\u503c0\uff0c \u5426\u5219\u5c31\u662f\u8be5\u5bf9\u8c61\u8fc7\u671f\u65f6\u95f4\u7684\u65f6\u95f4\u6233\uff0c \u6bcf\u6b21\u6211\u4eec\u83b7\u53d6\u4e00\u4e2aString\u5bf9\u8c61\u7684\u65f6\u5019\uff0c \u9996\u5148\u4f1a\u89e3\u6790Value\u90e8\u5206\u7684\u540e\u56db\u5b57\u8282\uff0c \u83b7\u53d6\u5230timestamp\u505a\u51fa\u5224\u65ad\u4e4b\u540e\u518d\u8fd4\u56de\u7ed3\u679c\u3002"}),"\n",(0,a.jsx)(i.h2,{id:"2-hash\u7ed3\u6784\u7684\u5b58\u50a8",children:"2. Hash\u7ed3\u6784\u7684\u5b58\u50a8"}),"\n",(0,a.jsx)(i.p,{children:"blackwidow\u4e2d\u7684hash\u8868\u7531\u4e24\u90e8\u5206\u6784\u6210\uff0c\u5143\u6570\u636e(meta_key, meta_value), \u548c\u666e\u901a\u6570\u636e(data_key, data_value), \u5143\u6570\u636e\u4e2d\u5b58\u50a8\u7684\u4e3b\u8981\u662fhash\u8868\u7684\u4e00\u4e9b\u4fe1\u606f\uff0c \u6bd4\u5982\u8bf4\u5f53\u524dhash\u8868\u7684\u57df\u7684\u6570\u91cf\u4ee5\u53ca\u5f53\u524dhash\u8868\u7684\u7248\u672c\u53f7\u548c\u8fc7\u671f\u65f6\u95f4(\u7528\u505a\u79d2\u5220\u529f\u80fd), \u800c\u666e\u901a\u6570\u636e\u4e3b\u8981\u5c31\u662f\u6307\u7684\u540c\u4e00\u4e2ahash\u8868\u4e2d\u4e00\u4e00\u5bf9\u5e94\u7684field\u548cvalue\uff0c\u4f5c\u4e3a\u5177\u4f53\u6700\u540eRocksdb\u843d\u76d8\u7684kv\u683c\u5f0f\uff0c\u4e0b\u9762\u662f\u5177\u4f53\u7684\u5b9e\u73b0\u65b9\u5f0f:"}),"\n",(0,a.jsxs)(i.ol,{children:["\n",(0,a.jsxs)(i.li,{children:["\u6bcf\u4e2ahash\u8868\u7684meta_key\u548cmeta_value\u7684\u843d\u76d8\u65b9\u5f0f:\n",(0,a.jsx)(i.img,{alt:"pika-blackwidow-3",src:t(3402).A+"",width:"750",height:"99"})]}),"\n"]}),"\n",(0,a.jsx)(i.p,{children:"meta_key\u5b9e\u9645\u4e0a\u5c31\u662fhash\u8868\u7684key, \u800cmeta_value\u7531\u4e09\u4e2a\u90e8\u5206\u6784\u6210: 4Bytes\u7684Hash size(\u7528\u4e8e\u5b58\u50a8\u5f53\u524dhash\u8868\u7684\u5927\u5c0f) + 4Bytes\u7684Version(\u7528\u4e8e\u79d2\u5220\u529f\u80fd) + 4Bytes\u7684Timestamp(\u7528\u4e8e\u8bb0\u5f55\u6211\u4eec\u7ed9\u8fd9\u4e2aHash\u8868\u8bbe\u7f6e\u7684\u8d85\u65f6\u65f6\u95f4\u7684\u65f6\u95f4\u6233\uff0c \u9ed8\u8ba4\u4e3a0)"}),"\n",(0,a.jsxs)(i.ol,{start:"2",children:["\n",(0,a.jsxs)(i.li,{children:["hash\u8868\u4e2ddata_key\u548cdata_value\u7684\u843d\u76d8\u65b9\u5f0f:\n",(0,a.jsx)(i.img,{alt:"pika-blackwidow-4",src:t(7701).A+"",width:"749",height:"100"})]}),"\n"]}),"\n",(0,a.jsx)(i.p,{children:"data_key\u7531\u56db\u4e2a\u90e8\u5206\u6784\u6210: 4Bytes\u7684Key size(\u7528\u4e8e\u8bb0\u5f55\u540e\u9762\u8ffd\u52a0\u7684key\u7684\u957f\u5ea6\uff0c\u4fbf\u4e0e\u89e3\u6790) + key\u7684\u5185\u5bb9 + 4Bytes\u7684Version + Field\u7684\u5185\u5bb9\uff0c \u800cdata_value\u5c31\u662fhash\u8868\u67d0\u4e2afield\u5bf9\u5e94\u7684value\u3002"}),"\n",(0,a.jsxs)(i.ol,{start:"3",children:["\n",(0,a.jsx)(i.li,{children:"\u5982\u679c\u6211\u4eec\u9700\u8981\u67e5\u627e\u4e00\u4e2ahash\u8868\u4e2d\u7684\u67d0\u4e00\u4e2afield\u5bf9\u5e94\u7684value, \u6211\u4eec\u9996\u5148\u4f1a\u83b7\u53d6\u5230meta_value\u89e3\u6790\u51fa\u5176\u4e2d\u7684timestamp\u5224\u65ad\u8fd9\u4e2ahash\u8868\u662f\u5426\u8fc7\u671f\uff0c \u5982\u679c\u6ca1\u6709\u8fc7\u671f\uff0c \u6211\u4eec\u53ef\u4ee5\u62ff\u5230\u5176\u4e2d\u7684version, \u7136\u540e\u6211\u4eec\u4f7f\u7528key, version\uff0c\u548cfield\u62fc\u51fadata_key, \u8fdb\u800c\u627e\u5230\u5bf9\u5e94\u7684data_value\uff08\u5982\u679c\u5b58\u5728\u7684\u8bdd)"}),"\n"]}),"\n",(0,a.jsx)(i.h2,{id:"3-list\u7ed3\u6784\u7684\u5b58\u50a8",children:"3. List\u7ed3\u6784\u7684\u5b58\u50a8"}),"\n",(0,a.jsx)(i.p,{children:"blackwidow\u4e2d\u7684list\u7531\u4e24\u90e8\u5206\u6784\u6210\uff0c\u5143\u6570\u636e(meta_key, meta_value), \u548c\u666e\u901a\u6570\u636e(data_key, data_value), \u5143\u6570\u636e\u4e2d\u5b58\u50a8\u7684\u4e3b\u8981\u662flist\u94fe\u8868\u7684\u4e00\u4e9b\u4fe1\u606f\uff0c \u6bd4\u5982\u8bf4\u5f53\u524dlist\u94fe\u8868\u7ed3\u70b9\u7684\u7684\u6570\u91cf\u4ee5\u53ca\u5f53\u524dlist\u94fe\u8868\u7684\u7248\u672c\u53f7\u548c\u8fc7\u671f\u65f6\u95f4(\u7528\u505a\u79d2\u5220\u529f\u80fd), \u8fd8\u6709\u5f53\u524dlist\u94fe\u8868\u7684\u5de6\u53f3\u8fb9\u754c(\u7531\u4e8enemo\u5b9e\u73b0\u7684\u94fe\u8868\u7ed3\u6784\u88ab\u5410\u69fdlrange\u6548\u7387\u4f4e\u4e0b\uff0c\u6240\u4ee5\u8fd9\u6b21blackwidow\u6211\u4eec\u5e95\u5c42\u7528\u6570\u7ec4\u6765\u6a21\u62df\u94fe\u8868\uff0c\u8fd9\u6837lrange\u901f\u5ea6\u4f1a\u5927\u5927\u63d0\u5347\uff0c\u56e0\u4e3a\u7ed3\u70b9\u5b58\u50a8\u90fd\u662f\u6709\u5e8f\u7684), \u666e\u901a\u6570\u636e\u5b9e\u9645\u4e0a\u5c31\u662f\u6307\u7684list\u4e2d\u6bcf\u4e00\u4e2a\u7ed3\u70b9\u4e2d\u7684\u6570\u636e\uff0c\u4f5c\u4e3a\u5177\u4f53\u6700\u540eRocksdb\u843d\u76d8\u7684kv\u683c\u5f0f\uff0c\u4e0b\u9762\u662f\u5177\u4f53\u7684\u5b9e\u73b0\u65b9\u5f0f"}),"\n",(0,a.jsxs)(i.ol,{children:["\n",(0,a.jsxs)(i.li,{children:["\u6bcf\u4e2alist\u94fe\u8868\u7684meta_key\u548cmeta_value\u7684\u843d\u76d8\u65b9\u5f0f:\n",(0,a.jsx)(i.img,{alt:"pika-blackwidow-5",src:t(4812).A+"",width:"749",height:"99"})]}),"\n"]}),"\n",(0,a.jsx)(i.p,{children:"meta_key\u5b9e\u9645\u4e0a\u5c31\u662flist\u94fe\u8868\u7684key, \u800cmeta_value\u7531\u4e94\u4e2a\u90e8\u5206\u6784\u6210: 8Bytes\u7684List size(\u7528\u4e8e\u5b58\u50a8\u5f53\u524d\u94fe\u8868\u4e2d\u603b\u5171\u6709\u591a\u5c11\u4e2a\u7ed3\u70b9) + 4Bytes\u7684Version(\u7528\u4e8e\u79d2\u5220\u529f\u80fd) + 4Bytes\u7684Timestamp(\u7528\u4e8e\u8bb0\u5f55\u6211\u4eec\u7ed9\u8fd9\u4e2aList\u94fe\u8868\u8bbe\u7f6e\u7684\u8d85\u65f6\u65f6\u95f4\u7684\u65f6\u95f4\u6233\uff0c \u9ed8\u8ba4\u4e3a0) + 8Bytes\u7684Left Index\uff08\u6570\u7ec4\u7684\u5de6\u8fb9\u754c) + 8Bytes\u7684Right Index(\u6570\u7ec4\u7684\u53f3\u8fb9\u754c)"}),"\n",(0,a.jsxs)(i.ol,{start:"2",children:["\n",(0,a.jsxs)(i.li,{children:["list\u94fe\u8868\u4e2ddata_key\u548cdata_value\u7684\u843d\u76d8\u65b9\u5f0f:\n",(0,a.jsx)(i.img,{alt:"pika-blackwidow-6",src:t(3287).A+"",width:"750",height:"99"})]}),"\n"]}),"\n",(0,a.jsx)(i.p,{children:"data_key\u7531\u56db\u4e2a\u90e8\u5206\u6784\u6210: 4Bytes\u7684Key size(\u7528\u4e8e\u8bb0\u5f55\u540e\u9762\u8ffd\u52a0\u7684key\u7684\u957f\u5ea6\uff0c\u4fbf\u4e0e\u89e3\u6790) + key\u7684\u5185\u5bb9 + 4Bytes\u7684Version + 8Bytes\u7684Index(\u8fd9\u4e2a\u8bb0\u5f55\u7684\u5c31\u662f\u5f53\u524d\u7ed3\u70b9\u7684\u5728\u8fd9\u4e2alist\u94fe\u8868\u4e2d\u7684\u7d22\u5f15)\uff0c \u800cdata_value\u5c31\u662flist\u94fe\u8868\u8be5node\u4e2d\u5b58\u50a8\u7684\u503c"}),"\n",(0,a.jsx)(i.h2,{id:"4-set\u7ed3\u6784\u7684\u5b58\u50a8",children:"4. Set\u7ed3\u6784\u7684\u5b58\u50a8"}),"\n",(0,a.jsx)(i.p,{children:"blackwidow\u4e2d\u7684set\u7531\u4e24\u90e8\u5206\u6784\u6210\uff0c\u5143\u6570\u636e(meta_key, meta_value), \u548c\u666e\u901a\u6570\u636e(data_key, data_value), \u5143\u6570\u636e\u4e2d\u5b58\u50a8\u7684\u4e3b\u8981\u662fset\u96c6\u5408\u7684\u4e00\u4e9b\u4fe1\u606f\uff0c \u6bd4\u5982\u8bf4\u5f53\u524dset\u96c6\u5408member\u7684\u6570\u91cf\u4ee5\u53ca\u5f53\u524dset\u96c6\u5408\u7684\u7248\u672c\u53f7\u548c\u8fc7\u671f\u65f6\u95f4(\u7528\u505a\u79d2\u5220\u529f\u80fd), \u666e\u901a\u6570\u636e\u5b9e\u9645\u4e0a\u5c31\u662f\u6307\u7684set\u96c6\u5408\u4e2d\u7684member\uff0c\u4f5c\u4e3a\u5177\u4f53\u6700\u540eRocksdb\u843d\u76d8\u7684kv\u683c\u5f0f\uff0c\u4e0b\u9762\u662f\u5177\u4f53\u7684\u5b9e\u73b0\u65b9\u5f0f\uff1a"}),"\n",(0,a.jsxs)(i.ol,{children:["\n",(0,a.jsxs)(i.li,{children:["\u6bcf\u4e2aset\u96c6\u5408\u7684meta_key\u548cmeta_value\u7684\u843d\u76d8\u65b9\u5f0f:\n",(0,a.jsx)(i.img,{alt:"pika-blackwidow-7",src:t(1950).A+"",width:"750",height:"100"})]}),"\n"]}),"\n",(0,a.jsx)(i.p,{children:"meta_key\u5b9e\u9645\u4e0a\u5c31\u662fset\u96c6\u5408\u7684key, \u800cmeta_value\u7531\u4e09\u4e2a\u90e8\u5206\u6784\u6210: 4Bytes\u7684Set size(\u7528\u4e8e\u5b58\u50a8\u5f53\u524dSet\u96c6\u5408\u7684\u5927\u5c0f) + 4Bytes\u7684Version(\u7528\u4e8e\u79d2\u5220\u529f\u80fd) + 4Bytes\u7684Timestamp(\u7528\u4e8e\u8bb0\u5f55\u6211\u4eec\u7ed9\u8fd9\u4e2aset\u96c6\u5408\u8bbe\u7f6e\u7684\u8d85\u65f6\u65f6\u95f4\u7684\u65f6\u95f4\u6233\uff0c \u9ed8\u8ba4\u4e3a0)"}),"\n",(0,a.jsxs)(i.ol,{start:"2",children:["\n",(0,a.jsxs)(i.li,{children:["set\u96c6\u5408\u4e2ddata_key\u548cdata_value\u7684\u843d\u76d8\u65b9\u5f0f:\n",(0,a.jsx)(i.img,{alt:"pika-blackwidow-8",src:t(841).A+"",width:"749",height:"100"})]}),"\n"]}),"\n",(0,a.jsx)(i.p,{children:"data_key\u7531\u56db\u4e2a\u90e8\u5206\u6784\u6210: 4Bytes\u7684Key size(\u7528\u4e8e\u8bb0\u5f55\u540e\u9762\u8ffd\u52a0\u7684key\u7684\u957f\u5ea6\uff0c\u4fbf\u4e0e\u89e3\u6790) + key\u7684\u5185\u5bb9 + 4Bytes\u7684Version + member\u7684\u5185\u5bb9\uff0c \u7531\u4e8eset\u96c6\u5408\u53ea\u9700\u8981\u5b58\u50a8member, \u6240\u4ee5data_value\u5b9e\u9645\u4e0a\u5c31\u662f\u7a7a\u4e32"}),"\n",(0,a.jsx)(i.h2,{id:"5-zset\u7ed3\u6784\u7684\u5b58\u50a8",children:"5. ZSet\u7ed3\u6784\u7684\u5b58\u50a8"}),"\n",(0,a.jsx)(i.p,{children:"blackwidow\u4e2d\u7684zset\u7531\u4e24\u90e8\u90e8\u5206\u6784\u6210\uff0c\u5143\u6570\u636e(meta_key, meta_value), \u548c\u666e\u901a\u6570\u636e(data_key, data_value), \u5143\u6570\u636e\u4e2d\u5b58\u50a8\u7684\u4e3b\u8981\u662fzset\u96c6\u5408\u7684\u4e00\u4e9b\u4fe1\u606f\uff0c \u6bd4\u5982\u8bf4\u5f53\u524dzset\u96c6\u5408member\u7684\u6570\u91cf\u4ee5\u53ca\u5f53\u524dzset\u96c6\u5408\u7684\u7248\u672c\u53f7\u548c\u8fc7\u671f\u65f6\u95f4(\u7528\u505a\u79d2\u5220\u529f\u80fd), \u800c\u666e\u901a\u6570\u636e\u5c31\u662f\u6307\u7684zset\u4e2d\u6bcf\u4e2amember\u4ee5\u53ca\u5bf9\u5e94\u7684score, \u7531\u4e8ezset\u8fd9\u79cd\u6570\u636e\u7ed3\u6784\u6bd4\u8f83\u7279\u6b8a\uff0c\u9700\u8981\u6309\u7167memer\u8fdb\u884c\u6392\u5e8f\uff0c\u4e5f\u9700\u8981\u6309\u7167score\u8fdb\u884c\u6392\u5e8f\uff0c \u6240\u4ee5\u6211\u4eec\u5bf9\u4e8e\u6bcf\u4e00\u4e2azset\u6211\u4eec\u4f1a\u6309\u7167\u4e0d\u540c\u7684\u683c\u5f0f\u5b58\u50a8\u4e24\u4efd\u666e\u901a\u6570\u636e, \u5728\u8fd9\u91cc\u6211\u4eec\u79f0\u4e3amember to score\u548cscore to member\uff0c\u4f5c\u4e3a\u5177\u4f53\u6700\u540eRocksdb\u843d\u76d8\u7684kv\u683c\u5f0f\uff0c\u4e0b\u9762\u662f\u5177\u4f53\u7684\u5b9e\u73b0\u65b9\u5f0f\uff1a"}),"\n",(0,a.jsxs)(i.ol,{children:["\n",(0,a.jsxs)(i.li,{children:["\u6bcf\u4e2azset\u96c6\u5408\u7684meta_key\u548cmeta_value\u7684\u843d\u76d8\u65b9\u5f0f:\n",(0,a.jsx)(i.img,{src:"https://i.imgur.com/RhZ8KMw.png",alt:""})]}),"\n"]}),"\n",(0,a.jsx)(i.p,{children:"meta_key\u5b9e\u9645\u4e0a\u5c31\u662fzset\u96c6\u5408\u7684key, \u800cmeta_value\u7531\u4e09\u4e2a\u90e8\u5206\u6784\u6210: 4Bytes\u7684ZSet size(\u7528\u4e8e\u5b58\u50a8\u5f53\u524dzSet\u96c6\u5408\u7684\u5927\u5c0f) + 4Bytes\u7684Version(\u7528\u4e8e\u79d2\u5220\u529f\u80fd) + 4Bytes\u7684Timestamp(\u7528\u4e8e\u8bb0\u5f55\u6211\u4eec\u7ed9\u8fd9\u4e2aZset\u96c6\u5408\u8bbe\u7f6e\u7684\u8d85\u65f6\u65f6\u95f4\u7684\u65f6\u95f4\u6233\uff0c \u9ed8\u8ba4\u4e3a0)"}),"\n",(0,a.jsxs)(i.ol,{start:"2",children:["\n",(0,a.jsxs)(i.li,{children:["\u6bcf\u4e2azset\u96c6\u5408\u7684data_key\u548cdata_value\u7684\u843d\u76d8\u65b9\u5f0f(member to score):\n",(0,a.jsx)(i.img,{src:"https://i.imgur.com/C85Ba5Z.png",alt:""})]}),"\n"]}),"\n",(0,a.jsx)(i.p,{children:"member to socre\u7684data_key\u7531\u56db\u4e2a\u90e8\u5206\u6784\u6210\uff1a4Bytes\u7684Key size(\u7528\u4e8e\u8bb0\u5f55\u540e\u9762\u8ffd\u52a0\u7684key\u7684\u957f\u5ea6\uff0c\u4fbf\u4e0e\u89e3\u6790) + key\u7684\u5185\u5bb9 + 4Bytes\u7684Version + member\u7684\u5185\u5bb9\uff0c data_value\u4e2d\u5b58\u50a8\u7684\u5176member\u5bf9\u5e94\u7684score\u7684\u503c\uff0c\u5927\u5c0f\u4e3a8\u4e2a\u5b57\u8282\uff0c\u7531\u4e8erocksdb\u9ed8\u8ba4\u662f\u6309\u7167\u5b57\u5178\u5e8f\u8fdb\u884c\u6392\u5217\u7684\uff0c\u6240\u4ee5\u540c\u4e00\u4e2azset\u4e2d\u4e0d\u540c\u7684member\u5c31\u662f\u6309\u7167member\u7684\u5b57\u5178\u5e8f\u6765\u6392\u5217\u7684(\u540c\u4e00\u4e2azset\u7684key size, key, \u4ee5\u53caversion\uff0c\u4e5f\u5c31\u662f\u524d\u7f00\u90fd\u662f\u4e00\u81f4\u7684\uff0c\u4e0d\u540c\u7684\u53ea\u6709\u672b\u7aef\u7684member)."}),"\n",(0,a.jsxs)(i.ol,{start:"3",children:["\n",(0,a.jsxs)(i.li,{children:["\u6bcf\u4e2azset\u96c6\u5408\u7684data_key\u548cdata_value\u7684\u843d\u76d8\u65b9\u5f0f(score to member):\n",(0,a.jsx)(i.img,{src:"https://i.imgur.com/QV9XHEk.png",alt:""})]}),"\n"]}),"\n",(0,a.jsx)(i.p,{children:"score to member\u7684data_key\u7531\u4e94\u4e2a\u90e8\u5206\u6784\u6210\uff1a4Bytes\u7684Key size(\u7528\u4e8e\u8bb0\u5f55\u540e\u9762\u8ffd\u52a0\u7684key\u7684\u957f\u5ea6\uff0c\u4fbf\u4e0e\u89e3\u6790) + key\u7684\u5185\u5bb9 + 4Bytes\u7684Version + 8Bytes\u7684Score + member\u7684\u5185\u5bb9\uff0c \u7531\u4e8escore\u548cmember\u90fd\u5df2\u7ecf\u653e\u5728data_key\u4e2d\u8fdb\u884c\u5b58\u50a8\u4e86\u6240\u4ee5data_value\u5c31\u662f\u4e00\u4e2a\u7a7a\u4e32\uff0c\u65e0\u9700\u5b58\u50a8\u5176\u4ed6\u5185\u5bb9\u4e86\uff0c\u5bf9\u4e8escore to member\u4e2d\u7684data_key\u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u4e86rocksdb\u7684comparator\uff0c\u540c\u4e00\u4e2azset\u4e2dscore to member\u7684data_key\u4f1a\u9996\u5148\u6309\u7167score\u6765\u6392\u5e8f\uff0c \u5728score\u76f8\u540c\u7684\u60c5\u51b5\u4e0b\u518d\u6309\u7167member\u6765\u6392\u5e8f"}),"\n",(0,a.jsx)(i.h2,{id:"blackwidow\u76f8\u5bf9\u4e8enemo\u6709\u54ea\u4e9b\u4f18\u52bf",children:"Blackwidow\u76f8\u5bf9\u4e8eNemo\u6709\u54ea\u4e9b\u4f18\u52bf"}),"\n",(0,a.jsxs)(i.ol,{children:["\n",(0,a.jsx)(i.li,{children:"Blackwidow\u91c7\u7528\u4e86rocksdb\u7684column families\u7684\u65b0\u7279\u6027\uff0c\u5c06\u5143\u6570\u636e\u548c\u5b9e\u9645\u6570\u636e\u5206\u5f00\u5b58\u653e(\u5bf9\u5e94\u4e8e\u4e0a\u9762\u7684meta\u6570\u636e\u548cdata\u6570\u636e), \u8fd9\u79cd\u5b58\u50a8\u65b9\u5f0f\u76f8\u5bf9\u4e8eNemo\u5c06meta, data\u6df7\u5728\u4e00\u8d77\u5b58\u653e\u66f4\u52a0\u5408\u7406\uff0c \u5e76\u4e14\u53ef\u4ee5\u63d0\u5347\u67e5\u627e\u6548\u7387(\u6bd4\u5982info keyspace\u7684\u6548\u7387\u4f1a\u5927\u5927\u63d0\u5347)"}),"\n",(0,a.jsx)(i.li,{children:"Blackwidow\u4e2d\u53c2\u6570\u4f20\u9012\u5927\u91cf\u91c7\u7528Slice\u800cNemo\u4e2d\u91c7\u7528\u7684\u662fstd::string, \u6240\u4ee5Nemo\u4f1a\u6709\u5f88\u591a\u6ca1\u6709\u5fc5\u8981\u7684string\u5bf9\u8c61\u7684\u6784\u9020\u51fd\u6570\u4ee5\u53ca\u6790\u6784\u51fd\u6570\u7684\u8c03\u7528\uff0c\u9020\u6210\u989d\u5916\u7684\u8d44\u6e90\u6d88\u8017\uff0c\u800cBlackwidow\u5219\u4e0d\u4f1a\u6709\u8fd9\u4e2a\u95ee\u9898"}),"\n",(0,a.jsx)(i.li,{children:"Blackwidow\u5bf9kv\u6a21\u62df\u591a\u6570\u636e\u7ed3\u6784\u7684\u5b58\u50a8\u683c\u5f0f\u4e0a\u505a\u4e86\u91cd\u65b0\u8bbe\u8ba1(\u5177\u4f53\u53ef\u4ee5\u53c2\u8003Nemo\u5f15\u64ce\u6570\u636e\u5b58\u50a8\u683c\u5f0f\u548c\u672c\u7bc7\u6587\u7ae0)\uff0c\u4f7f\u4e4b\u524d\u5728Nemo\u4e0a\u51fa\u73b0\u7684\u4e00\u4e9b\u65e0\u6cd5\u89e3\u51b3\u7684\u6027\u80fd\u95ee\u9898\u5f97\u4ee5\u89e3\u51b3\uff0c\u6240\u4ee5Blackwidow\u7684\u591a\u6570\u636e\u7ed3\u6784\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u6027\u80fd\u8fdc\u8fdc\u4f18\u4e8eNemo"}),"\n",(0,a.jsx)(i.li,{children:"\u539f\u6765Nemo\u5bf9\u591a\u6570\u636e\u7ed3\u6784\u7684Key\u7684\u957f\u5ea6\u6700\u5927\u53ea\u80fd\u652f\u6301\u5230256 Bytes\uff0c\u800cBlackwidow\u7ecf\u8fc7\u91cd\u65b0\u8bbe\u8ba1\uff0c\u653e\u5f00\u4e86\u591a\u6570\u636e\u7ed3\u6784Key\u957f\u5ea6\u7684\u8fd9\u4e2a\u9650\u5236"}),"\n",(0,a.jsx)(i.li,{children:"Blackwidow\u76f8\u5bf9\u4e8eNemo\u66f4\u52a0\u8282\u7701\u7a7a\u95f4\uff0cNemo\u7531\u4e8e\u9700\u8981nemo-rocksdb\u7684\u652f\u6301\uff0c\u6240\u4ee5\u4e0d\u7ba1\u5728meta\u8fd8\u662fdata\u6570\u636e\u90e8\u5206\u90fd\u8ffd\u52a0\u4e86version\u548ctimestamp\u8fd9\u4e9b\u4fe1\u606f\uff0c\u5e76\u4e14\u4e3a\u4e86\u533a\u5206meta_key\u548cdata_key, \u5728\u6700\u524d\u9762\u52a0\u5165s\u548cS(\u62ffSet\u6570\u636e\u7ed3\u6784\u6253\u6bd4\u65b9)\uff0cBlackwidow\u5728\u8fd9\u65b9\u9762\u505a\u4e86\u4f18\u5316\uff0c\u4f7f\u540c\u6837\u7684\u6570\u636e\u91cf\u4e0bBlackwidow\u6240\u5360\u7528\u7684\u7a7a\u95f4\u6bd4Nemo\u8981\u5c0f(\u4e3e\u4e2a\u4f8b\u5b50\uff0cBlackwidow\u4e2dList\u7ed3\u6784\u4e2d\u7684\u4e00\u4e2aNode\u5c31\u6bd4Nemo\u4e2d\u7684\u4e00\u4e2aNode\u8282\u7701\u4e8616 Bytes\u7684\u7a7a\u95f4)"}),"\n",(0,a.jsx)(i.li,{children:"Blackwidow\u5728\u9501\u7684\u5b9e\u73b0\u4e0a\u53c2\u7167\u4e86RocksDB\u4e8b\u52a1\u91cc\u9501\u7684\u5b9e\u73b0\u65b9\u6cd5\uff0c\u800c\u5f03\u7528\u4e86\u4e4b\u524dNemo\u7684\u884c\u9501\uff0c\u6240\u4ee5\u5728\u591a\u7ebf\u7a0b\u5bf9\u540c\u4e00\u628a\u9501\u6709\u62a2\u5360\u7684\u60c5\u51b5\u4e0b\u6027\u80fd\u4f1a\u6709\u6240\u63d0\u5347"}),"\n"]})]})}function k(e={}){const{wrapper:i}={...(0,s.R)(),...e.components};return i?(0,a.jsx)(i,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},8120:(e,i,t)=>{t.d(i,{A:()=>a});const a=t.p+"assets/images/pika-blackwidow-1-d2f194c46b2f89969b695ca99b666f66.png"},4979:(e,i,t)=>{t.d(i,{A:()=>a});const a="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAu4AAABkCAYAAADZqbVdAAAABHNCSVQICAgIfAhkiAAAGshJREFUeF7t3Ql0VPW9B/DvnTWTjYRsLEkgBEjCEtFEgpCHKLIIxKeiEuv6lNae1z71vfZg1eerrc/aY6Wni9aKtvq0Yp96tC2KiCLy3LBoNYDsa1gSsu+zz7zz+9+5Q1jFEDKZzPdzTk7u3Jm5c+fm5n9/93d/9//XgsFgEERERERE1C9JuK5pGkz9cu2IiIiIiOgYDNyJiIiIiKIAA3ciIiIioijAwJ2IiIiIKAowcCciIiIiigIM3ImIiIiIogADdyIiIiKiKMDAnYiIiIgoCjBwJyIiIiKKAgzciYiIiIiiAAN3IiIiIqIowMCdiIiIiCgKMHAnIiIiIooCDNyJiIiIiKIAA3ciIiIioihgieQ6BoPBSH78gKdp2oD/juca91GKBUZbwf3967FdJaJIiljgLgcINoDnFrfx2eH2o1hhBOxsk78e2wUiiqSIBe5ygPD7fQgE/JH8/gOW1WpX21guajDx/s11Pzh7vF7w2hANVGaTCRazWX09v0/a5MBA/apnzWQ2wxzaVkREkRCxwH337t144YU/Y+XKr1BT60EwoIdGDJB6RopiZNs54szIz3fgttvmY/78eUhMTGSG6Bsygna32423V63CGy+8gOaqKgScTn1JPBuiaCWNRKiCTjOZYM3KwoT581F5883QgkE8/6fleHPtRzjS2olQkxxqWWKx7O7oxjJpwJCURMybcRFuuvEG5OfnR+seQERRTgv2YVGjERAdOFCNa69djNGj38E1Cy9FQmLo2EBnTQ41Bw/4cPvi/8Mvf/kr3Hnn91WGiJd3z4yxnSTr+NLy5bjxpptQ/sQTsOXnq0CHQTtFPePeIrnq2dGBXStWIPfjj1BrS8DF44ajYtZ0JCY4wi8j/aplZ5cLr76xGrvrPXj5xeeRk5vLdpWI+owRn0Qk4/7OO+8jNfUdPPLIYuTk2PvsS8cODcOGpeDyec/hiivmIz9/dOx89bNk/GMcqavD4z/4ASpefhk5CxfqQfvRZCVR1DOubuaXlGDdD5dgqrMRDy75HnJHDgc0UzgzT6HEUjCICyZNwHf+/T/xzpr3cNu/3MpNQ0R9LiKB++HDzSgp0ZCTEwcE3VAllbF4JfYckJIjs8WCESMSMWKEC/v27Wfg3gNerxfr6+pwc0kJgiYTvH4/bxaggUfT4MjNRfW48fh20y7k5gxF0OVWJ7B0lGwNk6ap7VMysQg1R+q4eYgoIiISuPv9Adis+veV44NJ3RfFyL03HD3cmuBwtMPlcvfGYmOWZg3tqJoWzroTDRjSuxcAj9UKq0UDzCbAC5ikLIyOoU5mTCbYbRb4fLyBl4giIyKBuwgHmMZdldqZZHjCL47M1oomWhCBgMbu3c7SmeyVRFFPglLZ2bnDfy0VwPMQREQRwrTKgMUjS2/gVqTYENrTucOfGZ7gEFGEMHAnIop1DNiJiKICA3ciIiIioigQsRr3/sboRUEN+a3KPfWbtjjsKNFZ6NZn+DFONYjVqebTudWD0o+T9TyjQVNtp1BtKRER9SoG7kJ6VjAOMqFA45jHPAAR9Yjxf3R8XCjzj58nTjWfzrEexNiaJXT4ME62ZBk+PzTVB7yGoF+me7DgUzgmuUJEFKMYuAtN07v3CgIWq1495HbrBx2bTR6HelwIvVY5PjMoUUjvHaOIBoSAz4dgIACTzXbM9/G7XNBsthO62PR7vWqeZlZ9xFI/JUF0e0ubavNsFgs8Pp8abTgpIQH+gB+BQBBxcXb1t++t4F2dKAQDCPp7b5lERNEmtmvcVXZdj7jffacRq96WQTUsqK524r779qjfcmQKduuyV2V9gqGLwaHsvJ4JOln+kChGSbAOoK2qCnt+/GMEfT61IWRe565d2Pfoowh0dennumoENsnW+nDwj39Ex/bt6nUS9IWF/teUU01Tz51h86V3hSiJDj9Wvvcxnv3zG/jBQ7/F8tfexp//+g7aOzpxqLYB2/dUAxazer3eZMrvY6f1P6U+/+TTx3ZP2djQjK5Opzqx05elr7Sx/JMvw3iNnnwJvy+0bL3tJiKKHsy4h3R2+WG3AW63F48/fhCXz03F6NEJAALHZAX1pLrUv8uUftDRM0pSGx8IZd2ZeqcYFyqFSRg1CrUeD7p27UJSYSEkFG9+9104xo+HLTFRPZZATEgs5W9pQcDr1QP3UICmBr8KlVxIoHVMBvcUJTf0DZ1hk6W2fTAIi8WMymvmoam+EUufegk3XDUHSWkpCLo9SElL0T/c54dJGtVAt37PVZ5EbyuDUlYjf3u5uhKULLoJCPjV68NlOPKGgIxJEcCLf1mNWdNKUFRciGCXEybJwMu+YXxVKc0JzZN1NNZVqGmfD5qM9ieDTMlJofFen/8bbiwioshh4B5it5ngdPrw+uu1OO+8RFw2KyOcjf9qcxvWvt+kRnydOTMdubkOrPjbEcyenYGMzDjs3duOTZs6MG9eJiwy+qBkd3qxtpMo6khAHQzClpqKhKIitHz0EZILC+F3OtG1ZQuy77oLXYcOoe6tt+BzuzG4rAyDJk2CKS4OJqsVzRs3wtPRgYypU1W5Te2qVUicOBHJI0agZdMmNK1bpzLyg6dPV+87w4Qx9aZAQJXE2GxW+CVpISUsJhPW/30jrBYzhg3JwHsffoakpATU1jWgpHgc9h2swaGaOsydMQVjC/LQ2dqBN9/7GDVHGpCRlooFl01DckoSqjZux8efb4LdZkPlFZfB5XZj9boNqKtvwGWNzZgxvQy7du7DB59+iS6XC5MnjcMFEwqwZt2ncLo9aGhqUZ+fkpyEz6u2IntYFuZdehG27NiDPdU1sNut2LZrPy6ecj5KzyvS22x1UtGbG4iIqPfFdqlMN/EJZly36DA2buxC5aIh4aD98GEXnvlDLSoqMnHllUPw7LN1aG3xYtt2N3bu6lAt/WuvNcKkaSoLFeyeXSIiDCorg/PAAfj9fnR+9RUs2dmIz89X5TMZc+ciuaAANb//Pfxudzhj6jp4EM69e/XrWsEgOjZsQMDthqupCbXLliGzogJDrrwSdc88A1ftEb0h615CQ99Mj858QmUo0uYZ79c07D9YiwM1dXC63PjVc3/FyJyhSBmUjLseehJj8rKRmpKMFe9+pDLtr69aB5fHi+/edBU8Xi/eWvsJ/G4vnn1lJcaPHYWKWdNUMJ2cmICLSsah4rJylF9YrLLn0t7Omj4ZBfkj8NSLK+B0u7Fx2x7srj6Mfyo7H8teWomqLbtw2fTJ+NNf1qCuoQnNrR147A+vYdyYPFw6rRT//cRyHKlrBKwWBLj/EFEUYOAe4nYH8POfp8Jm07BhQ0uoGhfYvbsLLpcHe/Z0YOvWNvz9722qu7NF16Vj8+ZONDW50NHhRdkUuTxsXBJm2oZISDyXICUy9fWqtr1j1y5VPiO3nkopTNvmzXDv3ImA3Y6AxxMqowjCZLfDnJAQjgctaWkqm9u1dy/cTic69uxB65Yt6Ni6Fd621nCATz3Uoybr5G+Ki7PBEWdX2fiFcy5C8YQCTCgYhXn/NAnFEwtxwYSxsFnMcDa3YcvOvfB5vfh841aVdd+17wDMNgtKJxbggw1V6OpyIT7ODs2kITE+HqmDkmFJlBJGKaE3YfP23di57xDsNjN8Xh8SHHG4bFoJxo7Nw0WTCjCtdAIKi0ZjyqQCOJ1u9b67bqlA3tg8nFc0GhdOGI3W9g5AlWv16OyFiKhPMXAP8XgCKC1NxuLbh+HHDx7Etm1tgAovgLQ0K3Jz41FUmIjnnh2DYcPikDsiHjU1fjz3XA3Gj09ARoYdQVWn2ad/P6J+TUIhs9WK5Jkz0bh6NTw1NUiZPl1l3w898wwsCQlILi+HOT5e/x7So0yo7tnf0aH+A6WHGV9zsz5f02DLyEB8bi4Si4ow5umn4cjJ0Wvl+c8XEWaL6Zh2z2gC5UqJ1apXY0qZYVKCQ62fTEu2XF5oMpmQPSQDOcOycF3FTNy+qELVtF9/5SwsuHQqvv/g46ipa4DZYlHlMupmUrMZTqcLf/jfN5EQH4/y0gmIj4sL3/9glpp5v199hl0+3+eD2biPIhhUVwKE1+tDY3Ob/hxjdiKKEgzcQ5zOAGpr3MjOScQDDwzH4sV7sH9/OyZMSITbbcahg254vUHU1fnhdgeRnGxDWVk8li5tQGnpoG5/bkbuRIoE0tIdIICUyZNx6M47oXk8sGdmqjKZoNcLX0sLnNXV6Fq/XtUZ+xobEfD7kVhYiLYVK9Dwj3+g9fPP0fjgg3r2fuxYmD0euA8dQtDjga/2CDSWOJy9HgauctNobV2zyq4bTV9nl0sFxz6/H/WNcvUS8Pp8qJNpdY+oDzV1jXAkJaja9Kpte+AJBdFSny5Z9k+/2AKX24P0lCQVYMNmxfAhGXhpxRrs27ZbBecejxctbe2oPlyH9VXb1VdoamlTJTey79U3tqrlynRDk0x71ZWAF//2PtZ/9Lkq04lz2JGVkQb4fb3WbSUR0bnEwF0J4sILk0PlLn5MnZqKpUtz0NbmRWqqHXfdNRxt7R5s3daOOIcGq1VCERMGD7ahsjIZI3LjeJmV6GRCvb7Y0tNR8MEHyKisVK+SUpjh3/42ApoGa3o68n79a5gcDqRfcQXsWVmIGzIE2fffD1dNjboJdcynn8I6aJDqiWbY3XfD096O9m3boDnioFmtPY07ydCTfEMggMQEB25bNA8OR5y6OVVOviZPKsKkcWOQlZ6KyitmqpO3nKEZuGb+JSoTnj0sEwvnzVCDNV0+YwqmlUzA5m27VRCeEB+nbhyVe4Zq6urxw+9ch2FZGSprLje0SglNY3MrbAkO3F65QH1eeuog/Pq/vgeH3a5q4rOHZKrPXFRxKYZmpavpaxdcom5W7exy4pq55SpIT0qMx3/cfi0SkxP1Hm54xYaIokBs9ypjNNTBIPLzE9WfS8pdTCYNZWVpocd+ZGc7kJ2t11XqdZABHDjQjhUrGvGtb2WE+hXWM4tE1E2odxnpLSajvFwF2NIFpJQsJOblISkvLxx0y/yUiRPVY/lJKS5GanGxmpa4Up6XGwjjc3KQmJOjPsRYnsLAq89IkCsnVPHxDpSUFkvdSajffQ35o0fq6yG9/mSmqS4iMzLTkDE0U01nZqYhMzQtpTRTp5XoNeZy5USy5f4Aplx0vj5PumqUZXt9SE9PxYKKmSr4l+WMGpWLUQWj9K4dZUfwejGxuFB/3ufHpPPHqZMDGcFVTQOqNCYtNRllF08GPF592dJNJPcdIooSsR24G1RwIdki6VNa784xEPSrYEEey3PG8yazPsrq22/XY8qUZEyalHw0287Gn+hEof8LnzGKpjzWNBWEq37ZjXeYTKr0Ivx8IBAO2pXQ++Q9vlB5jAq4+H939npQKmME70EZBbd7X/sSfIdIAC2JEPkd9J5kWvYBpyv8emM5AXUjqX7KJtl39VkSsHd2qb+3zJPPkXIp/bRO77c96PKEdhMNAWMa+rTJbFI93Kh9rNMJv8er1o1BOxFFEwbuIXoAEH4Aid+7P3c0NpDBR0xYvHhE6Gl9JFW98Tdyg0R0PGOgpbBuwV5Y6CZCRW5UPX4h4mTvo7Nz0g399boH7IbugbDRbuqv019x4vSJHy4B9fGdqh//Wcc+1pfRfVH6MnQS6MtNr2WlE9QMybKbZSAmIqIow8D9GwsdZCRTpEZQ7X6J/sQDEBER9QNyMTU0Smr3kwsiomjCwL3Hjht6nYiI+jUG7EQU7XitsKdOcnm3f+lB0SqdgFuRYoKxo3OHPzO8uEpEEcLAfcCSIwuPwmeLx2eKCcaOzh3+9Iztw6aViCIkIqUycrnSGDNF/T7jGJNpoa8j21NtzmAQZrOVl4bPkur1QpYhG5YD/dAAo/ZvuXoYbpD1toNOpHpACh2CWHJDRJESkcDd4bCgutoMn0/voYWZ4d6jyRjxMMHrDWDr1gSkpQ3uvYXHEOPAHGhshJabC5MMo040wMh+HvB6kdfSguZOD7xOF6x2GxDwn9CrS2wLQjOZ4etyob65DSNybLG9OYgoYiISuJeWjseSJT7MvLQal84cDkccK3Z6i+SHGxp8eOWVjzB79mSMHTu2txYdE4yAfVByMv7tjjvw28cfx2333Qd7drY+IAzRABLo6sKhtWuxd+mjeAjABdMm45KLShAfZz/6LSNRPhOUcZX86v/xhG5E+1K3khinuxNrPtyAJ/7ndbz33p19uRZERGERCdzLy8uxbNkzuOrqu5GU2IGU1FCCR0TiIDEQyCVuADYbsG8fMGfOP+Phh+9BSkpK6Ntxw54JvYwriOTkZPzr3Xej7kc/wh9HjwaGD9cH+jEGCCKKdtJn/oEDGJWWht//7neQsZ9vv+chNB05DBmXVkaq7WvSSsnwTQ4LUFYxH/W1h7D+ky8h41hHYn0MklpqAdAO4Omnn0Z5+bS+3jRERIoWlMK9PqTqBDUNfr8fX331FerrmxAIyCrIKIp9uCIDjFGmKtvWajVjzJh8DJdgk3pE3SugAUeOHMHOHTvgdemjO4br3YmimWSy5QBgMiE1PR3FxcXq22zcuBENjdImy0jSofs7+pgMjOTxeDFvXiUefvhHKkh2Op36aKl9vC5CpTw0ueBmRkZ6GsaPHw+z2Rw+lhER9QUjfu7zwF0YH07nFrfz2eH2I4qcUSNz8dzzf8L06dMjtxKnwLaBiPqa0e5EpFTGKEfo42R/TFG1of2+r/n+jfspxQqjrYh0myyfL9lst9sNt9evMu3C5/PBJKU9/QDbViKKpIgE7oKNH0UD7qcUSyJ9sm+cOBhBevff/SVwJyKKpP6RwiAiIiIiotNi4E5EREREFAUYuBMRERERRQEG7kREREREUYCBOxER9QvGzakn+x3pHm+IiPqDiPUqQ0RE1J3Rc4zFbAl3DSmki0giIgIDdyIiijwZTdvr9aqg3eV2hftzF9Kfu8ViUT+R7rKSiCiSIjJyKhERkTBGA2xqasK9996L2tpaOBwO7NixAxkZGRgyZAg2btyIn/3sZ7j88svDryciiiVGW8lSGSIiirjkpGQMHjwYy5Ytw4gRI5CWlobq6mps2LABzc3NyMzMVOtoHLyIiGIRb04lIqKIMUpfLFYLFixYoNYjJydH/U5PT0dHRweWLFmCsWPHqnkslSGiWMbAnYiIIioQCKjPz8vLw6RJk9DZ2aluVJX5UvdeWFiIpKQkZtuJKOYxcCcioogysuipqam4/vrr8cUXX8But6OtrQ3nn3++CuaJiAgM3ImIKLIkcJfsutyUWlpaqlbGarWipqYGEydOREFBQWRXkIion2DGnYiI+g2pb589e7a6IbW1tRXl5eWIi4vrN+tHRBRJDNyJiCjijHKZUaNG4eKLL0ZVVRV8Ph+mTp2q6t3ZmwwREUtliIioH5DAXYJzGSW1qKhIrVFlZSWysrLUtDxHRBTrmHEnIqJ+paSkRK3PnDlzVH/ugt1AEhEx405ERP3MsGHDcMstt2DMmDHhG1cZuBMRAVqQ1x+JiKgfMOrY/X4/PvnkE4wcORLZ2dmsbyeimGe0jwzciYio35HuISXLzkw7EZF+n4+0hxZuDCIi6m+kJxkiIjoWW0YiIup3WMVJRHQiBu5ERNTvsESGiOhEDNyJiIiIiKIAA3ciIiIioijAm1OJiOicMWrVjdKXU9Wun6405vhlEBHFKgbuRETU68J9DmtaeNnGvG/qdEE9EVEsYeBORES9ygjQnU4nXn31VbS2tuLmm29GcnIy3nzzTXzxxReIi4uD2+3GhRdeiBkzZsBqtar3STeQwaD0Waz34y7Tfr9PrZ/ZbA53Eymv7Z69N7qPPNV8IqKBgDXuRER0TmzdulUF7L/5zW/g8XjUZ6xfvx4PPPAAcnJy1Lw5c+aoQF6y6nrQHoQk6WVan6fh/vvvx/vvv39McG68Xl7XPWg/2XwiooGCGXciIuo1Rra9o6MDr7/+F1RUVMBisYTLXWw2mwrEFy1ahLq6Ovz0pz9FfX09Nm3apDL0kydPhtfrxbp161BQUIDGxkb84he/UNl2ydJPmTJFZeflPVu2bFHBf1ZWFiZOnKg+o62tDZs3b0ZLSwuGDh2K8847r9sJwdGyHSKiaMSMOxER9bp3330XWVmZuOOOO/DWW2+FA3e73Y61a9fi5ZdfxmOPPYaf/OQnmD59OlasWIGysjI0NDRgx44dmDVrlgrsDx06pNZt586d+OCDD1QQ3tTUhEcffRSPPPIIli9fjhtuuAEffvihet1rr72GadOmqZKcL7/8En6/v9e/GxFRpDBwJyKiXmFk2yUbvmrVKixYsACDBw+Gy+UKl7NI4C3B+L59+7B7927U1NSoDLsE36K6uhpVVVX47ne/q7Lls2fPVpn3yspK3HfffSrzLhl1Cfrz8/ORmpqqHq9cuVK9v6urS/1euHAhrr76apXtF7zBlYgGApbKEBFRrzACdwm8n3rqKcycOVMF1UJq2+fOnavKYW688UYsWbIEtbW1qpxFAvz58+erYF0y9QcPHlRZeAm6pRRGlislNga5qVVIUC/vv+qqq9QJgpBlFxcX48knn1SZfamnl/ca60ZEFM2YcSciol5hZLVHjhyJ559/Xj1ub29Xyw4EAuq3BOIPP/wwXnnlFVXmIoyg+9Zbb8U999yDPXv24JJLLlHPScA9btw4LF26NPx6ubG1sLBQldRI2YycACQmJqrXywnC3r171QmC1MmzVIaIBhJm3ImIqFcYgfvo0aNVGYs8HjNmjLp5VDLoQm4ufeihh7B//34VXEuGvaSkRD1XVFSEvLw81T1kZmammifZ8nvvvRerV69WN5xKWY0E7XJisGbNGmzYsEF1M2n0LCMnBtu3b1fLkM90OByh78YbU4ko+mnB7h3hEhERnSOnK1eRLPtnn32mepuR8prx48ef9vUnc7rlExFFM6N9Y6kMERH1OjnIHP8jGfjj5xklNJJ5l6D9jTfeUKUx3XV/j9AHaDqz5RMRDSTMuBMRUcRJCYwE8dJdpGD2nIjoKKNNZOBORET9CoN2IqJjGe0ib04lIqKIk4OSgX2uExGdHAN3IiKKOAbrRERfj4E7EREREVE/ZlyVZOBORERERNQPdS8jFAzciYiIiIj6keMDdgP7cSciIiIi6idOFbQLZtyJiIiIiCLsdAG74f8BEP5zjcnmz+wAAAAASUVORK5CYII="},3402:(e,i,t)=>{t.d(i,{A:()=>a});const a=t.p+"assets/images/pika-blackwidow-3-e1d6e597bfc0e9f2b5fac3d09de2d347.png"},7701:(e,i,t)=>{t.d(i,{A:()=>a});const a="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAu0AAABkCAYAAAAyng5eAAAABHNCSVQICAgIfAhkiAAAIABJREFUeF7t3Ql0VOX9N/Dv7MlkXyELIRsEEwggm5RdQUWtW5XSaqtU+7bHVmvt8nftaW31fd/2+FdRe9ri9tZuWipiXUE0iMoW2Y/shBiyJySZrLO/5/fcuZMhhH9VIjOZfD8YZ+bOzJ2ZZ56593uf+9znGvx+vx9ERERERBSxjBH7zoiIiIiISGFoJyIiIiKKcAztREREREQRjqGdiIiIiCjCMbQTEREREUU4hnYiIiIiogjH0E5EREREFOEY2omIiIiIIhxDOxERERFRhGNoJyIiIiKKcAztREREREQRjqGdiIiIiCjCMbQTEREREUU4hnYiIiIiogjH0E5EREREFOEY2omIiIiIIhxDOxERERFRhDOH+/35/f5wvwUioi+dwWD40l+DiIiiV1hDuwR2rsiIaCTg8o6IiM5G2EJ76Aps9+7d2Pz+ZnS3d8PvY8t7KKPZiKyCbCy5eDHS09Oxe/cuvP/+VrS398LHshoyZrMR+fmjsHTpEvT29OGtd95C/cl6eH3eIXuNaCAb2bGWWEyfNB3z5s5DQ2MD1q9/G83N9fCxrE4hZWW1xmLKlOmYO3cuLBYLgztFFVmPc285RTtZlkdKA7PBH6ZfnB7aKyoqsGjRIkz69kQk5ifBb2Ro1xlggN8FfPT3D3HvsnsxoWwC7r//EcybtxvFRQYYeETCkOnrAyoq/MjN+QY8xh4433dhauFUWI22QF0dspcavuSnaQQa2xtR4a3A5V+9Ap9WHcXBQ52YNGkmzGYrV+AhpDeMw9GCl19+EqtWrcKKFStgMpkY3CkqcM8RjSSRUt/DEtr1D9/S2oJblt8C6yVWLPpfixCbGKuCKvXzwY+mI01Y++PV2PJaJR597CKsuLkISUlWFtOQ8uPokW7ceturiGtciJU3/g6F6YVgdTyd2+3BG5+8jqsfuxrXX/99rFhxD7Jz8mDkT/c0fX0efPDBa7jrrmvUHsXy8nL4fD4YjdzipuFLX4c3Njbi8KFDcEurB1GUMRiNSM3IQFlZWcQ0uISle4z+g+/t6cWr77yKh558CDGJMXD5XAxJofxQK/e04lRMmH8etrzWjUsvzUJSkhF+n5NlNVT8gMFoQFFxLBYtGo/mDcXIjMsEvIDX64ORyT3IDz8sZjMWFi3CrKwsXDDnUuTm5sHp5B6ygaSsrFYzpk+/EEAcWlubBz6EaNjR198HDhzAL+++Gy+uXQvk5Gifw+eD2sVENNxJw0pHB+ydnVi5ahW+fdNNEdHFMSyhXScrNWG2m4PXI6XfUCSQ8pF/Po8PplgTABfsdu2dqZ4KsmxkVjpr/sA6xuvxId5uwYHONrg8LsAq20UGroRCSX3zATHmWFiajbDa7GodLStyth4P4Ae8PsBmiwWQolrYiYYzPbA7HA78/rHH8GJaGm45cgTW3FxpYRrOH43oNP7eXtS++y5uveYaFBUVYeGiRac95lwLa2gPxW4xZ9bfcDEwoUugPPPz6DMKDDuql7PURTYWDU5Vt0Cd0ze6WQXPrH+72qdXM6JhSw/tHQ4HnvjjH3Hjjh2wFhXJdjxR9LFYkHfFFTD94AfYV1nJ0E5ERETDi4R3YUxL03a+eb2q/y9RNFEbqWYzvBkZ8PT2RsRHi5iWdiIaPti6/tmxrChaqaHw5MPJrknunqQoI3VbX37rG6rhxk1jIiIi+twGdtgkoi8XQzudncBu0qCBtykqcWVNRNyLRHRuRUVol90W+q6L0Otn49R5yugYZzO3KCXlIh9N/scz452BKpwB9w28PfyEY2WtfpOfs6jOtEvzTNOJiIgi1bDv0y4rcZNBhkMEvH4vjAYj5J8XXnXfFwkXEtD1eUpMMBoMweEX1VlKP3d0iEJSSKo/o2z3aendEDxFq4wl8EVKPvrI+O/C79Nroz9k2uf/vFr/0WCRjyhmc6AsA8l94GUoVdoGwGwywOvVNpsCxTbodCKis6YvlPT+/QNv/yef5fGDPUamyd9gBwPLULODTadhadiGdqmf8ruQE98c33ocXq8X478yHp0dndjzj90oWlyMjKIMeH3e/i9Gz5GB/CQH0agWt8DJdYSq9wYDmo824+iGo/CbfPC7gPO+WgpbvBW1u2tRvKBYC/EqiIXM3ijzC8xEJ8E2yvKrlJmUXUeHB+vXN+HiizOQmGjDpk2taGzsw1VXjYLFYoAvpHwkuwaXNaFBVh2/FGUFpPhhMBnw9v631YbkkglL1DjwJosRuz7djePtx3Fl6ZWqSvqkPNUwk1qs7G8F1qb5/XJeXNmQNMLpdeLDqg9xwdjZsFtjTxv7W99wkudoG05aHdXmPXTlfGrN//KoumaU4O3Ftm0bcPz4AdjtiWpM+NLSGejudqBs4iz1G/bJZw68MZPZiK7ODmzdth6zZl2ChPgEeDxeGI0mdHW2Y/v2DbjggksRFxcHr1erz0REZ0Nr4NPOW6Gt+7UDdT9T+0xgvarWCWd6E3I+DNWI2P8awecZDIM+T5aVZ5wfDTvDvnuM/CTaq9vRUeeADz7semGnCivJucnqtlRYq9Gq/qT1XCq2xWhRQUoCgVzKbSG3JRh1n+zGjmc/RvbUbEz62mTkz8mH0WSAPdmOgrkFwZZ2fb5yKfPQwizUdZvRpi4lh52rgHNuGeBy+rBxo0OV6bFjXXj++UZMnJgAi8WoFiQSkIxGs7pU4dxo1IYFC7QKGIzyfWjfQ7TRN1DsVjveOfIO+lxOmIxGuFwuvHpwLZJjkmA0G2AwG2CyGdV1tfA1GmC0GAN/2gaf3JbHwARYTTYsKFqIWEusVn/NRhitRhhlHlLusrEgG7MyD7NBu89qHPINo6GL//+Zei2/H/v3b8e48VOwZMlyzJv3VYwZM04Fd/0HZrMZYbcb1aVsF7rcTuzdswket0uVicViQlycrEuN2Lv3A7g92nQiorPm96O3qQme7u7g8lauy7SgwLovuIIQ+jSDof/xgz1OGAzobWyEs6VFe41A0Hd3dqKnthaqVV2fp8za7UZPQ4O6DJ0+6HX9NSmiDfvQLkwxZtjirDj03iH0tTsxbcU0mG1m1U2mq7kLe97Yg12v7YKj0QF3rxtHtx5FX5cTZoMZ3W3dqKo8Dp/bF/yhOR1OdNZ3IXlsClKSk5FTnoOkrCR0NneicX+jek05S+ne9fuw+43d2LtuL6p3VauNAqn3xyuPo3LNxzi29Rh8Xp8KHdHXh1bb1TFmjBX1dX145pl63HZbFiZMSFTlIxsqH1e2Yc2aGmzd0gq/z4BDhzpx+FCXtovEYMCePW2ore0NLnyiafNGC5rAzNxZcHgd2N+4H7ABzZ3NONhxEFOzp8Lr9mLDgQ1Yu2Mt9tfvVwFe7q+sqsTWqm3YVrUNTo8TH1d/jDUfv4LDjYfh8rqwt24vet29qiW/quU43tr7Fl7f9Qb2ntirQn+Pqxc7ju/AocZD6r6KAxvh6OsM7PEZvpuQsbFxSE/PQlpaDNLTU1Qr+7FjnwQXsHv3VOLtt1/Bzp1bVJcYk9GEhIRUVb8ktB858gnWr38Dn+zfiri4JLXBTkR0VvQWGq8XtatWoevwYbX8l7+eQ4dQ88wzwdlry6LA8JiB5+nTZGnULY//4x/VNGlR1/aQBkhDGIDWt99G7bPPBhtO5HUaX3sNLW+9pTWMqWyvtfB72ttR/dvfwu1waGFPtSKG7n0NbDQEXuuU16OINOzXWtK/3Gq3YMdTO1BdUY3Zd8yG2ar1+ulu78b2p7YhJj4G9iQ7djyzAz0ne7DnmT1oOdQME0w4+OoBNH/SBItFaymX1vnkvGQULynCW3e+iR0vf4yezh61AdD2aTt2/3239kUagLSCVCRlJ2H7/92O7sZumGHGkfWH1fvIKstCzQc1OPruMfXcaGQyAW1tHtxzbzUWL07BtGlyqnbpjmTAhg2teK+iHRPLErHxfQe2bG1HXZ0TTz5Vr4qisdGFlY/Xw2TSFm+BxUj0FJN8FDmFvcWK6VkzcLy1St3e07AHS/OWIjE2Cc9+/Byae5pRlFGM53c/rwJ4R58DM16dgU/bqzE6MQu76nbhpX3/RG5KjtrY6XQ6sHLr4/B4PTjeUo0HNz0Ii9mC9Ph0PFn5JLZVb4PH51bT3z7yNnKTc7H20Fr8e/+r0pdsyLaLwhX92042oaWlBw5HL07UHsGGDX9X9bCycgN27apAYWEp9u7dhF27NsJkssDl6oPVakNV1WH84x8PIzExBW0nG1FVtUftAdLXt0REZ8sku/JC+48bjTDZ7dps/X64u7rUn2oRD3QL9fT0wOVwqGWqnMjHnJgIn8sFZ2cnvG53MJwLeUzaxRfDVV+P3hMnYDIY4GxrQ9eGDUhdvFg9xtXRoeapGAwwJSaqMC7dMP0ej/a6Ph+8Lhf8vkBjpc+nWuvleVG0Fo5KUZEmpRXbPtoOd7cLvR29KiTLdmbzwWY4mh2Iz4qHPc2Oo68chcflxaSbylVo73X1ovVgKwoXFGpfbiCJSGtl+fLJmHvPXNTtqMd7v3oPnW2dsMZZYU+3q4MKjSYjcotz0d3UjZLrx2P8JePV/I5tPIaEwkTYkqywJFpw7L0j6r2IcAWdL4sEHjk4MD3dhMZGp0qpRqMBfX1eVFS0obDQisQkM5KSjHjnnWbMmpmC+Hg/2tvcqsV91gUJGD06RpVM9C0oZCHpU11aFoydjw9qP0C7ox1ba7eibHQZ2nvbsbGqAgXJBUiyJcHR68D+hv2wmi34eeHPsbTkMuRljkGMKQYtfc1ItadiXIYcSwGMTcxXG6tbqjfj2nHX4qLzLsKs4pn4eunXsb1mu9poKk0txRXjr8DEwon4Zvk3UNdep1XAwIribIXj+zKbrfjoozewYcNL2LptHVzOXmSOGove3l7s3LkRo0cXwB6XhFh7InbufF/VK5PJDK/XgwMHKrFo0Q2YNWs2pk9fgqysYnU8wBAVBxGRCsFmu10dLCh/pthYFdBledm1dy9qX3gB1U88gcaXX1bTOvftw6crV6L26afRU1WlAn7fkSNoXLsWJ55+GlUPPoi+ujpteRtoYbBlZsJis6HryBEV4Hpra2HJyUFMRgZaKypQ98ILOP7b36Jjxw61ESAkrJ/485/ReeCArJLgPnkS1Y8/Dm9PD3xuN2qfew41q1ah+pFH0LFzZ1iW7/TZDPvQLoHY3eNG6fIylC2fiPU/WY/Ok52q1dvZ7YI53oyOug50NHRgzv+Zg4TRCciYkI7WfSdx4N8HkDI+Bcljk+GBnIY5cCBpYESavEl5uPQ3l8KWbEPNjhpYbGb4PVqfMdWqvv0o9r2wD5OWl8MKq+p6IxsQXrcHTQeakFSYhPIbJqvWe7X76bN9J8OGNBYkxJvwwAP52L27G2telq5DJng8fni9PrjdPhw40IniIhuuuToTsXYzJk9OwL9ebsGevd1YsCBJBUx1QG9UpieDal0flTAK8dZ4bK7ejGRrMkoyStDR244EcyLae9pxpPkwvlbyNUzLPR/drm5kxWcjzmoHnEB5djl+OvtneGrbU1h3YD2sJquqHx6/Bz3uXmTEpWv1xQ8k2BLV70E2FiTsJ8cmA27AZopBrDlWhfbhXAc9HjcuueQGXHvtzbjowqtU1xevxw23260CuFxWHz+A7KwiXHjhMrU3wmKxqef19nYjOTlTlZUc52KzaRuLRERDxWizofH113Fi/XqcWLdOXde7xtqys5HzjW8gbc4cNL/0ErxOJ9q2bIElMxP5d96JmDFjVLj2NDcjobwchXfeqbq7tO/ZE9xJqo7DMxqRfPnl6N63Dx6fD47330f8nDlqYyGupAS53/42YnJz0bpxo9bdJbBu9TkcKqDLOsDv9cLd3KxCfeumTXC3tqLwrruQefXVqH/qKXj7+k7ZUKDIMexDu/A6vehp7UbB9AKMu2YcNtz9Drq6u5AxLh1GpxHpBekomF2AjPwM1RIcnxaPjPJ0bLlvC3KnjdG6rwTGGZd+ZJ31nTiw7iBaGlrR3tAOX58Pscl2eNxe9LX3qb6yTVVNeH3Bayj5WglMVhM6uzpVF5y0wjQV6PNn5yO7NBsJaQnatx1tzezC78enNU4kJprxk5/k4c8vNGP9+kbEx5tRVCS7BE2YPTsNpWVJSEvXQtK8eSlYvboZLpcfeXnyGNmgiZwfxFBSuyS9fiTEJeArOV/BZf+8DDlJObDb7ciIy0BaQiqS4pIxt3AuikYVIyE2EW6vB229J4PV5URHLTLiMzAr5wLsbdirWtgbuxtgM1oxObscf9z5JxxtOIqGk43qANeSUSXqI0i3GwmtUrZurwvtzo6h/Ghhqc49PQ643S61sSh/0oLe0dGChIRE5OQUqt/2pEmzUVRUiuTkNPV5T56sh9Uag7y88XjzzWdw4kQTPvlkC7Zvf1WtEKPxZ0lEYeLzqfBtLyhQfzF5ecE30lNTg7rVq9G9Zw9MGRmqVT79oovQe/Ag6l58URZoKrTHTZ+O+JIStf6Inz4dPunSEugjr7e2x40fj749e9B17Bhcra1IKNb2wjr27kX96tVwy0GpsbFadxjpriOt9BYLjNINWOYl3XaSk+Hr7YWzrk51xal58UU0VVTAkJWl3htFpmE75KMe9CTESEu51yfD4vlRdnUZvC4P6nbWqZFeyr45Cfte3gujzYT0/HTEj45XreIpRalInZGK9JL008ZdlxDuqO1Aa3ULDD4gb0Eexpyfi7bqNuTMGqO+yZajLSi+txg9HT2o/H/bkTYuHWWLyzDx2onY/+on2Pr0VlhtVhQtKAp88+qnEpm14Auy2oxYuDBJLRDS02Pwy1/mYfPmdsyc6cbXv56F1asb8fTT1bDZzFgwXwtRWVk2FBbGYOqUOMTEmFUfeAlbUc0PlGROwKMLH8WM3BmAB4izxeE7027BG/tfx66anUiIS8QVEy5HckwypuVM12qKAeqA0zV716iW92snXQOzwYSF+YtUnZ2WOw3fct6IdYfWwWgwYV7efFxYdCE6nV2YP3Y+rGab2iZKiU3B1KwpqoiHKqSey29M/XIMBowbdz7iE5JUYJd1UHxCMsaPP199rgULrsWmTa/g1VefhtVqxYwZi5GUlI7Jkxeo55aWzkRraz3effefyMoai2XL7tUORB2qAiGiEU9Cd+KkSUgJhGiTz4e+xkbVDaXhL39Bzq23whQTA8e+farfelxBAYoffBBHfvYztGZlIW7sWBWYtZHoZC/0gDHWA8M62tLTYZ8zB3WrViFm/HjEFRaiq6oKLa+8gnEPP4yO7dvh+OSTYP91g8UCg80GV2MjTBMnav3oa2pgjIlR0+OKipB99dWqBd7X16feo1o0RuUe8OFt2IZ2PTRIVB87a6zWTcbvhiXWgpk3zVJdUiTYjJ2Zp/7kuuo6AB96XD2o3XoCpTeUwWK1wKtGMdVGmJCuBXFpcZixYkbwOUKel5qfirT8NHUSp5LFJThv8Xla15cAeX17qh0zbp6ppsvryeuqcbijqPKrz+L3IynJjOuuy1FR0O/3YvLkJPWnjTJrwIoVuSG/DlkEyLB9XaqPe/lkGWUm+vsUS1n5vX7kp47FnQvuVEWjH/xYmFaAH877YX+S9gNJMUnISx0DNeS4HxifMQ7jM8f1l6MPWHb+9YAc7+sHLhx3IS4svlC7X34UXiDRloDrA4/xe/woTCtEYXqhmudwo9U16dJiwvz5l6vArhqeDEBOdgHG5Bao7liJScm48sqb1f1SPaXHlXzeiy9ZBrXDwQBccsnXg/fLbZmPVz3+XG6CEFG0knDu6erSF8/qunRLkXAcM3YsWtetgzUpCZ6WFrWAP7lpk2qBN8bHIyYzUwV5b3d3sHj8Tid8cqS9LhDkzSYT4ktLUXPzzSiR1nHpQ5+QoMJ205tvwnX4MHwxMeo1PK2tMFitSJ45E7WPPKI2CFzV1XAeOqQOmk2bOxcn/vu/0fDaa1rXwdRUpMybp72irIS4fIwowza0B+uwRL9AGlEBSSopPMEVsQRsVekCY7LLUI1b/rBZtUwWLgiMuR4SqmUeErK1QBk4E2ogZWmNctrR1hLGpV+xHvaF9lyJ6/2Pido6HyhTbWNIlYI6oY+KP/pJq9SY4dpJliR07dvXhpUrZWjIbKSkWLXHj4gFQuAkXoGwqe9x6T8514DQqOqbNk1dVRVPbxI2yKl/g/fDE7pQHewxoSf8Grpwqr/SuSThXOqWXmUkmPs8gTrm9UMGLtLrk15CHnd/HdQCfeC7CPxeh65EiGhE0hdIJhNyvvtdmOPi1PJH/uImTIAtN1d1R8m5+Wb01tfDEh+P1KVLYY6PR1xpKUwpKUhdsACx2dnw9vYi77bb1HJO2ljSlixR81HtLYHXkXlJm01CWRmm1NSoVne5bU1Px9i774arrQ3WRYtU67qMHJN/770qzCecdx7yf/1rNfxjQmkp0q+4Qs0rJisLY+6+G31NTWr5GTNqVP8IOCNi/Ty8DPvQrtXl/lXvwBDYvxLXAriMbT39OzNUi7yMACOB//TnqLkGv8lT7z/TdM3g84pSEqBC8qM61DawgaPKQS255ARW8vl9GDcuHo89Vgy73ayaQfvLKmQmUUvG5h344U6bEDDY9NBpIddPWaie4THKYPP84oZ2bp/Nab8t9bG0dzLofYFgHno58DoR0ZAwGBCbmRlY7WnNGhLgLXFxqiHQkpgIW2JisMFDgrgtLQ2xaWnBYC4Hk1rsdi2kSxBPSVFvTTUchi7r/f7gY7XVrHa/vL498B6EvIZ99Ojg/Ow5OTDk5JzyHmTe+vvQn6O9e4pEURHaPwu9vsvKPTY+NtBt5fTATp/TwPQWumDRUpU2Q1kw2GQ3n9we2E9j4EyIiIiGF20vfX9jggRiFYD1XgD6Xn0J2XIgvPQMkGnymMBt/fFC38t/auNM//yCXW8D6101Fntod1y1p7u/X7xcV01kqlFNew+h702bdeDkTxSRRkxoD6W6zIS0wtE5EFhI6N1pTlsI0bDClhgiogFCG63EKY1YIWc47W9FPHUv4f/0/IEGnjE18HoD9zoOPNlTsInsTO+NItqIDO2nVWo6N6JwrHqi/4QbOERENBSiYpx2IiIiIqJoFjEt7YGeXzSIwDEtgf7goWRcu0GeQF+IXs5SF/vLnEKp/pCBOmfwaztaWQXPTJWXutt42p5vIiKizyOsoV2NNiKnZO/xBK8HD7wgFcilK4/JbISnVw3qhJ4erWCk5Bgsh0ggWUk5d/W4kZaQAqvZqmau+uAzlYaQg5cM6HP2wp3pg8vZo+qh1FP+dk8ldcdkNKDb2QugTY2BTBRNuGgkOrfCEtr1PuWx9lhcufhK7Pr3TiwYvQj2pNhgeA8nrxr1FDAh5KQG4SAniYEfTUeacHDTfgD78fZb2cgaXYSkJFs43lF0UtuOfhw90o2K9w7D3pKNpu5GxMfGqyAfVrJWlMF25G1EwCA7sqHtdrlRcfQ9bK2vR95Hb+G88VORnZ13yvFOJAzo6/Nge+W7ALqRlpbBYqGoEgGLJKIvnz7aTgQIW2iXVrn0tHT8+L4fY9GiRdi/5wASCxK1cBJGMrLM2MSx6h1UO6phMoQzuBsAF/DR3z/EvcvuxW3X34H77nsE27ZtQHGxgSFpCDn7gPcq/MjN+QY8yT34wSM/xNSC82Ez2bQhtIbwtT4TGZHL64cl3oKE7AR01nXC3eVW5xkIR/NWsJuHAWhob0CFrwI//fnPUHP8KP7rv76D8vJZsFi0sqJ+Dkcz1qx5Ck8/vQplZRPVHQZDmDcEiYaI3+3W5iRDDcrQgkRRRO1Bls/jcsEYGxsRnywsoT3UwoULsWvXLmx+fzO627tDzhIZBn7AbDHjjd+/qVpel69YDo9bzoEehvcSYLSbcPtvfojFFy9Geno6yssn4f33t6G9vQc+OSUkDYm4eCNuv30ULr10CXp7+vDWO2+h4WQDPD7punXuyUatxWJBU0sT7n/oftxx3x3ITM+E2+0Oy+hHehnIQqzQUohlk5Zh3tx5aGhswPr169DcXA+fT075SjopK5ttLG6//V3MnTsXJpM2LjNHr6LhTpZNF2Rmou3jjxGfnw+rKZyNW0Rfnr5PPwUqK5GybNmX9yKfg8Efxo6op5wEIII89L8fUu/mvnvui6B3RSNRU0MTRmWNQmN9IzJHZ47EIogakbq8I/qs9DosJ+n5+9/+hhu/9S3MefJJxBQXnzoeOFE06OrChn/9C0uOHsXTL72EvDFjwr4cD2tLe6QdvCYLJDlYzOP0BHsgyMKJLWN0rkm9M5lM6HP1qZfWL71eLw9oHKa4HKHhTl9ny3ryuuuvR0JCAl7/y19w8rHH4NNHSSCKBgYjbDnZ+M3SpVj+q1+pwC7CvRwPa2iPhAIYlJzFN3CHfEHh/pJo5NHr3GCXrI9EFC56cLfZbLjyqqtw6WWXheMwG6JzwmQ0whxB3b/CHtqJiIho+NCDu1xaLZbh88aJvoBI6trI0E5ERESfix7ciaJdJO3dZmgnikD68eFnuiQiCrdICjNEIwEHDCaKQHIQqjCbte1qGWJN6NOJiIhoZGFLO1GEaWlpwbFjx2C321FTU6PenZzLoLW1FT09PSgsLFRj9hMREdHIwdAeIN0QBjvYQO+ewN2A9GXT6197eztmzZqFmTNnqiEezz//fDzwwAOqlX3btm04fPiwCu2D1VciIiKKTuweEyChXMaeFRKOTEate4JMY2Cncyk1NRUrVqxAVVXVKX3apfVdpsv9RERENLKM6JZ2vaVSTg2/du1aHDlyBImJiaisrFS14Pe//z0cDgeKi4tx1VVXqX7FbN2kL4u+cSih/PLLL8dzzz2H8847D52dneokJtJtRqb3h3b9bAJEREQU7UZ0aNeHrJIw3tDQgHvuuUd93yUlJepSgrx44oknGNjpnJAzocrenfz8fPV6fX196mBUuRT6dP1xRERENDKM6NAeauHChZg/fz6cTmdIGwGYAAAGqElEQVRwsvQrjomJwaJFi0ZGbaCw01vb5WDTO+64AytXrsSCBQuwceNGdVumC3bZIiIiGlnYpz2gqKhI/R06dChYA+S6hKTCwqKRVSsobPS9PykpKZg4caJ6H/qxFnJbprOLFhER0cjD0B4gLerz5s1DW1ubCk7yJ9dlWkyMbeTVDAq7yZMnY/LkKarr1pQpU9RtIiIiGplGfGjXWzblcvbs2aoW6MM/CpkW+hiic6W0tBSTJk3E/v37VSu73CYiIqKRacSHduH3a19+RkYGvvnNb6oRY+TvhhtuUNNCH0N0rsjJlfQNSbmU20RERDQyMbSrg/q0L18fak9aNuXvsssuCw6vpz+G6Mum79mRvuzSPUvIpdxmf3YiIqKRiaE9MBKHDKEnYWncuHHBmiDXZZp+H9G5op+Jd9SoUbj55pvVpdCnExER0cjCIR8DJJyL/PwC3Hjjjep2QUGBmqbfR3Su6HVOTqr005/+VF2yLhIREY1cDO0BepeEjIx0lJeXq6np6ensjkBhoYf22NhYlJWVBd8DNyCJiIhGJob2QchJlYiIiIiIIoXBz06yp9FPGS9jtxMRERERhVvUhvbQbRG9S8HA7RN2NaBziXWSiIiIvqioDe2hPu8weaHhSq7rp5EnGiqft07q5Hmsk0RERCNP1IZ2GabR7XbDZDLBbDar2y6XCwYYoP4zGGC1WtU3PliAGjhNTsDEsdrpbLBOEhER0RcVdeO0663kGzduVH3S161bp8qmtrYWF110Eb5zy3dw7bXX4qabbsL27duD5aY/T2/JlFDf1dWFEydOaGE/cAIm/f7QS92p933Rr4SiDeskERERna2oCu166/jJkyfxt7/9TZWNflCptHJ+9NFHWLZsGR5++GEkJyfjjjvugMfjUQFd798een3Xrl0YM2aMCu1CP8mS/pjQx4pTp/NEONS/F4d1koiIiM5G1Az5qHVf0ZrDKyoqkJqaigkTJgTLRg/lEydORFFRESZNmgSLxYKDBw/i5Zdfxg033IDCwkJ8+OGH2LdvHy6//HL86U9/wowZM3DfffdhxYoVmDJlCrq7u/HOO++gqqpKdb1ZsmSJeh0J9h988AEqKz+G3+9TGwdyciZ9Q4JGHtZJIiIiGipR1NKu9Uepq6tTIfy73/0uxo0bp1rShd5F4Xe/+x1uueUWPPbYY7jtttvUCZR+8YtfqKDf2dmJZ599Fq2trYiLi0NOTo7qFy9hPj4+Xs3npZdewp133omWlhYV3m+//Xb1vLa2NtX9pq6uFvn5+cGNBBrJWCeJiIhoaERFaA9tzV6zZg0WLlyIUaNGoaamJti1RW9pnz17Nq655hrVav7ee+8hM3MU/vrXv6rrEvgltF999dVISUnBJZdcorrIfO9730NxcTF6e3vx73//W7XU9/T0qCAvwd3hcKjr0ldeDnqVjQV5fRq5WCeJiIhoKEVFaNc5nU68+eab2LZtGx5//HEVpJ9//nm0t7cHT5Q0f/58XHHFFVi6dKlqafd6PZg+fQaamprw3HPP4Uc/+hGys7PVLPt6+9SlPF/I0I8S0OfOnYvvf//7+PWvf62616SlpcFut+MPf/gD5nxlDqZNm4bNmzer5+gt/DQysU4SERHRUIiaPu1CWrnlIFM5+FT+HnjgAXWwaWJioho9Rsg0CdkrV67Eo48+qlrgi4uLcNlll6luLzLajBykKlJSU9RleXk53njjDUyfPl11u/nFA7+A1+tVgbykpATjx49X87///vuRlJSknhMbG6suaWSTOvnQQw+p8M46SURERF9UVIR2veuLHBgqAVu3YcMG1b9cWsgluEsgl8dK4L7uuuswdepU9RwhQX7s2LEqgOvkYFVpta+vr0dGRoaaLF1rpI97a0srfH6fmr+Q+S9fvlxdl+EkS0tL1XX9vdHIElonJ0+eHPzwrJNERET0RUTdyZVCu6Powcnnk7OaBgZaH0AOKF29erUaKUa6y9x6663BeQwM3GcaCeZMJ14603QaWVgniYiI6GxFRUt7qNCgrY+rLoFdglNoeJLr0soujzl+/DjuuusuXHXVVcFZyXxCnyO3B04T/2k6EeskERERna2oa2n/PAZrOR9sGtG5Mlj9G2waERERjSwjOrTrQlvgB3aJIQoH1kkiIiIKxdBORERERBThomqcdiIiIiKiaMTQTkREREQU4RjaiYiIiIgiHEM7EREREVGEY2gnIiIiIopwDO1ERERERBGOoZ2IiIiIKMIxtBMRERERRTiGdiIiIiKiCPf/AR2fjWWB1luQAAAAAElFTkSuQmCC"},4812:(e,i,t)=>{t.d(i,{A:()=>a});const a=t.p+"assets/images/pika-blackwidow-5-fbecef58859e81229a02ba054c864b53.png"},3287:(e,i,t)=>{t.d(i,{A:()=>a});const a=t.p+"assets/images/pika-blackwidow-6-fea4db926e09062432073c6c94002b07.png"},1950:(e,i,t)=>{t.d(i,{A:()=>a});const a=t.p+"assets/images/pika-blackwidow-7-f94a590f52bd9c931f665786bbc12f97.png"},841:(e,i,t)=>{t.d(i,{A:()=>a});const a=t.p+"assets/images/pika-blackwidow-8-29fc67370188a28f1fc4f5b02c0860b9.png"},8453:(e,i,t)=>{t.d(i,{R:()=>o,x:()=>d});var a=t(6540);const s={},n=a.createContext(s);function o(e){const i=a.useContext(n);return a.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function d(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),a.createElement(n.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/ccc49370.9149b5a4.js b/build/assets/js/ccc49370.9149b5a4.js new file mode 100644 index 0000000..a1b92f0 --- /dev/null +++ b/build/assets/js/ccc49370.9149b5a4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[3249],{3858:(e,n,t)=>{t.r(n),t.d(n,{default:()=>j});t(6540);var i=t(4164),a=t(1213),s=t(7559),o=t(7131),l=t(6535),r=t(6609),c=t(1312),d=t(9022),u=t(4848);function m(e){const{nextItem:n,prevItem:t}=e;return(0,u.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,c.T)({id:"theme.blog.post.paginator.navAriaLabel",message:"Blog post page navigation",description:"The ARIA label for the blog posts pagination"}),children:[t&&(0,u.jsx)(d.A,{...t,subLabel:(0,u.jsx)(c.A,{id:"theme.blog.post.paginator.newerPost",description:"The blog post button label to navigate to the newer/previous post",children:"Newer Post"})}),n&&(0,u.jsx)(d.A,{...n,subLabel:(0,u.jsx)(c.A,{id:"theme.blog.post.paginator.olderPost",description:"The blog post button label to navigate to the older/next post",children:"Older Post"}),isNext:!0})]})}function g(){const{assets:e,metadata:n}=(0,o.e)(),{title:t,description:i,date:s,tags:l,authors:r,frontMatter:c}=n,{keywords:d}=c,m=e.image??c.image;return(0,u.jsxs)(a.be,{title:t,description:i,keywords:d,image:m,children:[(0,u.jsx)("meta",{property:"og:type",content:"article"}),(0,u.jsx)("meta",{property:"article:published_time",content:s}),r.some((e=>e.url))&&(0,u.jsx)("meta",{property:"article:author",content:r.map((e=>e.url)).filter(Boolean).join(",")}),l.length>0&&(0,u.jsx)("meta",{property:"article:tag",content:l.map((e=>e.label)).join(",")})]})}var h=t(5260),f=t(6676);function v(){const e=(0,f.J)();return(0,u.jsx)(h.A,{children:(0,u.jsx)("script",{type:"application/ld+json",children:JSON.stringify(e)})})}var p=t(7763),x=t(996);function b(e){let{sidebar:n,children:t}=e;const{metadata:i,toc:a}=(0,o.e)(),{nextItem:s,prevItem:c,frontMatter:d,unlisted:g}=i,{hide_table_of_contents:h,toc_min_heading_level:f,toc_max_heading_level:v}=d;return(0,u.jsxs)(l.A,{sidebar:n,toc:!h&&a.length>0?(0,u.jsx)(p.A,{toc:a,minHeadingLevel:f,maxHeadingLevel:v}):void 0,children:[g&&(0,u.jsx)(x.A,{}),(0,u.jsx)(r.A,{children:t}),(s||c)&&(0,u.jsx)(m,{nextItem:s,prevItem:c})]})}function j(e){const n=e.content;return(0,u.jsx)(o.i,{content:e.content,isBlogPostPage:!0,children:(0,u.jsxs)(a.e3,{className:(0,i.A)(s.G.wrapper.blogPages,s.G.page.blogPostPage),children:[(0,u.jsx)(g,{}),(0,u.jsx)(v,{}),(0,u.jsx)(b,{sidebar:e.sidebar,children:(0,u.jsx)(n,{})})]})})}},7763:(e,n,t)=>{t.d(n,{A:()=>c});t(6540);var i=t(4164),a=t(5195);const s={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var o=t(4848);const l="table-of-contents__link toc-highlight",r="table-of-contents__link--active";function c(e){let{className:n,...t}=e;return(0,o.jsx)("div",{className:(0,i.A)(s.tableOfContents,"thin-scrollbar",n),children:(0,o.jsx)(a.A,{...t,linkClassName:l,linkActiveClassName:r})})}},5195:(e,n,t)=>{t.d(n,{A:()=>f});var i=t(6540),a=t(6342);function s(e){const n=e.map((e=>({...e,parentIndex:-1,children:[]}))),t=Array(7).fill(-1);n.forEach(((e,n)=>{const i=t.slice(2,e.level);e.parentIndex=Math.max(...i),t[e.level]=n}));const i=[];return n.forEach((e=>{const{parentIndex:t,...a}=e;t>=0?n[t].children.push(a):i.push(a)})),i}function o(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:i}=e;return n.flatMap((e=>{const n=o({toc:e.children,minHeadingLevel:t,maxHeadingLevel:i});return function(e){return e.level>=t&&e.level<=i}(e)?[{...e,children:n}]:n}))}function l(e){const n=e.getBoundingClientRect();return n.top===n.bottom?l(e.parentNode):n}function r(e,n){let{anchorTopOffset:t}=n;const i=e.find((e=>l(e).top>=t));if(i){return function(e){return e.top>0&&e.bottom<window.innerHeight/2}(l(i))?i:e[e.indexOf(i)-1]??null}return e[e.length-1]??null}function c(){const e=(0,i.useRef)(0),{navbar:{hideOnScroll:n}}=(0,a.p)();return(0,i.useEffect)((()=>{e.current=n?0:document.querySelector(".navbar").clientHeight}),[n]),e}function d(e){const n=(0,i.useRef)(void 0),t=c();(0,i.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:i,linkActiveClassName:a,minHeadingLevel:s,maxHeadingLevel:o}=e;function l(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(i),l=function(e){let{minHeadingLevel:n,maxHeadingLevel:t}=e;const i=[];for(let a=n;a<=t;a+=1)i.push(`h${a}.anchor`);return Array.from(document.querySelectorAll(i.join()))}({minHeadingLevel:s,maxHeadingLevel:o}),c=r(l,{anchorTopOffset:t.current}),d=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,t){t?(n.current&&n.current!==e&&n.current.classList.remove(a),e.classList.add(a),n.current=e):e.classList.remove(a)}(e,e===d)}))}return document.addEventListener("scroll",l),document.addEventListener("resize",l),l(),()=>{document.removeEventListener("scroll",l),document.removeEventListener("resize",l)}}),[e,t])}var u=t(8774),m=t(4848);function g(e){let{toc:n,className:t,linkClassName:i,isChild:a}=e;return n.length?(0,m.jsx)("ul",{className:a?void 0:t,children:n.map((e=>(0,m.jsxs)("li",{children:[(0,m.jsx)(u.A,{to:`#${e.id}`,className:i??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,m.jsx)(g,{isChild:!0,toc:e.children,className:t,linkClassName:i})]},e.id)))}):null}const h=i.memo(g);function f(e){let{toc:n,className:t="table-of-contents table-of-contents__left-border",linkClassName:l="table-of-contents__link",linkActiveClassName:r,minHeadingLevel:c,maxHeadingLevel:u,...g}=e;const f=(0,a.p)(),v=c??f.tableOfContents.minHeadingLevel,p=u??f.tableOfContents.maxHeadingLevel,x=function(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:a}=e;return(0,i.useMemo)((()=>o({toc:s(n),minHeadingLevel:t,maxHeadingLevel:a})),[n,t,a])}({toc:n,minHeadingLevel:v,maxHeadingLevel:p});return d((0,i.useMemo)((()=>{if(l&&r)return{linkClassName:l,linkActiveClassName:r,minHeadingLevel:v,maxHeadingLevel:p}}),[l,r,v,p])),(0,m.jsx)(h,{toc:x,className:t,linkClassName:l,...g})}},996:(e,n,t)=>{t.d(n,{A:()=>g});t(6540);var i=t(4164),a=t(1312),s=t(5260),o=t(4848);function l(){return(0,o.jsx)(a.A,{id:"theme.unlistedContent.title",description:"The unlisted content banner title",children:"Unlisted page"})}function r(){return(0,o.jsx)(a.A,{id:"theme.unlistedContent.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function c(){return(0,o.jsx)(s.A,{children:(0,o.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}var d=t(7559),u=t(7293);function m(e){let{className:n}=e;return(0,o.jsx)(u.A,{type:"caution",title:(0,o.jsx)(l,{}),className:(0,i.A)(n,d.G.common.unlistedBanner),children:(0,o.jsx)(r,{})})}function g(e){return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(c,{}),(0,o.jsx)(m,{...e})]})}}}]); \ No newline at end of file diff --git a/build/assets/js/d049632c.b3b21402.js b/build/assets/js/d049632c.b3b21402.js new file mode 100644 index 0000000..d1e385c --- /dev/null +++ b/build/assets/js/d049632c.b3b21402.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[902],{5120:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>B,frontMatter:()=>r,metadata:()=>t,toc:()=>a});var i=s(4848),c=s(8453);const r={title:"\u65b0\u5b58\u50a8\u7ed3\u6784\uff1a\u8be6\u7ec6\u89e3\u6790",sidebar_position:16},l=void 0,t={id:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65b0\u5b58\u50a8\u65b9\u6848\uff1a\u8be6\u7ec6\u89e3\u6790/index",title:"\u65b0\u5b58\u50a8\u7ed3\u6784\uff1a\u8be6\u7ec6\u89e3\u6790",description:"\u6574\u4f53\u67b6\u6784",source:"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65b0\u5b58\u50a8\u65b9\u6848\uff1a\u8be6\u7ec6\u89e3\u6790/index.md",sourceDirName:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65b0\u5b58\u50a8\u65b9\u6848\uff1a\u8be6\u7ec6\u89e3\u6790",slug:"/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65b0\u5b58\u50a8\u65b9\u6848\uff1a\u8be6\u7ec6\u89e3\u6790/",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65b0\u5b58\u50a8\u65b9\u6848\uff1a\u8be6\u7ec6\u89e3\u6790/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65b0\u5b58\u50a8\u65b9\u6848\uff1a\u8be6\u7ec6\u89e3\u6790/index.md",tags:[],version:"current",sidebarPosition:16,frontMatter:{title:"\u65b0\u5b58\u50a8\u7ed3\u6784\uff1a\u8be6\u7ec6\u89e3\u6790",sidebar_position:16},sidebar:"tutorialSidebar",previous:{title:"\u65b0\u5b58\u50a8\u7ed3\u6784",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65b0\u5b58\u50a8\u7ed3\u6784/"},next:{title:"Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/"}},o={},a=[{value:"\u6574\u4f53\u67b6\u6784",id:"\u6574\u4f53\u67b6\u6784",level:2},{value:"\u6570\u636e\u683c\u5f0f",id:"\u6570\u636e\u683c\u5f0f",level:2},{value:"\u65e0\u6548\u6570\u636e\u6e05\u7406",id:"\u65e0\u6548\u6570\u636e\u6e05\u7406",level:2},{value:"RocksDB\u4f7f\u7528\u4f18\u5316",id:"rocksdb\u4f7f\u7528\u4f18\u5316",level:2},{value:"blobdb\u4f7f\u7528\u4f18\u5316",id:"blobdb\u4f7f\u7528\u4f18\u5316",level:3},{value:"dealslowkey",id:"dealslowkey",level:2},{value:"compact\u8001\u7684sst\u6587\u4ef6",id:"compact\u8001\u7684sst\u6587\u4ef6",level:3},{value:"\u65b0\u6280\u672f\u63a2\u7d22",id:"\u65b0\u6280\u672f\u63a2\u7d22",level:2}];function d(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",p:"p",pre:"pre",strong:"strong",...(0,c.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"\u6574\u4f53\u67b6\u6784",children:"\u6574\u4f53\u67b6\u6784"}),"\n",(0,i.jsx)(n.p,{children:"\u65b0\u7684\u5b58\u50a8\u67b6\u6784\u4e2d\uff0cpika\u5b9e\u4f8b\u5b58\u50a8\u5f15\u64ce\u5305\u62ec\u5185\u5b58\u7f13\u5b58redis\u548c\u786c\u76d8\u6301\u4e45\u5b58\u50a8RocksDB\u3002\u6bcf\u4e2apika\u5b9e\u4f8b\u7531\u4e00\u4e2aredis\u548c\u591a\u4e2aRocksDB\u5b9e\u4f8b\u6784\u6210\u3002"}),"\n",(0,i.jsx)(n.p,{children:"pika\u5f53\u524d\u662f\u5c06\u4e0d\u540c\u7684\u6570\u636e\u7c7b\u578b\u653e\u5728\u4e0d\u540c\u7684RocksDB\u5b9e\u4f8b\u4e2d\uff0c\u7ebf\u4e0a\u4f7f\u7528\u8fc7\u7a0b\u4e2d\u53d1\u73b0\uff0c\u540c\u4e00\u4e2a\u4e1a\u52a1\u670d\u52a1\u4f7f\u7528\u7684\u6570\u636e\u7c7b\u578b\u4e00\u822c\u96c6\u4e2d\u5728\u4e00\u4e24\u4e2a\u6570\u636e\u7c7b\u578b\u4e2d\uff0c\u65e0\u6cd5\u53d1\u6325\u591aRocksDB\u5b9e\u4f8b\u7684\u4f18\u52bf\u3002\u56e0\u6b64\uff0cpika\u65b0\u7248\u672c\u4e2d\u8ba1\u5212\u4e0d\u518d\u6309\u7167\u6570\u636e\u7c7b\u578b\u533a\u5206RocksDB\u5b9e\u4f8b\uff0c\u800c\u662f\u901a\u8fc7column-family\u533a\u5206\u3002\u5355\u4e2apika\u8282\u70b9\u7684RocksDB\u5b9e\u4f8b\u4e2a\u6570\u6839\u636e\u7269\u7406\u673a\u786c\u4ef6\u914d\u7f6e\u51b3\u5b9a\uff0c\u6bcf\u4e2aRocksDB\u5b9e\u4f8b\u4f7f\u7528\u72ec\u7acb\u7684compaction\u7ebf\u7a0b\u6c60\u548cflush\u7ebf\u7a0b\u6c60\uff0c\u521d\u6b21\u4e4b\u5916\u6bcf\u4e2aRocksDB\u5b9e\u4f8b\u4f7f\u7528\u4e00\u4e2a\u540e\u53f0\u7ebf\u7a0b\uff0c\u8be5\u540e\u53f0\u7ebf\u7a0b\u7528\u6765\u53d1\u8d77manual compaction\u4ee5\u53ca\u5bf9RocksDB\u4e2d\u5b58\u50a8\u7684\u6570\u636e\u8fdb\u884c\u5b9a\u671f\u7684\u7edf\u8ba1\u548c\u5de1\u68c0\u3002"}),"\n",(0,i.jsx)(n.p,{children:"\u6bcf\u4e2a\u8282\u70b9\u5728\u542f\u52a8\u65f6\u83b7\u53d6\u5230\u5f53\u524d\u8282\u70b9\u6301\u6709\u7684\u5206\u7247\uff08\u76ee\u524d\u4e0d\u652f\u6301\uff0c\u9700\u8981\u8fdb\u884c\u4ee3\u7801\u5f00\u53d1\uff09\uff0c\u5c06\u5206\u7247\u6392\u5e8f\u5e76\u7b49\u5206\u4e3aRocksDB\u5b9e\u4f8b\u4e2a\u6570\uff0c\u4fdd\u8bc1\u6bcf\u4e2a\u5206\u7247\u6301\u6709\u7684RocksDB\u5b9e\u4f8b\u4e2a\u6570\u8fd1\u4f3c\u76f8\u540c\u3002"}),"\n",(0,i.jsx)(n.h2,{id:"\u6570\u636e\u683c\u5f0f",children:"\u6570\u636e\u683c\u5f0f"}),"\n",(0,i.jsx)(n.p,{children:"\u4e3a\u4e86\u517c\u5bb9redis\u534f\u8bae\uff0c\u5373\u4e3a\u540c\u4e00\u4e2a\u6570\u636e\u7c7b\u578b\u7684\u6570\u636e\u8bbe\u7f6e\u7edf\u4e00\u7684\u8fc7\u671f\u65f6\u95f4\u503c\uff0c\u590d\u5408\u6570\u636e\u7c7b\u578b\u4e2d\u7684meta\u4fe1\u606f\u8fd8\u662f\u9700\u8981\u4fdd\u7559\uff0c\u5426\u5219ttl/expire\u63a5\u53e3\u64cd\u4f5c\u6027\u80fd\u8017\u65f6\u589e\u52a0\u3002\u589e\u52a0meta\u4fe1\u606f\u5bfc\u81f4\u7684\u6570\u636e\u5199\u5165\u8fc7\u7a0b\u4e2d\u4ea7\u751f\u7684\u67e5\u8be2\u5f00\u9500\uff0c\u8ba1\u5212\u901a\u8fc7\u589e\u52a0\u5185\u5b58cache\u7684\u65b9\u5f0f\u8fdb\u884c\u7f13\u89e3\uff0c\u5373\u8bfbmeta\u65f6\u4e5f\u662f\u4f18\u5148\u8bfb\u5185\u5b58\u7f13\u5b58cache\uff0c\u8bfb\u4e0d\u5230\u518d\u67e5\u786c\u76d8\u3002\u4e0d\u540c\u7684\u6570\u636e\u7c7b\u578b\u6df7\u5408\u4f7f\u7528RocksDB\u5b9e\u4f8b\uff0c\u901a\u8fc7column family\u4e2d\u8fdb\u884c\u533a\u5206\u3002"}),"\n",(0,i.jsx)(n.p,{children:"\u6570\u636e\u5b58\u50a8\u683c\u5f0f\u4e0e\u4e4b\u524d\u7684blackwidow\u57fa\u672c\u76f8\u540c\uff0c\u53ea\u662fkey\uff0cvalue\u589e\u52a0\u4e00\u4e9b\u5b57\u6bb5\u3002"}),"\n",(0,i.jsx)(n.p,{children:"\u5bf9\u4e8ekey\u6765\u8bb2\uff0c\u524d\u7f00\u589e\u52a08\u5b57\u8282\u7684reserve\u4fdd\u7559\u5b57\u6bb5\u4ee5\u53ca4\u5b57\u8282\u7684slotID\uff0c\u540e\u7f00\u589e\u52a016\u5b57\u8282\u7684\u4fdd\u7559\u5b57\u6bb5\u3002"}),"\n",(0,i.jsx)(n.p,{children:"\u5bf9\u4e8evalue\u6765\u8bb2\uff0c\u5728value\u6700\u540e\u7edf\u4e00\u589e\u52a0\uff1a16\u5b57\u8282\u7684\u4fdd\u7559\u5b57\u6bb5\uff0c8\u5b57\u8282\u7684\u6570\u636e\u7684\u5199\u5165\u65f6\u95f4cdate\uff0c8\u5b57\u8282\u7684\u6570\u636e\u8fc7\u671f\u65f6\u95f4\u3002"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"string\u7ed3\u6784"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-c",children:"key\u683c\u5f0f\n| reserve1 | db_id | slot_id | key | reserve2 | \n| 8B | 2B | 2B | | 16B |\n\nvalue\u683c\u5f0f\n| value | reserve | cdate | timestamp | \n| | 16B | 8B | 8B |\n\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"hash\u7ed3\u6784"})}),"\n",(0,i.jsx)(n.p,{children:"meta\u6570\u636e\u683c\u5f0f"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-c",children:"key\u683c\u5f0f\n| reserve1 | db_id | slot_id | key | reserve2 | \n| 8B | 2B | 2B | | 16B |\n\nvalue\u683c\u5f0f\n| hash_size | version | reserve | cdate | timestamp | \n| 4B | 8B | 16B | 8B | 8B |\n\n"})}),"\n",(0,i.jsx)(n.p,{children:"data\u6570\u636e\u683c\u5f0f"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-c",children:"key\u683c\u5f0f\n| reserve1 | db_id | slot_id | key size | key | version | field | reserve2 |\n| 8B | 2B | 2B | 4B | | 8B | | 16B |\n\nvalue\u683c\u5f0f\n| hash value | reserved | cdate |\n| | 16B | 8B | \n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"List\u7ed3\u6784"})}),"\n",(0,i.jsx)(n.p,{children:"meta\u6570\u636e\u683c\u5f0f"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-c",children:"key\u683c\u5f0f\n| reserve1 | db_id | slot_id | key | reserve2 |\n| 8B | 2B | 2B | | 16B |\n\nvalue\u683c\u5f0f\n| list_size | version | left index | right index | reserve | cdate | timestamp | \n| 4B | 8B | 8B | 8B | 16B | 8B | 8B |\n"})}),"\n",(0,i.jsx)(n.p,{children:"data\u6570\u636e\u683c\u5f0f"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-c",children:"key\u683c\u5f0f\n| reserve1 | db_id | slot_id | key size | key | version | index | reserve2 | \n| 8B | 2B | 2B | 4B | | 8B | 8B | 16B |\n\nvalue\u683c\u5f0f\n| value | reserve | cdate |\n| | 16B | 8B | \n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"set\u7ed3\u6784"})}),"\n",(0,i.jsx)(n.p,{children:"meta\u6570\u636e\u683c\u5f0f"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-c",children:"key\u683c\u5f0f\n| reserve1 | db_id | slot_id | key | Reserved2 |\n| 8B | 2B | 2B | | 16B |\n\nvalue\u683c\u5f0f\n| set_size | version | reserve | cdate | timestamp | \n| 4B | 8B | 16B | 8B | 8B |\n\n"})}),"\n",(0,i.jsx)(n.p,{children:"data\u6570\u636e\u683c\u5f0f"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-c",children:"key\u683c\u5f0f\n| reserve1 | db_id | slot_id | key size | key | Version | member | reserve2 |\n| 8B | 2B | 2B | 4B | | 8B | | 16B | \n\nvalue\u683c\u5f0f\n| reserve | cdate |\n| 16B | 8B | \n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"zset\u7ed3\u6784"})}),"\n",(0,i.jsx)(n.p,{children:"meta\u6570\u636e\u683c\u5f0f"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-c",children:"key\u683c\u5f0f\n| reserve1 | db_id | slot_id | key | reserve2 |\n| 8B | 2B | 2B | | 16B | \n\nvalue\u683c\u5f0f\n| zset_size | version | reserved | cdate | timestamp | \n| 4B | 8B | 16B | 8B | 8B |\n\n"})}),"\n",(0,i.jsx)(n.p,{children:"member to score\u6570\u636e\u683c\u5f0f"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-c",children:"key\u683c\u5f0f\n| reserve1 | db_id | slot_id | key size | key | version | Field | reserve2 |\n| 8B | 2B | 2B | 4B | | 8B | | 16B | \n\nvalue\u683c\u5f0f\n| score value | reserve | cdate |\n| 8B | 16B | 8B | \n"})}),"\n",(0,i.jsx)(n.p,{children:"score to member\u6570\u636e\u683c\u5f0f"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-c",children:"key\u683c\u5f0f\n| reserve1 | db_id | slot_id | key size | key | version | score | member | reserve2 |\n| 8B | 2B | 2B | 4B | | 8B | 8B | | 16B |\n\nvalue\u683c\u5f0f\n| reserve | cdate |\n| 16B | 8B | \n"})}),"\n",(0,i.jsx)(n.h2,{id:"\u65e0\u6548\u6570\u636e\u6e05\u7406",children:"\u65e0\u6548\u6570\u636e\u6e05\u7406"}),"\n",(0,i.jsx)(n.p,{children:"\u65e0\u6548\u6570\u636e\u5305\u62ec: 1. \u8bbe\u7f6e\u4e86\u8fc7\u671f\u65f6\u95f4\u4e14\u5df2\u7ecf\u8fc7\u671f\u7684\u6570\u636e. 2. \u4e1a\u52a1\u91cd\u590d\u5199\u5bfc\u81f4\u7684\u76f8\u540ckey\u7684\u8001\u7248\u672c\u6570\u636e\u30023. \u5df2\u7ecf\u8fc1\u51fa\u7684\u5206\u7247\u7684\u65e7\u6570\u636e\u3002\u7531\u4e8e\u5168\u91cf\u6570\u636e\u4fdd\u5b58\u5728RocksDB\u4e2d\uff0c\u56e0\u6b64\u65e0\u6548\u6570\u636e\u7684\u6e05\u7406\u4e3b\u8981\u662f\u901a\u8fc7\u81ea\u5b9a\u4e49\u7684compactionFIlter\u5b9e\u73b0\u3002"}),"\n",(0,i.jsx)(n.p,{children:"\u5bf9\u4e8estring\u7c7b\u578b\u6570\u636e\uff0ccompactionFIlter\u53ea\u9700\u8981\u6bd4\u5bf9value\u4e2d\u7684ttl\u503c\u5373\u53ef\u51b3\u5b9a\u3002\u5bf9\u4e8e\u590d\u6742\u6570\u636e\u7c7b\u578b\uff0c\u7531\u4e8edata\u6570\u636e\u662f\u6309\u7167field\u5355\u72ec\u5b58\u50a8\u800c\u4e14\u6ca1\u6709\u8bbe\u7f6e\u8fc7\u671f\u65f6\u95f4\uff0c\u56e0\u6b64\u5728compaction\u590d\u6742\u6570\u636e\u7c7b\u578b\u7684data\u6570\u636e\u65f6\uff0c\u9700\u8981\u83b7\u53d6meta\u4fe1\u606f\uff0c\u5305\u62eckey\u7684ttl\u4ee5\u53caversion\u3002\u4e3a\u51cf\u5c11compaction\u4e2d\u8bfbRocksDB\u5bfc\u81f4\u7684\u989d\u5916\u78c1\u76d8IO\u5f00\u9500\uff0c\u5c06\u590d\u6742\u6570\u636e\u7c7b\u578b\u7684\u5143\u4fe1\u606f\u7f13\u5b58\u5728\u5185\u5b58\u5b58\u50a8\u5f15\u64ce\u4e2d\u3002"}),"\n",(0,i.jsx)(n.p,{children:"\u5bf9\u4e8e\u5df2\u7ecf\u8fc1\u51fa\u7684\u5206\u7247\u7684\u65e7\u6570\u636e\uff0c\u9700\u8981\u8003\u8651\u5b58\u91cf\u7684\u5df2\u7ecf\u8fc1\u51fa\u7684\u65e0\u6548\u6570\u636e\u7684\u6e05\u7406\uff0c\u540c\u65f6\u8fd8\u8981\u4fdd\u8bc1\u5982\u679c\u8def\u7531\u8868\u518d\u4e00\u6b21\u53d8\u66f4\uff0c\u8fc1\u51fa\u7684\u5206\u7247\u91cd\u65b0\u8fc1\u56de\u5230\u5f53\u524d\u8282\u70b9\u4e4b\u540e\uff0c\u4e4b\u524d\u7684\u65e0\u6548\u6570\u636e\u4e0d\u8981\u88ab\u8bfb\u5230\u3002\u56e0\u6b64\uff0c\u5728\u5206\u7247\u8fc1\u79fb\u5b8c\u6210\u8def\u7531\u8868\u53d1\u751f\u53d8\u66f4\u4e4b\u540e\uff0c\u8fc1\u51fa\u70b9\u8282\u70b9\u5728\u672c\u5730\u78c1\u76d8\u6587\u4ef6\u4e2d\u8bb0\u5f55\u4e00\u4e2a\u8fc1\u51fa\u7684slot_id\uff0c\u5f53\u524d\u7684sequence_number\uff0c\u4ee5\u53ca\u6700\u65b0\u7684RocksDB filenumber\u3002\u5728\u81ea\u5b9a\u4e49\u7684compactionFilter\u6267\u884c\u65f6\uff0c\u4f1a\u53bb\u68c0\u6d4b\u5f53\u524dkey\u662f\u5426\u5c5e\u4e8e\u8be5slot_id\uff0c\u4ee5\u53casequence_number\u662f\u5426\u5c0f\u4e8e\u8bb0\u5f55\u7684sequence_number\uff0c\u53ea\u6709\u4e24\u4e2a\u6761\u4ef6\u90fd\u6ee1\u8db3\uff0c\u624d\u8ba4\u4e3a\u8fd9\u662f\u6570\u636e\u662f\u65e0\u6548\u6570\u636e\uff0c\u624d\u53ef\u4ee5\u5c06\u6570\u636e\u6e05\u9664\u6389\u3002\u5bf9\u4e8e\u5ba2\u6237\u7aef\u7684\u8bfb\u8bf7\u6c42\u548c\u904d\u5386\u8bf7\u6c42\uff0c\u5728\u8bfb\u51fa\u6570\u636e\u4e4b\u540e\u4e5f\u8981\u6bd4\u5bf9\u662f\u5426\u5c5e\u4e8e\u65e0\u6548\u6570\u636e\u3002\u5224\u65ad\u65b9\u5f0f\u540c\u7406\uff0c\u4e5f\u662f\u6bd4\u5bf9\u8bb0\u5f55\u7684slot_id, sequence_number\uff0c\u4ee5\u53caRocksDB filenumber\u3002"}),"\n",(0,i.jsx)(n.p,{children:"\u65e0\u6548\u6570\u636e\u6e05\u7406\u7684\u89e6\u53d1\u89c4\u5219\u5206\u4e3a\u4e24\u4e2a\uff0c\u4e00\u4e2a\u662fRocksDB\u7684auto compaction\u3002\u53e6\u4e00\u4e2a\u662fpika\u53d1\u8d77\u7684manual compaction\u3002"}),"\n",(0,i.jsx)(n.p,{children:"\u4e3a\u51cf\u5c11manual compaction\u5bf9\u5728\u7ebf\u670d\u52a1\u7684\u5f71\u54cd\uff0cmanual compaction\u7684\u6267\u884c\u9700\u8981\u6ee1\u8db3\u4e24\u4e2a\u6761\u4ef6\uff1a1. \u81ea\u5b9a\u4e49\u89e6\u53d1\u65f6\u95f4\u6bb5\u548c\u89e6\u53d1\u95f4\u9694\uff0c\u5982\u6bcf\u9694\u4e24\u5929\u6267\u884c\u4e00\u6b21\uff0c\u6267\u884c\u65f6\u95f4\u6307\u5b9a\u5728\u51cc\u6668\u4f4e\u5cf0\u671f\u30022. \u9650\u5236\u6bcf\u6b21\u6267\u884ccompaction\u7684\u6570\u636e\u91cf\uff0c\u9632\u6b62manual compaction\u6267\u884c\u65f6\u95f4\u8fc7\u957f\u963b\u585eauto compaction\u3002"}),"\n",(0,i.jsx)(n.h2,{id:"rocksdb\u4f7f\u7528\u4f18\u5316",children:"RocksDB\u4f7f\u7528\u4f18\u5316"}),"\n",(0,i.jsx)(n.h3,{id:"blobdb\u4f7f\u7528\u4f18\u5316",children:"blobdb\u4f7f\u7528\u4f18\u5316"}),"\n",(0,i.jsx)(n.p,{children:"RocksDB\u652f\u6301\u4e86key-value\u5206\u79bb\u7684\u5b9e\u73b0\uff0c\u5373\u901a\u8fc7\u5c06\u5927value\u5b58\u50a8\u5230blob\u6587\u4ef6\u4e2d\uff0c\u5728sst\u6587\u4ef6\u4e2d\u5b58\u50a8\u5927value\u5728blob\u6587\u4ef6\u7684\u7d22\u5f15\u4fe1\u606f\uff0c\u4ece\u800c\u51cf\u5c11\u5199\u5199\u653e\u5927\uff0c\u6709\u6548\u63d0\u5347\u5927value\u573a\u666f\u4e0b\u7684\u5199\u5165\u6027\u80fd\u3002pika\u4f9d\u8d56\u81ea\u5b9a\u4e49\u7684compactionFilter\u5b9e\u73b0\u8fc7\u671f\u6570\u636e\u7684\u5904\u7406\uff0cttl\u5b58\u50a8\u5728value\u4e2d\uff0c\u56e0\u6b64\u5728compaction\u8fc7\u7a0b\u4e2d\u4e0d\u53ef\u907f\u514d\u5bfc\u81f4\u989d\u5916\u7684blob\u6587\u4ef6IO\u3002\u4e00\u79cd\u65b9\u6cd5\u662f\u4fee\u6539sst\u6587\u4ef6\u4e2d\u5b58\u50a8\u7684blobindex\uff0c\u5728blobindex\u7684\u76f8\u540coffset\u4f4d\u7f6e\u5b58\u50a8value\u7684ttl\u503c\uff0c\u8fd9\u6837compaction\u8fc7\u7a0b\u4e2d\u5bf9\u8fc7\u671f\u6570\u636e\u7684\u6e05\u7406\u7684\u903b\u8f91\uff0c\u5c31\u4e0d\u9700\u8981\u67e5\u8be2blob\u6587\u4ef6\uff0c\u51cf\u5c11\u989d\u5916\u7684\u78c1\u76d8IO\u3002"}),"\n",(0,i.jsx)(n.h2,{id:"dealslowkey",children:"dealslowkey"}),"\n",(0,i.jsx)(n.p,{children:"\u53c2\u8003\u65b0\u6d6a\u5fae\u535a\u7684\u7ecf\u9a8c\uff0c\u5f53pika\u4e0a\u5c42\u4ee3\u7801\u53d1\u73b0\u4e00\u4e2a\u6162\u67e5\u8be2key\u65f6\uff0c\u53d1\u8d77\u4e00\u6b21manual compaction\uff0ccompaction\u7684\u8303\u56f4\u5373\u5bf9\u5e94\u7684key\u524d\u7f00\u5bf9\u5e94\u7684\u6570\u636e\u8303\u56f4\u3002\u6027\u80fd\u5f85\u9a8c\u8bc1\u3002"}),"\n",(0,i.jsx)(n.h3,{id:"compact\u8001\u7684sst\u6587\u4ef6",children:"compact\u8001\u7684sst\u6587\u4ef6"}),"\n",(0,i.jsxs)(n.p,{children:["\u53c2\u8003\u65b0\u6d6a\u5fae\u535a\u7684\u7ecf\u9a8c\uff0c\u5b9a\u671f\u5bf9\u6700\u8001\u7684sst\u6587\u4ef6\u8fdb\u884ccompaction\u53ef\u660e\u663e\u63d0\u5347\u96c6\u7fa4\u6027\u80fd\u3002\u770b\u5b98\u65b9\u6587\u6863\uff0c\u8c8c\u4f3c\u7c7b\u4f3c\u7684\u529f\u80fdRocksDB\u5df2\u7ecf\u652f\u6301\uff0c\u94fe\u63a5\u5982\u4e0b\uff1a",(0,i.jsx)(n.a,{href:"https://github.com/facebook/rocksdb/wiki/Leveled-Compaction#ttl%E3%80%82%E8%AE%A1%E5%88%92%E4%BD%BF%E7%94%A8RocksDB%E5%AE%98%E6%96%B9%E7%9A%84%E5%AE%9E%E7%8E%B0%E3%80%82",children:"https://github.com/facebook/rocksdb/wiki/Leveled-Compaction#ttl\u3002\u8ba1\u5212\u4f7f\u7528RocksDB\u5b98\u65b9\u7684\u5b9e\u73b0\u3002"})]}),"\n",(0,i.jsx)(n.h2,{id:"\u65b0\u6280\u672f\u63a2\u7d22",children:"\u65b0\u6280\u672f\u63a2\u7d22"}),"\n",(0,i.jsx)(n.p,{children:"\u4e3b\u8981\u662f\u5305\u62ec\u4e86RocksDB\u7684\u5f02\u6b65IO\uff0c\u534f\u7a0b\uff0cremote compaction\u7b49\u65b0\u6280\u672f\u7684\u6d4b\u8bd5\u548c\u843d\u5730\u3002"})]})}function B(e={}){const{wrapper:n}={...(0,c.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>l,x:()=>t});var i=s(6540);const c={},r=i.createContext(c);function l(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function t(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:l(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/d126de26.6561c01d.js b/build/assets/js/d126de26.6561c01d.js new file mode 100644 index 0000000..7a673fc --- /dev/null +++ b/build/assets/js/d126de26.6561c01d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[2439],{9027:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>r,contentTitle:()=>c,default:()=>h,frontMatter:()=>s,metadata:()=>d,toc:()=>o});var l=i(4848),t=i(8453);const s={title:"\u5b89\u88c5\u4f7f\u7528",sidebar_position:100},c=void 0,d={id:"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5b89\u88c5\u4f7f\u7528/index",title:"\u5b89\u88c5\u4f7f\u7528",description:"\u5feb\u901f\u8bd5\u7528",source:"@site/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5b89\u88c5\u4f7f\u7528/index.md",sourceDirName:"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5b89\u88c5\u4f7f\u7528",slug:"/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5b89\u88c5\u4f7f\u7528/",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5b89\u88c5\u4f7f\u7528/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5b89\u88c5\u4f7f\u7528/index.md",tags:[],version:"current",sidebarPosition:100,frontMatter:{title:"\u5b89\u88c5\u4f7f\u7528",sidebar_position:100},sidebar:"tutorialSidebar",previous:{title:"\u526f\u672c\u4e00\u81f4\u6027\uff08\u4f7f\u7528\u6587\u6863\uff09",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u526f\u672c\u4e00\u81f4\u6027\uff08\u4f7f\u7528\u6587\u6863\uff09/"},next:{title:"\u526f\u672c\u4e00\u81f4\u6027\uff08\u8bbe\u8ba1\u6587\u6863\uff09",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u526f\u672c\u4e00\u81f4\u6027\uff08\u8bbe\u8ba1\u6587\u6863\uff09/"}},r={},o=[{value:"\u5feb\u901f\u8bd5\u7528",id:"\u5feb\u901f\u8bd5\u7528",level:2},{value:"\u7f16\u8bd1\u5b89\u88c5",id:"\u7f16\u8bd1\u5b89\u88c5",level:2},{value:"CentOS (Fedora, Redhat)",id:"centos-fedora-redhat",level:3},{value:"Debian (Ubuntu)",id:"debian-ubuntu",level:3},{value:"\u9759\u6001\u7f16\u8bd1\u65b9\u6cd5",id:"\u9759\u6001\u7f16\u8bd1\u65b9\u6cd5",level:3},{value:"\u4f7f\u7528",id:"\u4f7f\u7528",level:2},{value:"\u6ce8\u610f",id:"\u6ce8\u610f",level:2}];function a(e){const n={a:"a",blockquote:"blockquote",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,t.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(n.h2,{id:"\u5feb\u901f\u8bd5\u7528",children:"\u5feb\u901f\u8bd5\u7528"}),"\n",(0,l.jsxs)(n.p,{children:["\u5982\u679c\u60f3\u5feb\u901f\u8bd5\u7528pika\uff0c\u76ee\u524d\u63d0\u4f9b\u4e86Centos5\uff0cCentos6\u548cDebian(Ubuntu16) binary\u7248\u672c\uff0c\u53ef\u4ee5\u5728",(0,l.jsx)(n.a,{href:"https://github.com/Qihoo360/pika/releases",children:"release\u9875\u9762"}),"\u770b\u5230\uff0c\u5177\u4f53\u6587\u4ef6\u662fpikaX.Y.Z_xxx_bin.tar.gz\u3002"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{children:"1. unzip file\n$ tar zxf pikaX.Y.Z_xxx_bin.tar.gz\n2. change working directory to output\nnote: we should in this directory, caz the RPATH is ./lib;\n$ cd output\n3. run pika:\n$ ./bin/pika -c conf/pika.conf\n"})}),"\n",(0,l.jsx)(n.h2,{id:"\u7f16\u8bd1\u5b89\u88c5",children:"\u7f16\u8bd1\u5b89\u88c5"}),"\n",(0,l.jsx)(n.h3,{id:"centos-fedora-redhat",children:"CentOS (Fedora, Redhat)"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"\u5b89\u88c5\u5fc5\u8981\u7684lib"}),"\n"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{children:"$ sudo yum install gflags-devel snappy-devel glog-devel protobuf-devel\n"})}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"\u53ef\u9009\u62e9\u7684lib"}),"\n"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{children:"$ sudo yum install zlib-devel lz4-devel libzstd-devel\n"})}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"\u5b89\u88c5gcc"}),"\n"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{children:"$ sudo yum install gcc-c++\n"})}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"\u5982\u679c\u673a\u5668gcc\u7248\u672c\u4f4e\u4e8e4.8\uff0c\u9700\u8981\u5207\u6362\u5230gcc4.8\u6216\u8005\u4ee5\u4e0a\uff0c\u4e0b\u9762\u6307\u4ee4\u53ef\u4e34\u65f6\u5207\u6362\u5230gcc4.8"}),"\n"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{children:"$ sudo wget -O /etc/yum.repos.d/slc6-devtoolset.repo http://linuxsoft.cern.ch/cern/devtoolset/slc6-devtoolset.repo\n$ sudo yum install --nogpgcheck devtoolset-2\n$ scl enable devtoolset-2 bash\n"})}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"\u83b7\u53d6\u9879\u76ee\u6e90\u4ee3\u7801"}),"\n"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{children:"$ git clone https://github.com/OpenAtomFoundation/pika.git\n"})}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"\u66f4\u65b0\u4f9d\u8d56\u7684\u5b50\u9879\u76ee"}),"\n"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{children:"$ cd pika\n$ git submodule update --init\n"})}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"\u5207\u6362\u5230\u6700\u65b0release\u7248\u672c"}),"\n"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{children:"a. \u6267\u884c git tag \u67e5\u770b\u6700\u65b0\u7684release tag\uff0c\uff08\u5982 v2.3.1\uff09\nb. \u6267\u884c git checkout TAG\u5207\u6362\u5230\u6700\u65b0\u7248\u672c\uff0c\uff08\u5982 git checkout v2.3.1\uff09\n"})}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"\u7f16\u8bd1"}),"\n"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{children:"$ make\n"})}),"\n",(0,l.jsxs)(n.blockquote,{children:["\n",(0,l.jsx)(n.p,{children:"note: \u82e5\u7f16\u8bd1\u8fc7\u7a0b\u4e2d\uff0c\u63d0\u793a\u6709\u4f9d\u8d56\u7684\u5e93\u6ca1\u6709\u5b89\u88c5\uff0c\u5219\u6709\u63d0\u793a\u5b89\u88c5\u540e\u518d\u91cd\u65b0\u7f16\u8bd1"}),"\n"]}),"\n",(0,l.jsx)(n.h3,{id:"debian-ubuntu",children:"Debian (Ubuntu)"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"\u5b89\u88c5\u5fc5\u8981\u7684lib"}),"\n"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{children:"$ sudo apt-get install libgflags-dev libsnappy-dev\n$ sudo apt-get install libprotobuf-dev protobuf-compiler\n$ sudo apt install libgoogle-glog-dev\n"})}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"\u83b7\u53d6\u9879\u76ee\u6e90\u4ee3\u7801"}),"\n"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{children:"$ git clone https://github.com/OpenAtomFoundation/pika.git\n$ cd pika\n"})}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"\u5207\u6362\u5230\u6700\u65b0release\u7248\u672c"}),"\n"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{children:"a. \u6267\u884c git tag \u67e5\u770b\u6700\u65b0\u7684release tag\uff0c\uff08\u5982 v2.3.1\uff09\nb. \u6267\u884c git checkout TAG\u5207\u6362\u5230\u6700\u65b0\u7248\u672c\uff0c\uff08\u5982 git checkout v2.3.1\uff09\n"})}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"\u7f16\u8bd1"}),"\n"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{children:"$ make\n"})}),"\n",(0,l.jsxs)(n.blockquote,{children:["\n",(0,l.jsx)(n.p,{children:"note: \u82e5\u7f16\u8bd1\u8fc7\u7a0b\u4e2d\uff0c\u63d0\u793a\u6709\u4f9d\u8d56\u7684\u5e93\u6ca1\u6709\u5b89\u88c5\uff0c\u5219\u6709\u63d0\u793a\u5b89\u88c5\u540e\u518d\u91cd\u65b0\u7f16\u8bd1"}),"\n"]}),"\n",(0,l.jsx)(n.h3,{id:"\u9759\u6001\u7f16\u8bd1\u65b9\u6cd5",children:(0,l.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/issues/1148",children:"\u9759\u6001\u7f16\u8bd1\u65b9\u6cd5"})}),"\n",(0,l.jsx)(n.h2,{id:"\u4f7f\u7528",children:"\u4f7f\u7528"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{children:"$ ./output/bin/pika -c ./conf/pika.conf\n"})}),"\n",(0,l.jsx)(n.h2,{id:"\u6ce8\u610f",children:"\u6ce8\u610f"}),"\n",(0,l.jsx)(n.p,{children:"\u542f\u52a8\u51fa\u73b0 Attempt to free invalid pointer \u95ee\u9898\u8bf7\u5c1d\u8bd5\u5347\u7ea7tcmalloc \u7248\u672c\uff0c\u5efa\u8bae\u4f7f\u7528gperftools 2.7 \u7248\u672c\u5305\u542b\u7684tcmalloc\u3002"})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,l.jsx)(n,{...e,children:(0,l.jsx)(a,{...e})}):a(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>c,x:()=>d});var l=i(6540);const t={},s=l.createContext(t);function c(e){const n=l.useContext(s);return l.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:c(e.components),l.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/e13eafd3.b5e529e3.js b/build/assets/js/e13eafd3.b5e529e3.js new file mode 100644 index 0000000..658401a --- /dev/null +++ b/build/assets/js/e13eafd3.b5e529e3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[7963],{2010:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>r,contentTitle:()=>l,default:()=>x,frontMatter:()=>t,metadata:()=>c,toc:()=>a});var o=i(4848),s=i(8453);const t={title:"\u7ba1\u7406\u6307\u4ee4",sidebar_position:40},l=void 0,c={id:"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u7ba1\u7406\u6307\u4ee4/index",title:"\u7ba1\u7406\u6307\u4ee4",description:"client kill all",source:"@site/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u7ba1\u7406\u6307\u4ee4/index.md",sourceDirName:"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u7ba1\u7406\u6307\u4ee4",slug:"/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u7ba1\u7406\u6307\u4ee4/",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u7ba1\u7406\u6307\u4ee4/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u7ba1\u7406\u6307\u4ee4/index.md",tags:[],version:"current",sidebarPosition:40,frontMatter:{title:"\u7ba1\u7406\u6307\u4ee4",sidebar_position:40},sidebar:"tutorialSidebar",previous:{title:"\u6570\u636e\u76ee\u5f55",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u6570\u636e\u76ee\u5f55/"},next:{title:"\u5dee\u5f02\u5316\u547d\u4ee4",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5dee\u5f02\u5316\u547d\u4ee4/"}},r={},a=[{value:"client kill all",id:"client-kill-all",level:2},{value:"bgsave",id:"bgsave",level:2},{value:"delbackup",id:"delbackup",level:2},{value:"info keyspace",id:"info-keyspace",level:2},{value:"config get/set *",id:"config-getset-",level:2},{value:"compact",id:"compact",level:2},{value:"readonly \uff083.1\u4e4b\u540e\u7248\u672c\u5e9f\u9664\uff09",id:"readonly-31\u4e4b\u540e\u7248\u672c\u5e9f\u9664",level:2}];function d(e){const n={br:"br",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h2,{id:"client-kill-all",children:"client kill all"}),"\n",(0,o.jsx)(n.p,{children:"\u5220\u9664\u5168\u90e8\u7684\u5ba2\u6237\u7aef"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"xxx.qihoo.net:8221> client kill all\nOK\nxxx.qihoo.net:8221>\n"})}),"\n",(0,o.jsx)(n.h2,{id:"bgsave",children:"bgsave"}),"\n",(0,o.jsx)(n.p,{children:"\u6267\u884c\u65b9\u5f0f\u548credis\u4e00\u6837\u3002\u4f46\u662f\u5f02\u6b65dump\u5b8c\u540e\uff0c\u6570\u636e\u5e93\u4fdd\u5b58\u5728dump_path\u76ee\u5f55\u4e0b\uff0cdump\u51fa\u6765\u7684\u6570\u636e\u5e93\u5305\u542bdump_prefix\u548cdump\u65f6\u95f4\u7b49\u4fe1\u606f\uff1b"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"xxx.qihoo.net:8221> BGSAVE\n20160422134755 : 2213: 32582292\n"})}),"\n",(0,o.jsx)(n.p,{children:"\u8fd4\u56de\u7684\u4fe1\u606f\u5305\u62ecdump\u7684\u65f6\u95f4\uff0820160422134755\uff09\u548c\u5f53\u524d\u7684binlog\u4f4d\u7f6e\uff0c\u5373\u6587\u4ef6\u53f7\uff1a\u504f\u79fb\u91cf\uff082213: 32582292\uff09"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"xxx.qihoo.net # ll /data3/pika_test/dump/\n\u603b\u7528\u91cf 0\ndrwxr-xr-x 1 root root 42 4\u6708 22 13:47 pika8221-20160422\n"})}),"\n",(0,o.jsx)(n.p,{children:'"/data3/pika_test/dump/"\u662fdump\u7684\u8def\u5f84\uff0c"pika9221-"\u4e3adump_prefix\uff0c20160422\u662fdump\u7684\u65e5\u671f'}),"\n",(0,o.jsx)(n.h2,{id:"delbackup",children:"delbackup"}),"\n",(0,o.jsx)(n.p,{children:"\u5220\u9664dump\u76ee\u5f55\u4e0b\u9664\u6b63\u5728\u4f7f\u7528\uff08\u5168\u540c\u6b65\u4e2d\uff09\u7684db\u5feb\u7167\u5916\u7684\u5176\u4ed6\u5feb\u7167"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"xxx.qihoo.net:8221> DELBACKUP\nOK\n"})}),"\n",(0,o.jsx)(n.h2,{id:"info-keyspace",children:"info keyspace"}),"\n",(0,o.jsxs)(n.p,{children:["\u6267\u884c\u65b9\u5f0f\u662f\u201cinfo keyspace 1\u201d\uff0c\u201cinfo keyspace 0\u201d\u548c\u201dinfo keyspace\u201c\uff0c \u201cinfo keyspace\u201d\u548c\u201cinfo keyspace 0\u201d\u7b49\u4ef7\uff1b",(0,o.jsx)(n.br,{}),"\n","info keyspace 1\uff1a \u5f02\u6b65\u5f00\u59cb\u4e00\u6b21keyspace\u7684\u626b\u63cf\uff0c\u5e76\u8fd4\u56de\u5df2\u5b8c\u6210\u7684\u4e0a\u4e00\u6b21keyspace\u626b\u63cf\u7684\u7ed3\u679c",(0,o.jsx)(n.br,{}),"\n","info keyspace 0: \u8fd4\u56de\u5df2\u5b8c\u6210\u7684\u4e0a\u4e00\u6b21keyspace\u626b\u63cf\u7684\u7ed3\u679c"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"xxx.qihoo.net:8221> info keyspace 1\n# Keyspace\n# Time:1970-01-01 08:00:00\nkv keys:0\nhash keys:0\nlist keys:0\nzset keys:0\nset keys:0\nxxx.qihoo.net:8221> info keyspace\n# Keyspace\n# Time:2016-04-22 13:45:54\nkv keys:13\nhash keys:0\nlist keys:0\nzset keys:0\nset keys:0\n"})}),"\n",(0,o.jsx)(n.h2,{id:"config-getset-",children:"config get/set *"}),"\n",(0,o.jsx)(n.p,{children:"config get\u548cconfig set\u7684\u7528\u6cd5\u548credis\u662f\u4e00\u6837\u7684\uff0c\u4f46\u662f\u9009\u9879\u53ef\u80fd\u4f1a\u6709\u6240\u4e0d\u540c\uff0c\u6240\u4ee5\u914d\u4e86\u4e24\u4e2a\u547d\u4ee4"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsx)(n.li,{children:"config get *"}),"\n",(0,o.jsx)(n.li,{children:"config set *\n\u7528\u4e8e\u5206\u522b\u5217\u51faconfig get\u548cconfig set\u6240\u80fd\u64cd\u4f5c\u7684\u9009\u9879"}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:'xxx.qihoo.net:8221> config get *\n 1) "port"\n 2) "thread_num"\n 3) "log_path"\n 4) "log_level"\n 5) "db_path"\n 6) "maxmemory"\n 7) "write_buffer_size"\n 8) "timeout"\n 9) "requirepass"\n10) "userpass"\n11) "userblacklist"\n12) "daemonize"\n13) "dump_path"\n14) "dump_prefix"\n15) "pidfile"\n16) "maxconnection"\n17) "target_file_size_base"\n18) "expire_logs_days"\n19) "expire_logs_nums"\n20) "root_connection_num"\n21) "slowlog_log_slower_than"\n22) "slave-read-only"\n23) "binlog_file_size"\n24) "compression"\n25) "db_sync_path"\n26) "db_sync_speed"\nxxx.qihoo.net:8221> config set *\n 1) "log_level"\n 2) "timeout"\n 3) "requirepass"\n 4) "userpass"\n 5) "userblacklist"\n 6) "dump_prefix"\n 7) "maxconnection"\n 8) "expire_logs_days"\n 9) "expire_logs_nums"\n10) "root_connection_num"\n11) "slowlog_log_slower_than"\n12) "slave-read-only"\n13) "db_sync_speed"\nbada06.add.zwt.qihoo.net:8221>\n'})}),"\n",(0,o.jsx)(n.h2,{id:"compact",children:"compact"}),"\n",(0,o.jsx)(n.p,{children:"\u56e0\u4e3apika\u5e95\u5c42\u5b58\u50a8\u5f15\u64ce\u662f\u57fa\u4e8erocksdb\u6539\u9020\u6765\u7684\uff0c\u4f1a\u5b58\u5728\u8bfb\u5199\u548c\u7a7a\u95f4\u653e\u5927\u7684\u95ee\u9898\uff0c\u9664\u4e86rocksdb\u7684\u81ea\u52a8compaction\uff0cpika\u4e5f\u8bbe\u7f6e\u4e86\u4e00\u4e2a\u624b\u52a8compaction\u7684\u547d\u4ee4\uff0c\u4ee5\u5f3a\u5236compact\u6574\u4e2akespace\u5185\u7684\u5185\u5bb9\uff0c\u652f\u6301\u5bf9\u5355\u4e2a\u6570\u636e\u7ed3\u6784\u8fdb\u884ccompact\uff0c\u8bed\u6cd5\u4e3a\uff1acompact [string/hash/set/zset/list/all]"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"xxx.qihoo.net:8221> compact\nOK\n"})}),"\n",(0,o.jsx)(n.p,{children:"\u4e00\u822ckeyspace\u6bd4\u8f83\u5927\u65f6\uff0c\u6267\u884c\u5b8ccompact\u547d\u4ee4\u540e\uff0c\u5360\u7528\u7a7a\u95f4\u4f1a\u663e\u8457\u51cf\u5c0f\uff0c\u4f46\u662f\u8017\u65f6\u6bd4\u8f83\u957f\uff0c\u5bf9\u8bfb\u5199\u6027\u80fd\u4e5f\u6709\u5f71\u54cd\uff0c\u6240\u4ee5\u5efa\u8bae\u5728\u6d41\u91cf\u4e0d\u5927\u7684\u60c5\u51b5\u4e0b\u6267\u884c"}),"\n",(0,o.jsx)(n.h2,{id:"readonly-31\u4e4b\u540e\u7248\u672c\u5e9f\u9664",children:"readonly \uff083.1\u4e4b\u540e\u7248\u672c\u5e9f\u9664\uff09"}),"\n",(0,o.jsxs)(n.p,{children:["\u8be5\u547d\u4ee4\u7528\u6237\u8bbe\u7f6e\u670d\u52a1\u5668\u7684\u5199\u6743\u9650\uff1b\u6267\u884c\u65b9\u5f0f\u4e3a\uff1a\n1\uff09\u201creadonly on\u201d",(0,o.jsx)(n.br,{}),"\n","2\uff09\u201creadonly off\u201d",(0,o.jsx)(n.br,{}),"\n","3\uff09\u201creadonly 1\u201d",(0,o.jsx)(n.br,{}),"\n","4\uff09\u201creadonly 0\u201d\n\u5176\u4e2d1\uff09\u548c3\uff09\u7b49\u4ef7\uff0c2\uff09\u548c4\uff09\u7b49\u4ef7"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:'xxx.qihoo.net:8221> set a b\nOK\nxxx.qihoo.net:8221> get a\n"b"\nxxx.qihoo.net:8221> readonly 1\nOK\nxxx.qihoo.net:8221> set a c\n(error) ERR Server in read-only\nxxx.qihoo.net:8221> get a\n"b"\nxxx.qihoo.net:8221> readonly 0\nOK\nxxx.qihoo.net:8221> set a c\nOK\nxxx.qihoo.net:8221> get a\n"c"\nxxx.qihoo.net:8221>\n'})})]})}function x(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>l,x:()=>c});var o=i(6540);const s={},t=o.createContext(s);function l(e){const n=o.useContext(t);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),o.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/e60cd9a4.0742af8f.js b/build/assets/js/e60cd9a4.0742af8f.js new file mode 100644 index 0000000..6872b77 --- /dev/null +++ b/build/assets/js/e60cd9a4.0742af8f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[935],{3860:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>h,frontMatter:()=>s,metadata:()=>t,toc:()=>o});var r=i(4848),l=i(8453);const s={title:"\u7f16\u7801\u89c4\u8303",sidebar_position:0},c=void 0,t={id:"\u5f00\u53d1\u6587\u6863/\u7f16\u7801\u89c4\u8303/index",title:"\u7f16\u7801\u89c4\u8303",description:"c++ coding style",source:"@site/docs/\u5f00\u53d1\u6587\u6863/\u7f16\u7801\u89c4\u8303/index.md",sourceDirName:"\u5f00\u53d1\u6587\u6863/\u7f16\u7801\u89c4\u8303",slug:"/\u5f00\u53d1\u6587\u6863/\u7f16\u7801\u89c4\u8303/",permalink:"/docs/\u5f00\u53d1\u6587\u6863/\u7f16\u7801\u89c4\u8303/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u5f00\u53d1\u6587\u6863/\u7f16\u7801\u89c4\u8303/index.md",tags:[],version:"current",sidebarPosition:0,frontMatter:{title:"\u7f16\u7801\u89c4\u8303",sidebar_position:0},sidebar:"tutorialSidebar",previous:{title:"\u7f16\u7801\u89c4\u8303",permalink:"/docs/\u5f00\u53d1\u6587\u6863/"},next:{title:"c++ coding style",permalink:"/docs/\u5f00\u53d1\u6587\u6863/coding-style/"}},d={},o=[{value:"c++ coding style",id:"c-coding-style",level:3},{value:"header file",id:"header-file",level:3},{value:"The define guard",id:"the-define-guard",level:4},{value:"Name and order of includes",id:"name-and-order-of-includes",level:4},{value:"scoping",id:"scoping",level:3},{value:"namespace",id:"namespace",level:4},{value:"class",id:"class",level:3},{value:"Doing work in constructors",id:"doing-work-in-constructors",level:4},{value:"Inheritance",id:"inheritance",level:4},{value:"Function",id:"function",level:3},{value:"parameter Ordering",id:"parameter-ordering",level:4},{value:"reference Arguments",id:"reference-arguments",level:4},{value:"function overloading",id:"function-overloading",level:4},{value:"default value",id:"default-value",level:4},{value:"scoping",id:"scoping-1",level:3},{value:"Nonmember, static member, global function",id:"nonmember-static-member-global-function",level:4},{value:"other",id:"other",level:3},{value:"\u5173\u4e8eexception \u7684\u4f7f\u7528",id:"\u5173\u4e8eexception-\u7684\u4f7f\u7528",level:4},{value:"\u5173\u4e8e\u8fd4\u56de\u503c",id:"\u5173\u4e8e\u8fd4\u56de\u503c",level:4},{value:"brace initializer List",id:"brace-initializer-list",level:4},{value:"sizeof",id:"sizeof",level:4},{value:"Run-Time Type Information(RTTI)",id:"run-time-type-informationrtti",level:4},{value:"cast",id:"cast",level:4},{value:"stream",id:"stream",level:4},{value:"Friend",id:"friend",level:4},{value:"use of const",id:"use-of-const",level:4},{value:"Integer type",id:"integer-type",level:4},{value:"0 and nullptr/NULL",id:"0-and-nullptrnull",level:4},{value:"Comments",id:"comments",level:3},{value:"TODO comment",id:"todo-comment",level:4}];function a(e){const n={a:"a",code:"code",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,l.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h3,{id:"c-coding-style",children:"c++ coding style"}),"\n",(0,r.jsx)(n.p,{children:"\u6211\u4eec\u57fa\u672c\u9075\u5faagoogle c++ coding style"}),"\n",(0,r.jsx)(n.h3,{id:"header-file",children:"header file"}),"\n",(0,r.jsx)(n.h4,{id:"the-define-guard",children:"The define guard"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.code,{children:"<PROJECT>_<PATH>_<FILE>_H_"})}),"\n",(0,r.jsx)(n.p,{children:"\u6bd4\u5982\u76ee\u5f55\u662ffoo/src/bar/baz.h \u5199\u6210"}),"\n",(0,r.jsx)(n.p,{children:"#ifndef FOO_SRC_BAR_H_"}),"\n",(0,r.jsx)(n.h4,{id:"name-and-order-of-includes",children:"Name and order of includes"}),"\n",(0,r.jsx)(n.p,{children:"\u987a\u5e8f\u662f"}),"\n",(0,r.jsxs)(n.p,{children:["Related header, C library, C++ library, other libraries'.h",(0,r.jsx)(n.code,{children:", your project's "}),".h`."]}),"\n",(0,r.jsx)(n.p,{children:"\u4e0d\u8981\u4f7f\u7528 . \u4ee5\u53ca .. \u8fd9\u6837\u7684\u7b26\u53f7"}),"\n",(0,r.jsx)(n.p,{children:"\u6bd4\u5982\u4e00\u4e2a\u9879\u76ee\u7684include \u5934\u6587\u4ef6\u5e94\u8be5\u662f\u8fd9\u6837"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-c++",children:'#include "foo/server/fooserver.h"\n\n#include <sys/types.h>\n#include <unistd.h>\n\n#include <hash_map>\n#include <vector>\n\n#include "base/basictypes.h"\n#include "base/commandlineflags.h"\n#include "foo/server/bar.h"\n\n'})}),"\n",(0,r.jsx)(n.h3,{id:"scoping",children:"scoping"}),"\n",(0,r.jsx)(n.h4,{id:"namespace",children:"namespace"}),"\n",(0,r.jsx)(n.h3,{id:"class",children:"class"}),"\n",(0,r.jsx)(n.h4,{id:"doing-work-in-constructors",children:"Doing work in constructors"}),"\n",(0,r.jsx)(n.p,{children:"constructor \u4e0d\u80fd\u8c03\u7528\u865a\u51fd\u6570, \u56e0\u4e3a\u5728\u6784\u9020\u7684\u65f6\u5019, \u8fd9\u4e2a\u5bf9\u8c61\u8fd8\u6ca1\u6709\u5b8c\u5168\u751f\u6210, \u56e0\u6b64\u8c03\u7528\u865a\u51fd\u6570\u80af\u5b9a\u662f\u4e0d\u5bf9\u7684"}),"\n",(0,r.jsx)(n.h4,{id:"inheritance",children:"Inheritance"}),"\n",(0,r.jsx)(n.p,{children:"\u4f7f\u7528 override \u6765\u8868\u793a\u67d0\u4e00\u4e2a\u51fd\u6570\u662fvirtual \u51fd\u6570\u7684\u91cd\u65b0\u5b9e\u73b0, \u8fd9\u6837\u5c31\u4e0d\u9700\u8981\u5728\u770b\u4ee3\u7801\u7684\u65f6\u5019\u786e\u8ba4\u8fd9\u4e2a\u51fd\u6570\u662f\u5426\u662f\u91cd\u8f7d, \u5982\u679c\u5728\u5b50\u7c7b\u91cc\u9762\u5bf9\u4e00\u4e2a\u7236\u7c7b\u6ca1\u6709\u7684\u51fd\u6570\u8fdb\u884coverride\u4e5f\u662f\u4f1a\u76f4\u63a5\u62a5\u9519\u7684"}),"\n",(0,r.jsx)(n.p,{children:"\u5728\u4f7f\u7528struct\u7684\u65f6\u5019 \u53ea\u7528\u5728\u53ea\u5b9a\u4e49\u6570\u636e,\u4e0d\u5305\u542b\u4efb\u4f55\u65b9\u6cd5\u7684\u7ed3\u6784\u4f53\u91cc\u9762\uff0c\u51fa\u4e86\u7b80\u5355\u7684\u6784\u9020\u51fd\u6570\u6216\u8005init\u51fd\u6570."}),"\n",(0,r.jsx)(n.p,{children:"\u901a\u8fc7\u4f7f\u7528\u7ee7\u627f\u53ef\u4ee5\u6709\u6548\u7684\u51cf\u5c11\u4ee3\u7801\u91cf \u5e76\u4e14\u56e0\u4e3a\u7ee7\u627f\u662f\u7f16\u8bd1\u65f6\u671f\u7684 \u56e0\u6b64\u5728\u7f16\u8bd1\u5668\u80fd\u591f\u8bc6\u522b\u8fd9\u4e9b\u9519\u8bef \u63a5\u53e3\u7ee7\u627f(\u4e5f\u5c31\u662f\u5b9a\u4e49\u7eaf\u865a\u51fd\u6570) \u66f4\u662f\u80fd\u591f\u5728\u7f16\u8bd1\u671f\u5c31\u8bc6\u522b\u4e00\u4e2a\u7ee7\u627f\u7684\u7c7b\u662f\u5426\u5b9e\u73b0\u4e86\u5168\u90e8\u7684\u63a5\u53e3"}),"\n",(0,r.jsx)(n.p,{children:"\u4f46\u662f\u7531\u4e8e\u7ee7\u627f\u628a\u4e00\u4e2a\u7c7b\u7684\u4ee3\u7801\u5206\u6563\u5728\u5404\u4e2a\u6587\u4ef6\u91cc\u9762\u4e86 \u56e0\u6b64\u589e\u52a0\u4e86\u770b\u4ee3\u7801\u7684\u96be\u5ea6 \u5e76\u4e14\u7236\u7c7b\u5b9a\u4e49\u81ea\u5df1\u7684\u6210\u5458\u53d8\u91cf \u56e0\u6b64\u8bbf\u95ee\u7684\u65f6\u5019\u4e0d\u662f\u5f88\u65b9\u4fbf"}),"\n",(0,r.jsxs)(n.p,{children:["\u6240\u4ee5\u4e00\u5b9a\u8981\u8d26\u53f7 is-a \u548c has-a\u7684\u5173\u7cfb \u4e00\u5b9a\u786e\u5b9a\u662f a\u662fb\u7684\u4e00\u79cd\u7684\u65f6\u5019\u624d\u53ef\u4ee5\u4f7f\u7528 \u7ee7\u627f ",(0,r.jsx)(n.strong,{children:"\u5426\u5219\u5c3d\u53ef\u80fd\u7684\u4f7f\u7528\u7ec4\u5408"})," \u4e5f\u5c31\u662fb\u91cc\u9762\u6709\u4e00\u4e2aa\u7684\u6210\u5458\u53d8\u91cf"]}),"\n",(0,r.jsx)(n.h3,{id:"function",children:"Function"}),"\n",(0,r.jsx)(n.h4,{id:"parameter-ordering",children:"parameter Ordering"}),"\n",(0,r.jsx)(n.p,{children:"\u51fd\u6570\u7684\u53d8\u91cf\u7684\u987a\u5e8f: input, \u7136\u540e\u662foutput"}),"\n",(0,r.jsx)(n.p,{children:"\u5c3d\u91cf\u628a\u4e00\u4e2a\u51fd\u6570\u63a7\u5236\u572840\u884c\u4ee5\u5185"}),"\n",(0,r.jsx)(n.h4,{id:"reference-arguments",children:"reference Arguments"}),"\n",(0,r.jsx)(n.p,{children:"\u6240\u6709\u901a\u8fc7\u5f15\u7528\u4f20\u53c2\u7684\u53d8\u91cf\u90fd\u9700\u8981\u52a0\u4e0aconst, \u4e5f\u5c31\u662f const type &in"}),"\n",(0,r.jsx)(n.p,{children:"\u5c3d\u53ef\u80fd\u7684input argument \u7528value \u6216\u8005 const reference(\u5f53\u7136\u5982\u679c\u8fd9\u4e2a\u53d8\u91cf\u5c31\u662f\u6307\u9488, \u90a3\u4e48\u4f20\u8fdb\u6765\u7684\u65f6\u5019\u5c31\u7528\u6307\u9488), \u7136\u540eoutput argument \u7528\u6307\u9488"}),"\n",(0,r.jsx)(n.p,{children:"\u8fd8\u6709\u5c31\u662f\u5982\u679c\u53d8\u91cf\u9700\u8981\u4f20\u8fdb\u6765NULL\u7684\u65f6\u5019, \u53ef\u80fd\u4f1a\u7528const T*"}),"\n",(0,r.jsx)(n.h4,{id:"function-overloading",children:"function overloading"}),"\n",(0,r.jsx)(n.p,{children:"\u5c3d\u53ef\u80fd\u7684\u4e0d\u8981\u4f7f\u7528 function overloading, \u56e0\u4e3afunction overloading \u589e\u52a0\u4e86c++ \u7684\u590d\u6742\u6027. \u7279\u522b\u662f\u5f53\u7ee7\u627f\u7684\u65f6\u5019, \u5b50\u7c7b\u53ea\u5b9e\u73b0\u4e86\u7236\u7c7b\u7684\u67d0\u4e00\u4e2afunction \u7684\u65f6\u5019, \u8fd9\u6837\u4ee3\u7801\u7684\u590d\u6742\u5ea6\u5c31\u66f4\u9ebb\u70e6\u4e86. \u56e0\u4e3a\u4e0d\u77e5\u9053\u91cd\u8f7d\u7684\u662f\u54ea\u4e00\u4e2a\u51fd\u6570, \u56e0\u6b64"}),"\n",(0,r.jsx)(n.p,{children:"\u5c3d\u53ef\u80fd\u7684\u4e0d\u8981\u4f7f\u7528function overloading, \u5f53\u9047\u5230\u51fd\u6570\u9700\u8981\u4e0d\u7528\u7684\u53d8\u91cf\u7c7b\u578b\u7684\u65f6\u5019, \u53ef\u4ee5\u5199\u6210\u8fd9\u79cdAppendString(), AppendInt() \u8fd9\u79cd"}),"\n",(0,r.jsx)(n.h4,{id:"default-value",children:"default value"}),"\n",(0,r.jsx)(n.p,{children:"\u5141\u8bb8\u5728\u975enon-virtual \u51fd\u6570\u91cc\u9762\u4f7f\u7528 default value"}),"\n",(0,r.jsx)(n.h3,{id:"scoping-1",children:"scoping"}),"\n",(0,r.jsx)(n.h4,{id:"nonmember-static-member-global-function",children:"Nonmember, static member, global function"}),"\n",(0,r.jsx)(n.p,{children:"\u5982\u679c\u6709\u4e00\u4e2a\u51fd\u6570\u548c\u4e00\u4e2a\u7c7b\u7684\u5bf9\u8c61\u91cc\u9762\u7684\u5185\u5bb9\u5e76\u4e0d\u76f8\u5173"}),"\n",(0,r.jsx)(n.p,{children:"\u90a3\u4e48\u8fd9\u4e2a\u65f6\u5019\u6709\u4e24\u4e2a\u9009\u62e9, \u53ef\u4ee5\u5b9a\u4e49\u6210class static member function, nonmember function. \u90a3\u4e48\u8fd9\u4e2a\u65f6\u5019\u5982\u4f55\u9009\u62e9?"}),"\n",(0,r.jsx)(n.p,{children:"\u5982\u679c\u8fd9\u4e2a\u51fd\u6570\u548c\u8fd9\u4e2a\u5bf9\u8c61\u5f3a\u76f8\u5173, \u6bd4\u5982\u662f\u5efa\u7acb\u4e00\u4e2a\u8fd9\u4e2a\u5bf9\u8c61, \u6216\u8005\u64cd\u4f5c\u8fd9\u4e2a\u7c7b\u7684\u9759\u6001\u6210\u5458\u51fd\u6570\u7684\u65f6\u5019, \u5c06\u8fd9\u4e2a\u51fd\u6570\u58f0\u660e\u6210class static member function"}),"\n",(0,r.jsx)(n.p,{children:"\u5426\u5219\u5c06\u8fd9\u4e2a\u51fd\u6570\u58f0\u660e\u6210nonmember function, \u7136\u540e\u7528namespace \u9694\u79bb\u5f00\u6765"}),"\n",(0,r.jsx)(n.p,{children:"\u5982\u679c\u6709\u4e00\u4e2a\u51fd\u6570\u53ea\u5728\u67d0\u4e00\u4e2a.cc \u6587\u4ef6\u91cc\u9762\u4f7f\u7528, \u90a3\u4e48\u53ef\u4ee5\u5c06\u8fd9\u4e2a\u51fd\u6570\u653e\u5728unnamed namespace \u6216\u8005\u7528static \u58f0\u660e static int foo() \u8fd9\u79cd"}),"\n",(0,r.jsx)(n.h3,{id:"other",children:"other"}),"\n",(0,r.jsx)(n.h4,{id:"\u5173\u4e8eexception-\u7684\u4f7f\u7528",children:"\u5173\u4e8eexception \u7684\u4f7f\u7528"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["pros:","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"exception \u53ef\u4ee5\u53d1\u73b0\u66f4\u6df1\u5c42\u6b21\u7684\u9519\u8bef, \u6bd4\u5982a()->b()->c()->d() \u90a3\u4e48\u5728d\u91cc\u9762\u629b\u51fa\u7684exception \u5728a\u91cc\u9762\u662f\u53ef\u4ee5\u76f4\u63a5\u6355\u83b7\u7684"}),"\n",(0,r.jsx)(n.li,{children:"\u6bd4\u5982\u5728c++ \u7684construction \u91cc\u9762, \u6211\u4eec\u662f\u65e0\u6cd5\u77e5\u9053\u8fd9\u4e2aconstruction \u662f\u5426\u6784\u9020\u6210\u529f,"}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["cons","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"\u200b"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h4,{id:"\u5173\u4e8e\u8fd4\u56de\u503c",children:"\u5173\u4e8e\u8fd4\u56de\u503c"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsx)(n.li,{children:"\u5728\u4e00\u4e2a\u51fd\u6570\u5185\u90e8\u8c03\u7528"}),"\n"]}),"\n",(0,r.jsx)(n.h4,{id:"brace-initializer-list",children:"brace initializer List"}),"\n",(0,r.jsxs)(n.p,{children:["\u5728c++11 \u91cc\u9762\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7"," \u6765\u521d\u59cb\u5316\u4e00\u4e2alist, \u8fd9\u4e2a\u662f\u5728c++ 11 \u4e4b\u524d\u90fd\u4e0d\u53ef\u4ee5\u7684, \u6bd4\u5982:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-c++",children:"int main()\n{\n std::vector<int> v{1, 2, 3};\n std::map<int, int> mp{{1, 2}, {1, 3}, {1, 4}};\n return 0;\n}\n"})}),"\n",(0,r.jsx)(n.h4,{id:"sizeof",children:"sizeof"}),"\n",(0,r.jsx)(n.p,{children:"\u5728\u4f7f\u7528sizeof \u7684\u65f6\u5019\u5c3d\u53ef\u80fd\u7684\u53bbsizeof(varname), \u800c\u4e0d\u662f\u53bbsizeof(type). \u56e0\u6b64\u8fd9\u4e2avarname \u968f\u65f6\u4f1a\u66f4\u65b0, \u5982\u679cvarname \u8fd9\u4e2a\u53d8\u91cf\u88ab\u8d4b\u503c\u7ed9\u5176\u4ed6\u5bf9\u8c61\u7684\u65f6\u5019"}),"\n",(0,r.jsx)(n.p,{children:"\u6ce8\u610fsizeof \u7684\u65f6\u5019\u8003\u8651\u5bf9\u9f50\u7684\u95ee\u9898"}),"\n",(0,r.jsx)(n.h4,{id:"run-time-type-informationrtti",children:"Run-Time Type Information(RTTI)"}),"\n",(0,r.jsx)(n.p,{children:"c++ \u5141\u8bb8\u5728\u8fd0\u884c\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528typeid, dynamic_cast \u6765\u68c0\u67e5\u4e00\u4e2a\u53d8\u91cf\u7684\u7c7b\u578b, \u901a\u8fc7dynamic_cast \u5728\u7c7b\u578b\u8f6c\u6362\u7684\u65f6\u5019\u8fdb\u884c\u68c0\u67e5, \u53ea\u5141\u8bb8\u7236\u7c7b\u7684\u6307\u9488\u6307\u5411\u5b50\u7c7b, \u800c\u4e0d\u5141\u8bb8\u5b50\u7c7b\u7684\u6307\u9488\u6307\u5411\u7236\u7c7b"}),"\n",(0,r.jsx)(n.p,{children:"\u4f46\u662f\u5176\u5b9e\u7528RTTI \u7684\u4ee3\u7801\u90fd\u53ef\u4ee5\u7528\u5176\u4ed6\u7684\u65b9\u5f0f\u6765\u5199, \u800cRTTI \u4e0d\u662f\u5f88\u9ad8\u6548, \u56e0\u6b64\u5c3d\u53ef\u80fd\u7528 virtual method, \u6216\u8005 Visitor pattern \u6a21\u5f0f\u6765\u5b9e\u73b0\u6bd4\u8f83\u597d"}),"\n",(0,r.jsx)(n.h4,{id:"cast",children:"cast"}),"\n",(0,r.jsx)(n.p,{children:"\u5c3d\u53ef\u80fd\u7684\u4f7f\u7528 c++ \u7684static_cast, const_cast, reinterpret_cast \u800c\u4e0d\u662f\u7528c \u91cc\u9762\u7684cast"}),"\n",(0,r.jsx)(n.h4,{id:"stream",children:"stream"}),"\n",(0,r.jsx)(n.p,{children:"\u5982\u679c\u4f60\u4e3a\u4e86debug\u60f3\u8981\u6253\u5370\u4e00\u4e2a\u5bf9\u8c61\u5185\u90e8\u7684\u7ec6\u8282, \u90a3\u4e48\u7ecf\u5e38\u4f1a\u63d0\u4f9b\u4e00\u4e2aDebugString() \u662f\u6700\u7ecf\u5e38\u7684"}),"\n",(0,r.jsx)(n.p,{children:"\u4e0d\u8981\u4f7f\u7528stream \u4f5c\u4e3a\u5916\u90e8\u7528\u6237\u7684IO, stream \u6027\u80fd\u8fd8\u662f\u4e0d\u884c\u7684"}),"\n",(0,r.jsx)(n.h4,{id:"friend",children:"Friend"}),"\n",(0,r.jsx)(n.p,{children:"\u5141\u8bb8\u4f7f\u7528 Friend class, function"}),"\n",(0,r.jsx)(n.p,{children:"Friend class \u867d\u7136\u4f1a\u7834\u574f\u4e86\u7c7b\u5c01\u88c5, \u5141\u8bb8\u5916\u90e8\u7c7b\u76f4\u63a5\u8bbf\u95ee\u5f53\u524d\u8fd9\u4e2a\u7c7b\u91cc\u9762\u7684\u79c1\u6709\u6210\u5458, \u5e38\u89c1\u7684\u7528\u6cd5\u5c31\u662fFooBuilder \u5e94\u8be5\u80fd\u591f\u8bbf\u95eeFoo \u91cc\u9762\u7684\u79c1\u6709\u6210\u5458. \u5982\u679c\u6ca1\u6709Friend class, \u8981\u4e48\u628aFoo \u7684\u6210\u5458\u90fd\u8bbe\u7f6e\u6210public, \u8981\u4e48\u7ed9\u6240\u6709\u7684\u6210\u5458\u53d8\u91cf\u90fd\u6dfb\u52a0get, set \u51fd\u6570. \u8fd8\u662f\u5f88\u4e0d\u65b9\u4fbf\u7684."}),"\n",(0,r.jsx)(n.p,{children:"Friend class \u53ea\u662f\u8ba9\u67d0\u4e00\u4e2a\u7c7b\u53ef\u4ee5\u8bbf\u95ee\u8fd9\u4e2a\u7c7b, \u8fd8\u662f\u6bd4\u8ba9\u6240\u6709\u7684\u6210\u5458\u53d8\u91cf\u90fdpublic \u6765\u8bf4, \u5c01\u88c5\u66f4\u597d\u4e00\u4e9b"}),"\n",(0,r.jsx)(n.p,{children:"\u56e0\u6b64Friend class \u9700\u8981\u770b\u5230Foo \u7684\u79c1\u6709\u53d8\u91cf, \u56e0\u6b64\u7ecf\u5e38\u5c06Friend class \u653e\u5728\u540c\u4e00\u4e2a\u5934\u6587\u4ef6\u91cc\u9762"}),"\n",(0,r.jsx)(n.h4,{id:"use-of-const",children:"use of const"}),"\n",(0,r.jsx)(n.p,{children:"\u80fd\u7528const \u7684\u5730\u65b9\u5c3d\u53ef\u80fd\u7684\u4f7f\u7528const"}),"\n",(0,r.jsx)(n.h4,{id:"integer-type",children:"Integer type"}),"\n",(0,r.jsxs)(n.p,{children:["\u7528",(0,r.jsx)(n.code,{children:"<stdint.h>"})," \u91cc\u9762\u5b9a\u4e49\u7684int32_t, int64_t \u7b49\u7b49, \u800c\u4e0d\u9002\u7528short, long, long long \u8fd9\u79cd\u7c7b\u578b, \u56e0\u4e3ashort, long \u7b49\u662f\u6839\u636e\u7f16\u8bd1\u5668\u548c\u5e73\u53f0\u662f\u4e0d\u4e00\u6837\u7684"]}),"\n",(0,r.jsx)(n.h4,{id:"0-and-nullptrnull",children:"0 and nullptr/NULL"}),"\n",(0,r.jsx)(n.p,{children:"Use 0 for integers, 0.0 for reals, nullptr (or NULL) for pointers, and '\\0' for chars."}),"\n",(0,r.jsx)(n.p,{children:"\u5728\u652f\u6301c++11 \u7684\u9879\u76ee\u91cc\u9762\u5c3d\u53ef\u80fd\u4f7f\u7528nullptr"}),"\n",(0,r.jsx)(n.h3,{id:"comments",children:"Comments"}),"\n",(0,r.jsx)(n.h4,{id:"todo-comment",children:"TODO comment"}),"\n",(0,r.jsx)(n.p,{children:"\u5199TODO comment \u7684\u65f6\u5019\u8bb0\u5f97\u5199\u4e0a\u8c01\u5199\u7684\u8fd9\u4e2aTODO"}),"\n",(0,r.jsxs)(n.p,{children:["// TODO(",(0,r.jsx)(n.a,{href:"mailto:kl@gmail.com",children:"kl@gmail.com"}),'): Use a "*" here for concatenation operator.']})]})}function h(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>c,x:()=>t});var r=i(6540);const l={},s=r.createContext(l);function c(e){const n=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function t(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:c(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/e85952ae.8483bccd.js b/build/assets/js/e85952ae.8483bccd.js new file mode 100644 index 0000000..752ca44 --- /dev/null +++ b/build/assets/js/e85952ae.8483bccd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[9145],{3692:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>a,contentTitle:()=>o,default:()=>u,frontMatter:()=>l,metadata:()=>s,toc:()=>c});var r=n(4848),t=n(8453);const l={title:"\u7ebf\u7a0b\u6a21\u578b",sidebar_position:1},o=void 0,s={id:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u7ebf\u7a0b\u6a21\u578b/index",title:"\u7ebf\u7a0b\u6a21\u578b",description:"pika\u4f7f\u7528\u7684\u662f\u591a\u7ebf\u7a0b\u6a21\u578b\uff0c\u4f7f\u7528\u591a\u4e2a\u5de5\u4f5c\u7ebf\u7a0b\u6765\u8fdb\u884c\u8bfb\u5199\u64cd\u4f5c\uff0c\u7531\u5e95\u5c42blackwidow\u5f15\u64ce\u6765\u4fdd\u8bc1\u7ebf\u7a0b\u5b89\u5168\uff0c\u7ebf\u7a0b\u5206\u4e3a12\u79cd\uff1a",source:"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u7ebf\u7a0b\u6a21\u578b/index.md",sourceDirName:"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u7ebf\u7a0b\u6a21\u578b",slug:"/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u7ebf\u7a0b\u6a21\u578b/",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u7ebf\u7a0b\u6a21\u578b/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u7ebf\u7a0b\u6a21\u578b/index.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"\u7ebf\u7a0b\u6a21\u578b",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"\u6574\u4f53\u6280\u672f\u67b6\u6784",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u6574\u4f53\u6280\u672f\u67b6\u6784/"},next:{title:"\u9501\u7684\u5e94\u7528",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u9501\u7684\u5e94\u7528/"}},a={},c=[];function d(e){const i={li:"li",p:"p",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(i.p,{children:"pika\u4f7f\u7528\u7684\u662f\u591a\u7ebf\u7a0b\u6a21\u578b\uff0c\u4f7f\u7528\u591a\u4e2a\u5de5\u4f5c\u7ebf\u7a0b\u6765\u8fdb\u884c\u8bfb\u5199\u64cd\u4f5c\uff0c\u7531\u5e95\u5c42blackwidow\u5f15\u64ce\u6765\u4fdd\u8bc1\u7ebf\u7a0b\u5b89\u5168\uff0c\u7ebf\u7a0b\u5206\u4e3a12\u79cd\uff1a"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"PikaServer\uff1a\u4e3b\u7ebf\u7a0b"}),"\n",(0,r.jsx)(i.li,{children:"DispatchThread\uff1a\u76d1\u542c1\u4e2a\u7aef\u53e3\uff0c\u63a5\u6536\u7528\u6237\u8fde\u63a5\u8bf7\u6c42"}),"\n",(0,r.jsx)(i.li,{children:"WorkerThread\uff1a\u5b58\u5728\u591a\u4e2a(\u7528\u6237\u914d\u7f6e)\uff0c\u6bcf\u4e2a\u7ebf\u7a0b\u91cc\u6709\u82e5\u5e72\u4e2a\u7528\u6237\u5ba2\u6237\u7aef\u7684\u8fde\u63a5\uff0c\u8d1f\u8d23\u63a5\u6536\u7528\u6237\u547d\u4ee4\uff0c\u7136\u540e\u5c06\u547d\u4ee4\u5c01\u88c5\u6210\u4e00\u4e2aTask\u6254\u5230ThreadPool\u6267\u884c\uff0c\u4efb\u52a1\u6267\u884c\u5b8c\u6bd5\u4e4b\u540e\u7531\u8be5\u7ebf\u7a0b\u5c06reply\u8fd4\u56de\u7ed9\u7528\u6237"}),"\n",(0,r.jsx)(i.li,{children:"ThreadPool\uff1a\u7ebf\u7a0b\u6c60\u4e2d\u7684\u7ebf\u7a0b\u6570\u91cf\u7531\u7528\u6237\u914d\u7f6e\uff0c\u6267\u884cWorkerThread\u8c03\u5ea6\u8fc7\u6765\u7684Task, Task\u7684\u5185\u5bb9\u4e3b\u8981\u662f\u5199DB\u548c\u5199Binlog"}),"\n",(0,r.jsx)(i.li,{children:"PikaAuxiliaryThread\uff1a\u8f85\u52a9\u7ebf\u7a0b\uff0c\u5904\u7406\u540c\u6b65\u8fc7\u7a0b\u4e2d\u72b6\u6001\u673a\u72b6\u6001\u7684\u5207\u6362\uff0c\u4e3b\u4ece\u4e4b\u95f4\u5fc3\u8df3\u7684\u53d1\u9001\u4ee5\u53ca\u8d85\u65f6\u68c0\u67e5"}),"\n",(0,r.jsx)(i.li,{children:"PikaReplClient\uff1a\u672c\u8d28\u4e0a\u662f\u4e00\u4e2aEpoll\u7ebf\u7a0b(\u4e0e\u5176\u4ed6Pika\u5b9e\u4f8b\u7684PikaReplServer\u8fdb\u884c\u901a\u4fe1)\u52a0\u4e0a\u4e00\u4e2a\u7531\u82e5\u5e72\u7ebf\u7a0b\u7ec4\u6210\u7684\u7ebf\u7a0b\u6570\u7ec4(\u5f02\u6b65\u7684\u5904\u7406\u5199Binlog\u4ee5\u53ca\u5199DB\u7684\u4efb\u52a1)"}),"\n",(0,r.jsx)(i.li,{children:"PikaReplServer\uff1a\u672c\u8d28\u4e0a\u662f\u4e00\u4e2aEpoll\u7ebf\u7a0b(\u4e0e\u5176\u4ed6Pika\u5b9e\u4f8b\u7684PikaReplClient\u8fdb\u884c\u901a\u4fe1)\u52a0\u4e0a\u4e00\u4e2a\u7531\u82e5\u5e72\u7ebf\u7a0b\u7ec4\u6210\u7684\u7ebf\u7a0b\u6c60(\u5904\u7406\u540c\u6b65\u7684\u8bf7\u6c42\u4ee5\u53ca\u6839\u636e\u4ece\u5e93\u8fd4\u56de\u7684Ack\u66f4\u65b0Binlog\u6ed1\u7a97)"}),"\n",(0,r.jsx)(i.li,{children:"KeyScanThread\uff1a\u5728\u8fd9\u4e2a\u7ebf\u7a0b\u4e2d\u6267\u884cinfo keyspace 1\u89e6\u53d1\u7684\u7edf\u8ba1Key\u6570\u91cf\u7684\u4efb\u52a1"}),"\n",(0,r.jsx)(i.li,{children:"BgSaveThread\uff1a\u5bf9\u6307\u5b9a\u7684DB\u8fdb\u884cDump\u64cd\u4f5c\uff0c\u4ee5\u53ca\u5168\u540c\u6b65\u7684\u65f6\u5019\u53d1\u9001Dump\u6570\u636e\u5230\u4ece\u5e93\uff08\u5bf9\u4e00\u4e2aDB\u6267\u884c\u5168\u540c\u6b65\u662f\u5148\u540e\u5411Thread\u4e2d\u6254\u4e86BgSave\u4ee5\u53caDBSync\u4e24\u4e2a\u4efb\u52a1\u4ece\u800c\u4fdd\u8bc1\u987a\u5e8f)"}),"\n",(0,r.jsx)(i.li,{children:"PurgeThread\uff1a\u7528\u4e8e\u6e05\u7406\u8fc7\u671f\u7684Binlog\u6587\u4ef6"}),"\n",(0,r.jsx)(i.li,{children:"PubSubThread\uff1a\u7528\u4e8e\u652f\u6301PubSub\u76f8\u5173\u529f\u80fd"}),"\n"]})]})}function u(e={}){const{wrapper:i}={...(0,t.R)(),...e.components};return i?(0,r.jsx)(i,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>o,x:()=>s});var r=n(6540);const t={},l=r.createContext(t);function o(e){const i=r.useContext(l);return r.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function s(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),r.createElement(l.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/ea50f5f5.25d05aae.js b/build/assets/js/ea50f5f5.25d05aae.js new file mode 100644 index 0000000..e5e717a --- /dev/null +++ b/build/assets/js/ea50f5f5.25d05aae.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[2526],{4798:(i,n,e)=>{e.r(n),e.d(n,{assets:()=>r,contentTitle:()=>s,default:()=>d,frontMatter:()=>a,metadata:()=>o,toc:()=>c});var t=e(4848),l=e(8453);const a={title:"What's new in Pika v3.5.1",slug:"Pika-3.5.1",authors:[{name:"\u4e8e\u96e8",title:"dubbo-go\u5f00\u6e90\u793e\u533a"}],hide_table_of_contents:!1},s=void 0,o={permalink:"/blog/Pika-3.5.1",source:"@site/blog/2023-09-28-Pika-3.5.1.md",title:"What's new in Pika v3.5.1",description:"Pika \u793e\u533a\u5f88\u9ad8\u5174\u5ba3\u5e03\uff0c\u6211\u4eec\u4eca\u5929\u53d1\u5e03\u5df2\u7ecf\u8fc7\u6211\u4eec\u751f\u4ea7\u73af\u5883\u9a8c\u8bc1 v3.5.1 \u7248\u672c https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.1 \u3002",date:"2023-09-28T00:00:00.000Z",tags:[],readingTime:4.385,hasTruncateMarker:!1,authors:[{name:"\u4e8e\u96e8",title:"dubbo-go\u5f00\u6e90\u793e\u533a"}],frontMatter:{title:"What's new in Pika v3.5.1",slug:"Pika-3.5.1",authors:[{name:"\u4e8e\u96e8",title:"dubbo-go\u5f00\u6e90\u793e\u533a"}],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"What's new in Pika v3.5.0",permalink:"/blog/Pika-3.5.0"},nextItem:{title:"What's new in Pika v3.5.0",permalink:"/blog/Pika-3.5.0"}},r={authorsImageUrls:[void 0]},c=[{value:"\u65b0\u7279\u6027",id:"\u65b0\u7279\u6027",level:2},{value:"2 bug \u4fee\u590d",id:"2-bug-\u4fee\u590d",level:2},{value:"3 \u4f7f\u7528\u5efa\u8bae",id:"3-\u4f7f\u7528\u5efa\u8bae",level:2}];function h(i){const n={a:"a",h2:"h2",img:"img",li:"li",p:"p",ul:"ul",...(0,l.R)(),...i.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.p,{children:["Pika \u793e\u533a\u5f88\u9ad8\u5174\u5ba3\u5e03\uff0c\u6211\u4eec\u4eca\u5929\u53d1\u5e03\u5df2\u7ecf\u8fc7\u6211\u4eec\u751f\u4ea7\u73af\u5883\u9a8c\u8bc1 v3.5.1 \u7248\u672c ",(0,t.jsx)(n.a,{href:"https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.1",children:"https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.1"})," \u3002"]}),"\n",(0,t.jsx)(n.p,{children:"\u8be5\u7248\u672c\u4e0d\u4ec5\u505a\u4e86\u5f88\u591a\u4f18\u5316\u5de5\u4f5c\uff0c\u8fd8\u5f15\u5165\u4e86\u591a\u9879\u65b0\u529f\u80fd\u3002\u8fd9\u4e9b\u65b0\u529f\u80fd\u5305\u62ec \u52a8\u6001\u5173\u95ed WAL\u3001ReplicationID \u68c0\u6d4b\u662f\u5426\u589e\u91cf\u590d\u5236\u3001\u5728 K8s \u73af\u5883\u4e0a Pika \u670d\u52a1\u7684\u81ea\u52a8\u6ce8\u518c\u4ece\u800c\u5b9e\u73b0\u96c6\u7fa4\u7684\u81ea\u7ec4\u7ec7\u3001\u4ee5\u53ca exporter \u68c0\u6d4b\u96c6\u7fa4\u6307\u6807\u7b49\u7b49\uff0c\u65e0\u7591\u5c06\u4f1a\u8ba9\u7528\u6237\u4eab\u53d7\u5230\u66f4\u4e3a\u7a33\u5b9a\u548c\u9ad8\u6548\u7684 NoSQL \u4f7f\u7528\u4f53\u9a8c\u3002"}),"\n",(0,t.jsx)(n.h2,{id:"\u65b0\u7279\u6027",children:"\u65b0\u7279\u6027"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"1 Slow log \u589e\u52a0\u961f\u5217\u7b49\u5f85\u65f6\u95f4\u7edf\u8ba1\uff0c\u5728\u961f\u5217\u963b\u585e\u7684\u65f6\u5019\u65b9\u4fbf\u6211\u4eec\u8fdb\u884c\u95ee\u9898\u5b9a\u4f4d\u3002PR 1997\uff0c \u4f5c\u8005 wangshao1\u3002"}),"\n",(0,t.jsx)(n.li,{children:"2 \u4e3b\u4ece\u590d\u5236\u4f7f\u7528 ReplicationID \u5224\u65ad\u662f\u5426\u8fdb\u884c\u589e\u91cf\u540c\u6b65\uff0c\u89e3\u51b3\u539f\u4e3b\u4ece\u540c\u6b65\u65b9\u5f0f\u5207\u4e3b\u540e\u6574\u4e2a\u6570\u636e\u96c6\u4f1a\u8fdb\u884c\u5168\u91cf\u590d\u5236\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u63d0\u5347 Pika \u6027\u80fd\u3002PR 1951\uff0c \u4f5c\u8005 Mixficsol\u3002"}),"\n",(0,t.jsx)(n.li,{children:"3 WAL \u4ee5 'disablewal' \u547d\u4ee4\u65b9\u5f0f\u652f\u6301\u52a8\u6001\u5173\u95ed\uff0c\u5728\u5199\u6027\u80fd\u9047\u5230\u74f6\u9888\u7684\u65f6\u5019\uff0c\u53ef\u4ee5\u901a\u8fc7\u547d\u4ee4\u5173\u95ed WAL \u7f13\u89e3\u5199\u6027\u80fd\u4e0b\u964d\u7684\u95ee\u9898\uff0c\u5173\u95ed WAL \u6709\u673a\u5668\u5b95\u673a\u540e\u4e22\u5931\u6570\u636e\u7684\u98ce\u9669\uff0c\u7528\u6237\u9700\u8981\u6839\u636e\u81ea\u5df1\u7684\u4f7f\u7528\u4e60\u60ef\u6743\u8861\u3002PR 2015\uff0c\u4f5c\u8005 Mixficsol\u3002"}),"\n",(0,t.jsx)(n.li,{children:"4 flush \u7ebf\u7a0b\u6570\u548c compaction \u7ebf\u7a0b\u6570\u5408\u4e8c\u4e3a\u4e00\uff0c\u5728 Compaction \u6027\u80fd\u74f6\u9888\u65f6\uff0c\u53ef\u4ee5\u52a8\u6001\u8c03\u6574\u7ebf\u7a0b\u6570\uff0c\u7f13\u89e3 Comapction \u635f\u8017 Pika \u6027\u80fd\u7684\u95ee\u9898\u3002PR 2014\uff0c \u4f5c\u8005 Tianpingan\u3002"}),"\n",(0,t.jsx)(n.li,{children:"5 \u5347\u7ea7\u4e86 RocksDB \u7248\u672c\u5230 v8.3.3\u3002PR 2000\uff0c \u4f5c\u8005 dingxiaoshuai123\u3002"}),"\n",(0,t.jsx)(n.li,{children:"6 \u65b0\u589e\u5468\u671f\u6027\u6253\u5370\u5de5\u4f5c\u961f\u5217\u7684\u957f\u5ea6\u529f\u80fd\uff0c\u5728\u961f\u5217\u963b\u585e\u7684\u65f6\u5019\u53ef\u4ee5\u5feb\u901f\u5b9a\u4f4d\u95ee\u9898\u3002PR 1978\uff0c \u4f5c\u8005 Tianpingan\u3002"}),"\n",(0,t.jsx)(n.li,{children:"7 \u65b0\u589e\u5229\u7528\u4e00\u4e2a pika_exporter \u76d1\u6d4b\u6574\u4e2a\u96c6\u7fa4\u7684\u6307\u6807\uff0c\u5b9e\u73b0\u4e00\u4e2a Pika Exporter \u5b9e\u4f8b\u76d1\u63a7\u6574\u4e2a\u96c6\u7fa4\uff0c\u89e3\u51b3\u4e86 3.5.0 \u7248\u672c\u4e00\u4e2a Pika Exporter \u76d1\u6d4b\u4e00\u4e2a Pika \u5b9e\u4f8b\u6d88\u8017\u8d44\u6e90\u7684\u95ee\u9898\u3002PR 1953\uff0c \u4f5c\u8005 chenbt-hz\u3002"}),"\n",(0,t.jsx)(n.li,{children:"8 \u5b9e\u73b0\u5728 K8s \u73af\u5883\u4e0a Pika \u670d\u52a1\u7684\u81ea\u52a8\u6ce8\u518c\uff0c\u5728\u542f\u52a8\u65f6\u81ea\u52a8\u6ce8\u518c\uff0c\u4ece\u800c\u5b9e\u73b0\u96c6\u7fa4\u7684\u81ea\u7ec4\u7ec7 \uff0c\u5b9e\u73b0\u4e86\u901a\u8fc7\u547d\u4ee4\u62c9\u8d77\u6574\u4e2a Pika Cluster \u96c6\u7fa4\u3002PR 1931\uff0c \u4f5c\u8005 machinly\u3002"}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"2-bug-\u4fee\u590d",children:"2 bug \u4fee\u590d"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"1 \u8c03\u6574\u4e86 Rate_limit \u53c2\u6570\uff0c\u4fee\u590d\u4e86\u538b\u6d4b\u65f6\u51fa\u73b0 RPS \u4e3a 0 \u7684\u60c5\u51b5 \u3002PR 2009\uff0c \u4f5c\u8005 Mixficsol\u3002"}),"\n",(0,t.jsx)(n.li,{children:"2 \u4fee\u590d\u4e86 INFODATA \u547d\u4ee4\u4e2d\u5bf9\u4e8e\u904d\u5386\u6570\u636e\u6587\u4ef6\u65f6\u51fa\u73b0\u7a7a\u8def\u5f84\u7684\u903b\u8f91\u5224\u65ad\u3002PR 1996\uff0c \u4f5c\u8005 Mixficsol\u3002"}),"\n",(0,t.jsx)(n.li,{children:"3 \u4fee\u590d\u4e86 Codis \u5728\u7ebf\u4e0a\u51fa\u73b0\u5927\u6bdb\u523a\u7684\u95ee\u9898\u3002PR 2016\uff0c \u4f5c\u8005 chejinge\u3002"}),"\n",(0,t.jsx)(n.li,{children:"4 \u4fee\u590d\u4e86 macOS \u73af\u5883\u4e0b\u7f16\u8bd1\u4f7f\u7528 tools \u5bfc\u81f4\u7f16\u8bd1\u4e0d\u8fc7\u7684\u95ee\u9898 \u3002PR 2011\uff0c \u4f5c\u8005 A2ureStone\u3002"}),"\n",(0,t.jsx)(n.li,{children:"5 \u51cf\u5c11\u4e86 exporter \u975e\u5fc5\u8981\u65e5\u5fd7\u7684\u6253\u5370\uff0c\u964d\u4f4e \u4e86\u8d44\u6e90\u5229\u7528\u7387\u3002PR 1945\uff0c \u4f5c\u8005 Mixficsol\u3002"}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"3-\u4f7f\u7528\u5efa\u8bae",children:"3 \u4f7f\u7528\u5efa\u8bae"}),"\n",(0,t.jsx)(n.p,{children:"\u672c\u6b21\u65b0\u589e\u4e86\u51e0\u4e2a\u914d\u7f6e\u53c2\u6570\uff0c\u5927\u5bb6\u5728\u4f7f\u7528\u8fc7\u7a0b\u4e2d\uff0c\u9700\u8981\u6839\u636e\u4f7f\u7528\u60c5\u51b5\u6309\u9700\u8c03\u6574\uff1a"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"1 max-rsync-parallel-num\uff1a\u4e3b\u4ece\u5168\u91cf\u590d\u5236\u7ebf\u7a0b\u6570\uff0c\u9700\u8981\u6839\u636e\u81ea\u5df1\u673a\u5668 CPU \u6838\u6570\u548c\u90e8\u7f72\u5b9e\u4f8b\u4e2a\u6570\u8fdb\u884c\u8c03\u6574\uff0c\u5efa\u8bae\u6700\u5c0f\u8bbe\u7f6e\u4e3a 2\u3002"}),"\n",(0,t.jsx)(n.li,{children:"2 rate-limiter-bandwidth: \u9650\u5236 RocksDB \u6570\u636e\u5e93\u8bfb\u5199\u901f\u5ea6\uff0c\u9650\u5236\u6570\u636e\u5e93\u5728\u4e00\u5b9a\u65f6\u95f4\u5185\u53ef\u4ee5\u8bfb\u5199\u7684\u6570\u636e\u91cf\uff0c\u9ed8\u8ba4 2000MiB/s\uff0c\u9700\u8981\u6839\u636e\u81ea\u5df1\u7684\u673a\u5668\u6027\u80fd\u548c\u90e8\u7f72\u5b9e\u4f8b\u505a\u8c03\u6574\u3002"}),"\n",(0,t.jsx)(n.li,{children:"max-background-jobs: compaction \u548c flushdb \u7ebf\u7a0b\u6570\uff0c\u8981\u6839\u636e\u81ea\u5df1\u673a\u5668 CPU \u6838\u6570\u548c\u90e8\u7f72\u5b9e\u4f8b\u4e2a\u6570\u8fdb\u884c\u8c03\u6574\uff0c\u5efa\u8bae\u6700\u5c0f\u8bbe\u7f6e\u4e3a 4\u3002"}),"\n",(0,t.jsx)(n.li,{children:"3 throttle-bytes-per-second: \u4e3b\u4ece\u590d\u5236\u4f20\u8f93\u9650\u901f\u53c2\u6570\uff0c\u9ed8\u8ba4\u4e3a 200MiB/s\uff0c\u8be5\u53c2\u6570\u53ef\u4ee5\u6839\u636e\u673a\u5668\u7f51\u5361\u7684\u914d\u7f6e\u53ca\u90e8\u7f72 pika \u5b9e\u4f8b\u7684\u4e2a\u6570\u8fdb\u884c\u8c03\u6574\u3002"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"2023-09-28-Pika-3.5.1-connect.png",src:e(2312).A+"",width:"644",height:"271"})})]})}function d(i={}){const{wrapper:n}={...(0,l.R)(),...i.components};return n?(0,t.jsx)(n,{...i,children:(0,t.jsx)(h,{...i})}):h(i)}},2312:(i,n,e)=>{e.d(n,{A:()=>t});const t=e.p+"assets/images/2023-09-28-Pika-3.5.1-connect-65452ee30b0e2dff6c5affd2ee5406a1.png"},8453:(i,n,e)=>{e.d(n,{R:()=>s,x:()=>o});var t=e(6540);const l={},a=t.createContext(l);function s(i){const n=t.useContext(a);return t.useMemo((function(){return"function"==typeof i?i(n):{...n,...i}}),[n,i])}function o(i){let n;return n=i.disableParentContext?"function"==typeof i.components?i.components(l):i.components||l:s(i.components),t.createElement(a.Provider,{value:n},i.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/eb808821.b43bbd7d.js b/build/assets/js/eb808821.b43bbd7d.js new file mode 100644 index 0000000..fd35acb --- /dev/null +++ b/build/assets/js/eb808821.b43bbd7d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[1661],{9201:(n,e,i)=>{i.r(e),i.d(e,{assets:()=>d,contentTitle:()=>a,default:()=>l,frontMatter:()=>t,metadata:()=>o,toc:()=>c});var s=i(4848),r=i(8453);const t={title:"Redis \u4e0e Pika scan \u6027\u80fd\u5bf9\u6bd4",sidebar_position:2},a=void 0,o={id:"\u6027\u80fd\u4e0e\u4f18\u5316/Redis \u4e0e Pika scan \u6027\u80fd\u5bf9\u6bd4/index",title:"Redis \u4e0e Pika scan \u6027\u80fd\u5bf9\u6bd4",description:"Redis \u662f\u540e\u7aef\u5e38\u7528\u7684\u952e\u503c\u6570\u636e\u5e93\u3002Pika \u662f 360 \u51fa\u54c1\u7684\u4e00\u6b3e\u4e0e Redis \u534f\u8bae\u51e0\u4e4e\u517c\u5bb9\u7684\u6570\u636e\u5e93\u3002\u4e0e Redis \u4e0d\u540c\u7684\u662f\uff0cPika \u57fa\u4e8e\u786c\u76d8\uff0c\u4f7f\u7528 RocksDB \u4f5c\u4e3a\u5f15\u64ce\uff0c\u4ece\u5bb9\u91cf\u4e0a\u6765\u8bf4\uff0c\u6bd4\u57fa\u4e8e\u5185\u5b58\u7684 Redis \u5927\u4e86\u4e0d\u5c11\uff0c\u800c\u4e14\u5728\u6027\u80fd\u4e0a\u4e5f\u80fd\u6ee1\u8db3\u4e00\u822c\u9700\u6c42\u3002",source:"@site/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Redis \u4e0e Pika scan \u6027\u80fd\u5bf9\u6bd4/index.md",sourceDirName:"\u6027\u80fd\u4e0e\u4f18\u5316/Redis \u4e0e Pika scan \u6027\u80fd\u5bf9\u6bd4",slug:"/\u6027\u80fd\u4e0e\u4f18\u5316/Redis \u4e0e Pika scan \u6027\u80fd\u5bf9\u6bd4/",permalink:"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Redis \u4e0e Pika scan \u6027\u80fd\u5bf9\u6bd4/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Redis \u4e0e Pika scan \u6027\u80fd\u5bf9\u6bd4/index.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Redis \u4e0e Pika scan \u6027\u80fd\u5bf9\u6bd4",sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Pika \u5185\u5b58\u4f7f\u7528",permalink:"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u5185\u5b58\u4f7f\u7528/"},next:{title:"Pika 3.5 \u53c2\u6570\u4f18\u5316\u624b\u518c",permalink:"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika 3.5 \u53c2\u6570\u4f18\u5316\u624b\u518c/"}},d={},c=[];function u(n){const e={code:"code",p:"p",pre:"pre",...(0,r.R)(),...n.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(e.p,{children:"Redis \u662f\u540e\u7aef\u5e38\u7528\u7684\u952e\u503c\u6570\u636e\u5e93\u3002Pika \u662f 360 \u51fa\u54c1\u7684\u4e00\u6b3e\u4e0e Redis \u534f\u8bae\u51e0\u4e4e\u517c\u5bb9\u7684\u6570\u636e\u5e93\u3002\u4e0e Redis \u4e0d\u540c\u7684\u662f\uff0cPika \u57fa\u4e8e\u786c\u76d8\uff0c\u4f7f\u7528 RocksDB \u4f5c\u4e3a\u5f15\u64ce\uff0c\u4ece\u5bb9\u91cf\u4e0a\u6765\u8bf4\uff0c\u6bd4\u57fa\u4e8e\u5185\u5b58\u7684 Redis \u5927\u4e86\u4e0d\u5c11\uff0c\u800c\u4e14\u5728\u6027\u80fd\u4e0a\u4e5f\u80fd\u6ee1\u8db3\u4e00\u822c\u9700\u6c42\u3002"}),"\n",(0,s.jsxs)(e.p,{children:["\u6211\u4eec\u77e5\u9053\uff0c\u5728 Redis \u4e2d\uff0c",(0,s.jsx)(e.code,{children:"keys *"})," \u8fd9\u4e2a\u64cd\u4f5c\u4ec5\u9650\u4e8e\u5728\u672c\u5730\u8c03\u8bd5\u4f7f\u7528\uff0c\u5343\u4e07\u4e0d\u80fd\u7528\u4e8e\u7ebf\u4e0a\uff0c\u56e0\u4e3a\u8fd9\u4f1a \u904d\u5386\u6574\u4e2a\u6570\u636e\u5e93\uff0c\u53ef\u80fd\u5f15\u8d77\u6570\u636e\u5e93\u957f\u65f6\u95f4\u65e0\u54cd\u5e94\uff0c\u751a\u81f3\u5d29\u6e83\u3002\u5728\u7ebf\u4e0a\u670d\u52a1\u5668\uff0c\u5982\u679c\u60f3\u8981\u67e5\u627e\u67d0\u4e2a\u6a21\u5f0f \u7684\u952e\uff0c\u53ef\u4ee5\u4f7f\u7528 scan \u547d\u4ee4\u3002\u6bd4\u5982\u8bf4\u8981\u67e5\u627e ",(0,s.jsx)(e.code,{children:"user:"})," \u524d\u7f00\u7684\u6240\u6709\u952e\uff0c\u53ef\u4ee5\u4f7f\u7528 ",(0,s.jsx)(e.code,{children:"scan 0 user:*"})," \u547d\u4ee4\u3002\u7136\u800c\u5982\u679c\u670d\u52a1\u5668\u4e0a\u7684\u952e\u975e\u5e38\u591a\u7684\u8bdd\uff0c\u867d\u7136\u4e0d\u4f1a\u5361\u6b7b\u670d\u52a1\u5668\u4e86\uff0c\u4f46\u662f\u8fd9\u4e2a\u8fc7\u7a0b\u4f9d\u7136\u4f1a\u5f88\u6f2b\u957f\u3002"]}),"\n",(0,s.jsx)(e.p,{children:"Redis \u662f\u4f7f\u7528 hash table \u5b9e\u73b0\u7684\uff0c\u6240\u4ee5 scan \u547d\u4ee4\u5176\u5b9e\u4e5f\u662f\u904d\u5386\u6240\u6709\u952e\uff0c\u62ff\u5230\u6bcf\u4e2a\u952e\u518d\u505a\u8fc7\u6ee4\uff0c\u800c \u4e0d\u80fd\u76f4\u63a5\u8bfb\u53d6\u7b26\u5408\u5bf9\u5e94 pattern \u7684\u952e\u3002\u6211\u4eec\u4f7f\u7528\u4e0b\u9762\u7684\u4ee3\u7801\u6765\u9a8c\u8bc1\u4e00\u4e0b redis scan \u7684\u6027\u80fd\u3002"}),"\n",(0,s.jsx)(e.pre,{children:(0,s.jsx)(e.code,{className:"language-python",children:'from redis import Redis\nfrom uuid import uuid4\nimport time\n\ndef gen(r):\n for i in range(10000000):\n r.set(str(uuid4()), 1)\n r.set("user:1", "bar")\n\ndef scan(r):\n start = time.time()\n for key in r.scan_iter("user:*"):\n print("user=%s" % r.get(key).decode())\n duration = time.time() - start\n print("duration for finding user is %.3f" % duration)\n duration = time.time() - start\n print("duration for full scan is %.3f" % duration)\n\nif __name__ == "__main__":\n import sys\n port = int(sys.argv[1])\n r = Redis(port=port)\n gen(r)\n scan(r)\n'})}),"\n",(0,s.jsx)(e.p,{children:"\u9996\u5148\u63d2\u5165\u4e00\u5343\u4e07\u4e2a\u968f\u673a\u6570\u636e\uff0c\u7136\u540e\u4ece\u4e2d\u67e5\u627e\u6211\u4eec\u7684\u76ee\u6807\u6570\u636e\u3002\u7ed3\u679c\u5982\u4e0b\uff1a"}),"\n",(0,s.jsx)(e.pre,{children:(0,s.jsx)(e.code,{className:"language-shell",children:"-> % python3 rb.py 6379\nuser=bar\nduration for finding user is 80.145\nduration for full scan is 180.936\n"})}),"\n",(0,s.jsx)(e.p,{children:"\u548c\u6211\u4eec\u7684\u9884\u671f\u57fa\u672c\u662f\u76f8\u7b26\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4 Redis \u662f\u9996\u5148\u904d\u5386\u7136\u540e\u518d\u505a\u8fc7\u6ee4\u7684\u3002"}),"\n",(0,s.jsx)(e.p,{children:"\u63a5\u4e0b\u6765\u6211\u4eec\u5bf9 Pika \u505a\u76f8\u540c\u7684\u5b9e\u9a8c\uff0cPika \u9ed8\u8ba4\u4f7f\u7528 9221 \u7aef\u53e3\uff0c\u6211\u4eec\u53ea\u9700\u8981\u628a\u7aef\u53e3\u6362\u4e00\u4e0b\u5c31\u597d\u4e86\uff1a"}),"\n",(0,s.jsx)(e.pre,{children:(0,s.jsx)(e.code,{className:"language-shell",children:"-> % python3 rb.py 9221\nuser=bar\nduration for finding user is 0.002\nduration for full scan is 0.003\n"})}),"\n",(0,s.jsx)(e.p,{children:"\u7ed3\u679c\u662f\u4ee4\u4eba\u9707\u60ca\u7684\uff01Pika \u51e0\u4e4e\u5728\u77ac\u95f4\u5c31\u5b8c\u6210\u4e86\u904d\u5386\u3002\u539f\u56e0\u5728\u4e8e Pika \u4f7f\u7528\u4e86 RocksDB\uff0c\u800c RocksDB \u652f\u6301 Range \u64cd\u4f5c\u3002RocksDB \u4e2d\u7684\u6570\u636e\u90fd\u662f\u6709\u5e8f\u7684\uff0c\u6240\u4ee5\u67e5\u627e\u8d77\u6765\u5c31\u4e0d\u9700\u8981 O(n) \u4e86\uff0c\u53ea\u9700\u8981\u4e8c\u5206\u67e5\u627e\uff0c \u4e5f\u5c31\u662f O(logN) \u5373\u53ef\u3002"})]})}function l(n={}){const{wrapper:e}={...(0,r.R)(),...n.components};return e?(0,s.jsx)(e,{...n,children:(0,s.jsx)(u,{...n})}):u(n)}},8453:(n,e,i)=>{i.d(e,{R:()=>a,x:()=>o});var s=i(6540);const r={},t=s.createContext(r);function a(n){const e=s.useContext(t);return s.useMemo((function(){return"function"==typeof n?n(e):{...e,...n}}),[e,n])}function o(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(r):n.components||r:a(n.components),s.createElement(t.Provider,{value:e},n.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/f7836a87.0e0f687b.js b/build/assets/js/f7836a87.0e0f687b.js new file mode 100644 index 0000000..4e1d9e3 --- /dev/null +++ b/build/assets/js/f7836a87.0e0f687b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[3053],{4126:(t,i,n)=>{n.r(i),n.d(i,{assets:()=>s,contentTitle:()=>l,default:()=>c,frontMatter:()=>a,metadata:()=>p,toc:()=>h});var e=n(4848),o=n(8453);const a={title:"What's new in Pika v3.5.0",slug:"Pika-3.5.0",authors:[{name:"\u4e8e\u96e8",title:"dubbo-go\u5f00\u6e90\u793e\u533a"}],hide_table_of_contents:!1},l=void 0,p={permalink:"/blog/Pika-3.5.0",source:"@site/blog/2023-12-03-Pika-3.5.2.md",title:"What's new in Pika v3.5.0",description:"Pika \u793e\u533a\u8fd1\u671f\u53d1\u5e03\u4e86\u5907\u53d7\u671f\u5f85\u7684 v3.5.2 \u7248\u672c https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.2-alpha \uff0c\u4e0d\u4ec5\u89e3\u51b3\u4e86\u5386\u53f2\u9057\u7559\u7684 Bug \u95ee\u9898\uff0c\u8fd8\u5f15\u5165\u4e86\u591a\u9879\u65b0\u7279\u6027\u3002\u8fd9\u4e9b\u65b0\u7279\u6027\u4e3b\u8981\u5305\u62ec Pika \u652f\u6301 Redis \u4e8b\u52a1\u3001Pika \u4e0a\u5c42\u589e\u52a0\u7f13\u5b58\u5c42\u5b9e\u73b0\u51b7\u70ed\u6570\u636e\u5206\u79bb\u3001\u63d0\u5347\u8bfb\u6027\u80fd\u3001Codis-Proxy \u652f\u6301\u52a8\u6001\u4fee\u6539\u914d\u7f6e\u53c2\u6570\u7b49\u7b49\uff0c\u65e0\u7591\u5c06\u4f1a\u8ba9\u7528\u6237\u611f\u53d7\u5230\u66f4\u4e3a\u9ad8\u6548\u548c\u7a33\u5b9a\u7684\u4f7f\u7528\u4f53\u9a8c\u3002",date:"2023-12-03T00:00:00.000Z",tags:[],readingTime:2.575,hasTruncateMarker:!1,authors:[{name:"\u4e8e\u96e8",title:"dubbo-go\u5f00\u6e90\u793e\u533a"}],frontMatter:{title:"What's new in Pika v3.5.0",slug:"Pika-3.5.0",authors:[{name:"\u4e8e\u96e8",title:"dubbo-go\u5f00\u6e90\u793e\u533a"}],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"What's new in Pika v3.5.3 ",permalink:"/blog/Pika-3.5.3"},nextItem:{title:"What's new in Pika v3.5.1",permalink:"/blog/Pika-3.5.1"}},s={authorsImageUrls:[void 0]},h=[{value:"\u65b0\u7279\u6027",id:"\u65b0\u7279\u6027",level:2}];function u(t){const i={a:"a",h2:"h2",img:"img",li:"li",p:"p",ul:"ul",...(0,o.R)(),...t.components};return(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)(i.p,{children:["Pika \u793e\u533a\u8fd1\u671f\u53d1\u5e03\u4e86\u5907\u53d7\u671f\u5f85\u7684 v3.5.2 \u7248\u672c ",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.2-alpha",children:"https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.2-alpha"})," \uff0c\u4e0d\u4ec5\u89e3\u51b3\u4e86\u5386\u53f2\u9057\u7559\u7684 Bug \u95ee\u9898\uff0c\u8fd8\u5f15\u5165\u4e86\u591a\u9879\u65b0\u7279\u6027\u3002\u8fd9\u4e9b\u65b0\u7279\u6027\u4e3b\u8981\u5305\u62ec Pika \u652f\u6301 Redis \u4e8b\u52a1\u3001Pika \u4e0a\u5c42\u589e\u52a0\u7f13\u5b58\u5c42\u5b9e\u73b0\u51b7\u70ed\u6570\u636e\u5206\u79bb\u3001\u63d0\u5347\u8bfb\u6027\u80fd\u3001Codis-Proxy \u652f\u6301\u52a8\u6001\u4fee\u6539\u914d\u7f6e\u53c2\u6570\u7b49\u7b49\uff0c\u65e0\u7591\u5c06\u4f1a\u8ba9\u7528\u6237\u611f\u53d7\u5230\u66f4\u4e3a\u9ad8\u6548\u548c\u7a33\u5b9a\u7684\u4f7f\u7528\u4f53\u9a8c\u3002"]}),"\n",(0,e.jsx)(i.h2,{id:"\u65b0\u7279\u6027",children:"\u65b0\u7279\u6027"}),"\n",(0,e.jsxs)(i.ul,{children:["\n",(0,e.jsxs)(i.li,{children:["Pika \u652f\u6301 Redis \u4e8b\u52a1\uff0c\u4f7f\u5f97 Pika \u7684\u6570\u636e\u591f\u5728\u4e00\u7cfb\u5217\u547d\u4ee4\u7684\u6267\u884c\u4e2d\u4fdd\u6301\u6570\u636e\u7684\u4e00\u81f4\u6027\u548c\u53ef\u9760\u6027\u3002 ",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2124",children:"https://github.com/OpenAtomFoundation/pika/pull/2124"})]}),"\n",(0,e.jsxs)(i.li,{children:["Pika \u4e0a\u5c42\u589e\u52a0\u7f13\u5b58\u5c42\u5b9e\u73b0\u51b7\u70ed\u6570\u636e\u5206\u79bb\uff0c\u63d0\u5347\u8bfb\u6027\u80fd\u3002 ",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2171",children:"https://github.com/OpenAtomFoundation/pika/pull/2171"})]}),"\n",(0,e.jsxs)(i.li,{children:["Codis-Proxy \u652f\u6301\u52a8\u6001\u4fee\u6539\u914d\u7f6e\u53c2\u6570\uff0c\u65b9\u4fbf\u6211\u4eec\u505a\u53c2\u6570\u8c03\u6574\u3002 ",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2110",children:"https://github.com/OpenAtomFoundation/pika/pull/2110"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u8865\u5168 Go Test \u6d4b\u8bd5\u7528\u4f8b\u3002 ",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2082",children:"https://github.com/OpenAtomFoundation/pika/pull/2082"})]}),"\n",(0,e.jsxs)(i.li,{children:["CI \u589e\u52a0 cache \u63d0\u5347\u7f16\u8bd1\u901f\u5ea6\u3002 ",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2093",children:"https://github.com/OpenAtomFoundation/pika/pull/2093"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u589e\u52a0 redis-copy \u6d41\u91cf\u590d\u5236\u5de5\u5177\u3002 ",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2060",children:"https://github.com/OpenAtomFoundation/pika/pull/2060"})]}),"\n"]}),"\n",(0,e.jsx)(i.p,{children:"bugfix"}),"\n",(0,e.jsxs)(i.ul,{children:["\n",(0,e.jsxs)(i.li,{children:["\u4fee\u590d pika \u5728\u4f7f\u7528 SETRANGE \u547d\u4ee4\u51fa\u73b0 coredump \u7684\u95ee\u9898\u3002 ",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2141",children:"https://github.com/OpenAtomFoundation/pika/pull/2141"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u4fee\u590d\u56e0\u5220\u9664 Clearreplicationid \u5199\u8fdb binlog \u5bfc\u81f4\u7684\u5168\u91cf\u590d\u5236\u95ee\u9898\u3002 ",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2135",children:"https://github.com/OpenAtomFoundation/pika/pull/2135"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u4fee\u6539\u9501\u7c92\u5ea6\uff0c\u63d0\u5347 pika \u5199 binlog \u7684\u6027\u80fd\u3002 ",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2129",children:"https://github.com/OpenAtomFoundation/pika/pull/2129"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u4fee\u590d\u590d\u6742\u6570\u636e\u7c7b\u578b\u6210\u5458\u53d8\u91cf\u53ef\u80fd\u51fa\u73b0\u6570\u636e\u6ea2\u51fa\u3002 ",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2106",children:"https://github.com/OpenAtomFoundation/pika/pull/2106"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u4fee\u590d decr \u547d\u4ee4\u8fd4\u56de\u503c\u9519\u8bef\u95ee\u9898\u3002 ",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2092",children:"https://github.com/OpenAtomFoundation/pika/pull/2092"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u4fee\u590d setrange \u548c setbit \u547d\u4ee4\u6ca1\u6709\u4fdd\u7559\u539f key \u7684\u8fc7\u671f\u65f6\u95f4\u7684\u95ee\u9898\u3002 ",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2095",children:"https://github.com/OpenAtomFoundation/pika/pull/2095"})]}),"\n"]}),"\n",(0,e.jsx)(i.p,{children:"\u4e0b\u671f\u7248\u672c\u89c4\u5212"}),"\n",(0,e.jsx)(i.p,{children:"\u9884\u8ba1\u518d\u8fc7\u4e24\u4e2a\u6708\u5de6\u53f3\uff0c\u6211\u4eec\u4f1a\u5728\u519c\u5386\u65b0\u5e74\u524d\u53d1\u5e03 3.5.3 \u7248\u672c\uff0c\u76f8\u5173\u5173\u952e\u7279\u6027\u6709\uff1a"}),"\n",(0,e.jsxs)(i.ul,{children:["\n",(0,e.jsxs)(i.li,{children:["Pika \u901a\u8fc7\u5feb\u6162\u547d\u4ee4\u5206\u79bb\u63d0\u5347\u8bfb\u5199\u6027\u80fd\u3002 ",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2162",children:"https://github.com/OpenAtomFoundation/pika/pull/2162"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u652f\u6301 Redis ACL\uff0c\u5728 Pika \u4e2d\u5f15\u5165\u7528\u6237\u6982\u5ff5\uff0c\u8fdb\u884c\u6743\u9650\u63a7\u5236\u3002 ",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2013",children:"https://github.com/OpenAtomFoundation/pika/pull/2013"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u652f\u6301 Redis Stream\uff0c\u5b9e\u73b0\u6d88\u606f\u961f\u5217\u3002 ",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/1955",children:"https://github.com/OpenAtomFoundation/pika/pull/1955"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u6dfb\u52a0 Pika \u7279\u6709\u547d\u4ee4 compactrange\uff0c\u5bf9\u6307\u5b9a\u8303\u56f4\u5185\u7684 key \u8fdb\u884c compact \u4ee5\u89e3\u51b3\u5927 key \u5220\u9664\u65f6\u8bfb\u653e\u5927\u7684\u95ee\u9898\u3002 ",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2163",children:"https://github.com/OpenAtomFoundation/pika/pull/2163"})]}),"\n",(0,e.jsxs)(i.li,{children:["\u652f\u6301 lastsave \u6307\u4ee4\u3002 ",(0,e.jsx)(i.a,{href:"https://github.com/OpenAtomFoundation/pika/pull/2167",children:"https://github.com/OpenAtomFoundation/pika/pull/2167"})]}),"\n"]}),"\n",(0,e.jsx)(i.p,{children:"\u611f\u8c22\u5927\u5bb6\u5bf9 Pika \u5f00\u6e90\u516c\u4f17\u53f7\u7684\u5173\u6ce8 \uff0cPika 3.5 \u7248\u672c\u91cd\u5927\u7279\u6027\u53ca\u4f7f\u7528\u89c4\u8303\u6211\u4eec\u4f1a\u5728\u7a0d\u540e\u7684\u6587\u7ae0\u4e2d\u8fdb\u884c\u4ecb\u7ecd\uff0c\u6211\u4eec\u4e0b\u671f\u518d\u89c1\uff5e"}),"\n",(0,e.jsx)(i.p,{children:(0,e.jsx)(i.img,{alt:"2023-09-28-Pika-3.5.2-connect",src:n(4856).A+"",width:"747",height:"431"})})]})}function c(t={}){const{wrapper:i}={...(0,o.R)(),...t.components};return i?(0,e.jsx)(i,{...t,children:(0,e.jsx)(u,{...t})}):u(t)}},4856:(t,i,n)=>{n.d(i,{A:()=>e});const e=n.p+"assets/images/2023-12-03-Pika-3.5.2-connect-a766680ff0766c42b3506846465fd45b.png"},8453:(t,i,n)=>{n.d(i,{R:()=>l,x:()=>p});var e=n(6540);const o={},a=e.createContext(o);function l(t){const i=e.useContext(a);return e.useMemo((function(){return"function"==typeof t?t(i):{...i,...t}}),[i,t])}function p(t){let i;return i=t.disableParentContext?"function"==typeof t.components?t.components(o):t.components||o:l(t.components),e.createElement(a.Provider,{value:i},t.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/f81c1134.f506d7d6.js b/build/assets/js/f81c1134.f506d7d6.js new file mode 100644 index 0000000..5b2ed0b --- /dev/null +++ b/build/assets/js/f81c1134.f506d7d6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[8130],{7735:n=>{n.exports=JSON.parse('{"archive":{"blogPosts":[{"id":"PikiwiDB-Pika--4.0.0","metadata":{"permalink":"/blog/PikiwiDB-Pika--4.0.0","source":"@site/blog/2024-07-08-PikiwiDB(Pika)-4.0.0.md","title":"What\'s new in PikiwiDB(Pika) v4.0.0","description":"\u5c0a\u656c\u7684\u793e\u533a\u6210\u5458\u53ca\u6280\u672f\u7231\u597d\u8005\u4eec\uff1a","date":"2024-07-08T00:00:00.000Z","tags":[],"readingTime":17.085,"hasTruncateMarker":false,"authors":[{"name":"360 \u8f66\u91d1\u9e3d","title":"Pika \u5f00\u6e90\u793e\u533a"}],"frontMatter":{"title":"What\'s new in PikiwiDB(Pika) v4.0.0","slug":"PikiwiDB-Pika--4.0.0","authors":[{"name":"360 \u8f66\u91d1\u9e3d","title":"Pika \u5f00\u6e90\u793e\u533a"}],"hide_table_of_contents":false},"unlisted":false,"nextItem":{"title":"What\'s new in Pika v3.5.4","permalink":"/blog/Pika-3.5.4"}},"content":"\u5c0a\u656c\u7684\u793e\u533a\u6210\u5458\u53ca\u6280\u672f\u7231\u597d\u8005\u4eec\uff1a\\nPikiwiDB \u793e\u533a\u8363\u8000\u5730\u5ba3\u544a\u2014\u2014\u7ecf\u8fc7 9 \u4e2a\u6708\u6253\u78e8\u5e76\u5728\u751f\u4ea7\u73af\u5883\u7a33\u5b9a\u8fd0\u884c 5 \u4e2a\u6708\u7684 PikiwiDB(Pika) v4.0.0 \u3010\u4e0b\u6587\u7b80\u79f0 Pika\u3011\u4eca\u5929\u6b63\u5f0f\u53d1\u5e03\u3002\u5e0c\u671b\u57fa\u4e8e\u7b2c\u4e09\u4ee3\u5b58\u50a8\u5f15\u64ce Floyd \u7684\u8fd9\u4e2a\u65b0\u7248\u672c\u80fd\u4e3a\u793e\u533a\u7528\u6237\u4eec\u5e26\u6765\u66f4\u5353\u8d8a\u7684\u4f53\u9a8c\u3002\\n\\n## 1 \u91cd\u5927\u6539\u8fdb\\n1.1 \u7b2c\u4e09\u4ee3\u5b58\u50a8\u5f15\u64ce Floyd\\nFloyd \u5982\u540c\u5176\u524d\u4ee3 Blackwidow\uff0c\u57fa\u4e8e RocksDB\uff0c\u4e0d\u4ec5\u652f\u6301\u57fa\u7840\u7684 String \u7ed3\u6784\uff0c\u4e5f\u539f\u751f\u652f\u6301\u4e86 Hash\u3001List\u3001Set\u3001Stream\u53ca ZSet \u7b49 KKV \u5f62\u5f0f\u7684\u590d\u5408\u6570\u636e\u7ed3\u6784\u3002\\n\\n+ RocksDB \u5b9e\u4f8b\u6570\u53ef\u914d\u7f6e\\n\\n\u6452\u5f03\u4e86 Blackwidow \u6309\u6570\u636e\u7c7b\u578b\u91c7\u7528 RocksDB \u5b9e\u4f8b\u7684\u7269\u7406\u9694\u79bb\u6a21\u5f0f\uff0cFloyd \u91c7\u7528\u4e86 RocksDB \u7684 Column-Family \u865a\u62df\u9694\u79bb\u673a\u5236\uff0c\u5728\u5355\u4e2a RocksDB \u5b9e\u4f8b\u4e0b\u53ef\u5b58\u50a8\u6240\u6709\u7c7b\u578b\u7684\u6570\u636e\u3002\u7528\u6237\u53ef\u81ea\u7531\u8bbe\u5b9a Pika \u5b9e\u4f8b\u4e2d\u6bcf\u4e2a DB\u3010\u7b49\u540c\u4e8eRedis DB\u3011\u4e2d RocksDB \u5b9e\u4f8b\u7684\u6570\u91cf\uff0c\u800c\u6570\u636e\u7684\u5b58\u50a8\u5219\u4f9d\u636e key \u7684 hash \u503c\u5206\u914d\u81f3\u76f8\u5e94\u7684 RocksDB \u5b9e\u4f8b\uff0c\u51cf\u5c0f\u4e86\u6570\u636e\u7684\u7a7a\u95f4\u653e\u5927\u548c\u8bfb\u653e\u5927\u6548\u5e94\uff0c\u5b9e\u73b0\u4e86\u673a\u5668\u8d44\u6e90\u7684\u9ad8\u6548\u5229\u7528\u3002\\n\\n+ \u7981\u6b62\u91cd\u590d key\\n\\n![2024-05-16-PikiwiDB(Pika)-4.0.0-key](2024-07-08-PikiwiDB(Pika)-4.0.0-key.png)\\n\u57fa\u4e8e RocksDB \u7684 Column-Family \u865a\u62df\u9694\u79bb\u673a\u5236\uff0cFloyd \u628a\u6240\u6709\u7c7b\u578b\u7684 key \u548c string \u4e00\u8d77\u5b58\u50a8\u5728 Column-Family 0\u3002\u5728\u6b64\u5b58\u50a8\u57fa\u7840\u4e4b\u4e0a\uff0c\u53ef\u660e\u786e\u7981\u6b62\u4e0d\u540c\u7c7b\u578b\u7684 key \u91cd\u590d\uff0c\u8fd9\u4e00\u8bbe\u8ba1\u65e8\u5728\u675c\u7edd\u6f5c\u5728\u7684\u6570\u636e\u5197\u4f59\u4e0e\u4e0d\u4e00\u81f4\u6027\uff0c\u4e0e Redis \u670d\u52a1\u7279\u6027\u4fdd\u6301\u4e00\u81f4\uff0c\u8fdb\u4e00\u6b65\u63d0\u5347\u4e86\u7cfb\u7edf\u7684\u6574\u4f53\u6548\u7387\u4e0e\u6570\u636e\u8d28\u91cf\u3002\\n\\n+ Floyd \u8be6\u7ec6\u8bf4\u660e\\n\\n\u5982\u679c\u5bf9 Floyd \u5b58\u50a8\u5f15\u64ce\u611f\u5174\u8da3\uff0c\u8bf7\u8be6\u9605\u300aFloyd \u5b58\u50a8\u5f15\u64ce\u300b\u3010\u94fe\u63a5\uff1ahttps://github.com/OpenAtomFoundation/pika/discussions/2052\u3011\u3002\u7531\u4e8e Floyd \u524d\u540e\u8fdb\u884c\u4e86\u591a\u4e2a\u7248\u672c\u7684\u8fed\u4ee3\uff0c\u6240\u4ee5\u9605\u8bfb\u8be5 github discussion \u6587\u6863\u65f6\u8bf7\u6ce8\u610f\u524d\u540e\u65f6\u95f4\uff0c\u5982\u6709\u76f8\u5173\u51b2\u7a81\u6027\u8bf4\u6cd5\uff0c\u4ee5\u6700\u65b0\u65e5\u671f\u7684\u6587\u5b57\u4e3a\u51c6\u3002\\n\\n\u5173\u952e PR\uff1a\\n+ PikiwiDB(Pika) \u652f\u6301 Floyd \u5b58\u50a8\u5f15\u64ce \\nhttps://github.com/OpenAtomFoundation/pika/pull/2413\\n+ \u6dfb\u52a0 Floyd \u7684 compaction-filter \u7684 Gtest \\nhttps://github.com/OpenAtomFoundation/pika/pull/2669\\n+ Pika \u4e0d\u652f\u6301\u4e0d\u540c\u7c7b\u578b\u7684\u91cd\u590d key, \u5199\u5165\u91cd\u590d key \u8fd4\u56de\u975e\u6cd5\u7c7b\u578b \\nhttps://github.com/OpenAtomFoundation/pika/pull/2609\\n+ \u5bf9 HyperLogLog \u548c String \u8fdb\u884c\u7c7b\u578b\u9694\u79bb\uff0c\u786e\u4fdd HyperLogLog \u64cd\u4f5c\u4e0e String \u64cd\u4f5c\u660e\u786e\u533a\u5206\u5f00 \\nhttps://github.com/OpenAtomFoundation/pika/pull/2720\\n+ \u6dfb\u52a0\u652f\u6301\u5206\u533a\u7d22\u5f15\u8fc7\u6ee4\u7684\u529f\u80fd \\nhttps://github.com/OpenAtomFoundation/pika/pull/2601\\n\\n1.2 Mget \u6279\u91cf\u67e5\u8be2\u7f13\u5b58\\n\\nPika v3.5.2 \u7684\u70ed\u6570\u636e\u7f13\u5b58\u53ea\u5b9e\u73b0\u4e86\u5bf9\u70ed\u70b9 Key \u7684\u70b9\u67e5(\u5982get/hget)\uff0c\u5728\u540e\u7eed\u7684 v3.5.3 \u548c v3.5.4 \u4fee\u590d\u82e5\u5e72 bug \u540e\uff0c\u5bf9\u70ed\u6570\u636e\u7684\u70b9\u67e5\u76ee\u524d\u5df2\u7ecf\u975e\u5e38\u7a33\u5b9a\u3002\u7136\u800c\u5e76\u672a\u652f\u6301\u6279\u91cf\u67e5\u8be2(\u5982 mget etc)\u3002\\n\u5185\u90e8\u4e1a\u52a1\u4fa7\u53cd\u9988\u6279\u91cf\u67e5\u8be2\u901f\u5ea6\u6bd4\u8f83\u6162\uff0c\u5728 40C/256GiB/2TiB SATA SSD \u89c4\u683c\u673a\u5668\u4e0a\u6570\u636e\u91cf\u8d85\u8fc7 100GiB \u65f6\uff0cPika v3.3.6 30% \u6279\u91cf\u67e5\u8be2\u5ef6\u8fdf\u8d85\u8fc7 35ms\u3002\u4f46\u7531\u4e8e Pika \u70ed\u6570\u636e\u7f13\u5b58\u5c1a\u672a\u652f\u6301\u6279\u91cf\u67e5\u8be2\uff0c\u6027\u80fd\u5e76\u672a\u6539\u5584\u3002\\n\\n\u4e3a\u4e86\u6ee1\u8db3\u4e1a\u52a1\u9700\u6c42\uff0cPika \u56e2\u961f\u5f00\u53d1\u4e86\u6279\u91cf\u67e5\u8be2\u70ed\u6570\u636e\u7f13\u5b58\u529f\u80fd\uff0c\u663e\u8457\u63d0\u5347\u4e86\u6279\u91cf\u67e5\u8be2\u6027\u80fd\uff0c\u964d\u4f4e\u4e86\u67e5\u8be2\u5ef6\u8fdf\u548c\u5931\u8d25\u7387\u3002\u76f8\u5173\u6280\u672f\u7ec6\u8282\u8bf7\u9605\u8bfb\u300aPikiwiDB (Pika) \u6df7\u5408\u5b58\u50a8\u4e4b\u6279\u91cf\u67e5\u8be2\u300b \u3010\u94fe\u63a5\uff1ahttps://mp.weixin.qq.com/s/KFLPruSdB66TMRxUfR9PbQ \u3011\u3002\\n\\n\u5173\u952e PR \uff1a\\n\\n+ Mget \u652f\u6301\u591a key \u67e5\u8be2\u7f13\u5b58, \u8bb0\u5f55\u672a\u547d\u4e2d\u7684 key \u53bb DB \u4e2d\u67e5\u8be2\uff0c\u63d0\u5347 Pika \u670d\u52a1\u7684\u8bfb\u6027\u80fd \\nhttps://github.com/OpenAtomFoundation/pika/pull/2675\\n+ \u4fee\u590d Mget \u6ca1\u6709\u4f7f\u7528\u89e3\u6790 ttl \u7684\u51fd\u6570\u5bfc\u81f4\u51fa\u73b0\u90e8\u5206key\u7684ttl\u672a\u88ab\u66f4\u65b0\uff0c\u6570\u636e\u4e0d\u4e00\u81f4\u7684\u95ee\u9898 \\nhttps://github.com/OpenAtomFoundation/pika/pull/2730\\n\\n1.3 \u4e3b\u4ece\u590d\u5236\\n\\nPika v3.3.6 \u6709\u5f88\u591a\u4e3b\u4ece\u590d\u5236\u7684\u7f3a\u9677\u3002v4.0.0 \u7248\u672c\u5bf9 Pika \u5168\u91cf\u590d\u5236\u53ca\u589e\u91cf\u590d\u5236\u8fdb\u884c\u4e86\u5927\u91cf\u4f18\u5316\u548c bug \u4fee\u590d\uff0c\u53d6\u5f97\u4e86\u975e\u5e38\u597d\u7684\u6548\u679c\u3002 \\n\u5e76\u5728 info \u547d\u4ee4\u4e2d\u8f93\u51fa\u4e86 \\"repl_connect_status\\" \u6307\u6807(PR 2638)\uff0c\u4ee5\u65b9\u4fbf\u7528\u6237\u66f4\u52a0\u660e\u786e\u6e05\u6670\u7684\u786e\u5b9a\u5f53\u524d\u7684\u4e3b\u4ece\u590d\u5236\u72b6\u6001\u3002\\n\\n\u5173\u952e PR \uff1a\\n\\n+ \u4fee\u590d\u6279\u91cf\u6269\u5bb9\u65f6\uff0c\u591a\u4e2a slave \u540c\u65f6\u8fde\u63a5 master, \u77ed\u65f6\u95f4\u591a\u6b21 bgsave \u5bfc\u81f4\u90e8\u5206\u4ece\u8282\u70b9\u6570\u636e\u4e0d\u5b8c\u6574\u7684\u95ee\u9898 \\nhttps://github.com/OpenAtomFoundation/pika/pull/2746\\n+ \u4fee\u590d Spop \u5728\u5199 binlog \u65f6\u53ef\u80fd\u4f1a\u51fa\u73b0\u7ade\u6001\u95ee\u9898 \\nhttps://github.com/OpenAtomFoundation/pika/pull/2647\\n+ \u4fee\u590d\u591a DB \u4e0b\u5168\u91cf\u540c\u6b65\u8d85\u65f6\u540e\u4e0d\u91cd\u8bd5\u7684\u95ee\u9898 \\nhttps://github.com/OpenAtomFoundation/pika/pull/2667\\n+ \u4fee\u590d\u591a DB \u4e3b\u4ece\u8d85\u65f6\u573a\u666f\u4e0b\uff0c\u53ef\u80fd\u4f1a\u51fa\u73b0\u7a97\u53e3\u5d29\u6e83\u7684\u95ee\u9898 \\nhttps://github.com/OpenAtomFoundation/pika/pull/2666\\n+ \u4fee\u590d\u4e3b\u4ece\u540c\u6b65\u9650\u901f\u903b\u8f91\u4e2d\u91cd\u590d\u89e3\u9501\u7684\u95ee\u9898 \\nhttps://github.com/OpenAtomFoundation/pika/pull/2657\\n+ \u91cd\u6784\u4e3b\u4ece\u590d\u5236\u6a21\u5f0f slave \u8282\u70b9\u7684\u4e3b\u4ece\u540c\u6b65\u7ebf\u7a0b\u6a21\u578b\uff0c\u5c3d\u53ef\u80fd\u51cf\u5c11 binlog \u6d88\u8d39\u963b\u585e\u95ee\u9898 \\nhttps://github.com/OpenAtomFoundation/pika/pull/2638\\n\\n1.4 Redis Stream\\n\\nRedis Stream \u7c7b\u4f3c\u4e8e\u6d88\u606f\u961f\u5217\uff08MQ\uff09\uff0c\u4ee5\u4fbf\u66f4\u5b89\u5168\u5730\u4f20\u9012\u6d88\u606f\u3002\u4e3a\u4e86\u786e\u4fdd\u6570\u636e\u7684\u5b89\u5168\u6027\uff0c\u5e95\u5c42\u5f15\u64ce BlackWidow \u548c Floyd \u4e2d\u7279\u522b\u6dfb\u52a0\u4e86\u5bf9 Stream \u6570\u636e\u7c7b\u578b\u7684\u652f\u6301\u3002\\n\u5173\u952e PR\uff1a \\n+ \u4fee\u590d pkpatternmatchdel \u547d\u4ee4\u4f7f\u7528\u9519\u8bef\u5bfc\u81f4\u7684 stream \u7c7b\u578b\u6570\u636e\u5220\u9664\u5f02\u5e38\u7684\u95ee\u9898 \\nhttps://github.com/OpenAtomFoundation/pika/pull/2726\\n+ \u4fee\u590d Keyspace \u547d\u4ee4\u672a\u8ba1\u7b97 Stream \u7c7b\u578b\u6570\u636e\u7684\u95ee\u9898 \\nhttps://github.com/OpenAtomFoundation/pika/pull/2705\\n\\n1.5 Compaction\\n\\nPikiwiDB(Pika) \u7684\u5e95\u5c42\u78c1\u76d8\u5b58\u50a8\u5f15\u64ce RocksDB \u5728\u8fdb\u884c compaction \u65f6\u4f1a\u663e\u8457\u5f71\u54cd PikiwiDB(Pika) \u7684\u8bfb\u5199\u6027\u80fd\u3002\u56e0\u6b64\uff0c\u63a7\u5236\u597d compaction \u662f\u4f18\u5316 Pika \u8bfb\u5199\u6027\u80fd\u7684\u5173\u952e\u3002\\n\\nFloyd \u4f7f\u7528\u4e86 v8.7.3 \u7248\u672c\u7684 RocksDB\uff0c\u5f00\u653e\u4e86\u66f4\u591a RocksDB \u53c2\u6570\uff0c\u4ee5\u65b9\u4fbf\u7528\u6237\u4f18\u5316 RocksDB \u6027\u80fd\uff1a\\n\\n+ enable-partitioned-index-filters\uff1a \u652f\u6301\u52a0\u8f7d\u5206\u533a\u7d22\u5f15\u8fc7\u6ee4\u5668\uff0c\u52a0\u5feb RocksDB \u67e5\u627e\u901f\u5ea6\u3002\\n+ min-write-buffer-number-to-merge: \u9ed8\u8ba4\u503c\u4e3a 1\uff0c\u5982\u679c\u5c06\u6b64\u503c\u8bbe\u7f6e\u5f97\u66f4\u5927\uff0c\u610f\u5473\u7740\u9700\u8981\u66f4\u591a\u7684\u5199\u7f13\u51b2\u533a\u88ab\u586b\u6ee1\u540e\u624d\u8fdb\u884c flush\u3002\u8fd9\u6837\u53ef\u4ee5\u51cf\u5c11 flush \u7684\u9891\u7387\uff0c\u589e\u52a0\u6570\u636e\u5728\u5185\u5b58\u4e2d\u7684\u7d2f\u79ef\u91cf\uff0c\u4ece\u800c\u53ef\u80fd\u63d0\u9ad8\u5199\u5165\u541e\u5410\u91cf\u3002\\n+ level0-stop-writes-trigger: \u9ed8\u8ba4\u503c\u4e3a 36\uff0c\u5b9a\u4e49\u4e86 L0 \u5c42\u4e2d sst \u6587\u4ef6\u7684\u6700\u5927\u6570\u91cf\uff0c\u4e00\u65e6\u8fbe\u5230\u8fd9\u4e2a\u6570\u91cf\uff0cRocksDB \u5c06\u4f1a\u91c7\u53d6 \u6682\u505c\u5199\u5165\u3001\u5f3a\u5236 compaction \u7b49\u63aa\u65bd\u6765\u9632\u6b62\u5199\u5165\u64cd\u4f5c\u7ee7\u7eed\u7d2f\u79ef\uff0c\u4ee5\u907f\u514d L0 \u5c42\u53d8\u5f97\u8fc7\u4e8e\u5e9e\u5927\uff0c\u8fdb\u800c\u53ef\u80fd\u5bfc\u81f4\u5199\u5165\u653e\u5927\u3001\u67e5\u8be2\u6027\u80fd\u4e0b\u964d\u7b49\u95ee\u9898\u3002\\n+ level0-slowdown-writes-trigger\uff1a\u9ed8\u8ba4\u503c\u4e3a 20\uff0c\u7528\u4e8e\u63a7\u5236\u5f53 Level 0 \u7684 SST \u6587\u4ef6\u6570\u91cf\u8fbe\u5230\u8fd9\u4e2a\u9608\u503c\u65f6\uff0c\u89e6\u53d1\u5199\u51cf\u901f\uff08write slowdown\uff09\uff0c\u9632\u6b62 Level 0 \u7684\u6587\u4ef6\u6570\u91cf\u8fc7\u591a\uff0c\u5bfc\u81f4\u540e\u7eed compaction \u64cd\u4f5c\u7684\u538b\u529b\u8fc7\u5927\u3002\\n+ level0-file-num-compaction-trigger\uff1a\u9ed8\u8ba4\u503c\u4e3a 4\uff0c\u5f53 Level 0 \u7684 SST \u6587\u4ef6\u6570\u91cf\u8fbe\u5230\u8fd9\u4e2a\u53c2\u6570\u8bbe\u5b9a\u7684\u9608\u503c\u65f6\uff0cRocksDB \u4f1a\u5f00\u59cb\u6267\u884c compaction \u64cd\u4f5c\uff0c\u5c06 Level 0 \u7684\u6587\u4ef6\u5408\u5e76\u5230 Level 1\uff0c\u4ee5\u51cf\u5c11 Level 0 \u7684\u6587\u4ef6\u6570\u91cf\uff0c\u964d\u4f4e\u8bfb\u53d6\u5ef6\u8fdf\uff0c\u5e76\u4f18\u5316\u5b58\u50a8\u7a7a\u95f4\u7684\u5229\u7528\u7387\u3002\\n+ max-subcompactions\uff1a\u9ed8\u8ba4\u503c\u4e3a 1\uff0c\u7528\u4e8e\u63a7\u5236RocksDB \u4e2d\u5e76\u53d1\u6267\u884c\u7684 sub-compaction \u4efb\u52a1\u6570\u91cf\uff0c\u5176\u503c\u4e3a 1 \u8868\u793a\u5173\u95ed sub-compaction\u3002\u5982\u679c\u7cfb\u7edf\u8d44\u6e90\u5145\u8db3\uff0c\u5efa\u8bae\u63d0\u5347\u8be5\u53c2\u6570\u4ee5\u4f18\u5316 compaction \u6548\u7387\u3002\\n+ max-bytes-for-level-base\uff1a\u6307\u5b9a\u4e86 L1 SST \u6587\u4ef6\u603b\u7684\u5927\u5c0f\u3002\u8fd9\u4e2a\u5927\u5c0f\u662f RocksDB \u8fdb\u884c\u6570\u636e\u5206\u5c42\u7ba1\u7406\u548c compaction \u51b3\u7b56\u7684\u91cd\u8981\u4f9d\u636e\uff1a\u5982\u679c L1 \u5c42\u7684\u5927\u5c0f\u8bbe\u7f6e\u5f97\u592a\u5c0f\uff0c\u53ef\u80fd\u4f1a\u5bfc\u81f4 L0 \u5c42\u7684 compaction \u8fc7\u4e8e\u9891\u7e41\uff0c\u8fdb\u800c\u5f71\u54cd\u5199\u6027\u80fd\u3002\u53cd\u4e4b\uff0c\u5982\u679c\u8bbe\u7f6e\u5f97\u592a\u5927\uff0c\u53ef\u80fd\u4f1a\u5360\u7528\u8f83\u591a\u7684\u78c1\u76d8\u7a7a\u95f4\uff0c\u5e76\u4e14\u5f71\u54cd\u8bfb\u53d6\u6027\u80fd\uff0c\u56e0\u4e3a\u8bfb\u53d6\u64cd\u4f5c\u53ef\u80fd\u9700\u8981\u8de8\u8d8a\u66f4\u591a\u7684\u5c42\u7ea7\u3002Pika \u6ca1\u6709\u5728 pika.conf \u4e2d\u5f00\u653e\u6b64\u53c2\u6570\u7ed9\u7528\u6237\u914d\u7f6e\uff0c\u800c\u662f\u4f7f\u7528\u5176\u4ed6\u53c2\u6570\uff08level0-file-num-compaction-trigger \u548c write-buffer-size\uff09\u8ba1\u7b97\u540e\u7684\u7ed3\u679c\u3002\\n\\n\\nstorage_options_.options.max_bytes_for_level_base = g_pika_conf->level0_file_num_compaction_trigger() * g_pika_conf->write_buffer_size()\\n\\n\\n\u5173\u952e PR\uff1a\\n\u6dfb\u52a0 Floyd \u7684 compaction-filter \u7684 Gtest\\nhttps://github.com/OpenAtomFoundation/pika/pull/2669\\n\u6dfb\u52a0\u652f\u6301\u5206\u533a\u7d22\u5f15\u8fc7\u6ee4\u7684\u529f\u80fd\\nhttps://github.com/OpenAtomFoundation/pika/pull/2601\\n\u65b0\u589e RocksDB Compaction \u7b56\u7565\u52a8\u6001\u8c03\u6574\u53c2\u6570\uff0c\u7528\u6237\u53ef\u4ee5\u6839\u636e\u4e1a\u52a1\u8c03\u6574 Compaction \u7b56\u7565\uff0c\u964d\u4f4e Compaction \u64cd\u4f5c\u5bf9\u670d\u52a1\u6027\u80fd\u7684\u635f\u8017\\nhttps://github.com/OpenAtomFoundation/pika/pull/2538\\n1.6 \u53ef\u89c2\u6d4b\u6027\\nv3.5 \u7248\u672c\u589e\u52a0\u4e86\u5305\u62ec\u547d\u4e2d\u7387\u3001\u6bcf\u79d2\u547d\u4e2d\u6b21\u6570\u3001Redis Cache \u5185\u5b58\u4f7f\u7528\u91cf\u3001Redis Cache \u4e2a\u6570\u3001Redis Cache DB \u4e2a\u6570 \u7b49\u6307\u6807\uff0c\u4f46\u662f\u5728\u96c6\u7fa4\u65b9\u9762\u7684\u53ef\u89c2\u6d4b\u6027\u662f\u7f3a\u5931\u7684\u3002v4.0.0 \u5bf9 Codis-Proxy \u7684 P99\u3001P999\u3001\u5ef6\u8fdf\u7b49\u76d1\u63a7\u6307\u6807\u8fdb\u884c\u91c7\u96c6\u548c\u5c55\u793a\uff0c\u53ef\u4ee5\u76f4\u89c2\u5730\u53cd\u6620\u7ebf\u4e0a Codis-proxy \u7684\u8fd0\u884c\u60c5\u51b5\u3002\\n\\nv4.0.0 \u5f00\u59cb\u8fd8\u63d0\u4f9b\u65b0\u7684\u5de5\u5177\uff1a\u6839\u636e pika benchmark \u5de5\u5177\u538b\u6d4b\u7ed3\u679c\u81ea\u52a8\u751f\u6210\u53ef\u89c6\u5316\u7684\u7edf\u8ba1\u56fe\u8868\u3002\\n\\n\u5173\u952e PR\uff1a\\nCodis \u652f\u6301 info \u547d\u4ee4, \u53ef\u4ee5\u901a\u8fc7\u8be5\u547d\u4ee4\u67e5\u8be2 Codis-proxy \u7684 info \u4fe1\u606f\\nhttps://github.com/OpenAtomFoundation/pika/pull/2688\\nCodis-proxy \u65b0\u589e P99 P95 \u7b49\u76d1\u63a7\u8017\u65f6\u6307\u6807\\nhttps://github.com/OpenAtomFoundation/pika/pull/2668\\n\u6dfb\u52a0 Pika \u538b\u6d4b\u6307\u6807\uff0c\u63d0\u5347 Pika \u538b\u6d4b\u6548\u7387\uff0c\u5e76\u8f93\u51fa\u53ef\u89c6\u5316\u7684\u7edf\u8ba1\u56fe\u8868\\nhttps://github.com/OpenAtomFoundation/pika/pull/2663\\n\\n1.7 \u6d4b\u8bd5\u96c6\\nPikiwiDB(Pika) \u6d4b\u8bd5\u96c6\u7531 gtest \u5355\u6d4b\u3001Redis TCL \u6d4b\u8bd5\u96c6\u548c Go \u6d4b\u8bd5\u96c6\u7ec4\u6210\u3002v4.0.0 \u4e2d\u4e30\u5bcc\u4e86\u8bf8\u591a\u7279\u6027\u7684 go test \u529f\u80fd\uff0c\u5e76\u8fdb\u4e00\u6b65\u5b8c\u5584\u4e86\u57fa\u672c\u6570\u636e\u7c7b\u578b\u7684 TCL \u6d4b\u8bd5\u3002\\n\u5173\u952e PR\uff1a\\n\u6dfb\u52a0 Floyd \u7684 compaction-filter \u7684 Gtest\\nhttps://github.com/OpenAtomFoundation/pika/pull/2669\\nPika Geo \u6570\u636e\u7c7b\u578b\u589e\u52a0 TCL \u6d4b\u8bd5\uff0c\u5e76\u4fee\u590d\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9047\u5230\u7684\u7f3a\u9677\\nhttps://github.com/OpenAtomFoundation/pika/pull/2753\\n1.8 \u8de8\u5e73\u53f0\\nPikiwiDB(Pika) \u4ee5\u5f80\u4ec5\u652f\u6301 centos \u548c ubuntu \u7b49 linux \u5e73\u53f0\uff0cv3.5 \u5f00\u59cb\u652f\u6301 Mac \u7b49\u5e73\u53f0\u3002v4.0.0 \u5c06\u5bf9 Mac \u5e73\u53f0\u7684\u652f\u6301\u6269\u5c55\u81f3 FreeBSD \u5e73\u53f0\u3002\\n\u5173\u952e PR\uff1a\\nPika \u652f\u6301\u5728 FreeBSD14 \u5e73\u53f0\u4e0a\u8fdb\u884c\u7f16\u8bd1\\nhttps://github.com/OpenAtomFoundation/pika/pull/2711\\n2 \u6539\u8fdb\u5217\u8868\\n\u4e0b\u9762\u8be6\u7ec6\u5217\u51fa\u4e86\u672c\u6b21\u53d1\u7248\u7684\u4e3b\u8981\u529f\u80fd\u5347\u7ea7\u548c\u6539\u8fdb\u3002\\n2.1 \u65b0\u7279\u6027\\n\\n+ Pika Geo \u6570\u636e\u7c7b\u578b\u589e\u52a0 TCL \u6d4b\u8bd5\uff0c\u5e76\u4fee\u590d\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9047\u5230\u7684\u7f3a\u9677\\n https://github.com/OpenAtomFoundation/pika/pull/2753\\n+ Pika \u652f\u6301\u5728 FreeBSD14 \u5e73\u53f0\u4e0a\u8fdb\u884c\u7f16\u8bd1\u6253\u5305\\n https://github.com/OpenAtomFoundation/pika/pull/2711\\n+ Pika \u7ebf\u7a0b\u6574\u7406\uff0c\u907f\u514d\u542f\u52a8\u8fc7\u591a\u65e0\u7528\u7ebf\u7a0b\uff0c\u5bf9\u4e0d\u540c\u7684\u7ebf\u7a0b\u8fdb\u884c\u547d\u540d\uff0c\u65b9\u4fbf\u95ee\u9898\u5b9a\u4f4d\\n https://github.com/OpenAtomFoundation/pika/pull/2697\\n+ Mget \u652f\u6301\u591a key \u67e5\u8be2\u7f13\u5b58, \u8bb0\u5f55\u672a\u547d\u4e2d\u7684 key \u53bb DB \u4e2d\u67e5\u8be2\uff0c\u63d0\u5347 Pika \u670d\u52a1\u7684\u8bfb\u6027\u80fd\\n https://github.com/OpenAtomFoundation/pika/pull/2675\\n+ Codis \u652f\u6301 info \u547d\u4ee4, \u53ef\u4ee5\u901a\u8fc7\u8be5\u547d\u4ee4\u67e5\u8be2 Codis-proxy \u7684 info \u4fe1\u606f\\n https://github.com/OpenAtomFoundation/pika/pull/2688\\n+ \u6dfb\u52a0 Floyd \u7684 compaction-filter \u7684 Gtest\\n https://github.com/OpenAtomFoundation/pika/pull/2669\\n+ Codis-proxy \u65b0\u589e P99 P95 \u7b49\u76d1\u63a7\u8017\u65f6\u6307\u6807\\n https://github.com/OpenAtomFoundation/pika/pull/2668\\n+ \u6dfb\u52a0 Pika \u538b\u6d4b\u6307\u6807\uff0c\u63d0\u5347 Pika \u538b\u6d4b\u6548\u7387\uff0c\u5e76\u8f93\u51fa\u53ef\u89c6\u5316\u7684\u7edf\u8ba1\u56fe\u8868\\n https://github.com/OpenAtomFoundation/pika/pull/2663\\n+ Pika \u4e3b\u4ece\u590d\u5236\u65b0\u589e\u76d1\u63a7\u6307\u6807 repl_connect_status, \u53ef\u4ee5\u66f4\u52a0\u660e\u786e\u6e05\u6670\u7684\u786e\u5b9a\u5f53\u524d\u7684\u4e3b\u4ece\u590d\u5236\u7684\u72b6\u6001\\n https://github.com/OpenAtomFoundation/pika/pull/2638\\n+ Pika \u4e0d\u652f\u6301\u4e0d\u540c\u7c7b\u578b\u7684\u91cd\u590d key, \u5199\u5165\u91cd\u590d key \u8fd4\u56de\u975e\u6cd5\u7c7b\u578b\\n https://github.com/OpenAtomFoundation/pika/pull/2609\\n+ \u6dfb\u52a0\u652f\u6301\u5206\u533a\u7d22\u5f15\u8fc7\u6ee4\u7684\u529f\u80fd\\n https://github.com/OpenAtomFoundation/pika/pull/2601\\n+ Pika \u652f\u6301\u7b2c\u4e09\u4ee3\u5b58\u50a8\u5f15\u64ce Floyd, \u901a\u8fc7\u652f\u6301\u591a rocksdb \u5b9e\u4f8b\u3001\u5bf9 Blob \u7684\u4f7f\u7528\u8fdb\u884c\u4f18\u5316\u3001\u5bf9\u8fc7\u671f\u6570\u636e\u7684\u6e05\u7406\u8fdb\u884c\u4f18\u5316\uff0c\u63d0\u5347\u4e86 Pika \u5b9e\u4f8b\u7684\u8bfb\u5199\u6027\u80fd\\n https://github.com/OpenAtomFoundation/pika/pull/2413\\n\\n2.2 bug \u4fee\u590d\\n\\n+ \u4fee\u590d iter \u672a\u88ab\u6790\u6784\uff0c\u5bfc\u81f4 pkpatternmatchdel \u5728\u8fd4\u56de\u4e4b\u524d\u4e0d\u4f1a\u5220\u9664 iter\uff0c\u8fd9\u53ef\u80fd\u4f1a\u5bfc\u81f4 rocksdb \u6c38\u8fdc\u5f15\u7528\u4e00\u4e2a\u7248\u672c\uff0c\u5bfc\u81f4\u6570\u636e\u4e0d\u7b26\u5408\u9884\u671f\u7684\u95ee\u9898\\n https://github.com/OpenAtomFoundation/pika/pull/2785\\n+ \u4fee\u590d config \u53c2\u6570 min-blob-size \u5e26\u5355\u4f4d\u65f6\u89e3\u6790\u9519\u8bef\u7684\u95ee\u9898\\n https://github.com/OpenAtomFoundation/pika/pull/2767\\n+ \u4fee\u590d zverank \u8fd4\u56de\u503c\u5f02\u5e38\u7684\u95ee\u9898\\n https://github.com/OpenAtomFoundation/pika/pull/2673\\n+ \u4fee\u590d Pika-port \u4f20\u8f93\u6570\u636e\u8fc7\u7a0b\u4e2d\u62a5\u9519\u7684\u95ee\u9898\\n https://github.com/OpenAtomFoundation/pika/pull/2758\\n+ \u4fee\u590d\u56e0\u4e3a\u5806\u4e0a\u5206\u914d\u7684\u7f13\u51b2\u533a\u8d8a\u754c\u5bfc\u81f4 Dbsize \u547d\u4ee4\u8fd0\u884c\u65f6\u5d29\u6e83\u7684\u95ee\u9898\\n https://github.com/OpenAtomFoundation/pika/pull/2749\\n+ \u4fee\u590d\u6279\u91cf\u6269\u5bb9\u65f6\uff0c\u591a\u4e2a slave \u540c\u65f6\u8fde\u63a5 master, \u77ed\u65f6\u95f4\u591a\u6b21 bgsave \u5bfc\u81f4\u90e8\u5206\u4ece\u8282\u70b9\u6570\u636e\u4e0d\u5b8c\u6574\u7684\u95ee\u9898\\n https://github.com/OpenAtomFoundation/pika/pull/2746\\n+ \u4fee\u590d\u53c2\u6570\u672a\u521d\u59cb\u5316\u5bfc\u81f4 slotsscan \u7b49\u547d\u4ee4\u4e0d\u80fd\u548c bgsave \u547d\u4ee4\u76f8\u4e92\u5236\u8861\u7684\u95ee\u9898\\n https://github.com/OpenAtomFoundation/pika/pull/2745\\n+ \u4fee\u590d Slotmigrate \u8fc1\u79fb\u6570\u636e\u7684\u8fc7\u7a0b\u4e2d\uff0c\u8fd4\u56de\u503c\u8bbe\u7f6e\u9519\u8bef\uff0c\u5f02\u5e38\u573a\u666f\u4e0b\u4f1a\u7ec8\u6b62\u6570\u636e\u8fc1\u79fb\u7684\u95ee\u9898\\n https://github.com/OpenAtomFoundation/pika/pull/2741\\n+ \u4fee\u590d Mget \u6ca1\u6709\u4f7f\u7528\u89e3\u6790 ttl \u7684\u51fd\u6570\u5bfc\u81f4\u51fa\u73b0\u90e8\u5206key\u7684ttl\u672a\u88ab\u66f4\u65b0\uff0c\u6570\u636e\u4e0d\u4e00\u81f4\u7684\u95ee\u9898\\n https://github.com/OpenAtomFoundation/pika/pull/2730\\n+ \u4fee\u590d pkpatternmatchdel \u547d\u4ee4\u4f7f\u7528\u9519\u8bef\u5bfc\u81f4\u7684 stream \u7c7b\u578b\u6570\u636e\u5220\u9664\u5f02\u5e38\u7684\u95ee\u9898\\n https://github.com/OpenAtomFoundation/pika/pull/2726\\n+ \u4fee\u590d pkpatternmatchdel \u4e0d\u80fd\u6b63\u786e\u5220\u9664\u6389\u5bf9\u5e94\u7684 keys \u7684\u95ee\u9898\\n https://github.com/OpenAtomFoundation/pika/pull/2717\\n+ \u4fee\u590d ACL \u5bc6\u7801\u9a8c\u8bc1\u9519\u8bef\u95ee\u9898\\n https://github.com/OpenAtomFoundation/pika/pull/2714\\n+ \u4fee\u590d Keyspace \u547d\u4ee4\u672a\u8ba1\u7b97 Stream \u7c7b\u578b\u6570\u636e\u7684\u95ee\u9898\\n https://github.com/OpenAtomFoundation/pika/pull/2705\\n+ \u5bf9\u90e8\u5206\u547d\u4ee4\u5b9a\u5236\u5316\u5904\u7406\u903b\u8f91\uff0c\u907f\u514d\u5199 binlog \u5bfc\u81f4\u4ece\u8282\u70b9\u7684 binlog \u89e3\u6790\u5931\u8d25\u7684\u95ee\u9898\\n https://github.com/OpenAtomFoundation/pika/pull/2793\\n+ \u4fee\u590d Pika cmdID \u8d4b\u503c\u5728 Cmd \u521d\u59cb\u51fd\u6570\u4e2d\uff0c\u53ef\u80fd\u4f1a\u5bfc\u81f4\u5e76\u53d1\u6784\u9020\u7684\u65f6\u5019\u51fa\u73b0\u5185\u5b58\u6cc4\u6f0f\u7684\u95ee\u9898\\n https://github.com/OpenAtomFoundation/pika/pull/2692\\n+ \u4fee\u590d ExpectedStale \u672a\u8003\u8651 String \u7c7b\u578b, \u5982\u679c\u5b58\u5728\u5df2\u7ecf\u8fc7\u671f\u7684 String \u7c7b\u578b\u7684 key, ExpectedStale \u4f1a\u8fd4\u56de\u9519\u8bef\u7684\u95ee\u9898\\n https://github.com/OpenAtomFoundation/pika/pull/2682\\n+ \u4fee\u590d Spop \u5728\u5199 binlog \u65f6\u53ef\u80fd\u4f1a\u51fa\u73b0\u7ade\u6001\u95ee\u9898\\n https://github.com/OpenAtomFoundation/pika/pull/2674\\n+ db instance \u8bbe\u7f6e\u4e0d\u5408\u7406\u65f6\uff0c\u7ed9\u7528\u6237\u9519\u8bef\u63d0\u793a\\n https://github.com/OpenAtomFoundation/pika/pull/2672\\n+ \u4fee\u590d server_stat \u4e2d\u7684\u6570\u636e\u7ade\u6001\u95ee\u9898\\n https://github.com/OpenAtomFoundation/pika/pull/2671\\n+ \u4fee\u590d\u591a DB \u4e0b\u5168\u91cf\u540c\u6b65\u8d85\u65f6\u540e\u4e0d\u91cd\u8bd5\u7684\u95ee\u9898\\n https://github.com/OpenAtomFoundation/pika/pull/2667\\n+ \u4fee\u590d\u591a DB \u4e0b\u5168\u91cf\u540c\u6b65\u8d85\u65f6\u540e\u4e0d\u91cd\u8bd5\u7684\u95ee\u9898\\n https://github.com/OpenAtomFoundation/pika/pull/2666\\n+ \u4fee\u590d\u4e3b\u4ece\u540c\u6b65\u9650\u901f\u903b\u8f91\u4e2d\u91cd\u590d\u89e3\u9501\u7684\u95ee\u9898\\n https://github.com/OpenAtomFoundation/pika/pull/2657\\n+ \u53d1\u7248\u652f\u6301\u81ea\u52a8\u6253\u5305 centos7 \u548c centos8 \u5e73\u53f0\u7684\u4e8c\u8fdb\u5236\u7f16\u8bd1\u5305\\n https://github.com/OpenAtomFoundation/pika/pull/2535\\n+ \u4fee\u590d Codis \u4fa7\u7684 getrange \u547d\u4ee4\u6ca1\u6709\u8fd4\u56de\u9884\u671f\u7ed3\u679c\u7684\u95ee\u9898\\n https://github.com/OpenAtomFoundation/pika/pull/2510\\n\\n2.3 \u63d0\u5347\u6539\u8fdb\u9879\\n\\n+ \u66f4\u65b0 Pika Docker Readme, \u53ef\u4ee5\u6309\u7167 Readme \u5728 Docker \u4e2d\u90e8\u7f72 Pika \u670d\u52a1\\n https://github.com/OpenAtomFoundation/pika/pull/2743\\n+ \u4f18\u5316\u91cd\u590d\u67e5\u8be2 meta value \u5bfc\u81f4\u5f71\u54cd Pika \u670d\u52a1\u8bfb\u5199\u6027\u80fd\u7684\u95ee\u9898\\n https://github.com/OpenAtomFoundation/pika/pull/2735\\n+ \u652f\u6301\u5bf9\u66f4\u591a\u7684 RocksDB \u53c2\u6570\u8fdb\u884c\u52a8\u6001\u8c03\u6574\uff0c\u7528\u6237\u6839\u636e\u4e0d\u540c\u7684\u4e1a\u52a1\u4f7f\u7528\u573a\u666f\u8c03\u6574\u53c2\u6570\u63d0\u5347 Pika \u7684\u8bfb\u5199\u6027\u80fd\\n https://github.com/OpenAtomFoundation/pika/pull/2728\\n+ \u5bf9 HyperLogLog \u548c String \u8fdb\u884c\u7c7b\u578b\u9694\u79bb\uff0c\u786e\u4fdd HyperLogLog \u64cd\u4f5c\u4e0e String \u64cd\u4f5c\u660e\u786e\u533a\u5206\u5f00\\n https://github.com/OpenAtomFoundation/pika/pull/2720\\n+ \u66f4\u65b0\u4e86 PR \u6807\u9898\u9a8c\u8bc1\uff0c\u4e0d\u5141\u8bb8\u5728\u6807\u9898\u672b\u5c3e\u51fa\u73b0\u4e2d\u6587\u5b57\u7b26\\n https://github.com/OpenAtomFoundation/pika/pull/2718\\n+ \u91cd\u6784\u4e3b\u4ece\u590d\u5236\u6a21\u5f0f slave \u8282\u70b9\u7684\u4e3b\u4ece\u540c\u6b65\u7ebf\u7a0b\u6a21\u578b\uff0c\u5c3d\u53ef\u80fd\u51cf\u5c11 binlog \u6d88\u8d39\u963b\u585e\u95ee\u9898\\n https://github.com/OpenAtomFoundation/pika/pull/2638\\n+ \u65b0\u589e RocksDB Compaction \u7b56\u7565\u52a8\u6001\u8c03\u6574\u53c2\u6570\uff0c\u7528\u6237\u53ef\u4ee5\u6839\u636e\u4e1a\u52a1\u8c03\u6574 Compaction \u7b56\u7565\uff0c\u964d\u4f4e Compaction \u64cd\u4f5c\u5bf9\u670d\u52a1\u6027\u80fd\u7684\u635f\u8017\\n https://github.com/OpenAtomFoundation/pika/pull/2538\\n\\n2.4 \u53d1\u7248 tag\\n\\n https://github.com/OpenAtomFoundation/pika/releases/tag/v4.0.0\\n3 \u793e\u533a\\n\u611f\u8c22\u6240\u6709\u4e3a v4.0.0 \u505a\u51fa\u8d21\u732e\u7684\u793e\u533a\u6210\u5458\uff0c\u5305\u62ec issue/PR \u63d0\u4ea4\u8005\u3001\u4ee3\u7801 reviewer \u3010\u6392\u540d\u4e0d\u5206\u5148\u540e\uff0c\u4f9d\u636e\u5b57\u6bcd\u5e8f\u5217\u3011\uff1a\\n\\n AlexStocks\\n\\n baerwang\\n\\n chejinge\\n\\n cheniujh\\n\\n chienguo\\n\\n guangkun123\\n\\n gukj-spel\\n\\n longfar-ncy\\n\\n lqxhub\\n\\n luky116\\n\\n Mixficsol\\n\\n saz97\\n \\n wangshao1\\n\\nPikiwiDB (Pika) \u5f00\u6e90\u793e\u533a\u70ed\u70c8\u6b22\u8fce\u60a8\u7684\u53c2\u4e0e\u548c\u652f\u6301\u3002\u5982\u679c\u60a8\u6709\u4efb\u4f55\u95ee\u9898\u3001\u610f\u89c1\u6216\u5efa\u8bae\uff0c\u8bf7\u626b\u7801\u6dfb\u52a0 PikiwiDB \u5c0f\u52a9\u624b\u3010\u5fae\u4fe1\u53f7: PikiwiDB\u3011\u4e3a\u597d\u53cb\uff0c\u5b83\u4f1a\u62c9\u60a8\u52a0\u5165\u5b98\u65b9\u5fae\u4fe1\u7fa4\u3002\\n\\n![2024-07-08-PikiwiDB(Pika)-4.0.0-connect](2024-07-08-PikiwiDB(Pika)-4.0.0-connect.png)"},{"id":"Pika-3.5.4","metadata":{"permalink":"/blog/Pika-3.5.4","source":"@site/blog/2024-05-16-Pika-3.5.4.md","title":"What\'s new in Pika v3.5.4","description":"PikiwiDB(Pika) \u793e\u533a\u975e\u5e38\u8363\u5e78\u5730\u5ba3\u5e03\uff0c\u6211\u4eec\u7684\u6700\u65b0 v3.5.4 \u6b63\u5f0f\u751f\u4ea7\u53ef\u7528\u7248\u672c\u73b0\u5df2\u53d1\u5e03\u3002","date":"2024-05-16T00:00:00.000Z","tags":[],"readingTime":5.935,"hasTruncateMarker":false,"authors":[{"name":"\u4e8e\u96e8","title":"dubbogo\u793a\u571f\u533a"}],"frontMatter":{"title":"What\'s new in Pika v3.5.4","slug":"Pika-3.5.4","authors":[{"name":"\u4e8e\u96e8","title":"dubbogo\u793a\u571f\u533a"}],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"What\'s new in PikiwiDB(Pika) v4.0.0","permalink":"/blog/PikiwiDB-Pika--4.0.0"},"nextItem":{"title":"What\'s new in Pika v3.5.3 ","permalink":"/blog/Pika-3.5.3"}},"content":"PikiwiDB(Pika) \u793e\u533a\u975e\u5e38\u8363\u5e78\u5730\u5ba3\u5e03\uff0c\u6211\u4eec\u7684\u6700\u65b0 v3.5.4 \u6b63\u5f0f\u751f\u4ea7\u53ef\u7528\u7248\u672c\u73b0\u5df2\u53d1\u5e03\u3002\\nv3.5.4 \u89e3\u51b3\u4e86\u5386\u53f2\u9057\u7559\u7684 bug\uff0c\u5bf9 PikiwiDB(Pika) \u7684\u4e00\u4e9b\u9057\u7559 bug \u8fdb\u884c\u4fee\u590d\u548c\u4f18\u5316\uff0c\u65e8\u5728\u6253\u9020\u51fa\u4e00\u4e2a\u9ad8\u7a33\u5b9a\u6027\u7684\u7248\u672c\u3002\u672c\u6b21\u7684\u91cd\u70b9\u4f18\u5316\u4e3b\u8981\u5305\u62ec\uff0cPikiwiDB(Pika)\u652f\u6301\u52a8\u6001\u8c03\u6574\u9650\u901f\u53c2\u6570\u3001\u589e\u5f3a PikiwiDB(Pika) \u7684\u5ba2\u89c2\u6d4b\u6027\u6307\u6807\u3001 \u78c1\u76d8 IO \u9650\u901f\u652f\u6301\u8bfb\u9650\u901f\u53ca\u5199\u9650\u901f\u7b49\u3002\\n1 \u65b0\u7279\u6027\\n\\n1. Pika \u652f\u6301\u52a8\u6001\u8c03\u6574\u5168\u91cf\u540c\u6b65\u9650\u901f\u53c2\u6570 rsync-timeout-ms \u548c throttle-bytes-per-second\u3002\\n\\n\u81ea v3.5.0 \u7248\u672c\u5f00\u59cb\uff0cPikiwiDB(Pika) \u670d\u52a1\u6452\u5f03\u4e86\u901a\u8fc7\u5b50\u8fdb\u7a0b\u5185\u4f7f\u7528\u539f\u6765 rsync \u5de5\u5177\u8fdb\u884c\u4e3b\u4ece\u5168\u91cf\u540c\u6b65\u7684\u903b\u8f91\uff0c\u5728 PikiwiDB(Pika) \u5185\u90e8\u4ee5\u7ebf\u7a0b\u65b9\u5f0f\u3010\u79f0\u4f5c rsync \u7ebf\u7a0b\u3011\u81ea\u884c\u5b9e\u73b0\u4e86\u65b0\u7684\u5168\u91cf\u540c\u6b65\u903b\u8f91\uff0c\u907f\u514d\u56e0\u4e3a\u5916\u90e8\u8fdb\u7a0b\u4e0d\u53ef\u63a7\u5f15\u8d77\u7684\u4e3b\u4ece\u540c\u6b65\u95ee\u9898\uff0c\u6839\u636e 360 \u5185\u90e8 Pika \u7ebf\u4e0a\u5927\u89c4\u6a21\u96c6\u7fa4\u8fd0\u7ef4\u7684\u7ecf\u9a8c\uff0c\u5728 PikiwiDB(Pika) \u4e3b\u4ece\u8fdb\u884c\u5168\u91cf\u540c\u6b65\u7684\u8fc7\u7a0b\u4e2d\uff0c\u5982\u679c\u9047\u5230\u67d0\u4e9b\u4e0d\u5229\u7684\u5916\u90e8\u56e0\u7d20\uff0c\u5982\u7f51\u7edc\u6ce2\u52a8\uff0c\u786c\u4ef6\u6545\u969c\uff08\u5982\u7f51\u5361\u964d\u901f\u5bfc\u81f4\u7684\u4e3b\u4ece\u7f51\u5361\u901f\u7387\u4e0d\u5339\u914d\uff09\u7b49\uff0c\u53ef\u80fd\u5f15\u8d77 rsync \u7ebf\u7a0b\u8bf7\u6c42\u6301\u7eed\u8d85\u65f6\uff08PikiwiDB(Pika) \u5185\u7f6e rsync \u6a21\u5757\u7528\u4e8e\u5168\u91cf\u540c\u6b65\u9636\u6bb5\u7684\u6587\u4ef6\u4f20\u8f93\uff09\uff0c\u4e14\u8d85\u65f6\u91cd\u8bd5\u6240\u53d1\u51fa\u7684\u5305\u53ef\u80fd\u5f15\u53d1\u66f4\u5927\u7684\u7f51\u7edc\u4fe1\u9053\u8d1f\u62c5\u3002\u6b64\u65f6\u5bf9\u4e8e\u8fd0\u7ef4\u4eba\u5458\u6765\u8bf4\uff0c\u5982\u679c\u80fd\u52a8\u6001\u8c03\u6574 rsync \u8bf7\u6c42\u7684\u8d85\u65f6\u65f6\u95f4\u548c rsync \u4f20\u8f93\u7684\u901f\u7387\u4e0a\u9650\uff0c\u4e0d\u4ec5\u610f\u5473\u7740\u5bf9\u5168\u91cf\u540c\u6b65\u9636\u6bb5\u63a7\u5236\u7c92\u5ea6\u7684\u8fdb\u4e00\u6b65\u7ec6\u5316\uff0c\u66f4\u5927\u5927\u964d\u4f4e\u4e86\u5728\u8be5\u573a\u666f\u4e0b\u7684\u8fd0\u7ef4\u5904\u7f6e\u96be\u5ea6\u3002\\n\\n\u5173\u952ePR\uff1a\\n\\nhttps://github.com/OpenAtomFoundation/pika/pull/2633\\n\\n2. \u5c06 info key space 1 \u7684\u7ed3\u679c\u8f93\u51fa\u81f3 info all \u5e76\u5c55\u793a\u5230\u76d1\u63a7\u754c\u9762\u4e2d\u3002\\n\\nPikiwiDB(Pika) \u662f\u901a\u8fc7 Info \u547d\u4ee4\u91c7\u96c6\u6570\u636e\u81f3 Pika-Exporter\uff0c\u5c55\u793a\u5230 Grafana \u754c\u9762\u4e0a\u7684\uff0c\u76ee\u524d\u754c\u9762\u4e0a\u90e8\u5206\u6570\u636e\u662f\u6ca1\u6709\u5c55\u793a\u7684\uff0c\u5982 keys \u7684\u6570\u91cf\uff0c\u672c\u6b21\u5c06\u6267\u884c info keyspace \u7684\u7ed3\u679c\u5c55\u793a\u5230\u76d1\u63a7\u754c\u9762\uff0c\u7528\u6237\u53ef\u4ee5\u901a\u8fc7\u8fd9\u4e2a\u6307\u6807\u6765\u67e5\u770b\u5b58\u50a8\u7684\u91cf\u7ea7\u7b49\u3002\\n\\n\u5173\u952ePR\uff1a\\n\\nhttps://github.com/OpenAtomFoundation/pika/pull/2603\\n\\n3.Pika \u78c1\u76d8IO \u9650\u901f\u53c2\u6570\u652f\u6301 OnlyRead\u3001OnlyWrite\u3001ReadAndWrite\uff0c\u9ed8\u8ba4\u652f\u6301OnlyWrite\u3002\\n\\n\u81ea3.5.0\u7248\u672c\u5f00\u59cb\uff0cPikiwiDB(Pika) \u670d\u52a1\u53ef\u4ee5\u901a\u8fc7\u8c03\u6574 rate-limit \u53c2\u6570\u5b9e\u73b0\u5199\u9650\u901f\uff0c\u9632\u6b62\u5728\u7f51\u5361\u8d28\u91cf\u4e0d\u9ad8\u7684\u60c5\u51b5\u4e0b\u78c1\u76d8 IO \u8fc7\u91cd\u5bfc\u81f4\u670d\u52a1\u4e0d\u53ef\u7528\uff0c\u6216\u8005 binlog \u963b\u585e\u7684\u60c5\u51b5\u53d1\u751f\u3002360\u5185\u90e8 Pika \u7ebf\u4e0a\u5927\u89c4\u6a21\u96c6\u7fa4\u8fd0\u7ef4\u7684\u7ecf\u9a8c\uff0c\u5728 PikiwiDB(Pika) \u5b9e\u4f8b\u7684\u7f51\u5361\u8f83\u5dee\u60c5\u51b5\u4e0b\uff0c\u4e5f\u9700\u8981\u5bf9\u8bfb\u5b9e\u4f8b\u8fdb\u884c\u9650\u901f\uff0c\u672c\u6b21\u4fee\u6539\u652f\u6301\u8bfb\u3001\u5199\u9650\u901f\uff0c\u9ed8\u8ba4\u662f\u5199\u9650\u901f\uff0c\u8c03\u6574 config \u914d\u7f6e\u4e2d\u7684 rate-limiter-mode \u53ef\u4ee5\u8bbe\u7f6e\u4e3a\u8bfb\u9650\u901f\uff0c\u6216\u8005\u540c\u65f6\u8bfb\u5199\u9650\u901f\u3002\\n\\n\u5173\u952ePR\uff1a\\n\\n https://github.com/OpenAtomFoundation/pika/pull/2599\\n\\n2 \u6539\u8fdb\u5217\u8868\\n\\n slotmigrate \u6dfb\u52a0 go test\u3002\\n\\n https://github.com/OpenAtomFoundation/pika/pull/2576\\n\\n INFO \u547d\u4ee4\u8017\u65f6\u4f18\u5316\uff0c\u964d\u4f4e\u67e5\u78c1\u76d8\u9891\u7387\uff0c\u907f\u514d\u56e0\u4e3a\u6570\u636e\u91c7\u96c6\u8c03\u7528 info \u547d\u4ee4\u65f6\u67e5\u78c1\u76d8\u592a\u8fc7\u9891\u7e41\u5bfc\u81f4\u670d\u52a1\u6027\u80fd\u4e0b\u964d\u3002\\n\\n https://github.com/OpenAtomFoundation/pika/pull/2554\\n\\n \u5bf9\u4e94\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u547d\u4ee4\u589e\u52a0 Redis tcl \u6d4b\u8bd5\u3002\\n\\n https://github.com/OpenAtomFoundation/pika/pull/2527\\n\\n3 Bug \u4fee\u590d\\n\\n \u4fee\u590d\u4f7f\u7528 Pika Exporter \u65f6\u53ef\u80fd\u4f1a\u51fa\u73b0 slots \u5206\u914d\u4e0d\u5747\u8861\u7684\u95ee\u9898\u3002\\n\\n https://github.com/OpenAtomFoundation/pika/pull/2651\\n\\n \u4fee\u590d Codis dashboard \u4e0d\u80fd\u6b63\u786e\u66f4\u65b0 master \u5b9e\u4f8b\u72b6\u6001\u7684\u95ee\u9898\u3002\\n\\n https://github.com/OpenAtomFoundation/pika/pull/2650\\n\\n \u4fee\u590d Redis \u4e8b\u52a1 binlog \u89e3\u6790\u5931\u8d25\u5bfc\u81f4\u7684\u4e3b\u4ece\u540c\u6b65\u5f02\u5e38\u95ee\u9898\u3002\\n\\n https://github.com/OpenAtomFoundation/pika/pull/2642\\n\\n \u4fee\u590d Pika Expoter \u542f\u52a8\u65f6\u4e0d\u5e26\u53c2\u6570\u5bfc\u81f4\u542f\u52a8\u5931\u8d25\u95ee\u9898\u3002\\n\\n https://github.com/OpenAtomFoundation/pika/pull/2640\\n\\n \u4fee\u590d\u4f7f\u7528 Pika Operater \u62c9\u8d77\u96c6\u7fa4 Codis-proxy panic \u7684\u95ee\u9898\u3002\\n\\n https://github.com/OpenAtomFoundation/pika/pull/2633\\n\\n \u4fee\u590d CI \u7f16\u8bd1\u51fa\u7684\u4e8c\u8fdb\u5236\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u65f6 cp \u547d\u4ee4\u5931\u8d25\u95ee\u9898\u3002\\n\\n https://github.com/OpenAtomFoundation/pika/pull/2614\\n\\n \u4fee\u590d\u53d8\u91cf\u672a\u521d\u59cb\u5316\u5bfc\u81f4 cache \u542f\u52a8\u5931\u8d25\u7684\u95ee\u9898\u3002\\n\\n https://github.com/OpenAtomFoundation/pika/pull/2613\\n\\n \u4fee\u590d userpass \u548c userblacklist \u52a8\u6001\u4fee\u6539\u53c2\u6570\u529f\u80fd\u5f02\u5e38\u95ee\u9898\u3002\\n\\n https://github.com/OpenAtomFoundation/pika/pull/2600\\n\\n \u4fee\u590d scard sscan \u7ed3\u679c\u4e0d\u4e00\u81f4\u7684\u95ee\u9898\u3002\\n\\n https://github.com/OpenAtomFoundation/pika/pull/2596\\n\\n \u4fee\u590d\u5f53 max-rsync-parallel-num \u5927\u4e8e4\uff0cslave \u4f1a\u5728\u4e3b\u4ece\u590d\u5236\u65f6 coredump \u7684\u95ee\u9898\u3002\\n\\n https://github.com/OpenAtomFoundation/pika/pull/2595\\n\\n \u8c03\u6574\u4e0d\u5e38\u7528\u7684\u7ebf\u7a0b\u6c60\u7ebf\u7a0b\u6570\uff0c\u907f\u514d\u56e0\u4e3a\u7a7a\u8dd1\u5bfc\u81f4\u6027\u80fd\u635f\u8017\u3002\\n\\n https://github.com/OpenAtomFoundation/pika/pull/2590\\n\\n \u4fee\u590d Pika \u4e8b\u52a1\u8fb9\u7f18\u6d4b\u8bd5 case \u4e0d\u901a\u8fc7\u7684\u95ee\u9898\u3002\\n\\n https://github.com/OpenAtomFoundation/pika/pull/2586\\n\\n \u5c06 cache-model \u4fee\u6539\u6210 cache-mode\u3002\\n\\n https://github.com/OpenAtomFoundation/pika/pull/2585\\n\\n \u4fee\u590d\u4f7f\u7528 info keyspace \u540e\uff0cinfo all \u6b7b\u9501\u7684\u95ee\u9898\u3002\\n\\n https://github.com/OpenAtomFoundation/pika/pull/2584\\n\\n \u4fee\u590d\u56e0\u4fee\u6539 zsetscorekey comparator impl \u5b57\u5178\u5e8f\u6bd4\u8f83\u719f\u987a\u5e8f\uff0c\u5bfc\u81f4 353 352\u6781\u7aef\u573a\u666f\u4e0d\u517c\u5bb9\u7684\u95ee\u9898\u3002\\n\\n https://github.com/OpenAtomFoundation/pika/pull/2583\\n\\n \u4fee\u590d compact \u6b7b\u9501\u7684\u95ee\u9898\u3002\\n\\n https://github.com/OpenAtomFoundation/pika/pull/2581\\n\\n Slotmigrate \u6dfb\u52a0 go test\u3002\\n\\n https://github.com/OpenAtomFoundation/pika/pull/2576\\n\\n \u66f4\u65b0 Pika Operater \u4f7f\u7528\u7684 pika \u7248\u672c\u3002\\n\\n https://github.com/OpenAtomFoundation/pika/pull/2572\\n\\n \u4fee\u590d config rewrite \u540e blockcache \u6570\u503c\u5f02\u5e38\u7684\u95ee\u9898\u3002\\n\\n https://github.com/OpenAtomFoundation/pika/pull/2561\\n\\n \u4fee\u590d slotmigrate \u52a8\u6001\u4fee\u590d\u540e\u503c\u9519\u8bef\u7684\u95ee\u9898\u3002\\n\\n https://github.com/OpenAtomFoundation/pika/pull/2548\\n\\n \u4fee\u590d spop \u53ef\u80fd\u4f1a\u51fa\u73b0\u4e3b\u4ece\u6570\u636e\u4e0d\u4e00\u81f4\u7684\u95ee\u9898\u3002\\n\\n https://github.com/OpenAtomFoundation/pika/pull/2541\\n\\n \u4fee\u590d CloseFd(it->second[i]) \u51fa\u73b0\u8d8a\u754c\u7684\u95ee\u9898\u3002\\n\\n https://github.com/OpenAtomFoundation/pika/pull/2539\\n\\n \u4fee\u590d Flushall \u548c FlushDB \u6b7b\u9501\u7684\u9690\u60a3\uff0c\u5e76\u5220\u9664 FlushSubDB \u63a5\u53e3\u3002\\n\\n https://github.com/OpenAtomFoundation/pika/pull/2533\\n\\n \u589e\u52a0\u53c2\u6570\u63a7\u5236\u662f\u5426\u6e05\u7406 tcl \u6d4b\u8bd5\u540e\u4ea7\u751f\u7684\u6570\u636e\u6587\u4ef6\uff0c\u9632\u6b62\u5e9f\u5f03\u6570\u636e\u5360\u636e\u78c1\u76d8\u3002\\n\\n https://github.com/OpenAtomFoundation/pika/pull/2507\\n\\n![2024-05-16-Pika-3.5.4-connect.png](2024-05-16-Pika-3.5.4-connect.png)"},{"id":"Pika-3.5.3","metadata":{"permalink":"/blog/Pika-3.5.3","source":"@site/blog/2024-03-27-Pika-3.5.3.md","title":"What\'s new in Pika v3.5.3 ","description":"\u968f\u7740 Redis \u5ba3\u5e03\u91c7\u7528\u53cc\u534f\u8bae\u4ee5\u7ef4\u62a4\u5176\u5546\u4e1a\u5229\u76ca\u4e4b\u9645\uff0cPikiwiDB(Pika) \u793e\u533a\u975e\u5e38\u8363\u5e78\u5730\u5ba3\u5e03\uff0c\u6211\u4eec\u7684\u6700\u65b0 v3.5.3 \u6b63\u5f0f\u751f\u4ea7\u53ef\u7528\u7248\u672c\u73b0\u5df2\u53d1\u5e03\u3002","date":"2024-03-27T00:00:00.000Z","tags":[],"readingTime":14.535,"hasTruncateMarker":false,"authors":[{"name":"360 \u4e2d\u95f4\u4ef6\u56e2\u961f","title":"Pika \u5f00\u6e90\u793e\u533a"}],"frontMatter":{"title":"What\'s new in Pika v3.5.3 ","slug":"Pika-3.5.3","authors":[{"name":"360 \u4e2d\u95f4\u4ef6\u56e2\u961f","title":"Pika \u5f00\u6e90\u793e\u533a"}],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"What\'s new in Pika v3.5.4","permalink":"/blog/Pika-3.5.4"},"nextItem":{"title":"What\'s new in Pika v3.5.0","permalink":"/blog/Pika-3.5.0"}},"content":"\u968f\u7740 Redis \u5ba3\u5e03\u91c7\u7528\u53cc\u534f\u8bae\u4ee5\u7ef4\u62a4\u5176\u5546\u4e1a\u5229\u76ca\u4e4b\u9645\uff0cPikiwiDB(Pika) \u793e\u533a\u975e\u5e38\u8363\u5e78\u5730\u5ba3\u5e03\uff0c\u6211\u4eec\u7684\u6700\u65b0 v3.5.3 \u6b63\u5f0f\u751f\u4ea7\u53ef\u7528\u7248\u672c\u73b0\u5df2\u53d1\u5e03\u3002\\n\\nv3.5.3 \u89e3\u51b3\u4e86\u5386\u53f2\u9057\u7559\u7684 Bug\uff0c\u5f15\u5165\u4e86\u591a\u9879\u65b0\u7279\u6027\u3002\u8fd9\u4e9b\u7279\u6027\u4e3b\u8981\u5305\u62ec Pika \u652f\u6301 ACL\u3001\u5220\u9664 Sharing \u6a21\u5f0f\u6b8b\u7559\u7684 Slot \u4ee3\u7801\u3001\u5feb\u6162\u547d\u4ee4\u5206\u79bb\u3001 Redis Stream\u3001\u5927 key \u5206\u6790\u5de5\u5177\u3001Pika \u5206\u5e03\u5f0f\u96c6\u7fa4\u652f\u6301\u5168\u81ea\u52a8\u5316 failover \u7b49\u529f\u80fd\uff0c\u540c\u65f6\uff0c\u6211\u4eec\u5728 3.5.3 \u7248\u672c\u4e30\u5bcc\u4e86\u66f4\u591a\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5 case\uff0c\u63d0\u5347 Pika \u670d\u52a1\u7684\u7a33\u5b9a\u6027\u548c\u5065\u58ee\u6027\uff0c\u4f1a\u8ba9\u7528\u6237\u611f\u53d7\u5230\u66f4\u4e3a\u9ad8\u6548\u548c\u7a33\u5b9a\u7684\u4f7f\u7528\u4f53\u9a8c\uff0c\u672c\u6587\u4e3b\u8981\u9610\u8ff0\u672c\u6b21\u6539\u52a8\u7684\u76f8\u5173\u91cd\u5927 feature\u3001bugfix \u6027\u80fd\u63d0\u5347\u9879\u3002\\n\\n\u5728\u6df1\u5165\u63a2\u8ba8 3.5.3 \u7248\u672c\u7684\u66f4\u65b0\u5185\u5bb9\u4e4b\u524d\uff0c\u8bf7\u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\u58f0\u660e\uff1a\\n\\n1. \u7531\u4e8e\u5546\u6807\u95ee\u9898\uff0cPika \u9879\u76ee\u5df2\u66f4\u540d\u4e3a PikiwiDB\u3002\u6587\u4e2d\u4ee5 PikiwiDB(Pika) \u6307\u4ee3\u9879\u76ee \\n https://github.com/OpenAtomFoundation/pika\\n2. \u6211\u4eec\u65b0\u521b\u5efa\u4e86\u4e00\u4e2a\u9879\u76ee \\n https://github.com/OpenAtomFoundation/pikiwidb\\n \u8fd9\u662f\u4e00\u4e2a\u57fa\u4e8e Raft \u534f\u8bae\u5b9e\u73b0\u7684\u517c\u5bb9 Redis \u534f\u8bae\u7684\u5927\u5bb9\u91cf KV \u6570\u636e\u5e93\uff0c\u4e3b\u8981\u9762\u5411\u5f3a\u4e00\u81f4\u6027\u6570\u636e\u573a\u666f\uff0c\u4f8b\u5982\u5b58\u50a8\u7ea6 10TiB \u89c4\u6a21\u7684\u5143\u6570\u636e\u3002PikiwiDB \u5c06\u4e13\u95e8\u7528\u4e8e\u6307\u4ee3\u6b64\u9879\u76ee\u3002\\n3. \u6211\u4eec\u4e3a PikiwiDB \u8bbe\u8ba1\u4e86\u4e00\u4e2a\u65b0\u7684 logo\uff0c\u4f5c\u4e3a\u5176\u5546\u6807\uff0c\u5e76\u5df2\u5728\u76f8\u5173\u653f\u5e9c\u673a\u6784\u6ce8\u518c\u3002\\n\\n![2024-03-27-Pika-3.5.3-logo](2024-03-27-Pika-3.5.3-logo.png)\\n\\n1 \u91cd\u5927\u6539\u8fdb\\n\\n1.1 PikiwiDB(Pika) \u652f\u6301 ACL\\n\\nPikiwiDB(Pika) 3.5.3 \u7248\u672c\u6b63\u5f0f\u5168\u9762\u652f\u6301 Redis ACL\uff0c\u4e3a\u672a\u6765\u5728\u4e91\u539f\u751f Pika \u96c6\u7fa4\u4e2d\u652f\u6301\u591a\u79df\u6237\u573a\u666f\u5960\u5b9a\u4e86\u57fa\u7840\u3002\u5728\u6b64\u4e4b\u524d\uff0cPika \u5df2\u7ecf\u652f\u6301\u4e86 Redis \u7684\u7528\u6237\u8ba4\u8bc1\u65b9\u5f0f\uff0c\u5982 auth/userpass/requirepass\uff0c\u4ee5\u53ca\u901a\u8fc7 pika.conf \u4e2d\u7684 userblacklist \u914d\u7f6e\u547d\u4ee4\u9ed1\u540d\u5355\u6a21\u5f0f\u3002\u672c\u6b21\u66f4\u65b0\u4fdd\u6301\u4e86\u5411\u540e\u517c\u5bb9\uff0c\u5e76\u652f\u6301\u8fd9\u4e9b\u5df2\u6709\u7684\u4f7f\u7528\u65b9\u5f0f\u3002\\n\\n\u6211\u4eec\u8fd8\u786e\u4fdd PikiwiDB(Pika) \u7684 ACL \u5b9e\u73b0\u4e0e Redis ACL \u5b8c\u5168\u517c\u5bb9\uff0c\u901a\u8fc7\u5c06 Redis \u7684\u6240\u6709 ACL TCL \u6d4b\u8bd5\u96c6\u7eb3\u5165 PikiwiDB(Pika) \u7684\u6d4b\u8bd5\u96c6\u4e2d\u3002\\n\\n\u5173\u952e PR\uff1a\\n+ PikiwiDB(Pika) \u652f\u6301 ACL\\n https://github.com/OpenAtomFoundation/pika/pull/2013\\n+ \u4fee\u6b63 ACL \u7528\u6237\u8ba4\u8bc1\u9519\u8bef\u95ee\u9898\\n https://github.com/OpenAtomFoundation/pika/pull/2449\\n+ ACL \u5411\u524d\u517c\u5bb9 userblacklist\\n https://github.com/OpenAtomFoundation/pika/pull/2459\\n+ \u6dfb\u52a0 Redis ACL \u6d4b\u8bd5\u96c6\\n https://github.com/OpenAtomFoundation/pika/pull/2495\\n\\n1.2 \u6df7\u5408\u5b58\u50a8\u6a21\u578b\u652f\u6301 bitmap \\n\\n\u5728\u5355\u4f53\u73af\u5883\u4e0b\uff0c\u540c\u65f6\u4f18\u5316 PikiwiDB(Pika) \u7684\u8bfb/\u5199/compaction \u662f\u4e00\u9879\u6311\u6218\u3002\u5728 v3.5.2 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u5f15\u5165\u4e86\u7531\u7f13\u5b58 Redis \u548c RocksDB \u6784\u6210\u7684\u6df7\u5408\u5b58\u50a8\u6a21\u578b\uff0c\u5e76\u652f\u6301\u4e86 string/list/set/zset/hashtable \u4e94\u79cd\u6570\u636e\u7ed3\u6784\u3002\u5728 3.5.3 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u589e\u52a0\u4e86\u5bf9 bitmap \u7684\u652f\u6301\u3002\\n\\n\u6b64\u5916\uff0c\u6211\u4eec\u5728 3.5.3 \u7248\u672c\u4e2d\u652f\u6301\u5bf9 Redis \u7f13\u5b58\u8fdb\u884c\u52a8\u6001\u53c2\u6570\u8c03\u6574\u3002\\n\\n\u5173\u952e PR \u94fe\u63a5\uff1a\\n\\n\\n+ \u652f\u6301 bitmap \u7684\u652f\u6301\uff1a\\n https://github.com/OpenAtomFoundation/pika/pull/2253\\n\\n+ \u53e6\u5916\uff0c\u6211\u4eec\u5728 3.5.3 \u7248\u672c\u4e2d\u652f\u6301\u5bf9 Redis \u7f13\u5b58\u8fdb\u884c\u52a8\u6001\u8c03\u53c2\uff1a\\n https://github.com/OpenAtomFoundation/pika/pull/2197\\n\\n1.3 \u5feb\u6162\u547d\u4ee4\u5206\u79bb\\n\\n+ \u4e3a\u4e86\u9632\u6b62\u6162\u547d\u4ee4\u628a\u5feb\u547d\u4ee4\u6267\u884c\u5361\u6b7b\uff0c\u6211\u4eec\u5728 Codis-Proxy \u548c PikiwiDB(Pika) \u4e24\u4e2a\u5c42\u9762\u90fd\u5b9e\u73b0\u4e86\u5feb\u6162\u547d\u4ee4\u5206\u79bb\u3002 \\n https://github.com/OpenAtomFoundation/pika/pull/2162\\n\\n1.4 Redis Stream\\n\\n\u867d\u7136 PikiwiDB(Pika) \u4e4b\u524d\u652f\u6301\u4e86 Redis pubsub\uff0c\u4f46\u5b83\u53ea\u80fd\u8fdb\u884c\u5728\u7ebf\u6d88\u606f\u4f20\u9012\u3002\u5728 3.5.3 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u589e\u52a0\u4e86\u5bf9 Redis Stream \u7684\u6709\u9650\u652f\u6301\uff0c\u7c7b\u4f3c\u4e8e\u6d88\u606f\u961f\u5217\uff08MQ\uff09\uff0c\u4ee5\u4fbf\u66f4\u5b89\u5168\u5730\u4f20\u9012\u6d88\u606f\u3002\u4e3a\u4e86\u786e\u4fdd\u6570\u636e\u7684\u5b89\u5168\u6027\uff0c\u6211\u4eec\u5728\u5e95\u5c42\u5f15\u64ce BlackWidow \u4e2d\u7279\u522b\u6dfb\u52a0\u4e86\u5bf9 Stream \u6570\u636e\u7c7b\u578b\u7684\u652f\u6301\u3002\\n\u5173\u952e PR\uff1a \\n+ Pika \u652f\u6301 Redis Stream\\n https://github.com/OpenAtomFoundation/pika/pull/1955\\n\u8bf7\u6ce8\u610f\uff0cPika Stream \u76ee\u524d\u8fd8\u4e0d\u652f\u6301\u6d88\u8d39\u7ec4\u6d88\u8d39\uff0c\u8fd9\u5c06\u5728\u540e\u7eed\u7248\u672c\u4e2d\u5b9e\u73b0\u3002\\n\\n1.5 \u4e91\u539f\u751f\u96c6\u7fa4\\n\\n\u5728 PikiwiDB(Pika) 3.5.0 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u5f00\u6e90\u4e86 Pika-Operator\uff0c\u5b83\u652f\u6301\u5728 K8s \u4e0a\u90e8\u7f72 Pika \u4e3b\u4ece\u5bf9\u3002\u5728 3.5.2 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u57fa\u4e8e Kubeblocks \u7684 Pika-Operator \u652f\u6301\u4e86\u5728 K8s \u4e0a\u90e8\u7f72\u7c7b\u4f3c Codis \u7684 Pika Cluster\uff0c\u4f46\u5f53\u65f6\u8fd8\u4e0d\u652f\u6301\u52a8\u6001\u6269\u7f29\u5bb9\u3002\\n\\n\u5728 3.5.3 \u7248\u672c\u4e2d\uff0c\u6700\u65b0\u7684 Pika-Operator \u5df2\u7ecf\u652f\u6301\u4e86 Codis Group \u7ea7\u522b\u7684\u8282\u70b9\u6269\u7f29\u5bb9\uff0c\u5e76\u4e14\u652f\u6301\u6570\u636e\u7684 Rebalance\u3002\\n\u5173\u952e PR\uff1a\\n\\n+ PikiwiDB(Pika) Operator \u652f\u6301 pika \u96c6\u7fa4\u81ea\u52a8\u6269\u5bb9\\n https://github.com/OpenAtomFoundation/pika/pull/2121\\n\\n+ \u4f18\u5316 codis slot \u8fc1\u79fb\u901f\u5ea6\uff0c\u652f\u6301\u52a8\u6001\u4fee\u6539\u8fc1\u79fb\u7ebf\u7a0b\u548c\u901f\u5ea6\\n https://github.com/OpenAtomFoundation/pika/pull/2486\\n\\n+ Pika-operator \u652f\u6301 namespace\uff0c\u5728\u4e0d\u540c\u7684 namespace \u4e0b\u90e8\u7f72\u4e0d\u540c\u7684\u96c6\u7fa4\\n https://github.com/OpenAtomFoundation/pika/pull/2480\\n\\n+ Pika-operator \u652f\u6301\u76d1\u63a7\u6307\u6807\u91c7\u96c6\uff0c\u81ea\u52a8\u62c9\u8d77 pika-expoter\\n\\n https://github.com/OpenAtomFoundation/pika/pull/2451\\n1.6 Compaction \u6539\u8fdb\\n\\nPikiwiDB(Pika) \u7684\u5e95\u5c42\u78c1\u76d8\u5b58\u50a8\u5f15\u64ce RocksDB \u5728\u8fdb\u884c compaction \u65f6\u4f1a\u663e\u8457\u5f71\u54cd PikiwiDB(Pika) \u7684\u8bfb\u5199\u6027\u80fd\u3002\u56e0\u6b64\uff0c\u63a7\u5236\u597d compaction \u662f\u4f18\u5316 Pika \u8bfb\u5199\u6027\u80fd\u7684\u5173\u952e\u3002\\n\u6709\u5173 compaction \u7684\u5173\u952e\u4f18\u5316 PR \u5982\u4e0b\uff1a\\n\\n+ \u6dfb\u52a0 CompactRange \u547d\u4ee4\u652f\u6301\u5bf9\u4e00\u5b9a\u8303\u56f4\u5185\u7684 key \u8fdb\u884c compact\\n https://github.com/OpenAtomFoundation/pika/pull/2163\\n+ \u63d0\u5347 Compaction \u901f\u5ea6\u51cf\u5c11 Compaction \u8017\u65f6 \\n https://github.com/OpenAtomFoundation/pika/pull/2172\\n+ \u6267\u884c shutdown \u547d\u4ee4\u65f6\u8c03\u7528 disable compaction, \u63d0\u5347\u8fdb\u7a0b\u9000\u51fa\u901f\u5ea6\\n https://github.com/OpenAtomFoundation/pika/pull/2345\\n\\n1.7 \u81ea\u52a8 Failover\\n\\nPikiwiDB(Pika) \u96c6\u7fa4\u76ee\u524d\u662f\u57fa\u4e8e Codis \u5b9e\u73b0\u7684\u3002\u4e3a\u4e86\u63d0\u9ad8\u57fa\u4e8e Codis \u7684 PikiwiDB(Pika) Cluster \u7684\u6613\u7528\u6027\uff0c\u6211\u4eec\u5bf9 Codis \u8fdb\u884c\u4e86\u8bb8\u591a\u6269\u5c55\u3002\\n\\n\u539f\u59cb\u7684 Codis \u4e0d\u652f\u6301 Group \u5185\u7684 Failover\uff0c\u9700\u8981\u4f7f\u7528 Redis Sentinel\uff0c\u8fd9\u4f1a\u5bfc\u81f4\u8fd0\u7ef4\u6210\u672c\u589e\u52a0\u3002\u6211\u4eec\u5728 Codis Dashboard \u4e2d\u52a0\u5165\u4e86 sentinel \u7684\u529f\u80fd\uff0c\u5b9e\u73b0\u4e86\u5bf9 Group \u5185\u4e3b\u4ece\u7684\u81ea\u52a8 failover\u3002\\n\\n\u5173\u952e PR\uff1a\\n\\n+ PikiwiDB(Pika) \u5206\u5e03\u5f0f\u96c6\u7fa4\u652f\u6301\u81ea\u52a8 failover\\n https://github.com/OpenAtomFoundation/pika/pull/2386\\n\\n1.8 \u53ef\u89c2\u6d4b\u6027\u63d0\u5347\\n\\nPikiwiDB(Pika) \u7684\u53ef\u89c2\u6d4b\u6027\u5173\u952e\u7ec4\u4ef6\u662f Pika-Exporter\u3002\u5728 3.5.2 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u867d\u7136\u6dfb\u52a0\u4e86 Redis Cache \u7f13\u5b58\u70ed\u6570\u636e\uff0c\u4f46\u7f3a\u5c11\u76d1\u63a7\u6307\u6807\u3002\u5728 3.5.3 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u589e\u52a0\u4e86\u5305\u62ec\u547d\u4e2d\u7387\u3001\u6bcf\u79d2\u547d\u4e2d\u6b21\u6570\u3001Redis Cache \u5185\u5b58\u4f7f\u7528\u91cf\u3001Redis Cache \u4e2a\u6570\u3001Redis Cache DB \u4e2a\u6570 \u7b49\u6307\u6807\u3002\\n\\n\u5173\u952e PR\uff1a\\n\\n+ PikiwiDB(Pika) exporter \u66b4\u9732 cache \u76f8\u5173\u7684\u6570\u636e\u91c7\u96c6\u6307\u6807 \\n https://github.com/OpenAtomFoundation/pika/pull/2318\\n+ PikiwiDB(Pika) \u5206\u5e03\u5f0f\u96c6\u7fa4 Codis proxy \u65b0\u589e\u53ef\u89c2\u6d4b\u6307\u6807 \\n https://github.com/OpenAtomFoundation/pika/pull/2199\\n+ \u4fee\u590ddbsize \u8ba1\u7b97\u9519\u8bef\u95ee\u9898 \\n https://github.com/OpenAtomFoundation/pika/pull/2494\\n+ \u4fee\u590d\u7f51\u7edc\u76d1\u63a7\u6307\u6807\u7edf\u8ba1\u4e0d\u51c6\u786e\u7684\u95ee\u9898 \\n https://github.com/OpenAtomFoundation/pika/pull/2234\\n1.9 \u6570\u636e\u4e00\u81f4\u6027\\n3.5.3 \u7248\u672c\u4fee\u590d\u4e86\u8bb8\u591a PikiwiDB(Pika) \u4e3b\u4ece\u540c\u6b65\u95ee\u9898\uff0c\u786e\u4fdd\u6570\u636e\u7684\u4e00\u81f4\u6027\u3002\\n\\n\u5173\u952e PR\uff1a\\n\\n+ \u4fee\u590d\u4e3b\u4ece\u590d\u5236\u8fc7\u7a0b\u4e2d, slave \u8282\u70b9\u6536\u5230 master \u5f02\u5e38\u56de\u5305\u540e\u7684\u5904\u7406\u903b\u8f91 \\n https://github.com/OpenAtomFoundation/pika/pull/2319\\n+ \u4fee\u590d Pika cache \u90e8\u5206\u573a\u666f\u4e0b cache \u548c DB \u6570\u636e\u4e0d\u4e00\u81f4\u7684\u95ee\u9898 \\n https://github.com/OpenAtomFoundation/pika/pull/2225\\n+ \u4fee\u590d\u5168\u91cf\u590d\u5236\u5931\u8d25\u540e\uff0c\u672a\u505a\u5904\u7406\u5bfc\u81f4\u6570\u636e\u4e22\u5931\u95ee\u9898 \\n https://github.com/OpenAtomFoundation/pika/pull/2439\\n+ \u4fee\u590d\u4e3b\u4ece\u590d\u5236\u8fc7\u7a0b\u4e2d\uff0c\u4e3b\u5b9e\u4f8b\u6267\u884c bgsave \u8fc7\u7a0b\u4e2d\uff0c\u6ca1\u6709\u6b63\u786e\u56de\u5e94\u4ece\u7684\u540c\u6b65\u8bf7\u6c42 \\n https://github.com/OpenAtomFoundation/pika/pull/2437\\n+ \u5168\u91cf\u590d\u5236\u8fc7\u7a0b\u4e2d\uff0c\u6dfb\u52a0\u6570\u636e\u540c\u6b65\u72b6\u6001\uff0c\u660e\u786e\u6570\u636e\u540c\u6b65\u8fdb\u5ea6 \\n https://github.com/OpenAtomFoundation/pika/pull/2430\\n+ \u4fee\u590d\u4ece\u5e93\u5728 Apply binlog \u65f6\uff0c\u6ca1\u6709\u5bf9\u64cd\u4f5c\u7684 key \u52a0\u9501\uff0c\u5bfc\u81f4\u6570\u636e\u4e0d\u4e00\u81f4\u7684\u95ee\u9898 \\n https://github.com/OpenAtomFoundation/pika/pull/2409\\n+ \u4fee\u590d\u8fc1\u79fb\u6570\u636e\u540e\u6570\u636e\u4e0d\u4e00\u81f4\u7684\u95ee\u9898 \\n https://github.com/OpenAtomFoundation/pika/pull/2485\\n\\n\\n1.10 \u6dfb\u52a0\u6d4b\u8bd5\u96c6\\n\\nPikiwiDB(Pika) \u6d4b\u8bd5\u96c6\u7531 gtest \u5355\u6d4b\u3001Redis TCL \u6d4b\u8bd5\u96c6\u548c Go \u6d4b\u8bd5\u96c6\u7ec4\u6210\uff1a\\n\\n+ gtest \u5355\u6d4b\u4e3b\u8981\u6d4b\u8bd5 Pika C++ \u4ee3\u7801\\n+ Redis TCL \u6d4b\u8bd5\u96c6\u6765\u81ea Redis\uff0c\u7528\u4e8e\u6d4b\u8bd5 PikiwiDB(Pika) \u5bf9 Redis \u6807\u51c6\u547d\u4ee4\u517c\u5bb9\u5ea6\\n+ Go \u6d4b\u8bd5\u96c6\u53ef\u5bf9 Pika \u8fdb\u884c Redis \u547d\u4ee4\u6d4b\u8bd5\u3001\u4e3b\u4ece\u548c Codis \u96c6\u7fa4 e2e \u6d4b\u8bd5 \\n\\n3.5.3 \u4e2d\u6dfb\u52a0\u4e86 Codis \u96c6\u7fa4 e2e \u6d4b\u8bd5\uff0c\u5173\u952e PR \u5982\u4e0b\uff1a\\n\\n\\n+ \u4e30\u5bcc\u4e86 Pika TCL \u6d4b\u8bd5\u96c6 \\n https://github.com/OpenAtomFoundation/pika/pull/2497\\n+ \u4e30\u5bcc\u4e86 Pika Gotest \u6d4b\u8bd5\u96c6 \\n https://github.com/OpenAtomFoundation/pika/pull/2502\\n\\n1.11 \u5de5\u5177\u96c6 \\nPikiwiDB(Pika) \u4e00\u76f4\u91cd\u89c6\u5de5\u5177\u96c6\u7684\u5efa\u8bbe\uff0c\u6240\u6709\u76f8\u5173\u5de5\u5177\u90fd\u53ef\u4ee5\u5728 https://github.com/OpenAtomFoundation/pika/tree/unstable/tools \u4e2d\u627e\u5230\u3002\u5728 3.5.3 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u65b0\u589e\u4e86\u4e00\u4e2a\u5de5\u5177\uff1a\\n\\nPikiwiDB(Pika) \u652f\u6301\u5927 key \u5206\u6790\u5de5\u5177\\n https://github.com/OpenAtomFoundation/pika/pull/2195\\n\\n1.12 \u6587\u6863\u66f4\u65b0\\n\\nPikiwiDB(Pika) \u7684\u6587\u6863\u4e3b\u8981\u662f wiki \u6587\u6863\u3002\u5728 3.5.3 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u66f4\u65b0\u4e86 Pika \u652f\u6301\u7684 Redis \u547d\u4ee4\u6587\u6863\u3002\\n\\n\u6587\u6863\u94fe\u63a5\uff1a https://github.com/OpenAtomFoundation/pika/wiki/pika-%E6%94%AF%E6%8C%81%E7%9A%84redis%E6%8E%A5%E5%8F%A3%E5%8F%8A%E5%85%BC%E5%AE%B9%E6%83%85%E5%86%B5\\n2 \u6539\u8fdb\u5217\u8868\\n\\n\u5728\u7b2c\u4e00\u7ae0\u8282\u4e2d\uff0c\u6211\u4eec\u6982\u8ff0\u4e86 3.5.3 \u7248\u672c\u7684\u4e3b\u8981\u529f\u80fd\u5347\u7ea7\u548c\u6539\u8fdb\u3002\u4e0b\u9762\u8be6\u7ec6\u5217\u51fa\u4e86\u672c\u6b21\u53d1\u7248\u7684\u76f8\u5173 PR\u3002\\n\\n2.1 \u65b0\u7279\u6027\\n\\n+ Pika \u652f\u6301 ACL \\n\\n https://github.com/OpenAtomFoundation/pika/pull/2013\\n\\n+ \u5728\u5168\u91cf\u590d\u5236\u7684\u8fc7\u7a0b\u4e2d\uff0cpika \u670d\u52a1\u7684\u4ece\u8282\u70b9\u4e0d\u63a5\u6536\u8bfb\u8bf7\u6c42 \\n\\n https://github.com/OpenAtomFoundation/pika/pull/2197\\n+ \u5220\u9664 Sharing \u6a21\u5f0f\u6b8b\u7559\u7684 Slot \u4ee3\u7801\uff0c\u56de\u5f52 3.0\uff0c\u4ee5\u540e\u4e00\u4e2a Pika \u4e0b\u6709\u591a\u4e2a DB\uff0c\u6bcf\u4e2a DB \u53ea\u6709\u4e00\u4e2a Blackwidow \\n https://github.com/OpenAtomFoundation/pika/pull/2251\\n+ \u5728 Codis dashboard \u534f\u7a0b panic \u65f6\u81ea\u52a8\u6062\u590d\u670d\u52a1 \\n https://github.com/OpenAtomFoundation/pika/pull/2349\\n+ Pika cache \u65b0\u589e bimap\u6570\u636e\u7c7b\u578b \\n https://github.com/OpenAtomFoundation/pika/pull/2253\\n+ Pika \u652f\u6301\u5feb\u6162\u547d\u4ee4\u5206\u79bb \\n https://github.com/OpenAtomFoundation/pika/pull/2162\\n+ Pika exporter \u66b4\u9732 cache \u76f8\u5173\u7684\u6570\u636e\u91c7\u96c6\u6307\u6807 \\n https://github.com/OpenAtomFoundation/pika/pull/2318\\n+ Pika \u6267\u884c\u5b8c\u6210 Bgsave \u540e, \u4fdd\u7559 unix timepoint \\n https://github.com/OpenAtomFoundation/pika/pull/2167\\n+ Pika \u652f\u6301\u52a8\u6001\u914d\u7f6e disable_auto_compations \u53c2\u6570 \\n https://github.com/OpenAtomFoundation/pika/pull/2257\\n+ Pika \u652f\u6301 Redis Stream \\n https://github.com/OpenAtomFoundation/pika/pull/1955\\n+ Pika \u652f\u6301\u5927 key \u5206\u6790\u5de5\u5177 \\n https://github.com/OpenAtomFoundation/pika/pull/2195\\n+ Pika \u652f\u6301\u52a8\u6001\u8c03\u6574 Pika cache \u53c2\u6570 \\n https://github.com/OpenAtomFoundation/pika/pull/2197\\n+ \u66f4\u65b0 Pika benchmark \u5de5\u5177\u652f\u6301\u66f4\u591a\u7684\u63a5\u53e3\u538b\u6d4b \\n https://github.com/OpenAtomFoundation/pika/pull/2222\\n+ Pika Operator \u652f\u6301 pika \u96c6\u7fa4\u81ea\u52a8\u6269\u5bb9 \\n https://github.com/OpenAtomFoundation/pika/pull/2121\\n+ \u6dfb\u52a0 CompactRange \u547d\u4ee4\u652f\u6301\u5bf9\u4e00\u5b9a\u8303\u56f4\u5185\u7684 key \u8fdb\u884c compact \\n https://github.com/OpenAtomFoundation/pika/pull/2163\\n+ \u63d0\u5347 Compaction \u901f\u5ea6\u51cf\u5c11 Compaction \u8017\u65f6 \\n https://github.com/OpenAtomFoundation/pika/pull/2172\\n+ \u5347\u7ea7 RocksDB \u7248\u672c\u5230 v8.7.3 \\n https://github.com/OpenAtomFoundation/pika/pull/2157\\n+ Pika \u5206\u5e03\u5f0f\u96c6\u7fa4 Codis proxy \u65b0\u589e\u53ef\u89c2\u6d4b\u6307\u6807 \\n https://github.com/OpenAtomFoundation/pika/pull/2199\\n+ Pika \u5206\u5e03\u5f0f\u96c6\u7fa4\u652f\u6301\u81ea\u52a8 failover \\n https://github.com/OpenAtomFoundation/pika/pull/2386\\n+ Pika \u652f\u6301 redis rename-command \u529f\u80fd \\n https://github.com/OpenAtomFoundation/pika/pull/2455\\n+ \u4f18\u5316 codis slot \u8fc1\u79fb\u901f\u5ea6\uff0c\u652f\u6301\u52a8\u6001\u4fee\u6539\u8fc1\u79fb\u7ebf\u7a0b\u548c\u901f\u5ea6 \\n https://github.com/OpenAtomFoundation/pika/pull/2486\\n+ Pika \u652f\u6301\u52a8\u6001\u8c03\u6574 max-conn-rbuf-size \u53c2\u6570 \\n https://github.com/OpenAtomFoundation/pika/pull/2434\\n+ Pika-operator \u652f\u6301 namespace\uff0c\u53ef\u4ee5\u5728\u4e0d\u540c\u7684 namespace \u4e0b\u90e8\u7f72\u4e0d\u540c\u7684\u96c6\u7fa4 \\n https://github.com/OpenAtomFoundation/pika/pull/2480\\n+ Pika-operator \u652f\u6301\u76d1\u63a7\u6307\u6807\u91c7\u96c6\uff0c\u81ea\u52a8\u62c9\u8d77 pika-expoter \\n https://github.com/OpenAtomFoundation/pika/pull/2451\\n+ ACL \u5411\u524d\u517c\u5bb9 userblacklist \\n https://github.com/OpenAtomFoundation/pika/pull/2459\\n+ \u4e30\u5bcc\u4e86 Pika TCL \u6d4b\u8bd5\u96c6 \\n https://github.com/OpenAtomFoundation/pika/pull/2497\\n+ \u4e30\u5bcc\u4e86 Pika Gotest \u6d4b\u8bd5\u96c6 \\n https://github.com/OpenAtomFoundation/pika/pull/2502\\n\\n2.2 bug \u4fee\u590d\\n\\n+ \u4fee\u590d Pika \u6709\u4ece\u8282\u70b9\u8fdb\u884c\u5168\u91cf\u590d\u5236\u671f\u95f4\u4f1a\u8bef\u5220\u9664 dump \u6587\u4ef6\u7684\u95ee\u9898 \\n https://github.com/OpenAtomFoundation/pika/pull/2377\\n+ \u4fee\u590d\u4e3b\u4ece\u590d\u5236\u8fc7\u7a0b\u4e2d, slave \u8282\u70b9\u6536\u5230 master \u5f02\u5e38\u56de\u5305\u540e\u7684\u5904\u7406\u903b\u8f91 \\n https://github.com/OpenAtomFoundation/pika/pull/2319\\n+ \u5728 Pika \u6267\u884c shutdown \u547d\u4ee4\u65f6\u8c03\u7528 disable compaction, \u63d0\u5347\u8fdb\u7a0b\u9000\u51fa\u901f\u5ea6 \\n https://github.com/OpenAtomFoundation/pika/pull/2345\\n+ \u4fee\u590d Codis-dashboard Redis Memory \u503c\u4e0d\u51c6\u786e\u7684\u95ee\u9898 \\n https://github.com/OpenAtomFoundation/pika/pull/2337\\n+ INFO \u547d\u4ee4\u8017\u65f6\u4f18\u5316\uff0c\u964d\u4f4e\u67e5\u78c1\u76d8\u4f7f\u7528\u91cf\u7684\u9891\u7387 \\n https://github.com/OpenAtomFoundation/pika/pull/2197\\n+ \u4fee\u590d Rsync \u5220\u9664\u4e34\u65f6\u6587\u4ef6\u8def\u5f84\u4e0d\u5bf9\uff0c\u5220\u9664\u5931\u8d25\uff0c\u5bfc\u81f4rocksdb\u6253\u5f00\u5931\u8d25\u7684\u95ee\u9898 \\n https://github.com/OpenAtomFoundation/pika/pull/2186\\n+ \u4fee\u590d Compact ,Bgsave ,Info keyspace \u547d\u4ee4\u672a\u6307\u5b9adb\u540d\u79f0\uff0c\u5bfc\u81f4\u90e8\u5206\u547d\u4ee4 coredump \u7684\u95ee\u9898 \\n https://github.com/OpenAtomFoundation/pika/pull/2194\\n+ Codis dashboard \u7528 info replication \u66ff\u4ee3 info \u547d\u4ee4\u67e5\u5bfb master ip \u964d\u4f4e\u5bf9 Pika \u7684\u6027\u80fd\u5f71\u54cd \\n https://github.com/OpenAtomFoundation/pika/pull/2198\\n+ \u4fee\u590d Pika cache \u4f7f\u7528\u8fb9\u7f18case\uff0c\u89e3\u51b3\u90e8\u5206\u573a\u666f\u4e0b cache \u548c DB \u6570\u636e\u4e0d\u4e00\u81f4\u7684\u95ee\u9898 \\n https://github.com/OpenAtomFoundation/pika/pull/2225\\n+ \u4fee\u590d\u5f53 dump \u6587\u4ef6\u5939\u4e3a\u7a7a\u65f6\uff0c\u4f1a\u542f\u52a8\u62a5\u9519 Segmentation fault \u7684\u95ee\u9898 \\n https://github.com/OpenAtomFoundation/pika/pull/2265\\n+ \u4fee\u590d\u56e0\u4e3a flag \u8ba1\u7b97\u9519\u8bef\uff0c\u5bfc\u81f4\u7684\u90e8\u5206\u547d\u4ee4\u7f13\u5b58\u6ca1\u6709\u751f\u6548\u95ee\u9898 \\n https://github.com/OpenAtomFoundation/pika/pull/2217\\n+ \u4fee\u590d\u4e3b\u4ece\u590d\u5236\u6a21\u5f0f\u4e0b\uff0c\u4e3b\u5b9e\u4f8b flushdb \u540e\uff0c\u4ece\u5b9e\u4f8b\u56e0\u4e3a\u6b7b\u9501\u5bfc\u81f4\u7684\u4e0d\u80fd\u8bbf\u95ee\u7684\u95ee\u9898 \\n https://github.com/OpenAtomFoundation/pika/pull/2249\\n+ \u4fee\u590d\u90e8\u5206\u547d\u4ee4\u672a\u5bf9 RocksDB \u7684\u8fd4\u56de\u503c\u8fdb\u884c\u5224\u65ad\u7684\u95ee\u9898 \\n https://github.com/OpenAtomFoundation/pika/pull/2187\\n+ \u89c4\u8303\u51fd\u6570\u7684\u8fd4\u56de\u503c\u53ca\u521d\u59cb\u503c \\n https://github.com/OpenAtomFoundation/pika/pull/2176\\n+ \u4fee\u590d\u7f51\u7edc\u76d1\u63a7\u6307\u6807\u7edf\u8ba1\u4e0d\u51c6\u786e\u7684\u95ee\u9898 \\n https://github.com/OpenAtomFoundation/pika/pull/2234\\n+ \u4fee\u590d\u914d\u7f6e\u6587\u4ef6\u52a0\u8f7d\u90e8\u5206\u53c2\u6570\u5f02\u5e38\u7684\u95ee\u9898 \\n https://github.com/OpenAtomFoundation/pika/pull/2218\\n+ \u4fee\u590d Codis dashboard cpu 100% \u7684\u95ee\u9898 \\n https://github.com/OpenAtomFoundation/pika/pull/2393\\n+ \u4fee\u590d Codis fe pika \u4e3b\u4ece\u89d2\u8272\u663e\u793a\u5f02\u5e38\u7684\u95ee\u9898 \\n https://github.com/OpenAtomFoundation/pika/pull/2387\\n+ \u4fee\u590d\u8fc1\u79fb\u6570\u636e\u540e\u6570\u636e\u4e0d\u4e00\u81f4\u7684\u95ee\u9898 \\n https://github.com/OpenAtomFoundation/pika/pull/2485 \\n+ \u4fee\u590ddbsize \u8ba1\u7b97\u9519\u8bef\u95ee\u9898 \\n https://github.com/OpenAtomFoundation/pika/pull/2494\\n+ \u4fee\u590d\u6269\u7f29\u5bb9\u6216\u8005 pod \u8d77\u505c\u540e\uff0cCodis-dashboard \u754c\u9762\u663e\u793a\u4e0d\u51c6\u786e\u7684\u95ee\u9898 \\n https://github.com/OpenAtomFoundation/pika/pull/2475\\n+ \u4fee\u590d DB \u5c42\u91cd\u590d\u4e0a\u9501\u7684\u95ee\u9898 \\n https://github.com/OpenAtomFoundation/pika/pull/2372 \\n+ \u4fee\u590d\u5168\u91cf\u590d\u5236\u5931\u8d25\u540e\uff0c\u672a\u505a\u5904\u7406\u5bfc\u81f4\u6570\u636e\u4e22\u5931\u95ee\u9898 \\n https://github.com/OpenAtomFoundation/pika/pull/2439\\n+ \u4fee\u590d\u4e3b\u4ece\u590d\u5236\u8fc7\u7a0b\u4e2d\uff0c\u4e3b\u5b9e\u4f8b\u6267\u884c bgsave \u8fc7\u7a0b\u4e2d\uff0c\u6ca1\u6709\u6b63\u786e\u56de\u5e94\u4ece\u7684\u540c\u6b65\u8bf7\u6c42 \\n https://github.com/OpenAtomFoundation/pika/pull/2437\\n+ \u5168\u91cf\u590d\u5236\u8fc7\u7a0b\u4e2d\uff0c\u6dfb\u52a0\u6570\u636e\u540c\u6b65\u72b6\u6001\uff0c\u660e\u786e\u6570\u636e\u540c\u6b65\u8fdb\u5ea6 \\n https://github.com/OpenAtomFoundation/pika/pull/2430\\n+ \u4fee\u590d\u4ece\u5e93\u5728 Apply binlog \u65f6\uff0c\u6ca1\u6709\u5bf9\u64cd\u4f5c\u7684 key \u52a0\u9501\uff0c\u5bfc\u81f4\u6570\u636e\u4e0d\u4e00\u81f4\u7684\u95ee\u9898 \\n https://github.com/OpenAtomFoundation/pika/pull/2409\\n+ \u4fee\u590d codis slot \u8fc1\u79fb\u8fc7\u7a0b\u4e2d master \u5b9e\u4f8b coredump \u7684\u95ee\u9898 \\n https://github.com/OpenAtomFoundation/pika/pull/2415\\n+ \u4fee\u590d\u5728\u4e3b\u4ece\u590d\u5236\u8fc7\u7a0b\u4e2d\uff0c\u5220\u9664\u6b63\u5728\u4f7f\u7528\u7684 dump \u6587\u4ef6\u7684\u95ee\u9898 \\n https://github.com/OpenAtomFoundation/pika/pull/2377\\n+ \u4fee\u590d\u4e3b\u4ece\u590d\u5236\u8fc7\u7a0b\u4e2d\u4ece\u5b9e\u4f8b rsync \u54cd\u5e94\u9519\u8bef\u7684\u95ee\u9898 \\n https://github.com/OpenAtomFoundation/pika/pull/2319\\n\\n2.3 \u53d1\u7248 tag\\n https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.3\\n3 \u793e\u533a\\n\\n\u5982\u679c\u4f60\u6709\u4efb\u4f55\u7591\u95ee\uff0c\u6b22\u8fce\u52a0\u5165\u4ea4\u6d41\u7fa4\uff0cPikiwiDB(Pika) \u5f00\u6e90\u793e\u533a\u611f\u8c22\u5927\u5bb6\u7684\u652f\u6301\u548c\u5e2e\u52a9\u3002\\n\\n![2024-03-27-Pika-3.5.3-connect](2024-03-27-Pika-3.5.3-connect.png)"},{"id":"Pika-3.5.0","metadata":{"permalink":"/blog/Pika-3.5.0","source":"@site/blog/2023-12-03-Pika-3.5.2.md","title":"What\'s new in Pika v3.5.0","description":"Pika \u793e\u533a\u8fd1\u671f\u53d1\u5e03\u4e86\u5907\u53d7\u671f\u5f85\u7684 v3.5.2 \u7248\u672c https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.2-alpha \uff0c\u4e0d\u4ec5\u89e3\u51b3\u4e86\u5386\u53f2\u9057\u7559\u7684 Bug \u95ee\u9898\uff0c\u8fd8\u5f15\u5165\u4e86\u591a\u9879\u65b0\u7279\u6027\u3002\u8fd9\u4e9b\u65b0\u7279\u6027\u4e3b\u8981\u5305\u62ec Pika \u652f\u6301 Redis \u4e8b\u52a1\u3001Pika \u4e0a\u5c42\u589e\u52a0\u7f13\u5b58\u5c42\u5b9e\u73b0\u51b7\u70ed\u6570\u636e\u5206\u79bb\u3001\u63d0\u5347\u8bfb\u6027\u80fd\u3001Codis-Proxy \u652f\u6301\u52a8\u6001\u4fee\u6539\u914d\u7f6e\u53c2\u6570\u7b49\u7b49\uff0c\u65e0\u7591\u5c06\u4f1a\u8ba9\u7528\u6237\u611f\u53d7\u5230\u66f4\u4e3a\u9ad8\u6548\u548c\u7a33\u5b9a\u7684\u4f7f\u7528\u4f53\u9a8c\u3002","date":"2023-12-03T00:00:00.000Z","tags":[],"readingTime":2.575,"hasTruncateMarker":false,"authors":[{"name":"\u4e8e\u96e8","title":"dubbo-go\u5f00\u6e90\u793e\u533a"}],"frontMatter":{"title":"What\'s new in Pika v3.5.0","slug":"Pika-3.5.0","authors":[{"name":"\u4e8e\u96e8","title":"dubbo-go\u5f00\u6e90\u793e\u533a"}],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"What\'s new in Pika v3.5.3 ","permalink":"/blog/Pika-3.5.3"},"nextItem":{"title":"What\'s new in Pika v3.5.1","permalink":"/blog/Pika-3.5.1"}},"content":"Pika \u793e\u533a\u8fd1\u671f\u53d1\u5e03\u4e86\u5907\u53d7\u671f\u5f85\u7684 v3.5.2 \u7248\u672c https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.2-alpha \uff0c\u4e0d\u4ec5\u89e3\u51b3\u4e86\u5386\u53f2\u9057\u7559\u7684 Bug \u95ee\u9898\uff0c\u8fd8\u5f15\u5165\u4e86\u591a\u9879\u65b0\u7279\u6027\u3002\u8fd9\u4e9b\u65b0\u7279\u6027\u4e3b\u8981\u5305\u62ec Pika \u652f\u6301 Redis \u4e8b\u52a1\u3001Pika \u4e0a\u5c42\u589e\u52a0\u7f13\u5b58\u5c42\u5b9e\u73b0\u51b7\u70ed\u6570\u636e\u5206\u79bb\u3001\u63d0\u5347\u8bfb\u6027\u80fd\u3001Codis-Proxy \u652f\u6301\u52a8\u6001\u4fee\u6539\u914d\u7f6e\u53c2\u6570\u7b49\u7b49\uff0c\u65e0\u7591\u5c06\u4f1a\u8ba9\u7528\u6237\u611f\u53d7\u5230\u66f4\u4e3a\u9ad8\u6548\u548c\u7a33\u5b9a\u7684\u4f7f\u7528\u4f53\u9a8c\u3002\\n\\n## \u65b0\u7279\u6027\\n\\n+ Pika \u652f\u6301 Redis \u4e8b\u52a1\uff0c\u4f7f\u5f97 Pika \u7684\u6570\u636e\u591f\u5728\u4e00\u7cfb\u5217\u547d\u4ee4\u7684\u6267\u884c\u4e2d\u4fdd\u6301\u6570\u636e\u7684\u4e00\u81f4\u6027\u548c\u53ef\u9760\u6027\u3002 https://github.com/OpenAtomFoundation/pika/pull/2124\\n+ Pika \u4e0a\u5c42\u589e\u52a0\u7f13\u5b58\u5c42\u5b9e\u73b0\u51b7\u70ed\u6570\u636e\u5206\u79bb\uff0c\u63d0\u5347\u8bfb\u6027\u80fd\u3002 https://github.com/OpenAtomFoundation/pika/pull/2171\\n+ Codis-Proxy \u652f\u6301\u52a8\u6001\u4fee\u6539\u914d\u7f6e\u53c2\u6570\uff0c\u65b9\u4fbf\u6211\u4eec\u505a\u53c2\u6570\u8c03\u6574\u3002 https://github.com/OpenAtomFoundation/pika/pull/2110\\n+ \u8865\u5168 Go Test \u6d4b\u8bd5\u7528\u4f8b\u3002 https://github.com/OpenAtomFoundation/pika/pull/2082\\n+ CI \u589e\u52a0 cache \u63d0\u5347\u7f16\u8bd1\u901f\u5ea6\u3002 https://github.com/OpenAtomFoundation/pika/pull/2093\\n+ \u589e\u52a0 redis-copy \u6d41\u91cf\u590d\u5236\u5de5\u5177\u3002 https://github.com/OpenAtomFoundation/pika/pull/2060\\n\\nbugfix\\n\\n+ \u4fee\u590d pika \u5728\u4f7f\u7528 SETRANGE \u547d\u4ee4\u51fa\u73b0 coredump \u7684\u95ee\u9898\u3002 https://github.com/OpenAtomFoundation/pika/pull/2141\\n+ \u4fee\u590d\u56e0\u5220\u9664 Clearreplicationid \u5199\u8fdb binlog \u5bfc\u81f4\u7684\u5168\u91cf\u590d\u5236\u95ee\u9898\u3002 https://github.com/OpenAtomFoundation/pika/pull/2135\\n+ \u4fee\u6539\u9501\u7c92\u5ea6\uff0c\u63d0\u5347 pika \u5199 binlog \u7684\u6027\u80fd\u3002 https://github.com/OpenAtomFoundation/pika/pull/2129\\n+ \u4fee\u590d\u590d\u6742\u6570\u636e\u7c7b\u578b\u6210\u5458\u53d8\u91cf\u53ef\u80fd\u51fa\u73b0\u6570\u636e\u6ea2\u51fa\u3002 https://github.com/OpenAtomFoundation/pika/pull/2106\\n+ \u4fee\u590d decr \u547d\u4ee4\u8fd4\u56de\u503c\u9519\u8bef\u95ee\u9898\u3002 https://github.com/OpenAtomFoundation/pika/pull/2092\\n+ \u4fee\u590d setrange \u548c setbit \u547d\u4ee4\u6ca1\u6709\u4fdd\u7559\u539f key \u7684\u8fc7\u671f\u65f6\u95f4\u7684\u95ee\u9898\u3002 https://github.com/OpenAtomFoundation/pika/pull/2095\\n\\n\u4e0b\u671f\u7248\u672c\u89c4\u5212\\n\\n\u9884\u8ba1\u518d\u8fc7\u4e24\u4e2a\u6708\u5de6\u53f3\uff0c\u6211\u4eec\u4f1a\u5728\u519c\u5386\u65b0\u5e74\u524d\u53d1\u5e03 3.5.3 \u7248\u672c\uff0c\u76f8\u5173\u5173\u952e\u7279\u6027\u6709\uff1a\\n\\n+ Pika \u901a\u8fc7\u5feb\u6162\u547d\u4ee4\u5206\u79bb\u63d0\u5347\u8bfb\u5199\u6027\u80fd\u3002 https://github.com/OpenAtomFoundation/pika/pull/2162\\n+ \u652f\u6301 Redis ACL\uff0c\u5728 Pika \u4e2d\u5f15\u5165\u7528\u6237\u6982\u5ff5\uff0c\u8fdb\u884c\u6743\u9650\u63a7\u5236\u3002 https://github.com/OpenAtomFoundation/pika/pull/2013\\n+ \u652f\u6301 Redis Stream\uff0c\u5b9e\u73b0\u6d88\u606f\u961f\u5217\u3002 https://github.com/OpenAtomFoundation/pika/pull/1955\\n+ \u6dfb\u52a0 Pika \u7279\u6709\u547d\u4ee4 compactrange\uff0c\u5bf9\u6307\u5b9a\u8303\u56f4\u5185\u7684 key \u8fdb\u884c compact \u4ee5\u89e3\u51b3\u5927 key \u5220\u9664\u65f6\u8bfb\u653e\u5927\u7684\u95ee\u9898\u3002 https://github.com/OpenAtomFoundation/pika/pull/2163\\n+ \u652f\u6301 lastsave \u6307\u4ee4\u3002 https://github.com/OpenAtomFoundation/pika/pull/2167\\n\\n\u611f\u8c22\u5927\u5bb6\u5bf9 Pika \u5f00\u6e90\u516c\u4f17\u53f7\u7684\u5173\u6ce8 \uff0cPika 3.5 \u7248\u672c\u91cd\u5927\u7279\u6027\u53ca\u4f7f\u7528\u89c4\u8303\u6211\u4eec\u4f1a\u5728\u7a0d\u540e\u7684\u6587\u7ae0\u4e2d\u8fdb\u884c\u4ecb\u7ecd\uff0c\u6211\u4eec\u4e0b\u671f\u518d\u89c1\uff5e\\n\\n![2023-09-28-Pika-3.5.2-connect](2023-12-03-Pika-3.5.2-connect.png)"},{"id":"Pika-3.5.1","metadata":{"permalink":"/blog/Pika-3.5.1","source":"@site/blog/2023-09-28-Pika-3.5.1.md","title":"What\'s new in Pika v3.5.1","description":"Pika \u793e\u533a\u5f88\u9ad8\u5174\u5ba3\u5e03\uff0c\u6211\u4eec\u4eca\u5929\u53d1\u5e03\u5df2\u7ecf\u8fc7\u6211\u4eec\u751f\u4ea7\u73af\u5883\u9a8c\u8bc1 v3.5.1 \u7248\u672c https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.1 \u3002","date":"2023-09-28T00:00:00.000Z","tags":[],"readingTime":4.385,"hasTruncateMarker":false,"authors":[{"name":"\u4e8e\u96e8","title":"dubbo-go\u5f00\u6e90\u793e\u533a"}],"frontMatter":{"title":"What\'s new in Pika v3.5.1","slug":"Pika-3.5.1","authors":[{"name":"\u4e8e\u96e8","title":"dubbo-go\u5f00\u6e90\u793e\u533a"}],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"What\'s new in Pika v3.5.0","permalink":"/blog/Pika-3.5.0"},"nextItem":{"title":"What\'s new in Pika v3.5.0","permalink":"/blog/Pika-3.5.0"}},"content":"Pika \u793e\u533a\u5f88\u9ad8\u5174\u5ba3\u5e03\uff0c\u6211\u4eec\u4eca\u5929\u53d1\u5e03\u5df2\u7ecf\u8fc7\u6211\u4eec\u751f\u4ea7\u73af\u5883\u9a8c\u8bc1 v3.5.1 \u7248\u672c https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.1 \u3002\\n\\n\u8be5\u7248\u672c\u4e0d\u4ec5\u505a\u4e86\u5f88\u591a\u4f18\u5316\u5de5\u4f5c\uff0c\u8fd8\u5f15\u5165\u4e86\u591a\u9879\u65b0\u529f\u80fd\u3002\u8fd9\u4e9b\u65b0\u529f\u80fd\u5305\u62ec \u52a8\u6001\u5173\u95ed WAL\u3001ReplicationID \u68c0\u6d4b\u662f\u5426\u589e\u91cf\u590d\u5236\u3001\u5728 K8s \u73af\u5883\u4e0a Pika \u670d\u52a1\u7684\u81ea\u52a8\u6ce8\u518c\u4ece\u800c\u5b9e\u73b0\u96c6\u7fa4\u7684\u81ea\u7ec4\u7ec7\u3001\u4ee5\u53ca exporter \u68c0\u6d4b\u96c6\u7fa4\u6307\u6807\u7b49\u7b49\uff0c\u65e0\u7591\u5c06\u4f1a\u8ba9\u7528\u6237\u4eab\u53d7\u5230\u66f4\u4e3a\u7a33\u5b9a\u548c\u9ad8\u6548\u7684 NoSQL \u4f7f\u7528\u4f53\u9a8c\u3002\\n\\n## \u65b0\u7279\u6027\\n\\n+ 1 Slow log \u589e\u52a0\u961f\u5217\u7b49\u5f85\u65f6\u95f4\u7edf\u8ba1\uff0c\u5728\u961f\u5217\u963b\u585e\u7684\u65f6\u5019\u65b9\u4fbf\u6211\u4eec\u8fdb\u884c\u95ee\u9898\u5b9a\u4f4d\u3002PR 1997\uff0c \u4f5c\u8005 wangshao1\u3002\\n+ 2 \u4e3b\u4ece\u590d\u5236\u4f7f\u7528 ReplicationID \u5224\u65ad\u662f\u5426\u8fdb\u884c\u589e\u91cf\u540c\u6b65\uff0c\u89e3\u51b3\u539f\u4e3b\u4ece\u540c\u6b65\u65b9\u5f0f\u5207\u4e3b\u540e\u6574\u4e2a\u6570\u636e\u96c6\u4f1a\u8fdb\u884c\u5168\u91cf\u590d\u5236\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u63d0\u5347 Pika \u6027\u80fd\u3002PR 1951\uff0c \u4f5c\u8005 Mixficsol\u3002\\n+ 3 WAL \u4ee5 \'disablewal\' \u547d\u4ee4\u65b9\u5f0f\u652f\u6301\u52a8\u6001\u5173\u95ed\uff0c\u5728\u5199\u6027\u80fd\u9047\u5230\u74f6\u9888\u7684\u65f6\u5019\uff0c\u53ef\u4ee5\u901a\u8fc7\u547d\u4ee4\u5173\u95ed WAL \u7f13\u89e3\u5199\u6027\u80fd\u4e0b\u964d\u7684\u95ee\u9898\uff0c\u5173\u95ed WAL \u6709\u673a\u5668\u5b95\u673a\u540e\u4e22\u5931\u6570\u636e\u7684\u98ce\u9669\uff0c\u7528\u6237\u9700\u8981\u6839\u636e\u81ea\u5df1\u7684\u4f7f\u7528\u4e60\u60ef\u6743\u8861\u3002PR 2015\uff0c\u4f5c\u8005 Mixficsol\u3002\\n+ 4 flush \u7ebf\u7a0b\u6570\u548c compaction \u7ebf\u7a0b\u6570\u5408\u4e8c\u4e3a\u4e00\uff0c\u5728 Compaction \u6027\u80fd\u74f6\u9888\u65f6\uff0c\u53ef\u4ee5\u52a8\u6001\u8c03\u6574\u7ebf\u7a0b\u6570\uff0c\u7f13\u89e3 Comapction \u635f\u8017 Pika \u6027\u80fd\u7684\u95ee\u9898\u3002PR 2014\uff0c \u4f5c\u8005 Tianpingan\u3002\\n+ 5 \u5347\u7ea7\u4e86 RocksDB \u7248\u672c\u5230 v8.3.3\u3002PR 2000\uff0c \u4f5c\u8005 dingxiaoshuai123\u3002\\n+ 6 \u65b0\u589e\u5468\u671f\u6027\u6253\u5370\u5de5\u4f5c\u961f\u5217\u7684\u957f\u5ea6\u529f\u80fd\uff0c\u5728\u961f\u5217\u963b\u585e\u7684\u65f6\u5019\u53ef\u4ee5\u5feb\u901f\u5b9a\u4f4d\u95ee\u9898\u3002PR 1978\uff0c \u4f5c\u8005 Tianpingan\u3002\\n+ 7 \u65b0\u589e\u5229\u7528\u4e00\u4e2a pika_exporter \u76d1\u6d4b\u6574\u4e2a\u96c6\u7fa4\u7684\u6307\u6807\uff0c\u5b9e\u73b0\u4e00\u4e2a Pika Exporter \u5b9e\u4f8b\u76d1\u63a7\u6574\u4e2a\u96c6\u7fa4\uff0c\u89e3\u51b3\u4e86 3.5.0 \u7248\u672c\u4e00\u4e2a Pika Exporter \u76d1\u6d4b\u4e00\u4e2a Pika \u5b9e\u4f8b\u6d88\u8017\u8d44\u6e90\u7684\u95ee\u9898\u3002PR 1953\uff0c \u4f5c\u8005 chenbt-hz\u3002\\n+ 8 \u5b9e\u73b0\u5728 K8s \u73af\u5883\u4e0a Pika \u670d\u52a1\u7684\u81ea\u52a8\u6ce8\u518c\uff0c\u5728\u542f\u52a8\u65f6\u81ea\u52a8\u6ce8\u518c\uff0c\u4ece\u800c\u5b9e\u73b0\u96c6\u7fa4\u7684\u81ea\u7ec4\u7ec7 \uff0c\u5b9e\u73b0\u4e86\u901a\u8fc7\u547d\u4ee4\u62c9\u8d77\u6574\u4e2a Pika Cluster \u96c6\u7fa4\u3002PR 1931\uff0c \u4f5c\u8005 machinly\u3002\\n\\n## 2 bug \u4fee\u590d\\n\\n+ 1 \u8c03\u6574\u4e86 Rate_limit \u53c2\u6570\uff0c\u4fee\u590d\u4e86\u538b\u6d4b\u65f6\u51fa\u73b0 RPS \u4e3a 0 \u7684\u60c5\u51b5 \u3002PR 2009\uff0c \u4f5c\u8005 Mixficsol\u3002\\n+ 2 \u4fee\u590d\u4e86 INFODATA \u547d\u4ee4\u4e2d\u5bf9\u4e8e\u904d\u5386\u6570\u636e\u6587\u4ef6\u65f6\u51fa\u73b0\u7a7a\u8def\u5f84\u7684\u903b\u8f91\u5224\u65ad\u3002PR 1996\uff0c \u4f5c\u8005 Mixficsol\u3002\\n+ 3 \u4fee\u590d\u4e86 Codis \u5728\u7ebf\u4e0a\u51fa\u73b0\u5927\u6bdb\u523a\u7684\u95ee\u9898\u3002PR 2016\uff0c \u4f5c\u8005 chejinge\u3002\\n+ 4 \u4fee\u590d\u4e86 macOS \u73af\u5883\u4e0b\u7f16\u8bd1\u4f7f\u7528 tools \u5bfc\u81f4\u7f16\u8bd1\u4e0d\u8fc7\u7684\u95ee\u9898 \u3002PR 2011\uff0c \u4f5c\u8005 A2ureStone\u3002\\n+ 5 \u51cf\u5c11\u4e86 exporter \u975e\u5fc5\u8981\u65e5\u5fd7\u7684\u6253\u5370\uff0c\u964d\u4f4e \u4e86\u8d44\u6e90\u5229\u7528\u7387\u3002PR 1945\uff0c \u4f5c\u8005 Mixficsol\u3002\\n\\n## 3 \u4f7f\u7528\u5efa\u8bae\\n\\n\u672c\u6b21\u65b0\u589e\u4e86\u51e0\u4e2a\u914d\u7f6e\u53c2\u6570\uff0c\u5927\u5bb6\u5728\u4f7f\u7528\u8fc7\u7a0b\u4e2d\uff0c\u9700\u8981\u6839\u636e\u4f7f\u7528\u60c5\u51b5\u6309\u9700\u8c03\u6574\uff1a\\n\\n+ 1 max-rsync-parallel-num\uff1a\u4e3b\u4ece\u5168\u91cf\u590d\u5236\u7ebf\u7a0b\u6570\uff0c\u9700\u8981\u6839\u636e\u81ea\u5df1\u673a\u5668 CPU \u6838\u6570\u548c\u90e8\u7f72\u5b9e\u4f8b\u4e2a\u6570\u8fdb\u884c\u8c03\u6574\uff0c\u5efa\u8bae\u6700\u5c0f\u8bbe\u7f6e\u4e3a 2\u3002\\n+ 2 rate-limiter-bandwidth: \u9650\u5236 RocksDB \u6570\u636e\u5e93\u8bfb\u5199\u901f\u5ea6\uff0c\u9650\u5236\u6570\u636e\u5e93\u5728\u4e00\u5b9a\u65f6\u95f4\u5185\u53ef\u4ee5\u8bfb\u5199\u7684\u6570\u636e\u91cf\uff0c\u9ed8\u8ba4 2000MiB/s\uff0c\u9700\u8981\u6839\u636e\u81ea\u5df1\u7684\u673a\u5668\u6027\u80fd\u548c\u90e8\u7f72\u5b9e\u4f8b\u505a\u8c03\u6574\u3002\\n+ max-background-jobs: compaction \u548c flushdb \u7ebf\u7a0b\u6570\uff0c\u8981\u6839\u636e\u81ea\u5df1\u673a\u5668 CPU \u6838\u6570\u548c\u90e8\u7f72\u5b9e\u4f8b\u4e2a\u6570\u8fdb\u884c\u8c03\u6574\uff0c\u5efa\u8bae\u6700\u5c0f\u8bbe\u7f6e\u4e3a 4\u3002\\n+ 3 throttle-bytes-per-second: \u4e3b\u4ece\u590d\u5236\u4f20\u8f93\u9650\u901f\u53c2\u6570\uff0c\u9ed8\u8ba4\u4e3a 200MiB/s\uff0c\u8be5\u53c2\u6570\u53ef\u4ee5\u6839\u636e\u673a\u5668\u7f51\u5361\u7684\u914d\u7f6e\u53ca\u90e8\u7f72 pika \u5b9e\u4f8b\u7684\u4e2a\u6570\u8fdb\u884c\u8c03\u6574\u3002\\n\\n![2023-09-28-Pika-3.5.1-connect.png](2023-09-28-Pika-3.5.1-connect.png)"},{"id":"Pika-3.5.0","metadata":{"permalink":"/blog/Pika-3.5.0","source":"@site/blog/2023-08-25-Pika-3.5.0.md","title":"What\'s new in Pika v3.5.0","description":"\u65f6\u9694\u4e24\u5e74\uff0cPika \u793e\u533a\u6b63\u5f0f\u53d1\u5e03\u7ecf\u7531\u793e\u533a 50 \u591a\u4eba\u53c2\u4e0e\u5f00\u53d1\u5e76\u5728 360 \u751f\u4ea7\u73af\u5883\u9a8c\u8bc1\u53ef\u7528\u7684 v3.5.0 \u7248\u672c\uff0c\u65b0\u7248\u672c\u5728\u63d0\u5347\u6027\u80fd\u7684\u540c\u65f6\uff0c\u4e5f\u652f\u6301\u4e86 Codis \u96c6\u7fa4\u90e8\u7f72\uff0cBlobDB KV \u5206\u79bb\uff0c\u589e\u52a0 Exporter \u7b49\u65b0\u7279\u6027\u3002","date":"2023-08-25T00:00:00.000Z","tags":[],"readingTime":9.825,"hasTruncateMarker":false,"authors":[{"name":"\u4e8e\u96e8","title":"dubbogo\u793a\u571f\u533a"}],"frontMatter":{"title":"What\'s new in Pika v3.5.0","slug":"Pika-3.5.0","authors":[{"name":"\u4e8e\u96e8","title":"dubbogo\u793a\u571f\u533a"}],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"What\'s new in Pika v3.5.1","permalink":"/blog/Pika-3.5.1"},"nextItem":{"title":"Pika Blackwidow \u5f15\u64ce\u6570\u636e\u5b58\u50a8\u683c\u5f0f","permalink":"/blog/pika-blackwidow"}},"content":"\u65f6\u9694\u4e24\u5e74\uff0cPika \u793e\u533a\u6b63\u5f0f\u53d1\u5e03\u7ecf\u7531\u793e\u533a 50 \u591a\u4eba\u53c2\u4e0e\u5f00\u53d1\u5e76\u5728 360 \u751f\u4ea7\u73af\u5883\u9a8c\u8bc1\u53ef\u7528\u7684 v3.5.0 \u7248\u672c\uff0c\u65b0\u7248\u672c\u5728\u63d0\u5347\u6027\u80fd\u7684\u540c\u65f6\uff0c\u4e5f\u652f\u6301\u4e86 Codis \u96c6\u7fa4\u90e8\u7f72\uff0cBlobDB KV \u5206\u79bb\uff0c\u589e\u52a0 Exporter \u7b49\u65b0\u7279\u6027\u3002\\n\\n\u6211\u4eec\u5c06\u8be6\u7ec6\u4ecb\u7ecd\u8be5\u7248\u672c\u5f15\u5165\u7684\u91cd\u8981\u65b0\u7279\u6027\u3002\\n\\n## 1 \u53bb\u9664 Rsync\\n\\n\u5728 v3.5.0 \u7248\u672c\u4e4b\u524d\uff0cPika \u4f7f\u7528 Rsync \u5de5\u5177\u8fdb\u884c\u5f15\u64ce\u4e2d\u5b58\u91cf\u6570\u636e\u7684\u540c\u6b65\uff0cPika \u8fdb\u7a0b\u542f\u52a8\u65f6\u521b\u5efa Rsync \u5b50\u8fdb\u7a0b\u3002\u8fd9\u79cd\u540c\u6b65\u65b9\u5f0f\u5728\u5b9e\u9645\u4f7f\u7528\u4e2d\u51fa\u73b0\u4e86\u4e00\u4e9b\u95ee\u9898\uff0c\u5305\u62ecPika \u8fdb\u7a0b crash \u540e\u91cd\u65b0\u62c9\u8d77\u65e0\u6cd5\u6b63\u5e38\u540c\u6b65\u4ee5\u53ca\u540c\u6b65\u8fc7\u7a0b\u4e2d Rsync \u8fdb\u7a0b\u65e0\u6545\u9000\u51fa\u7b49\u3002\u5728\u4eca\u5e74\u53d1\u5e03\u7684 v3.5.0 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u5728\u5168\u91cf\u540c\u6b65\u65b9\u6848\u65b9\u9762\u8fdb\u884c\u4e86\u91cd\u8981\u7684\u6539\u8fdb\uff0c\u6452\u5f03\u4e86\u4ee5\u5f80\u4f7f\u7528\u7684 Rsync\uff0c\u5b9e\u73b0\u4e86\u5168\u65b0\u7684\u6570\u636e\u540c\u6b65\u65b9\u6848\uff0c\u652f\u6301\u4e86\u65ad\u70b9\u7eed\u4f20\uff0c\u52a8\u6001\u8c03\u8282\u4f20\u8f93\u9650\u901f\u7b49\u7279\u6027\uff0c\u4ee5\u786e\u4fdd\u540c\u6b65\u8fc7\u7a0b\u66f4\u52a0\u7a33\u5b9a\u3001\u53ef\u63a7\u3002\u8fd9\u4e9b\u6539\u8fdb\u4e0d\u4ec5\u589e\u5f3a\u4e86\u540c\u6b65\u7684\u53ef\u9760\u6027\uff0c\u8fd8\u4e3a\u7528\u6237\u63d0\u4f9b\u4e86\u66f4\u597d\u7684\u4f7f\u7528\u4f53\u9a8c\u3002\\n\\n+ \u53bb\u9664 Rsync \u8fdb\u7a0b\uff0c\u4f7f\u7528\u81ea\u7814\u5168\u91cf\u540c\u6b65\u65b9\u5f0f\\n https://github.com/OpenAtomFoundation/pika/pull/1805\\n\\n+ \u5b9e\u73b0\u65ad\u70b9\u7eed\u4f20\uff0c\u4f20\u8f93\u9650\u901f\u529f\u80fd\\n https://github.com/OpenAtomFoundation/pika/pull/1926\\n\\n+ Pika \u4e3b\u4ece\u540c\u6b65\u65f6\uff0c\u8fdb\u884c master run_id \u7684\u68c0\u9a8c\\n https://github.com/OpenAtomFoundation/pika/pull/1805\\n\\n## 2 \u517c\u5bb9\u66f4\u591a Redis \u547d\u4ee4\\n\\n\u5728 v3.5.0 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u8fc8\u51fa\u4e86\u66f4\u5927\u7684\u4e00\u6b65\uff0c\u63d0\u5347\u4e86\u5bf9 Redis \u547d\u4ee4\u7684\u517c\u5bb9\u6027\uff0c\u5bf9 Redis \u547d\u4ee4\u63d0\u4f9b\u4e86\u66f4\u5e7f\u6cdb\u7684\u652f\u6301\u3002\u8fd9\u4e2a\u7248\u672c\u7684\u6539\u8fdb\u4f7f\u5f97 Pika \u5728\u4e0e Redis \u751f\u6001\u7cfb\u7edf\u7684\u96c6\u6210\u4e2d\u8868\u73b0\u66f4\u52a0\u51fa\u8272\uff0c\u4e3a\u7528\u6237\u63d0\u4f9b\u4e86\u66f4\u4e30\u5bcc\u7684\u529f\u80fd\u548c\u66f4\u5e7f\u9614\u7684\u53ef\u80fd\u6027\u3002\u6211\u4eec\u5bf9\u547d\u4ee4\u652f\u6301\u7684\u6269\u5c55\uff0c\u4e3a\u7528\u6237\u63d0\u4f9b\u4e86\u66f4\u591a\u7684\u7075\u6d3b\u6027\uff0c\u4ee5\u6ee1\u8db3\u4e0d\u540c\u573a\u666f\u4e0b\u7684\u9700\u6c42\u3002\\n\\n+ \u652f\u6301 UNLINK \u547d\u4ee4\\n https://github.com/OpenAtomFoundation/pika/pull/1273\\n+ \u652f\u6301 INFO COMMANDSTATS \u547d\u4ee4\\n https://github.com/OpenAtomFoundation/pika/pull/1660\\n+ \u652f\u6301 HELLO\u3001SETNAME \u547d\u4ee4\\n https://github.com/OpenAtomFoundation/pika/pull/1245\\n+ \u652f\u6301 BLPOP\u3001BRPOP \u547d\u4ee4\\n https://github.com/OpenAtomFoundation/pika/pull/1548\\n+ \u65b0\u589e Pika \u539f\u521b DISKRECOVERY \u547d\u4ee4\\n https://github.com/OpenAtomFoundation/pika/pull/1843\\n\\n## 3 RocksDB \u7248\u672c\u5347\u7ea7\u548c\u5206\u7ea7\u538b\u7f29\\n\\n\u5728 v3.5.0 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u8fdb\u884c\u4e86\u4e00\u9879\u91cd\u8981\u7684\u5347\u7ea7\uff0c\u5c06 RocksDB \u5f15\u64ce\u5347\u7ea7\u81f3 v8.1.1 \u7248\u672c\uff0c\u5e76\u5b9e\u73b0\u4e86\u5206\u7ea7\u538b\u7f29\u529f\u80fd\u7684\u6574\u5408\u3002\u8fd9\u4e00\u5347\u7ea7\u4e0d\u4ec5\u662f\u6280\u672f\u7684\u98de\u8dc3\uff0c\u4e5f\u662f\u6211\u4eec\u5bf9\u7cfb\u7edf\u6027\u80fd\u548c\u4f18\u5316\u7684\u6301\u7eed\u5173\u6ce8\u7684\u4f53\u73b0\u3002\u901a\u8fc7\u8fd9\u9879\u5347\u7ea7\uff0c\u6211\u4eec\u4e3a Pika \u589e\u52a0\u4e86\u66f4\u9ad8\u7ea7\u522b\u7684\u6570\u636e\u7ba1\u7406\u80fd\u529b\uff0c\u540c\u65f6\u4e5f\u8ba9\u7cfb\u7edf\u66f4\u597d\u5730\u9002\u5e94\u4e0d\u540c\u7684\u538b\u7f29\u9700\u6c42\uff0c\u4e3a\u7528\u6237\u7684\u6570\u636e\u5b58\u50a8\u548c\u68c0\u7d22\u63d0\u4f9b\u4e86\u66f4\u5927\u7684\u7075\u6d3b\u6027\u548c\u6548\u7387\u3002\\n\\n+ \u5347\u7ea7 RocksDB \u7248\u672c\u5230 v8.1.1\\n https://github.com/OpenAtomFoundation/pika/pull/1396\\n+ \u5b9e\u73b0 RocksDB \u5206\u7ea7\u538b\u7f29\\n https://github.com/OpenAtomFoundation/pika/pull/1365\\n+ \u65b0\u589e RocksDB \u7f13\u5b58\u914d\u7f6e\u9879 num-shard-bits \u80fd\u591f\u4ece\u914d\u7f6e\u6587\u4ef6\u4e2d\u8bfb\u53d6\\n https://github.com/OpenAtomFoundation/pika/pull/1189\\n\\n## 4 \u652f\u6301 BlobDB\\n\\n\u5728 v3.5.0 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u5f15\u5165\u4e86\u5f15\u4eba\u77a9\u76ee\u7684\u521b\u65b0--\u5bf9 BlobDB \u548c KV \u5b58\u50a8\u5c42\u8fdb\u884c\u4e86\u5206\u79bb\uff0c\u4e3a\u6211\u4eec\u7684\u7cfb\u7edf\u6ce8\u5165\u4e86\u65b0\u7684\u6d3b\u529b\u3002\u8fd9\u4e2a\u7248\u672c\u7684\u5347\u7ea7\u4f7f\u5f97 Pika \u5728\u6570\u636e\u5b58\u50a8\u65b9\u9762\u66f4\u52a0\u7075\u6d3b\u548c\u9ad8\u6548\u3002\u6211\u4eec\u901a\u8fc7\u652f\u6301 BlobDB KV \u5206\u79bb\uff0c\u63d0\u4f9b\u4e86\u66f4\u4f18\u5316\u7684\u6570\u636e\u5b58\u50a8\u7ed3\u6784\uff0c\u4e3a\u7528\u6237\u7684\u6570\u636e\u7ba1\u7406\u548c\u67e5\u8be2\u64cd\u4f5c\u5e26\u6765\u4e86\u66f4\u6df1\u5c42\u6b21\u7684\u4f18\u52bf\u3002\u8fd9\u4e00\u91cd\u8981\u6539\u8fdb\u5c06\u5728\u66f4\u591a\u5e94\u7528\u573a\u666f\u4e0b\u5c55\u73b0\u51fa\u5176\u5f3a\u5927\u7684\u6f5c\u529b\u3002\\n\\n+ \u652f\u6301 BlobDB KV \u5206\u79bb\\n https://github.com/OpenAtomFoundation/pika/pull/1456\\n\\n## 5 \u57fa\u4e8e Codis \u7684\u96c6\u7fa4\u6a21\u5f0f\\n\\n\u5728 v3.5.0 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u79ef\u6781\u5f15\u5165\u4e86 Codis \u96c6\u7fa4\u6a21\u5f0f\uff0c\u6b64\u5916\uff0c\u6211\u4eec\u4e0d\u4ec5\u4ec5\u5c06 Codis \u96c6\u7fa4\u6a21\u5f0f\u878d\u5165\u4e86\u7cfb\u7edf\u4e2d\uff0c\u8fd8\u4e3a\u5176\u63d0\u4f9b\u4e86\u8fc1\u79fb slot \u7684\u547d\u4ee4\u652f\u6301\uff0c\u4ece\u800c\u5b9e\u73b0\u4e86\u66f4\u52a0\u667a\u80fd\u5316\u7684\u96c6\u7fa4\u7ba1\u7406\u3002\u8fd9\u4e00\u91cd\u5927\u53d8\u9769\u4e0d\u4ec5\u6269\u5c55\u4e86 Pika \u5728\u5927\u89c4\u6a21\u6570\u636e\u5b58\u50a8\u573a\u666f\u4e2d\u7684\u5e94\u7528\u8303\u56f4\uff0c\u8fd8\u8fdb\u4e00\u6b65\u63d0\u5347\u4e86\u7cfb\u7edf\u7684\u53ef\u6269\u5c55\u6027\u548c\u9ad8\u53ef\u7528\u6027\u3002\u901a\u8fc7\u5f15\u5165 Codis \u96c6\u7fa4\u6a21\u5f0f\uff0c\u6211\u4eec\u5bf9\u7528\u6237\u7684\u6570\u636e\u5904\u7406\u548c\u7ba1\u7406\u63d0\u4f9b\u4e86\u66f4\u4f18\u5316\u7684\u89e3\u51b3\u65b9\u6848\u3002\\n\\n+ \u5f15\u5165 Codis \u5230 Pika\\n\\n https://github.com/OpenAtomFoundation/pika/pull/1279\\n\\n+ \u5f15\u5165 Codis \u7684 CI\\n\\n https://github.com/OpenAtomFoundation/pika/pull/1311\\n\\n+ \u652f\u6301 Codis \u8fc1\u79fb slot \u547d\u4ee4\\n\\n https://github.com/OpenAtomFoundation/pika/pull/1632\\n\\n+ \u65b0\u589e\u662f\u5426\u5728 reload \u7684 slotmigrate \u72b6\u6001\\n\\n https://github.com/OpenAtomFoundation/pika/pull/1700\\n\\n## 6 \u53ef\u89c2\u6d4b\u6027\\n\\n\u5728 v3.5.0 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u5f15\u5165\u4e86\u4e00\u4e2a\u521b\u65b0\u6027\u7684\u5de5\u5177--pika_exporter\uff0c\u4ee5\u63d0\u5347\u5bf9 Pika \u6570\u636e\u5e93\u7684\u53ef\u89c2\u6d4b\u6027\u3002\u8fd9\u4e00\u5de5\u5177\u7684\u52a0\u5165\u4e0d\u4ec5\u662f\u5bf9\u6211\u4eec\u5bf9\u7cfb\u7edf\u76d1\u6d4b\u80fd\u529b\u7684\u6301\u7eed\u589e\u5f3a\u7684\u53cd\u6620\u3002\u800c\u5728\u7248\u672c\u7684\u540e\u7eed\u66f4\u65b0\u4e2d\uff0c\u6211\u4eec\u8fdb\u4e00\u6b65\u5145\u5b9e\u4e86\u6307\u6807\uff0c\u4e0d\u65ad\u4e30\u5bcc\u4e86 Pika \u7684\u53ef\u89c2\u6d4b\u6027\u3002\u4e3a\u7528\u6237\u63d0\u4f9b\u4e86\u66f4\u4e3a\u5168\u9762\u548c\u7cbe\u51c6\u7684\u6570\u636e\u6d1e\u5bdf\u529b\u3002\\n\\n+ \u65b0\u589e Pika \u53ef\u89c2\u6d4b\u7cfb\u7edf pika_exporter\\n\\n https://github.com/OpenAtomFoundation/pika/pull/1388\\n\\n+ \u65b0\u589e\u7f51\u7edc I/O \u6d41\u91cf\u76d1\u63a7\u6307\u6807\\n\\n https://github.com/OpenAtomFoundation/pika/pull/1733\\n\\n+ \u65b0\u589e\u547d\u4ee4\u7edf\u8ba1\u8017\u65f6\u6307\u6807\\n\\n https://github.com/OpenAtomFoundation/pika/pull/1751\\n\\n+ \u65b0\u589e estimate_pending_compaction_bytes \u5ea6\u91cf\u6765\u5206\u6790\u788e\u7247\u7387\u6307\u6807\\n\\n https://github.com/OpenAtomFoundation/pika/pull/1736\\n\\n+ \u65b0\u589e RocksDB \u6307\u6807\\n\\n https://github.com/OpenAtomFoundation/pika/pull/1560\\n\\n## 7 \u5bb9\u5668\u5316\u90e8\u7f72\\n\\n\u5728 v3.5.0 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u5f15\u5165\u4e86\u4e00\u4e2a\u5177\u6709\u521b\u65b0\u610f\u4e49\u7684\u91cc\u7a0b\u7891--pika-operator mvp \u7248\u672c\uff0c\u8fd9\u4e00\u7248\u672c\u5728\u6280\u672f\u4e0a\u5b9e\u73b0\u4e86\u4e00\u4e2a\u91cd\u8981\u76ee\u6807\uff1a\u5c06 Pika \u5355\u5b9e\u4f8b\u670d\u52a1\u8fc1\u79fb\u5230 Kubernetes\uff08K8s\uff09\u5e73\u53f0\u4e0a\u7684\u5feb\u901f\u90e8\u7f72\u3002\u8fd9\u4e0d\u4ec5\u662f\u5bf9\u6211\u4eec\u6301\u7eed\u5173\u6ce8\u884c\u4e1a\u53d1\u5c55\u7684\u4f53\u73b0\uff0c\u4e5f\u662f\u6211\u4eec\u4e0d\u65ad\u63d0\u5347\u7528\u6237\u4f53\u9a8c\u7684\u8ffd\u6c42\u3002\u901a\u8fc7 pika-operator\uff0c\u6211\u4eec\u4e3a\u7528\u6237\u63d0\u4f9b\u4e86\u66f4\u4fbf\u6377\u7684\u90e8\u7f72\u65b9\u6848\uff0c\u5c06 Pika \u7684\u9ad8\u6027\u80fd\u6570\u636e\u5e93\u5f15\u64ce\u4e0e Kubernetes \u7684\u7075\u6d3b\u6027\u76f8\u878d\u5408\uff0c\u4ece\u800c\u4e3a\u7528\u6237\u7684\u5e94\u7528\u73af\u5883\u5e26\u6765\u66f4\u9ad8\u6548\u3001\u66f4\u5f39\u6027\u7684\u652f\u6301\u3002\\n\\n+ \u5b9e\u73b0 Pika \u5355\u4f8b\u670d\u52a1\u5728 K8s \u4e0a\u5feb\u901f\u90e8\u7f72\\n https://github.com/OpenAtomFoundation/pika/pull/1243\\n+ \u5b9e\u73b0\u4e86\u5728 MiniKube \u73af\u5883\u4e2d\u90e8\u7f72 Pika\\n https://github.com/OpenAtomFoundation/pika/pull/1330\\n+ \u7ed9 pika-operator \u6dfb\u52a0 E2E \u6d4b\u8bd5\\n https://github.com/OpenAtomFoundation/pika/pull/1347\\n\\n## 8 \u8de8\u5e73\u53f0\u7f16\u8bd1\\n\\n\u5728 v3.5.0 \u7248\u672c\u4e2d\uff0cPika \u5448\u73b0\u51fa\u4e00\u79cd\u5168\u9762\u6027\u7684\u84ec\u52c3\u53d1\u5c55\u6001\u52bf\uff0c\u5f97\u4ee5\u5728\u4e0d\u540c\u64cd\u4f5c\u7cfb\u7edf\u5e73\u53f0\u4e0a\u5c55\u73b0\u5176\u4f18\u8d8a\u6027\u3002\u6b64\u7248\u672c\u7684\u7a81\u7834\u6027\u4e4b\u5904\u5728\u4e8e\uff0cPika \u5b9e\u73b0\u4e86\u5bf9 MacOS\u3001CentOS \u548c Ubuntu \u8fd9\u4e9b\u4e3b\u8981\u5e73\u53f0\u7684\u5b8c\u6574\u7f16\u8bd1\u548c\u4f7f\u7528\u652f\u6301\u3002\u8fd9\u4e2a\u4e3e\u63aa\u4e0d\u4ec5\u4ec5\u4f53\u73b0\u4e86\u6211\u4eec\u5bf9\u591a\u6837\u5316\u6280\u672f\u73af\u5883\u7684\u5173\u6ce8\uff0c\u4e5f\u662f\u4e3a\u4e86\u6700\u5927\u7a0b\u5ea6\u5730\u62d3\u5c55\u7528\u6237\u57fa\u7840\uff0c\u4e3a\u5e7f\u6cdb\u7684\u7528\u6237\u7fa4\u4f53\u63d0\u4f9b\u7075\u6d3b\u3001\u9ad8\u6548\u7684\u6570\u636e\u5e93\u89e3\u51b3\u65b9\u6848\u3002\u8fd9\u79cd\u8de8\u5e73\u53f0\u517c\u5bb9\u6027\u7684\u52a0\u5f3a\u5c06 Pika \u63a8\u5411\u66f4\u5e7f\u9614\u7684\u6280\u672f\u751f\u6001\u3002\\n\\n+ \u652f\u6301 MacOS \u5e73\u53f0\\n https://github.com/OpenAtomFoundation/pika/pull/1372\\n\\n## 9 \u591a\u5e73\u53f0\u96c6\u6210\u6d4b\u8bd5\u53ca\u5355\u5143\u6d4b\u8bd5\\n\\n\u5728 v3.5.0 \u7248\u672c\u4e2d\uff0c\u6211\u4eec\u8fc8\u51fa\u4e86\u4e00\u4e2a\u4ee4\u4eba\u77a9\u76ee\u7684\u6b65\u4f10\uff0c\u4e0d\u4ec5\u5728\u591a\u4e2a\u4e3b\u8981\u64cd\u4f5c\u7cfb\u7edf\u5e73\u53f0\u4e0a\u5b9e\u73b0\u4e86\u652f\u6301\uff0c\u8fd8\u5728\u6d4b\u8bd5\u9886\u57df\u5b9e\u65bd\u4e86\u5168\u9762\u5347\u7ea7\u3002\u6211\u4eec\u4e3a Ubuntu\u3001CentOS \u548c MacOS \u8fd9\u4e09\u5927\u5e73\u53f0\u642d\u5efa\u4e86\u6301\u7eed\u96c6\u6210\uff08CI\uff09\u73af\u5883\uff0c\u4ee5\u786e\u4fdd\u7cfb\u7edf\u7684\u5b8c\u6574\u6027\u548c\u7a33\u5b9a\u6027\u3002\u5728\u6d4b\u8bd5\u65b9\u9762\uff0c\u6211\u4eec\u5f15\u5165\u4e86\u66f4\u4e3a\u5e7f\u6cdb\u7684\u8986\u76d6\uff0c\u5305\u62ec Go \u8bed\u8a00\u7684\u96c6\u6210\u6d4b\u8bd5\u3001TCL \u7684\u5355\u5143\u6d4b\u8bd5\u4ee5\u53ca Python \u7684\u7aef\u5230\u7aef\uff08E2E\uff09\u6d4b\u8bd5\u3002\u901a\u8fc7\u8fd9\u4e9b\u6d4b\u8bd5\u7b56\u7565\u7684\u5347\u7ea7\uff0c\u6211\u4eec\u5728\u786e\u4fdd\u7cfb\u7edf\u6027\u80fd\u548c\u53ef\u9760\u6027\u65b9\u9762\u8fc8\u51fa\u4e86\u66f4\u5927\u7684\u4e00\u6b65\u3002\\n\\n+ \u65b0\u589e CentOS \u73af\u5883\u4e0b\u7684 CI\\n https://github.com/OpenAtomFoundation/pika/pull/1534\\n+ \u65b0\u589e MacOS \u73af\u5883\u4e0b\u7684 CI\\n https://github.com/OpenAtomFoundation/pika/pull/1769\\n+ \u65b0\u589e E2E \u6d4b\u8bd5\u6846\u67b6\\n https://github.com/OpenAtomFoundation/pika/pull/1347\\n+ \u65b0\u589e\u5728 Github CI Workflow \u4e2d\u6dfb\u52a0 CMake \u7f16\u8bd1\u73af\u5883\\n https://github.com/OpenAtomFoundation/pika/pull/1268\\n+ \u65b0\u589e\u5728 TCL \u811a\u672c\u4e2d populate \u65b9\u6cd5\u6a21\u62df Redis debug populate \u65b9\u6cd5\uff0c\u7528\u4ee5\u586b\u5145\u6d4b\u8bd5\u6570\u636e\\n https://github.com/OpenAtomFoundation/pika/pull/1693\\n+ \u65b0\u589e\u5728 blackwidow \u4e2d\u6dfb\u52a0 CMake \u6587\u4ef6\uff0c\u6dfb\u52a0\u5bf9 blackwidow \u7684\u5355\u5143\u6d4b\u8bd5\\n https://github.com/OpenAtomFoundation/pika/pull/1246\\n+ \u79fb\u690d Redis \u6d4b\u8bd5\u811a\u672c\\n https://github.com/OpenAtomFoundation/pika/pull/1357\\n\\n## 10 Others\\n\\n\u82e5\u60a8\u6709\u4efb\u4f55\u7591\u95ee\uff0c\u8bda\u631a\u6b22\u8fce\u60a8\u626b\u63cf\u5fae\u4fe1\u4e8c\u7ef4\u7801\uff0c\u52a0\u5165\u6211\u4eec\u7684\u4ea4\u6d41\u7fa4\uff0c\u4e0e\u4e00\u4f17\u5fd7\u540c\u9053\u5408\u7684\u6210\u5458\u5c55\u5f00\u6df1\u5165\u7684\u8ba8\u8bba\uff0c\u6211\u4eec\u70ed\u5207\u671f\u5f85\u4e0e\u60a8\u5206\u4eab\u89c1\u89e3\u3001\u4ea4\u6d41\u5fc3\u5f97\uff0c\u4e3a\u5171\u540c\u7684\u6280\u672f\u63a2\u7d22\u548c\u521b\u65b0\u4e4b\u65c5\u6dfb\u7816\u52a0\u74e6\u3002\u5728\u8fd9\u4e2a\u7fa4\u4f53\u4e2d\uff0c\u6211\u4eec\u5c06\u4ee5\u5353\u8d8a\u7684\u667a\u6167\u548c\u4e92\u52a8\u7684\u5408\u4f5c\u7cbe\u795e\uff0c\u6784\u5efa\u51fa\u4e00\u4e2a\u76f8\u4e92\u5b66\u4e60\u3001\u4e0d\u65ad\u8fdb\u6b65\u7684\u6280\u672f\u5171\u540c\u4f53\u3002\\n\\n![2023-08-25-Pika-3.5.0](2023-08-25-Pika-3.5.0-connect.png)"},{"id":"pika-blackwidow","metadata":{"permalink":"/blog/pika-blackwidow","source":"@site/blog/2020-7-16-pika-blackwidow.md","title":"Pika Blackwidow \u5f15\u64ce\u6570\u636e\u5b58\u50a8\u683c\u5f0f","description":"\\bBlackwidow\u672c\u8d28\u4e0a\u662f\u57fa\u4e8erocksdb\u7684\u5c01\u88c5\uff0c\u4f7f\u672c\u8eab\u53ea\u652f\u6301kv\u5b58\u50a8\u7684rocksdb\u80fd\u591f\u652f\u6301\u591a\u79cd\u6570\u636e\u7ed3\u6784, \u76ee\u524dBlackwidow\u652f\u6301\u4e94\u79cd\u6570\u636e\u7ed3\u6784\u7684\u5b58\u50a8\uff1aString\u7ed3\u6784(\u5b9e\u9645\u4e0a\u5c31\u662f\u5b58\u50a8key, value), Hash\u7ed3\u6784\uff0cList\u7ed3\u6784\uff0cSet\u7ed3\u6784\u548cZSet\u7ed3\u6784\uff0c \u56e0\u4e3aRocksdb\u7684\u5b58\u50a8\u65b9\u5f0f\u53ea\u6709kv\u4e00\u79cd\uff0c \u6240\u4ee5\u4e0a\u8ff0\u4e94\u79cd\u6570\u636e\u7ed3\u6784\u6700\u7ec8\u90fd\u8981\u843d\u76d8\u5230Rocksdb\u7684kv\u5b58\u50a8\u65b9\u5f0f\u4e0a\uff0c\u4e0b\u9762\u6211\u4eec\u5c55\u793aBlackwidow\u548crocksdb\u7684\u5173\u7cfb\u5e76\u4e14\u8bf4\u660e\u6211\u4eec\u662f\u5982\u4f55\u7528kv\u6765\u6a21\u62df\u591a\u6570\u636e\u7ed3\u6784\u7684\u3002","date":"2020-07-16T00:00:00.000Z","tags":[],"readingTime":12.29,"hasTruncateMarker":false,"authors":[{"name":"Axlgrep","title":"Pika \u5f00\u6e90\u793e\u533a"}],"frontMatter":{"title":"Pika Blackwidow \u5f15\u64ce\u6570\u636e\u5b58\u50a8\u683c\u5f0f","slug":"pika-blackwidow","authors":[{"name":"Axlgrep","title":"Pika \u5f00\u6e90\u793e\u533a"}],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"What\'s new in Pika v3.5.0","permalink":"/blog/Pika-3.5.0"},"nextItem":{"title":"pika_port \u8fc1\u79fb\u5de5\u5177","permalink":"/blog/Pika-Tools-Port-Bin"}},"content":"\\bBlackwidow\u672c\u8d28\u4e0a\u662f\u57fa\u4e8erocksdb\u7684\u5c01\u88c5\uff0c\u4f7f\u672c\u8eab\u53ea\u652f\u6301kv\u5b58\u50a8\u7684rocksdb\u80fd\u591f\u652f\u6301\u591a\u79cd\u6570\u636e\u7ed3\u6784, \u76ee\u524dBlackwidow\u652f\u6301\u4e94\u79cd\u6570\u636e\u7ed3\u6784\u7684\u5b58\u50a8\uff1aString\u7ed3\u6784(\u5b9e\u9645\u4e0a\u5c31\u662f\u5b58\u50a8key, value), Hash\u7ed3\u6784\uff0cList\u7ed3\u6784\uff0cSet\u7ed3\u6784\u548cZSet\u7ed3\u6784\uff0c \u56e0\u4e3aRocksdb\u7684\u5b58\u50a8\u65b9\u5f0f\u53ea\u6709kv\u4e00\u79cd\uff0c \u6240\u4ee5\u4e0a\u8ff0\u4e94\u79cd\u6570\u636e\u7ed3\u6784\u6700\u7ec8\u90fd\u8981\u843d\u76d8\u5230Rocksdb\u7684kv\u5b58\u50a8\u65b9\u5f0f\u4e0a\uff0c\u4e0b\u9762\u6211\u4eec\u5c55\u793aBlackwidow\u548crocksdb\u7684\u5173\u7cfb\u5e76\u4e14\u8bf4\u660e\u6211\u4eec\u662f\u5982\u4f55\u7528kv\u6765\u6a21\u62df\u591a\u6570\u636e\u7ed3\u6784\u7684\u3002\\n\\n![pika-blackwidow-1](pika-blackwidow-1.png)\\n\\n## 1. String\u7ed3\u6784\u7684\u5b58\u50a8\\nString\u672c\u8d28\u4e0a\u5c31\u662fKey, Value, \u6211\u4eec\u77e5\u9053Rocksdb\u672c\u8eab\u5c31\u662f\u652f\u6301kv\u5b58\u50a8\u7684\uff0c \u6211\u4eec\u4e3a\u4e86\u5b9e\u73b0Redis\u4e2d\u7684expire\u529f\u80fd\uff0c\u6240\u4ee5\u5728value\u540e\u9762\u6dfb\u52a0\u4e864 Bytes\u7528\u4e8e\u5b58\u50a8timestamp, \u4f5c\u4e3a\u6700\u540eRocksdb\u843d\u76d8\u7684kv\u683c\u5f0f\uff0c\u4e0b\u9762\u662f\u5177\u4f53\u7684\u5b9e\u73b0\u65b9\u5f0f:\\n\\n![pika-blackwidow-2](pika-blackwidow-2.png)\\n\\n\u5982\u679c\u6211\u4eec\u6ca1\u6709\u5bf9\u8be5String\u5bf9\u8c61\u8bbe\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u5219timestamp\u5b58\u50a8\u7684\u503c\u5c31\u662f\u9ed8\u8ba4\u503c0\uff0c \u5426\u5219\u5c31\u662f\u8be5\u5bf9\u8c61\u8fc7\u671f\u65f6\u95f4\u7684\u65f6\u95f4\u6233\uff0c \u6bcf\u6b21\u6211\u4eec\u83b7\u53d6\u4e00\u4e2aString\u5bf9\u8c61\u7684\u65f6\u5019\uff0c \u9996\u5148\u4f1a\u89e3\u6790Value\u90e8\u5206\u7684\u540e\u56db\u5b57\u8282\uff0c \u83b7\u53d6\u5230timestamp\u505a\u51fa\u5224\u65ad\u4e4b\u540e\u518d\u8fd4\u56de\u7ed3\u679c\u3002\\n\\n## 2. Hash\u7ed3\u6784\u7684\u5b58\u50a8\\nblackwidow\u4e2d\u7684hash\u8868\u7531\u4e24\u90e8\u5206\u6784\u6210\uff0c\u5143\u6570\u636e(meta_key, meta_value), \u548c\u666e\u901a\u6570\u636e(data_key, data_value), \u5143\u6570\u636e\u4e2d\u5b58\u50a8\u7684\u4e3b\u8981\u662fhash\u8868\u7684\u4e00\u4e9b\u4fe1\u606f\uff0c \u6bd4\u5982\u8bf4\u5f53\u524dhash\u8868\u7684\u57df\u7684\u6570\u91cf\u4ee5\u53ca\u5f53\u524dhash\u8868\u7684\u7248\u672c\u53f7\u548c\u8fc7\u671f\u65f6\u95f4(\u7528\u505a\u79d2\u5220\u529f\u80fd), \u800c\u666e\u901a\u6570\u636e\u4e3b\u8981\u5c31\u662f\u6307\u7684\u540c\u4e00\u4e2ahash\u8868\u4e2d\u4e00\u4e00\u5bf9\u5e94\u7684field\u548cvalue\uff0c\u4f5c\u4e3a\u5177\u4f53\u6700\u540eRocksdb\u843d\u76d8\u7684kv\u683c\u5f0f\uff0c\u4e0b\u9762\u662f\u5177\u4f53\u7684\u5b9e\u73b0\u65b9\u5f0f:\\n1. \u6bcf\u4e2ahash\u8868\u7684meta_key\u548cmeta_value\u7684\u843d\u76d8\u65b9\u5f0f:\\n![pika-blackwidow-3](pika-blackwidow-3.png)\\n\\nmeta_key\u5b9e\u9645\u4e0a\u5c31\u662fhash\u8868\u7684key, \u800cmeta_value\u7531\u4e09\u4e2a\u90e8\u5206\u6784\u6210: 4Bytes\u7684Hash size(\u7528\u4e8e\u5b58\u50a8\u5f53\u524dhash\u8868\u7684\u5927\u5c0f) + 4Bytes\u7684Version(\u7528\u4e8e\u79d2\u5220\u529f\u80fd) + 4Bytes\u7684Timestamp(\u7528\u4e8e\u8bb0\u5f55\u6211\u4eec\u7ed9\u8fd9\u4e2aHash\u8868\u8bbe\u7f6e\u7684\u8d85\u65f6\u65f6\u95f4\u7684\u65f6\u95f4\u6233\uff0c \u9ed8\u8ba4\u4e3a0)\\n\\n2. hash\u8868\u4e2ddata_key\u548cdata_value\u7684\u843d\u76d8\u65b9\u5f0f:\\n![pika-blackwidow-4](pika-blackwidow-4.png)\\n\\ndata_key\u7531\u56db\u4e2a\u90e8\u5206\u6784\u6210: 4Bytes\u7684Key size(\u7528\u4e8e\u8bb0\u5f55\u540e\u9762\u8ffd\u52a0\u7684key\u7684\u957f\u5ea6\uff0c\u4fbf\u4e0e\u89e3\u6790) + key\u7684\u5185\u5bb9 + 4Bytes\u7684Version + Field\u7684\u5185\u5bb9\uff0c \u800cdata_value\u5c31\u662fhash\u8868\u67d0\u4e2afield\u5bf9\u5e94\u7684value\u3002\\n\\n3. \u5982\u679c\u6211\u4eec\u9700\u8981\u67e5\u627e\u4e00\u4e2ahash\u8868\u4e2d\u7684\u67d0\u4e00\u4e2afield\u5bf9\u5e94\u7684value, \u6211\u4eec\u9996\u5148\u4f1a\u83b7\u53d6\u5230meta_value\u89e3\u6790\u51fa\u5176\u4e2d\u7684timestamp\u5224\u65ad\u8fd9\u4e2ahash\u8868\u662f\u5426\u8fc7\u671f\uff0c \u5982\u679c\u6ca1\u6709\u8fc7\u671f\uff0c \u6211\u4eec\u53ef\u4ee5\u62ff\u5230\u5176\u4e2d\u7684version, \u7136\u540e\u6211\u4eec\u4f7f\u7528key, version\uff0c\u548cfield\u62fc\u51fadata_key, \u8fdb\u800c\u627e\u5230\u5bf9\u5e94\u7684data_value\uff08\u5982\u679c\u5b58\u5728\u7684\u8bdd)\\n\\n## 3. List\u7ed3\u6784\u7684\u5b58\u50a8\\nblackwidow\u4e2d\u7684list\u7531\u4e24\u90e8\u5206\u6784\u6210\uff0c\u5143\u6570\u636e(meta_key, meta_value), \u548c\u666e\u901a\u6570\u636e(data_key, data_value), \u5143\u6570\u636e\u4e2d\u5b58\u50a8\u7684\u4e3b\u8981\u662flist\u94fe\u8868\u7684\u4e00\u4e9b\u4fe1\u606f\uff0c \u6bd4\u5982\u8bf4\u5f53\u524dlist\u94fe\u8868\u7ed3\u70b9\u7684\u7684\u6570\u91cf\u4ee5\u53ca\u5f53\u524dlist\u94fe\u8868\u7684\u7248\u672c\u53f7\u548c\u8fc7\u671f\u65f6\u95f4(\u7528\u505a\u79d2\u5220\u529f\u80fd), \u8fd8\u6709\u5f53\u524dlist\u94fe\u8868\u7684\u5de6\u53f3\u8fb9\u754c(\u7531\u4e8enemo\u5b9e\u73b0\u7684\u94fe\u8868\u7ed3\u6784\u88ab\u5410\u69fdlrange\u6548\u7387\u4f4e\u4e0b\uff0c\u6240\u4ee5\u8fd9\u6b21blackwidow\u6211\u4eec\u5e95\u5c42\u7528\u6570\u7ec4\u6765\u6a21\u62df\u94fe\u8868\uff0c\u8fd9\u6837lrange\u901f\u5ea6\u4f1a\u5927\u5927\u63d0\u5347\uff0c\u56e0\u4e3a\u7ed3\u70b9\u5b58\u50a8\u90fd\u662f\u6709\u5e8f\u7684), \u666e\u901a\u6570\u636e\u5b9e\u9645\u4e0a\u5c31\u662f\u6307\u7684list\u4e2d\u6bcf\u4e00\u4e2a\u7ed3\u70b9\u4e2d\u7684\u6570\u636e\uff0c\u4f5c\u4e3a\u5177\u4f53\u6700\u540eRocksdb\u843d\u76d8\u7684kv\u683c\u5f0f\uff0c\u4e0b\u9762\u662f\u5177\u4f53\u7684\u5b9e\u73b0\u65b9\u5f0f\\n1. \u6bcf\u4e2alist\u94fe\u8868\u7684meta_key\u548cmeta_value\u7684\u843d\u76d8\u65b9\u5f0f:\\n![pika-blackwidow-5](pika-blackwidow-5.png)\\n\\nmeta_key\u5b9e\u9645\u4e0a\u5c31\u662flist\u94fe\u8868\u7684key, \u800cmeta_value\u7531\u4e94\u4e2a\u90e8\u5206\u6784\u6210: 8Bytes\u7684List size(\u7528\u4e8e\u5b58\u50a8\u5f53\u524d\u94fe\u8868\u4e2d\u603b\u5171\u6709\u591a\u5c11\u4e2a\u7ed3\u70b9) + 4Bytes\u7684Version(\u7528\u4e8e\u79d2\u5220\u529f\u80fd) + 4Bytes\u7684Timestamp(\u7528\u4e8e\u8bb0\u5f55\u6211\u4eec\u7ed9\u8fd9\u4e2aList\u94fe\u8868\u8bbe\u7f6e\u7684\u8d85\u65f6\u65f6\u95f4\u7684\u65f6\u95f4\u6233\uff0c \u9ed8\u8ba4\u4e3a0) + 8Bytes\u7684Left Index\uff08\u6570\u7ec4\u7684\u5de6\u8fb9\u754c) + 8Bytes\u7684Right Index(\u6570\u7ec4\u7684\u53f3\u8fb9\u754c)\\n\\n2. list\u94fe\u8868\u4e2ddata_key\u548cdata_value\u7684\u843d\u76d8\u65b9\u5f0f:\\n![pika-blackwidow-6](pika-blackwidow-6.png)\\n\\ndata_key\u7531\u56db\u4e2a\u90e8\u5206\u6784\u6210: 4Bytes\u7684Key size(\u7528\u4e8e\u8bb0\u5f55\u540e\u9762\u8ffd\u52a0\u7684key\u7684\u957f\u5ea6\uff0c\u4fbf\u4e0e\u89e3\u6790) + key\u7684\u5185\u5bb9 + 4Bytes\u7684Version + 8Bytes\u7684Index(\u8fd9\u4e2a\u8bb0\u5f55\u7684\u5c31\u662f\u5f53\u524d\u7ed3\u70b9\u7684\u5728\u8fd9\u4e2alist\u94fe\u8868\u4e2d\u7684\u7d22\u5f15)\uff0c \u800cdata_value\u5c31\u662flist\u94fe\u8868\u8be5node\u4e2d\u5b58\u50a8\u7684\u503c\\n\\n## 4. Set\u7ed3\u6784\u7684\u5b58\u50a8\\nblackwidow\u4e2d\u7684set\u7531\u4e24\u90e8\u5206\u6784\u6210\uff0c\u5143\u6570\u636e(meta_key, meta_value), \u548c\u666e\u901a\u6570\u636e(data_key, data_value), \u5143\u6570\u636e\u4e2d\u5b58\u50a8\u7684\u4e3b\u8981\u662fset\u96c6\u5408\u7684\u4e00\u4e9b\u4fe1\u606f\uff0c \u6bd4\u5982\u8bf4\u5f53\u524dset\u96c6\u5408member\u7684\u6570\u91cf\u4ee5\u53ca\u5f53\u524dset\u96c6\u5408\u7684\u7248\u672c\u53f7\u548c\u8fc7\u671f\u65f6\u95f4(\u7528\u505a\u79d2\u5220\u529f\u80fd), \u666e\u901a\u6570\u636e\u5b9e\u9645\u4e0a\u5c31\u662f\u6307\u7684set\u96c6\u5408\u4e2d\u7684member\uff0c\u4f5c\u4e3a\u5177\u4f53\u6700\u540eRocksdb\u843d\u76d8\u7684kv\u683c\u5f0f\uff0c\u4e0b\u9762\u662f\u5177\u4f53\u7684\u5b9e\u73b0\u65b9\u5f0f\uff1a\\n1. \u6bcf\u4e2aset\u96c6\u5408\u7684meta_key\u548cmeta_value\u7684\u843d\u76d8\u65b9\u5f0f:\\n![pika-blackwidow-7](pika-blackwidow-7.png)\\n\\nmeta_key\u5b9e\u9645\u4e0a\u5c31\u662fset\u96c6\u5408\u7684key, \u800cmeta_value\u7531\u4e09\u4e2a\u90e8\u5206\u6784\u6210: 4Bytes\u7684Set size(\u7528\u4e8e\u5b58\u50a8\u5f53\u524dSet\u96c6\u5408\u7684\u5927\u5c0f) + 4Bytes\u7684Version(\u7528\u4e8e\u79d2\u5220\u529f\u80fd) + 4Bytes\u7684Timestamp(\u7528\u4e8e\u8bb0\u5f55\u6211\u4eec\u7ed9\u8fd9\u4e2aset\u96c6\u5408\u8bbe\u7f6e\u7684\u8d85\u65f6\u65f6\u95f4\u7684\u65f6\u95f4\u6233\uff0c \u9ed8\u8ba4\u4e3a0)\\n\\n2. set\u96c6\u5408\u4e2ddata_key\u548cdata_value\u7684\u843d\u76d8\u65b9\u5f0f:\\n![pika-blackwidow-8](pika-blackwidow-8.png)\\n\\ndata_key\u7531\u56db\u4e2a\u90e8\u5206\u6784\u6210: 4Bytes\u7684Key size(\u7528\u4e8e\u8bb0\u5f55\u540e\u9762\u8ffd\u52a0\u7684key\u7684\u957f\u5ea6\uff0c\u4fbf\u4e0e\u89e3\u6790) + key\u7684\u5185\u5bb9 + 4Bytes\u7684Version + member\u7684\u5185\u5bb9\uff0c \u7531\u4e8eset\u96c6\u5408\u53ea\u9700\u8981\u5b58\u50a8member, \u6240\u4ee5data_value\u5b9e\u9645\u4e0a\u5c31\u662f\u7a7a\u4e32\\n\\n## 5. ZSet\u7ed3\u6784\u7684\u5b58\u50a8\\nblackwidow\u4e2d\u7684zset\u7531\u4e24\u90e8\u90e8\u5206\u6784\u6210\uff0c\u5143\u6570\u636e(meta_key, meta_value), \u548c\u666e\u901a\u6570\u636e(data_key, data_value), \u5143\u6570\u636e\u4e2d\u5b58\u50a8\u7684\u4e3b\u8981\u662fzset\u96c6\u5408\u7684\u4e00\u4e9b\u4fe1\u606f\uff0c \u6bd4\u5982\u8bf4\u5f53\u524dzset\u96c6\u5408member\u7684\u6570\u91cf\u4ee5\u53ca\u5f53\u524dzset\u96c6\u5408\u7684\u7248\u672c\u53f7\u548c\u8fc7\u671f\u65f6\u95f4(\u7528\u505a\u79d2\u5220\u529f\u80fd), \u800c\u666e\u901a\u6570\u636e\u5c31\u662f\u6307\u7684zset\u4e2d\u6bcf\u4e2amember\u4ee5\u53ca\u5bf9\u5e94\u7684score, \u7531\u4e8ezset\u8fd9\u79cd\u6570\u636e\u7ed3\u6784\u6bd4\u8f83\u7279\u6b8a\uff0c\u9700\u8981\u6309\u7167memer\u8fdb\u884c\u6392\u5e8f\uff0c\u4e5f\u9700\u8981\u6309\u7167score\u8fdb\u884c\u6392\u5e8f\uff0c \u6240\u4ee5\u6211\u4eec\u5bf9\u4e8e\u6bcf\u4e00\u4e2azset\u6211\u4eec\u4f1a\u6309\u7167\u4e0d\u540c\u7684\u683c\u5f0f\u5b58\u50a8\u4e24\u4efd\u666e\u901a\u6570\u636e, \u5728\u8fd9\u91cc\u6211\u4eec\u79f0\u4e3amember to score\u548cscore to member\uff0c\u4f5c\u4e3a\u5177\u4f53\u6700\u540eRocksdb\u843d\u76d8\u7684kv\u683c\u5f0f\uff0c\u4e0b\u9762\u662f\u5177\u4f53\u7684\u5b9e\u73b0\u65b9\u5f0f\uff1a\\n1. \u6bcf\u4e2azset\u96c6\u5408\u7684meta_key\u548cmeta_value\u7684\u843d\u76d8\u65b9\u5f0f:\\n![](https://i.imgur.com/RhZ8KMw.png)\\n\\nmeta_key\u5b9e\u9645\u4e0a\u5c31\u662fzset\u96c6\u5408\u7684key, \u800cmeta_value\u7531\u4e09\u4e2a\u90e8\u5206\u6784\u6210: 4Bytes\u7684ZSet size(\u7528\u4e8e\u5b58\u50a8\u5f53\u524dzSet\u96c6\u5408\u7684\u5927\u5c0f) + 4Bytes\u7684Version(\u7528\u4e8e\u79d2\u5220\u529f\u80fd) + 4Bytes\u7684Timestamp(\u7528\u4e8e\u8bb0\u5f55\u6211\u4eec\u7ed9\u8fd9\u4e2aZset\u96c6\u5408\u8bbe\u7f6e\u7684\u8d85\u65f6\u65f6\u95f4\u7684\u65f6\u95f4\u6233\uff0c \u9ed8\u8ba4\u4e3a0)\\n\\n2. \u6bcf\u4e2azset\u96c6\u5408\u7684data_key\u548cdata_value\u7684\u843d\u76d8\u65b9\u5f0f(member to score):\\n![](https://i.imgur.com/C85Ba5Z.png)\\n\\nmember to socre\u7684data_key\u7531\u56db\u4e2a\u90e8\u5206\u6784\u6210\uff1a4Bytes\u7684Key size(\u7528\u4e8e\u8bb0\u5f55\u540e\u9762\u8ffd\u52a0\u7684key\u7684\u957f\u5ea6\uff0c\u4fbf\u4e0e\u89e3\u6790) + key\u7684\u5185\u5bb9 + 4Bytes\u7684Version + member\u7684\u5185\u5bb9\uff0c data_value\u4e2d\u5b58\u50a8\u7684\u5176member\u5bf9\u5e94\u7684score\u7684\u503c\uff0c\u5927\u5c0f\u4e3a8\u4e2a\u5b57\u8282\uff0c\u7531\u4e8erocksdb\u9ed8\u8ba4\u662f\u6309\u7167\u5b57\u5178\u5e8f\u8fdb\u884c\u6392\u5217\u7684\uff0c\u6240\u4ee5\u540c\u4e00\u4e2azset\u4e2d\u4e0d\u540c\u7684member\u5c31\u662f\u6309\u7167member\u7684\u5b57\u5178\u5e8f\u6765\u6392\u5217\u7684(\u540c\u4e00\u4e2azset\u7684key size, key, \u4ee5\u53caversion\uff0c\u4e5f\u5c31\u662f\u524d\u7f00\u90fd\u662f\u4e00\u81f4\u7684\uff0c\u4e0d\u540c\u7684\u53ea\u6709\u672b\u7aef\u7684member).\\n\\n3. \u6bcf\u4e2azset\u96c6\u5408\u7684data_key\u548cdata_value\u7684\u843d\u76d8\u65b9\u5f0f(score to member):\\n![](https://i.imgur.com/QV9XHEk.png)\\n\\nscore to member\u7684data_key\u7531\u4e94\u4e2a\u90e8\u5206\u6784\u6210\uff1a4Bytes\u7684Key size(\u7528\u4e8e\u8bb0\u5f55\u540e\u9762\u8ffd\u52a0\u7684key\u7684\u957f\u5ea6\uff0c\u4fbf\u4e0e\u89e3\u6790) + key\u7684\u5185\u5bb9 + 4Bytes\u7684Version + 8Bytes\u7684Score + member\u7684\u5185\u5bb9\uff0c \u7531\u4e8escore\u548cmember\u90fd\u5df2\u7ecf\u653e\u5728data_key\u4e2d\u8fdb\u884c\u5b58\u50a8\u4e86\u6240\u4ee5data_value\u5c31\u662f\u4e00\u4e2a\u7a7a\u4e32\uff0c\u65e0\u9700\u5b58\u50a8\u5176\u4ed6\u5185\u5bb9\u4e86\uff0c\u5bf9\u4e8escore to member\u4e2d\u7684data_key\u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u4e86rocksdb\u7684comparator\uff0c\u540c\u4e00\u4e2azset\u4e2dscore to member\u7684data_key\u4f1a\u9996\u5148\u6309\u7167score\u6765\u6392\u5e8f\uff0c \u5728score\u76f8\u540c\u7684\u60c5\u51b5\u4e0b\u518d\u6309\u7167member\u6765\u6392\u5e8f\\n\\n\\n## Blackwidow\u76f8\u5bf9\u4e8eNemo\u6709\u54ea\u4e9b\u4f18\u52bf\\n\\n1. Blackwidow\u91c7\u7528\u4e86rocksdb\u7684column families\u7684\u65b0\u7279\u6027\uff0c\u5c06\u5143\u6570\u636e\u548c\u5b9e\u9645\u6570\u636e\u5206\u5f00\u5b58\u653e(\u5bf9\u5e94\u4e8e\u4e0a\u9762\u7684meta\u6570\u636e\u548cdata\u6570\u636e), \u8fd9\u79cd\u5b58\u50a8\u65b9\u5f0f\u76f8\u5bf9\u4e8eNemo\u5c06meta, data\u6df7\u5728\u4e00\u8d77\u5b58\u653e\u66f4\u52a0\u5408\u7406\uff0c \u5e76\u4e14\u53ef\u4ee5\u63d0\u5347\u67e5\u627e\u6548\u7387(\u6bd4\u5982info keyspace\u7684\u6548\u7387\u4f1a\u5927\u5927\u63d0\u5347)\\n2. Blackwidow\u4e2d\u53c2\u6570\u4f20\u9012\u5927\u91cf\u91c7\u7528Slice\u800cNemo\u4e2d\u91c7\u7528\u7684\u662fstd::string, \u6240\u4ee5Nemo\u4f1a\u6709\u5f88\u591a\u6ca1\u6709\u5fc5\u8981\u7684string\u5bf9\u8c61\u7684\u6784\u9020\u51fd\u6570\u4ee5\u53ca\u6790\u6784\u51fd\u6570\u7684\u8c03\u7528\uff0c\u9020\u6210\u989d\u5916\u7684\u8d44\u6e90\u6d88\u8017\uff0c\u800cBlackwidow\u5219\u4e0d\u4f1a\u6709\u8fd9\u4e2a\u95ee\u9898\\n3. Blackwidow\u5bf9kv\u6a21\u62df\u591a\u6570\u636e\u7ed3\u6784\u7684\u5b58\u50a8\u683c\u5f0f\u4e0a\u505a\u4e86\u91cd\u65b0\u8bbe\u8ba1(\u5177\u4f53\u53ef\u4ee5\u53c2\u8003Nemo\u5f15\u64ce\u6570\u636e\u5b58\u50a8\u683c\u5f0f\u548c\u672c\u7bc7\u6587\u7ae0)\uff0c\u4f7f\u4e4b\u524d\u5728Nemo\u4e0a\u51fa\u73b0\u7684\u4e00\u4e9b\u65e0\u6cd5\u89e3\u51b3\u7684\u6027\u80fd\u95ee\u9898\u5f97\u4ee5\u89e3\u51b3\uff0c\u6240\u4ee5Blackwidow\u7684\u591a\u6570\u636e\u7ed3\u6784\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u6027\u80fd\u8fdc\u8fdc\u4f18\u4e8eNemo\\n4. \u539f\u6765Nemo\u5bf9\u591a\u6570\u636e\u7ed3\u6784\u7684Key\u7684\u957f\u5ea6\u6700\u5927\u53ea\u80fd\u652f\u6301\u5230256 Bytes\uff0c\u800cBlackwidow\u7ecf\u8fc7\u91cd\u65b0\u8bbe\u8ba1\uff0c\u653e\u5f00\u4e86\u591a\u6570\u636e\u7ed3\u6784Key\u957f\u5ea6\u7684\u8fd9\u4e2a\u9650\u5236\\n5. Blackwidow\u76f8\u5bf9\u4e8eNemo\u66f4\u52a0\u8282\u7701\u7a7a\u95f4\uff0cNemo\u7531\u4e8e\u9700\u8981nemo-rocksdb\u7684\u652f\u6301\uff0c\u6240\u4ee5\u4e0d\u7ba1\u5728meta\u8fd8\u662fdata\u6570\u636e\u90e8\u5206\u90fd\u8ffd\u52a0\u4e86version\u548ctimestamp\u8fd9\u4e9b\u4fe1\u606f\uff0c\u5e76\u4e14\u4e3a\u4e86\u533a\u5206meta_key\u548cdata_key, \u5728\u6700\u524d\u9762\u52a0\u5165s\u548cS(\u62ffSet\u6570\u636e\u7ed3\u6784\u6253\u6bd4\u65b9)\uff0cBlackwidow\u5728\u8fd9\u65b9\u9762\u505a\u4e86\u4f18\u5316\uff0c\u4f7f\u540c\u6837\u7684\u6570\u636e\u91cf\u4e0bBlackwidow\u6240\u5360\u7528\u7684\u7a7a\u95f4\u6bd4Nemo\u8981\u5c0f(\u4e3e\u4e2a\u4f8b\u5b50\uff0cBlackwidow\u4e2dList\u7ed3\u6784\u4e2d\u7684\u4e00\u4e2aNode\u5c31\u6bd4Nemo\u4e2d\u7684\u4e00\u4e2aNode\u8282\u7701\u4e8616 Bytes\u7684\u7a7a\u95f4)\\n6. Blackwidow\u5728\u9501\u7684\u5b9e\u73b0\u4e0a\u53c2\u7167\u4e86RocksDB\u4e8b\u52a1\u91cc\u9501\u7684\u5b9e\u73b0\u65b9\u6cd5\uff0c\u800c\u5f03\u7528\u4e86\u4e4b\u524dNemo\u7684\u884c\u9501\uff0c\u6240\u4ee5\u5728\u591a\u7ebf\u7a0b\u5bf9\u540c\u4e00\u628a\u9501\u6709\u62a2\u5360\u7684\u60c5\u51b5\u4e0b\u6027\u80fd\u4f1a\u6709\u6240\u63d0\u5347"},{"id":"Pika-Tools-Port-Bin","metadata":{"permalink":"/blog/Pika-Tools-Port-Bin","source":"@site/blog/2020-04-26-Pika-Tools-Port-Bin.md","title":"pika_port \u8fc1\u79fb\u5de5\u5177","description":"\u9879\u76ee\u4f5c\u8005\uff1a","date":"2020-04-26T00:00:00.000Z","tags":[],"readingTime":2.56,"hasTruncateMarker":false,"authors":[{"name":"\u4e8e\u96e8","title":"Pika \u5f00\u6e90\u793e\u533a"}],"frontMatter":{"title":"pika_port \u8fc1\u79fb\u5de5\u5177","slug":"Pika-Tools-Port-Bin","authors":[{"name":"\u4e8e\u96e8","title":"Pika \u5f00\u6e90\u793e\u533a"}],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"Pika Blackwidow \u5f15\u64ce\u6570\u636e\u5b58\u50a8\u683c\u5f0f","permalink":"/blog/pika-blackwidow"}},"content":"## \u9879\u76ee\u4f5c\u8005\uff1a\\n[AlexStocks](https://github.com/alexstocks)\\n\\n## \u9002\u7528\u7248\u672c\uff1a\\n3.1 \u548c 2.x\\n\\n## \u9879\u76ee\u5730\u5740\uff1a\\n[https://github.com/ipixiu/pika-tools](https://github.com/ipixiu/pika-tools)\\n\\n[https://github.com/Axlgrep/pika-tools \u957f\u671f\u7ef4\u62a4\u5730\u5740\u9700\u81ea\u884c\u7f16\u8bd1](https://github.com/Axlgrep/pika-tools)\\n\\n## \u4e8c\u8fdb\u5236\u5305\uff1a\\n[https://github.com/ipixiu/pika-port-bin](https://github.com/ipixiu/pika-port-bin)\\n\\n## \u529f\u80fd\uff1a\\n\u5c06Pika\u4e2d\u7684\u6570\u636e\u5728\u7ebf\u8fc1\u79fb\u5230Pika\u3001Redis\uff08\u652f\u6301\u5168\u91cf\u3001\u589e\u91cf\u540c\u6b65\uff09\\n\\n## \u5f00\u53d1\u80cc\u666f\uff1a\\n\u4e4b\u524dPika\u9879\u76ee\u5b98\u65b9\u63d0\u4f9b\u7684pika_to_redis\u5de5\u5177\u4ec5\u652f\u6301\u79bb\u7ebf\u5c06Pika\u7684DB\u4e2d\u7684\u6570\u636e\u8fc1\u79fb\u5230Pika\u3001Redis, \u4e14\u65e0\u6cd5\u589e\u91cf\u540c\u6b65\uff0c\u8be5\u5de5\u5177\u53ef\u4ee5\u76f4\u63a5\u4f2a\u88c5\u4e3a\u4e00\u4e2aPika\u7684\u4ece\u5e93\uff0c\u5c06\u4e3b\u5e93\u6570\u636e\u901a\u8fc7\u540c\u6b65\u83b7\u53d6\u5e76\u8f6c\u53d1\u7ed9Pika\u3001Redis\uff0c\u540c\u65f6\u5e76\u652f\u6301\u589e\u91cf\u540c\u6b65\\n\\n\\n## \u5b9e\u73b0\uff1a\\n### trysync\u7ebf\u7a0b\\n1. \u5c1d\u8bd5\u4e0e\u4e3b\u5e93\u5efa\u7acb\u540c\u6b65\u5173\u7cfb \\n2. \u5982\u679c\u9700\u8981\u5168\u540c\u6b65\uff0c\u5219\u5728\u63a5\u6536\u5230master\u7684db\u4e4b\u540e\uff0c\u542f\u52a8migrator\u548csender\u7ebf\u7a0b\u5c06db\u91cc\u9762\u7684\u6570\u636e\u53d1\u9001\u7ed9Pika\u3001Redis \\n3. \u542f\u52a8Slaveping\u7ebf\u7a0b\u5b9a\u671f\u7ed9\u4e3b\u5e93\u53d1\u9001\u5fc3\u8df3\uff0c\u5b8c\u6210\u5efa\u7acb\u4e3b\u4ece\u5173\u7cfb\\n\\n### binlog_receiver\u7ebf\u7a0b\\n1. \u63a5\u6536\u4e3b\u5e93\u53d1\u9001\u8fc7\u6765\u7684binlog\u5e76\u4e14\u5c06\u5176\u89e3\u6790\u6210redis\u547d\u4ee4\\n2. \u5c06redis\u547d\u4ee4\u8f6c\u53d1\u7ed9Pika\u3001Redis\\n\\n### migrator\u7ebf\u7a0b\\n1. \u626b\u63cf\u4e0d\u540c\u6570\u636e\u7c7b\u578b\u7684\u5206\u5e93\\n2. \u5c06key\u8fdb\u884c\u89e3\u6790\u6210\u54cd\u5e94\u6570\u636ePika\u3001redis\u6307\u4ee4\\n3. \u5c06\u89e3\u6790\u597d\u7684redis\u6307\u4ee4\u52a0\u8f7d\u5230sender\u7684\u53d1\u9001buf\u4e2d\\n\\n### sender\u7ebf\u7a0b\\n1. \u4ece\u53d1\u9001buf\u4e2d\u8bfb\u53d6\u6570\u636e\uff0c\u4ee5\u975e\u963b\u585e\u65b9\u5f0f\u5411Pika\u3001redis\u53d1\u9001\u6570\u636e\\n2. \u63a5\u6536Pika\u3001redis\u8fd4\u56de\u7684\u7ed3\u679c\u5e76\u89e3\u6790\uff0c\u5982\u679c\u51fa\u73b0\u9519\u8bef\u5219\u663e\u793a\u9519\u8bef\u7ed3\u679c\\n\\n## \u4f7f\u7528\u5e2e\u52a9\uff1a\\n```\\nUsage: \\n pika_port [-h] [-t local_ip -p local_port -i master_ip -o master_port\\n -m forward_ip -n forward_port -x forward_thread_num -y forward_passwd]\\n -f filenum -s offset -w password -r rsync_dump_path -l log_path\\n -h -- show this help\\n -t -- local host ip(OPTIONAL default: 127.0.0.1)\\n -p -- local port(OPTIONAL)\\n -i -- master ip(OPTIONAL default: 127.0.0.1)\\n -o -- master port(REQUIRED)\\n -m -- forward ip(OPTIONAL default: 127.0.0.1)\\n -n -- forward port(REQUIRED)\\n -x -- forward thread num(OPTIONAL default: 1)\\n -y -- forward password(OPTIONAL)\\n -f -- binlog filenum(OPTIONAL default: local offset)\\n -s -- binlog offset(OPTIONAL default: local offset)\\n -w -- password for master(OPTIONAL)\\n -r -- rsync dump data path(OPTIONAL default: ./rsync_dump)\\n -l -- local log path(OPTIONAL default: ./log)\\n -b -- max batch number when port rsync dump data (OPTIONAL default: 512)\\n -d -- daemonize(OPTIONAL)\\n example: ./pika_port -t 127.0.0.1 -p 12345 -i 127.0.0.1 -o 9221 -m 127.0.0.1 -n 6379 -x 7 -f 0 -s 0 -w abc -l ./log -r ./rsync_dump -b 512 -d\\n```"}]}}')}}]); \ No newline at end of file diff --git a/build/assets/js/fac0ae3c.a652baa1.js b/build/assets/js/fac0ae3c.a652baa1.js new file mode 100644 index 0000000..3a2695a --- /dev/null +++ b/build/assets/js/fac0ae3c.a652baa1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[1173],{7835:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>c,contentTitle:()=>s,default:()=>l,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var i=n(4848),o=n(8453);const r={title:"\u7f16\u7801\u89c4\u8303",sidebar_position:60},s=void 0,a={id:"\u5f00\u53d1\u6587\u6863/index",title:"\u7f16\u7801\u89c4\u8303",description:"",source:"@site/docs/\u5f00\u53d1\u6587\u6863/index.md",sourceDirName:"\u5f00\u53d1\u6587\u6863",slug:"/\u5f00\u53d1\u6587\u6863/",permalink:"/docs/\u5f00\u53d1\u6587\u6863/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u5f00\u53d1\u6587\u6863/index.md",tags:[],version:"current",sidebarPosition:60,frontMatter:{title:"\u7f16\u7801\u89c4\u8303",sidebar_position:60},sidebar:"tutorialSidebar",previous:{title:"Pika \u4e3b\u4ece\u540c\u6bd4",permalink:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u4e3b\u4ece\u540c\u6b65/"},next:{title:"\u7f16\u7801\u89c4\u8303",permalink:"/docs/\u5f00\u53d1\u6587\u6863/\u7f16\u7801\u89c4\u8303/"}},c={},d=[];function u(t){return(0,i.jsx)(i.Fragment,{})}function l(t={}){const{wrapper:e}={...(0,o.R)(),...t.components};return e?(0,i.jsx)(e,{...t,children:(0,i.jsx)(u,{...t})}):u()}},8453:(t,e,n)=>{n.d(e,{R:()=>s,x:()=>a});var i=n(6540);const o={},r=i.createContext(o);function s(t){const e=i.useContext(r);return i.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function a(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(o):t.components||o:s(t.components),i.createElement(r.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/fdbae498.94d380c6.js b/build/assets/js/fdbae498.94d380c6.js new file mode 100644 index 0000000..8b503a7 --- /dev/null +++ b/build/assets/js/fdbae498.94d380c6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[1742],{5148:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>a,contentTitle:()=>s,default:()=>h,frontMatter:()=>t,metadata:()=>o,toc:()=>d});var r=n(4848),l=n(8453);const t={title:"pika_port \u8fc1\u79fb\u5de5\u5177",slug:"Pika-Tools-Port-Bin",authors:[{name:"\u4e8e\u96e8",title:"Pika \u5f00\u6e90\u793e\u533a"}],hide_table_of_contents:!1},s=void 0,o={permalink:"/blog/Pika-Tools-Port-Bin",source:"@site/blog/2020-04-26-Pika-Tools-Port-Bin.md",title:"pika_port \u8fc1\u79fb\u5de5\u5177",description:"\u9879\u76ee\u4f5c\u8005\uff1a",date:"2020-04-26T00:00:00.000Z",tags:[],readingTime:2.56,hasTruncateMarker:!1,authors:[{name:"\u4e8e\u96e8",title:"Pika \u5f00\u6e90\u793e\u533a"}],frontMatter:{title:"pika_port \u8fc1\u79fb\u5de5\u5177",slug:"Pika-Tools-Port-Bin",authors:[{name:"\u4e8e\u96e8",title:"Pika \u5f00\u6e90\u793e\u533a"}],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Pika Blackwidow \u5f15\u64ce\u6570\u636e\u5b58\u50a8\u683c\u5f0f",permalink:"/blog/pika-blackwidow"}},a={authorsImageUrls:[void 0]},d=[{value:"\u9879\u76ee\u4f5c\u8005\uff1a",id:"\u9879\u76ee\u4f5c\u8005",level:2},{value:"\u9002\u7528\u7248\u672c\uff1a",id:"\u9002\u7528\u7248\u672c",level:2},{value:"\u9879\u76ee\u5730\u5740\uff1a",id:"\u9879\u76ee\u5730\u5740",level:2},{value:"\u4e8c\u8fdb\u5236\u5305\uff1a",id:"\u4e8c\u8fdb\u5236\u5305",level:2},{value:"\u529f\u80fd\uff1a",id:"\u529f\u80fd",level:2},{value:"\u5f00\u53d1\u80cc\u666f\uff1a",id:"\u5f00\u53d1\u80cc\u666f",level:2},{value:"\u5b9e\u73b0\uff1a",id:"\u5b9e\u73b0",level:2},{value:"trysync\u7ebf\u7a0b",id:"trysync\u7ebf\u7a0b",level:3},{value:"binlog_receiver\u7ebf\u7a0b",id:"binlog_receiver\u7ebf\u7a0b",level:3},{value:"migrator\u7ebf\u7a0b",id:"migrator\u7ebf\u7a0b",level:3},{value:"sender\u7ebf\u7a0b",id:"sender\u7ebf\u7a0b",level:3},{value:"\u4f7f\u7528\u5e2e\u52a9\uff1a",id:"\u4f7f\u7528\u5e2e\u52a9",level:2}];function c(e){const i={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",...(0,l.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(i.h2,{id:"\u9879\u76ee\u4f5c\u8005",children:"\u9879\u76ee\u4f5c\u8005\uff1a"}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.a,{href:"https://github.com/alexstocks",children:"AlexStocks"})}),"\n",(0,r.jsx)(i.h2,{id:"\u9002\u7528\u7248\u672c",children:"\u9002\u7528\u7248\u672c\uff1a"}),"\n",(0,r.jsx)(i.p,{children:"3.1 \u548c 2.x"}),"\n",(0,r.jsx)(i.h2,{id:"\u9879\u76ee\u5730\u5740",children:"\u9879\u76ee\u5730\u5740\uff1a"}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.a,{href:"https://github.com/ipixiu/pika-tools",children:"https://github.com/ipixiu/pika-tools"})}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.a,{href:"https://github.com/Axlgrep/pika-tools",children:"https://github.com/Axlgrep/pika-tools \u957f\u671f\u7ef4\u62a4\u5730\u5740\u9700\u81ea\u884c\u7f16\u8bd1"})}),"\n",(0,r.jsx)(i.h2,{id:"\u4e8c\u8fdb\u5236\u5305",children:"\u4e8c\u8fdb\u5236\u5305\uff1a"}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.a,{href:"https://github.com/ipixiu/pika-port-bin",children:"https://github.com/ipixiu/pika-port-bin"})}),"\n",(0,r.jsx)(i.h2,{id:"\u529f\u80fd",children:"\u529f\u80fd\uff1a"}),"\n",(0,r.jsx)(i.p,{children:"\u5c06Pika\u4e2d\u7684\u6570\u636e\u5728\u7ebf\u8fc1\u79fb\u5230Pika\u3001Redis\uff08\u652f\u6301\u5168\u91cf\u3001\u589e\u91cf\u540c\u6b65\uff09"}),"\n",(0,r.jsx)(i.h2,{id:"\u5f00\u53d1\u80cc\u666f",children:"\u5f00\u53d1\u80cc\u666f\uff1a"}),"\n",(0,r.jsx)(i.p,{children:"\u4e4b\u524dPika\u9879\u76ee\u5b98\u65b9\u63d0\u4f9b\u7684pika_to_redis\u5de5\u5177\u4ec5\u652f\u6301\u79bb\u7ebf\u5c06Pika\u7684DB\u4e2d\u7684\u6570\u636e\u8fc1\u79fb\u5230Pika\u3001Redis, \u4e14\u65e0\u6cd5\u589e\u91cf\u540c\u6b65\uff0c\u8be5\u5de5\u5177\u53ef\u4ee5\u76f4\u63a5\u4f2a\u88c5\u4e3a\u4e00\u4e2aPika\u7684\u4ece\u5e93\uff0c\u5c06\u4e3b\u5e93\u6570\u636e\u901a\u8fc7\u540c\u6b65\u83b7\u53d6\u5e76\u8f6c\u53d1\u7ed9Pika\u3001Redis\uff0c\u540c\u65f6\u5e76\u652f\u6301\u589e\u91cf\u540c\u6b65"}),"\n",(0,r.jsx)(i.h2,{id:"\u5b9e\u73b0",children:"\u5b9e\u73b0\uff1a"}),"\n",(0,r.jsx)(i.h3,{id:"trysync\u7ebf\u7a0b",children:"trysync\u7ebf\u7a0b"}),"\n",(0,r.jsxs)(i.ol,{children:["\n",(0,r.jsx)(i.li,{children:"\u5c1d\u8bd5\u4e0e\u4e3b\u5e93\u5efa\u7acb\u540c\u6b65\u5173\u7cfb"}),"\n",(0,r.jsx)(i.li,{children:"\u5982\u679c\u9700\u8981\u5168\u540c\u6b65\uff0c\u5219\u5728\u63a5\u6536\u5230master\u7684db\u4e4b\u540e\uff0c\u542f\u52a8migrator\u548csender\u7ebf\u7a0b\u5c06db\u91cc\u9762\u7684\u6570\u636e\u53d1\u9001\u7ed9Pika\u3001Redis"}),"\n",(0,r.jsx)(i.li,{children:"\u542f\u52a8Slaveping\u7ebf\u7a0b\u5b9a\u671f\u7ed9\u4e3b\u5e93\u53d1\u9001\u5fc3\u8df3\uff0c\u5b8c\u6210\u5efa\u7acb\u4e3b\u4ece\u5173\u7cfb"}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"binlog_receiver\u7ebf\u7a0b",children:"binlog_receiver\u7ebf\u7a0b"}),"\n",(0,r.jsxs)(i.ol,{children:["\n",(0,r.jsx)(i.li,{children:"\u63a5\u6536\u4e3b\u5e93\u53d1\u9001\u8fc7\u6765\u7684binlog\u5e76\u4e14\u5c06\u5176\u89e3\u6790\u6210redis\u547d\u4ee4"}),"\n",(0,r.jsx)(i.li,{children:"\u5c06redis\u547d\u4ee4\u8f6c\u53d1\u7ed9Pika\u3001Redis"}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"migrator\u7ebf\u7a0b",children:"migrator\u7ebf\u7a0b"}),"\n",(0,r.jsxs)(i.ol,{children:["\n",(0,r.jsx)(i.li,{children:"\u626b\u63cf\u4e0d\u540c\u6570\u636e\u7c7b\u578b\u7684\u5206\u5e93"}),"\n",(0,r.jsx)(i.li,{children:"\u5c06key\u8fdb\u884c\u89e3\u6790\u6210\u54cd\u5e94\u6570\u636ePika\u3001redis\u6307\u4ee4"}),"\n",(0,r.jsx)(i.li,{children:"\u5c06\u89e3\u6790\u597d\u7684redis\u6307\u4ee4\u52a0\u8f7d\u5230sender\u7684\u53d1\u9001buf\u4e2d"}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"sender\u7ebf\u7a0b",children:"sender\u7ebf\u7a0b"}),"\n",(0,r.jsxs)(i.ol,{children:["\n",(0,r.jsx)(i.li,{children:"\u4ece\u53d1\u9001buf\u4e2d\u8bfb\u53d6\u6570\u636e\uff0c\u4ee5\u975e\u963b\u585e\u65b9\u5f0f\u5411Pika\u3001redis\u53d1\u9001\u6570\u636e"}),"\n",(0,r.jsx)(i.li,{children:"\u63a5\u6536Pika\u3001redis\u8fd4\u56de\u7684\u7ed3\u679c\u5e76\u89e3\u6790\uff0c\u5982\u679c\u51fa\u73b0\u9519\u8bef\u5219\u663e\u793a\u9519\u8bef\u7ed3\u679c"}),"\n"]}),"\n",(0,r.jsx)(i.h2,{id:"\u4f7f\u7528\u5e2e\u52a9",children:"\u4f7f\u7528\u5e2e\u52a9\uff1a"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"Usage: \n pika_port [-h] [-t local_ip -p local_port -i master_ip -o master_port\n -m forward_ip -n forward_port -x forward_thread_num -y forward_passwd]\n -f filenum -s offset -w password -r rsync_dump_path -l log_path\n -h -- show this help\n -t -- local host ip(OPTIONAL default: 127.0.0.1)\n -p -- local port(OPTIONAL)\n -i -- master ip(OPTIONAL default: 127.0.0.1)\n -o -- master port(REQUIRED)\n -m -- forward ip(OPTIONAL default: 127.0.0.1)\n -n -- forward port(REQUIRED)\n -x -- forward thread num(OPTIONAL default: 1)\n -y -- forward password(OPTIONAL)\n -f -- binlog filenum(OPTIONAL default: local offset)\n -s -- binlog offset(OPTIONAL default: local offset)\n -w -- password for master(OPTIONAL)\n -r -- rsync dump data path(OPTIONAL default: ./rsync_dump)\n -l -- local log path(OPTIONAL default: ./log)\n -b -- max batch number when port rsync dump data (OPTIONAL default: 512)\n -d -- daemonize(OPTIONAL)\n example: ./pika_port -t 127.0.0.1 -p 12345 -i 127.0.0.1 -o 9221 -m 127.0.0.1 -n 6379 -x 7 -f 0 -s 0 -w abc -l ./log -r ./rsync_dump -b 512 -d\n"})})]})}function h(e={}){const{wrapper:i}={...(0,l.R)(),...e.components};return i?(0,r.jsx)(i,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>s,x:()=>o});var r=n(6540);const l={},t=r.createContext(l);function s(e){const i=r.useContext(t);return r.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function o(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:s(e.components),r.createElement(t.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/fdc83c8b.e95e7c72.js b/build/assets/js/fdc83c8b.e95e7c72.js new file mode 100644 index 0000000..1d65608 --- /dev/null +++ b/build/assets/js/fdc83c8b.e95e7c72.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[2516],{1354:(n,e,i)=>{i.r(e),i.d(e,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>r,toc:()=>p});var s=i(4848),t=i(8453);const o={title:"\u670d\u52a1\u5668\u72b6\u6001\u76d1\u63a7",sidebar_position:85},a=void 0,r={id:"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u670d\u52a1\u5668\u72b6\u6001\u76d1\u63a7/index",title:"\u670d\u52a1\u5668\u72b6\u6001\u76d1\u63a7",description:"\u5728pika\u7684\u4f7f\u7528\u4e2d\uff0c\u4e5f\u4e3a\u7528\u6237\u63d0\u4f9b\u4e86\u4e30\u5bcc\u7684info\u5c55\u793a\uff0c\u7528\u4e8e\u76d1\u63a7\u670d\u52a1\u5668\u7684\u8fd0\u884c\u72b6\u6001\u3002",source:"@site/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u670d\u52a1\u5668\u72b6\u6001\u76d1\u63a7/index.md",sourceDirName:"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u670d\u52a1\u5668\u72b6\u6001\u76d1\u63a7",slug:"/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u670d\u52a1\u5668\u72b6\u6001\u76d1\u63a7/",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u670d\u52a1\u5668\u72b6\u6001\u76d1\u63a7/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u670d\u52a1\u5668\u72b6\u6001\u76d1\u63a7/index.md",tags:[],version:"current",sidebarPosition:85,frontMatter:{title:"\u670d\u52a1\u5668\u72b6\u6001\u76d1\u63a7",sidebar_position:85},sidebar:"tutorialSidebar",previous:{title:"\u591a\u5e93\u7248\u547d\u4ee4",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u591a\u5e93\u7248\u547d\u4ee4/"},next:{title:"\u5206\u7247\u6559\u7a0b(3.1.2 \u2010 3.3.6)",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5206\u7247\u6559\u7a0b/"}},c={},p=[];function l(n){const e={code:"code",li:"li",ol:"ol",p:"p",pre:"pre",...(0,t.R)(),...n.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(e.p,{children:"\u5728pika\u7684\u4f7f\u7528\u4e2d\uff0c\u4e5f\u4e3a\u7528\u6237\u63d0\u4f9b\u4e86\u4e30\u5bcc\u7684info\u5c55\u793a\uff0c\u7528\u4e8e\u76d1\u63a7\u670d\u52a1\u5668\u7684\u8fd0\u884c\u72b6\u6001\u3002"}),"\n",(0,s.jsxs)(e.ol,{children:["\n",(0,s.jsx)(e.li,{children:"\u4e3b\u4ece\u72b6\u6001\uff1b"}),"\n",(0,s.jsx)(e.li,{children:"BinLog\u72b6\u6001\u53ca\u914d\u7f6e\uff1b"}),"\n",(0,s.jsx)(e.li,{children:"\u7edf\u8ba1\u4fe1\u606f\u5305\u62ec\uff1a"}),"\n",(0,s.jsxs)(e.li,{children:["clients\u72b6\u6001\uff1b","\n",(0,s.jsxs)(e.ol,{children:["\n",(0,s.jsx)(e.li,{children:"QPS"}),"\n",(0,s.jsx)(e.li,{children:"\u5f53\u524d\u5f15\u64ce\u5185\u5b58\u4f7f\u7528\uff1b"}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(e.li,{children:"db size\u3001keyspace\u53ca\u72b6\u6001\uff1b"}),"\n"]}),"\n",(0,s.jsx)(e.p,{children:"info\u5177\u4f53\u6e05\u5355\u5982\u4e0b\uff1a"}),"\n",(0,s.jsx)(e.pre,{children:(0,s.jsx)(e.code,{children:"# Server\npika_version:1.0.5 ----------------------------------------------------------------- pika \u7248\u672c\u4fe1\u606f\nos:Linux 2.6.32-2.0.0.8-6 x86_64 --------------------------------------------------- \u64cd\u4f5c\u7cfb\u7edf\u4fe1\u606f\narch_bits:64 ----------------------------------------------------------------------- \u64cd\u4f5c\u7cfb\u7edf\u4f4d\u6570\nprocess_id:12969 ------------------------------------------------------------------- pika pid\u4fe1\u606f\ntcp_port:9001 ---------------------------------------------------------------------- pika \u7aef\u53e3\u4fe1\u606f\nthread_num:12 ---------------------------------------------------------------------- pika \u7ebf\u7a0b\u6570\u91cf\nuptime_in_seconds:3074 ------------------------------------------------------------- pika \u8fd0\u884c\u65f6\u95f4\uff08\u79d2\uff09\nuptime_in_days:0 ------------------------------------------------------------------- pika \u8fd0\u884c\u65f6\u95f4\uff08\u5929\uff09\nconfig_file:/data1/pika9001/pika9001.conf ------------------------------------------ pika conf\u6587\u4ef6\u4f4d\u7f6e\nis_bgsaving:No, , 0 ---------------------------------------------------------------- pika \u5907\u4efd\u4fe1\u606f\uff1a\u662f\u5426\u5728\u5907\u4efd,\u5907\u4efd\u540d\u79f0\uff0c\u5907\u4efd\u6267\u884c\u65f6\u95f4\nis_scaning_keyspace:No ------------------------------------------------------------- pika key space\u7edf\u8ba1\u72b6\u6001\uff0c\u662f\u5426\u5728\u8fdb\u884c\u7edf\u8ba1\nis_compact:No ---------------------------------------------------------------------- \u5168\u91cf\u7a7a\u6d1e\u56de\u6536\uff08\u6570\u636e\u6574\u7406\uff09\u662f\u5426\u6b63\u5728\u8fdb\u884c\ndb_size:296M ----------------------------------------------------------------------- pika \u5f53\u524ddb\u4f53\u79ef\nlog_size:22357M -------------------------------------------------------------------- pika \u5f53\u524dlog\u603b\u4f53\u79ef\ncompression:snappy ----------------------------------------------------------------- pika \u5f53\u524d\u538b\u7f29\u65b9\u6848\nsafety_purge:write2file99546 ------------------------------------------------------- pika \u5f53\u524d\u80fd\u591f\u5b89\u5168\u6e05\u7406\u7684\u6700\u65b0\u65e5\u5fd7\nexpire_logs_days:7 ----------------------------------------------------------------- pika \u65e5\u5fd7\u8fc7\u671f\u65f6\u95f4\nexpire_logs_nums:200 --------------------------------------------------------------- pika \u65e5\u5fd7\u4fdd\u7559\u6700\u5927\u6570\u91cf\n \n# Clients\nconnected_clients:2 ---------------------------------------------------------------- \u5f53\u524d\u8fde\u63a5\u6570\n \n# Stats\ntotal_connections_received:18 ------------------------------------------------------ \u603b\u8fde\u63a5\u6b21\u6570\u7edf\u8ba1\ninstantaneous_ops_per_sec:1 -------------------------------------------------------- \u5f53\u524dqps\naccumulative_query_nums:633 -------------------------------------------------------- \u8bf7\u6c42\u603b\u8ba1\n \n# Replication(MASTER)\nrole:master ------------------------------------------------------------------------ \u672c\u5b9e\u4f8b\u89d2\u8272\nconnected_slaves:1 ----------------------------------------------------------------- \u5f53\u524d\u4ece\u5e93\u6570\u91cf\nslave0: host_port=192.168.1.1:57765 state=online ----------------------------------- \u5f53\u524d\u4ece\u5e93\u8fde\u63a5\u4fe1\u606f\uff0c\u5982\u679c\u6709\u591a\u4e2a\u4ece\u5e93\u5219\u4f9d\u6b21\u5c55\u793a\n \n#\u4ece\u5e93\uff08\u533a\u522b\u4ec5\u5728\u4e8e\u540c\u6b65\u4fe1\u606f\u7684\u5c55\u793a\uff09\uff1a\n# Replication(SLAVE)\nrole:slave ------------------------------------------------------------------------- \u672c\u5b9e\u4f8b\u89d2\u8272\nmaster_host:192.168.1.2 ------------------------------------------------------------ \u4e3b\u5e93IP\nmaster_port:9001 ------------------------------------------------------------------- \u4e3b\u5e93\u7aef\u53e3\nmaster_link_status:up -------------------------------------------------------------- \u5f53\u524d\u540c\u6b65\u72b6\u6001\nslave_read_only:1 ------------------------------------------------------------------ \u4ece\u5e93\u662f\u5426readonly \n \nKeyspace\uff08key\u6570\u91cf\u5c55\u793a\uff0c\u6309\u7167\u6570\u636e\u7c7b\u578b\u5206\u7c7b\u5c55\u793a\uff0c\u9ed8\u8ba4\u4e0d\u66f4\u65b0\uff0c\u4ec5\u5728\u6267\u884cinfo keyspace 1\u7684\u65f6\u5019\u5237\u65b0\u8be5\u4fe1\u606f\uff09\nTime:2016-04-22 17:08:33 --------------------------------------------------------- \u4e0a\u4e00\u6b21\u7edf\u8ba1\u7684\u65f6\u95f4\nkv keys:43\nhash keys:503\nlist keys:0\nzset keys:0\nset keys:0\n"})})]})}function d(n={}){const{wrapper:e}={...(0,t.R)(),...n.components};return e?(0,s.jsx)(e,{...n,children:(0,s.jsx)(l,{...n})}):l(n)}},8453:(n,e,i)=>{i.d(e,{R:()=>a,x:()=>r});var s=i(6540);const t={},o=s.createContext(t);function a(n){const e=s.useContext(o);return s.useMemo((function(){return"function"==typeof n?n(e):{...e,...n}}),[e,n])}function r(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(t):n.components||t:a(n.components),s.createElement(o.Provider,{value:e},n.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/ffc6e5ef.e44305e4.js b/build/assets/js/ffc6e5ef.e44305e4.js new file mode 100644 index 0000000..36d79c4 --- /dev/null +++ b/build/assets/js/ffc6e5ef.e44305e4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[24],{9721:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>c,contentTitle:()=>s,default:()=>l,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var i=n(4848),o=n(8453);const r={title:"\u4f7f\u7528\u4e0e\u8fd0\u7ef4",sidebar_position:20},s=void 0,a={id:"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/index",title:"\u4f7f\u7528\u4e0e\u8fd0\u7ef4",description:"",source:"@site/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/index.md",sourceDirName:"\u4f7f\u7528\u4e0e\u8fd0\u7ef4",slug:"/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/",draft:!1,unlisted:!1,editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/index.md",tags:[],version:"current",sidebarPosition:20,frontMatter:{title:"\u4f7f\u7528\u4e0e\u8fd0\u7ef4",sidebar_position:20},sidebar:"tutorialSidebar",previous:{title:"FAQ",permalink:"/docs/\u5e8f\u8a00/FAQ/"},next:{title:"\u914d\u7f6e\u6587\u4ef6\u8bf4\u660e",permalink:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u914d\u7f6e\u6587\u4ef6\u8bf4\u660e/"}},c={},d=[];function u(t){return(0,i.jsx)(i.Fragment,{})}function l(t={}){const{wrapper:e}={...(0,o.R)(),...t.components};return e?(0,i.jsx)(e,{...t,children:(0,i.jsx)(u,{...t})}):u()}},8453:(t,e,n)=>{n.d(e,{R:()=>s,x:()=>a});var i=n(6540);const o={},r=i.createContext(o);function s(t){const e=i.useContext(r);return i.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function a(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(o):t.components||o:s(t.components),i.createElement(r.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/build/assets/js/main.6530b181.js b/build/assets/js/main.6530b181.js new file mode 100644 index 0000000..8bce2e5 --- /dev/null +++ b/build/assets/js/main.6530b181.js @@ -0,0 +1,2 @@ +/*! For license information please see main.6530b181.js.LICENSE.txt */ +(self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[]).push([[8792],{8328:(e,t,n)=>{"use strict";n.d(t,{A:()=>p});n(6540);var r=n(3259),a=n.n(r),o=n(4054);const i={"0058b4c6":[()=>n.e(849).then(n.t.bind(n,6164,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-175.json",6164],"03ab4acf":[()=>n.e(1903).then(n.bind(n,6907)),"@site/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/Pika \u6700\u4f73\u5b9e\u8df5/index.md",6907],"063090b1":[()=>n.e(4624).then(n.bind(n,7091)),"@site/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u81ea\u52a8\u5bb9\u707e/index.md",7091],"06983a96":[()=>n.e(2891).then(n.bind(n,2702)),"@site/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u526f\u672c\u4e00\u81f4\u6027\uff08\u4f7f\u7528\u6587\u6863\uff09/index.md",2702],"07f9788a":[()=>n.e(9315).then(n.bind(n,5438)),"@site/docs/\u5e8f\u8a00/\u652f\u6301\u7684 Redis \u63a5\u53e3\u4e0e\u517c\u5bb9\u60c5\u51b5/index.md",5438],"107669ab":[()=>n.e(2001).then(n.bind(n,1201)),"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4e0e Codis/index.md",1201],"1174a4a6":[()=>n.e(3934).then(n.bind(n,2941)),"@site/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/\u559c\u9a6c\u62c9\u96c5 Redis \u4e0e Pika \u7f13\u5b58\u4f7f\u7528\u519b\u89c4/index.md",2941],"14c2ce36":[()=>n.e(7472).then(n.bind(n,1077)),"@site/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5206\u5e03\u5f0f\u6a21\u5f0f\u7b80\u5355\u6559\u7a0b/index.md",1077],"15d8eb8d":[()=>n.e(736).then(n.bind(n,5550)),"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u589e\u91cf\u540c\u6b65/index.md",5550],17896441:[()=>Promise.all([n.e(1869),n.e(8554),n.e(8401)]).then(n.bind(n,2447)),"@theme/DocItem",2447],"1845589b":[()=>n.e(1571).then(n.bind(n,1e3)),"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u6574\u4f53\u6280\u672f\u67b6\u6784/index.md",1e3],"1b3a196b":[()=>n.e(8140).then(n.bind(n,3301)),"@site/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u6570\u636e\u76ee\u5f55/index.md",3301],"2571fc76":[()=>n.e(9974).then(n.bind(n,4909)),"@site/blog/2023-08-25-Pika-3.5.0.md?truncated=true",4909],"2859d2fb":[()=>n.e(2941).then(n.bind(n,2219)),"@site/blog/2023-08-25-Pika-3.5.0.md",2219],"29ba892c":[()=>n.e(2767).then(n.bind(n,1063)),"@site/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/page info \u4fe1\u606f\u8bf4\u660e/index.md",1063],"2c217be1":[()=>n.e(4700).then(n.bind(n,8078)),"@site/blog/2024-03-27-Pika-3.5.3.md",8078],"2fcac357":[()=>n.e(2885).then(n.bind(n,8356)),"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u4e3b\u4ece\u540c\u6b65/index.md",8356],"30dc2be3":[()=>n.e(3717).then(n.bind(n,7771)),"@site/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika 3.5 \u53c2\u6570\u4f18\u5316\u624b\u518c/index.md",7771],"36994c47":[()=>n.e(9858).then(n.t.bind(n,5516,19)),"@generated/docusaurus-plugin-content-blog/default/__plugin.json",5516],"38236c5e":[()=>n.e(3780).then(n.bind(n,4959)),"@site/docs/\u5e8f\u8a00/\u7b80\u4ecb/index.md",4959],"4061d127":[()=>n.e(4292).then(n.bind(n,9370)),"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/Pika \u548c RockSDB \u7684\u5bf9\u63a5/index.md",9370],"43fd4db6":[()=>n.e(1398).then(n.bind(n,5609)),"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u5168\u540c\u6b65/index.md",5609],"49fb2c28":[()=>n.e(7765).then(n.bind(n,583)),"@site/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u8ba2\u9605/index.md",583],"569b9636":[()=>n.e(3805).then(n.bind(n,4654)),"@site/blog/2020-7-16-pika-blackwidow.md",4654],"56a9bc23":[()=>n.e(9460).then(n.bind(n,8031)),"@site/blog/2024-05-16-Pika-3.5.4.md?truncated=true",8031],"5845532a":[()=>n.e(1970).then(n.bind(n,3400)),"@site/blog/2024-07-08-PikiwiDB(Pika)-4.0.0.md?truncated=true",3400],"5e95c892":[()=>n.e(9647).then(n.bind(n,7121)),"@theme/DocsRoot",7121],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,4784)),"@generated/docusaurus.config",4784],"6533aa10":[()=>n.e(5491).then(n.bind(n,3458)),"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u526f\u672c\u4e00\u81f4\u6027/index.md",3458],"65ee69ef":[()=>n.e(8184).then(n.bind(n,6e3)),"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u4e3b\u4ece\u540c\u6b65/index.md",6e3],"6edb4994":[()=>n.e(72).then(n.bind(n,4413)),"@site/blog/2024-05-16-Pika-3.5.4.md",4413],"7074118c":[()=>n.e(4674).then(n.bind(n,4044)),"@site/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/\u8c03\u6574 max-write-buffer-size \u4f18\u5316 pika \u6027\u80fd10\u500d\u7684\u6848\u4f8b/index.md",4044],"70e8c784":[()=>n.e(7191).then(n.bind(n,472)),"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/\u901a\u4fe1\u548c\u7ebf\u7a0b\u6a21\u578b/index.md",472],"7777193d":[()=>n.e(6284).then(n.bind(n,6344)),"@site/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u526f\u672c\u4e00\u81f4\u6027\uff08\u8bbe\u8ba1\u6587\u6863\uff09/index.md",6344],"814f3328":[()=>n.e(5091).then(n.t.bind(n,5513,19)),"~blog/default/blog-post-list-prop-default.json",5513],"82bececd":[()=>n.e(9595).then(n.bind(n,8434)),"@site/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u591a\u5e93\u7248\u547d\u4ee4/index.md",8434],87292243:[()=>n.e(9800).then(n.bind(n,3802)),"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/Pika \u7684\u547d\u4ee4\u6267\u884c\u6846\u67b6/index.md",3802],"878f190b":[()=>n.e(154).then(n.bind(n,4076)),"@site/blog/2024-07-08-PikiwiDB(Pika)-4.0.0.md",4076],"8ad00878":[()=>n.e(9419).then(n.bind(n,4093)),"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65b0\u5b58\u50a8\u7ed3\u6784/index.md",4093],"8cf6d7a7":[()=>n.e(6871).then(n.bind(n,4538)),"@site/blog/2023-09-28-Pika-3.5.1.md",4538],"8d7aab24":[()=>n.e(5496).then(n.bind(n,7542)),"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/index.md",7542],"937cdc77":[()=>n.e(9044).then(n.bind(n,3789)),"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u5feb\u7167\u5f0f\u5907\u4efd/index.md",3789],94717405:[()=>n.e(6824).then(n.bind(n,1510)),"@site/docs/\u5e8f\u8a00/FAQ/index.md",1510],"9805f35a":[()=>n.e(4538).then(n.bind(n,9265)),"@site/docs/\u5e8f\u8a00/index.md",9265],"9994e0b3":[()=>n.e(7084).then(n.bind(n,1541)),"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/index.md",1541],"9b4df08c":[()=>n.e(3215).then(n.bind(n,801)),"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/index.md",801],"9e4087bc":[()=>n.e(2711).then(n.bind(n,9331)),"@theme/BlogArchivePage",9331],a3821efb:[()=>n.e(2995).then(n.bind(n,2336)),"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u7ebf\u7a0b\u6a21\u578b/index.md",2336],a5dfed40:[()=>n.e(4196).then(n.bind(n,1234)),"@site/blog/2024-03-27-Pika-3.5.3.md?truncated=true",1234],a605574d:[()=>n.e(4487).then(n.bind(n,7012)),"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/PubSub \u673a\u5236/index.md",7012],a6aa9e1f:[()=>Promise.all([n.e(1869),n.e(8554),n.e(3834),n.e(7643)]).then(n.bind(n,2052)),"@theme/BlogListPage",2052],a7456010:[()=>n.e(1235).then(n.t.bind(n,8552,19)),"@generated/docusaurus-plugin-content-pages/default/__plugin.json",8552],a74ce679:[()=>n.e(7257).then(n.bind(n,4110)),"@site/docs/\u6027\u80fd\u4e0e\u4f18\u5316/index.md",4110],a7776ad8:[()=>n.e(6230).then(n.bind(n,1005)),"@site/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5206\u7247\u6559\u7a0b/index.md",1005],a7bd4aaa:[()=>n.e(7098).then(n.bind(n,4532)),"@theme/DocVersionRoot",4532],a94703ab:[()=>Promise.all([n.e(1869),n.e(9048)]).then(n.bind(n,2559)),"@theme/DocRoot",2559],a950bb08:[()=>n.e(2978).then(n.bind(n,702)),"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u8bfb\u5199\u6d41\u7a0b/index.md",702],ab946cbc:[()=>n.e(5533).then(n.bind(n,7496)),"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65e7\u5b58\u50a8\u7ed3\u6784/index.md",7496],aba21aa0:[()=>n.e(5742).then(n.t.bind(n,7093,19)),"@generated/docusaurus-plugin-content-docs/default/__plugin.json",7093],acecf23e:[()=>n.e(4284).then(n.t.bind(n,1912,19)),"~blog/default/blogMetadata-default.json",1912],adc1ab20:[()=>n.e(539).then(n.bind(n,1602)),"@site/docs/\u6027\u80fd\u4e0e\u4f18\u5316/3.2.x \u6027\u80fd/index.md",1602],ae7197e3:[()=>n.e(3365).then(n.bind(n,7229)),"@site/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5dee\u5f02\u5316\u547d\u4ee4/index.md",7229],affdd1e0:[()=>n.e(7938).then(n.bind(n,4050)),"@site/docs/\u5f00\u53d1\u6587\u6863/coding-style/index.md",4050],b50c085f:[()=>n.e(4434).then(n.bind(n,5459)),"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u9501\u7684\u5e94\u7528/index.md",5459],bb6459ea:[()=>n.e(1169).then(n.bind(n,8015)),"@site/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/index.md",8015],bbb97d2b:[()=>n.e(7381).then(n.bind(n,6182)),"@site/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u5185\u5b58\u4f7f\u7528/index.md",6182],c15d9823:[()=>n.e(8146).then(n.t.bind(n,9328,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-bd9.json",9328],c3d344d9:[()=>n.e(7043).then(n.bind(n,4630)),"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/NoSQL \u539f\u7406\u6982\u8ff0/index.md",4630],c4f5d8e4:[()=>Promise.all([n.e(1869),n.e(2634)]).then(n.bind(n,6467)),"@site/src/pages/index.js",6467],c6bc127f:[()=>n.e(8183).then(n.bind(n,9182)),"@site/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u914d\u7f6e\u6587\u4ef6\u8bf4\u660e/index.md",9182],c823c29b:[()=>n.e(321).then(n.bind(n,3560)),"@site/blog/2020-04-26-Pika-Tools-Port-Bin.md?truncated=true",3560],c8b8756d:[()=>n.e(5970).then(n.bind(n,4178)),"@site/blog/2020-7-16-pika-blackwidow.md?truncated=true",4178],ccc49370:[()=>Promise.all([n.e(1869),n.e(8554),n.e(3834),n.e(3249)]).then(n.bind(n,3858)),"@theme/BlogPostPage",3858],d049632c:[()=>n.e(902).then(n.bind(n,5120)),"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65b0\u5b58\u50a8\u65b9\u6848\uff1a\u8be6\u7ec6\u89e3\u6790/index.md",5120],d126de26:[()=>n.e(2439).then(n.bind(n,9027)),"@site/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5b89\u88c5\u4f7f\u7528/index.md",9027],e13eafd3:[()=>n.e(7963).then(n.bind(n,2010)),"@site/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u7ba1\u7406\u6307\u4ee4/index.md",2010],e60cd9a4:[()=>n.e(935).then(n.bind(n,3860)),"@site/docs/\u5f00\u53d1\u6587\u6863/\u7f16\u7801\u89c4\u8303/index.md",3860],e85952ae:[()=>n.e(9145).then(n.bind(n,3692)),"@site/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u7ebf\u7a0b\u6a21\u578b/index.md",3692],ea50f5f5:[()=>n.e(2526).then(n.bind(n,4798)),"@site/blog/2023-09-28-Pika-3.5.1.md?truncated=true",4798],eb808821:[()=>n.e(1661).then(n.bind(n,9201)),"@site/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Redis \u4e0e Pika scan \u6027\u80fd\u5bf9\u6bd4/index.md",9201],f7836a87:[()=>n.e(3053).then(n.bind(n,4126)),"@site/blog/2023-12-03-Pika-3.5.2.md",4126],f81c1134:[()=>n.e(8130).then(n.t.bind(n,7735,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-archive-f05.json",7735],fac0ae3c:[()=>n.e(1173).then(n.bind(n,7835)),"@site/docs/\u5f00\u53d1\u6587\u6863/index.md",7835],fdbae498:[()=>n.e(1742).then(n.bind(n,5148)),"@site/blog/2020-04-26-Pika-Tools-Port-Bin.md",5148],fdc83c8b:[()=>n.e(2516).then(n.bind(n,1354)),"@site/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u670d\u52a1\u5668\u72b6\u6001\u76d1\u63a7/index.md",1354],ffc6e5ef:[()=>n.e(24).then(n.bind(n,9721)),"@site/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/index.md",9721]};var l=n(4848);function s(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,l.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,l.jsx)("p",{children:String(t)}),(0,l.jsx)("div",{children:(0,l.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,l.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,l.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,l.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,l.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,l.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,l.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,l.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,l.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,l.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var c=n(6921),u=n(3102);function d(e,t){if("*"===e)return a()({loading:s,loader:()=>n.e(2237).then(n.bind(n,2237)),modules:["@theme/NotFound"],webpack:()=>[2237],render(e,t){const n=e.default;return(0,l.jsx)(u.W,{value:{plugin:{name:"native",id:"default"}},children:(0,l.jsx)(n,{...t})})}});const r=o[`${e}-${t}`],d={},p=[],f=[],m=(0,c.A)(r);return Object.entries(m).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],p.push(r[1]),f.push(r[2]))})),a().Map({loading:s,loader:d,modules:p,webpack:()=>f,render(t,n){const a=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const o=r.default;if(!o)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof o&&"function"!=typeof o||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{o[e]=r[e]}));let i=a;const l=n.split(".");l.slice(0,-1).forEach((e=>{i=i[e]})),i[l[l.length-1]]=o}));const o=a.__comp;delete a.__comp;const i=a.__context;delete a.__context;const s=a.__props;return delete a.__props,(0,l.jsx)(u.W,{value:i,children:(0,l.jsx)(o,{...a,...s,...n})})}})}const p=[{path:"/blog",component:d("/blog","b7e"),exact:!0},{path:"/blog/archive",component:d("/blog/archive","182"),exact:!0},{path:"/blog/Pika-3.5.0",component:d("/blog/Pika-3.5.0","eeb"),exact:!0},{path:"/blog/Pika-3.5.0",component:d("/blog/Pika-3.5.0","104"),exact:!0},{path:"/blog/Pika-3.5.1",component:d("/blog/Pika-3.5.1","780"),exact:!0},{path:"/blog/Pika-3.5.3",component:d("/blog/Pika-3.5.3","f4a"),exact:!0},{path:"/blog/Pika-3.5.4",component:d("/blog/Pika-3.5.4","7a0"),exact:!0},{path:"/blog/pika-blackwidow",component:d("/blog/pika-blackwidow","396"),exact:!0},{path:"/blog/Pika-Tools-Port-Bin",component:d("/blog/Pika-Tools-Port-Bin","dc3"),exact:!0},{path:"/blog/PikiwiDB-Pika--4.0.0",component:d("/blog/PikiwiDB-Pika--4.0.0","c12"),exact:!0},{path:"/docs",component:d("/docs","c12"),routes:[{path:"/docs",component:d("/docs","fcc"),routes:[{path:"/docs",component:d("/docs","6ad"),routes:[{path:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/",component:d("/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/","5f5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/page info \u4fe1\u606f\u8bf4\u660e/",component:d("/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/page info \u4fe1\u606f\u8bf4\u660e/","eef"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/Pika \u6700\u4f73\u5b9e\u8df5/",component:d("/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/Pika \u6700\u4f73\u5b9e\u8df5/","5e2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5206\u5e03\u5f0f\u6a21\u5f0f\u7b80\u5355\u6559\u7a0b/",component:d("/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5206\u5e03\u5f0f\u6a21\u5f0f\u7b80\u5355\u6559\u7a0b/","3df"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5206\u7247\u6559\u7a0b/",component:d("/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5206\u7247\u6559\u7a0b/","c6b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u526f\u672c\u4e00\u81f4\u6027\uff08\u4f7f\u7528\u6587\u6863\uff09/",component:d("/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u526f\u672c\u4e00\u81f4\u6027\uff08\u4f7f\u7528\u6587\u6863\uff09/","e86"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u526f\u672c\u4e00\u81f4\u6027\uff08\u8bbe\u8ba1\u6587\u6863\uff09/",component:d("/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u526f\u672c\u4e00\u81f4\u6027\uff08\u8bbe\u8ba1\u6587\u6863\uff09/","b1e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u591a\u5e93\u7248\u547d\u4ee4/",component:d("/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u591a\u5e93\u7248\u547d\u4ee4/","3c5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5b89\u88c5\u4f7f\u7528/",component:d("/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5b89\u88c5\u4f7f\u7528/","3a0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5dee\u5f02\u5316\u547d\u4ee4/",component:d("/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5dee\u5f02\u5316\u547d\u4ee4/","fcf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u6570\u636e\u76ee\u5f55/",component:d("/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u6570\u636e\u76ee\u5f55/","d15"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u670d\u52a1\u5668\u72b6\u6001\u76d1\u63a7/",component:d("/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u670d\u52a1\u5668\u72b6\u6001\u76d1\u63a7/","a79"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u7ba1\u7406\u6307\u4ee4/",component:d("/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u7ba1\u7406\u6307\u4ee4/","0bc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u81ea\u52a8\u5bb9\u707e/",component:d("/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u81ea\u52a8\u5bb9\u707e/","1d2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u8ba2\u9605/",component:d("/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u8ba2\u9605/","18e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u914d\u7f6e\u6587\u4ef6\u8bf4\u660e/",component:d("/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u914d\u7f6e\u6587\u4ef6\u8bf4\u660e/","17b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u5e8f\u8a00/",component:d("/docs/\u5e8f\u8a00/","db5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u5e8f\u8a00/FAQ/",component:d("/docs/\u5e8f\u8a00/FAQ/","b59"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u5e8f\u8a00/\u652f\u6301\u7684 Redis \u63a5\u53e3\u4e0e\u517c\u5bb9\u60c5\u51b5/",component:d("/docs/\u5e8f\u8a00/\u652f\u6301\u7684 Redis \u63a5\u53e3\u4e0e\u517c\u5bb9\u60c5\u51b5/","10f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u5e8f\u8a00/\u7b80\u4ecb/",component:d("/docs/\u5e8f\u8a00/\u7b80\u4ecb/","70a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u5f00\u53d1\u6587\u6863/",component:d("/docs/\u5f00\u53d1\u6587\u6863/","7cf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u5f00\u53d1\u6587\u6863/coding-style/",component:d("/docs/\u5f00\u53d1\u6587\u6863/coding-style/","329"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u5f00\u53d1\u6587\u6863/\u7f16\u7801\u89c4\u8303/",component:d("/docs/\u5f00\u53d1\u6587\u6863/\u7f16\u7801\u89c4\u8303/","f7c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/",component:d("/docs/\u6027\u80fd\u4e0e\u4f18\u5316/","fd2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/3.2.x \u6027\u80fd/",component:d("/docs/\u6027\u80fd\u4e0e\u4f18\u5316/3.2.x \u6027\u80fd/","b31"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika 3.5 \u53c2\u6570\u4f18\u5316\u624b\u518c/",component:d("/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika 3.5 \u53c2\u6570\u4f18\u5316\u624b\u518c/","e0f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/",component:d("/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/","088"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/\u559c\u9a6c\u62c9\u96c5 Redis \u4e0e Pika \u7f13\u5b58\u4f7f\u7528\u519b\u89c4/",component:d("/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/\u559c\u9a6c\u62c9\u96c5 Redis \u4e0e Pika \u7f13\u5b58\u4f7f\u7528\u519b\u89c4/","51b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/\u8c03\u6574 max-write-buffer-size \u4f18\u5316 pika \u6027\u80fd10\u500d\u7684\u6848\u4f8b/",component:d("/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/\u8c03\u6574 max-write-buffer-size \u4f18\u5316 pika \u6027\u80fd10\u500d\u7684\u6848\u4f8b/","d3e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u5185\u5b58\u4f7f\u7528/",component:d("/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u5185\u5b58\u4f7f\u7528/","c7d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Redis \u4e0e Pika scan \u6027\u80fd\u5bf9\u6bd4/",component:d("/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Redis \u4e0e Pika scan \u6027\u80fd\u5bf9\u6bd4/","601"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/",component:d("/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/","9ca"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/NoSQL \u539f\u7406\u6982\u8ff0/",component:d("/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/NoSQL \u539f\u7406\u6982\u8ff0/","472"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4e0e Codis/",component:d("/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4e0e Codis/","f53"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/",component:d("/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/","2f6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u4e3b\u4ece\u540c\u6b65/",component:d("/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u4e3b\u4ece\u540c\u6b65/","911"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u7ebf\u7a0b\u6a21\u578b/",component:d("/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u7ebf\u7a0b\u6a21\u578b/","6ce"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u8bfb\u5199\u6d41\u7a0b/",component:d("/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u8bfb\u5199\u6d41\u7a0b/","5dc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/",component:d("/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/","48f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/Pika \u548c RockSDB \u7684\u5bf9\u63a5/",component:d("/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/Pika \u548c RockSDB \u7684\u5bf9\u63a5/","9cf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/Pika \u7684\u547d\u4ee4\u6267\u884c\u6846\u67b6/",component:d("/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/Pika \u7684\u547d\u4ee4\u6267\u884c\u6846\u67b6/","26a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/PubSub \u673a\u5236/",component:d("/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/PubSub \u673a\u5236/","e15"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/\u901a\u4fe1\u548c\u7ebf\u7a0b\u6a21\u578b/",component:d("/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/\u901a\u4fe1\u548c\u7ebf\u7a0b\u6a21\u578b/","a01"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u4e3b\u4ece\u540c\u6b65/",component:d("/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u4e3b\u4ece\u540c\u6b65/","4d3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u5168\u540c\u6b65/",component:d("/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u5168\u540c\u6b65/","248"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u526f\u672c\u4e00\u81f4\u6027/",component:d("/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u526f\u672c\u4e00\u81f4\u6027/","97a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u589e\u91cf\u540c\u6b65/",component:d("/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u589e\u91cf\u540c\u6b65/","ea1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u5feb\u7167\u5f0f\u5907\u4efd/",component:d("/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u5feb\u7167\u5f0f\u5907\u4efd/","1e5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u6574\u4f53\u6280\u672f\u67b6\u6784/",component:d("/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u6574\u4f53\u6280\u672f\u67b6\u6784/","ccd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65b0\u5b58\u50a8\u65b9\u6848\uff1a\u8be6\u7ec6\u89e3\u6790/",component:d("/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65b0\u5b58\u50a8\u65b9\u6848\uff1a\u8be6\u7ec6\u89e3\u6790/","948"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65b0\u5b58\u50a8\u7ed3\u6784/",component:d("/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65b0\u5b58\u50a8\u7ed3\u6784/","571"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65e7\u5b58\u50a8\u7ed3\u6784/",component:d("/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65e7\u5b58\u50a8\u7ed3\u6784/","f6e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u7ebf\u7a0b\u6a21\u578b/",component:d("/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u7ebf\u7a0b\u6a21\u578b/","334"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u9501\u7684\u5e94\u7528/",component:d("/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u9501\u7684\u5e94\u7528/","581"),exact:!0,sidebar:"tutorialSidebar"}]}]}]},{path:"/",component:d("/","2e1"),exact:!0},{path:"*",component:d("*")}]},6125:(e,t,n)=>{"use strict";n.d(t,{o:()=>o,x:()=>i});var r=n(6540),a=n(4848);const o=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,a.jsx)(o.Provider,{value:n,children:t})}},8536:(e,t,n)=>{"use strict";var r=n(6540),a=n(5338),o=n(545),i=n(4625),l=n(4784),s=n(8193);const c=[n(119),n(6134),n(6294),n(1043)];var u=n(8328),d=n(6347),p=n(2831),f=n(4848);function m(e){let{children:t}=e;return(0,f.jsx)(f.Fragment,{children:t})}var h=n(5260),g=n(4586),b=n(6025),y=n(6342),v=n(1213),w=n(2131),k=n(4090),x=n(2967),S=n(440),E=n(1463);function _(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,g.A)(),r=(0,w.o)(),a=n[e].htmlLang,o=e=>e.replace("-","_");return(0,f.jsxs)(h.A,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,f.jsx)("meta",{property:"og:locale",content:o(a)}),Object.values(n).filter((e=>a!==e.htmlLang)).map((e=>(0,f.jsx)("meta",{property:"og:locale:alternate",content:o(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function C(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,g.A)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,g.A)(),{pathname:r}=(0,d.zy)();return e+(0,S.applyTrailingSlash)((0,b.Ay)(r),{trailingSlash:n,baseUrl:t})}(),a=t?`${n}${t}`:r;return(0,f.jsxs)(h.A,{children:[(0,f.jsx)("meta",{property:"og:url",content:a}),(0,f.jsx)("link",{rel:"canonical",href:a})]})}function A(){const{i18n:{currentLocale:e}}=(0,g.A)(),{metadata:t,image:n}=(0,y.p)();return(0,f.jsxs)(f.Fragment,{children:[(0,f.jsxs)(h.A,{children:[(0,f.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,f.jsx)("body",{className:k.w})]}),n&&(0,f.jsx)(v.be,{image:n}),(0,f.jsx)(C,{}),(0,f.jsx)(_,{}),(0,f.jsx)(E.A,{tag:x.Cy,locale:e}),(0,f.jsx)(h.A,{children:t.map(((e,t)=>(0,f.jsx)("meta",{...e},t)))})]})}const T=new Map;var P=n(6125),j=n(6988),L=n(205);function N(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];const a=c.map((t=>{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>a.forEach((e=>e?.()))}const R=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,L.A)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,a=t.hash===n.hash,o=t.search===n.search;if(r&&a&&!o)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),N("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function O(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,p.u)(u.A,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class D extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=s.A.canUseDOM?N("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=N("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),O(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return(0,f.jsx)(R,{previousLocation:this.previousLocation,location:t,children:(0,f.jsx)(d.qh,{location:t,render:()=>e})})}}const I=D,M="__docusaurus-base-url-issue-banner-container",F="__docusaurus-base-url-issue-banner",z="__docusaurus-base-url-issue-banner-suggestion-container";function B(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '${M}';\n var bannerHtml = ${JSON.stringify(function(e){return`\n<div id="${F}" style="border: thick solid red; background-color: rgb(255, 230, 179); margin: 20px; padding: 20px; font-size: 20px;">\n <p style="font-weight: bold; font-size: 30px;">Your Docusaurus site did not load properly.</p>\n <p>A very common reason is a wrong site <a href="https://docusaurus.io/docs/docusaurus.config.js/#baseUrl" style="font-weight: bold;">baseUrl configuration</a>.</p>\n <p>Current configured baseUrl = <span style="font-weight: bold; color: red;">${e}</span> ${"/"===e?" (default value)":""}</p>\n <p>We suggest trying baseUrl = <span id="${z}" style="font-weight: bold; color: green;"></span></p>\n</div>\n`}(e)).replace(/</g,"\\<")};\n bannerContainer.innerHTML = bannerHtml;\n document.body.prepend(bannerContainer);\n var suggestionContainer = document.getElementById('${z}');\n var actualHomePagePath = window.location.pathname;\n var suggestedBaseUrl = actualHomePagePath.substr(-1) === '/'\n ? actualHomePagePath\n : actualHomePagePath + '/';\n suggestionContainer.innerHTML = suggestedBaseUrl;\n}\n`}function $(){const{siteConfig:{baseUrl:e}}=(0,g.A)();return(0,f.jsx)(f.Fragment,{children:!s.A.canUseDOM&&(0,f.jsx)(h.A,{children:(0,f.jsx)("script",{children:B(e)})})})}function U(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,g.A)(),{pathname:n}=(0,d.zy)();return t&&n===e?(0,f.jsx)($,{}):null}function q(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:r,localeConfigs:a}}=(0,g.A)(),o=(0,b.Ay)(e),{htmlLang:i,direction:l}=a[r];return(0,f.jsxs)(h.A,{children:[(0,f.jsx)("html",{lang:i,dir:l}),(0,f.jsx)("title",{children:t}),(0,f.jsx)("meta",{property:"og:title",content:t}),(0,f.jsx)("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),n&&(0,f.jsx)("meta",{name:"robots",content:"noindex, nofollow"}),e&&(0,f.jsx)("link",{rel:"icon",href:o})]})}var H=n(7489),G=n(2303);function V(){const e=(0,G.A)();return(0,f.jsx)(h.A,{children:(0,f.jsx)("html",{"data-has-hydrated":e})})}const W=(0,p.v)(u.A);function Q(){const e=function(e){if(T.has(e.pathname))return{...e,pathname:T.get(e.pathname)};if((0,p.u)(u.A,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return T.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return T.set(e.pathname,t),{...e,pathname:t}}((0,d.zy)());return(0,f.jsx)(I,{location:e,children:W})}function K(){return(0,f.jsx)(H.A,{children:(0,f.jsx)(j.l,{children:(0,f.jsxs)(P.x,{children:[(0,f.jsxs)(m,{children:[(0,f.jsx)(q,{}),(0,f.jsx)(A,{}),(0,f.jsx)(U,{}),(0,f.jsx)(Q,{})]}),(0,f.jsx)(V,{})]})})})}var Y=n(4054);const Z=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const a=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;a?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var X=n(6921);const J=new Set,ee=new Set,te=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ne={prefetch:e=>{if(!(e=>!te()&&!ee.has(e)&&!J.has(e))(e))return!1;J.add(e);const t=(0,p.u)(u.A,e).flatMap((e=>{return t=e.route.path,Object.entries(Y).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,X.A)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Z(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!te()&&!ee.has(e))(e)&&(ee.add(e),O(e))},re=Object.freeze(ne);function ae(e){let{children:t}=e;return"hash"===l.default.future.experimental_router?(0,f.jsx)(i.I9,{children:t}):(0,f.jsx)(i.Kd,{children:t})}const oe=Boolean(!0);if(s.A.canUseDOM){window.docusaurus=re;const e=document.getElementById("__docusaurus"),t=(0,f.jsx)(o.vd,{children:(0,f.jsx)(ae,{children:(0,f.jsx)(K,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},i=()=>{if(window.docusaurusRoot)window.docusaurusRoot.render(t);else if(oe)window.docusaurusRoot=a.hydrateRoot(e,t,{onRecoverableError:n});else{const r=a.createRoot(e,{onRecoverableError:n});r.render(t),window.docusaurusRoot=r}};O(window.location.pathname).then((()=>{(0,r.startTransition)(i)}))}},6988:(e,t,n)=>{"use strict";n.d(t,{o:()=>d,l:()=>p});var r=n(6540),a=n(4784);const o=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/docs","mainDocId":"\u5e8f\u8a00/index","docs":[{"id":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/index","path":"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/","sidebar":"tutorialSidebar"},{"id":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/page info \u4fe1\u606f\u8bf4\u660e/index","path":"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/page info \u4fe1\u606f\u8bf4\u660e/","sidebar":"tutorialSidebar"},{"id":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/Pika \u6700\u4f73\u5b9e\u8df5/index","path":"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/Pika \u6700\u4f73\u5b9e\u8df5/","sidebar":"tutorialSidebar"},{"id":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5206\u5e03\u5f0f\u6a21\u5f0f\u7b80\u5355\u6559\u7a0b/index","path":"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5206\u5e03\u5f0f\u6a21\u5f0f\u7b80\u5355\u6559\u7a0b/","sidebar":"tutorialSidebar"},{"id":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5206\u7247\u6559\u7a0b/index","path":"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5206\u7247\u6559\u7a0b/","sidebar":"tutorialSidebar"},{"id":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u526f\u672c\u4e00\u81f4\u6027\uff08\u4f7f\u7528\u6587\u6863\uff09/index","path":"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u526f\u672c\u4e00\u81f4\u6027\uff08\u4f7f\u7528\u6587\u6863\uff09/","sidebar":"tutorialSidebar"},{"id":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u526f\u672c\u4e00\u81f4\u6027\uff08\u8bbe\u8ba1\u6587\u6863\uff09/index","path":"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u526f\u672c\u4e00\u81f4\u6027\uff08\u8bbe\u8ba1\u6587\u6863\uff09/","sidebar":"tutorialSidebar"},{"id":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u591a\u5e93\u7248\u547d\u4ee4/index","path":"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u591a\u5e93\u7248\u547d\u4ee4/","sidebar":"tutorialSidebar"},{"id":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5b89\u88c5\u4f7f\u7528/index","path":"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5b89\u88c5\u4f7f\u7528/","sidebar":"tutorialSidebar"},{"id":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5dee\u5f02\u5316\u547d\u4ee4/index","path":"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5dee\u5f02\u5316\u547d\u4ee4/","sidebar":"tutorialSidebar"},{"id":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u6570\u636e\u76ee\u5f55/index","path":"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u6570\u636e\u76ee\u5f55/","sidebar":"tutorialSidebar"},{"id":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u670d\u52a1\u5668\u72b6\u6001\u76d1\u63a7/index","path":"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u670d\u52a1\u5668\u72b6\u6001\u76d1\u63a7/","sidebar":"tutorialSidebar"},{"id":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u7ba1\u7406\u6307\u4ee4/index","path":"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u7ba1\u7406\u6307\u4ee4/","sidebar":"tutorialSidebar"},{"id":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u81ea\u52a8\u5bb9\u707e/index","path":"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u81ea\u52a8\u5bb9\u707e/","sidebar":"tutorialSidebar"},{"id":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u8ba2\u9605/index","path":"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u8ba2\u9605/","sidebar":"tutorialSidebar"},{"id":"\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u914d\u7f6e\u6587\u4ef6\u8bf4\u660e/index","path":"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u914d\u7f6e\u6587\u4ef6\u8bf4\u660e/","sidebar":"tutorialSidebar"},{"id":"\u5e8f\u8a00/FAQ/index","path":"/docs/\u5e8f\u8a00/FAQ/","sidebar":"tutorialSidebar"},{"id":"\u5e8f\u8a00/index","path":"/docs/\u5e8f\u8a00/","sidebar":"tutorialSidebar"},{"id":"\u5e8f\u8a00/\u652f\u6301\u7684 Redis \u63a5\u53e3\u4e0e\u517c\u5bb9\u60c5\u51b5/index","path":"/docs/\u5e8f\u8a00/\u652f\u6301\u7684 Redis \u63a5\u53e3\u4e0e\u517c\u5bb9\u60c5\u51b5/","sidebar":"tutorialSidebar"},{"id":"\u5e8f\u8a00/\u7b80\u4ecb/index","path":"/docs/\u5e8f\u8a00/\u7b80\u4ecb/","sidebar":"tutorialSidebar"},{"id":"\u5f00\u53d1\u6587\u6863/coding-style/index","path":"/docs/\u5f00\u53d1\u6587\u6863/coding-style/","sidebar":"tutorialSidebar"},{"id":"\u5f00\u53d1\u6587\u6863/index","path":"/docs/\u5f00\u53d1\u6587\u6863/","sidebar":"tutorialSidebar"},{"id":"\u5f00\u53d1\u6587\u6863/\u7f16\u7801\u89c4\u8303/index","path":"/docs/\u5f00\u53d1\u6587\u6863/\u7f16\u7801\u89c4\u8303/","sidebar":"tutorialSidebar"},{"id":"\u6027\u80fd\u4e0e\u4f18\u5316/3.2.x \u6027\u80fd/index","path":"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/3.2.x \u6027\u80fd/","sidebar":"tutorialSidebar"},{"id":"\u6027\u80fd\u4e0e\u4f18\u5316/index","path":"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/","sidebar":"tutorialSidebar"},{"id":"\u6027\u80fd\u4e0e\u4f18\u5316/Pika 3.5 \u53c2\u6570\u4f18\u5316\u624b\u518c/index","path":"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika 3.5 \u53c2\u6570\u4f18\u5316\u624b\u518c/","sidebar":"tutorialSidebar"},{"id":"\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/index","path":"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/","sidebar":"tutorialSidebar"},{"id":"\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/\u559c\u9a6c\u62c9\u96c5 Redis \u4e0e Pika \u7f13\u5b58\u4f7f\u7528\u519b\u89c4/index","path":"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/\u559c\u9a6c\u62c9\u96c5 Redis \u4e0e Pika \u7f13\u5b58\u4f7f\u7528\u519b\u89c4/","sidebar":"tutorialSidebar"},{"id":"\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/\u8c03\u6574 max-write-buffer-size \u4f18\u5316 pika \u6027\u80fd10\u500d\u7684\u6848\u4f8b/index","path":"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/\u8c03\u6574 max-write-buffer-size \u4f18\u5316 pika \u6027\u80fd10\u500d\u7684\u6848\u4f8b/","sidebar":"tutorialSidebar"},{"id":"\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u5185\u5b58\u4f7f\u7528/index","path":"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u5185\u5b58\u4f7f\u7528/","sidebar":"tutorialSidebar"},{"id":"\u6027\u80fd\u4e0e\u4f18\u5316/Redis \u4e0e Pika scan \u6027\u80fd\u5bf9\u6bd4/index","path":"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Redis \u4e0e Pika scan \u6027\u80fd\u5bf9\u6bd4/","sidebar":"tutorialSidebar"},{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/index","path":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/","sidebar":"tutorialSidebar"},{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/NoSQL \u539f\u7406\u6982\u8ff0/index","path":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/NoSQL \u539f\u7406\u6982\u8ff0/","sidebar":"tutorialSidebar"},{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4e0e Codis/index","path":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4e0e Codis/","sidebar":"tutorialSidebar"},{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/index","path":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/","sidebar":"tutorialSidebar"},{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u4e3b\u4ece\u540c\u6b65/index","path":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u4e3b\u4ece\u540c\u6b65/","sidebar":"tutorialSidebar"},{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u7ebf\u7a0b\u6a21\u578b/index","path":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u7ebf\u7a0b\u6a21\u578b/","sidebar":"tutorialSidebar"},{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u8bfb\u5199\u6d41\u7a0b/index","path":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u8bfb\u5199\u6d41\u7a0b/","sidebar":"tutorialSidebar"},{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/index","path":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/","sidebar":"tutorialSidebar"},{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/Pika \u548c RockSDB \u7684\u5bf9\u63a5/index","path":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/Pika \u548c RockSDB \u7684\u5bf9\u63a5/","sidebar":"tutorialSidebar"},{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/Pika \u7684\u547d\u4ee4\u6267\u884c\u6846\u67b6/index","path":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/Pika \u7684\u547d\u4ee4\u6267\u884c\u6846\u67b6/","sidebar":"tutorialSidebar"},{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/PubSub \u673a\u5236/index","path":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/PubSub \u673a\u5236/","sidebar":"tutorialSidebar"},{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/\u901a\u4fe1\u548c\u7ebf\u7a0b\u6a21\u578b/index","path":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/\u901a\u4fe1\u548c\u7ebf\u7a0b\u6a21\u578b/","sidebar":"tutorialSidebar"},{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u4e3b\u4ece\u540c\u6b65/index","path":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u4e3b\u4ece\u540c\u6b65/","sidebar":"tutorialSidebar"},{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u5168\u540c\u6b65/index","path":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u5168\u540c\u6b65/","sidebar":"tutorialSidebar"},{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u526f\u672c\u4e00\u81f4\u6027/index","path":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u526f\u672c\u4e00\u81f4\u6027/","sidebar":"tutorialSidebar"},{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u589e\u91cf\u540c\u6b65/index","path":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u589e\u91cf\u540c\u6b65/","sidebar":"tutorialSidebar"},{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u5feb\u7167\u5f0f\u5907\u4efd/index","path":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u5feb\u7167\u5f0f\u5907\u4efd/","sidebar":"tutorialSidebar"},{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u6574\u4f53\u6280\u672f\u67b6\u6784/index","path":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u6574\u4f53\u6280\u672f\u67b6\u6784/","sidebar":"tutorialSidebar"},{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65b0\u5b58\u50a8\u65b9\u6848\uff1a\u8be6\u7ec6\u89e3\u6790/index","path":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65b0\u5b58\u50a8\u65b9\u6848\uff1a\u8be6\u7ec6\u89e3\u6790/","sidebar":"tutorialSidebar"},{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65b0\u5b58\u50a8\u7ed3\u6784/index","path":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65b0\u5b58\u50a8\u7ed3\u6784/","sidebar":"tutorialSidebar"},{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65e7\u5b58\u50a8\u7ed3\u6784/index","path":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65e7\u5b58\u50a8\u7ed3\u6784/","sidebar":"tutorialSidebar"},{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u7ebf\u7a0b\u6a21\u578b/index","path":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u7ebf\u7a0b\u6a21\u578b/","sidebar":"tutorialSidebar"},{"id":"\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u9501\u7684\u5e94\u7528/index","path":"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u9501\u7684\u5e94\u7528/","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/docs/\u5e8f\u8a00/","label":"\u5e8f\u8a00"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"zh-Hans","locales":["zh-Hans"],"path":"i18n","currentLocale":"zh-Hans","localeConfigs":{"zh-Hans":{"label":"\u7b80\u4f53\u4e2d\u6587","direction":"ltr","htmlLang":"zh-Hans","calendar":"gregory","path":"zh-Hans"}}}');var l=n(2654);const s=JSON.parse('{"docusaurusVersion":"3.4.0","siteVersion":"1.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.4.0"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.4.0"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.4.0"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.4.0"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.4.0"}}}');var c=n(4848);const u={siteConfig:a.default,siteMetadata:s,globalData:o,i18n:i,codeTranslations:l},d=r.createContext(u);function p(e){let{children:t}=e;return(0,c.jsx)(d.Provider,{value:u,children:t})}},7489:(e,t,n)=>{"use strict";n.d(t,{A:()=>h});var r=n(6540),a=n(8193),o=n(5260),i=n(440),l=n(781),s=n(3102),c=n(4848);function u(e){let{error:t,tryAgain:n}=e;return(0,c.jsxs)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"},children:[(0,c.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,c.jsx)("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,c.jsx)(d,{error:t})]})}function d(e){let{error:t}=e;const n=(0,i.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,c.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function p(e){let{children:t}=e;return(0,c.jsx)(s.W,{value:{plugin:{name:"docusaurus-core-error-boundary",id:"default"}},children:t})}function f(e){let{error:t,tryAgain:n}=e;return(0,c.jsx)(p,{children:(0,c.jsxs)(h,{fallback:()=>(0,c.jsx)(u,{error:t,tryAgain:n}),children:[(0,c.jsx)(o.A,{children:(0,c.jsx)("title",{children:"Page Error"})}),(0,c.jsx)(l.A,{children:(0,c.jsx)(u,{error:t,tryAgain:n})})]})})}const m=e=>(0,c.jsx)(f,{...e});class h extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.A.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??m)(e)}return e??null}}},8193:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,a={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5260:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});n(6540);var r=n(545),a=n(4848);function o(e){return(0,a.jsx)(r.mg,{...e})}},8774:(e,t,n)=>{"use strict";n.d(t,{A:()=>f});var r=n(6540),a=n(4625),o=n(440),i=n(4586),l=n(6654),s=n(8193),c=n(3427),u=n(6025),d=n(4848);function p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:m,isActive:h,"data-noBrokenLinkCheck":g,autoAddBaseUrl:b=!0,...y}=e;const{siteConfig:v}=(0,i.A)(),{trailingSlash:w,baseUrl:k}=v,x=v.future.experimental_router,{withBaseUrl:S}=(0,u.hH)(),E=(0,c.A)(),_=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>_.current));const C=p||f;const A=(0,l.A)(C),T=C?.replace("pathname://","");let P=void 0!==T?(j=T,b&&(e=>e.startsWith("/"))(j)?S(j):j):void 0;var j;"hash"===x&&P?.startsWith("./")&&(P=P?.slice(1)),P&&A&&(P=(0,o.applyTrailingSlash)(P,{trailingSlash:w,baseUrl:k}));const L=(0,r.useRef)(!1),N=n?a.k2:a.N_,R=s.A.canUseIntersectionObserver,O=(0,r.useRef)(),D=()=>{L.current||null==P||(window.docusaurus.preload(P),L.current=!0)};(0,r.useEffect)((()=>(!R&&A&&null!=P&&window.docusaurus.prefetch(P),()=>{R&&O.current&&O.current.disconnect()})),[O,P,R,A]);const I=P?.startsWith("#")??!1,M=!y.target||"_self"===y.target,F=!P||!A||!M;return g||!I&&F||E.collectLink(P),y.id&&E.collectAnchor(y.id),F?(0,d.jsx)("a",{ref:_,href:P,...C&&!A&&{target:"_blank",rel:"noopener noreferrer"},...y}):(0,d.jsx)(N,{...y,onMouseEnter:D,onTouchStart:D,innerRef:e=>{_.current=e,R&&e&&A&&(O.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(O.current.unobserve(e),O.current.disconnect(),null!=P&&window.docusaurus.prefetch(P))}))})),O.current.observe(e))},to:P,...n&&{isActive:h,activeClassName:m}})}const f=r.forwardRef(p)},418:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});const r=()=>null},1312:(e,t,n)=>{"use strict";n.d(t,{A:()=>c,T:()=>s});var r=n(6540),a=n(4848);function o(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var i=n(2654);function l(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return i[t??n]??n??t}function s(e,t){let{message:n,id:r}=e;return o(l({message:n,id:r}),t)}function c(e){let{children:t,id:n,values:r}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal <Translate> children",t),new Error("The Docusaurus <Translate> component only accept simple string values");const i=l({message:t,id:n});return(0,a.jsx)(a.Fragment,{children:o(i,r)})}},7065:(e,t,n)=>{"use strict";n.d(t,{W:()=>r});const r="default"},6654:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{A:()=>a,z:()=>r})},6025:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>l,hH:()=>i});var r=n(6540),a=n(4586),o=n(6654);function i(){const{siteConfig:e}=(0,a.A)(),{baseUrl:t,url:n}=e,i=e.future.experimental_router,l=(0,r.useCallback)(((e,r)=>function(e){let{siteUrl:t,baseUrl:n,url:r,options:{forcePrependBaseUrl:a=!1,absolute:i=!1}={},router:l}=e;if(!r||r.startsWith("#")||(0,o.z)(r))return r;if("hash"===l)return r.startsWith("/")?`.${r}`:`./${r}`;if(a)return n+r.replace(/^\//,"");if(r===n.replace(/\/$/,""))return n;const s=r.startsWith(n)?r:n+r.replace(/^\//,"");return i?t+s:s}({siteUrl:n,baseUrl:t,url:e,options:r,router:i})),[n,t,i]);return{withBaseUrl:l}}function l(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},3427:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(6540);n(4848);const a=r.createContext({collectAnchor:()=>{},collectLink:()=>{}}),o=()=>(0,r.useContext)(a);function i(){return o()}},4586:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540),a=n(6988);function o(){return(0,r.useContext)(a.o)}},2303:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540),a=n(6125);function o(){return(0,r.useContext)(a.o)}},205:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540);const a=n(8193).A.canUseDOM?r.useLayoutEffect:r.useEffect},6803:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540),a=n(3102);function o(){const e=r.useContext(a.o);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}},6921:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function a(e){const t={};return function e(n,a){Object.entries(n).forEach((n=>{let[o,i]=n;const l=a?`${a}.${o}`:o;r(i)?e(i,l):t[l]=i}))}(e),t}},3102:(e,t,n)=>{"use strict";n.d(t,{W:()=>i,o:()=>o});var r=n(6540),a=n(4848);const o=r.createContext(null);function i(e){let{children:t,value:n}=e;const i=r.useContext(o),l=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:i,value:n})),[i,n]);return(0,a.jsx)(o.Provider,{value:l,children:t})}},4070:(e,t,n)=>{"use strict";n.d(t,{zK:()=>h,vT:()=>p,Gy:()=>u,HW:()=>g,ht:()=>d,r7:()=>m,jh:()=>f});var r=n(6347),a=n(4586),o=n(7065);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,a.A)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const l=e=>e.versions.find((e=>e.isLast));function s(e,t){const n=function(e,t){const n=l(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.B6)(t,{path:e.path,exact:!1,strict:!1})))}(e,t),a=n?.docs.find((e=>!!(0,r.B6)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:a,alternateDocVersions:a?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(a.id):{}}}const c={},u=()=>i("docusaurus-plugin-content-docs")??c,d=e=>{try{return function(e,t,n){void 0===t&&(t=o.W),void 0===n&&(n={});const r=i(e),a=r?.[t];if(!a&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return a}("docusaurus-plugin-content-docs",e,{failfast:!0})}catch(t){throw new Error("You are using a feature of the Docusaurus docs plugin, but this plugin does not seem to be enabled"+("Default"===e?"":` (pluginId=${e}`),{cause:t})}};function p(e){void 0===e&&(e={});const t=u(),{pathname:n}=(0,r.zy)();return function(e,t,n){void 0===n&&(n={});const a=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.B6)(t,{path:n.path,exact:!1,strict:!1})})),o=a?{pluginId:a[0],pluginData:a[1]}:void 0;if(!o&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return o}(t,n,e)}function f(e){return d(e).versions}function m(e){const t=d(e);return l(t)}function h(e){const t=d(e),{pathname:n}=(0,r.zy)();return s(t,n)}function g(e){const t=d(e),{pathname:n}=(0,r.zy)();return function(e,t){const n=l(e);return{latestDocSuggestion:s(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},6294:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(5947),a=n.n(r);a().configure({showSpinner:!1});const o={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{a().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){a().done()}}},6134:(e,t,n)=>{"use strict";var r=n(1765),a=n(4784);!function(e){const{themeConfig:{prism:t}}=a.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(9700),n(8692)(`./prism-${e}`)})),delete globalThis.Prism}(r.My)},1107:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(6540);var r=n(4164),a=n(1312),o=n(6342),i=n(8774),l=n(3427);const s={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var c=n(4848);function u(e){let{as:t,id:n,...u}=e;const d=(0,l.A)(),{navbar:{hideOnScroll:p}}=(0,o.p)();if("h1"===t||!n)return(0,c.jsx)(t,{...u,id:void 0});d.collectAnchor(n);const f=(0,a.T)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof u.children?u.children:n});return(0,c.jsxs)(t,{...u,className:(0,r.A)("anchor",p?s.anchorWithHideOnScrollNavbar:s.anchorWithStickyNavbar,u.className),id:n,children:[u.children,(0,c.jsx)(i.A,{className:"hash-link",to:`#${n}`,"aria-label":f,title:f,children:"\u200b"})]})}},3186:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});n(6540);const r={iconExternalLink:"iconExternalLink_nPIU"};var a=n(4848);function o(e){let{width:t=13.5,height:n=13.5}=e;return(0,a.jsx)("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink,children:(0,a.jsx)("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"})})}},781:(e,t,n)=>{"use strict";n.d(t,{A:()=>ft});var r=n(6540),a=n(4164),o=n(7489),i=n(1213),l=n(6347),s=n(1312),c=n(5062),u=n(4848);const d="__docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,r.useRef)(null),{action:t}=(0,l.W6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&p(t)}),[]);return(0,c.$)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const m=(0,s.T)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function h(e){const t=e.children??m,{containerRef:n,onClick:r}=f();return(0,u.jsx)("div",{ref:n,role:"region","aria-label":m,children:(0,u.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var g=n(7559),b=n(4090);const y={skipToContent:"skipToContent_fXgn"};function v(){return(0,u.jsx)(h,{className:y.skipToContent})}var w=n(6342),k=n(5041);function x(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:a=1.2,className:o,...i}=e;return(0,u.jsx)("svg",{viewBox:"0 0 15 15",width:t,height:n,...i,children:(0,u.jsx)("g",{stroke:r,strokeWidth:a,children:(0,u.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const S={closeButton:"closeButton_CVFx"};function E(e){return(0,u.jsx)("button",{type:"button","aria-label":(0,s.T)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,a.A)("clean-btn close",S.closeButton,e.className),children:(0,u.jsx)(x,{width:14,height:14,strokeWidth:3.1})})}const _={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,w.p)(),{content:n}=t;return(0,u.jsx)("div",{...e,className:(0,a.A)(_.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const A={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function T(){const{announcementBar:e}=(0,w.p)(),{isActive:t,close:n}=(0,k.M)();if(!t)return null;const{backgroundColor:r,textColor:a,isCloseable:o}=e;return(0,u.jsxs)("div",{className:A.announcementBar,style:{backgroundColor:r,color:a},role:"banner",children:[o&&(0,u.jsx)("div",{className:A.announcementBarPlaceholder}),(0,u.jsx)(C,{className:A.announcementBarContent}),o&&(0,u.jsx)(E,{onClick:n,className:A.announcementBarClose})]})}var P=n(9876),j=n(3104);var L=n(9532),N=n(5600);const R=r.createContext(null);function O(e){let{children:t}=e;const n=function(){const e=(0,P.M)(),t=(0,N.YL)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,L.ZC)(o);return(0,r.useEffect)((()=>{o&&!i&&a(!0)}),[o,i]),(0,r.useEffect)((()=>{o?e.shown||a(!0):a(!1)}),[e.shown,o]),(0,r.useMemo)((()=>[n,a]),[n])}();return(0,u.jsx)(R.Provider,{value:n,children:t})}function D(e){if(e.component){const t=e.component;return(0,u.jsx)(t,{...e.props})}}function I(){const e=(0,r.useContext)(R);if(!e)throw new L.dV("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,N.YL)();return(0,r.useMemo)((()=>({shown:t,hide:a,content:D(o)})),[a,o,t])}function M(e){let{header:t,primaryMenu:n,secondaryMenu:r}=e;const{shown:o}=I();return(0,u.jsxs)("div",{className:"navbar-sidebar",children:[t,(0,u.jsxs)("div",{className:(0,a.A)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":o}),children:[(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:n}),(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:r})]})]})}var F=n(5293),z=n(2303);function B(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"})})}function $(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"})})}const U={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function q(e){let{className:t,buttonClassName:n,value:r,onChange:o}=e;const i=(0,z.A)(),l=(0,s.T)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===r?(0,s.T)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,s.T)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,u.jsx)("div",{className:(0,a.A)(U.toggle,t),children:(0,u.jsxs)("button",{className:(0,a.A)("clean-btn",U.toggleButton,!i&&U.toggleButtonDisabled,n),type:"button",onClick:()=>o("dark"===r?"light":"dark"),disabled:!i,title:l,"aria-label":l,"aria-live":"polite",children:[(0,u.jsx)(B,{className:(0,a.A)(U.toggleIcon,U.lightToggleIcon)}),(0,u.jsx)($,{className:(0,a.A)(U.toggleIcon,U.darkToggleIcon)})]})})}const H=r.memo(q),G={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function V(e){let{className:t}=e;const n=(0,w.p)().navbar.style,r=(0,w.p)().colorMode.disableSwitch,{colorMode:a,setColorMode:o}=(0,F.G)();return r?null:(0,u.jsx)(H,{className:t,buttonClassName:"dark"===n?G.darkNavbarColorModeToggle:void 0,value:a,onChange:o})}var W=n(3465);function Q(){return(0,u.jsx)(W.A,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function K(){const e=(0,P.M)();return(0,u.jsx)("button",{type:"button","aria-label":(0,s.T)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle(),children:(0,u.jsx)(x,{color:"var(--ifm-color-emphasis-600)"})})}function Y(){return(0,u.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,u.jsx)(Q,{}),(0,u.jsx)(V,{className:"margin-right--md"}),(0,u.jsx)(K,{})]})}var Z=n(8774),X=n(6025),J=n(6654);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(3186);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:a,label:o,html:i,isDropdownLink:l,prependBaseUrlToHref:s,...c}=e;const d=(0,X.Ay)(r),p=(0,X.Ay)(t),f=(0,X.Ay)(a,{forcePrependBaseUrl:!0}),m=o&&a&&!(0,J.A)(a),h=i?{dangerouslySetInnerHTML:{__html:i}}:{children:(0,u.jsxs)(u.Fragment,{children:[o,m&&(0,u.jsx)(te.A,{...l&&{width:12,height:12}})]})};return a?(0,u.jsx)(Z.A,{href:s?f:a,...c,...h}):(0,u.jsx)(Z.A,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(p)},...c,...h})}function re(e){let{className:t,isDropdownItem:n=!1,...r}=e;const o=(0,u.jsx)(ne,{className:(0,a.A)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n,...r});return n?(0,u.jsx)("li",{children:o}):o}function ae(e){let{className:t,isDropdownItem:n,...r}=e;return(0,u.jsx)("li",{className:"menu__list-item",children:(0,u.jsx)(ne,{className:(0,a.A)("menu__link",t),...r})})}function oe(e){let{mobile:t=!1,position:n,...r}=e;const a=t?ae:re;return(0,u.jsx)(a,{...r,activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")})}var ie=n(1422),le=n(9169),se=n(4586);const ce={dropdownNavbarItemMobile:"dropdownNavbarItemMobile_S0Fm"};function ue(e,t){return e.some((e=>function(e,t){return!!(0,le.ys)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function de(e){let{items:t,position:n,className:o,onClick:i,...l}=e;const s=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{s.current&&!s.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[s]),(0,u.jsxs)("div",{ref:s,className:(0,a.A)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c}),children:[(0,u.jsx)(ne,{"aria-haspopup":"true","aria-expanded":c,role:"button",href:l.to?void 0:"#",className:(0,a.A)("navbar__link",o),...l,onClick:l.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))},children:l.children??l.label}),(0,u.jsx)("ul",{className:"dropdown__menu",children:t.map(((e,t)=>(0,r.createElement)(_e,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function pe(e){let{items:t,className:n,position:o,onClick:i,...s}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,se.A)(),{pathname:t}=(0,l.zy)();return t.replace(e,"/")}(),d=ue(t,c),{collapsed:p,toggleCollapsed:f,setCollapsed:m}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&m(!d)}),[c,d,m]),(0,u.jsxs)("li",{className:(0,a.A)("menu__list-item",{"menu__list-item--collapsed":p}),children:[(0,u.jsx)(ne,{role:"button",className:(0,a.A)(ce.dropdownNavbarItemMobile,"menu__link menu__link--sublist menu__link--sublist-caret",n),...s,onClick:e=>{e.preventDefault(),f()},children:s.children??s.label}),(0,u.jsx)(ie.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:p,children:t.map(((e,t)=>(0,r.createElement)(_e,{mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active",...e,key:t})))})]})}function fe(e){let{mobile:t=!1,...n}=e;const r=t?pe:de;return(0,u.jsx)(r,{...n})}var me=n(2131);function he(e){let{width:t=20,height:n=20,...r}=e;return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0,...r,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"})})}const ge="iconLanguage_nlXk";var be=n(418);const ye={navbarSearchContainer:"navbarSearchContainer_Bca1"};function ve(e){let{children:t,className:n}=e;return(0,u.jsx)("div",{className:(0,a.A)(n,ye.navbarSearchContainer),children:t})}var we=n(4070),ke=n(1754);var xe=n(5597);const Se=e=>e.docs.find((t=>t.id===e.mainDocId));const Ee={default:oe,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,queryString:a="",...o}=e;const{i18n:{currentLocale:i,locales:c,localeConfigs:d}}=(0,se.A)(),p=(0,me.o)(),{search:f,hash:m}=(0,l.zy)(),h=[...n,...c.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${m}${a}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...r],g=t?(0,s.T)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return(0,u.jsx)(fe,{...o,mobile:t,label:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(he,{className:ge}),g]}),items:h})},search:function(e){let{mobile:t,className:n}=e;return t?null:(0,u.jsx)(ve,{className:n,children:(0,u.jsx)(be.A,{})})},dropdown:fe,html:function(e){let{value:t,className:n,mobile:r=!1,isDropdownItem:o=!1}=e;const i=o?"li":"div";return(0,u.jsx)(i,{className:(0,a.A)({navbar__item:!r&&!o,"menu__list-item":r},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...a}=e;const{activeDoc:o}=(0,we.zK)(r),i=(0,ke.QB)(t,r),l=o?.path===i?.path;return null===i||i.unlisted&&!l?null:(0,u.jsx)(oe,{exact:!0,...a,isActive:()=>l||!!o?.sidebar&&o.sidebar===i.sidebar,label:n??i.id,to:i.path})},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...a}=e;const{activeDoc:o}=(0,we.zK)(r),i=(0,ke.fW)(t,r).link;if(!i)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return(0,u.jsx)(oe,{exact:!0,...a,isActive:()=>o?.sidebar===t,label:n??i.label,to:i.path})},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...a}=e;const o=(0,ke.Vd)(r)[0],i=t??o.label,l=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(o).path;return(0,u.jsx)(oe,{...a,label:i,to:l})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:a,dropdownItemsAfter:o,...i}=e;const{search:c,hash:d}=(0,l.zy)(),p=(0,we.zK)(n),f=(0,we.jh)(n),{savePreferredVersionName:m}=(0,xe.g1)(n),h=[...a,...f.map((e=>{const t=p.alternateDocVersions[e.name]??Se(e);return{label:e.label,to:`${t.path}${c}${d}`,isActive:()=>e===p.activeVersion,onClick:()=>m(e.name)}})),...o],g=(0,ke.Vd)(n)[0],b=t&&h.length>1?(0,s.T)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):g.label,y=t&&h.length>1?void 0:Se(g).path;return h.length<=1?(0,u.jsx)(oe,{...i,mobile:t,label:b,to:y,isActive:r?()=>!1:void 0}):(0,u.jsx)(fe,{...i,mobile:t,label:b,to:y,items:h,isActive:r?()=>!1:void 0})}};function _e(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),a=Ee[r];if(!a)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,u.jsx)(a,{...n})}function Ce(){const e=(0,P.M)(),t=(0,w.p)().navbar.items;return(0,u.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,r.createElement)(_e,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function Ae(e){return(0,u.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,u.jsx)(s.A,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)",children:"\u2190 Back to main menu"})})}function Te(){const e=0===(0,w.p)().navbar.items.length,t=I();return(0,u.jsxs)(u.Fragment,{children:[!e&&(0,u.jsx)(Ae,{onClick:()=>t.hide()}),t.content]})}function Pe(){const e=(0,P.M)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?(0,u.jsx)(M,{header:(0,u.jsx)(Y,{}),primaryMenu:(0,u.jsx)(Ce,{}),secondaryMenu:(0,u.jsx)(Te,{})}):null}const je={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Le(e){return(0,u.jsx)("div",{role:"presentation",...e,className:(0,a.A)("navbar-sidebar__backdrop",e.className)})}function Ne(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,w.p)(),i=(0,P.M)(),{navbarRef:l,isNavbarVisible:d}=function(e){const[t,n]=(0,r.useState)(e),a=(0,r.useRef)(!1),o=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,j.Mq)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i<o.current)return void n(!0);if(a.current)return void(a.current=!1);const l=r?.scrollY,s=document.documentElement.scrollHeight-o.current,c=window.innerHeight;l&&i>=l?n(!1):i+c<s&&n(!0)})),(0,c.$)((t=>{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return a.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return(0,u.jsxs)("nav",{ref:l,"aria-label":(0,s.T)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,a.A)("navbar","navbar--fixed-top",n&&[je.navbarHideable,!d&&je.navbarHidden],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown}),children:[t,(0,u.jsx)(Le,{onClick:i.toggle}),(0,u.jsx)(Pe,{})]})}var Re=n(440);const Oe={errorBoundaryError:"errorBoundaryError_a6uf",errorBoundaryFallback:"errorBoundaryFallback_VBag"};function De(e){return(0,u.jsx)("button",{type:"button",...e,children:(0,u.jsx)(s.A,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error",children:"Try again"})})}function Ie(e){let{error:t}=e;const n=(0,Re.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,u.jsx)("p",{className:Oe.errorBoundaryError,children:n})}class Me extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const Fe="right";function ze(e){let{width:t=30,height:n=30,className:r,...a}=e;return(0,u.jsx)("svg",{className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true",...a,children:(0,u.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function Be(){const{toggle:e,shown:t}=(0,P.M)();return(0,u.jsx)("button",{onClick:e,"aria-label":(0,s.T)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button",children:(0,u.jsx)(ze,{})})}const $e={colorModeToggle:"colorModeToggle_DEke"};function Ue(e){let{items:t}=e;return(0,u.jsx)(u.Fragment,{children:t.map(((e,t)=>(0,u.jsx)(Me,{onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t}),children:(0,u.jsx)(_e,{...e})},t)))})}function qe(e){let{left:t,right:n}=e;return(0,u.jsxs)("div",{className:"navbar__inner",children:[(0,u.jsx)("div",{className:"navbar__items",children:t}),(0,u.jsx)("div",{className:"navbar__items navbar__items--right",children:n})]})}function He(){const e=(0,P.M)(),t=(0,w.p)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??Fe)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),a=t.find((e=>"search"===e.type));return(0,u.jsx)(qe,{left:(0,u.jsxs)(u.Fragment,{children:[!e.disabled&&(0,u.jsx)(Be,{}),(0,u.jsx)(Q,{}),(0,u.jsx)(Ue,{items:n})]}),right:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(Ue,{items:r}),(0,u.jsx)(V,{className:$e.colorModeToggle}),!a&&(0,u.jsx)(ve,{children:(0,u.jsx)(be.A,{})})]})})}function Ge(){return(0,u.jsx)(Ne,{children:(0,u.jsx)(He,{})})}function Ve(e){let{item:t}=e;const{to:n,href:r,label:a,prependBaseUrlToHref:o,...i}=t,l=(0,X.Ay)(n),s=(0,X.Ay)(r,{forcePrependBaseUrl:!0});return(0,u.jsxs)(Z.A,{className:"footer__link-item",...r?{href:o?s:r}:{to:l},...i,children:[a,r&&!(0,J.A)(r)&&(0,u.jsx)(te.A,{})]})}function We(e){let{item:t}=e;return t.html?(0,u.jsx)("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)("li",{className:"footer__item",children:(0,u.jsx)(Ve,{item:t})},t.href??t.to)}function Qe(e){let{column:t}=e;return(0,u.jsxs)("div",{className:"col footer__col",children:[(0,u.jsx)("div",{className:"footer__title",children:t.title}),(0,u.jsx)("ul",{className:"footer__items clean-list",children:t.items.map(((e,t)=>(0,u.jsx)(We,{item:e},t)))})]})}function Ke(e){let{columns:t}=e;return(0,u.jsx)("div",{className:"row footer__links",children:t.map(((e,t)=>(0,u.jsx)(Qe,{column:e},t)))})}function Ye(){return(0,u.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function Ze(e){let{item:t}=e;return t.html?(0,u.jsx)("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)(Ve,{item:t})}function Xe(e){let{links:t}=e;return(0,u.jsx)("div",{className:"footer__links text--center",children:(0,u.jsx)("div",{className:"footer__links",children:t.map(((e,n)=>(0,u.jsxs)(r.Fragment,{children:[(0,u.jsx)(Ze,{item:e}),t.length!==n+1&&(0,u.jsx)(Ye,{})]},n)))})})}function Je(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,u.jsx)(Ke,{columns:t}):(0,u.jsx)(Xe,{links:t})}var et=n(1122);const tt={footerLogoLink:"footerLogoLink_BH7S"};function nt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.hH)(),r={light:n(t.src),dark:n(t.srcDark??t.src)};return(0,u.jsx)(et.A,{className:(0,a.A)("footer__logo",t.className),alt:t.alt,sources:r,width:t.width,height:t.height,style:t.style})}function rt(e){let{logo:t}=e;return t.href?(0,u.jsx)(Z.A,{href:t.href,className:tt.footerLogoLink,target:t.target,children:(0,u.jsx)(nt,{logo:t})}):(0,u.jsx)(nt,{logo:t})}function at(e){let{copyright:t}=e;return(0,u.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function ot(e){let{style:t,links:n,logo:r,copyright:o}=e;return(0,u.jsx)("footer",{className:(0,a.A)("footer",{"footer--dark":"dark"===t}),children:(0,u.jsxs)("div",{className:"container container-fluid",children:[n,(r||o)&&(0,u.jsxs)("div",{className:"footer__bottom text--center",children:[r&&(0,u.jsx)("div",{className:"margin-bottom--sm",children:r}),o]})]})})}function it(){const{footer:e}=(0,w.p)();if(!e)return null;const{copyright:t,links:n,logo:r,style:a}=e;return(0,u.jsx)(ot,{style:a,links:n&&n.length>0&&(0,u.jsx)(Je,{links:n}),logo:r&&(0,u.jsx)(rt,{logo:r}),copyright:t&&(0,u.jsx)(at,{copyright:t})})}const lt=r.memo(it),st=(0,L.fM)([F.a,k.o,j.Tv,xe.VQ,i.Jx,function(e){let{children:t}=e;return(0,u.jsx)(N.y_,{children:(0,u.jsx)(P.e,{children:(0,u.jsx)(O,{children:t})})})}]);function ct(e){let{children:t}=e;return(0,u.jsx)(st,{children:t})}var ut=n(1107);function dt(e){let{error:t,tryAgain:n}=e;return(0,u.jsx)("main",{className:"container margin-vert--xl",children:(0,u.jsx)("div",{className:"row",children:(0,u.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,u.jsx)(ut.A,{as:"h1",className:"hero__title",children:(0,u.jsx)(s.A,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed",children:"This page crashed."})}),(0,u.jsx)("div",{className:"margin-vert--lg",children:(0,u.jsx)(De,{onClick:n,className:"button button--primary shadow--lw"})}),(0,u.jsx)("hr",{}),(0,u.jsx)("div",{className:"margin-vert--md",children:(0,u.jsx)(Ie,{error:t})})]})})})}const pt={mainWrapper:"mainWrapper_z2l0"};function ft(e){const{children:t,noFooter:n,wrapperClassName:r,title:l,description:s}=e;return(0,b.J)(),(0,u.jsxs)(ct,{children:[(0,u.jsx)(i.be,{title:l,description:s}),(0,u.jsx)(v,{}),(0,u.jsx)(T,{}),(0,u.jsx)(Ge,{}),(0,u.jsx)("div",{id:d,className:(0,a.A)(g.G.wrapper.main,pt.mainWrapper,r),children:(0,u.jsx)(o.A,{fallback:e=>(0,u.jsx)(dt,{...e}),children:t})}),!n&&(0,u.jsx)(lt,{})]})}},3465:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(6540);var r=n(8774),a=n(6025),o=n(4586),i=n(6342),l=n(1122),s=n(4848);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const o={light:(0,a.Ay)(t.src),dark:(0,a.Ay)(t.srcDark||t.src)},i=(0,s.jsx)(l.A,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return r?(0,s.jsx)("div",{className:r,children:i}):i}function u(e){const{siteConfig:{title:t}}=(0,o.A)(),{navbar:{title:n,logo:l}}=(0,i.p)(),{imageClassName:u,titleClassName:d,...p}=e,f=(0,a.Ay)(l?.href||"/"),m=n?"":t,h=l?.alt??m;return(0,s.jsxs)(r.A,{to:f,...p,...l?.target&&{target:l.target},children:[l&&(0,s.jsx)(c,{logo:l,alt:h,imageClassName:u}),null!=n&&(0,s.jsx)("b",{className:d,children:n})]})}},1463:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});n(6540);var r=n(5260),a=n(4848);function o(e){let{locale:t,version:n,tag:o}=e;const i=t;return(0,a.jsxs)(r.A,{children:[t&&(0,a.jsx)("meta",{name:"docusaurus_locale",content:t}),n&&(0,a.jsx)("meta",{name:"docusaurus_version",content:n}),o&&(0,a.jsx)("meta",{name:"docusaurus_tag",content:o}),i&&(0,a.jsx)("meta",{name:"docsearch:language",content:i}),n&&(0,a.jsx)("meta",{name:"docsearch:version",content:n}),o&&(0,a.jsx)("meta",{name:"docsearch:docusaurus_tag",content:o})]})}},1122:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});var r=n(6540),a=n(4164),o=n(2303),i=n(5293);const l={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var s=n(4848);function c(e){let{className:t,children:n}=e;const c=(0,o.A)(),{colorMode:u}=(0,i.G)();return(0,s.jsx)(s.Fragment,{children:(c?"dark"===u?["dark"]:["light"]:["light","dark"]).map((e=>{const o=n({theme:e,className:(0,a.A)(t,l.themedComponent,l[`themedComponent--${e}`])});return(0,s.jsx)(r.Fragment,{children:o},e)}))})}function u(e){const{sources:t,className:n,alt:r,...a}=e;return(0,s.jsx)(c,{className:n,children:e=>{let{theme:n,className:o}=e;return(0,s.jsx)("img",{src:t[n],alt:r,className:o,...a})}})}},1422:(e,t,n)=>{"use strict";n.d(t,{N:()=>b,u:()=>c});var r=n(6540),a=n(8193),o=n(205),i=n(3109),l=n(4848);const s="ease-in-out";function c(e){let{initialState:t}=e;const[n,a]=(0,r.useState)(t??!1),o=(0,r.useCallback)((()=>{a((e=>!e))}),[]);return{collapsed:n,setCollapsed:a,toggleCollapsed:o}}const u={display:"none",overflow:"hidden",height:"0px"},d={display:"block",overflow:"visible",height:"auto"};function p(e,t){const n=t?u:d;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function f(e){let{collapsibleRef:t,collapsed:n,animation:a}=e;const o=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=a?.duration??function(e){if((0,i.O)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${a?.easing??s}`,height:`${t}px`}}function l(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return p(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(l(),requestAnimationFrame((()=>{e.style.height=u.height,e.style.overflow=u.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{l()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,a])}function m(e){if(!a.A.canUseDOM)return e?u:d}function h(e){let{as:t="div",collapsed:n,children:a,animation:o,onCollapseTransitionEnd:i,className:s,disableSSRStyle:c}=e;const u=(0,r.useRef)(null);return f({collapsibleRef:u,collapsed:n,animation:o}),(0,l.jsx)(t,{ref:u,style:c?void 0:m(n),onTransitionEnd:e=>{"height"===e.propertyName&&(p(u.current,n),i?.(n))},className:s,children:a})}function g(e){let{collapsed:t,...n}=e;const[a,i]=(0,r.useState)(!t),[s,c]=(0,r.useState)(t);return(0,o.A)((()=>{t||i(!0)}),[t]),(0,o.A)((()=>{a&&c(t)}),[a,t]),a?(0,l.jsx)(h,{...n,collapsed:s}):null}function b(e){let{lazy:t,...n}=e;const r=t?g:h;return(0,l.jsx)(r,{...n})}},5041:(e,t,n)=>{"use strict";n.d(t,{M:()=>h,o:()=>m});var r=n(6540),a=n(2303),o=n(679),i=n(9532),l=n(6342),s=n(4848);const c=(0,o.Wf)("docusaurus.announcement.dismiss"),u=(0,o.Wf)("docusaurus.announcement.id"),d=()=>"true"===c.get(),p=e=>c.set(String(e)),f=r.createContext(null);function m(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,l.p)(),t=(0,a.A)(),[n,o]=(0,r.useState)((()=>!!t&&d()));(0,r.useEffect)((()=>{o(d())}),[]);const i=(0,r.useCallback)((()=>{p(!0),o(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&p(!1),!r&&d()||o(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return(0,s.jsx)(f.Provider,{value:n,children:t})}function h(){const e=(0,r.useContext)(f);if(!e)throw new i.dV("AnnouncementBarProvider");return e}},5293:(e,t,n)=>{"use strict";n.d(t,{G:()=>b,a:()=>g});var r=n(6540),a=n(8193),o=n(9532),i=n(679),l=n(6342),s=n(4848);const c=r.createContext(void 0),u="theme",d=(0,i.Wf)(u),p={light:"light",dark:"dark"},f=e=>e===p.dark?p.dark:p.light,m=e=>a.A.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),h=e=>{d.set(f(e))};function g(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,l.p)(),[a,o]=(0,r.useState)(m(e));(0,r.useEffect)((()=>{t&&d.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:a=!0}=r;t?(o(t),a&&h(t)):(o(n?window.matchMedia("(prefers-color-scheme: dark)").matches?p.dark:p.light:e),d.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(a))}),[a]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=d.get();null!==t&&i(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const s=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||s.current?s.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:a,setColorMode:i,get isDarkTheme(){return a===p.dark},setLightTheme(){i(p.light)},setDarkTheme(){i(p.dark)}})),[a,i])}();return(0,s.jsx)(c.Provider,{value:n,children:t})}function b(){const e=(0,r.useContext)(c);if(null==e)throw new o.dV("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},5597:(e,t,n)=>{"use strict";n.d(t,{VQ:()=>b,g1:()=>v});var r=n(6540),a=n(4070),o=n(7065),i=n(6342),l=n(1754),s=n(9532),c=n(679),u=n(4848);const d=e=>`docs-preferred-version-${e}`,p={save:(e,t,n)=>{(0,c.Wf)(d(e),{persistence:t}).set(n)},read:(e,t)=>(0,c.Wf)(d(e),{persistence:t}).get(),clear:(e,t)=>{(0,c.Wf)(d(e),{persistence:t}).del()}},f=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const m=r.createContext(null);function h(){const e=(0,a.Gy)(),t=(0,i.p)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,l]=(0,r.useState)((()=>f(n)));(0,r.useEffect)((()=>{l(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(e){const t=p.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(p.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,a(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){p.save(e,t,n),l((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function g(e){let{children:t}=e;const n=h();return(0,u.jsx)(m.Provider,{value:n,children:t})}function b(e){let{children:t}=e;return l.C5?(0,u.jsx)(g,{children:t}):(0,u.jsx)(u.Fragment,{children:t})}function y(){const e=(0,r.useContext)(m);if(!e)throw new s.dV("DocsPreferredVersionContextProvider");return e}function v(e){void 0===e&&(e=o.W);const t=(0,a.ht)(e),[n,i]=y(),{preferredVersionName:l}=n[e];return{preferredVersion:t.versions.find((e=>e.name===l))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}},6588:(e,t,n)=>{"use strict";n.d(t,{V:()=>s,t:()=>c});var r=n(6540),a=n(9532),o=n(4848);const i=Symbol("EmptyContext"),l=r.createContext(i);function s(e){let{children:t,name:n,items:a}=e;const i=(0,r.useMemo)((()=>n&&a?{name:n,items:a}:null),[n,a]);return(0,o.jsx)(l.Provider,{value:i,children:t})}function c(){const e=(0,r.useContext)(l);if(e===i)throw new a.dV("DocsSidebarProvider");return e}},2252:(e,t,n)=>{"use strict";n.d(t,{n:()=>l,r:()=>s});var r=n(6540),a=n(9532),o=n(4848);const i=r.createContext(null);function l(e){let{children:t,version:n}=e;return(0,o.jsx)(i.Provider,{value:n,children:t})}function s(){const e=(0,r.useContext)(i);if(null===e)throw new a.dV("DocsVersionProvider");return e}},9876:(e,t,n)=>{"use strict";n.d(t,{e:()=>f,M:()=>m});var r=n(6540),a=n(5600),o=n(4581),i=n(6347),l=n(9532);function s(e){!function(e){const t=(0,i.W6)(),n=(0,l._q)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}var c=n(6342),u=n(4848);const d=r.createContext(void 0);function p(){const e=function(){const e=(0,a.YL)(),{items:t}=(0,c.p)().navbar;return 0===t.length&&!e.component}(),t=(0,o.l)(),n=!e&&"mobile"===t,[i,l]=(0,r.useState)(!1);s((()=>{if(i)return l(!1),!1}));const u=(0,r.useCallback)((()=>{l((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&l(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:u,shown:i})),[e,n,u,i])}function f(e){let{children:t}=e;const n=p();return(0,u.jsx)(d.Provider,{value:n,children:t})}function m(){const e=r.useContext(d);if(void 0===e)throw new l.dV("NavbarMobileSidebarProvider");return e}},5600:(e,t,n)=>{"use strict";n.d(t,{GX:()=>c,YL:()=>s,y_:()=>l});var r=n(6540),a=n(9532),o=n(4848);const i=r.createContext(null);function l(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return(0,o.jsx)(i.Provider,{value:n,children:t})}function s(){const e=(0,r.useContext)(i);if(!e)throw new a.dV("NavbarSecondaryMenuContentProvider");return e[0]}function c(e){let{component:t,props:n}=e;const o=(0,r.useContext)(i);if(!o)throw new a.dV("NavbarSecondaryMenuContentProvider");const[,l]=o,s=(0,a.Be)(n);return(0,r.useEffect)((()=>{l({component:t,props:s})}),[l,t,s]),(0,r.useEffect)((()=>()=>l({component:null,props:null})),[l]),null}},4090:(e,t,n)=>{"use strict";n.d(t,{w:()=>a,J:()=>o});var r=n(6540);const a="navigation-with-keyboard";function o(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(a),"mousedown"===e.type&&document.body.classList.remove(a)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(a),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},4581:(e,t,n)=>{"use strict";n.d(t,{l:()=>l});var r=n(6540),a=n(8193);const o={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function l(e){let{desktopBreakpoint:t=i}=void 0===e?{}:e;const[n,l]=(0,r.useState)((()=>"ssr"));return(0,r.useEffect)((()=>{function e(){l(function(e){if(!a.A.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>e?o.desktop:o.mobile}(t))}return e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[t]),n}},7559:(e,t,n)=>{"use strict";n.d(t,{G:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",unlistedBanner:"theme-unlisted-banner",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{blogFooterTagsRow:"theme-blog-footer-tags-row",blogFooterEditMetaRow:"theme-blog-footer-edit-meta-row"},pages:{pageFooterEditMetaRow:"theme-pages-footer-edit-meta-row"}}},3109:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{O:()=>r})},1754:(e,t,n)=>{"use strict";n.d(t,{Nr:()=>f,w8:()=>g,C5:()=>p,B5:()=>E,Vd:()=>k,QB:()=>S,fW:()=>x,OF:()=>w,Y:()=>y});var r=n(6540),a=n(6347),o=n(2831),i=n(4070),l=n(5597),s=n(2252),c=n(6588);function u(e){return Array.from(new Set(e))}var d=n(9169);const p=!!i.Gy;function f(e){return"link"!==e.type||e.unlisted?"category"===e.type?function(e){if(e.href&&!e.linkUnlisted)return e.href;for(const t of e.items){const e=f(t);if(e)return e}}(e):void 0:e.href}const m=(e,t)=>void 0!==e&&(0,d.ys)(e,t),h=(e,t)=>e.some((e=>g(e,t)));function g(e,t){return"link"===e.type?m(e.href,t):"category"===e.type&&(m(e.href,t)||h(e.items,t))}function b(e,t){switch(e.type){case"category":return g(e,t)||e.items.some((e=>b(e,t)));case"link":return!e.unlisted||g(e,t);default:return!0}}function y(e,t){return(0,r.useMemo)((()=>e.filter((e=>b(e,t)))),[e,t])}function v(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const a=[];return function e(t){for(const o of t)if("category"===o.type&&((0,d.ys)(o.href,n)||e(o.items))||"link"===o.type&&(0,d.ys)(o.href,n)){return r&&"category"!==o.type||a.unshift(o),!0}return!1}(t),a}function w(){const e=(0,c.t)(),{pathname:t}=(0,a.zy)(),n=(0,i.vT)()?.pluginData.breadcrumbs;return!1!==n&&e?v({sidebarItems:e.items,pathname:t}):null}function k(e){const{activeVersion:t}=(0,i.zK)(e),{preferredVersion:n}=(0,l.g1)(e),a=(0,i.r7)(e);return(0,r.useMemo)((()=>u([t,n,a].filter(Boolean))),[t,n,a])}function x(e,t){const n=k(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function S(e,t){const n=k(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${u(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function E(e){let{route:t}=e;const n=(0,a.zy)(),r=(0,s.r)(),i=t.routes,l=i.find((e=>(0,a.B6)(n.pathname,e)));if(!l)return null;const c=l.sidebar,u=c?r.docsSidebars[c]:void 0;return{docElement:(0,o.v)(i),sidebarName:c,sidebarItems:u}}},1213:(e,t,n)=>{"use strict";n.d(t,{e3:()=>p,be:()=>u,Jx:()=>f});var r=n(6540),a=n(4164),o=n(5260),i=n(6803),l=n(6025),s=n(4586);var c=n(4848);function u(e){let{title:t,description:n,keywords:r,image:a,children:i}=e;const u=function(e){const{siteConfig:t}=(0,s.A)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:d}=(0,l.hH)(),p=a?d(a,{absolute:!0}):void 0;return(0,c.jsxs)(o.A,{children:[t&&(0,c.jsx)("title",{children:u}),t&&(0,c.jsx)("meta",{property:"og:title",content:u}),n&&(0,c.jsx)("meta",{name:"description",content:n}),n&&(0,c.jsx)("meta",{property:"og:description",content:n}),r&&(0,c.jsx)("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),p&&(0,c.jsx)("meta",{property:"og:image",content:p}),p&&(0,c.jsx)("meta",{name:"twitter:image",content:p}),i]})}const d=r.createContext(void 0);function p(e){let{className:t,children:n}=e;const i=r.useContext(d),l=(0,a.A)(i,t);return(0,c.jsxs)(d.Provider,{value:l,children:[(0,c.jsx)(o.A,{children:(0,c.jsx)("html",{className:l})}),n]})}function f(e){let{children:t}=e;const n=(0,i.A)(),r=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const o=`plugin-id-${n.plugin.id}`;return(0,c.jsx)(p,{className:(0,a.A)(r,o),children:t})}},9532:(e,t,n)=>{"use strict";n.d(t,{Be:()=>c,ZC:()=>l,_q:()=>i,dV:()=>s,fM:()=>u});var r=n(6540),a=n(205),o=n(4848);function i(e){const t=(0,r.useRef)(e);return(0,a.A)((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function l(e){const t=(0,r.useRef)();return(0,a.A)((()=>{t.current=e})),t.current}class s extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?<name>\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function c(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function u(e){return t=>{let{children:n}=t;return(0,o.jsx)(o.Fragment,{children:e.reduceRight(((e,t)=>(0,o.jsx)(t,{children:e})),n)})}}},9169:(e,t,n)=>{"use strict";n.d(t,{Dt:()=>l,ys:()=>i});var r=n(6540),a=n(8328),o=n(4586);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function l(){const{baseUrl:e}=(0,o.A)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function a(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(a).flatMap((e=>e.routes??[])))}(n)}({routes:a.A,baseUrl:e})),[e])}},3104:(e,t,n)=>{"use strict";n.d(t,{Mq:()=>p,Tv:()=>c,gk:()=>f});var r=n(6540),a=n(8193),o=n(2303),i=(n(205),n(9532)),l=n(4848);const s=r.createContext(void 0);function c(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return(0,l.jsx)(s.Provider,{value:n,children:t})}function u(){const e=(0,r.useContext)(s);if(null==e)throw new i.dV("ScrollControllerProvider");return e}const d=()=>a.A.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function p(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=u(),a=(0,r.useRef)(d()),o=(0,i._q)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=d();o(e,a.current),a.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function f(){const e=(0,r.useRef)(null),t=(0,o.A)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const a=document.documentElement.scrollTop;(n&&a>e||!n&&a<e)&&(t=requestAnimationFrame(r),window.scrollTo(0,Math.floor(.85*(a-e))+e))}(),()=>t&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},2967:(e,t,n)=>{"use strict";n.d(t,{Cy:()=>r,tU:()=>a});n(4586);const r="default";function a(e,t){return`docs-${e}-${t}`}},679:(e,t,n)=>{"use strict";n.d(t,{Wf:()=>c});n(6540);const r=JSON.parse('{"N":"localStorage","M":""}'),a=r.N;function o(e){let{key:t,oldValue:n,newValue:r,storage:a}=e;if(n===r)return;const o=document.createEvent("StorageEvent");o.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,a),window.dispatchEvent(o)}function i(e){if(void 0===e&&(e=a),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,l||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),l=!0),null}var t}let l=!1;const s={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function c(e,t){const n=`${e}${r.M}`;if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(n);const a=i(t?.persistence);return null===a?s:{get:()=>{try{return a.getItem(n)}catch(e){return console.error(`Docusaurus storage error, can't get key=${n}`,e),null}},set:e=>{try{const t=a.getItem(n);a.setItem(n,e),o({key:n,oldValue:t,newValue:e,storage:a})}catch(t){console.error(`Docusaurus storage error, can't set ${n}=${e}`,t)}},del:()=>{try{const e=a.getItem(n);a.removeItem(n),o({key:n,oldValue:e,newValue:null,storage:a})}catch(e){console.error(`Docusaurus storage error, can't delete key=${n}`,e)}},listen:e=>{try{const t=t=>{t.storageArea===a&&t.key===n&&e(t)};return window.addEventListener("storage",t),()=>window.removeEventListener("storage",t)}catch(t){return console.error(`Docusaurus storage error, can't listen for changes of key=${n}`,t),()=>{}}}}}},2131:(e,t,n)=>{"use strict";n.d(t,{o:()=>i});var r=n(4586),a=n(6347),o=n(440);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:l}}=(0,r.A)(),{pathname:s}=(0,a.zy)(),c=(0,o.applyTrailingSlash)(s,{trailingSlash:n,baseUrl:e}),u=l===i?e:e.replace(`/${l}/`,"/"),d=c.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===i?`${u}`:`${u}${e}/`}(n)}${d}`}}}},5062:(e,t,n)=>{"use strict";n.d(t,{$:()=>i});var r=n(6540),a=n(6347),o=n(9532);function i(e){const t=(0,a.zy)(),n=(0,o.ZC)(t),i=(0,o._q)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6342:(e,t,n)=>{"use strict";n.d(t,{p:()=>a});var r=n(4586);function a(){return(0,r.A)().siteConfig.themeConfig}},2983:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.removeTrailingSlash=t.addLeadingSlash=t.addTrailingSlash=void 0;const r=n(2566);function a(e){return e.endsWith("/")?e:`${e}/`}function o(e){return(0,r.removeSuffix)(e,"/")}t.addTrailingSlash=a,t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[i]=e.split(/[#?]/),l="/"===i||i===r?i:(s=i,n?a(s):o(s));var s;return e.replace(i,l)},t.addLeadingSlash=function(e){return(0,r.addPrefix)(e,"/")},t.removeTrailingSlash=o},253:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},440:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=t.removePrefix=t.addSuffix=t.removeSuffix=t.addPrefix=t.removeTrailingSlash=t.addLeadingSlash=t.addTrailingSlash=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var a=n(2983);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}}),Object.defineProperty(t,"addTrailingSlash",{enumerable:!0,get:function(){return a.addTrailingSlash}}),Object.defineProperty(t,"addLeadingSlash",{enumerable:!0,get:function(){return a.addLeadingSlash}}),Object.defineProperty(t,"removeTrailingSlash",{enumerable:!0,get:function(){return a.removeTrailingSlash}});var o=n(2566);Object.defineProperty(t,"addPrefix",{enumerable:!0,get:function(){return o.addPrefix}}),Object.defineProperty(t,"removeSuffix",{enumerable:!0,get:function(){return o.removeSuffix}}),Object.defineProperty(t,"addSuffix",{enumerable:!0,get:function(){return o.addSuffix}}),Object.defineProperty(t,"removePrefix",{enumerable:!0,get:function(){return o.removePrefix}});var i=n(253);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return i.getErrorCausalChain}})},2566:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.removePrefix=t.addSuffix=t.removeSuffix=t.addPrefix=void 0,t.addPrefix=function(e,t){return e.startsWith(t)?e:`${t}${e}`},t.removeSuffix=function(e,t){return""===t?e:e.endsWith(t)?e.slice(0,-t.length):e},t.addSuffix=function(e,t){return e.endsWith(t)?e:`${e}${t}`},t.removePrefix=function(e,t){return e.startsWith(t)?e.slice(t.length):e}},1513:(e,t,n)=>{"use strict";n.d(t,{zR:()=>w,TM:()=>C,yJ:()=>f,sC:()=>T,AO:()=>p});var r=n(8168);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r<a;n+=1,r+=1)e[n]=e[r];e.pop()}const i=function(e,t){void 0===t&&(t="");var n,r=e&&e.split("/")||[],i=t&&t.split("/")||[],l=e&&a(e),s=t&&a(t),c=l||s;if(e&&a(e)?i=r:r.length&&(i.pop(),i=i.concat(r)),!i.length)return"/";if(i.length){var u=i[i.length-1];n="."===u||".."===u||""===u}else n=!1;for(var d=0,p=i.length;p>=0;p--){var f=i[p];"."===f?o(i,p):".."===f?(o(i,p),d++):d&&(o(i,p),d--)}if(!c)for(;d--;d)i.unshift("..");!c||""===i[0]||i[0]&&a(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};var l=n(1561);function s(e){return"/"===e.charAt(0)?e:"/"+e}function c(e){return"/"===e.charAt(0)?e.substr(1):e}function u(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function p(e){var t=e.pathname,n=e.search,r=e.hash,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function f(e,t,n,a){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",a=t.indexOf("#");-1!==a&&(r=t.substr(a),t=t.substr(0,a));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),o.state=t):(void 0===(o=(0,r.A)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function m(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];t.forEach((function(e){return e.apply(void 0,n)}))}}}var h=!("undefined"==typeof window||!window.document||!window.document.createElement);function g(e,t){t(window.confirm(e))}var b="popstate",y="hashchange";function v(){try{return window.history.state||{}}catch(e){return{}}}function w(e){void 0===e&&(e={}),h||(0,l.A)(!1);var t,n=window.history,a=(-1===(t=window.navigator.userAgent).indexOf("Android 2.")&&-1===t.indexOf("Android 4.0")||-1===t.indexOf("Mobile Safari")||-1!==t.indexOf("Chrome")||-1!==t.indexOf("Windows Phone"))&&window.history&&"pushState"in window.history,o=!(-1===window.navigator.userAgent.indexOf("Trident")),i=e,c=i.forceRefresh,w=void 0!==c&&c,k=i.getUserConfirmation,x=void 0===k?g:k,S=i.keyLength,E=void 0===S?6:S,_=e.basename?d(s(e.basename)):"";function C(e){var t=e||{},n=t.key,r=t.state,a=window.location,o=a.pathname+a.search+a.hash;return _&&(o=u(o,_)),f(o,r,n)}function A(){return Math.random().toString(36).substr(2,E)}var T=m();function P(e){(0,r.A)($,e),$.length=n.length,T.notifyListeners($.location,$.action)}function j(e){(function(e){return void 0===e.state&&-1===navigator.userAgent.indexOf("CriOS")})(e)||R(C(e.state))}function L(){R(C(v()))}var N=!1;function R(e){if(N)N=!1,P();else{T.confirmTransitionTo(e,"POP",x,(function(t){t?P({action:"POP",location:e}):function(e){var t=$.location,n=D.indexOf(t.key);-1===n&&(n=0);var r=D.indexOf(e.key);-1===r&&(r=0);var a=n-r;a&&(N=!0,M(a))}(e)}))}}var O=C(v()),D=[O.key];function I(e){return _+p(e)}function M(e){n.go(e)}var F=0;function z(e){1===(F+=e)&&1===e?(window.addEventListener(b,j),o&&window.addEventListener(y,L)):0===F&&(window.removeEventListener(b,j),o&&window.removeEventListener(y,L))}var B=!1;var $={length:n.length,action:"POP",location:O,createHref:I,push:function(e,t){var r="PUSH",o=f(e,t,A(),$.location);T.confirmTransitionTo(o,r,x,(function(e){if(e){var t=I(o),i=o.key,l=o.state;if(a)if(n.pushState({key:i,state:l},null,t),w)window.location.href=t;else{var s=D.indexOf($.location.key),c=D.slice(0,s+1);c.push(o.key),D=c,P({action:r,location:o})}else window.location.href=t}}))},replace:function(e,t){var r="REPLACE",o=f(e,t,A(),$.location);T.confirmTransitionTo(o,r,x,(function(e){if(e){var t=I(o),i=o.key,l=o.state;if(a)if(n.replaceState({key:i,state:l},null,t),w)window.location.replace(t);else{var s=D.indexOf($.location.key);-1!==s&&(D[s]=o.key),P({action:r,location:o})}else window.location.replace(t)}}))},go:M,goBack:function(){M(-1)},goForward:function(){M(1)},block:function(e){void 0===e&&(e=!1);var t=T.setPrompt(e);return B||(z(1),B=!0),function(){return B&&(B=!1,z(-1)),t()}},listen:function(e){var t=T.appendListener(e);return z(1),function(){z(-1),t()}}};return $}var k="hashchange",x={hashbang:{encodePath:function(e){return"!"===e.charAt(0)?e:"!/"+c(e)},decodePath:function(e){return"!"===e.charAt(0)?e.substr(1):e}},noslash:{encodePath:c,decodePath:s},slash:{encodePath:s,decodePath:s}};function S(e){var t=e.indexOf("#");return-1===t?e:e.slice(0,t)}function E(){var e=window.location.href,t=e.indexOf("#");return-1===t?"":e.substring(t+1)}function _(e){window.location.replace(S(window.location.href)+"#"+e)}function C(e){void 0===e&&(e={}),h||(0,l.A)(!1);var t=window.history,n=(window.navigator.userAgent.indexOf("Firefox"),e),a=n.getUserConfirmation,o=void 0===a?g:a,i=n.hashType,c=void 0===i?"slash":i,b=e.basename?d(s(e.basename)):"",y=x[c],v=y.encodePath,w=y.decodePath;function C(){var e=w(E());return b&&(e=u(e,b)),f(e)}var A=m();function T(e){(0,r.A)(B,e),B.length=t.length,A.notifyListeners(B.location,B.action)}var P=!1,j=null;function L(){var e,t,n=E(),r=v(n);if(n!==r)_(r);else{var a=C(),i=B.location;if(!P&&(t=a,(e=i).pathname===t.pathname&&e.search===t.search&&e.hash===t.hash))return;if(j===p(a))return;j=null,function(e){if(P)P=!1,T();else{var t="POP";A.confirmTransitionTo(e,t,o,(function(n){n?T({action:t,location:e}):function(e){var t=B.location,n=D.lastIndexOf(p(t));-1===n&&(n=0);var r=D.lastIndexOf(p(e));-1===r&&(r=0);var a=n-r;a&&(P=!0,I(a))}(e)}))}}(a)}}var N=E(),R=v(N);N!==R&&_(R);var O=C(),D=[p(O)];function I(e){t.go(e)}var M=0;function F(e){1===(M+=e)&&1===e?window.addEventListener(k,L):0===M&&window.removeEventListener(k,L)}var z=!1;var B={length:t.length,action:"POP",location:O,createHref:function(e){var t=document.querySelector("base"),n="";return t&&t.getAttribute("href")&&(n=S(window.location.href)),n+"#"+v(b+p(e))},push:function(e,t){var n="PUSH",r=f(e,void 0,void 0,B.location);A.confirmTransitionTo(r,n,o,(function(e){if(e){var t=p(r),a=v(b+t);if(E()!==a){j=t,function(e){window.location.hash=e}(a);var o=D.lastIndexOf(p(B.location)),i=D.slice(0,o+1);i.push(t),D=i,T({action:n,location:r})}else T()}}))},replace:function(e,t){var n="REPLACE",r=f(e,void 0,void 0,B.location);A.confirmTransitionTo(r,n,o,(function(e){if(e){var t=p(r),a=v(b+t);E()!==a&&(j=t,_(a));var o=D.indexOf(p(B.location));-1!==o&&(D[o]=t),T({action:n,location:r})}}))},go:I,goBack:function(){I(-1)},goForward:function(){I(1)},block:function(e){void 0===e&&(e=!1);var t=A.setPrompt(e);return z||(F(1),z=!0),function(){return z&&(z=!1,F(-1)),t()}},listen:function(e){var t=A.appendListener(e);return F(1),function(){F(-1),t()}}};return B}function A(e,t,n){return Math.min(Math.max(e,t),n)}function T(e){void 0===e&&(e={});var t=e,n=t.getUserConfirmation,a=t.initialEntries,o=void 0===a?["/"]:a,i=t.initialIndex,l=void 0===i?0:i,s=t.keyLength,c=void 0===s?6:s,u=m();function d(e){(0,r.A)(w,e),w.length=w.entries.length,u.notifyListeners(w.location,w.action)}function h(){return Math.random().toString(36).substr(2,c)}var g=A(l,0,o.length-1),b=o.map((function(e){return f(e,void 0,"string"==typeof e?h():e.key||h())})),y=p;function v(e){var t=A(w.index+e,0,w.entries.length-1),r=w.entries[t];u.confirmTransitionTo(r,"POP",n,(function(e){e?d({action:"POP",location:r,index:t}):d()}))}var w={length:b.length,action:"POP",location:b[g],index:g,entries:b,createHref:y,push:function(e,t){var r="PUSH",a=f(e,t,h(),w.location);u.confirmTransitionTo(a,r,n,(function(e){if(e){var t=w.index+1,n=w.entries.slice(0);n.length>t?n.splice(t,n.length-t,a):n.push(a),d({action:r,location:a,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",a=f(e,t,h(),w.location);u.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,d({action:r,location:a}))}))},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=w.index+e;return t>=0&&t<w.entries.length},block:function(e){return void 0===e&&(e=!1),u.setPrompt(e)},listen:function(e){return u.appendListener(e)}};return w}},4146:(e,t,n)=>{"use strict";var r=n(4363),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},l={};function s(e){return r.isMemo(e)?i:l[e.$$typeof]||a}l[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[r.Memo]=i;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var a=f(n);a&&a!==m&&e(t,a,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var l=s(t),h=s(n),g=0;g<i.length;++g){var b=i[g];if(!(o[b]||r&&r[b]||h&&h[b]||l&&l[b])){var y=p(n,b);try{c(t,b,y)}catch(v){}}}}return t}},311:e=>{"use strict";e.exports=function(e,t,n,r,a,o,i,l){if(!e){var s;if(void 0===t)s=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,r,a,o,i,l],u=0;(s=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw s.framesToPop=1,s}}},4634:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},119:(e,t,n)=>{"use strict";n.r(t)},1043:(e,t,n)=>{"use strict";n.r(t)},5947:function(e,t,n){var r,a;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'<div class="bar" role="bar"><div class="peg"></div></div><div class="spinner" role="spinner"><div class="spinner-icon"></div></div>'};function a(e,t,n){return e<t?t:e>n?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var a;return(a="translate3d"===r.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,a}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=a(e,r.minimum,1),n.status=1===e?null:e;var o=n.render(!t),c=o.querySelector(r.barSelector),u=r.speed,d=r.easing;return o.offsetWidth,l((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(c,i(e,u,d)),1===e?(s(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){s(o,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*a(Math.random()*t,.1,.95)),t=a(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var a,i=t.querySelector(r.barSelector),l=e?"-100":o(n.status||0),c=document.querySelector(r.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&f(a),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var l=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),s=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}function a(e){return e=n(e),t[e]||(t[e]=r(e))}function o(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,r,a=arguments;if(2==a.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,a[1],a[2])}}();function c(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=p(e),r=n+t;c(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=p(e);c(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(a="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=a)},5302:(e,t,n)=>{var r=n(4634);e.exports=f,e.exports.parse=o,e.exports.compile=function(e,t){return l(o(e,t),t)},e.exports.tokensToFunction=l,e.exports.tokensToRegExp=p;var a=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function o(e,t){for(var n,r=[],o=0,i=0,l="",u=t&&t.delimiter||"/";null!=(n=a.exec(e));){var d=n[0],p=n[1],f=n.index;if(l+=e.slice(i,f),i=f+d.length,p)l+=p[1];else{var m=e[i],h=n[2],g=n[3],b=n[4],y=n[5],v=n[6],w=n[7];l&&(r.push(l),l="");var k=null!=h&&null!=m&&m!==h,x="+"===v||"*"===v,S="?"===v||"*"===v,E=n[2]||u,_=b||y;r.push({name:g||o++,prefix:h||"",delimiter:E,optional:S,repeat:x,partial:k,asterisk:!!w,pattern:_?c(_):w?".*":"[^"+s(E)+"]+?"})}}return i<e.length&&(l+=e.substr(i)),l&&r.push(l),r}function i(e){return encodeURI(e).replace(/[\/?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}function l(e,t){for(var n=new Array(e.length),a=0;a<e.length;a++)"object"==typeof e[a]&&(n[a]=new RegExp("^(?:"+e[a].pattern+")$",d(t)));return function(t,a){for(var o="",l=t||{},s=(a||{}).pretty?i:encodeURIComponent,c=0;c<e.length;c++){var u=e[c];if("string"!=typeof u){var d,p=l[u.name];if(null==p){if(u.optional){u.partial&&(o+=u.prefix);continue}throw new TypeError('Expected "'+u.name+'" to be defined')}if(r(p)){if(!u.repeat)throw new TypeError('Expected "'+u.name+'" to not repeat, but received `'+JSON.stringify(p)+"`");if(0===p.length){if(u.optional)continue;throw new TypeError('Expected "'+u.name+'" to not be empty')}for(var f=0;f<p.length;f++){if(d=s(p[f]),!n[c].test(d))throw new TypeError('Expected all "'+u.name+'" to match "'+u.pattern+'", but received `'+JSON.stringify(d)+"`");o+=(0===f?u.prefix:u.delimiter)+d}}else{if(d=u.asterisk?encodeURI(p).replace(/[?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})):s(p),!n[c].test(d))throw new TypeError('Expected "'+u.name+'" to match "'+u.pattern+'", but received "'+d+'"');o+=u.prefix+d}}else o+=u}return o}}function s(e){return e.replace(/([.+*?=^!:${}()[\]|\/\\])/g,"\\$1")}function c(e){return e.replace(/([=!:$\/()])/g,"\\$1")}function u(e,t){return e.keys=t,e}function d(e){return e&&e.sensitive?"":"i"}function p(e,t,n){r(t)||(n=t||n,t=[]);for(var a=(n=n||{}).strict,o=!1!==n.end,i="",l=0;l<e.length;l++){var c=e[l];if("string"==typeof c)i+=s(c);else{var p=s(c.prefix),f="(?:"+c.pattern+")";t.push(c),c.repeat&&(f+="(?:"+p+f+")*"),i+=f=c.optional?c.partial?p+"("+f+")?":"(?:"+p+"("+f+"))?":p+"("+f+")"}}var m=s(n.delimiter||"/"),h=i.slice(-m.length)===m;return a||(i=(h?i.slice(0,-m.length):i)+"(?:"+m+"(?=$))?"),i+=o?"$":a&&h?"":"(?="+m+"|$)",u(new RegExp("^"+i,d(n)),t)}function f(e,t,n){return r(t)||(n=t||n,t=[]),n=n||{},e instanceof RegExp?function(e,t){var n=e.source.match(/\((?!\?)/g);if(n)for(var r=0;r<n.length;r++)t.push({name:r,prefix:null,delimiter:null,optional:!1,repeat:!1,partial:!1,asterisk:!1,pattern:null});return u(e,t)}(e,t):r(e)?function(e,t,n){for(var r=[],a=0;a<e.length;a++)r.push(f(e[a],t,n).source);return u(new RegExp("(?:"+r.join("|")+")",d(n)),t)}(e,t,n):function(e,t,n){return p(o(e,n),t,n)}(e,t,n)}},6969:e=>{e.exports&&(e.exports={core:{meta:{path:"components/prism-core.js",option:"mandatory"},core:"Core"},themes:{meta:{path:"themes/{id}.css",link:"index.html?theme={id}",exclusive:!0},prism:{title:"Default",option:"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{title:"Okaidia",owner:"ocodia"},"prism-twilight":{title:"Twilight",owner:"remybach"},"prism-coy":{title:"Coy",owner:"tshedor"},"prism-solarizedlight":{title:"Solarized Light",owner:"hectormatos2011 "},"prism-tomorrow":{title:"Tomorrow Night",owner:"Rosey"}},languages:{meta:{path:"components/prism-{id}",noCSS:!0,examplesPath:"examples/prism-{id}",addCheckAll:!0},markup:{title:"Markup",alias:["html","xml","svg","mathml","ssml","atom","rss"],aliasTitles:{html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",atom:"Atom",rss:"RSS"},option:"default"},css:{title:"CSS",option:"default",modify:"markup"},clike:{title:"C-like",option:"default"},javascript:{title:"JavaScript",require:"clike",modify:"markup",optional:"regex",alias:"js",option:"default"},abap:{title:"ABAP",owner:"dellagustin"},abnf:{title:"ABNF",owner:"RunDevelopment"},actionscript:{title:"ActionScript",require:"javascript",modify:"markup",owner:"Golmote"},ada:{title:"Ada",owner:"Lucretia"},agda:{title:"Agda",owner:"xy-ren"},al:{title:"AL",owner:"RunDevelopment"},antlr4:{title:"ANTLR4",alias:"g4",owner:"RunDevelopment"},apacheconf:{title:"Apache Configuration",owner:"GuiTeK"},apex:{title:"Apex",require:["clike","sql"],owner:"RunDevelopment"},apl:{title:"APL",owner:"ngn"},applescript:{title:"AppleScript",owner:"Golmote"},aql:{title:"AQL",owner:"RunDevelopment"},arduino:{title:"Arduino",require:"cpp",alias:"ino",owner:"dkern"},arff:{title:"ARFF",owner:"Golmote"},armasm:{title:"ARM Assembly",alias:"arm-asm",owner:"RunDevelopment"},arturo:{title:"Arturo",alias:"art",optional:["bash","css","javascript","markup","markdown","sql"],owner:"drkameleon"},asciidoc:{alias:"adoc",title:"AsciiDoc",owner:"Golmote"},aspnet:{title:"ASP.NET (C#)",require:["markup","csharp"],owner:"nauzilus"},asm6502:{title:"6502 Assembly",owner:"kzurawel"},asmatmel:{title:"Atmel AVR Assembly",owner:"cerkit"},autohotkey:{title:"AutoHotkey",owner:"aviaryan"},autoit:{title:"AutoIt",owner:"Golmote"},avisynth:{title:"AviSynth",alias:"avs",owner:"Zinfidel"},"avro-idl":{title:"Avro IDL",alias:"avdl",owner:"RunDevelopment"},awk:{title:"AWK",alias:"gawk",aliasTitles:{gawk:"GAWK"},owner:"RunDevelopment"},bash:{title:"Bash",alias:["sh","shell"],aliasTitles:{sh:"Shell",shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bbj:{title:"BBj",owner:"hyyan"},bicep:{title:"Bicep",owner:"johnnyreilly"},birb:{title:"Birb",require:"clike",owner:"Calamity210"},bison:{title:"Bison",require:"c",owner:"Golmote"},bnf:{title:"BNF",alias:"rbnf",aliasTitles:{rbnf:"RBNF"},owner:"RunDevelopment"},bqn:{title:"BQN",owner:"yewscion"},brainfuck:{title:"Brainfuck",owner:"Golmote"},brightscript:{title:"BrightScript",owner:"RunDevelopment"},bro:{title:"Bro",owner:"wayward710"},bsl:{title:"BSL (1C:Enterprise)",alias:"oscript",aliasTitles:{oscript:"OneScript"},owner:"Diversus23"},c:{title:"C",require:"clike",owner:"zeitgeist87"},csharp:{title:"C#",require:"clike",alias:["cs","dotnet"],owner:"mvalipour"},cpp:{title:"C++",require:"c",owner:"zeitgeist87"},cfscript:{title:"CFScript",require:"clike",alias:"cfc",owner:"mjclemente"},chaiscript:{title:"ChaiScript",require:["clike","cpp"],owner:"RunDevelopment"},cil:{title:"CIL",owner:"sbrl"},cilkc:{title:"Cilk/C",require:"c",alias:"cilk-c",owner:"OpenCilk"},cilkcpp:{title:"Cilk/C++",require:"cpp",alias:["cilk-cpp","cilk"],owner:"OpenCilk"},clojure:{title:"Clojure",owner:"troglotit"},cmake:{title:"CMake",owner:"mjrogozinski"},cobol:{title:"COBOL",owner:"RunDevelopment"},coffeescript:{title:"CoffeeScript",require:"javascript",alias:"coffee",owner:"R-osey"},concurnas:{title:"Concurnas",alias:"conc",owner:"jasontatton"},csp:{title:"Content-Security-Policy",owner:"ScottHelme"},cooklang:{title:"Cooklang",owner:"ahue"},coq:{title:"Coq",owner:"RunDevelopment"},crystal:{title:"Crystal",require:"ruby",owner:"MakeNowJust"},"css-extras":{title:"CSS Extras",require:"css",modify:"css",owner:"milesj"},csv:{title:"CSV",owner:"RunDevelopment"},cue:{title:"CUE",owner:"RunDevelopment"},cypher:{title:"Cypher",owner:"RunDevelopment"},d:{title:"D",require:"clike",owner:"Golmote"},dart:{title:"Dart",require:"clike",owner:"Golmote"},dataweave:{title:"DataWeave",owner:"machaval"},dax:{title:"DAX",owner:"peterbud"},dhall:{title:"Dhall",owner:"RunDevelopment"},diff:{title:"Diff",owner:"uranusjr"},django:{title:"Django/Jinja2",require:"markup-templating",alias:"jinja2",owner:"romanvm"},"dns-zone-file":{title:"DNS zone file",owner:"RunDevelopment",alias:"dns-zone"},docker:{title:"Docker",alias:"dockerfile",owner:"JustinBeckwith"},dot:{title:"DOT (Graphviz)",alias:"gv",optional:"markup",owner:"RunDevelopment"},ebnf:{title:"EBNF",owner:"RunDevelopment"},editorconfig:{title:"EditorConfig",owner:"osipxd"},eiffel:{title:"Eiffel",owner:"Conaclos"},ejs:{title:"EJS",require:["javascript","markup-templating"],owner:"RunDevelopment",alias:"eta",aliasTitles:{eta:"Eta"}},elixir:{title:"Elixir",owner:"Golmote"},elm:{title:"Elm",owner:"zwilias"},etlua:{title:"Embedded Lua templating",require:["lua","markup-templating"],owner:"RunDevelopment"},erb:{title:"ERB",require:["ruby","markup-templating"],owner:"Golmote"},erlang:{title:"Erlang",owner:"Golmote"},"excel-formula":{title:"Excel Formula",alias:["xlsx","xls"],owner:"RunDevelopment"},fsharp:{title:"F#",require:"clike",owner:"simonreynolds7"},factor:{title:"Factor",owner:"catb0t"},false:{title:"False",owner:"edukisto"},"firestore-security-rules":{title:"Firestore security rules",require:"clike",owner:"RunDevelopment"},flow:{title:"Flow",require:"javascript",owner:"Golmote"},fortran:{title:"Fortran",owner:"Golmote"},ftl:{title:"FreeMarker Template Language",require:"markup-templating",owner:"RunDevelopment"},gml:{title:"GameMaker Language",alias:"gamemakerlanguage",require:"clike",owner:"LiarOnce"},gap:{title:"GAP (CAS)",owner:"RunDevelopment"},gcode:{title:"G-code",owner:"RunDevelopment"},gdscript:{title:"GDScript",owner:"RunDevelopment"},gedcom:{title:"GEDCOM",owner:"Golmote"},gettext:{title:"gettext",alias:"po",owner:"RunDevelopment"},gherkin:{title:"Gherkin",owner:"hason"},git:{title:"Git",owner:"lgiraudel"},glsl:{title:"GLSL",require:"c",owner:"Golmote"},gn:{title:"GN",alias:"gni",owner:"RunDevelopment"},"linker-script":{title:"GNU Linker Script",alias:"ld",owner:"RunDevelopment"},go:{title:"Go",require:"clike",owner:"arnehormann"},"go-module":{title:"Go module",alias:"go-mod",owner:"RunDevelopment"},gradle:{title:"Gradle",require:"clike",owner:"zeabdelkhalek-badido18"},graphql:{title:"GraphQL",optional:"markdown",owner:"Golmote"},groovy:{title:"Groovy",require:"clike",owner:"robfletcher"},haml:{title:"Haml",require:"ruby",optional:["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],owner:"Golmote"},handlebars:{title:"Handlebars",require:"markup-templating",alias:["hbs","mustache"],aliasTitles:{mustache:"Mustache"},owner:"Golmote"},haskell:{title:"Haskell",alias:"hs",owner:"bholst"},haxe:{title:"Haxe",require:"clike",optional:"regex",owner:"Golmote"},hcl:{title:"HCL",owner:"outsideris"},hlsl:{title:"HLSL",require:"c",owner:"RunDevelopment"},hoon:{title:"Hoon",owner:"matildepark"},http:{title:"HTTP",optional:["csp","css","hpkp","hsts","javascript","json","markup","uri"],owner:"danielgtaylor"},hpkp:{title:"HTTP Public-Key-Pins",owner:"ScottHelme"},hsts:{title:"HTTP Strict-Transport-Security",owner:"ScottHelme"},ichigojam:{title:"IchigoJam",owner:"BlueCocoa"},icon:{title:"Icon",owner:"Golmote"},"icu-message-format":{title:"ICU Message Format",owner:"RunDevelopment"},idris:{title:"Idris",alias:"idr",owner:"KeenS",require:"haskell"},ignore:{title:".ignore",owner:"osipxd",alias:["gitignore","hgignore","npmignore"],aliasTitles:{gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore"}},inform7:{title:"Inform 7",owner:"Golmote"},ini:{title:"Ini",owner:"aviaryan"},io:{title:"Io",owner:"AlesTsurko"},j:{title:"J",owner:"Golmote"},java:{title:"Java",require:"clike",owner:"sherblot"},javadoc:{title:"JavaDoc",require:["markup","java","javadoclike"],modify:"java",optional:"scala",owner:"RunDevelopment"},javadoclike:{title:"JavaDoc-like",modify:["java","javascript","php"],owner:"RunDevelopment"},javastacktrace:{title:"Java stack trace",owner:"RunDevelopment"},jexl:{title:"Jexl",owner:"czosel"},jolie:{title:"Jolie",require:"clike",owner:"thesave"},jq:{title:"JQ",owner:"RunDevelopment"},jsdoc:{title:"JSDoc",require:["javascript","javadoclike","typescript"],modify:"javascript",optional:["actionscript","coffeescript"],owner:"RunDevelopment"},"js-extras":{title:"JS Extras",require:"javascript",modify:"javascript",optional:["actionscript","coffeescript","flow","n4js","typescript"],owner:"RunDevelopment"},json:{title:"JSON",alias:"webmanifest",aliasTitles:{webmanifest:"Web App Manifest"},owner:"CupOfTea696"},json5:{title:"JSON5",require:"json",owner:"RunDevelopment"},jsonp:{title:"JSONP",require:"json",owner:"RunDevelopment"},jsstacktrace:{title:"JS stack trace",owner:"sbrl"},"js-templates":{title:"JS Templates",require:"javascript",modify:"javascript",optional:["css","css-extras","graphql","markdown","markup","sql"],owner:"RunDevelopment"},julia:{title:"Julia",owner:"cdagnino"},keepalived:{title:"Keepalived Configure",owner:"dev-itsheng"},keyman:{title:"Keyman",owner:"mcdurdin"},kotlin:{title:"Kotlin",alias:["kt","kts"],aliasTitles:{kts:"Kotlin Script"},require:"clike",owner:"Golmote"},kumir:{title:"KuMir (\u041a\u0443\u041c\u0438\u0440)",alias:"kum",owner:"edukisto"},kusto:{title:"Kusto",owner:"RunDevelopment"},latex:{title:"LaTeX",alias:["tex","context"],aliasTitles:{tex:"TeX",context:"ConTeXt"},owner:"japborst"},latte:{title:"Latte",require:["clike","markup-templating","php"],owner:"nette"},less:{title:"Less",require:"css",optional:"css-extras",owner:"Golmote"},lilypond:{title:"LilyPond",require:"scheme",alias:"ly",owner:"RunDevelopment"},liquid:{title:"Liquid",require:"markup-templating",owner:"cinhtau"},lisp:{title:"Lisp",alias:["emacs","elisp","emacs-lisp"],owner:"JuanCaicedo"},livescript:{title:"LiveScript",owner:"Golmote"},llvm:{title:"LLVM IR",owner:"porglezomp"},log:{title:"Log file",optional:"javastacktrace",owner:"RunDevelopment"},lolcode:{title:"LOLCODE",owner:"Golmote"},lua:{title:"Lua",owner:"Golmote"},magma:{title:"Magma (CAS)",owner:"RunDevelopment"},makefile:{title:"Makefile",owner:"Golmote"},markdown:{title:"Markdown",require:"markup",optional:"yaml",alias:"md",owner:"Golmote"},"markup-templating":{title:"Markup templating",require:"markup",owner:"Golmote"},mata:{title:"Mata",owner:"RunDevelopment"},matlab:{title:"MATLAB",owner:"Golmote"},maxscript:{title:"MAXScript",owner:"RunDevelopment"},mel:{title:"MEL",owner:"Golmote"},mermaid:{title:"Mermaid",owner:"RunDevelopment"},metafont:{title:"METAFONT",owner:"LaeriExNihilo"},mizar:{title:"Mizar",owner:"Golmote"},mongodb:{title:"MongoDB",owner:"airs0urce",require:"javascript"},monkey:{title:"Monkey",owner:"Golmote"},moonscript:{title:"MoonScript",alias:"moon",owner:"RunDevelopment"},n1ql:{title:"N1QL",owner:"TMWilds"},n4js:{title:"N4JS",require:"javascript",optional:"jsdoc",alias:"n4jsd",owner:"bsmith-n4"},"nand2tetris-hdl":{title:"Nand To Tetris HDL",owner:"stephanmax"},naniscript:{title:"Naninovel Script",owner:"Elringus",alias:"nani"},nasm:{title:"NASM",owner:"rbmj"},neon:{title:"NEON",owner:"nette"},nevod:{title:"Nevod",owner:"nezaboodka"},nginx:{title:"nginx",owner:"volado"},nim:{title:"Nim",owner:"Golmote"},nix:{title:"Nix",owner:"Golmote"},nsis:{title:"NSIS",owner:"idleberg"},objectivec:{title:"Objective-C",require:"c",alias:"objc",owner:"uranusjr"},ocaml:{title:"OCaml",owner:"Golmote"},odin:{title:"Odin",owner:"edukisto"},opencl:{title:"OpenCL",require:"c",modify:["c","cpp"],owner:"Milania1"},openqasm:{title:"OpenQasm",alias:"qasm",owner:"RunDevelopment"},oz:{title:"Oz",owner:"Golmote"},parigp:{title:"PARI/GP",owner:"Golmote"},parser:{title:"Parser",require:"markup",owner:"Golmote"},pascal:{title:"Pascal",alias:"objectpascal",aliasTitles:{objectpascal:"Object Pascal"},owner:"Golmote"},pascaligo:{title:"Pascaligo",owner:"DefinitelyNotAGoat"},psl:{title:"PATROL Scripting Language",owner:"bertysentry"},pcaxis:{title:"PC-Axis",alias:"px",owner:"RunDevelopment"},peoplecode:{title:"PeopleCode",alias:"pcode",owner:"RunDevelopment"},perl:{title:"Perl",owner:"Golmote"},php:{title:"PHP",require:"markup-templating",owner:"milesj"},phpdoc:{title:"PHPDoc",require:["php","javadoclike"],modify:"php",owner:"RunDevelopment"},"php-extras":{title:"PHP Extras",require:"php",modify:"php",owner:"milesj"},"plant-uml":{title:"PlantUML",alias:"plantuml",owner:"RunDevelopment"},plsql:{title:"PL/SQL",require:"sql",owner:"Golmote"},powerquery:{title:"PowerQuery",alias:["pq","mscript"],owner:"peterbud"},powershell:{title:"PowerShell",owner:"nauzilus"},processing:{title:"Processing",require:"clike",owner:"Golmote"},prolog:{title:"Prolog",owner:"Golmote"},promql:{title:"PromQL",owner:"arendjr"},properties:{title:".properties",owner:"Golmote"},protobuf:{title:"Protocol Buffers",require:"clike",owner:"just-boris"},pug:{title:"Pug",require:["markup","javascript"],optional:["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],owner:"Golmote"},puppet:{title:"Puppet",owner:"Golmote"},pure:{title:"Pure",optional:["c","cpp","fortran"],owner:"Golmote"},purebasic:{title:"PureBasic",require:"clike",alias:"pbfasm",owner:"HeX0R101"},purescript:{title:"PureScript",require:"haskell",alias:"purs",owner:"sriharshachilakapati"},python:{title:"Python",alias:"py",owner:"multipetros"},qsharp:{title:"Q#",require:"clike",alias:"qs",owner:"fedonman"},q:{title:"Q (kdb+ database)",owner:"Golmote"},qml:{title:"QML",require:"javascript",owner:"RunDevelopment"},qore:{title:"Qore",require:"clike",owner:"temnroegg"},r:{title:"R",owner:"Golmote"},racket:{title:"Racket",require:"scheme",alias:"rkt",owner:"RunDevelopment"},cshtml:{title:"Razor C#",alias:"razor",require:["markup","csharp"],optional:["css","css-extras","javascript","js-extras"],owner:"RunDevelopment"},jsx:{title:"React JSX",require:["markup","javascript"],optional:["jsdoc","js-extras","js-templates"],owner:"vkbansal"},tsx:{title:"React TSX",require:["jsx","typescript"]},reason:{title:"Reason",require:"clike",owner:"Golmote"},regex:{title:"Regex",owner:"RunDevelopment"},rego:{title:"Rego",owner:"JordanSh"},renpy:{title:"Ren'py",alias:"rpy",owner:"HyuchiaDiego"},rescript:{title:"ReScript",alias:"res",owner:"vmarcosp"},rest:{title:"reST (reStructuredText)",owner:"Golmote"},rip:{title:"Rip",owner:"ravinggenius"},roboconf:{title:"Roboconf",owner:"Golmote"},robotframework:{title:"Robot Framework",alias:"robot",owner:"RunDevelopment"},ruby:{title:"Ruby",require:"clike",alias:"rb",owner:"samflores"},rust:{title:"Rust",owner:"Golmote"},sas:{title:"SAS",optional:["groovy","lua","sql"],owner:"Golmote"},sass:{title:"Sass (Sass)",require:"css",optional:"css-extras",owner:"Golmote"},scss:{title:"Sass (SCSS)",require:"css",optional:"css-extras",owner:"MoOx"},scala:{title:"Scala",require:"java",owner:"jozic"},scheme:{title:"Scheme",owner:"bacchus123"},"shell-session":{title:"Shell session",require:"bash",alias:["sh-session","shellsession"],owner:"RunDevelopment"},smali:{title:"Smali",owner:"RunDevelopment"},smalltalk:{title:"Smalltalk",owner:"Golmote"},smarty:{title:"Smarty",require:"markup-templating",optional:"php",owner:"Golmote"},sml:{title:"SML",alias:"smlnj",aliasTitles:{smlnj:"SML/NJ"},owner:"RunDevelopment"},solidity:{title:"Solidity (Ethereum)",alias:"sol",require:"clike",owner:"glachaud"},"solution-file":{title:"Solution file",alias:"sln",owner:"RunDevelopment"},soy:{title:"Soy (Closure Template)",require:"markup-templating",owner:"Golmote"},sparql:{title:"SPARQL",require:"turtle",owner:"Triply-Dev",alias:"rq"},"splunk-spl":{title:"Splunk SPL",owner:"RunDevelopment"},sqf:{title:"SQF: Status Quo Function (Arma 3)",require:"clike",owner:"RunDevelopment"},sql:{title:"SQL",owner:"multipetros"},squirrel:{title:"Squirrel",require:"clike",owner:"RunDevelopment"},stan:{title:"Stan",owner:"RunDevelopment"},stata:{title:"Stata Ado",require:["mata","java","python"],owner:"RunDevelopment"},iecst:{title:"Structured Text (IEC 61131-3)",owner:"serhioromano"},stylus:{title:"Stylus",owner:"vkbansal"},supercollider:{title:"SuperCollider",alias:"sclang",owner:"RunDevelopment"},swift:{title:"Swift",owner:"chrischares"},systemd:{title:"Systemd configuration file",owner:"RunDevelopment"},"t4-templating":{title:"T4 templating",owner:"RunDevelopment"},"t4-cs":{title:"T4 Text Templates (C#)",require:["t4-templating","csharp"],alias:"t4",owner:"RunDevelopment"},"t4-vb":{title:"T4 Text Templates (VB)",require:["t4-templating","vbnet"],owner:"RunDevelopment"},tap:{title:"TAP",owner:"isaacs",require:"yaml"},tcl:{title:"Tcl",owner:"PeterChaplin"},tt2:{title:"Template Toolkit 2",require:["clike","markup-templating"],owner:"gflohr"},textile:{title:"Textile",require:"markup",optional:"css",owner:"Golmote"},toml:{title:"TOML",owner:"RunDevelopment"},tremor:{title:"Tremor",alias:["trickle","troy"],owner:"darach",aliasTitles:{trickle:"trickle",troy:"troy"}},turtle:{title:"Turtle",alias:"trig",aliasTitles:{trig:"TriG"},owner:"jakubklimek"},twig:{title:"Twig",require:"markup-templating",owner:"brandonkelly"},typescript:{title:"TypeScript",require:"javascript",optional:"js-templates",alias:"ts",owner:"vkbansal"},typoscript:{title:"TypoScript",alias:"tsconfig",aliasTitles:{tsconfig:"TSConfig"},owner:"dkern"},unrealscript:{title:"UnrealScript",alias:["uscript","uc"],owner:"RunDevelopment"},uorazor:{title:"UO Razor Script",owner:"jaseowns"},uri:{title:"URI",alias:"url",aliasTitles:{url:"URL"},owner:"RunDevelopment"},v:{title:"V",require:"clike",owner:"taggon"},vala:{title:"Vala",require:"clike",optional:"regex",owner:"TemplarVolk"},vbnet:{title:"VB.Net",require:"basic",owner:"Bigsby"},velocity:{title:"Velocity",require:"markup",owner:"Golmote"},verilog:{title:"Verilog",owner:"a-rey"},vhdl:{title:"VHDL",owner:"a-rey"},vim:{title:"vim",owner:"westonganger"},"visual-basic":{title:"Visual Basic",alias:["vb","vba"],aliasTitles:{vba:"VBA"},owner:"Golmote"},warpscript:{title:"WarpScript",owner:"RunDevelopment"},wasm:{title:"WebAssembly",owner:"Golmote"},"web-idl":{title:"Web IDL",alias:"webidl",owner:"RunDevelopment"},wgsl:{title:"WGSL",owner:"Dr4gonthree"},wiki:{title:"Wiki markup",require:"markup",owner:"Golmote"},wolfram:{title:"Wolfram language",alias:["mathematica","nb","wl"],aliasTitles:{mathematica:"Mathematica",nb:"Mathematica Notebook"},owner:"msollami"},wren:{title:"Wren",owner:"clsource"},xeora:{title:"Xeora",require:"markup",alias:"xeoracube",aliasTitles:{xeoracube:"XeoraCube"},owner:"freakmaxi"},"xml-doc":{title:"XML doc (.net)",require:"markup",modify:["csharp","fsharp","vbnet"],owner:"RunDevelopment"},xojo:{title:"Xojo (REALbasic)",owner:"Golmote"},xquery:{title:"XQuery",require:"markup",owner:"Golmote"},yaml:{title:"YAML",alias:"yml",owner:"hason"},yang:{title:"YANG",owner:"RunDevelopment"},zig:{title:"Zig",owner:"RunDevelopment"}},plugins:{meta:{path:"plugins/{id}/prism-{id}",link:"plugins/{id}/"},"line-highlight":{title:"Line Highlight",description:"Highlights specific lines and/or line ranges."},"line-numbers":{title:"Line Numbers",description:"Line number at the beginning of code lines.",owner:"kuba-kubula"},"show-invisibles":{title:"Show Invisibles",description:"Show hidden characters such as tabs and line breaks.",optional:["autolinker","data-uri-highlight"]},autolinker:{title:"Autolinker",description:"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},wpd:{title:"WebPlatform Docs",description:'Makes tokens link to <a href="https://webplatform.github.io/docs/">WebPlatform.org documentation</a>. The links open in a new tab.'},"custom-class":{title:"Custom Class",description:"This plugin allows you to prefix Prism's default classes (<code>.comment</code> can become <code>.namespace--comment</code>) or replace them with your defined ones (like <code>.editor__comment</code>). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the <code>highlightAll</code> and <code>highlightAllUnder</code> methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},8722:(e,t,n)=>{const r=n(6969),a=n(8380),o=new Set;function i(e){void 0===e?e=Object.keys(r.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...o,...Object.keys(Prism.languages)];a(r,e,t).load((e=>{if(!(e in r.languages))return void(i.silent||console.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(3157).resolve(t)],delete Prism.languages[e],n(3157)(t),o.add(e)}))}i.silent=!1,e.exports=i},9700:()=>{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"==typeof o&&!o(e))return e;for(var a,l=i.length;-1!==n.code.indexOf(a=t(r,l));)++l;return i[l]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(l){for(var s=0;s<l.length&&!(a>=o.length);s++){var c=l[s];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=o[a],d=n.tokenStack[u],p="string"==typeof c?c:c.content,f=t(r,u),m=p.indexOf(f);if(m>-1){++a;var h=p.substring(0,m),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=p.substring(m+f.length),y=[];h&&y.push.apply(y,i([h])),y.push(g),b&&y.push.apply(y,i([b])),"string"==typeof c?l.splice.apply(l,[s,1].concat(y)):c.content=y}}else c.content&&i(c.content)}return l}(n.tokens)}}}})}(Prism)},8692:(e,t,n)=>{var r={"./":8722};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=8692},3157:(e,t,n)=>{var r={"./":8722};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=3157},8380:e=>{"use strict";var t=function(){var e=function(){};function t(e,t){Array.isArray(e)?e.forEach(t):null!=e&&t(e,0)}function n(e){for(var t={},n=0,r=e.length;n<r;n++)t[e[n]]=!0;return t}function r(e){var n={},r=[];function a(r,o){if(!(r in n)){o.push(r);var i=o.indexOf(r);if(i<o.length-1)throw new Error("Circular dependency: "+o.slice(i).join(" -> "));var l={},s=e[r];if(s){function c(t){if(!(t in e))throw new Error(r+" depends on an unknown component "+t);if(!(t in l))for(var i in a(t,o),l[t]=!0,n[t])l[i]=!0}t(s.require,c),t(s.optional,c),t(s.modify,c)}n[r]=l,o.pop()}}return function(e){var t=n[e];return t||(a(e,r),t=n[e]),t}}function a(e){for(var t in e)return!0;return!1}return function(o,i,l){var s=function(e){var t={};for(var n in e){var r=e[n];for(var a in r)if("meta"!=a){var o=r[a];t[a]="string"==typeof o?{title:o}:o}}return t}(o),c=function(e){var n;return function(r){if(r in e)return r;if(!n)for(var a in n={},e){var o=e[a];t(o&&o.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+a+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+a+" because it is a component.");n[t]=a}))}return n[r]||r}}(s);i=i.map(c),l=(l||[]).map(c);var u=n(i),d=n(l);i.forEach((function e(n){var r=s[n];t(r&&r.require,(function(t){t in d||(u[t]=!0,e(t))}))}));for(var p,f=r(s),m=u;a(m);){for(var h in p={},m){var g=s[h];t(g&&g.modify,(function(e){e in d&&(p[e]=!0)}))}for(var b in d)if(!(b in u))for(var y in f(b))if(y in u){p[b]=!0;break}for(var v in m=p)u[v]=!0}var w={getIds:function(){var e=[];return w.load((function(t){e.push(t)})),e},load:function(t,n){return function(t,n,r,a){var o=a?a.series:void 0,i=a?a.parallel:e,l={},s={};function c(e){if(e in l)return l[e];s[e]=!0;var a,u=[];for(var d in t(e))d in n&&u.push(d);if(0===u.length)a=r(e);else{var p=i(u.map((function(e){var t=c(e);return delete s[e],t})));o?a=o(p,(function(){return r(e)})):r(e)}return l[e]=a}for(var u in n)c(u);var d=[];for(var p in s)d.push(l[p]);return i(d)}(f,u,t,n)}};return w}}();e.exports=t},2694:(e,t,n)=>{"use strict";var r=n(6925);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var l=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:a};return n.PropTypes=n,n}},5556:(e,t,n)=>{e.exports=n(2694)()},6925:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},2551:(e,t,n)=>{"use strict";var r=n(6540),a=n(9982);function o(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var i=new Set,l={};function s(e,t){c(e,t),c(e+"Capture",t)}function c(e,t){for(l[e]=t,e=0;e<t.length;e++)i.add(t[e])}var u=!("undefined"==typeof window||void 0===window.document||void 0===window.document.createElement),d=Object.prototype.hasOwnProperty,p=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,f={},m={};function h(e,t,n,r,a,o,i){this.acceptsBooleans=2===t||3===t||4===t,this.attributeName=r,this.attributeNamespace=a,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=o,this.removeEmptyString=i}var g={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach((function(e){g[e]=new h(e,0,!1,e,null,!1,!1)})),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach((function(e){var t=e[0];g[t]=new h(t,1,!1,e[1],null,!1,!1)})),["contentEditable","draggable","spellCheck","value"].forEach((function(e){g[e]=new h(e,2,!1,e.toLowerCase(),null,!1,!1)})),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach((function(e){g[e]=new h(e,2,!1,e,null,!1,!1)})),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach((function(e){g[e]=new h(e,3,!1,e.toLowerCase(),null,!1,!1)})),["checked","multiple","muted","selected"].forEach((function(e){g[e]=new h(e,3,!0,e,null,!1,!1)})),["capture","download"].forEach((function(e){g[e]=new h(e,4,!1,e,null,!1,!1)})),["cols","rows","size","span"].forEach((function(e){g[e]=new h(e,6,!1,e,null,!1,!1)})),["rowSpan","start"].forEach((function(e){g[e]=new h(e,5,!1,e.toLowerCase(),null,!1,!1)}));var b=/[\-:]([a-z])/g;function y(e){return e[1].toUpperCase()}function v(e,t,n,r){var a=g.hasOwnProperty(t)?g[t]:null;(null!==a?0!==a.type:r||!(2<t.length)||"o"!==t[0]&&"O"!==t[0]||"n"!==t[1]&&"N"!==t[1])&&(function(e,t,n,r){if(null==t||function(e,t,n,r){if(null!==n&&0===n.type)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return!r&&(null!==n?!n.acceptsBooleans:"data-"!==(e=e.toLowerCase().slice(0,5))&&"aria-"!==e);default:return!1}}(e,t,n,r))return!0;if(r)return!1;if(null!==n)switch(n.type){case 3:return!t;case 4:return!1===t;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}(t,n,a,r)&&(n=null),r||null===a?function(e){return!!d.call(m,e)||!d.call(f,e)&&(p.test(e)?m[e]=!0:(f[e]=!0,!1))}(t)&&(null===n?e.removeAttribute(t):e.setAttribute(t,""+n)):a.mustUseProperty?e[a.propertyName]=null===n?3!==a.type&&"":n:(t=a.attributeName,r=a.attributeNamespace,null===n?e.removeAttribute(t):(n=3===(a=a.type)||4===a&&!0===n?"":""+n,r?e.setAttributeNS(r,t,n):e.setAttribute(t,n))))}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach((function(e){var t=e.replace(b,y);g[t]=new h(t,1,!1,e,null,!1,!1)})),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach((function(e){var t=e.replace(b,y);g[t]=new h(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)})),["xml:base","xml:lang","xml:space"].forEach((function(e){var t=e.replace(b,y);g[t]=new h(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)})),["tabIndex","crossOrigin"].forEach((function(e){g[e]=new h(e,1,!1,e.toLowerCase(),null,!1,!1)})),g.xlinkHref=new h("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach((function(e){g[e]=new h(e,1,!1,e.toLowerCase(),null,!0,!0)}));var w=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,k=Symbol.for("react.element"),x=Symbol.for("react.portal"),S=Symbol.for("react.fragment"),E=Symbol.for("react.strict_mode"),_=Symbol.for("react.profiler"),C=Symbol.for("react.provider"),A=Symbol.for("react.context"),T=Symbol.for("react.forward_ref"),P=Symbol.for("react.suspense"),j=Symbol.for("react.suspense_list"),L=Symbol.for("react.memo"),N=Symbol.for("react.lazy");Symbol.for("react.scope"),Symbol.for("react.debug_trace_mode");var R=Symbol.for("react.offscreen");Symbol.for("react.legacy_hidden"),Symbol.for("react.cache"),Symbol.for("react.tracing_marker");var O=Symbol.iterator;function D(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=O&&e[O]||e["@@iterator"])?e:null}var I,M=Object.assign;function F(e){if(void 0===I)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);I=t&&t[1]||""}return"\n"+I+e}var z=!1;function B(e,t){if(!e||z)return"";z=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),"object"==typeof Reflect&&Reflect.construct){try{Reflect.construct(t,[])}catch(c){var r=c}Reflect.construct(e,[],t)}else{try{t.call()}catch(c){r=c}e.call(t.prototype)}else{try{throw Error()}catch(c){r=c}e()}}catch(c){if(c&&r&&"string"==typeof c.stack){for(var a=c.stack.split("\n"),o=r.stack.split("\n"),i=a.length-1,l=o.length-1;1<=i&&0<=l&&a[i]!==o[l];)l--;for(;1<=i&&0<=l;i--,l--)if(a[i]!==o[l]){if(1!==i||1!==l)do{if(i--,0>--l||a[i]!==o[l]){var s="\n"+a[i].replace(" at new "," at ");return e.displayName&&s.includes("<anonymous>")&&(s=s.replace("<anonymous>",e.displayName)),s}}while(1<=i&&0<=l);break}}}finally{z=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?F(e):""}function $(e){switch(e.tag){case 5:return F(e.type);case 16:return F("Lazy");case 13:return F("Suspense");case 19:return F("SuspenseList");case 0:case 2:case 15:return e=B(e.type,!1);case 11:return e=B(e.type.render,!1);case 1:return e=B(e.type,!0);default:return""}}function U(e){if(null==e)return null;if("function"==typeof e)return e.displayName||e.name||null;if("string"==typeof e)return e;switch(e){case S:return"Fragment";case x:return"Portal";case _:return"Profiler";case E:return"StrictMode";case P:return"Suspense";case j:return"SuspenseList"}if("object"==typeof e)switch(e.$$typeof){case A:return(e.displayName||"Context")+".Consumer";case C:return(e._context.displayName||"Context")+".Provider";case T:var t=e.render;return(e=e.displayName)||(e=""!==(e=t.displayName||t.name||"")?"ForwardRef("+e+")":"ForwardRef"),e;case L:return null!==(t=e.displayName||null)?t:U(e.type)||"Memo";case N:t=e._payload,e=e._init;try{return U(e(t))}catch(n){}}return null}function q(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=(e=t.render).displayName||e.name||"",t.displayName||(""!==e?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return U(t);case 8:return t===E?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if("function"==typeof t)return t.displayName||t.name||null;if("string"==typeof t)return t}return null}function H(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":case"object":return e;default:return""}}function G(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function V(e){e._valueTracker||(e._valueTracker=function(e){var t=G(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&void 0!==n&&"function"==typeof n.get&&"function"==typeof n.set){var a=n.get,o=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return a.call(this)},set:function(e){r=""+e,o.call(this,e)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(e){r=""+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}(e))}function W(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=G(e)?e.checked?"true":"false":e.value),(e=r)!==n&&(t.setValue(e),!0)}function Q(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}function K(e,t){var n=t.checked;return M({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=n?n:e._wrapperState.initialChecked})}function Y(e,t){var n=null==t.defaultValue?"":t.defaultValue,r=null!=t.checked?t.checked:t.defaultChecked;n=H(null!=t.value?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:"checkbox"===t.type||"radio"===t.type?null!=t.checked:null!=t.value}}function Z(e,t){null!=(t=t.checked)&&v(e,"checked",t,!1)}function X(e,t){Z(e,t);var n=H(t.value),r=t.type;if(null!=n)"number"===r?(0===n&&""===e.value||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if("submit"===r||"reset"===r)return void e.removeAttribute("value");t.hasOwnProperty("value")?ee(e,t.type,n):t.hasOwnProperty("defaultValue")&&ee(e,t.type,H(t.defaultValue)),null==t.checked&&null!=t.defaultChecked&&(e.defaultChecked=!!t.defaultChecked)}function J(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!("submit"!==r&&"reset"!==r||void 0!==t.value&&null!==t.value))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}""!==(n=e.name)&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,""!==n&&(e.name=n)}function ee(e,t,n){"number"===t&&Q(e.ownerDocument)===e||(null==n?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var te=Array.isArray;function ne(e,t,n,r){if(e=e.options,t){t={};for(var a=0;a<n.length;a++)t["$"+n[a]]=!0;for(n=0;n<e.length;n++)a=t.hasOwnProperty("$"+e[n].value),e[n].selected!==a&&(e[n].selected=a),a&&r&&(e[n].defaultSelected=!0)}else{for(n=""+H(n),t=null,a=0;a<e.length;a++){if(e[a].value===n)return e[a].selected=!0,void(r&&(e[a].defaultSelected=!0));null!==t||e[a].disabled||(t=e[a])}null!==t&&(t.selected=!0)}}function re(e,t){if(null!=t.dangerouslySetInnerHTML)throw Error(o(91));return M({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function ae(e,t){var n=t.value;if(null==n){if(n=t.children,t=t.defaultValue,null!=n){if(null!=t)throw Error(o(92));if(te(n)){if(1<n.length)throw Error(o(93));n=n[0]}t=n}null==t&&(t=""),n=t}e._wrapperState={initialValue:H(n)}}function oe(e,t){var n=H(t.value),r=H(t.defaultValue);null!=n&&((n=""+n)!==e.value&&(e.value=n),null==t.defaultValue&&e.defaultValue!==n&&(e.defaultValue=n)),null!=r&&(e.defaultValue=""+r)}function ie(e){var t=e.textContent;t===e._wrapperState.initialValue&&""!==t&&null!==t&&(e.value=t)}function le(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function se(e,t){return null==e||"http://www.w3.org/1999/xhtml"===e?le(t):"http://www.w3.org/2000/svg"===e&&"foreignObject"===t?"http://www.w3.org/1999/xhtml":e}var ce,ue,de=(ue=function(e,t){if("http://www.w3.org/2000/svg"!==e.namespaceURI||"innerHTML"in e)e.innerHTML=t;else{for((ce=ce||document.createElement("div")).innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=ce.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}},"undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(e,t,n,r){MSApp.execUnsafeLocalFunction((function(){return ue(e,t)}))}:ue);function pe(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t}var fe={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},me=["Webkit","ms","Moz","O"];function he(e,t,n){return null==t||"boolean"==typeof t||""===t?"":n||"number"!=typeof t||0===t||fe.hasOwnProperty(e)&&fe[e]?(""+t).trim():t+"px"}function ge(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var r=0===n.indexOf("--"),a=he(n,t[n],r);"float"===n&&(n="cssFloat"),r?e.setProperty(n,a):e[n]=a}}Object.keys(fe).forEach((function(e){me.forEach((function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),fe[t]=fe[e]}))}));var be=M({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function ye(e,t){if(t){if(be[e]&&(null!=t.children||null!=t.dangerouslySetInnerHTML))throw Error(o(137,e));if(null!=t.dangerouslySetInnerHTML){if(null!=t.children)throw Error(o(60));if("object"!=typeof t.dangerouslySetInnerHTML||!("__html"in t.dangerouslySetInnerHTML))throw Error(o(61))}if(null!=t.style&&"object"!=typeof t.style)throw Error(o(62))}}function ve(e,t){if(-1===e.indexOf("-"))return"string"==typeof t.is;switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var we=null;function ke(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}var xe=null,Se=null,Ee=null;function _e(e){if(e=va(e)){if("function"!=typeof xe)throw Error(o(280));var t=e.stateNode;t&&(t=ka(t),xe(e.stateNode,e.type,t))}}function Ce(e){Se?Ee?Ee.push(e):Ee=[e]:Se=e}function Ae(){if(Se){var e=Se,t=Ee;if(Ee=Se=null,_e(e),t)for(e=0;e<t.length;e++)_e(t[e])}}function Te(e,t){return e(t)}function Pe(){}var je=!1;function Le(e,t,n){if(je)return e(t,n);je=!0;try{return Te(e,t,n)}finally{je=!1,(null!==Se||null!==Ee)&&(Pe(),Ae())}}function Ne(e,t){var n=e.stateNode;if(null===n)return null;var r=ka(n);if(null===r)return null;n=r[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(r=!r.disabled)||(r=!("button"===(e=e.type)||"input"===e||"select"===e||"textarea"===e)),e=!r;break e;default:e=!1}if(e)return null;if(n&&"function"!=typeof n)throw Error(o(231,t,typeof n));return n}var Re=!1;if(u)try{var Oe={};Object.defineProperty(Oe,"passive",{get:function(){Re=!0}}),window.addEventListener("test",Oe,Oe),window.removeEventListener("test",Oe,Oe)}catch(ue){Re=!1}function De(e,t,n,r,a,o,i,l,s){var c=Array.prototype.slice.call(arguments,3);try{t.apply(n,c)}catch(u){this.onError(u)}}var Ie=!1,Me=null,Fe=!1,ze=null,Be={onError:function(e){Ie=!0,Me=e}};function $e(e,t,n,r,a,o,i,l,s){Ie=!1,Me=null,De.apply(Be,arguments)}function Ue(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do{!!(4098&(t=e).flags)&&(n=t.return),e=t.return}while(e)}return 3===t.tag?n:null}function qe(e){if(13===e.tag){var t=e.memoizedState;if(null===t&&(null!==(e=e.alternate)&&(t=e.memoizedState)),null!==t)return t.dehydrated}return null}function He(e){if(Ue(e)!==e)throw Error(o(188))}function Ge(e){return null!==(e=function(e){var t=e.alternate;if(!t){if(null===(t=Ue(e)))throw Error(o(188));return t!==e?null:e}for(var n=e,r=t;;){var a=n.return;if(null===a)break;var i=a.alternate;if(null===i){if(null!==(r=a.return)){n=r;continue}break}if(a.child===i.child){for(i=a.child;i;){if(i===n)return He(a),e;if(i===r)return He(a),t;i=i.sibling}throw Error(o(188))}if(n.return!==r.return)n=a,r=i;else{for(var l=!1,s=a.child;s;){if(s===n){l=!0,n=a,r=i;break}if(s===r){l=!0,r=a,n=i;break}s=s.sibling}if(!l){for(s=i.child;s;){if(s===n){l=!0,n=i,r=a;break}if(s===r){l=!0,r=i,n=a;break}s=s.sibling}if(!l)throw Error(o(189))}}if(n.alternate!==r)throw Error(o(190))}if(3!==n.tag)throw Error(o(188));return n.stateNode.current===n?e:t}(e))?Ve(e):null}function Ve(e){if(5===e.tag||6===e.tag)return e;for(e=e.child;null!==e;){var t=Ve(e);if(null!==t)return t;e=e.sibling}return null}var We=a.unstable_scheduleCallback,Qe=a.unstable_cancelCallback,Ke=a.unstable_shouldYield,Ye=a.unstable_requestPaint,Ze=a.unstable_now,Xe=a.unstable_getCurrentPriorityLevel,Je=a.unstable_ImmediatePriority,et=a.unstable_UserBlockingPriority,tt=a.unstable_NormalPriority,nt=a.unstable_LowPriority,rt=a.unstable_IdlePriority,at=null,ot=null;var it=Math.clz32?Math.clz32:function(e){return e>>>=0,0===e?32:31-(lt(e)/st|0)|0},lt=Math.log,st=Math.LN2;var ct=64,ut=4194304;function dt(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return 4194240&e;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return 130023424&e;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function pt(e,t){var n=e.pendingLanes;if(0===n)return 0;var r=0,a=e.suspendedLanes,o=e.pingedLanes,i=268435455&n;if(0!==i){var l=i&~a;0!==l?r=dt(l):0!==(o&=i)&&(r=dt(o))}else 0!==(i=n&~a)?r=dt(i):0!==o&&(r=dt(o));if(0===r)return 0;if(0!==t&&t!==r&&!(t&a)&&((a=r&-r)>=(o=t&-t)||16===a&&4194240&o))return t;if(4&r&&(r|=16&n),0!==(t=e.entangledLanes))for(e=e.entanglements,t&=r;0<t;)a=1<<(n=31-it(t)),r|=e[n],t&=~a;return r}function ft(e,t){switch(e){case 1:case 2:case 4:return t+250;case 8:case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;default:return-1}}function mt(e){return 0!==(e=-1073741825&e.pendingLanes)?e:1073741824&e?1073741824:0}function ht(){var e=ct;return!(4194240&(ct<<=1))&&(ct=64),e}function gt(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function bt(e,t,n){e.pendingLanes|=t,536870912!==t&&(e.suspendedLanes=0,e.pingedLanes=0),(e=e.eventTimes)[t=31-it(t)]=n}function yt(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var r=31-it(n),a=1<<r;a&t|e[r]&t&&(e[r]|=t),n&=~a}}var vt=0;function wt(e){return 1<(e&=-e)?4<e?268435455&e?16:536870912:4:1}var kt,xt,St,Et,_t,Ct=!1,At=[],Tt=null,Pt=null,jt=null,Lt=new Map,Nt=new Map,Rt=[],Ot="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");function Dt(e,t){switch(e){case"focusin":case"focusout":Tt=null;break;case"dragenter":case"dragleave":Pt=null;break;case"mouseover":case"mouseout":jt=null;break;case"pointerover":case"pointerout":Lt.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":Nt.delete(t.pointerId)}}function It(e,t,n,r,a,o){return null===e||e.nativeEvent!==o?(e={blockedOn:t,domEventName:n,eventSystemFlags:r,nativeEvent:o,targetContainers:[a]},null!==t&&(null!==(t=va(t))&&xt(t)),e):(e.eventSystemFlags|=r,t=e.targetContainers,null!==a&&-1===t.indexOf(a)&&t.push(a),e)}function Mt(e){var t=ya(e.target);if(null!==t){var n=Ue(t);if(null!==n)if(13===(t=n.tag)){if(null!==(t=qe(n)))return e.blockedOn=t,void _t(e.priority,(function(){St(n)}))}else if(3===t&&n.stateNode.current.memoizedState.isDehydrated)return void(e.blockedOn=3===n.tag?n.stateNode.containerInfo:null)}e.blockedOn=null}function Ft(e){if(null!==e.blockedOn)return!1;for(var t=e.targetContainers;0<t.length;){var n=Kt(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n)return null!==(t=va(n))&&xt(t),e.blockedOn=n,!1;var r=new(n=e.nativeEvent).constructor(n.type,n);we=r,n.target.dispatchEvent(r),we=null,t.shift()}return!0}function zt(e,t,n){Ft(e)&&n.delete(t)}function Bt(){Ct=!1,null!==Tt&&Ft(Tt)&&(Tt=null),null!==Pt&&Ft(Pt)&&(Pt=null),null!==jt&&Ft(jt)&&(jt=null),Lt.forEach(zt),Nt.forEach(zt)}function $t(e,t){e.blockedOn===t&&(e.blockedOn=null,Ct||(Ct=!0,a.unstable_scheduleCallback(a.unstable_NormalPriority,Bt)))}function Ut(e){function t(t){return $t(t,e)}if(0<At.length){$t(At[0],e);for(var n=1;n<At.length;n++){var r=At[n];r.blockedOn===e&&(r.blockedOn=null)}}for(null!==Tt&&$t(Tt,e),null!==Pt&&$t(Pt,e),null!==jt&&$t(jt,e),Lt.forEach(t),Nt.forEach(t),n=0;n<Rt.length;n++)(r=Rt[n]).blockedOn===e&&(r.blockedOn=null);for(;0<Rt.length&&null===(n=Rt[0]).blockedOn;)Mt(n),null===n.blockedOn&&Rt.shift()}var qt=w.ReactCurrentBatchConfig,Ht=!0;function Gt(e,t,n,r){var a=vt,o=qt.transition;qt.transition=null;try{vt=1,Wt(e,t,n,r)}finally{vt=a,qt.transition=o}}function Vt(e,t,n,r){var a=vt,o=qt.transition;qt.transition=null;try{vt=4,Wt(e,t,n,r)}finally{vt=a,qt.transition=o}}function Wt(e,t,n,r){if(Ht){var a=Kt(e,t,n,r);if(null===a)Hr(e,t,r,Qt,n),Dt(e,r);else if(function(e,t,n,r,a){switch(t){case"focusin":return Tt=It(Tt,e,t,n,r,a),!0;case"dragenter":return Pt=It(Pt,e,t,n,r,a),!0;case"mouseover":return jt=It(jt,e,t,n,r,a),!0;case"pointerover":var o=a.pointerId;return Lt.set(o,It(Lt.get(o)||null,e,t,n,r,a)),!0;case"gotpointercapture":return o=a.pointerId,Nt.set(o,It(Nt.get(o)||null,e,t,n,r,a)),!0}return!1}(a,e,t,n,r))r.stopPropagation();else if(Dt(e,r),4&t&&-1<Ot.indexOf(e)){for(;null!==a;){var o=va(a);if(null!==o&&kt(o),null===(o=Kt(e,t,n,r))&&Hr(e,t,r,Qt,n),o===a)break;a=o}null!==a&&r.stopPropagation()}else Hr(e,t,r,null,n)}}var Qt=null;function Kt(e,t,n,r){if(Qt=null,null!==(e=ya(e=ke(r))))if(null===(t=Ue(e)))e=null;else if(13===(n=t.tag)){if(null!==(e=qe(t)))return e;e=null}else if(3===n){if(t.stateNode.current.memoizedState.isDehydrated)return 3===t.tag?t.stateNode.containerInfo:null;e=null}else t!==e&&(e=null);return Qt=e,null}function Yt(e){switch(e){case"cancel":case"click":case"close":case"contextmenu":case"copy":case"cut":case"auxclick":case"dblclick":case"dragend":case"dragstart":case"drop":case"focusin":case"focusout":case"input":case"invalid":case"keydown":case"keypress":case"keyup":case"mousedown":case"mouseup":case"paste":case"pause":case"play":case"pointercancel":case"pointerdown":case"pointerup":case"ratechange":case"reset":case"resize":case"seeked":case"submit":case"touchcancel":case"touchend":case"touchstart":case"volumechange":case"change":case"selectionchange":case"textInput":case"compositionstart":case"compositionend":case"compositionupdate":case"beforeblur":case"afterblur":case"beforeinput":case"blur":case"fullscreenchange":case"focus":case"hashchange":case"popstate":case"select":case"selectstart":return 1;case"drag":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"mousemove":case"mouseout":case"mouseover":case"pointermove":case"pointerout":case"pointerover":case"scroll":case"toggle":case"touchmove":case"wheel":case"mouseenter":case"mouseleave":case"pointerenter":case"pointerleave":return 4;case"message":switch(Xe()){case Je:return 1;case et:return 4;case tt:case nt:return 16;case rt:return 536870912;default:return 16}default:return 16}}var Zt=null,Xt=null,Jt=null;function en(){if(Jt)return Jt;var e,t,n=Xt,r=n.length,a="value"in Zt?Zt.value:Zt.textContent,o=a.length;for(e=0;e<r&&n[e]===a[e];e++);var i=r-e;for(t=1;t<=i&&n[r-t]===a[o-t];t++);return Jt=a.slice(e,1<t?1-t:void 0)}function tn(e){var t=e.keyCode;return"charCode"in e?0===(e=e.charCode)&&13===t&&(e=13):e=t,10===e&&(e=13),32<=e||13===e?e:0}function nn(){return!0}function rn(){return!1}function an(e){function t(t,n,r,a,o){for(var i in this._reactName=t,this._targetInst=r,this.type=n,this.nativeEvent=a,this.target=o,this.currentTarget=null,e)e.hasOwnProperty(i)&&(t=e[i],this[i]=t?t(a):a[i]);return this.isDefaultPrevented=(null!=a.defaultPrevented?a.defaultPrevented:!1===a.returnValue)?nn:rn,this.isPropagationStopped=rn,this}return M(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=nn)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=nn)},persist:function(){},isPersistent:nn}),t}var on,ln,sn,cn={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},un=an(cn),dn=M({},cn,{view:0,detail:0}),pn=an(dn),fn=M({},dn,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:_n,button:0,buttons:0,relatedTarget:function(e){return void 0===e.relatedTarget?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==sn&&(sn&&"mousemove"===e.type?(on=e.screenX-sn.screenX,ln=e.screenY-sn.screenY):ln=on=0,sn=e),on)},movementY:function(e){return"movementY"in e?e.movementY:ln}}),mn=an(fn),hn=an(M({},fn,{dataTransfer:0})),gn=an(M({},dn,{relatedTarget:0})),bn=an(M({},cn,{animationName:0,elapsedTime:0,pseudoElement:0})),yn=M({},cn,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),vn=an(yn),wn=an(M({},cn,{data:0})),kn={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},xn={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},Sn={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function En(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=Sn[e])&&!!t[e]}function _n(){return En}var Cn=M({},dn,{key:function(e){if(e.key){var t=kn[e.key]||e.key;if("Unidentified"!==t)return t}return"keypress"===e.type?13===(e=tn(e))?"Enter":String.fromCharCode(e):"keydown"===e.type||"keyup"===e.type?xn[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:_n,charCode:function(e){return"keypress"===e.type?tn(e):0},keyCode:function(e){return"keydown"===e.type||"keyup"===e.type?e.keyCode:0},which:function(e){return"keypress"===e.type?tn(e):"keydown"===e.type||"keyup"===e.type?e.keyCode:0}}),An=an(Cn),Tn=an(M({},fn,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0})),Pn=an(M({},dn,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:_n})),jn=an(M({},cn,{propertyName:0,elapsedTime:0,pseudoElement:0})),Ln=M({},fn,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),Nn=an(Ln),Rn=[9,13,27,32],On=u&&"CompositionEvent"in window,Dn=null;u&&"documentMode"in document&&(Dn=document.documentMode);var In=u&&"TextEvent"in window&&!Dn,Mn=u&&(!On||Dn&&8<Dn&&11>=Dn),Fn=String.fromCharCode(32),zn=!1;function Bn(e,t){switch(e){case"keyup":return-1!==Rn.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function $n(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var Un=!1;var qn={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Hn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!qn[e.type]:"textarea"===t}function Gn(e,t,n,r){Ce(r),0<(t=Vr(t,"onChange")).length&&(n=new un("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var Vn=null,Wn=null;function Qn(e){Fr(e,0)}function Kn(e){if(W(wa(e)))return e}function Yn(e,t){if("change"===e)return t}var Zn=!1;if(u){var Xn;if(u){var Jn="oninput"in document;if(!Jn){var er=document.createElement("div");er.setAttribute("oninput","return;"),Jn="function"==typeof er.oninput}Xn=Jn}else Xn=!1;Zn=Xn&&(!document.documentMode||9<document.documentMode)}function tr(){Vn&&(Vn.detachEvent("onpropertychange",nr),Wn=Vn=null)}function nr(e){if("value"===e.propertyName&&Kn(Wn)){var t=[];Gn(t,Wn,e,ke(e)),Le(Qn,t)}}function rr(e,t,n){"focusin"===e?(tr(),Wn=n,(Vn=t).attachEvent("onpropertychange",nr)):"focusout"===e&&tr()}function ar(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)return Kn(Wn)}function or(e,t){if("click"===e)return Kn(t)}function ir(e,t){if("input"===e||"change"===e)return Kn(t)}var lr="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t};function sr(e,t){if(lr(e,t))return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(r=0;r<n.length;r++){var a=n[r];if(!d.call(t,a)||!lr(e[a],t[a]))return!1}return!0}function cr(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function ur(e,t){var n,r=cr(e);for(e=0;r;){if(3===r.nodeType){if(n=e+r.textContent.length,e<=t&&n>=t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=cr(r)}}function dr(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?dr(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function pr(){for(var e=window,t=Q();t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(r){n=!1}if(!n)break;t=Q((e=t.contentWindow).document)}return t}function fr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}function mr(e){var t=pr(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&dr(n.ownerDocument.documentElement,n)){if(null!==r&&fr(n))if(t=r.start,void 0===(e=r.end)&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if((e=(t=n.ownerDocument||document)&&t.defaultView||window).getSelection){e=e.getSelection();var a=n.textContent.length,o=Math.min(r.start,a);r=void 0===r.end?o:Math.min(r.end,a),!e.extend&&o>r&&(a=r,r=o,o=a),a=ur(n,o);var i=ur(n,r);a&&i&&(1!==e.rangeCount||e.anchorNode!==a.node||e.anchorOffset!==a.offset||e.focusNode!==i.node||e.focusOffset!==i.offset)&&((t=t.createRange()).setStart(a.node,a.offset),e.removeAllRanges(),o>r?(e.addRange(t),e.extend(i.node,i.offset)):(t.setEnd(i.node,i.offset),e.addRange(t)))}for(t=[],e=n;e=e.parentNode;)1===e.nodeType&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for("function"==typeof n.focus&&n.focus(),n=0;n<t.length;n++)(e=t[n]).element.scrollLeft=e.left,e.element.scrollTop=e.top}}var hr=u&&"documentMode"in document&&11>=document.documentMode,gr=null,br=null,yr=null,vr=!1;function wr(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;vr||null==gr||gr!==Q(r)||("selectionStart"in(r=gr)&&fr(r)?r={start:r.selectionStart,end:r.selectionEnd}:r={anchorNode:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset},yr&&sr(yr,r)||(yr=r,0<(r=Vr(br,"onSelect")).length&&(t=new un("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=gr)))}function kr(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var xr={animationend:kr("Animation","AnimationEnd"),animationiteration:kr("Animation","AnimationIteration"),animationstart:kr("Animation","AnimationStart"),transitionend:kr("Transition","TransitionEnd")},Sr={},Er={};function _r(e){if(Sr[e])return Sr[e];if(!xr[e])return e;var t,n=xr[e];for(t in n)if(n.hasOwnProperty(t)&&t in Er)return Sr[e]=n[t];return e}u&&(Er=document.createElement("div").style,"AnimationEvent"in window||(delete xr.animationend.animation,delete xr.animationiteration.animation,delete xr.animationstart.animation),"TransitionEvent"in window||delete xr.transitionend.transition);var Cr=_r("animationend"),Ar=_r("animationiteration"),Tr=_r("animationstart"),Pr=_r("transitionend"),jr=new Map,Lr="abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function Nr(e,t){jr.set(e,t),s(t,[e])}for(var Rr=0;Rr<Lr.length;Rr++){var Or=Lr[Rr];Nr(Or.toLowerCase(),"on"+(Or[0].toUpperCase()+Or.slice(1)))}Nr(Cr,"onAnimationEnd"),Nr(Ar,"onAnimationIteration"),Nr(Tr,"onAnimationStart"),Nr("dblclick","onDoubleClick"),Nr("focusin","onFocus"),Nr("focusout","onBlur"),Nr(Pr,"onTransitionEnd"),c("onMouseEnter",["mouseout","mouseover"]),c("onMouseLeave",["mouseout","mouseover"]),c("onPointerEnter",["pointerout","pointerover"]),c("onPointerLeave",["pointerout","pointerover"]),s("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),s("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),s("onBeforeInput",["compositionend","keypress","textInput","paste"]),s("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),s("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),s("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var Dr="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Ir=new Set("cancel close invalid load scroll toggle".split(" ").concat(Dr));function Mr(e,t,n){var r=e.type||"unknown-event";e.currentTarget=n,function(e,t,n,r,a,i,l,s,c){if($e.apply(this,arguments),Ie){if(!Ie)throw Error(o(198));var u=Me;Ie=!1,Me=null,Fe||(Fe=!0,ze=u)}}(r,t,void 0,e),e.currentTarget=null}function Fr(e,t){t=!!(4&t);for(var n=0;n<e.length;n++){var r=e[n],a=r.event;r=r.listeners;e:{var o=void 0;if(t)for(var i=r.length-1;0<=i;i--){var l=r[i],s=l.instance,c=l.currentTarget;if(l=l.listener,s!==o&&a.isPropagationStopped())break e;Mr(a,l,c),o=s}else for(i=0;i<r.length;i++){if(s=(l=r[i]).instance,c=l.currentTarget,l=l.listener,s!==o&&a.isPropagationStopped())break e;Mr(a,l,c),o=s}}}if(Fe)throw e=ze,Fe=!1,ze=null,e}function zr(e,t){var n=t[ha];void 0===n&&(n=t[ha]=new Set);var r=e+"__bubble";n.has(r)||(qr(t,e,2,!1),n.add(r))}function Br(e,t,n){var r=0;t&&(r|=4),qr(n,e,r,t)}var $r="_reactListening"+Math.random().toString(36).slice(2);function Ur(e){if(!e[$r]){e[$r]=!0,i.forEach((function(t){"selectionchange"!==t&&(Ir.has(t)||Br(t,!1,e),Br(t,!0,e))}));var t=9===e.nodeType?e:e.ownerDocument;null===t||t[$r]||(t[$r]=!0,Br("selectionchange",!1,t))}}function qr(e,t,n,r){switch(Yt(t)){case 1:var a=Gt;break;case 4:a=Vt;break;default:a=Wt}n=a.bind(null,t,n,e),a=void 0,!Re||"touchstart"!==t&&"touchmove"!==t&&"wheel"!==t||(a=!0),r?void 0!==a?e.addEventListener(t,n,{capture:!0,passive:a}):e.addEventListener(t,n,!0):void 0!==a?e.addEventListener(t,n,{passive:a}):e.addEventListener(t,n,!1)}function Hr(e,t,n,r,a){var o=r;if(!(1&t||2&t||null===r))e:for(;;){if(null===r)return;var i=r.tag;if(3===i||4===i){var l=r.stateNode.containerInfo;if(l===a||8===l.nodeType&&l.parentNode===a)break;if(4===i)for(i=r.return;null!==i;){var s=i.tag;if((3===s||4===s)&&((s=i.stateNode.containerInfo)===a||8===s.nodeType&&s.parentNode===a))return;i=i.return}for(;null!==l;){if(null===(i=ya(l)))return;if(5===(s=i.tag)||6===s){r=o=i;continue e}l=l.parentNode}}r=r.return}Le((function(){var r=o,a=ke(n),i=[];e:{var l=jr.get(e);if(void 0!==l){var s=un,c=e;switch(e){case"keypress":if(0===tn(n))break e;case"keydown":case"keyup":s=An;break;case"focusin":c="focus",s=gn;break;case"focusout":c="blur",s=gn;break;case"beforeblur":case"afterblur":s=gn;break;case"click":if(2===n.button)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":s=mn;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":s=hn;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":s=Pn;break;case Cr:case Ar:case Tr:s=bn;break;case Pr:s=jn;break;case"scroll":s=pn;break;case"wheel":s=Nn;break;case"copy":case"cut":case"paste":s=vn;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":s=Tn}var u=!!(4&t),d=!u&&"scroll"===e,p=u?null!==l?l+"Capture":null:l;u=[];for(var f,m=r;null!==m;){var h=(f=m).stateNode;if(5===f.tag&&null!==h&&(f=h,null!==p&&(null!=(h=Ne(m,p))&&u.push(Gr(m,h,f)))),d)break;m=m.return}0<u.length&&(l=new s(l,c,null,n,a),i.push({event:l,listeners:u}))}}if(!(7&t)){if(s="mouseout"===e||"pointerout"===e,(!(l="mouseover"===e||"pointerover"===e)||n===we||!(c=n.relatedTarget||n.fromElement)||!ya(c)&&!c[ma])&&(s||l)&&(l=a.window===a?a:(l=a.ownerDocument)?l.defaultView||l.parentWindow:window,s?(s=r,null!==(c=(c=n.relatedTarget||n.toElement)?ya(c):null)&&(c!==(d=Ue(c))||5!==c.tag&&6!==c.tag)&&(c=null)):(s=null,c=r),s!==c)){if(u=mn,h="onMouseLeave",p="onMouseEnter",m="mouse","pointerout"!==e&&"pointerover"!==e||(u=Tn,h="onPointerLeave",p="onPointerEnter",m="pointer"),d=null==s?l:wa(s),f=null==c?l:wa(c),(l=new u(h,m+"leave",s,n,a)).target=d,l.relatedTarget=f,h=null,ya(a)===r&&((u=new u(p,m+"enter",c,n,a)).target=f,u.relatedTarget=d,h=u),d=h,s&&c)e:{for(p=c,m=0,f=u=s;f;f=Wr(f))m++;for(f=0,h=p;h;h=Wr(h))f++;for(;0<m-f;)u=Wr(u),m--;for(;0<f-m;)p=Wr(p),f--;for(;m--;){if(u===p||null!==p&&u===p.alternate)break e;u=Wr(u),p=Wr(p)}u=null}else u=null;null!==s&&Qr(i,l,s,u,!1),null!==c&&null!==d&&Qr(i,d,c,u,!0)}if("select"===(s=(l=r?wa(r):window).nodeName&&l.nodeName.toLowerCase())||"input"===s&&"file"===l.type)var g=Yn;else if(Hn(l))if(Zn)g=ir;else{g=ar;var b=rr}else(s=l.nodeName)&&"input"===s.toLowerCase()&&("checkbox"===l.type||"radio"===l.type)&&(g=or);switch(g&&(g=g(e,r))?Gn(i,g,n,a):(b&&b(e,l,r),"focusout"===e&&(b=l._wrapperState)&&b.controlled&&"number"===l.type&&ee(l,"number",l.value)),b=r?wa(r):window,e){case"focusin":(Hn(b)||"true"===b.contentEditable)&&(gr=b,br=r,yr=null);break;case"focusout":yr=br=gr=null;break;case"mousedown":vr=!0;break;case"contextmenu":case"mouseup":case"dragend":vr=!1,wr(i,n,a);break;case"selectionchange":if(hr)break;case"keydown":case"keyup":wr(i,n,a)}var y;if(On)e:{switch(e){case"compositionstart":var v="onCompositionStart";break e;case"compositionend":v="onCompositionEnd";break e;case"compositionupdate":v="onCompositionUpdate";break e}v=void 0}else Un?Bn(e,n)&&(v="onCompositionEnd"):"keydown"===e&&229===n.keyCode&&(v="onCompositionStart");v&&(Mn&&"ko"!==n.locale&&(Un||"onCompositionStart"!==v?"onCompositionEnd"===v&&Un&&(y=en()):(Xt="value"in(Zt=a)?Zt.value:Zt.textContent,Un=!0)),0<(b=Vr(r,v)).length&&(v=new wn(v,e,null,n,a),i.push({event:v,listeners:b}),y?v.data=y:null!==(y=$n(n))&&(v.data=y))),(y=In?function(e,t){switch(e){case"compositionend":return $n(t);case"keypress":return 32!==t.which?null:(zn=!0,Fn);case"textInput":return(e=t.data)===Fn&&zn?null:e;default:return null}}(e,n):function(e,t){if(Un)return"compositionend"===e||!On&&Bn(e,t)?(e=en(),Jt=Xt=Zt=null,Un=!1,e):null;switch(e){case"paste":default:return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return Mn&&"ko"!==t.locale?null:t.data}}(e,n))&&(0<(r=Vr(r,"onBeforeInput")).length&&(a=new wn("onBeforeInput","beforeinput",null,n,a),i.push({event:a,listeners:r}),a.data=y))}Fr(i,t)}))}function Gr(e,t,n){return{instance:e,listener:t,currentTarget:n}}function Vr(e,t){for(var n=t+"Capture",r=[];null!==e;){var a=e,o=a.stateNode;5===a.tag&&null!==o&&(a=o,null!=(o=Ne(e,n))&&r.unshift(Gr(e,o,a)),null!=(o=Ne(e,t))&&r.push(Gr(e,o,a))),e=e.return}return r}function Wr(e){if(null===e)return null;do{e=e.return}while(e&&5!==e.tag);return e||null}function Qr(e,t,n,r,a){for(var o=t._reactName,i=[];null!==n&&n!==r;){var l=n,s=l.alternate,c=l.stateNode;if(null!==s&&s===r)break;5===l.tag&&null!==c&&(l=c,a?null!=(s=Ne(n,o))&&i.unshift(Gr(n,s,l)):a||null!=(s=Ne(n,o))&&i.push(Gr(n,s,l))),n=n.return}0!==i.length&&e.push({event:t,listeners:i})}var Kr=/\r\n?/g,Yr=/\u0000|\uFFFD/g;function Zr(e){return("string"==typeof e?e:""+e).replace(Kr,"\n").replace(Yr,"")}function Xr(e,t,n){if(t=Zr(t),Zr(e)!==t&&n)throw Error(o(425))}function Jr(){}var ea=null,ta=null;function na(e,t){return"textarea"===e||"noscript"===e||"string"==typeof t.children||"number"==typeof t.children||"object"==typeof t.dangerouslySetInnerHTML&&null!==t.dangerouslySetInnerHTML&&null!=t.dangerouslySetInnerHTML.__html}var ra="function"==typeof setTimeout?setTimeout:void 0,aa="function"==typeof clearTimeout?clearTimeout:void 0,oa="function"==typeof Promise?Promise:void 0,ia="function"==typeof queueMicrotask?queueMicrotask:void 0!==oa?function(e){return oa.resolve(null).then(e).catch(la)}:ra;function la(e){setTimeout((function(){throw e}))}function sa(e,t){var n=t,r=0;do{var a=n.nextSibling;if(e.removeChild(n),a&&8===a.nodeType)if("/$"===(n=a.data)){if(0===r)return e.removeChild(a),void Ut(t);r--}else"$"!==n&&"$?"!==n&&"$!"!==n||r++;n=a}while(n);Ut(t)}function ca(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||3===t)break;if(8===t){if("$"===(t=e.data)||"$!"===t||"$?"===t)break;if("/$"===t)return null}}return e}function ua(e){e=e.previousSibling;for(var t=0;e;){if(8===e.nodeType){var n=e.data;if("$"===n||"$!"===n||"$?"===n){if(0===t)return e;t--}else"/$"===n&&t++}e=e.previousSibling}return null}var da=Math.random().toString(36).slice(2),pa="__reactFiber$"+da,fa="__reactProps$"+da,ma="__reactContainer$"+da,ha="__reactEvents$"+da,ga="__reactListeners$"+da,ba="__reactHandles$"+da;function ya(e){var t=e[pa];if(t)return t;for(var n=e.parentNode;n;){if(t=n[ma]||n[pa]){if(n=t.alternate,null!==t.child||null!==n&&null!==n.child)for(e=ua(e);null!==e;){if(n=e[pa])return n;e=ua(e)}return t}n=(e=n).parentNode}return null}function va(e){return!(e=e[pa]||e[ma])||5!==e.tag&&6!==e.tag&&13!==e.tag&&3!==e.tag?null:e}function wa(e){if(5===e.tag||6===e.tag)return e.stateNode;throw Error(o(33))}function ka(e){return e[fa]||null}var xa=[],Sa=-1;function Ea(e){return{current:e}}function _a(e){0>Sa||(e.current=xa[Sa],xa[Sa]=null,Sa--)}function Ca(e,t){Sa++,xa[Sa]=e.current,e.current=t}var Aa={},Ta=Ea(Aa),Pa=Ea(!1),ja=Aa;function La(e,t){var n=e.type.contextTypes;if(!n)return Aa;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var a,o={};for(a in n)o[a]=t[a];return r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=o),o}function Na(e){return null!=(e=e.childContextTypes)}function Ra(){_a(Pa),_a(Ta)}function Oa(e,t,n){if(Ta.current!==Aa)throw Error(o(168));Ca(Ta,t),Ca(Pa,n)}function Da(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,"function"!=typeof r.getChildContext)return n;for(var a in r=r.getChildContext())if(!(a in t))throw Error(o(108,q(e)||"Unknown",a));return M({},n,r)}function Ia(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Aa,ja=Ta.current,Ca(Ta,e),Ca(Pa,Pa.current),!0}function Ma(e,t,n){var r=e.stateNode;if(!r)throw Error(o(169));n?(e=Da(e,t,ja),r.__reactInternalMemoizedMergedChildContext=e,_a(Pa),_a(Ta),Ca(Ta,e)):_a(Pa),Ca(Pa,n)}var Fa=null,za=!1,Ba=!1;function $a(e){null===Fa?Fa=[e]:Fa.push(e)}function Ua(){if(!Ba&&null!==Fa){Ba=!0;var e=0,t=vt;try{var n=Fa;for(vt=1;e<n.length;e++){var r=n[e];do{r=r(!0)}while(null!==r)}Fa=null,za=!1}catch(a){throw null!==Fa&&(Fa=Fa.slice(e+1)),We(Je,Ua),a}finally{vt=t,Ba=!1}}return null}var qa=[],Ha=0,Ga=null,Va=0,Wa=[],Qa=0,Ka=null,Ya=1,Za="";function Xa(e,t){qa[Ha++]=Va,qa[Ha++]=Ga,Ga=e,Va=t}function Ja(e,t,n){Wa[Qa++]=Ya,Wa[Qa++]=Za,Wa[Qa++]=Ka,Ka=e;var r=Ya;e=Za;var a=32-it(r)-1;r&=~(1<<a),n+=1;var o=32-it(t)+a;if(30<o){var i=a-a%5;o=(r&(1<<i)-1).toString(32),r>>=i,a-=i,Ya=1<<32-it(t)+a|n<<a|r,Za=o+e}else Ya=1<<o|n<<a|r,Za=e}function eo(e){null!==e.return&&(Xa(e,1),Ja(e,1,0))}function to(e){for(;e===Ga;)Ga=qa[--Ha],qa[Ha]=null,Va=qa[--Ha],qa[Ha]=null;for(;e===Ka;)Ka=Wa[--Qa],Wa[Qa]=null,Za=Wa[--Qa],Wa[Qa]=null,Ya=Wa[--Qa],Wa[Qa]=null}var no=null,ro=null,ao=!1,oo=null;function io(e,t){var n=Lc(5,null,null,0);n.elementType="DELETED",n.stateNode=t,n.return=e,null===(t=e.deletions)?(e.deletions=[n],e.flags|=16):t.push(n)}function lo(e,t){switch(e.tag){case 5:var n=e.type;return null!==(t=1!==t.nodeType||n.toLowerCase()!==t.nodeName.toLowerCase()?null:t)&&(e.stateNode=t,no=e,ro=ca(t.firstChild),!0);case 6:return null!==(t=""===e.pendingProps||3!==t.nodeType?null:t)&&(e.stateNode=t,no=e,ro=null,!0);case 13:return null!==(t=8!==t.nodeType?null:t)&&(n=null!==Ka?{id:Ya,overflow:Za}:null,e.memoizedState={dehydrated:t,treeContext:n,retryLane:1073741824},(n=Lc(18,null,null,0)).stateNode=t,n.return=e,e.child=n,no=e,ro=null,!0);default:return!1}}function so(e){return!(!(1&e.mode)||128&e.flags)}function co(e){if(ao){var t=ro;if(t){var n=t;if(!lo(e,t)){if(so(e))throw Error(o(418));t=ca(n.nextSibling);var r=no;t&&lo(e,t)?io(r,n):(e.flags=-4097&e.flags|2,ao=!1,no=e)}}else{if(so(e))throw Error(o(418));e.flags=-4097&e.flags|2,ao=!1,no=e}}}function uo(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&13!==e.tag;)e=e.return;no=e}function po(e){if(e!==no)return!1;if(!ao)return uo(e),ao=!0,!1;var t;if((t=3!==e.tag)&&!(t=5!==e.tag)&&(t="head"!==(t=e.type)&&"body"!==t&&!na(e.type,e.memoizedProps)),t&&(t=ro)){if(so(e))throw fo(),Error(o(418));for(;t;)io(e,t),t=ca(t.nextSibling)}if(uo(e),13===e.tag){if(!(e=null!==(e=e.memoizedState)?e.dehydrated:null))throw Error(o(317));e:{for(e=e.nextSibling,t=0;e;){if(8===e.nodeType){var n=e.data;if("/$"===n){if(0===t){ro=ca(e.nextSibling);break e}t--}else"$"!==n&&"$!"!==n&&"$?"!==n||t++}e=e.nextSibling}ro=null}}else ro=no?ca(e.stateNode.nextSibling):null;return!0}function fo(){for(var e=ro;e;)e=ca(e.nextSibling)}function mo(){ro=no=null,ao=!1}function ho(e){null===oo?oo=[e]:oo.push(e)}var go=w.ReactCurrentBatchConfig;function bo(e,t,n){if(null!==(e=n.ref)&&"function"!=typeof e&&"object"!=typeof e){if(n._owner){if(n=n._owner){if(1!==n.tag)throw Error(o(309));var r=n.stateNode}if(!r)throw Error(o(147,e));var a=r,i=""+e;return null!==t&&null!==t.ref&&"function"==typeof t.ref&&t.ref._stringRef===i?t.ref:(t=function(e){var t=a.refs;null===e?delete t[i]:t[i]=e},t._stringRef=i,t)}if("string"!=typeof e)throw Error(o(284));if(!n._owner)throw Error(o(290,e))}return e}function yo(e,t){throw e=Object.prototype.toString.call(t),Error(o(31,"[object Object]"===e?"object with keys {"+Object.keys(t).join(", ")+"}":e))}function vo(e){return(0,e._init)(e._payload)}function wo(e){function t(t,n){if(e){var r=t.deletions;null===r?(t.deletions=[n],t.flags|=16):r.push(n)}}function n(n,r){if(!e)return null;for(;null!==r;)t(n,r),r=r.sibling;return null}function r(e,t){for(e=new Map;null!==t;)null!==t.key?e.set(t.key,t):e.set(t.index,t),t=t.sibling;return e}function a(e,t){return(e=Rc(e,t)).index=0,e.sibling=null,e}function i(t,n,r){return t.index=r,e?null!==(r=t.alternate)?(r=r.index)<n?(t.flags|=2,n):r:(t.flags|=2,n):(t.flags|=1048576,n)}function l(t){return e&&null===t.alternate&&(t.flags|=2),t}function s(e,t,n,r){return null===t||6!==t.tag?((t=Mc(n,e.mode,r)).return=e,t):((t=a(t,n)).return=e,t)}function c(e,t,n,r){var o=n.type;return o===S?d(e,t,n.props.children,r,n.key):null!==t&&(t.elementType===o||"object"==typeof o&&null!==o&&o.$$typeof===N&&vo(o)===t.type)?((r=a(t,n.props)).ref=bo(e,t,n),r.return=e,r):((r=Oc(n.type,n.key,n.props,null,e.mode,r)).ref=bo(e,t,n),r.return=e,r)}function u(e,t,n,r){return null===t||4!==t.tag||t.stateNode.containerInfo!==n.containerInfo||t.stateNode.implementation!==n.implementation?((t=Fc(n,e.mode,r)).return=e,t):((t=a(t,n.children||[])).return=e,t)}function d(e,t,n,r,o){return null===t||7!==t.tag?((t=Dc(n,e.mode,r,o)).return=e,t):((t=a(t,n)).return=e,t)}function p(e,t,n){if("string"==typeof t&&""!==t||"number"==typeof t)return(t=Mc(""+t,e.mode,n)).return=e,t;if("object"==typeof t&&null!==t){switch(t.$$typeof){case k:return(n=Oc(t.type,t.key,t.props,null,e.mode,n)).ref=bo(e,null,t),n.return=e,n;case x:return(t=Fc(t,e.mode,n)).return=e,t;case N:return p(e,(0,t._init)(t._payload),n)}if(te(t)||D(t))return(t=Dc(t,e.mode,n,null)).return=e,t;yo(e,t)}return null}function f(e,t,n,r){var a=null!==t?t.key:null;if("string"==typeof n&&""!==n||"number"==typeof n)return null!==a?null:s(e,t,""+n,r);if("object"==typeof n&&null!==n){switch(n.$$typeof){case k:return n.key===a?c(e,t,n,r):null;case x:return n.key===a?u(e,t,n,r):null;case N:return f(e,t,(a=n._init)(n._payload),r)}if(te(n)||D(n))return null!==a?null:d(e,t,n,r,null);yo(e,n)}return null}function m(e,t,n,r,a){if("string"==typeof r&&""!==r||"number"==typeof r)return s(t,e=e.get(n)||null,""+r,a);if("object"==typeof r&&null!==r){switch(r.$$typeof){case k:return c(t,e=e.get(null===r.key?n:r.key)||null,r,a);case x:return u(t,e=e.get(null===r.key?n:r.key)||null,r,a);case N:return m(e,t,n,(0,r._init)(r._payload),a)}if(te(r)||D(r))return d(t,e=e.get(n)||null,r,a,null);yo(t,r)}return null}function h(a,o,l,s){for(var c=null,u=null,d=o,h=o=0,g=null;null!==d&&h<l.length;h++){d.index>h?(g=d,d=null):g=d.sibling;var b=f(a,d,l[h],s);if(null===b){null===d&&(d=g);break}e&&d&&null===b.alternate&&t(a,d),o=i(b,o,h),null===u?c=b:u.sibling=b,u=b,d=g}if(h===l.length)return n(a,d),ao&&Xa(a,h),c;if(null===d){for(;h<l.length;h++)null!==(d=p(a,l[h],s))&&(o=i(d,o,h),null===u?c=d:u.sibling=d,u=d);return ao&&Xa(a,h),c}for(d=r(a,d);h<l.length;h++)null!==(g=m(d,a,h,l[h],s))&&(e&&null!==g.alternate&&d.delete(null===g.key?h:g.key),o=i(g,o,h),null===u?c=g:u.sibling=g,u=g);return e&&d.forEach((function(e){return t(a,e)})),ao&&Xa(a,h),c}function g(a,l,s,c){var u=D(s);if("function"!=typeof u)throw Error(o(150));if(null==(s=u.call(s)))throw Error(o(151));for(var d=u=null,h=l,g=l=0,b=null,y=s.next();null!==h&&!y.done;g++,y=s.next()){h.index>g?(b=h,h=null):b=h.sibling;var v=f(a,h,y.value,c);if(null===v){null===h&&(h=b);break}e&&h&&null===v.alternate&&t(a,h),l=i(v,l,g),null===d?u=v:d.sibling=v,d=v,h=b}if(y.done)return n(a,h),ao&&Xa(a,g),u;if(null===h){for(;!y.done;g++,y=s.next())null!==(y=p(a,y.value,c))&&(l=i(y,l,g),null===d?u=y:d.sibling=y,d=y);return ao&&Xa(a,g),u}for(h=r(a,h);!y.done;g++,y=s.next())null!==(y=m(h,a,g,y.value,c))&&(e&&null!==y.alternate&&h.delete(null===y.key?g:y.key),l=i(y,l,g),null===d?u=y:d.sibling=y,d=y);return e&&h.forEach((function(e){return t(a,e)})),ao&&Xa(a,g),u}return function e(r,o,i,s){if("object"==typeof i&&null!==i&&i.type===S&&null===i.key&&(i=i.props.children),"object"==typeof i&&null!==i){switch(i.$$typeof){case k:e:{for(var c=i.key,u=o;null!==u;){if(u.key===c){if((c=i.type)===S){if(7===u.tag){n(r,u.sibling),(o=a(u,i.props.children)).return=r,r=o;break e}}else if(u.elementType===c||"object"==typeof c&&null!==c&&c.$$typeof===N&&vo(c)===u.type){n(r,u.sibling),(o=a(u,i.props)).ref=bo(r,u,i),o.return=r,r=o;break e}n(r,u);break}t(r,u),u=u.sibling}i.type===S?((o=Dc(i.props.children,r.mode,s,i.key)).return=r,r=o):((s=Oc(i.type,i.key,i.props,null,r.mode,s)).ref=bo(r,o,i),s.return=r,r=s)}return l(r);case x:e:{for(u=i.key;null!==o;){if(o.key===u){if(4===o.tag&&o.stateNode.containerInfo===i.containerInfo&&o.stateNode.implementation===i.implementation){n(r,o.sibling),(o=a(o,i.children||[])).return=r,r=o;break e}n(r,o);break}t(r,o),o=o.sibling}(o=Fc(i,r.mode,s)).return=r,r=o}return l(r);case N:return e(r,o,(u=i._init)(i._payload),s)}if(te(i))return h(r,o,i,s);if(D(i))return g(r,o,i,s);yo(r,i)}return"string"==typeof i&&""!==i||"number"==typeof i?(i=""+i,null!==o&&6===o.tag?(n(r,o.sibling),(o=a(o,i)).return=r,r=o):(n(r,o),(o=Mc(i,r.mode,s)).return=r,r=o),l(r)):n(r,o)}}var ko=wo(!0),xo=wo(!1),So=Ea(null),Eo=null,_o=null,Co=null;function Ao(){Co=_o=Eo=null}function To(e){var t=So.current;_a(So),e._currentValue=t}function Po(e,t,n){for(;null!==e;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,null!==r&&(r.childLanes|=t)):null!==r&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function jo(e,t){Eo=e,Co=_o=null,null!==(e=e.dependencies)&&null!==e.firstContext&&(!!(e.lanes&t)&&(vl=!0),e.firstContext=null)}function Lo(e){var t=e._currentValue;if(Co!==e)if(e={context:e,memoizedValue:t,next:null},null===_o){if(null===Eo)throw Error(o(308));_o=e,Eo.dependencies={lanes:0,firstContext:e}}else _o=_o.next=e;return t}var No=null;function Ro(e){null===No?No=[e]:No.push(e)}function Oo(e,t,n,r){var a=t.interleaved;return null===a?(n.next=n,Ro(t)):(n.next=a.next,a.next=n),t.interleaved=n,Do(e,r)}function Do(e,t){e.lanes|=t;var n=e.alternate;for(null!==n&&(n.lanes|=t),n=e,e=e.return;null!==e;)e.childLanes|=t,null!==(n=e.alternate)&&(n.childLanes|=t),n=e,e=e.return;return 3===n.tag?n.stateNode:null}var Io=!1;function Mo(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Fo(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function zo(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function Bo(e,t,n){var r=e.updateQueue;if(null===r)return null;if(r=r.shared,2&Ts){var a=r.pending;return null===a?t.next=t:(t.next=a.next,a.next=t),r.pending=t,Do(e,n)}return null===(a=r.interleaved)?(t.next=t,Ro(r)):(t.next=a.next,a.next=t),r.interleaved=t,Do(e,n)}function $o(e,t,n){if(null!==(t=t.updateQueue)&&(t=t.shared,4194240&n)){var r=t.lanes;n|=r&=e.pendingLanes,t.lanes=n,yt(e,n)}}function Uo(e,t){var n=e.updateQueue,r=e.alternate;if(null!==r&&n===(r=r.updateQueue)){var a=null,o=null;if(null!==(n=n.firstBaseUpdate)){do{var i={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};null===o?a=o=i:o=o.next=i,n=n.next}while(null!==n);null===o?a=o=t:o=o.next=t}else a=o=t;return n={baseState:r.baseState,firstBaseUpdate:a,lastBaseUpdate:o,shared:r.shared,effects:r.effects},void(e.updateQueue=n)}null===(e=n.lastBaseUpdate)?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function qo(e,t,n,r){var a=e.updateQueue;Io=!1;var o=a.firstBaseUpdate,i=a.lastBaseUpdate,l=a.shared.pending;if(null!==l){a.shared.pending=null;var s=l,c=s.next;s.next=null,null===i?o=c:i.next=c,i=s;var u=e.alternate;null!==u&&((l=(u=u.updateQueue).lastBaseUpdate)!==i&&(null===l?u.firstBaseUpdate=c:l.next=c,u.lastBaseUpdate=s))}if(null!==o){var d=a.baseState;for(i=0,u=c=s=null,l=o;;){var p=l.lane,f=l.eventTime;if((r&p)===p){null!==u&&(u=u.next={eventTime:f,lane:0,tag:l.tag,payload:l.payload,callback:l.callback,next:null});e:{var m=e,h=l;switch(p=t,f=n,h.tag){case 1:if("function"==typeof(m=h.payload)){d=m.call(f,d,p);break e}d=m;break e;case 3:m.flags=-65537&m.flags|128;case 0:if(null==(p="function"==typeof(m=h.payload)?m.call(f,d,p):m))break e;d=M({},d,p);break e;case 2:Io=!0}}null!==l.callback&&0!==l.lane&&(e.flags|=64,null===(p=a.effects)?a.effects=[l]:p.push(l))}else f={eventTime:f,lane:p,tag:l.tag,payload:l.payload,callback:l.callback,next:null},null===u?(c=u=f,s=d):u=u.next=f,i|=p;if(null===(l=l.next)){if(null===(l=a.shared.pending))break;l=(p=l).next,p.next=null,a.lastBaseUpdate=p,a.shared.pending=null}}if(null===u&&(s=d),a.baseState=s,a.firstBaseUpdate=c,a.lastBaseUpdate=u,null!==(t=a.shared.interleaved)){a=t;do{i|=a.lane,a=a.next}while(a!==t)}else null===o&&(a.shared.lanes=0);Is|=i,e.lanes=i,e.memoizedState=d}}function Ho(e,t,n){if(e=t.effects,t.effects=null,null!==e)for(t=0;t<e.length;t++){var r=e[t],a=r.callback;if(null!==a){if(r.callback=null,r=n,"function"!=typeof a)throw Error(o(191,a));a.call(r)}}}var Go={},Vo=Ea(Go),Wo=Ea(Go),Qo=Ea(Go);function Ko(e){if(e===Go)throw Error(o(174));return e}function Yo(e,t){switch(Ca(Qo,t),Ca(Wo,e),Ca(Vo,Go),e=t.nodeType){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:se(null,"");break;default:t=se(t=(e=8===e?t.parentNode:t).namespaceURI||null,e=e.tagName)}_a(Vo),Ca(Vo,t)}function Zo(){_a(Vo),_a(Wo),_a(Qo)}function Xo(e){Ko(Qo.current);var t=Ko(Vo.current),n=se(t,e.type);t!==n&&(Ca(Wo,e),Ca(Vo,n))}function Jo(e){Wo.current===e&&(_a(Vo),_a(Wo))}var ei=Ea(0);function ti(e){for(var t=e;null!==t;){if(13===t.tag){var n=t.memoizedState;if(null!==n&&(null===(n=n.dehydrated)||"$?"===n.data||"$!"===n.data))return t}else if(19===t.tag&&void 0!==t.memoizedProps.revealOrder){if(128&t.flags)return t}else if(null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var ni=[];function ri(){for(var e=0;e<ni.length;e++)ni[e]._workInProgressVersionPrimary=null;ni.length=0}var ai=w.ReactCurrentDispatcher,oi=w.ReactCurrentBatchConfig,ii=0,li=null,si=null,ci=null,ui=!1,di=!1,pi=0,fi=0;function mi(){throw Error(o(321))}function hi(e,t){if(null===t)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!lr(e[n],t[n]))return!1;return!0}function gi(e,t,n,r,a,i){if(ii=i,li=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,ai.current=null===e||null===e.memoizedState?Ji:el,e=n(r,a),di){i=0;do{if(di=!1,pi=0,25<=i)throw Error(o(301));i+=1,ci=si=null,t.updateQueue=null,ai.current=tl,e=n(r,a)}while(di)}if(ai.current=Xi,t=null!==si&&null!==si.next,ii=0,ci=si=li=null,ui=!1,t)throw Error(o(300));return e}function bi(){var e=0!==pi;return pi=0,e}function yi(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===ci?li.memoizedState=ci=e:ci=ci.next=e,ci}function vi(){if(null===si){var e=li.alternate;e=null!==e?e.memoizedState:null}else e=si.next;var t=null===ci?li.memoizedState:ci.next;if(null!==t)ci=t,si=e;else{if(null===e)throw Error(o(310));e={memoizedState:(si=e).memoizedState,baseState:si.baseState,baseQueue:si.baseQueue,queue:si.queue,next:null},null===ci?li.memoizedState=ci=e:ci=ci.next=e}return ci}function wi(e,t){return"function"==typeof t?t(e):t}function ki(e){var t=vi(),n=t.queue;if(null===n)throw Error(o(311));n.lastRenderedReducer=e;var r=si,a=r.baseQueue,i=n.pending;if(null!==i){if(null!==a){var l=a.next;a.next=i.next,i.next=l}r.baseQueue=a=i,n.pending=null}if(null!==a){i=a.next,r=r.baseState;var s=l=null,c=null,u=i;do{var d=u.lane;if((ii&d)===d)null!==c&&(c=c.next={lane:0,action:u.action,hasEagerState:u.hasEagerState,eagerState:u.eagerState,next:null}),r=u.hasEagerState?u.eagerState:e(r,u.action);else{var p={lane:d,action:u.action,hasEagerState:u.hasEagerState,eagerState:u.eagerState,next:null};null===c?(s=c=p,l=r):c=c.next=p,li.lanes|=d,Is|=d}u=u.next}while(null!==u&&u!==i);null===c?l=r:c.next=s,lr(r,t.memoizedState)||(vl=!0),t.memoizedState=r,t.baseState=l,t.baseQueue=c,n.lastRenderedState=r}if(null!==(e=n.interleaved)){a=e;do{i=a.lane,li.lanes|=i,Is|=i,a=a.next}while(a!==e)}else null===a&&(n.lanes=0);return[t.memoizedState,n.dispatch]}function xi(e){var t=vi(),n=t.queue;if(null===n)throw Error(o(311));n.lastRenderedReducer=e;var r=n.dispatch,a=n.pending,i=t.memoizedState;if(null!==a){n.pending=null;var l=a=a.next;do{i=e(i,l.action),l=l.next}while(l!==a);lr(i,t.memoizedState)||(vl=!0),t.memoizedState=i,null===t.baseQueue&&(t.baseState=i),n.lastRenderedState=i}return[i,r]}function Si(){}function Ei(e,t){var n=li,r=vi(),a=t(),i=!lr(r.memoizedState,a);if(i&&(r.memoizedState=a,vl=!0),r=r.queue,Ii(Ai.bind(null,n,r,e),[e]),r.getSnapshot!==t||i||null!==ci&&1&ci.memoizedState.tag){if(n.flags|=2048,Li(9,Ci.bind(null,n,r,a,t),void 0,null),null===Ps)throw Error(o(349));30&ii||_i(n,t,a)}return a}function _i(e,t,n){e.flags|=16384,e={getSnapshot:t,value:n},null===(t=li.updateQueue)?(t={lastEffect:null,stores:null},li.updateQueue=t,t.stores=[e]):null===(n=t.stores)?t.stores=[e]:n.push(e)}function Ci(e,t,n,r){t.value=n,t.getSnapshot=r,Ti(t)&&Pi(e)}function Ai(e,t,n){return n((function(){Ti(t)&&Pi(e)}))}function Ti(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!lr(e,n)}catch(r){return!0}}function Pi(e){var t=Do(e,1);null!==t&&nc(t,e,1,-1)}function ji(e){var t=yi();return"function"==typeof e&&(e=e()),t.memoizedState=t.baseState=e,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:wi,lastRenderedState:e},t.queue=e,e=e.dispatch=Qi.bind(null,li,e),[t.memoizedState,e]}function Li(e,t,n,r){return e={tag:e,create:t,destroy:n,deps:r,next:null},null===(t=li.updateQueue)?(t={lastEffect:null,stores:null},li.updateQueue=t,t.lastEffect=e.next=e):null===(n=t.lastEffect)?t.lastEffect=e.next=e:(r=n.next,n.next=e,e.next=r,t.lastEffect=e),e}function Ni(){return vi().memoizedState}function Ri(e,t,n,r){var a=yi();li.flags|=e,a.memoizedState=Li(1|t,n,void 0,void 0===r?null:r)}function Oi(e,t,n,r){var a=vi();r=void 0===r?null:r;var o=void 0;if(null!==si){var i=si.memoizedState;if(o=i.destroy,null!==r&&hi(r,i.deps))return void(a.memoizedState=Li(t,n,o,r))}li.flags|=e,a.memoizedState=Li(1|t,n,o,r)}function Di(e,t){return Ri(8390656,8,e,t)}function Ii(e,t){return Oi(2048,8,e,t)}function Mi(e,t){return Oi(4,2,e,t)}function Fi(e,t){return Oi(4,4,e,t)}function zi(e,t){return"function"==typeof t?(e=e(),t(e),function(){t(null)}):null!=t?(e=e(),t.current=e,function(){t.current=null}):void 0}function Bi(e,t,n){return n=null!=n?n.concat([e]):null,Oi(4,4,zi.bind(null,t,e),n)}function $i(){}function Ui(e,t){var n=vi();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&hi(t,r[1])?r[0]:(n.memoizedState=[e,t],e)}function qi(e,t){var n=vi();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&hi(t,r[1])?r[0]:(e=e(),n.memoizedState=[e,t],e)}function Hi(e,t,n){return 21&ii?(lr(n,t)||(n=ht(),li.lanes|=n,Is|=n,e.baseState=!0),t):(e.baseState&&(e.baseState=!1,vl=!0),e.memoizedState=n)}function Gi(e,t){var n=vt;vt=0!==n&&4>n?n:4,e(!0);var r=oi.transition;oi.transition={};try{e(!1),t()}finally{vt=n,oi.transition=r}}function Vi(){return vi().memoizedState}function Wi(e,t,n){var r=tc(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},Ki(e))Yi(t,n);else if(null!==(n=Oo(e,t,n,r))){nc(n,e,r,ec()),Zi(n,t,r)}}function Qi(e,t,n){var r=tc(e),a={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(Ki(e))Yi(t,a);else{var o=e.alternate;if(0===e.lanes&&(null===o||0===o.lanes)&&null!==(o=t.lastRenderedReducer))try{var i=t.lastRenderedState,l=o(i,n);if(a.hasEagerState=!0,a.eagerState=l,lr(l,i)){var s=t.interleaved;return null===s?(a.next=a,Ro(t)):(a.next=s.next,s.next=a),void(t.interleaved=a)}}catch(c){}null!==(n=Oo(e,t,a,r))&&(nc(n,e,r,a=ec()),Zi(n,t,r))}}function Ki(e){var t=e.alternate;return e===li||null!==t&&t===li}function Yi(e,t){di=ui=!0;var n=e.pending;null===n?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Zi(e,t,n){if(4194240&n){var r=t.lanes;n|=r&=e.pendingLanes,t.lanes=n,yt(e,n)}}var Xi={readContext:Lo,useCallback:mi,useContext:mi,useEffect:mi,useImperativeHandle:mi,useInsertionEffect:mi,useLayoutEffect:mi,useMemo:mi,useReducer:mi,useRef:mi,useState:mi,useDebugValue:mi,useDeferredValue:mi,useTransition:mi,useMutableSource:mi,useSyncExternalStore:mi,useId:mi,unstable_isNewReconciler:!1},Ji={readContext:Lo,useCallback:function(e,t){return yi().memoizedState=[e,void 0===t?null:t],e},useContext:Lo,useEffect:Di,useImperativeHandle:function(e,t,n){return n=null!=n?n.concat([e]):null,Ri(4194308,4,zi.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Ri(4194308,4,e,t)},useInsertionEffect:function(e,t){return Ri(4,2,e,t)},useMemo:function(e,t){var n=yi();return t=void 0===t?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=yi();return t=void 0!==n?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=Wi.bind(null,li,e),[r.memoizedState,e]},useRef:function(e){return e={current:e},yi().memoizedState=e},useState:ji,useDebugValue:$i,useDeferredValue:function(e){return yi().memoizedState=e},useTransition:function(){var e=ji(!1),t=e[0];return e=Gi.bind(null,e[1]),yi().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=li,a=yi();if(ao){if(void 0===n)throw Error(o(407));n=n()}else{if(n=t(),null===Ps)throw Error(o(349));30&ii||_i(r,t,n)}a.memoizedState=n;var i={value:n,getSnapshot:t};return a.queue=i,Di(Ai.bind(null,r,i,e),[e]),r.flags|=2048,Li(9,Ci.bind(null,r,i,n,t),void 0,null),n},useId:function(){var e=yi(),t=Ps.identifierPrefix;if(ao){var n=Za;t=":"+t+"R"+(n=(Ya&~(1<<32-it(Ya)-1)).toString(32)+n),0<(n=pi++)&&(t+="H"+n.toString(32)),t+=":"}else t=":"+t+"r"+(n=fi++).toString(32)+":";return e.memoizedState=t},unstable_isNewReconciler:!1},el={readContext:Lo,useCallback:Ui,useContext:Lo,useEffect:Ii,useImperativeHandle:Bi,useInsertionEffect:Mi,useLayoutEffect:Fi,useMemo:qi,useReducer:ki,useRef:Ni,useState:function(){return ki(wi)},useDebugValue:$i,useDeferredValue:function(e){return Hi(vi(),si.memoizedState,e)},useTransition:function(){return[ki(wi)[0],vi().memoizedState]},useMutableSource:Si,useSyncExternalStore:Ei,useId:Vi,unstable_isNewReconciler:!1},tl={readContext:Lo,useCallback:Ui,useContext:Lo,useEffect:Ii,useImperativeHandle:Bi,useInsertionEffect:Mi,useLayoutEffect:Fi,useMemo:qi,useReducer:xi,useRef:Ni,useState:function(){return xi(wi)},useDebugValue:$i,useDeferredValue:function(e){var t=vi();return null===si?t.memoizedState=e:Hi(t,si.memoizedState,e)},useTransition:function(){return[xi(wi)[0],vi().memoizedState]},useMutableSource:Si,useSyncExternalStore:Ei,useId:Vi,unstable_isNewReconciler:!1};function nl(e,t){if(e&&e.defaultProps){for(var n in t=M({},t),e=e.defaultProps)void 0===t[n]&&(t[n]=e[n]);return t}return t}function rl(e,t,n,r){n=null==(n=n(r,t=e.memoizedState))?t:M({},t,n),e.memoizedState=n,0===e.lanes&&(e.updateQueue.baseState=n)}var al={isMounted:function(e){return!!(e=e._reactInternals)&&Ue(e)===e},enqueueSetState:function(e,t,n){e=e._reactInternals;var r=ec(),a=tc(e),o=zo(r,a);o.payload=t,null!=n&&(o.callback=n),null!==(t=Bo(e,o,a))&&(nc(t,e,a,r),$o(t,e,a))},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=ec(),a=tc(e),o=zo(r,a);o.tag=1,o.payload=t,null!=n&&(o.callback=n),null!==(t=Bo(e,o,a))&&(nc(t,e,a,r),$o(t,e,a))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=ec(),r=tc(e),a=zo(n,r);a.tag=2,null!=t&&(a.callback=t),null!==(t=Bo(e,a,r))&&(nc(t,e,r,n),$o(t,e,r))}};function ol(e,t,n,r,a,o,i){return"function"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(r,o,i):!t.prototype||!t.prototype.isPureReactComponent||(!sr(n,r)||!sr(a,o))}function il(e,t,n){var r=!1,a=Aa,o=t.contextType;return"object"==typeof o&&null!==o?o=Lo(o):(a=Na(t)?ja:Ta.current,o=(r=null!=(r=t.contextTypes))?La(e,a):Aa),t=new t(n,o),e.memoizedState=null!==t.state&&void 0!==t.state?t.state:null,t.updater=al,e.stateNode=t,t._reactInternals=e,r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=a,e.__reactInternalMemoizedMaskedChildContext=o),t}function ll(e,t,n,r){e=t.state,"function"==typeof t.componentWillReceiveProps&&t.componentWillReceiveProps(n,r),"function"==typeof t.UNSAFE_componentWillReceiveProps&&t.UNSAFE_componentWillReceiveProps(n,r),t.state!==e&&al.enqueueReplaceState(t,t.state,null)}function sl(e,t,n,r){var a=e.stateNode;a.props=n,a.state=e.memoizedState,a.refs={},Mo(e);var o=t.contextType;"object"==typeof o&&null!==o?a.context=Lo(o):(o=Na(t)?ja:Ta.current,a.context=La(e,o)),a.state=e.memoizedState,"function"==typeof(o=t.getDerivedStateFromProps)&&(rl(e,t,o,n),a.state=e.memoizedState),"function"==typeof t.getDerivedStateFromProps||"function"==typeof a.getSnapshotBeforeUpdate||"function"!=typeof a.UNSAFE_componentWillMount&&"function"!=typeof a.componentWillMount||(t=a.state,"function"==typeof a.componentWillMount&&a.componentWillMount(),"function"==typeof a.UNSAFE_componentWillMount&&a.UNSAFE_componentWillMount(),t!==a.state&&al.enqueueReplaceState(a,a.state,null),qo(e,n,a,r),a.state=e.memoizedState),"function"==typeof a.componentDidMount&&(e.flags|=4194308)}function cl(e,t){try{var n="",r=t;do{n+=$(r),r=r.return}while(r);var a=n}catch(o){a="\nError generating stack: "+o.message+"\n"+o.stack}return{value:e,source:t,stack:a,digest:null}}function ul(e,t,n){return{value:e,source:null,stack:null!=n?n:null,digest:null!=t?t:null}}function dl(e,t){try{console.error(t.value)}catch(n){setTimeout((function(){throw n}))}}var pl="function"==typeof WeakMap?WeakMap:Map;function fl(e,t,n){(n=zo(-1,n)).tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){Hs||(Hs=!0,Gs=r),dl(0,t)},n}function ml(e,t,n){(n=zo(-1,n)).tag=3;var r=e.type.getDerivedStateFromError;if("function"==typeof r){var a=t.value;n.payload=function(){return r(a)},n.callback=function(){dl(0,t)}}var o=e.stateNode;return null!==o&&"function"==typeof o.componentDidCatch&&(n.callback=function(){dl(0,t),"function"!=typeof r&&(null===Vs?Vs=new Set([this]):Vs.add(this));var e=t.stack;this.componentDidCatch(t.value,{componentStack:null!==e?e:""})}),n}function hl(e,t,n){var r=e.pingCache;if(null===r){r=e.pingCache=new pl;var a=new Set;r.set(t,a)}else void 0===(a=r.get(t))&&(a=new Set,r.set(t,a));a.has(n)||(a.add(n),e=_c.bind(null,e,t,n),t.then(e,e))}function gl(e){do{var t;if((t=13===e.tag)&&(t=null===(t=e.memoizedState)||null!==t.dehydrated),t)return e;e=e.return}while(null!==e);return null}function bl(e,t,n,r,a){return 1&e.mode?(e.flags|=65536,e.lanes=a,e):(e===t?e.flags|=65536:(e.flags|=128,n.flags|=131072,n.flags&=-52805,1===n.tag&&(null===n.alternate?n.tag=17:((t=zo(-1,1)).tag=2,Bo(n,t,1))),n.lanes|=1),e)}var yl=w.ReactCurrentOwner,vl=!1;function wl(e,t,n,r){t.child=null===e?xo(t,null,n,r):ko(t,e.child,n,r)}function kl(e,t,n,r,a){n=n.render;var o=t.ref;return jo(t,a),r=gi(e,t,n,r,o,a),n=bi(),null===e||vl?(ao&&n&&eo(t),t.flags|=1,wl(e,t,r,a),t.child):(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~a,Hl(e,t,a))}function xl(e,t,n,r,a){if(null===e){var o=n.type;return"function"!=typeof o||Nc(o)||void 0!==o.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=Oc(n.type,null,r,t,t.mode,a)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=o,Sl(e,t,o,r,a))}if(o=e.child,!(e.lanes&a)){var i=o.memoizedProps;if((n=null!==(n=n.compare)?n:sr)(i,r)&&e.ref===t.ref)return Hl(e,t,a)}return t.flags|=1,(e=Rc(o,r)).ref=t.ref,e.return=t,t.child=e}function Sl(e,t,n,r,a){if(null!==e){var o=e.memoizedProps;if(sr(o,r)&&e.ref===t.ref){if(vl=!1,t.pendingProps=r=o,!(e.lanes&a))return t.lanes=e.lanes,Hl(e,t,a);131072&e.flags&&(vl=!0)}}return Cl(e,t,n,r,a)}function El(e,t,n){var r=t.pendingProps,a=r.children,o=null!==e?e.memoizedState:null;if("hidden"===r.mode)if(1&t.mode){if(!(1073741824&n))return e=null!==o?o.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,Ca(Rs,Ns),Ns|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},r=null!==o?o.baseLanes:n,Ca(Rs,Ns),Ns|=r}else t.memoizedState={baseLanes:0,cachePool:null,transitions:null},Ca(Rs,Ns),Ns|=n;else null!==o?(r=o.baseLanes|n,t.memoizedState=null):r=n,Ca(Rs,Ns),Ns|=r;return wl(e,t,a,n),t.child}function _l(e,t){var n=t.ref;(null===e&&null!==n||null!==e&&e.ref!==n)&&(t.flags|=512,t.flags|=2097152)}function Cl(e,t,n,r,a){var o=Na(n)?ja:Ta.current;return o=La(t,o),jo(t,a),n=gi(e,t,n,r,o,a),r=bi(),null===e||vl?(ao&&r&&eo(t),t.flags|=1,wl(e,t,n,a),t.child):(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~a,Hl(e,t,a))}function Al(e,t,n,r,a){if(Na(n)){var o=!0;Ia(t)}else o=!1;if(jo(t,a),null===t.stateNode)ql(e,t),il(t,n,r),sl(t,n,r,a),r=!0;else if(null===e){var i=t.stateNode,l=t.memoizedProps;i.props=l;var s=i.context,c=n.contextType;"object"==typeof c&&null!==c?c=Lo(c):c=La(t,c=Na(n)?ja:Ta.current);var u=n.getDerivedStateFromProps,d="function"==typeof u||"function"==typeof i.getSnapshotBeforeUpdate;d||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(l!==r||s!==c)&&ll(t,i,r,c),Io=!1;var p=t.memoizedState;i.state=p,qo(t,r,i,a),s=t.memoizedState,l!==r||p!==s||Pa.current||Io?("function"==typeof u&&(rl(t,n,u,r),s=t.memoizedState),(l=Io||ol(t,n,l,r,p,s,c))?(d||"function"!=typeof i.UNSAFE_componentWillMount&&"function"!=typeof i.componentWillMount||("function"==typeof i.componentWillMount&&i.componentWillMount(),"function"==typeof i.UNSAFE_componentWillMount&&i.UNSAFE_componentWillMount()),"function"==typeof i.componentDidMount&&(t.flags|=4194308)):("function"==typeof i.componentDidMount&&(t.flags|=4194308),t.memoizedProps=r,t.memoizedState=s),i.props=r,i.state=s,i.context=c,r=l):("function"==typeof i.componentDidMount&&(t.flags|=4194308),r=!1)}else{i=t.stateNode,Fo(e,t),l=t.memoizedProps,c=t.type===t.elementType?l:nl(t.type,l),i.props=c,d=t.pendingProps,p=i.context,"object"==typeof(s=n.contextType)&&null!==s?s=Lo(s):s=La(t,s=Na(n)?ja:Ta.current);var f=n.getDerivedStateFromProps;(u="function"==typeof f||"function"==typeof i.getSnapshotBeforeUpdate)||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(l!==d||p!==s)&&ll(t,i,r,s),Io=!1,p=t.memoizedState,i.state=p,qo(t,r,i,a);var m=t.memoizedState;l!==d||p!==m||Pa.current||Io?("function"==typeof f&&(rl(t,n,f,r),m=t.memoizedState),(c=Io||ol(t,n,c,r,p,m,s)||!1)?(u||"function"!=typeof i.UNSAFE_componentWillUpdate&&"function"!=typeof i.componentWillUpdate||("function"==typeof i.componentWillUpdate&&i.componentWillUpdate(r,m,s),"function"==typeof i.UNSAFE_componentWillUpdate&&i.UNSAFE_componentWillUpdate(r,m,s)),"function"==typeof i.componentDidUpdate&&(t.flags|=4),"function"==typeof i.getSnapshotBeforeUpdate&&(t.flags|=1024)):("function"!=typeof i.componentDidUpdate||l===e.memoizedProps&&p===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||l===e.memoizedProps&&p===e.memoizedState||(t.flags|=1024),t.memoizedProps=r,t.memoizedState=m),i.props=r,i.state=m,i.context=s,r=c):("function"!=typeof i.componentDidUpdate||l===e.memoizedProps&&p===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||l===e.memoizedProps&&p===e.memoizedState||(t.flags|=1024),r=!1)}return Tl(e,t,n,r,o,a)}function Tl(e,t,n,r,a,o){_l(e,t);var i=!!(128&t.flags);if(!r&&!i)return a&&Ma(t,n,!1),Hl(e,t,o);r=t.stateNode,yl.current=t;var l=i&&"function"!=typeof n.getDerivedStateFromError?null:r.render();return t.flags|=1,null!==e&&i?(t.child=ko(t,e.child,null,o),t.child=ko(t,null,l,o)):wl(e,t,l,o),t.memoizedState=r.state,a&&Ma(t,n,!0),t.child}function Pl(e){var t=e.stateNode;t.pendingContext?Oa(0,t.pendingContext,t.pendingContext!==t.context):t.context&&Oa(0,t.context,!1),Yo(e,t.containerInfo)}function jl(e,t,n,r,a){return mo(),ho(a),t.flags|=256,wl(e,t,n,r),t.child}var Ll,Nl,Rl,Ol,Dl={dehydrated:null,treeContext:null,retryLane:0};function Il(e){return{baseLanes:e,cachePool:null,transitions:null}}function Ml(e,t,n){var r,a=t.pendingProps,i=ei.current,l=!1,s=!!(128&t.flags);if((r=s)||(r=(null===e||null!==e.memoizedState)&&!!(2&i)),r?(l=!0,t.flags&=-129):null!==e&&null===e.memoizedState||(i|=1),Ca(ei,1&i),null===e)return co(t),null!==(e=t.memoizedState)&&null!==(e=e.dehydrated)?(1&t.mode?"$!"===e.data?t.lanes=8:t.lanes=1073741824:t.lanes=1,null):(s=a.children,e=a.fallback,l?(a=t.mode,l=t.child,s={mode:"hidden",children:s},1&a||null===l?l=Ic(s,a,0,null):(l.childLanes=0,l.pendingProps=s),e=Dc(e,a,n,null),l.return=t,e.return=t,l.sibling=e,t.child=l,t.child.memoizedState=Il(n),t.memoizedState=Dl,e):Fl(t,s));if(null!==(i=e.memoizedState)&&null!==(r=i.dehydrated))return function(e,t,n,r,a,i,l){if(n)return 256&t.flags?(t.flags&=-257,zl(e,t,l,r=ul(Error(o(422))))):null!==t.memoizedState?(t.child=e.child,t.flags|=128,null):(i=r.fallback,a=t.mode,r=Ic({mode:"visible",children:r.children},a,0,null),(i=Dc(i,a,l,null)).flags|=2,r.return=t,i.return=t,r.sibling=i,t.child=r,1&t.mode&&ko(t,e.child,null,l),t.child.memoizedState=Il(l),t.memoizedState=Dl,i);if(!(1&t.mode))return zl(e,t,l,null);if("$!"===a.data){if(r=a.nextSibling&&a.nextSibling.dataset)var s=r.dgst;return r=s,zl(e,t,l,r=ul(i=Error(o(419)),r,void 0))}if(s=!!(l&e.childLanes),vl||s){if(null!==(r=Ps)){switch(l&-l){case 4:a=2;break;case 16:a=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:a=32;break;case 536870912:a=268435456;break;default:a=0}0!==(a=a&(r.suspendedLanes|l)?0:a)&&a!==i.retryLane&&(i.retryLane=a,Do(e,a),nc(r,e,a,-1))}return hc(),zl(e,t,l,r=ul(Error(o(421))))}return"$?"===a.data?(t.flags|=128,t.child=e.child,t=Ac.bind(null,e),a._reactRetry=t,null):(e=i.treeContext,ro=ca(a.nextSibling),no=t,ao=!0,oo=null,null!==e&&(Wa[Qa++]=Ya,Wa[Qa++]=Za,Wa[Qa++]=Ka,Ya=e.id,Za=e.overflow,Ka=t),t=Fl(t,r.children),t.flags|=4096,t)}(e,t,s,a,r,i,n);if(l){l=a.fallback,s=t.mode,r=(i=e.child).sibling;var c={mode:"hidden",children:a.children};return 1&s||t.child===i?(a=Rc(i,c)).subtreeFlags=14680064&i.subtreeFlags:((a=t.child).childLanes=0,a.pendingProps=c,t.deletions=null),null!==r?l=Rc(r,l):(l=Dc(l,s,n,null)).flags|=2,l.return=t,a.return=t,a.sibling=l,t.child=a,a=l,l=t.child,s=null===(s=e.child.memoizedState)?Il(n):{baseLanes:s.baseLanes|n,cachePool:null,transitions:s.transitions},l.memoizedState=s,l.childLanes=e.childLanes&~n,t.memoizedState=Dl,a}return e=(l=e.child).sibling,a=Rc(l,{mode:"visible",children:a.children}),!(1&t.mode)&&(a.lanes=n),a.return=t,a.sibling=null,null!==e&&(null===(n=t.deletions)?(t.deletions=[e],t.flags|=16):n.push(e)),t.child=a,t.memoizedState=null,a}function Fl(e,t){return(t=Ic({mode:"visible",children:t},e.mode,0,null)).return=e,e.child=t}function zl(e,t,n,r){return null!==r&&ho(r),ko(t,e.child,null,n),(e=Fl(t,t.pendingProps.children)).flags|=2,t.memoizedState=null,e}function Bl(e,t,n){e.lanes|=t;var r=e.alternate;null!==r&&(r.lanes|=t),Po(e.return,t,n)}function $l(e,t,n,r,a){var o=e.memoizedState;null===o?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:a}:(o.isBackwards=t,o.rendering=null,o.renderingStartTime=0,o.last=r,o.tail=n,o.tailMode=a)}function Ul(e,t,n){var r=t.pendingProps,a=r.revealOrder,o=r.tail;if(wl(e,t,r.children,n),2&(r=ei.current))r=1&r|2,t.flags|=128;else{if(null!==e&&128&e.flags)e:for(e=t.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&Bl(e,n,t);else if(19===e.tag)Bl(e,n,t);else if(null!==e.child){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;null===e.sibling;){if(null===e.return||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}if(Ca(ei,r),1&t.mode)switch(a){case"forwards":for(n=t.child,a=null;null!==n;)null!==(e=n.alternate)&&null===ti(e)&&(a=n),n=n.sibling;null===(n=a)?(a=t.child,t.child=null):(a=n.sibling,n.sibling=null),$l(t,!1,a,n,o);break;case"backwards":for(n=null,a=t.child,t.child=null;null!==a;){if(null!==(e=a.alternate)&&null===ti(e)){t.child=a;break}e=a.sibling,a.sibling=n,n=a,a=e}$l(t,!0,n,null,o);break;case"together":$l(t,!1,null,null,void 0);break;default:t.memoizedState=null}else t.memoizedState=null;return t.child}function ql(e,t){!(1&t.mode)&&null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2)}function Hl(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),Is|=t.lanes,!(n&t.childLanes))return null;if(null!==e&&t.child!==e.child)throw Error(o(153));if(null!==t.child){for(n=Rc(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=Rc(e,e.pendingProps)).return=t;n.sibling=null}return t.child}function Gl(e,t){if(!ao)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;null!==t;)null!==t.alternate&&(n=t),t=t.sibling;null===n?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var r=null;null!==n;)null!==n.alternate&&(r=n),n=n.sibling;null===r?t||null===e.tail?e.tail=null:e.tail.sibling=null:r.sibling=null}}function Vl(e){var t=null!==e.alternate&&e.alternate.child===e.child,n=0,r=0;if(t)for(var a=e.child;null!==a;)n|=a.lanes|a.childLanes,r|=14680064&a.subtreeFlags,r|=14680064&a.flags,a.return=e,a=a.sibling;else for(a=e.child;null!==a;)n|=a.lanes|a.childLanes,r|=a.subtreeFlags,r|=a.flags,a.return=e,a=a.sibling;return e.subtreeFlags|=r,e.childLanes=n,t}function Wl(e,t,n){var r=t.pendingProps;switch(to(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Vl(t),null;case 1:case 17:return Na(t.type)&&Ra(),Vl(t),null;case 3:return r=t.stateNode,Zo(),_a(Pa),_a(Ta),ri(),r.pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),null!==e&&null!==e.child||(po(t)?t.flags|=4:null===e||e.memoizedState.isDehydrated&&!(256&t.flags)||(t.flags|=1024,null!==oo&&(ic(oo),oo=null))),Nl(e,t),Vl(t),null;case 5:Jo(t);var a=Ko(Qo.current);if(n=t.type,null!==e&&null!=t.stateNode)Rl(e,t,n,r,a),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!r){if(null===t.stateNode)throw Error(o(166));return Vl(t),null}if(e=Ko(Vo.current),po(t)){r=t.stateNode,n=t.type;var i=t.memoizedProps;switch(r[pa]=t,r[fa]=i,e=!!(1&t.mode),n){case"dialog":zr("cancel",r),zr("close",r);break;case"iframe":case"object":case"embed":zr("load",r);break;case"video":case"audio":for(a=0;a<Dr.length;a++)zr(Dr[a],r);break;case"source":zr("error",r);break;case"img":case"image":case"link":zr("error",r),zr("load",r);break;case"details":zr("toggle",r);break;case"input":Y(r,i),zr("invalid",r);break;case"select":r._wrapperState={wasMultiple:!!i.multiple},zr("invalid",r);break;case"textarea":ae(r,i),zr("invalid",r)}for(var s in ye(n,i),a=null,i)if(i.hasOwnProperty(s)){var c=i[s];"children"===s?"string"==typeof c?r.textContent!==c&&(!0!==i.suppressHydrationWarning&&Xr(r.textContent,c,e),a=["children",c]):"number"==typeof c&&r.textContent!==""+c&&(!0!==i.suppressHydrationWarning&&Xr(r.textContent,c,e),a=["children",""+c]):l.hasOwnProperty(s)&&null!=c&&"onScroll"===s&&zr("scroll",r)}switch(n){case"input":V(r),J(r,i,!0);break;case"textarea":V(r),ie(r);break;case"select":case"option":break;default:"function"==typeof i.onClick&&(r.onclick=Jr)}r=a,t.updateQueue=r,null!==r&&(t.flags|=4)}else{s=9===a.nodeType?a:a.ownerDocument,"http://www.w3.org/1999/xhtml"===e&&(e=le(n)),"http://www.w3.org/1999/xhtml"===e?"script"===n?((e=s.createElement("div")).innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):"string"==typeof r.is?e=s.createElement(n,{is:r.is}):(e=s.createElement(n),"select"===n&&(s=e,r.multiple?s.multiple=!0:r.size&&(s.size=r.size))):e=s.createElementNS(e,n),e[pa]=t,e[fa]=r,Ll(e,t,!1,!1),t.stateNode=e;e:{switch(s=ve(n,r),n){case"dialog":zr("cancel",e),zr("close",e),a=r;break;case"iframe":case"object":case"embed":zr("load",e),a=r;break;case"video":case"audio":for(a=0;a<Dr.length;a++)zr(Dr[a],e);a=r;break;case"source":zr("error",e),a=r;break;case"img":case"image":case"link":zr("error",e),zr("load",e),a=r;break;case"details":zr("toggle",e),a=r;break;case"input":Y(e,r),a=K(e,r),zr("invalid",e);break;case"option":default:a=r;break;case"select":e._wrapperState={wasMultiple:!!r.multiple},a=M({},r,{value:void 0}),zr("invalid",e);break;case"textarea":ae(e,r),a=re(e,r),zr("invalid",e)}for(i in ye(n,a),c=a)if(c.hasOwnProperty(i)){var u=c[i];"style"===i?ge(e,u):"dangerouslySetInnerHTML"===i?null!=(u=u?u.__html:void 0)&&de(e,u):"children"===i?"string"==typeof u?("textarea"!==n||""!==u)&&pe(e,u):"number"==typeof u&&pe(e,""+u):"suppressContentEditableWarning"!==i&&"suppressHydrationWarning"!==i&&"autoFocus"!==i&&(l.hasOwnProperty(i)?null!=u&&"onScroll"===i&&zr("scroll",e):null!=u&&v(e,i,u,s))}switch(n){case"input":V(e),J(e,r,!1);break;case"textarea":V(e),ie(e);break;case"option":null!=r.value&&e.setAttribute("value",""+H(r.value));break;case"select":e.multiple=!!r.multiple,null!=(i=r.value)?ne(e,!!r.multiple,i,!1):null!=r.defaultValue&&ne(e,!!r.multiple,r.defaultValue,!0);break;default:"function"==typeof a.onClick&&(e.onclick=Jr)}switch(n){case"button":case"input":case"select":case"textarea":r=!!r.autoFocus;break e;case"img":r=!0;break e;default:r=!1}}r&&(t.flags|=4)}null!==t.ref&&(t.flags|=512,t.flags|=2097152)}return Vl(t),null;case 6:if(e&&null!=t.stateNode)Ol(e,t,e.memoizedProps,r);else{if("string"!=typeof r&&null===t.stateNode)throw Error(o(166));if(n=Ko(Qo.current),Ko(Vo.current),po(t)){if(r=t.stateNode,n=t.memoizedProps,r[pa]=t,(i=r.nodeValue!==n)&&null!==(e=no))switch(e.tag){case 3:Xr(r.nodeValue,n,!!(1&e.mode));break;case 5:!0!==e.memoizedProps.suppressHydrationWarning&&Xr(r.nodeValue,n,!!(1&e.mode))}i&&(t.flags|=4)}else(r=(9===n.nodeType?n:n.ownerDocument).createTextNode(r))[pa]=t,t.stateNode=r}return Vl(t),null;case 13:if(_a(ei),r=t.memoizedState,null===e||null!==e.memoizedState&&null!==e.memoizedState.dehydrated){if(ao&&null!==ro&&1&t.mode&&!(128&t.flags))fo(),mo(),t.flags|=98560,i=!1;else if(i=po(t),null!==r&&null!==r.dehydrated){if(null===e){if(!i)throw Error(o(318));if(!(i=null!==(i=t.memoizedState)?i.dehydrated:null))throw Error(o(317));i[pa]=t}else mo(),!(128&t.flags)&&(t.memoizedState=null),t.flags|=4;Vl(t),i=!1}else null!==oo&&(ic(oo),oo=null),i=!0;if(!i)return 65536&t.flags?t:null}return 128&t.flags?(t.lanes=n,t):((r=null!==r)!==(null!==e&&null!==e.memoizedState)&&r&&(t.child.flags|=8192,1&t.mode&&(null===e||1&ei.current?0===Os&&(Os=3):hc())),null!==t.updateQueue&&(t.flags|=4),Vl(t),null);case 4:return Zo(),Nl(e,t),null===e&&Ur(t.stateNode.containerInfo),Vl(t),null;case 10:return To(t.type._context),Vl(t),null;case 19:if(_a(ei),null===(i=t.memoizedState))return Vl(t),null;if(r=!!(128&t.flags),null===(s=i.rendering))if(r)Gl(i,!1);else{if(0!==Os||null!==e&&128&e.flags)for(e=t.child;null!==e;){if(null!==(s=ti(e))){for(t.flags|=128,Gl(i,!1),null!==(r=s.updateQueue)&&(t.updateQueue=r,t.flags|=4),t.subtreeFlags=0,r=n,n=t.child;null!==n;)e=r,(i=n).flags&=14680066,null===(s=i.alternate)?(i.childLanes=0,i.lanes=e,i.child=null,i.subtreeFlags=0,i.memoizedProps=null,i.memoizedState=null,i.updateQueue=null,i.dependencies=null,i.stateNode=null):(i.childLanes=s.childLanes,i.lanes=s.lanes,i.child=s.child,i.subtreeFlags=0,i.deletions=null,i.memoizedProps=s.memoizedProps,i.memoizedState=s.memoizedState,i.updateQueue=s.updateQueue,i.type=s.type,e=s.dependencies,i.dependencies=null===e?null:{lanes:e.lanes,firstContext:e.firstContext}),n=n.sibling;return Ca(ei,1&ei.current|2),t.child}e=e.sibling}null!==i.tail&&Ze()>Us&&(t.flags|=128,r=!0,Gl(i,!1),t.lanes=4194304)}else{if(!r)if(null!==(e=ti(s))){if(t.flags|=128,r=!0,null!==(n=e.updateQueue)&&(t.updateQueue=n,t.flags|=4),Gl(i,!0),null===i.tail&&"hidden"===i.tailMode&&!s.alternate&&!ao)return Vl(t),null}else 2*Ze()-i.renderingStartTime>Us&&1073741824!==n&&(t.flags|=128,r=!0,Gl(i,!1),t.lanes=4194304);i.isBackwards?(s.sibling=t.child,t.child=s):(null!==(n=i.last)?n.sibling=s:t.child=s,i.last=s)}return null!==i.tail?(t=i.tail,i.rendering=t,i.tail=t.sibling,i.renderingStartTime=Ze(),t.sibling=null,n=ei.current,Ca(ei,r?1&n|2:1&n),t):(Vl(t),null);case 22:case 23:return dc(),r=null!==t.memoizedState,null!==e&&null!==e.memoizedState!==r&&(t.flags|=8192),r&&1&t.mode?!!(1073741824&Ns)&&(Vl(t),6&t.subtreeFlags&&(t.flags|=8192)):Vl(t),null;case 24:case 25:return null}throw Error(o(156,t.tag))}function Ql(e,t){switch(to(t),t.tag){case 1:return Na(t.type)&&Ra(),65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 3:return Zo(),_a(Pa),_a(Ta),ri(),65536&(e=t.flags)&&!(128&e)?(t.flags=-65537&e|128,t):null;case 5:return Jo(t),null;case 13:if(_a(ei),null!==(e=t.memoizedState)&&null!==e.dehydrated){if(null===t.alternate)throw Error(o(340));mo()}return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 19:return _a(ei),null;case 4:return Zo(),null;case 10:return To(t.type._context),null;case 22:case 23:return dc(),null;default:return null}}Ll=function(e,t){for(var n=t.child;null!==n;){if(5===n.tag||6===n.tag)e.appendChild(n.stateNode);else if(4!==n.tag&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===t)break;for(;null===n.sibling;){if(null===n.return||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}},Nl=function(){},Rl=function(e,t,n,r){var a=e.memoizedProps;if(a!==r){e=t.stateNode,Ko(Vo.current);var o,i=null;switch(n){case"input":a=K(e,a),r=K(e,r),i=[];break;case"select":a=M({},a,{value:void 0}),r=M({},r,{value:void 0}),i=[];break;case"textarea":a=re(e,a),r=re(e,r),i=[];break;default:"function"!=typeof a.onClick&&"function"==typeof r.onClick&&(e.onclick=Jr)}for(u in ye(n,r),n=null,a)if(!r.hasOwnProperty(u)&&a.hasOwnProperty(u)&&null!=a[u])if("style"===u){var s=a[u];for(o in s)s.hasOwnProperty(o)&&(n||(n={}),n[o]="")}else"dangerouslySetInnerHTML"!==u&&"children"!==u&&"suppressContentEditableWarning"!==u&&"suppressHydrationWarning"!==u&&"autoFocus"!==u&&(l.hasOwnProperty(u)?i||(i=[]):(i=i||[]).push(u,null));for(u in r){var c=r[u];if(s=null!=a?a[u]:void 0,r.hasOwnProperty(u)&&c!==s&&(null!=c||null!=s))if("style"===u)if(s){for(o in s)!s.hasOwnProperty(o)||c&&c.hasOwnProperty(o)||(n||(n={}),n[o]="");for(o in c)c.hasOwnProperty(o)&&s[o]!==c[o]&&(n||(n={}),n[o]=c[o])}else n||(i||(i=[]),i.push(u,n)),n=c;else"dangerouslySetInnerHTML"===u?(c=c?c.__html:void 0,s=s?s.__html:void 0,null!=c&&s!==c&&(i=i||[]).push(u,c)):"children"===u?"string"!=typeof c&&"number"!=typeof c||(i=i||[]).push(u,""+c):"suppressContentEditableWarning"!==u&&"suppressHydrationWarning"!==u&&(l.hasOwnProperty(u)?(null!=c&&"onScroll"===u&&zr("scroll",e),i||s===c||(i=[])):(i=i||[]).push(u,c))}n&&(i=i||[]).push("style",n);var u=i;(t.updateQueue=u)&&(t.flags|=4)}},Ol=function(e,t,n,r){n!==r&&(t.flags|=4)};var Kl=!1,Yl=!1,Zl="function"==typeof WeakSet?WeakSet:Set,Xl=null;function Jl(e,t){var n=e.ref;if(null!==n)if("function"==typeof n)try{n(null)}catch(r){Ec(e,t,r)}else n.current=null}function es(e,t,n){try{n()}catch(r){Ec(e,t,r)}}var ts=!1;function ns(e,t,n){var r=t.updateQueue;if(null!==(r=null!==r?r.lastEffect:null)){var a=r=r.next;do{if((a.tag&e)===e){var o=a.destroy;a.destroy=void 0,void 0!==o&&es(t,n,o)}a=a.next}while(a!==r)}}function rs(e,t){if(null!==(t=null!==(t=t.updateQueue)?t.lastEffect:null)){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function as(e){var t=e.ref;if(null!==t){var n=e.stateNode;e.tag,e=n,"function"==typeof t?t(e):t.current=e}}function os(e){var t=e.alternate;null!==t&&(e.alternate=null,os(t)),e.child=null,e.deletions=null,e.sibling=null,5===e.tag&&(null!==(t=e.stateNode)&&(delete t[pa],delete t[fa],delete t[ha],delete t[ga],delete t[ba])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function is(e){return 5===e.tag||3===e.tag||4===e.tag}function ls(e){e:for(;;){for(;null===e.sibling;){if(null===e.return||is(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;5!==e.tag&&6!==e.tag&&18!==e.tag;){if(2&e.flags)continue e;if(null===e.child||4===e.tag)continue e;e.child.return=e,e=e.child}if(!(2&e.flags))return e.stateNode}}function ss(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?8===n.nodeType?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(8===n.nodeType?(t=n.parentNode).insertBefore(e,n):(t=n).appendChild(e),null!=(n=n._reactRootContainer)||null!==t.onclick||(t.onclick=Jr));else if(4!==r&&null!==(e=e.child))for(ss(e,t,n),e=e.sibling;null!==e;)ss(e,t,n),e=e.sibling}function cs(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(4!==r&&null!==(e=e.child))for(cs(e,t,n),e=e.sibling;null!==e;)cs(e,t,n),e=e.sibling}var us=null,ds=!1;function ps(e,t,n){for(n=n.child;null!==n;)fs(e,t,n),n=n.sibling}function fs(e,t,n){if(ot&&"function"==typeof ot.onCommitFiberUnmount)try{ot.onCommitFiberUnmount(at,n)}catch(l){}switch(n.tag){case 5:Yl||Jl(n,t);case 6:var r=us,a=ds;us=null,ps(e,t,n),ds=a,null!==(us=r)&&(ds?(e=us,n=n.stateNode,8===e.nodeType?e.parentNode.removeChild(n):e.removeChild(n)):us.removeChild(n.stateNode));break;case 18:null!==us&&(ds?(e=us,n=n.stateNode,8===e.nodeType?sa(e.parentNode,n):1===e.nodeType&&sa(e,n),Ut(e)):sa(us,n.stateNode));break;case 4:r=us,a=ds,us=n.stateNode.containerInfo,ds=!0,ps(e,t,n),us=r,ds=a;break;case 0:case 11:case 14:case 15:if(!Yl&&(null!==(r=n.updateQueue)&&null!==(r=r.lastEffect))){a=r=r.next;do{var o=a,i=o.destroy;o=o.tag,void 0!==i&&(2&o||4&o)&&es(n,t,i),a=a.next}while(a!==r)}ps(e,t,n);break;case 1:if(!Yl&&(Jl(n,t),"function"==typeof(r=n.stateNode).componentWillUnmount))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(l){Ec(n,t,l)}ps(e,t,n);break;case 21:ps(e,t,n);break;case 22:1&n.mode?(Yl=(r=Yl)||null!==n.memoizedState,ps(e,t,n),Yl=r):ps(e,t,n);break;default:ps(e,t,n)}}function ms(e){var t=e.updateQueue;if(null!==t){e.updateQueue=null;var n=e.stateNode;null===n&&(n=e.stateNode=new Zl),t.forEach((function(t){var r=Tc.bind(null,e,t);n.has(t)||(n.add(t),t.then(r,r))}))}}function hs(e,t){var n=t.deletions;if(null!==n)for(var r=0;r<n.length;r++){var a=n[r];try{var i=e,l=t,s=l;e:for(;null!==s;){switch(s.tag){case 5:us=s.stateNode,ds=!1;break e;case 3:case 4:us=s.stateNode.containerInfo,ds=!0;break e}s=s.return}if(null===us)throw Error(o(160));fs(i,l,a),us=null,ds=!1;var c=a.alternate;null!==c&&(c.return=null),a.return=null}catch(u){Ec(a,t,u)}}if(12854&t.subtreeFlags)for(t=t.child;null!==t;)gs(t,e),t=t.sibling}function gs(e,t){var n=e.alternate,r=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:if(hs(t,e),bs(e),4&r){try{ns(3,e,e.return),rs(3,e)}catch(g){Ec(e,e.return,g)}try{ns(5,e,e.return)}catch(g){Ec(e,e.return,g)}}break;case 1:hs(t,e),bs(e),512&r&&null!==n&&Jl(n,n.return);break;case 5:if(hs(t,e),bs(e),512&r&&null!==n&&Jl(n,n.return),32&e.flags){var a=e.stateNode;try{pe(a,"")}catch(g){Ec(e,e.return,g)}}if(4&r&&null!=(a=e.stateNode)){var i=e.memoizedProps,l=null!==n?n.memoizedProps:i,s=e.type,c=e.updateQueue;if(e.updateQueue=null,null!==c)try{"input"===s&&"radio"===i.type&&null!=i.name&&Z(a,i),ve(s,l);var u=ve(s,i);for(l=0;l<c.length;l+=2){var d=c[l],p=c[l+1];"style"===d?ge(a,p):"dangerouslySetInnerHTML"===d?de(a,p):"children"===d?pe(a,p):v(a,d,p,u)}switch(s){case"input":X(a,i);break;case"textarea":oe(a,i);break;case"select":var f=a._wrapperState.wasMultiple;a._wrapperState.wasMultiple=!!i.multiple;var m=i.value;null!=m?ne(a,!!i.multiple,m,!1):f!==!!i.multiple&&(null!=i.defaultValue?ne(a,!!i.multiple,i.defaultValue,!0):ne(a,!!i.multiple,i.multiple?[]:"",!1))}a[fa]=i}catch(g){Ec(e,e.return,g)}}break;case 6:if(hs(t,e),bs(e),4&r){if(null===e.stateNode)throw Error(o(162));a=e.stateNode,i=e.memoizedProps;try{a.nodeValue=i}catch(g){Ec(e,e.return,g)}}break;case 3:if(hs(t,e),bs(e),4&r&&null!==n&&n.memoizedState.isDehydrated)try{Ut(t.containerInfo)}catch(g){Ec(e,e.return,g)}break;case 4:default:hs(t,e),bs(e);break;case 13:hs(t,e),bs(e),8192&(a=e.child).flags&&(i=null!==a.memoizedState,a.stateNode.isHidden=i,!i||null!==a.alternate&&null!==a.alternate.memoizedState||($s=Ze())),4&r&&ms(e);break;case 22:if(d=null!==n&&null!==n.memoizedState,1&e.mode?(Yl=(u=Yl)||d,hs(t,e),Yl=u):hs(t,e),bs(e),8192&r){if(u=null!==e.memoizedState,(e.stateNode.isHidden=u)&&!d&&1&e.mode)for(Xl=e,d=e.child;null!==d;){for(p=Xl=d;null!==Xl;){switch(m=(f=Xl).child,f.tag){case 0:case 11:case 14:case 15:ns(4,f,f.return);break;case 1:Jl(f,f.return);var h=f.stateNode;if("function"==typeof h.componentWillUnmount){r=f,n=f.return;try{t=r,h.props=t.memoizedProps,h.state=t.memoizedState,h.componentWillUnmount()}catch(g){Ec(r,n,g)}}break;case 5:Jl(f,f.return);break;case 22:if(null!==f.memoizedState){ks(p);continue}}null!==m?(m.return=f,Xl=m):ks(p)}d=d.sibling}e:for(d=null,p=e;;){if(5===p.tag){if(null===d){d=p;try{a=p.stateNode,u?"function"==typeof(i=a.style).setProperty?i.setProperty("display","none","important"):i.display="none":(s=p.stateNode,l=null!=(c=p.memoizedProps.style)&&c.hasOwnProperty("display")?c.display:null,s.style.display=he("display",l))}catch(g){Ec(e,e.return,g)}}}else if(6===p.tag){if(null===d)try{p.stateNode.nodeValue=u?"":p.memoizedProps}catch(g){Ec(e,e.return,g)}}else if((22!==p.tag&&23!==p.tag||null===p.memoizedState||p===e)&&null!==p.child){p.child.return=p,p=p.child;continue}if(p===e)break e;for(;null===p.sibling;){if(null===p.return||p.return===e)break e;d===p&&(d=null),p=p.return}d===p&&(d=null),p.sibling.return=p.return,p=p.sibling}}break;case 19:hs(t,e),bs(e),4&r&&ms(e);case 21:}}function bs(e){var t=e.flags;if(2&t){try{e:{for(var n=e.return;null!==n;){if(is(n)){var r=n;break e}n=n.return}throw Error(o(160))}switch(r.tag){case 5:var a=r.stateNode;32&r.flags&&(pe(a,""),r.flags&=-33),cs(e,ls(e),a);break;case 3:case 4:var i=r.stateNode.containerInfo;ss(e,ls(e),i);break;default:throw Error(o(161))}}catch(l){Ec(e,e.return,l)}e.flags&=-3}4096&t&&(e.flags&=-4097)}function ys(e,t,n){Xl=e,vs(e,t,n)}function vs(e,t,n){for(var r=!!(1&e.mode);null!==Xl;){var a=Xl,o=a.child;if(22===a.tag&&r){var i=null!==a.memoizedState||Kl;if(!i){var l=a.alternate,s=null!==l&&null!==l.memoizedState||Yl;l=Kl;var c=Yl;if(Kl=i,(Yl=s)&&!c)for(Xl=a;null!==Xl;)s=(i=Xl).child,22===i.tag&&null!==i.memoizedState?xs(a):null!==s?(s.return=i,Xl=s):xs(a);for(;null!==o;)Xl=o,vs(o,t,n),o=o.sibling;Xl=a,Kl=l,Yl=c}ws(e)}else 8772&a.subtreeFlags&&null!==o?(o.return=a,Xl=o):ws(e)}}function ws(e){for(;null!==Xl;){var t=Xl;if(8772&t.flags){var n=t.alternate;try{if(8772&t.flags)switch(t.tag){case 0:case 11:case 15:Yl||rs(5,t);break;case 1:var r=t.stateNode;if(4&t.flags&&!Yl)if(null===n)r.componentDidMount();else{var a=t.elementType===t.type?n.memoizedProps:nl(t.type,n.memoizedProps);r.componentDidUpdate(a,n.memoizedState,r.__reactInternalSnapshotBeforeUpdate)}var i=t.updateQueue;null!==i&&Ho(t,i,r);break;case 3:var l=t.updateQueue;if(null!==l){if(n=null,null!==t.child)switch(t.child.tag){case 5:case 1:n=t.child.stateNode}Ho(t,l,n)}break;case 5:var s=t.stateNode;if(null===n&&4&t.flags){n=s;var c=t.memoizedProps;switch(t.type){case"button":case"input":case"select":case"textarea":c.autoFocus&&n.focus();break;case"img":c.src&&(n.src=c.src)}}break;case 6:case 4:case 12:case 19:case 17:case 21:case 22:case 23:case 25:break;case 13:if(null===t.memoizedState){var u=t.alternate;if(null!==u){var d=u.memoizedState;if(null!==d){var p=d.dehydrated;null!==p&&Ut(p)}}}break;default:throw Error(o(163))}Yl||512&t.flags&&as(t)}catch(f){Ec(t,t.return,f)}}if(t===e){Xl=null;break}if(null!==(n=t.sibling)){n.return=t.return,Xl=n;break}Xl=t.return}}function ks(e){for(;null!==Xl;){var t=Xl;if(t===e){Xl=null;break}var n=t.sibling;if(null!==n){n.return=t.return,Xl=n;break}Xl=t.return}}function xs(e){for(;null!==Xl;){var t=Xl;try{switch(t.tag){case 0:case 11:case 15:var n=t.return;try{rs(4,t)}catch(s){Ec(t,n,s)}break;case 1:var r=t.stateNode;if("function"==typeof r.componentDidMount){var a=t.return;try{r.componentDidMount()}catch(s){Ec(t,a,s)}}var o=t.return;try{as(t)}catch(s){Ec(t,o,s)}break;case 5:var i=t.return;try{as(t)}catch(s){Ec(t,i,s)}}}catch(s){Ec(t,t.return,s)}if(t===e){Xl=null;break}var l=t.sibling;if(null!==l){l.return=t.return,Xl=l;break}Xl=t.return}}var Ss,Es=Math.ceil,_s=w.ReactCurrentDispatcher,Cs=w.ReactCurrentOwner,As=w.ReactCurrentBatchConfig,Ts=0,Ps=null,js=null,Ls=0,Ns=0,Rs=Ea(0),Os=0,Ds=null,Is=0,Ms=0,Fs=0,zs=null,Bs=null,$s=0,Us=1/0,qs=null,Hs=!1,Gs=null,Vs=null,Ws=!1,Qs=null,Ks=0,Ys=0,Zs=null,Xs=-1,Js=0;function ec(){return 6&Ts?Ze():-1!==Xs?Xs:Xs=Ze()}function tc(e){return 1&e.mode?2&Ts&&0!==Ls?Ls&-Ls:null!==go.transition?(0===Js&&(Js=ht()),Js):0!==(e=vt)?e:e=void 0===(e=window.event)?16:Yt(e.type):1}function nc(e,t,n,r){if(50<Ys)throw Ys=0,Zs=null,Error(o(185));bt(e,n,r),2&Ts&&e===Ps||(e===Ps&&(!(2&Ts)&&(Ms|=n),4===Os&&lc(e,Ls)),rc(e,r),1===n&&0===Ts&&!(1&t.mode)&&(Us=Ze()+500,za&&Ua()))}function rc(e,t){var n=e.callbackNode;!function(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,a=e.expirationTimes,o=e.pendingLanes;0<o;){var i=31-it(o),l=1<<i,s=a[i];-1===s?l&n&&!(l&r)||(a[i]=ft(l,t)):s<=t&&(e.expiredLanes|=l),o&=~l}}(e,t);var r=pt(e,e===Ps?Ls:0);if(0===r)null!==n&&Qe(n),e.callbackNode=null,e.callbackPriority=0;else if(t=r&-r,e.callbackPriority!==t){if(null!=n&&Qe(n),1===t)0===e.tag?function(e){za=!0,$a(e)}(sc.bind(null,e)):$a(sc.bind(null,e)),ia((function(){!(6&Ts)&&Ua()})),n=null;else{switch(wt(r)){case 1:n=Je;break;case 4:n=et;break;case 16:default:n=tt;break;case 536870912:n=rt}n=Pc(n,ac.bind(null,e))}e.callbackPriority=t,e.callbackNode=n}}function ac(e,t){if(Xs=-1,Js=0,6&Ts)throw Error(o(327));var n=e.callbackNode;if(xc()&&e.callbackNode!==n)return null;var r=pt(e,e===Ps?Ls:0);if(0===r)return null;if(30&r||r&e.expiredLanes||t)t=gc(e,r);else{t=r;var a=Ts;Ts|=2;var i=mc();for(Ps===e&&Ls===t||(qs=null,Us=Ze()+500,pc(e,t));;)try{yc();break}catch(s){fc(e,s)}Ao(),_s.current=i,Ts=a,null!==js?t=0:(Ps=null,Ls=0,t=Os)}if(0!==t){if(2===t&&(0!==(a=mt(e))&&(r=a,t=oc(e,a))),1===t)throw n=Ds,pc(e,0),lc(e,r),rc(e,Ze()),n;if(6===t)lc(e,r);else{if(a=e.current.alternate,!(30&r||function(e){for(var t=e;;){if(16384&t.flags){var n=t.updateQueue;if(null!==n&&null!==(n=n.stores))for(var r=0;r<n.length;r++){var a=n[r],o=a.getSnapshot;a=a.value;try{if(!lr(o(),a))return!1}catch(l){return!1}}}if(n=t.child,16384&t.subtreeFlags&&null!==n)n.return=t,t=n;else{if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return!0;t=t.return}t.sibling.return=t.return,t=t.sibling}}return!0}(a)||(t=gc(e,r),2===t&&(i=mt(e),0!==i&&(r=i,t=oc(e,i))),1!==t)))throw n=Ds,pc(e,0),lc(e,r),rc(e,Ze()),n;switch(e.finishedWork=a,e.finishedLanes=r,t){case 0:case 1:throw Error(o(345));case 2:case 5:kc(e,Bs,qs);break;case 3:if(lc(e,r),(130023424&r)===r&&10<(t=$s+500-Ze())){if(0!==pt(e,0))break;if(((a=e.suspendedLanes)&r)!==r){ec(),e.pingedLanes|=e.suspendedLanes&a;break}e.timeoutHandle=ra(kc.bind(null,e,Bs,qs),t);break}kc(e,Bs,qs);break;case 4:if(lc(e,r),(4194240&r)===r)break;for(t=e.eventTimes,a=-1;0<r;){var l=31-it(r);i=1<<l,(l=t[l])>a&&(a=l),r&=~i}if(r=a,10<(r=(120>(r=Ze()-r)?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*Es(r/1960))-r)){e.timeoutHandle=ra(kc.bind(null,e,Bs,qs),r);break}kc(e,Bs,qs);break;default:throw Error(o(329))}}}return rc(e,Ze()),e.callbackNode===n?ac.bind(null,e):null}function oc(e,t){var n=zs;return e.current.memoizedState.isDehydrated&&(pc(e,t).flags|=256),2!==(e=gc(e,t))&&(t=Bs,Bs=n,null!==t&&ic(t)),e}function ic(e){null===Bs?Bs=e:Bs.push.apply(Bs,e)}function lc(e,t){for(t&=~Fs,t&=~Ms,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var n=31-it(t),r=1<<n;e[n]=-1,t&=~r}}function sc(e){if(6&Ts)throw Error(o(327));xc();var t=pt(e,0);if(!(1&t))return rc(e,Ze()),null;var n=gc(e,t);if(0!==e.tag&&2===n){var r=mt(e);0!==r&&(t=r,n=oc(e,r))}if(1===n)throw n=Ds,pc(e,0),lc(e,t),rc(e,Ze()),n;if(6===n)throw Error(o(345));return e.finishedWork=e.current.alternate,e.finishedLanes=t,kc(e,Bs,qs),rc(e,Ze()),null}function cc(e,t){var n=Ts;Ts|=1;try{return e(t)}finally{0===(Ts=n)&&(Us=Ze()+500,za&&Ua())}}function uc(e){null!==Qs&&0===Qs.tag&&!(6&Ts)&&xc();var t=Ts;Ts|=1;var n=As.transition,r=vt;try{if(As.transition=null,vt=1,e)return e()}finally{vt=r,As.transition=n,!(6&(Ts=t))&&Ua()}}function dc(){Ns=Rs.current,_a(Rs)}function pc(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHandle;if(-1!==n&&(e.timeoutHandle=-1,aa(n)),null!==js)for(n=js.return;null!==n;){var r=n;switch(to(r),r.tag){case 1:null!=(r=r.type.childContextTypes)&&Ra();break;case 3:Zo(),_a(Pa),_a(Ta),ri();break;case 5:Jo(r);break;case 4:Zo();break;case 13:case 19:_a(ei);break;case 10:To(r.type._context);break;case 22:case 23:dc()}n=n.return}if(Ps=e,js=e=Rc(e.current,null),Ls=Ns=t,Os=0,Ds=null,Fs=Ms=Is=0,Bs=zs=null,null!==No){for(t=0;t<No.length;t++)if(null!==(r=(n=No[t]).interleaved)){n.interleaved=null;var a=r.next,o=n.pending;if(null!==o){var i=o.next;o.next=a,r.next=i}n.pending=r}No=null}return e}function fc(e,t){for(;;){var n=js;try{if(Ao(),ai.current=Xi,ui){for(var r=li.memoizedState;null!==r;){var a=r.queue;null!==a&&(a.pending=null),r=r.next}ui=!1}if(ii=0,ci=si=li=null,di=!1,pi=0,Cs.current=null,null===n||null===n.return){Os=1,Ds=t,js=null;break}e:{var i=e,l=n.return,s=n,c=t;if(t=Ls,s.flags|=32768,null!==c&&"object"==typeof c&&"function"==typeof c.then){var u=c,d=s,p=d.tag;if(!(1&d.mode||0!==p&&11!==p&&15!==p)){var f=d.alternate;f?(d.updateQueue=f.updateQueue,d.memoizedState=f.memoizedState,d.lanes=f.lanes):(d.updateQueue=null,d.memoizedState=null)}var m=gl(l);if(null!==m){m.flags&=-257,bl(m,l,s,0,t),1&m.mode&&hl(i,u,t),c=u;var h=(t=m).updateQueue;if(null===h){var g=new Set;g.add(c),t.updateQueue=g}else h.add(c);break e}if(!(1&t)){hl(i,u,t),hc();break e}c=Error(o(426))}else if(ao&&1&s.mode){var b=gl(l);if(null!==b){!(65536&b.flags)&&(b.flags|=256),bl(b,l,s,0,t),ho(cl(c,s));break e}}i=c=cl(c,s),4!==Os&&(Os=2),null===zs?zs=[i]:zs.push(i),i=l;do{switch(i.tag){case 3:i.flags|=65536,t&=-t,i.lanes|=t,Uo(i,fl(0,c,t));break e;case 1:s=c;var y=i.type,v=i.stateNode;if(!(128&i.flags||"function"!=typeof y.getDerivedStateFromError&&(null===v||"function"!=typeof v.componentDidCatch||null!==Vs&&Vs.has(v)))){i.flags|=65536,t&=-t,i.lanes|=t,Uo(i,ml(i,s,t));break e}}i=i.return}while(null!==i)}wc(n)}catch(w){t=w,js===n&&null!==n&&(js=n=n.return);continue}break}}function mc(){var e=_s.current;return _s.current=Xi,null===e?Xi:e}function hc(){0!==Os&&3!==Os&&2!==Os||(Os=4),null===Ps||!(268435455&Is)&&!(268435455&Ms)||lc(Ps,Ls)}function gc(e,t){var n=Ts;Ts|=2;var r=mc();for(Ps===e&&Ls===t||(qs=null,pc(e,t));;)try{bc();break}catch(a){fc(e,a)}if(Ao(),Ts=n,_s.current=r,null!==js)throw Error(o(261));return Ps=null,Ls=0,Os}function bc(){for(;null!==js;)vc(js)}function yc(){for(;null!==js&&!Ke();)vc(js)}function vc(e){var t=Ss(e.alternate,e,Ns);e.memoizedProps=e.pendingProps,null===t?wc(e):js=t,Cs.current=null}function wc(e){var t=e;do{var n=t.alternate;if(e=t.return,32768&t.flags){if(null!==(n=Ql(n,t)))return n.flags&=32767,void(js=n);if(null===e)return Os=6,void(js=null);e.flags|=32768,e.subtreeFlags=0,e.deletions=null}else if(null!==(n=Wl(n,t,Ns)))return void(js=n);if(null!==(t=t.sibling))return void(js=t);js=t=e}while(null!==t);0===Os&&(Os=5)}function kc(e,t,n){var r=vt,a=As.transition;try{As.transition=null,vt=1,function(e,t,n,r){do{xc()}while(null!==Qs);if(6&Ts)throw Error(o(327));n=e.finishedWork;var a=e.finishedLanes;if(null===n)return null;if(e.finishedWork=null,e.finishedLanes=0,n===e.current)throw Error(o(177));e.callbackNode=null,e.callbackPriority=0;var i=n.lanes|n.childLanes;if(function(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0<n;){var a=31-it(n),o=1<<a;t[a]=0,r[a]=-1,e[a]=-1,n&=~o}}(e,i),e===Ps&&(js=Ps=null,Ls=0),!(2064&n.subtreeFlags)&&!(2064&n.flags)||Ws||(Ws=!0,Pc(tt,(function(){return xc(),null}))),i=!!(15990&n.flags),!!(15990&n.subtreeFlags)||i){i=As.transition,As.transition=null;var l=vt;vt=1;var s=Ts;Ts|=4,Cs.current=null,function(e,t){if(ea=Ht,fr(e=pr())){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{var r=(n=(n=e.ownerDocument)&&n.defaultView||window).getSelection&&n.getSelection();if(r&&0!==r.rangeCount){n=r.anchorNode;var a=r.anchorOffset,i=r.focusNode;r=r.focusOffset;try{n.nodeType,i.nodeType}catch(k){n=null;break e}var l=0,s=-1,c=-1,u=0,d=0,p=e,f=null;t:for(;;){for(var m;p!==n||0!==a&&3!==p.nodeType||(s=l+a),p!==i||0!==r&&3!==p.nodeType||(c=l+r),3===p.nodeType&&(l+=p.nodeValue.length),null!==(m=p.firstChild);)f=p,p=m;for(;;){if(p===e)break t;if(f===n&&++u===a&&(s=l),f===i&&++d===r&&(c=l),null!==(m=p.nextSibling))break;f=(p=f).parentNode}p=m}n=-1===s||-1===c?null:{start:s,end:c}}else n=null}n=n||{start:0,end:0}}else n=null;for(ta={focusedElem:e,selectionRange:n},Ht=!1,Xl=t;null!==Xl;)if(e=(t=Xl).child,1028&t.subtreeFlags&&null!==e)e.return=t,Xl=e;else for(;null!==Xl;){t=Xl;try{var h=t.alternate;if(1024&t.flags)switch(t.tag){case 0:case 11:case 15:case 5:case 6:case 4:case 17:break;case 1:if(null!==h){var g=h.memoizedProps,b=h.memoizedState,y=t.stateNode,v=y.getSnapshotBeforeUpdate(t.elementType===t.type?g:nl(t.type,g),b);y.__reactInternalSnapshotBeforeUpdate=v}break;case 3:var w=t.stateNode.containerInfo;1===w.nodeType?w.textContent="":9===w.nodeType&&w.documentElement&&w.removeChild(w.documentElement);break;default:throw Error(o(163))}}catch(k){Ec(t,t.return,k)}if(null!==(e=t.sibling)){e.return=t.return,Xl=e;break}Xl=t.return}h=ts,ts=!1}(e,n),gs(n,e),mr(ta),Ht=!!ea,ta=ea=null,e.current=n,ys(n,e,a),Ye(),Ts=s,vt=l,As.transition=i}else e.current=n;if(Ws&&(Ws=!1,Qs=e,Ks=a),i=e.pendingLanes,0===i&&(Vs=null),function(e){if(ot&&"function"==typeof ot.onCommitFiberRoot)try{ot.onCommitFiberRoot(at,e,void 0,!(128&~e.current.flags))}catch(t){}}(n.stateNode),rc(e,Ze()),null!==t)for(r=e.onRecoverableError,n=0;n<t.length;n++)a=t[n],r(a.value,{componentStack:a.stack,digest:a.digest});if(Hs)throw Hs=!1,e=Gs,Gs=null,e;!!(1&Ks)&&0!==e.tag&&xc(),i=e.pendingLanes,1&i?e===Zs?Ys++:(Ys=0,Zs=e):Ys=0,Ua()}(e,t,n,r)}finally{As.transition=a,vt=r}return null}function xc(){if(null!==Qs){var e=wt(Ks),t=As.transition,n=vt;try{if(As.transition=null,vt=16>e?16:e,null===Qs)var r=!1;else{if(e=Qs,Qs=null,Ks=0,6&Ts)throw Error(o(331));var a=Ts;for(Ts|=4,Xl=e.current;null!==Xl;){var i=Xl,l=i.child;if(16&Xl.flags){var s=i.deletions;if(null!==s){for(var c=0;c<s.length;c++){var u=s[c];for(Xl=u;null!==Xl;){var d=Xl;switch(d.tag){case 0:case 11:case 15:ns(8,d,i)}var p=d.child;if(null!==p)p.return=d,Xl=p;else for(;null!==Xl;){var f=(d=Xl).sibling,m=d.return;if(os(d),d===u){Xl=null;break}if(null!==f){f.return=m,Xl=f;break}Xl=m}}}var h=i.alternate;if(null!==h){var g=h.child;if(null!==g){h.child=null;do{var b=g.sibling;g.sibling=null,g=b}while(null!==g)}}Xl=i}}if(2064&i.subtreeFlags&&null!==l)l.return=i,Xl=l;else e:for(;null!==Xl;){if(2048&(i=Xl).flags)switch(i.tag){case 0:case 11:case 15:ns(9,i,i.return)}var y=i.sibling;if(null!==y){y.return=i.return,Xl=y;break e}Xl=i.return}}var v=e.current;for(Xl=v;null!==Xl;){var w=(l=Xl).child;if(2064&l.subtreeFlags&&null!==w)w.return=l,Xl=w;else e:for(l=v;null!==Xl;){if(2048&(s=Xl).flags)try{switch(s.tag){case 0:case 11:case 15:rs(9,s)}}catch(x){Ec(s,s.return,x)}if(s===l){Xl=null;break e}var k=s.sibling;if(null!==k){k.return=s.return,Xl=k;break e}Xl=s.return}}if(Ts=a,Ua(),ot&&"function"==typeof ot.onPostCommitFiberRoot)try{ot.onPostCommitFiberRoot(at,e)}catch(x){}r=!0}return r}finally{vt=n,As.transition=t}}return!1}function Sc(e,t,n){e=Bo(e,t=fl(0,t=cl(n,t),1),1),t=ec(),null!==e&&(bt(e,1,t),rc(e,t))}function Ec(e,t,n){if(3===e.tag)Sc(e,e,n);else for(;null!==t;){if(3===t.tag){Sc(t,e,n);break}if(1===t.tag){var r=t.stateNode;if("function"==typeof t.type.getDerivedStateFromError||"function"==typeof r.componentDidCatch&&(null===Vs||!Vs.has(r))){t=Bo(t,e=ml(t,e=cl(n,e),1),1),e=ec(),null!==t&&(bt(t,1,e),rc(t,e));break}}t=t.return}}function _c(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),t=ec(),e.pingedLanes|=e.suspendedLanes&n,Ps===e&&(Ls&n)===n&&(4===Os||3===Os&&(130023424&Ls)===Ls&&500>Ze()-$s?pc(e,0):Fs|=n),rc(e,t)}function Cc(e,t){0===t&&(1&e.mode?(t=ut,!(130023424&(ut<<=1))&&(ut=4194304)):t=1);var n=ec();null!==(e=Do(e,t))&&(bt(e,t,n),rc(e,n))}function Ac(e){var t=e.memoizedState,n=0;null!==t&&(n=t.retryLane),Cc(e,n)}function Tc(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,a=e.memoizedState;null!==a&&(n=a.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(o(314))}null!==r&&r.delete(t),Cc(e,n)}function Pc(e,t){return We(e,t)}function jc(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Lc(e,t,n,r){return new jc(e,t,n,r)}function Nc(e){return!(!(e=e.prototype)||!e.isReactComponent)}function Rc(e,t){var n=e.alternate;return null===n?((n=Lc(e.tag,t,e.key,e.mode)).elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=14680064&e.flags,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=null===t?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Oc(e,t,n,r,a,i){var l=2;if(r=e,"function"==typeof e)Nc(e)&&(l=1);else if("string"==typeof e)l=5;else e:switch(e){case S:return Dc(n.children,a,i,t);case E:l=8,a|=8;break;case _:return(e=Lc(12,n,t,2|a)).elementType=_,e.lanes=i,e;case P:return(e=Lc(13,n,t,a)).elementType=P,e.lanes=i,e;case j:return(e=Lc(19,n,t,a)).elementType=j,e.lanes=i,e;case R:return Ic(n,a,i,t);default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case C:l=10;break e;case A:l=9;break e;case T:l=11;break e;case L:l=14;break e;case N:l=16,r=null;break e}throw Error(o(130,null==e?e:typeof e,""))}return(t=Lc(l,n,t,a)).elementType=e,t.type=r,t.lanes=i,t}function Dc(e,t,n,r){return(e=Lc(7,e,r,t)).lanes=n,e}function Ic(e,t,n,r){return(e=Lc(22,e,r,t)).elementType=R,e.lanes=n,e.stateNode={isHidden:!1},e}function Mc(e,t,n){return(e=Lc(6,e,null,t)).lanes=n,e}function Fc(e,t,n){return(t=Lc(4,null!==e.children?e.children:[],e.key,t)).lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function zc(e,t,n,r,a){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=gt(0),this.expirationTimes=gt(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=gt(0),this.identifierPrefix=r,this.onRecoverableError=a,this.mutableSourceEagerHydrationData=null}function Bc(e,t,n,r,a,o,i,l,s){return e=new zc(e,t,n,l,s),1===t?(t=1,!0===o&&(t|=8)):t=0,o=Lc(3,null,null,t),e.current=o,o.stateNode=e,o.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Mo(o),e}function $c(e){if(!e)return Aa;e:{if(Ue(e=e._reactInternals)!==e||1!==e.tag)throw Error(o(170));var t=e;do{switch(t.tag){case 3:t=t.stateNode.context;break e;case 1:if(Na(t.type)){t=t.stateNode.__reactInternalMemoizedMergedChildContext;break e}}t=t.return}while(null!==t);throw Error(o(171))}if(1===e.tag){var n=e.type;if(Na(n))return Da(e,n,t)}return t}function Uc(e,t,n,r,a,o,i,l,s){return(e=Bc(n,r,!0,e,0,o,0,l,s)).context=$c(null),n=e.current,(o=zo(r=ec(),a=tc(n))).callback=null!=t?t:null,Bo(n,o,a),e.current.lanes=a,bt(e,a,r),rc(e,r),e}function qc(e,t,n,r){var a=t.current,o=ec(),i=tc(a);return n=$c(n),null===t.context?t.context=n:t.pendingContext=n,(t=zo(o,i)).payload={element:e},null!==(r=void 0===r?null:r)&&(t.callback=r),null!==(e=Bo(a,t,i))&&(nc(e,a,i,o),$o(e,a,i)),i}function Hc(e){return(e=e.current).child?(e.child.tag,e.child.stateNode):null}function Gc(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var n=e.retryLane;e.retryLane=0!==n&&n<t?n:t}}function Vc(e,t){Gc(e,t),(e=e.alternate)&&Gc(e,t)}Ss=function(e,t,n){if(null!==e)if(e.memoizedProps!==t.pendingProps||Pa.current)vl=!0;else{if(!(e.lanes&n||128&t.flags))return vl=!1,function(e,t,n){switch(t.tag){case 3:Pl(t),mo();break;case 5:Xo(t);break;case 1:Na(t.type)&&Ia(t);break;case 4:Yo(t,t.stateNode.containerInfo);break;case 10:var r=t.type._context,a=t.memoizedProps.value;Ca(So,r._currentValue),r._currentValue=a;break;case 13:if(null!==(r=t.memoizedState))return null!==r.dehydrated?(Ca(ei,1&ei.current),t.flags|=128,null):n&t.child.childLanes?Ml(e,t,n):(Ca(ei,1&ei.current),null!==(e=Hl(e,t,n))?e.sibling:null);Ca(ei,1&ei.current);break;case 19:if(r=!!(n&t.childLanes),128&e.flags){if(r)return Ul(e,t,n);t.flags|=128}if(null!==(a=t.memoizedState)&&(a.rendering=null,a.tail=null,a.lastEffect=null),Ca(ei,ei.current),r)break;return null;case 22:case 23:return t.lanes=0,El(e,t,n)}return Hl(e,t,n)}(e,t,n);vl=!!(131072&e.flags)}else vl=!1,ao&&1048576&t.flags&&Ja(t,Va,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;ql(e,t),e=t.pendingProps;var a=La(t,Ta.current);jo(t,n),a=gi(null,t,r,e,a,n);var i=bi();return t.flags|=1,"object"==typeof a&&null!==a&&"function"==typeof a.render&&void 0===a.$$typeof?(t.tag=1,t.memoizedState=null,t.updateQueue=null,Na(r)?(i=!0,Ia(t)):i=!1,t.memoizedState=null!==a.state&&void 0!==a.state?a.state:null,Mo(t),a.updater=al,t.stateNode=a,a._reactInternals=t,sl(t,r,e,n),t=Tl(null,t,r,!0,i,n)):(t.tag=0,ao&&i&&eo(t),wl(null,t,a,n),t=t.child),t;case 16:r=t.elementType;e:{switch(ql(e,t),e=t.pendingProps,r=(a=r._init)(r._payload),t.type=r,a=t.tag=function(e){if("function"==typeof e)return Nc(e)?1:0;if(null!=e){if((e=e.$$typeof)===T)return 11;if(e===L)return 14}return 2}(r),e=nl(r,e),a){case 0:t=Cl(null,t,r,e,n);break e;case 1:t=Al(null,t,r,e,n);break e;case 11:t=kl(null,t,r,e,n);break e;case 14:t=xl(null,t,r,nl(r.type,e),n);break e}throw Error(o(306,r,""))}return t;case 0:return r=t.type,a=t.pendingProps,Cl(e,t,r,a=t.elementType===r?a:nl(r,a),n);case 1:return r=t.type,a=t.pendingProps,Al(e,t,r,a=t.elementType===r?a:nl(r,a),n);case 3:e:{if(Pl(t),null===e)throw Error(o(387));r=t.pendingProps,a=(i=t.memoizedState).element,Fo(e,t),qo(t,r,null,n);var l=t.memoizedState;if(r=l.element,i.isDehydrated){if(i={element:r,isDehydrated:!1,cache:l.cache,pendingSuspenseBoundaries:l.pendingSuspenseBoundaries,transitions:l.transitions},t.updateQueue.baseState=i,t.memoizedState=i,256&t.flags){t=jl(e,t,r,n,a=cl(Error(o(423)),t));break e}if(r!==a){t=jl(e,t,r,n,a=cl(Error(o(424)),t));break e}for(ro=ca(t.stateNode.containerInfo.firstChild),no=t,ao=!0,oo=null,n=xo(t,null,r,n),t.child=n;n;)n.flags=-3&n.flags|4096,n=n.sibling}else{if(mo(),r===a){t=Hl(e,t,n);break e}wl(e,t,r,n)}t=t.child}return t;case 5:return Xo(t),null===e&&co(t),r=t.type,a=t.pendingProps,i=null!==e?e.memoizedProps:null,l=a.children,na(r,a)?l=null:null!==i&&na(r,i)&&(t.flags|=32),_l(e,t),wl(e,t,l,n),t.child;case 6:return null===e&&co(t),null;case 13:return Ml(e,t,n);case 4:return Yo(t,t.stateNode.containerInfo),r=t.pendingProps,null===e?t.child=ko(t,null,r,n):wl(e,t,r,n),t.child;case 11:return r=t.type,a=t.pendingProps,kl(e,t,r,a=t.elementType===r?a:nl(r,a),n);case 7:return wl(e,t,t.pendingProps,n),t.child;case 8:case 12:return wl(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,a=t.pendingProps,i=t.memoizedProps,l=a.value,Ca(So,r._currentValue),r._currentValue=l,null!==i)if(lr(i.value,l)){if(i.children===a.children&&!Pa.current){t=Hl(e,t,n);break e}}else for(null!==(i=t.child)&&(i.return=t);null!==i;){var s=i.dependencies;if(null!==s){l=i.child;for(var c=s.firstContext;null!==c;){if(c.context===r){if(1===i.tag){(c=zo(-1,n&-n)).tag=2;var u=i.updateQueue;if(null!==u){var d=(u=u.shared).pending;null===d?c.next=c:(c.next=d.next,d.next=c),u.pending=c}}i.lanes|=n,null!==(c=i.alternate)&&(c.lanes|=n),Po(i.return,n,t),s.lanes|=n;break}c=c.next}}else if(10===i.tag)l=i.type===t.type?null:i.child;else if(18===i.tag){if(null===(l=i.return))throw Error(o(341));l.lanes|=n,null!==(s=l.alternate)&&(s.lanes|=n),Po(l,n,t),l=i.sibling}else l=i.child;if(null!==l)l.return=i;else for(l=i;null!==l;){if(l===t){l=null;break}if(null!==(i=l.sibling)){i.return=l.return,l=i;break}l=l.return}i=l}wl(e,t,a.children,n),t=t.child}return t;case 9:return a=t.type,r=t.pendingProps.children,jo(t,n),r=r(a=Lo(a)),t.flags|=1,wl(e,t,r,n),t.child;case 14:return a=nl(r=t.type,t.pendingProps),xl(e,t,r,a=nl(r.type,a),n);case 15:return Sl(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,a=t.pendingProps,a=t.elementType===r?a:nl(r,a),ql(e,t),t.tag=1,Na(r)?(e=!0,Ia(t)):e=!1,jo(t,n),il(t,r,a),sl(t,r,a,n),Tl(null,t,r,!0,e,n);case 19:return Ul(e,t,n);case 22:return El(e,t,n)}throw Error(o(156,t.tag))};var Wc="function"==typeof reportError?reportError:function(e){console.error(e)};function Qc(e){this._internalRoot=e}function Kc(e){this._internalRoot=e}function Yc(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType)}function Zc(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType&&(8!==e.nodeType||" react-mount-point-unstable "!==e.nodeValue))}function Xc(){}function Jc(e,t,n,r,a){var o=n._reactRootContainer;if(o){var i=o;if("function"==typeof a){var l=a;a=function(){var e=Hc(i);l.call(e)}}qc(t,i,e,a)}else i=function(e,t,n,r,a){if(a){if("function"==typeof r){var o=r;r=function(){var e=Hc(i);o.call(e)}}var i=Uc(t,r,e,0,null,!1,0,"",Xc);return e._reactRootContainer=i,e[ma]=i.current,Ur(8===e.nodeType?e.parentNode:e),uc(),i}for(;a=e.lastChild;)e.removeChild(a);if("function"==typeof r){var l=r;r=function(){var e=Hc(s);l.call(e)}}var s=Bc(e,0,!1,null,0,!1,0,"",Xc);return e._reactRootContainer=s,e[ma]=s.current,Ur(8===e.nodeType?e.parentNode:e),uc((function(){qc(t,s,n,r)})),s}(n,t,e,a,r);return Hc(i)}Kc.prototype.render=Qc.prototype.render=function(e){var t=this._internalRoot;if(null===t)throw Error(o(409));qc(e,t,null,null)},Kc.prototype.unmount=Qc.prototype.unmount=function(){var e=this._internalRoot;if(null!==e){this._internalRoot=null;var t=e.containerInfo;uc((function(){qc(null,e,null,null)})),t[ma]=null}},Kc.prototype.unstable_scheduleHydration=function(e){if(e){var t=Et();e={blockedOn:null,target:e,priority:t};for(var n=0;n<Rt.length&&0!==t&&t<Rt[n].priority;n++);Rt.splice(n,0,e),0===n&&Mt(e)}},kt=function(e){switch(e.tag){case 3:var t=e.stateNode;if(t.current.memoizedState.isDehydrated){var n=dt(t.pendingLanes);0!==n&&(yt(t,1|n),rc(t,Ze()),!(6&Ts)&&(Us=Ze()+500,Ua()))}break;case 13:uc((function(){var t=Do(e,1);if(null!==t){var n=ec();nc(t,e,1,n)}})),Vc(e,1)}},xt=function(e){if(13===e.tag){var t=Do(e,134217728);if(null!==t)nc(t,e,134217728,ec());Vc(e,134217728)}},St=function(e){if(13===e.tag){var t=tc(e),n=Do(e,t);if(null!==n)nc(n,e,t,ec());Vc(e,t)}},Et=function(){return vt},_t=function(e,t){var n=vt;try{return vt=e,t()}finally{vt=n}},xe=function(e,t,n){switch(t){case"input":if(X(e,n),t=n.name,"radio"===n.type&&null!=t){for(n=e;n.parentNode;)n=n.parentNode;for(n=n.querySelectorAll("input[name="+JSON.stringify(""+t)+'][type="radio"]'),t=0;t<n.length;t++){var r=n[t];if(r!==e&&r.form===e.form){var a=ka(r);if(!a)throw Error(o(90));W(r),X(r,a)}}}break;case"textarea":oe(e,n);break;case"select":null!=(t=n.value)&&ne(e,!!n.multiple,t,!1)}},Te=cc,Pe=uc;var eu={usingClientEntryPoint:!1,Events:[va,wa,ka,Ce,Ae,cc]},tu={findFiberByHostInstance:ya,bundleType:0,version:"18.3.1",rendererPackageName:"react-dom"},nu={bundleType:tu.bundleType,version:tu.version,rendererPackageName:tu.rendererPackageName,rendererConfig:tu.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:w.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return null===(e=Ge(e))?null:e.stateNode},findFiberByHostInstance:tu.findFiberByHostInstance||function(){return null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:"18.3.1-next-f1338f8080-20240426"};if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var ru=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!ru.isDisabled&&ru.supportsFiber)try{at=ru.inject(nu),ot=ru}catch(ue){}}t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=eu,t.createPortal=function(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!Yc(t))throw Error(o(200));return function(e,t,n){var r=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:x,key:null==r?null:""+r,children:e,containerInfo:t,implementation:n}}(e,t,null,n)},t.createRoot=function(e,t){if(!Yc(e))throw Error(o(299));var n=!1,r="",a=Wc;return null!=t&&(!0===t.unstable_strictMode&&(n=!0),void 0!==t.identifierPrefix&&(r=t.identifierPrefix),void 0!==t.onRecoverableError&&(a=t.onRecoverableError)),t=Bc(e,1,!1,null,0,n,0,r,a),e[ma]=t.current,Ur(8===e.nodeType?e.parentNode:e),new Qc(t)},t.findDOMNode=function(e){if(null==e)return null;if(1===e.nodeType)return e;var t=e._reactInternals;if(void 0===t){if("function"==typeof e.render)throw Error(o(188));throw e=Object.keys(e).join(","),Error(o(268,e))}return e=null===(e=Ge(t))?null:e.stateNode},t.flushSync=function(e){return uc(e)},t.hydrate=function(e,t,n){if(!Zc(t))throw Error(o(200));return Jc(null,e,t,!0,n)},t.hydrateRoot=function(e,t,n){if(!Yc(e))throw Error(o(405));var r=null!=n&&n.hydratedSources||null,a=!1,i="",l=Wc;if(null!=n&&(!0===n.unstable_strictMode&&(a=!0),void 0!==n.identifierPrefix&&(i=n.identifierPrefix),void 0!==n.onRecoverableError&&(l=n.onRecoverableError)),t=Uc(t,null,e,1,null!=n?n:null,a,0,i,l),e[ma]=t.current,Ur(e),r)for(e=0;e<r.length;e++)a=(a=(n=r[e])._getVersion)(n._source),null==t.mutableSourceEagerHydrationData?t.mutableSourceEagerHydrationData=[n,a]:t.mutableSourceEagerHydrationData.push(n,a);return new Kc(t)},t.render=function(e,t,n){if(!Zc(t))throw Error(o(200));return Jc(null,e,t,!1,n)},t.unmountComponentAtNode=function(e){if(!Zc(e))throw Error(o(40));return!!e._reactRootContainer&&(uc((function(){Jc(null,null,e,!1,(function(){e._reactRootContainer=null,e[ma]=null}))})),!0)},t.unstable_batchedUpdates=cc,t.unstable_renderSubtreeIntoContainer=function(e,t,n,r){if(!Zc(n))throw Error(o(200));if(null==e||void 0===e._reactInternals)throw Error(o(38));return Jc(e,t,n,!1,r)},t.version="18.3.1-next-f1338f8080-20240426"},5338:(e,t,n)=>{"use strict";var r=n(961);t.createRoot=r.createRoot,t.hydrateRoot=r.hydrateRoot},961:(e,t,n)=>{"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}(),e.exports=n(2551)},115:e=>{var t="undefined"!=typeof Element,n="function"==typeof Map,r="function"==typeof Set,a="function"==typeof ArrayBuffer&&!!ArrayBuffer.isView;function o(e,i){if(e===i)return!0;if(e&&i&&"object"==typeof e&&"object"==typeof i){if(e.constructor!==i.constructor)return!1;var l,s,c,u;if(Array.isArray(e)){if((l=e.length)!=i.length)return!1;for(s=l;0!=s--;)if(!o(e[s],i[s]))return!1;return!0}if(n&&e instanceof Map&&i instanceof Map){if(e.size!==i.size)return!1;for(u=e.entries();!(s=u.next()).done;)if(!i.has(s.value[0]))return!1;for(u=e.entries();!(s=u.next()).done;)if(!o(s.value[1],i.get(s.value[0])))return!1;return!0}if(r&&e instanceof Set&&i instanceof Set){if(e.size!==i.size)return!1;for(u=e.entries();!(s=u.next()).done;)if(!i.has(s.value[0]))return!1;return!0}if(a&&ArrayBuffer.isView(e)&&ArrayBuffer.isView(i)){if((l=e.length)!=i.length)return!1;for(s=l;0!=s--;)if(e[s]!==i[s])return!1;return!0}if(e.constructor===RegExp)return e.source===i.source&&e.flags===i.flags;if(e.valueOf!==Object.prototype.valueOf&&"function"==typeof e.valueOf&&"function"==typeof i.valueOf)return e.valueOf()===i.valueOf();if(e.toString!==Object.prototype.toString&&"function"==typeof e.toString&&"function"==typeof i.toString)return e.toString()===i.toString();if((l=(c=Object.keys(e)).length)!==Object.keys(i).length)return!1;for(s=l;0!=s--;)if(!Object.prototype.hasOwnProperty.call(i,c[s]))return!1;if(t&&e instanceof Element)return!1;for(s=l;0!=s--;)if(("_owner"!==c[s]&&"__v"!==c[s]&&"__o"!==c[s]||!e.$$typeof)&&!o(e[c[s]],i[c[s]]))return!1;return!0}return e!=e&&i!=i}e.exports=function(e,t){try{return o(e,t)}catch(n){if((n.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw n}}},545:(e,t,n)=>{"use strict";n.d(t,{mg:()=>J,vd:()=>G});var r=n(6540),a=n(5556),o=n.n(a),i=n(115),l=n.n(i),s=n(311),c=n.n(s),u=n(2833),d=n.n(u);function p(){return p=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},p.apply(this,arguments)}function f(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,m(e,t)}function m(e,t){return m=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},m(e,t)}function h(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)t.indexOf(n=o[r])>=0||(a[n]=e[n]);return a}var g={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title",FRAGMENT:"Symbol(react.fragment)"},b={rel:["amphtml","canonical","alternate"]},y={type:["application/ld+json"]},v={charset:"",name:["robots","description"],property:["og:type","og:title","og:url","og:image","og:image:alt","og:description","twitter:url","twitter:title","twitter:description","twitter:image","twitter:image:alt","twitter:card","twitter:site"]},w=Object.keys(g).map((function(e){return g[e]})),k={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},x=Object.keys(k).reduce((function(e,t){return e[k[t]]=t,e}),{}),S=function(e,t){for(var n=e.length-1;n>=0;n-=1){var r=e[n];if(Object.prototype.hasOwnProperty.call(r,t))return r[t]}return null},E=function(e){var t=S(e,g.TITLE),n=S(e,"titleTemplate");if(Array.isArray(t)&&(t=t.join("")),n&&t)return n.replace(/%s/g,(function(){return t}));var r=S(e,"defaultTitle");return t||r||void 0},_=function(e){return S(e,"onChangeClientState")||function(){}},C=function(e,t){return t.filter((function(t){return void 0!==t[e]})).map((function(t){return t[e]})).reduce((function(e,t){return p({},e,t)}),{})},A=function(e,t){return t.filter((function(e){return void 0!==e[g.BASE]})).map((function(e){return e[g.BASE]})).reverse().reduce((function(t,n){if(!t.length)for(var r=Object.keys(n),a=0;a<r.length;a+=1){var o=r[a].toLowerCase();if(-1!==e.indexOf(o)&&n[o])return t.concat(n)}return t}),[])},T=function(e,t,n){var r={};return n.filter((function(t){return!!Array.isArray(t[e])||(void 0!==t[e]&&console&&"function"==typeof console.warn&&console.warn("Helmet: "+e+' should be of type "Array". Instead found type "'+typeof t[e]+'"'),!1)})).map((function(t){return t[e]})).reverse().reduce((function(e,n){var a={};n.filter((function(e){for(var n,o=Object.keys(e),i=0;i<o.length;i+=1){var l=o[i],s=l.toLowerCase();-1===t.indexOf(s)||"rel"===n&&"canonical"===e[n].toLowerCase()||"rel"===s&&"stylesheet"===e[s].toLowerCase()||(n=s),-1===t.indexOf(l)||"innerHTML"!==l&&"cssText"!==l&&"itemprop"!==l||(n=l)}if(!n||!e[n])return!1;var c=e[n].toLowerCase();return r[n]||(r[n]={}),a[n]||(a[n]={}),!r[n][c]&&(a[n][c]=!0,!0)})).reverse().forEach((function(t){return e.push(t)}));for(var o=Object.keys(a),i=0;i<o.length;i+=1){var l=o[i],s=p({},r[l],a[l]);r[l]=s}return e}),[]).reverse()},P=function(e,t){if(Array.isArray(e)&&e.length)for(var n=0;n<e.length;n+=1)if(e[n][t])return!0;return!1},j=function(e){return Array.isArray(e)?e.join(""):e},L=function(e,t){return Array.isArray(e)?e.reduce((function(e,n){return function(e,t){for(var n=Object.keys(e),r=0;r<n.length;r+=1)if(t[n[r]]&&t[n[r]].includes(e[n[r]]))return!0;return!1}(n,t)?e.priority.push(n):e.default.push(n),e}),{priority:[],default:[]}):{default:e}},N=function(e,t){var n;return p({},e,((n={})[t]=void 0,n))},R=[g.NOSCRIPT,g.SCRIPT,g.STYLE],O=function(e,t){return void 0===t&&(t=!0),!1===t?String(e):String(e).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")},D=function(e){return Object.keys(e).reduce((function(t,n){var r=void 0!==e[n]?n+'="'+e[n]+'"':""+n;return t?t+" "+r:r}),"")},I=function(e,t){return void 0===t&&(t={}),Object.keys(e).reduce((function(t,n){return t[k[n]||n]=e[n],t}),t)},M=function(e,t){return t.map((function(t,n){var a,o=((a={key:n})["data-rh"]=!0,a);return Object.keys(t).forEach((function(e){var n=k[e]||e;"innerHTML"===n||"cssText"===n?o.dangerouslySetInnerHTML={__html:t.innerHTML||t.cssText}:o[n]=t[e]})),r.createElement(e,o)}))},F=function(e,t,n){switch(e){case g.TITLE:return{toComponent:function(){return n=t.titleAttributes,(a={key:e=t.title})["data-rh"]=!0,o=I(n,a),[r.createElement(g.TITLE,o,e)];var e,n,a,o},toString:function(){return function(e,t,n,r){var a=D(n),o=j(t);return a?"<"+e+' data-rh="true" '+a+">"+O(o,r)+"</"+e+">":"<"+e+' data-rh="true">'+O(o,r)+"</"+e+">"}(e,t.title,t.titleAttributes,n)}};case"bodyAttributes":case"htmlAttributes":return{toComponent:function(){return I(t)},toString:function(){return D(t)}};default:return{toComponent:function(){return M(e,t)},toString:function(){return function(e,t,n){return t.reduce((function(t,r){var a=Object.keys(r).filter((function(e){return!("innerHTML"===e||"cssText"===e)})).reduce((function(e,t){var a=void 0===r[t]?t:t+'="'+O(r[t],n)+'"';return e?e+" "+a:a}),""),o=r.innerHTML||r.cssText||"",i=-1===R.indexOf(e);return t+"<"+e+' data-rh="true" '+a+(i?"/>":">"+o+"</"+e+">")}),"")}(e,t,n)}}}},z=function(e){var t=e.baseTag,n=e.bodyAttributes,r=e.encode,a=e.htmlAttributes,o=e.noscriptTags,i=e.styleTags,l=e.title,s=void 0===l?"":l,c=e.titleAttributes,u=e.linkTags,d=e.metaTags,p=e.scriptTags,f={toComponent:function(){},toString:function(){return""}};if(e.prioritizeSeoTags){var m=function(e){var t=e.linkTags,n=e.scriptTags,r=e.encode,a=L(e.metaTags,v),o=L(t,b),i=L(n,y);return{priorityMethods:{toComponent:function(){return[].concat(M(g.META,a.priority),M(g.LINK,o.priority),M(g.SCRIPT,i.priority))},toString:function(){return F(g.META,a.priority,r)+" "+F(g.LINK,o.priority,r)+" "+F(g.SCRIPT,i.priority,r)}},metaTags:a.default,linkTags:o.default,scriptTags:i.default}}(e);f=m.priorityMethods,u=m.linkTags,d=m.metaTags,p=m.scriptTags}return{priority:f,base:F(g.BASE,t,r),bodyAttributes:F("bodyAttributes",n,r),htmlAttributes:F("htmlAttributes",a,r),link:F(g.LINK,u,r),meta:F(g.META,d,r),noscript:F(g.NOSCRIPT,o,r),script:F(g.SCRIPT,p,r),style:F(g.STYLE,i,r),title:F(g.TITLE,{title:s,titleAttributes:c},r)}},B=[],$=function(e,t){var n=this;void 0===t&&(t="undefined"!=typeof document),this.instances=[],this.value={setHelmet:function(e){n.context.helmet=e},helmetInstances:{get:function(){return n.canUseDOM?B:n.instances},add:function(e){(n.canUseDOM?B:n.instances).push(e)},remove:function(e){var t=(n.canUseDOM?B:n.instances).indexOf(e);(n.canUseDOM?B:n.instances).splice(t,1)}}},this.context=e,this.canUseDOM=t,t||(e.helmet=z({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}}))},U=r.createContext({}),q=o().shape({setHelmet:o().func,helmetInstances:o().shape({get:o().func,add:o().func,remove:o().func})}),H="undefined"!=typeof document,G=function(e){function t(n){var r;return(r=e.call(this,n)||this).helmetData=new $(r.props.context,t.canUseDOM),r}return f(t,e),t.prototype.render=function(){return r.createElement(U.Provider,{value:this.helmetData.value},this.props.children)},t}(r.Component);G.canUseDOM=H,G.propTypes={context:o().shape({helmet:o().shape()}),children:o().node.isRequired},G.defaultProps={context:{}},G.displayName="HelmetProvider";var V=function(e,t){var n,r=document.head||document.querySelector(g.HEAD),a=r.querySelectorAll(e+"[data-rh]"),o=[].slice.call(a),i=[];return t&&t.length&&t.forEach((function(t){var r=document.createElement(e);for(var a in t)Object.prototype.hasOwnProperty.call(t,a)&&("innerHTML"===a?r.innerHTML=t.innerHTML:"cssText"===a?r.styleSheet?r.styleSheet.cssText=t.cssText:r.appendChild(document.createTextNode(t.cssText)):r.setAttribute(a,void 0===t[a]?"":t[a]));r.setAttribute("data-rh","true"),o.some((function(e,t){return n=t,r.isEqualNode(e)}))?o.splice(n,1):i.push(r)})),o.forEach((function(e){return e.parentNode.removeChild(e)})),i.forEach((function(e){return r.appendChild(e)})),{oldTags:o,newTags:i}},W=function(e,t){var n=document.getElementsByTagName(e)[0];if(n){for(var r=n.getAttribute("data-rh"),a=r?r.split(","):[],o=[].concat(a),i=Object.keys(t),l=0;l<i.length;l+=1){var s=i[l],c=t[s]||"";n.getAttribute(s)!==c&&n.setAttribute(s,c),-1===a.indexOf(s)&&a.push(s);var u=o.indexOf(s);-1!==u&&o.splice(u,1)}for(var d=o.length-1;d>=0;d-=1)n.removeAttribute(o[d]);a.length===o.length?n.removeAttribute("data-rh"):n.getAttribute("data-rh")!==i.join(",")&&n.setAttribute("data-rh",i.join(","))}},Q=function(e,t){var n=e.baseTag,r=e.htmlAttributes,a=e.linkTags,o=e.metaTags,i=e.noscriptTags,l=e.onChangeClientState,s=e.scriptTags,c=e.styleTags,u=e.title,d=e.titleAttributes;W(g.BODY,e.bodyAttributes),W(g.HTML,r),function(e,t){void 0!==e&&document.title!==e&&(document.title=j(e)),W(g.TITLE,t)}(u,d);var p={baseTag:V(g.BASE,n),linkTags:V(g.LINK,a),metaTags:V(g.META,o),noscriptTags:V(g.NOSCRIPT,i),scriptTags:V(g.SCRIPT,s),styleTags:V(g.STYLE,c)},f={},m={};Object.keys(p).forEach((function(e){var t=p[e],n=t.newTags,r=t.oldTags;n.length&&(f[e]=n),r.length&&(m[e]=p[e].oldTags)})),t&&t(),l(e,f,m)},K=null,Y=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),a=0;a<n;a++)r[a]=arguments[a];return(t=e.call.apply(e,[this].concat(r))||this).rendered=!1,t}f(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!d()(e,this.props)},n.componentDidUpdate=function(){this.emitChange()},n.componentWillUnmount=function(){this.props.context.helmetInstances.remove(this),this.emitChange()},n.emitChange=function(){var e,t,n=this.props.context,r=n.setHelmet,a=null,o=(e=n.helmetInstances.get().map((function(e){var t=p({},e.props);return delete t.context,t})),{baseTag:A(["href"],e),bodyAttributes:C("bodyAttributes",e),defer:S(e,"defer"),encode:S(e,"encodeSpecialCharacters"),htmlAttributes:C("htmlAttributes",e),linkTags:T(g.LINK,["rel","href"],e),metaTags:T(g.META,["name","charset","http-equiv","property","itemprop"],e),noscriptTags:T(g.NOSCRIPT,["innerHTML"],e),onChangeClientState:_(e),scriptTags:T(g.SCRIPT,["src","innerHTML"],e),styleTags:T(g.STYLE,["cssText"],e),title:E(e),titleAttributes:C("titleAttributes",e),prioritizeSeoTags:P(e,"prioritizeSeoTags")});G.canUseDOM?(t=o,K&&cancelAnimationFrame(K),t.defer?K=requestAnimationFrame((function(){Q(t,(function(){K=null}))})):(Q(t),K=null)):z&&(a=z(o)),r(a)},n.init=function(){this.rendered||(this.rendered=!0,this.props.context.helmetInstances.add(this),this.emitChange())},n.render=function(){return this.init(),null},t}(r.Component);Y.propTypes={context:q.isRequired},Y.displayName="HelmetDispatcher";var Z=["children"],X=["children"],J=function(e){function t(){return e.apply(this,arguments)||this}f(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!l()(N(this.props,"helmetData"),N(e,"helmetData"))},n.mapNestedChildrenToProps=function(e,t){if(!t)return null;switch(e.type){case g.SCRIPT:case g.NOSCRIPT:return{innerHTML:t};case g.STYLE:return{cssText:t};default:throw new Error("<"+e.type+" /> elements are self-closing and can not contain children. Refer to our API for more information.")}},n.flattenArrayTypeChildren=function(e){var t,n=e.child,r=e.arrayTypeChildren;return p({},r,((t={})[n.type]=[].concat(r[n.type]||[],[p({},e.newChildProps,this.mapNestedChildrenToProps(n,e.nestedChildren))]),t))},n.mapObjectTypeChildren=function(e){var t,n,r=e.child,a=e.newProps,o=e.newChildProps,i=e.nestedChildren;switch(r.type){case g.TITLE:return p({},a,((t={})[r.type]=i,t.titleAttributes=p({},o),t));case g.BODY:return p({},a,{bodyAttributes:p({},o)});case g.HTML:return p({},a,{htmlAttributes:p({},o)});default:return p({},a,((n={})[r.type]=p({},o),n))}},n.mapArrayTypeChildrenToProps=function(e,t){var n=p({},t);return Object.keys(e).forEach((function(t){var r;n=p({},n,((r={})[t]=e[t],r))})),n},n.warnOnInvalidChildren=function(e,t){return c()(w.some((function(t){return e.type===t})),"function"==typeof e.type?"You may be attempting to nest <Helmet> components within each other, which is not allowed. Refer to our API for more information.":"Only elements types "+w.join(", ")+" are allowed. Helmet does not support rendering <"+e.type+"> elements. Refer to our API for more information."),c()(!t||"string"==typeof t||Array.isArray(t)&&!t.some((function(e){return"string"!=typeof e})),"Helmet expects a string as a child of <"+e.type+">. Did you forget to wrap your children in braces? ( <"+e.type+">{``}</"+e.type+"> ) Refer to our API for more information."),!0},n.mapChildrenToProps=function(e,t){var n=this,a={};return r.Children.forEach(e,(function(e){if(e&&e.props){var r=e.props,o=r.children,i=h(r,Z),l=Object.keys(i).reduce((function(e,t){return e[x[t]||t]=i[t],e}),{}),s=e.type;switch("symbol"==typeof s?s=s.toString():n.warnOnInvalidChildren(e,o),s){case g.FRAGMENT:t=n.mapChildrenToProps(o,t);break;case g.LINK:case g.META:case g.NOSCRIPT:case g.SCRIPT:case g.STYLE:a=n.flattenArrayTypeChildren({child:e,arrayTypeChildren:a,newChildProps:l,nestedChildren:o});break;default:t=n.mapObjectTypeChildren({child:e,newProps:t,newChildProps:l,nestedChildren:o})}}})),this.mapArrayTypeChildrenToProps(a,t)},n.render=function(){var e=this.props,t=e.children,n=h(e,X),a=p({},n),o=n.helmetData;return t&&(a=this.mapChildrenToProps(t,a)),!o||o instanceof $||(o=new $(o.context,o.instances)),o?r.createElement(Y,p({},a,{context:o.value,helmetData:void 0})):r.createElement(U.Consumer,null,(function(e){return r.createElement(Y,p({},a,{context:e}))}))},t}(r.Component);J.propTypes={base:o().object,bodyAttributes:o().object,children:o().oneOfType([o().arrayOf(o().node),o().node]),defaultTitle:o().string,defer:o().bool,encodeSpecialCharacters:o().bool,htmlAttributes:o().object,link:o().arrayOf(o().object),meta:o().arrayOf(o().object),noscript:o().arrayOf(o().object),onChangeClientState:o().func,script:o().arrayOf(o().object),style:o().arrayOf(o().object),title:o().string,titleAttributes:o().object,titleTemplate:o().string,prioritizeSeoTags:o().bool,helmetData:o().object},J.defaultProps={defer:!0,encodeSpecialCharacters:!0,prioritizeSeoTags:!1},J.displayName="Helmet"},2799:(e,t)=>{"use strict";var n="function"==typeof Symbol&&Symbol.for,r=n?Symbol.for("react.element"):60103,a=n?Symbol.for("react.portal"):60106,o=n?Symbol.for("react.fragment"):60107,i=n?Symbol.for("react.strict_mode"):60108,l=n?Symbol.for("react.profiler"):60114,s=n?Symbol.for("react.provider"):60109,c=n?Symbol.for("react.context"):60110,u=n?Symbol.for("react.async_mode"):60111,d=n?Symbol.for("react.concurrent_mode"):60111,p=n?Symbol.for("react.forward_ref"):60112,f=n?Symbol.for("react.suspense"):60113,m=n?Symbol.for("react.suspense_list"):60120,h=n?Symbol.for("react.memo"):60115,g=n?Symbol.for("react.lazy"):60116,b=n?Symbol.for("react.block"):60121,y=n?Symbol.for("react.fundamental"):60117,v=n?Symbol.for("react.responder"):60118,w=n?Symbol.for("react.scope"):60119;function k(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case r:switch(e=e.type){case u:case d:case o:case l:case i:case f:return e;default:switch(e=e&&e.$$typeof){case c:case p:case g:case h:case s:return e;default:return t}}case a:return t}}}function x(e){return k(e)===d}t.AsyncMode=u,t.ConcurrentMode=d,t.ContextConsumer=c,t.ContextProvider=s,t.Element=r,t.ForwardRef=p,t.Fragment=o,t.Lazy=g,t.Memo=h,t.Portal=a,t.Profiler=l,t.StrictMode=i,t.Suspense=f,t.isAsyncMode=function(e){return x(e)||k(e)===u},t.isConcurrentMode=x,t.isContextConsumer=function(e){return k(e)===c},t.isContextProvider=function(e){return k(e)===s},t.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===r},t.isForwardRef=function(e){return k(e)===p},t.isFragment=function(e){return k(e)===o},t.isLazy=function(e){return k(e)===g},t.isMemo=function(e){return k(e)===h},t.isPortal=function(e){return k(e)===a},t.isProfiler=function(e){return k(e)===l},t.isStrictMode=function(e){return k(e)===i},t.isSuspense=function(e){return k(e)===f},t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===o||e===d||e===l||e===i||e===f||e===m||"object"==typeof e&&null!==e&&(e.$$typeof===g||e.$$typeof===h||e.$$typeof===s||e.$$typeof===c||e.$$typeof===p||e.$$typeof===y||e.$$typeof===v||e.$$typeof===w||e.$$typeof===b)},t.typeOf=k},4363:(e,t,n)=>{"use strict";e.exports=n(2799)},3259:(e,t,n)=>{"use strict";function r(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}function a(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(){return i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i.apply(this,arguments)}var l=n(6540),s=[],c=[];var u=l.createContext(null);function d(e){var t=e(),n={loading:!0,loaded:null,error:null};return n.promise=t.then((function(e){return n.loading=!1,n.loaded=e,e})).catch((function(e){throw n.loading=!1,n.error=e,e})),n}function p(e){var t={loading:!1,loaded:{},error:null},n=[];try{Object.keys(e).forEach((function(r){var a=d(e[r]);a.loading?t.loading=!0:(t.loaded[r]=a.loaded,t.error=a.error),n.push(a.promise),a.promise.then((function(e){t.loaded[r]=e})).catch((function(e){t.error=e}))}))}catch(r){t.error=r}return t.promise=Promise.all(n).then((function(e){return t.loading=!1,e})).catch((function(e){throw t.loading=!1,e})),t}function f(e,t){return l.createElement((n=e)&&n.__esModule?n.default:n,t);var n}function m(e,t){var d,p;if(!t.loading)throw new Error("react-loadable requires a `loading` component");var m=i({loader:null,loading:null,delay:200,timeout:null,render:f,webpack:null,modules:null},t),h=null;function g(){return h||(h=e(m.loader)),h.promise}return s.push(g),"function"==typeof m.webpack&&c.push((function(){if((0,m.webpack)().every((function(e){return void 0!==e&&void 0!==n.m[e]})))return g()})),p=d=function(t){function n(n){var r;return o(a(a(r=t.call(this,n)||this)),"retry",(function(){r.setState({error:null,loading:!0,timedOut:!1}),h=e(m.loader),r._loadModule()})),g(),r.state={error:h.error,pastDelay:!1,timedOut:!1,loading:h.loading,loaded:h.loaded},r}r(n,t),n.preload=function(){return g()};var i=n.prototype;return i.UNSAFE_componentWillMount=function(){this._loadModule()},i.componentDidMount=function(){this._mounted=!0},i._loadModule=function(){var e=this;if(this.context&&Array.isArray(m.modules)&&m.modules.forEach((function(t){e.context.report(t)})),h.loading){var t=function(t){e._mounted&&e.setState(t)};"number"==typeof m.delay&&(0===m.delay?this.setState({pastDelay:!0}):this._delay=setTimeout((function(){t({pastDelay:!0})}),m.delay)),"number"==typeof m.timeout&&(this._timeout=setTimeout((function(){t({timedOut:!0})}),m.timeout));var n=function(){t({error:h.error,loaded:h.loaded,loading:h.loading}),e._clearTimeouts()};h.promise.then((function(){return n(),null})).catch((function(e){return n(),null}))}},i.componentWillUnmount=function(){this._mounted=!1,this._clearTimeouts()},i._clearTimeouts=function(){clearTimeout(this._delay),clearTimeout(this._timeout)},i.render=function(){return this.state.loading||this.state.error?l.createElement(m.loading,{isLoading:this.state.loading,pastDelay:this.state.pastDelay,timedOut:this.state.timedOut,error:this.state.error,retry:this.retry}):this.state.loaded?m.render(this.state.loaded,this.props):null},n}(l.Component),o(d,"contextType",u),p}function h(e){return m(d,e)}h.Map=function(e){if("function"!=typeof e.render)throw new Error("LoadableMap requires a `render(loaded, props)` function");return m(p,e)};var g=function(e){function t(){return e.apply(this,arguments)||this}return r(t,e),t.prototype.render=function(){return l.createElement(u.Provider,{value:{report:this.props.report}},l.Children.only(this.props.children))},t}(l.Component);function b(e){for(var t=[];e.length;){var n=e.pop();t.push(n())}return Promise.all(t).then((function(){if(e.length)return b(e)}))}h.Capture=g,h.preloadAll=function(){return new Promise((function(e,t){b(s).then(e,t)}))},h.preloadReady=function(){return new Promise((function(e,t){b(c).then(e,e)}))},e.exports=h},2831:(e,t,n)=>{"use strict";n.d(t,{u:()=>i,v:()=>l});var r=n(6347),a=n(8168),o=n(6540);function i(e,t,n){return void 0===n&&(n=[]),e.some((function(e){var a=e.path?(0,r.B6)(t,e):n.length?n[n.length-1].match:r.Ix.computeRootMatch(t);return a&&(n.push({route:e,match:a}),e.routes&&i(e.routes,t,n)),a})),n}function l(e,t,n){return void 0===t&&(t={}),void 0===n&&(n={}),e?o.createElement(r.dO,n,e.map((function(e,n){return o.createElement(r.qh,{key:e.key||n,path:e.path,exact:e.exact,strict:e.strict,render:function(n){return e.render?e.render((0,a.A)({},n,{},t,{route:e})):o.createElement(e.component,(0,a.A)({},n,t,{route:e}))}})}))):null}},4625:(e,t,n)=>{"use strict";n.d(t,{I9:()=>d,Kd:()=>u,N_:()=>b,k2:()=>w});var r=n(6347),a=n(2892),o=n(6540),i=n(1513),l=n(8168),s=n(8587),c=n(1561),u=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),a=0;a<n;a++)r[a]=arguments[a];return(t=e.call.apply(e,[this].concat(r))||this).history=(0,i.zR)(t.props),t}return(0,a.A)(t,e),t.prototype.render=function(){return o.createElement(r.Ix,{history:this.history,children:this.props.children})},t}(o.Component);var d=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),a=0;a<n;a++)r[a]=arguments[a];return(t=e.call.apply(e,[this].concat(r))||this).history=(0,i.TM)(t.props),t}return(0,a.A)(t,e),t.prototype.render=function(){return o.createElement(r.Ix,{history:this.history,children:this.props.children})},t}(o.Component);var p=function(e,t){return"function"==typeof e?e(t):e},f=function(e,t){return"string"==typeof e?(0,i.yJ)(e,null,null,t):e},m=function(e){return e},h=o.forwardRef;void 0===h&&(h=m);var g=h((function(e,t){var n=e.innerRef,r=e.navigate,a=e.onClick,i=(0,s.A)(e,["innerRef","navigate","onClick"]),c=i.target,u=(0,l.A)({},i,{onClick:function(e){try{a&&a(e)}catch(t){throw e.preventDefault(),t}e.defaultPrevented||0!==e.button||c&&"_self"!==c||function(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}(e)||(e.preventDefault(),r())}});return u.ref=m!==h&&t||n,o.createElement("a",u)}));var b=h((function(e,t){var n=e.component,a=void 0===n?g:n,u=e.replace,d=e.to,b=e.innerRef,y=(0,s.A)(e,["component","replace","to","innerRef"]);return o.createElement(r.XZ.Consumer,null,(function(e){e||(0,c.A)(!1);var n=e.history,r=f(p(d,e.location),e.location),s=r?n.createHref(r):"",g=(0,l.A)({},y,{href:s,navigate:function(){var t=p(d,e.location),r=(0,i.AO)(e.location)===(0,i.AO)(f(t));(u||r?n.replace:n.push)(t)}});return m!==h?g.ref=t||b:g.innerRef=b,o.createElement(a,g)}))})),y=function(e){return e},v=o.forwardRef;void 0===v&&(v=y);var w=v((function(e,t){var n=e["aria-current"],a=void 0===n?"page":n,i=e.activeClassName,u=void 0===i?"active":i,d=e.activeStyle,m=e.className,h=e.exact,g=e.isActive,w=e.location,k=e.sensitive,x=e.strict,S=e.style,E=e.to,_=e.innerRef,C=(0,s.A)(e,["aria-current","activeClassName","activeStyle","className","exact","isActive","location","sensitive","strict","style","to","innerRef"]);return o.createElement(r.XZ.Consumer,null,(function(e){e||(0,c.A)(!1);var n=w||e.location,i=f(p(E,n),n),s=i.pathname,A=s&&s.replace(/([.+*?=^!:${}()[\]|/\\])/g,"\\$1"),T=A?(0,r.B6)(n.pathname,{path:A,exact:h,sensitive:k,strict:x}):null,P=!!(g?g(T,n):T),j="function"==typeof m?m(P):m,L="function"==typeof S?S(P):S;P&&(j=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return t.filter((function(e){return e})).join(" ")}(j,u),L=(0,l.A)({},L,d));var N=(0,l.A)({"aria-current":P&&a||null,className:j,style:L,to:i},C);return y!==v?N.ref=t||_:N.innerRef=_,o.createElement(b,N)}))}))},6347:(e,t,n)=>{"use strict";n.d(t,{B6:()=>S,Ix:()=>v,W6:()=>N,XZ:()=>y,dO:()=>j,qh:()=>E,zy:()=>R});var r=n(2892),a=n(6540),o=n(5556),i=n.n(o),l=n(1513),s=n(1561),c=n(8168),u=n(5302),d=n.n(u),p=(n(4363),n(8587)),f=(n(4146),1073741823),m="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==n.g?n.g:{};var h=a.createContext||function(e,t){var n,o,l="__create-react-context-"+function(){var e="__global_unique_id__";return m[e]=(m[e]||0)+1}()+"__",s=function(e){function n(){for(var t,n,r,a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return(t=e.call.apply(e,[this].concat(o))||this).emitter=(n=t.props.value,r=[],{on:function(e){r.push(e)},off:function(e){r=r.filter((function(t){return t!==e}))},get:function(){return n},set:function(e,t){n=e,r.forEach((function(e){return e(n,t)}))}}),t}(0,r.A)(n,e);var a=n.prototype;return a.getChildContext=function(){var e;return(e={})[l]=this.emitter,e},a.componentWillReceiveProps=function(e){if(this.props.value!==e.value){var n,r=this.props.value,a=e.value;((o=r)===(i=a)?0!==o||1/o==1/i:o!=o&&i!=i)?n=0:(n="function"==typeof t?t(r,a):f,0!==(n|=0)&&this.emitter.set(e.value,n))}var o,i},a.render=function(){return this.props.children},n}(a.Component);s.childContextTypes=((n={})[l]=i().object.isRequired,n);var c=function(t){function n(){for(var e,n=arguments.length,r=new Array(n),a=0;a<n;a++)r[a]=arguments[a];return(e=t.call.apply(t,[this].concat(r))||this).observedBits=void 0,e.state={value:e.getValue()},e.onUpdate=function(t,n){(0|e.observedBits)&n&&e.setState({value:e.getValue()})},e}(0,r.A)(n,t);var a=n.prototype;return a.componentWillReceiveProps=function(e){var t=e.observedBits;this.observedBits=null==t?f:t},a.componentDidMount=function(){this.context[l]&&this.context[l].on(this.onUpdate);var e=this.props.observedBits;this.observedBits=null==e?f:e},a.componentWillUnmount=function(){this.context[l]&&this.context[l].off(this.onUpdate)},a.getValue=function(){return this.context[l]?this.context[l].get():e},a.render=function(){return(e=this.props.children,Array.isArray(e)?e[0]:e)(this.state.value);var e},n}(a.Component);return c.contextTypes=((o={})[l]=i().object,o),{Provider:s,Consumer:c}},g=function(e){var t=h();return t.displayName=e,t},b=g("Router-History"),y=g("Router"),v=function(e){function t(t){var n;return(n=e.call(this,t)||this).state={location:t.history.location},n._isMounted=!1,n._pendingLocation=null,t.staticContext||(n.unlisten=t.history.listen((function(e){n._pendingLocation=e}))),n}(0,r.A)(t,e),t.computeRootMatch=function(e){return{path:"/",url:"/",params:{},isExact:"/"===e}};var n=t.prototype;return n.componentDidMount=function(){var e=this;this._isMounted=!0,this.unlisten&&this.unlisten(),this.props.staticContext||(this.unlisten=this.props.history.listen((function(t){e._isMounted&&e.setState({location:t})}))),this._pendingLocation&&this.setState({location:this._pendingLocation})},n.componentWillUnmount=function(){this.unlisten&&(this.unlisten(),this._isMounted=!1,this._pendingLocation=null)},n.render=function(){return a.createElement(y.Provider,{value:{history:this.props.history,location:this.state.location,match:t.computeRootMatch(this.state.location.pathname),staticContext:this.props.staticContext}},a.createElement(b.Provider,{children:this.props.children||null,value:this.props.history}))},t}(a.Component);a.Component;a.Component;var w={},k=1e4,x=0;function S(e,t){void 0===t&&(t={}),("string"==typeof t||Array.isArray(t))&&(t={path:t});var n=t,r=n.path,a=n.exact,o=void 0!==a&&a,i=n.strict,l=void 0!==i&&i,s=n.sensitive,c=void 0!==s&&s;return[].concat(r).reduce((function(t,n){if(!n&&""!==n)return null;if(t)return t;var r=function(e,t){var n=""+t.end+t.strict+t.sensitive,r=w[n]||(w[n]={});if(r[e])return r[e];var a=[],o={regexp:d()(e,a,t),keys:a};return x<k&&(r[e]=o,x++),o}(n,{end:o,strict:l,sensitive:c}),a=r.regexp,i=r.keys,s=a.exec(e);if(!s)return null;var u=s[0],p=s.slice(1),f=e===u;return o&&!f?null:{path:n,url:"/"===n&&""===u?"/":u,isExact:f,params:i.reduce((function(e,t,n){return e[t.name]=p[n],e}),{})}}),null)}var E=function(e){function t(){return e.apply(this,arguments)||this}return(0,r.A)(t,e),t.prototype.render=function(){var e=this;return a.createElement(y.Consumer,null,(function(t){t||(0,s.A)(!1);var n=e.props.location||t.location,r=e.props.computedMatch?e.props.computedMatch:e.props.path?S(n.pathname,e.props):t.match,o=(0,c.A)({},t,{location:n,match:r}),i=e.props,l=i.children,u=i.component,d=i.render;return Array.isArray(l)&&function(e){return 0===a.Children.count(e)}(l)&&(l=null),a.createElement(y.Provider,{value:o},o.match?l?"function"==typeof l?l(o):l:u?a.createElement(u,o):d?d(o):null:"function"==typeof l?l(o):null)}))},t}(a.Component);function _(e){return"/"===e.charAt(0)?e:"/"+e}function C(e,t){if(!e)return t;var n=_(e);return 0!==t.pathname.indexOf(n)?t:(0,c.A)({},t,{pathname:t.pathname.substr(n.length)})}function A(e){return"string"==typeof e?e:(0,l.AO)(e)}function T(e){return function(){(0,s.A)(!1)}}function P(){}a.Component;var j=function(e){function t(){return e.apply(this,arguments)||this}return(0,r.A)(t,e),t.prototype.render=function(){var e=this;return a.createElement(y.Consumer,null,(function(t){t||(0,s.A)(!1);var n,r,o=e.props.location||t.location;return a.Children.forEach(e.props.children,(function(e){if(null==r&&a.isValidElement(e)){n=e;var i=e.props.path||e.props.from;r=i?S(o.pathname,(0,c.A)({},e.props,{path:i})):t.match}})),r?a.cloneElement(n,{location:o,computedMatch:r}):null}))},t}(a.Component);var L=a.useContext;function N(){return L(b)}function R(){return L(y).location}},1020:(e,t,n)=>{"use strict";var r=n(6540),a=Symbol.for("react.element"),o=Symbol.for("react.fragment"),i=Object.prototype.hasOwnProperty,l=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,s={key:!0,ref:!0,__self:!0,__source:!0};function c(e,t,n){var r,o={},c=null,u=null;for(r in void 0!==n&&(c=""+n),void 0!==t.key&&(c=""+t.key),void 0!==t.ref&&(u=t.ref),t)i.call(t,r)&&!s.hasOwnProperty(r)&&(o[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps)void 0===o[r]&&(o[r]=t[r]);return{$$typeof:a,type:e,key:c,ref:u,props:o,_owner:l.current}}t.Fragment=o,t.jsx=c,t.jsxs=c},5287:(e,t)=>{"use strict";var n=Symbol.for("react.element"),r=Symbol.for("react.portal"),a=Symbol.for("react.fragment"),o=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),l=Symbol.for("react.provider"),s=Symbol.for("react.context"),c=Symbol.for("react.forward_ref"),u=Symbol.for("react.suspense"),d=Symbol.for("react.memo"),p=Symbol.for("react.lazy"),f=Symbol.iterator;var m={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},h=Object.assign,g={};function b(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}function y(){}function v(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}b.prototype.isReactComponent={},b.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},b.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},y.prototype=b.prototype;var w=v.prototype=new y;w.constructor=v,h(w,b.prototype),w.isPureReactComponent=!0;var k=Array.isArray,x=Object.prototype.hasOwnProperty,S={current:null},E={key:!0,ref:!0,__self:!0,__source:!0};function _(e,t,r){var a,o={},i=null,l=null;if(null!=t)for(a in void 0!==t.ref&&(l=t.ref),void 0!==t.key&&(i=""+t.key),t)x.call(t,a)&&!E.hasOwnProperty(a)&&(o[a]=t[a]);var s=arguments.length-2;if(1===s)o.children=r;else if(1<s){for(var c=Array(s),u=0;u<s;u++)c[u]=arguments[u+2];o.children=c}if(e&&e.defaultProps)for(a in s=e.defaultProps)void 0===o[a]&&(o[a]=s[a]);return{$$typeof:n,type:e,key:i,ref:l,props:o,_owner:S.current}}function C(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}var A=/\/+/g;function T(e,t){return"object"==typeof e&&null!==e&&null!=e.key?function(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,(function(e){return t[e]}))}(""+e.key):t.toString(36)}function P(e,t,a,o,i){var l=typeof e;"undefined"!==l&&"boolean"!==l||(e=null);var s=!1;if(null===e)s=!0;else switch(l){case"string":case"number":s=!0;break;case"object":switch(e.$$typeof){case n:case r:s=!0}}if(s)return i=i(s=e),e=""===o?"."+T(s,0):o,k(i)?(a="",null!=e&&(a=e.replace(A,"$&/")+"/"),P(i,t,a,"",(function(e){return e}))):null!=i&&(C(i)&&(i=function(e,t){return{$$typeof:n,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(i,a+(!i.key||s&&s.key===i.key?"":(""+i.key).replace(A,"$&/")+"/")+e)),t.push(i)),1;if(s=0,o=""===o?".":o+":",k(e))for(var c=0;c<e.length;c++){var u=o+T(l=e[c],c);s+=P(l,t,a,u,i)}else if(u=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=f&&e[f]||e["@@iterator"])?e:null}(e),"function"==typeof u)for(e=u.call(e),c=0;!(l=e.next()).done;)s+=P(l=l.value,t,a,u=o+T(l,c++),i);else if("object"===l)throw t=String(e),Error("Objects are not valid as a React child (found: "+("[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.");return s}function j(e,t,n){if(null==e)return e;var r=[],a=0;return P(e,r,"","",(function(e){return t.call(n,e,a++)})),r}function L(e){if(-1===e._status){var t=e._result;(t=t()).then((function(t){0!==e._status&&-1!==e._status||(e._status=1,e._result=t)}),(function(t){0!==e._status&&-1!==e._status||(e._status=2,e._result=t)})),-1===e._status&&(e._status=0,e._result=t)}if(1===e._status)return e._result.default;throw e._result}var N={current:null},R={transition:null},O={ReactCurrentDispatcher:N,ReactCurrentBatchConfig:R,ReactCurrentOwner:S};function D(){throw Error("act(...) is not supported in production builds of React.")}t.Children={map:j,forEach:function(e,t,n){j(e,(function(){t.apply(this,arguments)}),n)},count:function(e){var t=0;return j(e,(function(){t++})),t},toArray:function(e){return j(e,(function(e){return e}))||[]},only:function(e){if(!C(e))throw Error("React.Children.only expected to receive a single React element child.");return e}},t.Component=b,t.Fragment=a,t.Profiler=i,t.PureComponent=v,t.StrictMode=o,t.Suspense=u,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=O,t.act=D,t.cloneElement=function(e,t,r){if(null==e)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+e+".");var a=h({},e.props),o=e.key,i=e.ref,l=e._owner;if(null!=t){if(void 0!==t.ref&&(i=t.ref,l=S.current),void 0!==t.key&&(o=""+t.key),e.type&&e.type.defaultProps)var s=e.type.defaultProps;for(c in t)x.call(t,c)&&!E.hasOwnProperty(c)&&(a[c]=void 0===t[c]&&void 0!==s?s[c]:t[c])}var c=arguments.length-2;if(1===c)a.children=r;else if(1<c){s=Array(c);for(var u=0;u<c;u++)s[u]=arguments[u+2];a.children=s}return{$$typeof:n,type:e.type,key:o,ref:i,props:a,_owner:l}},t.createContext=function(e){return(e={$$typeof:s,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null}).Provider={$$typeof:l,_context:e},e.Consumer=e},t.createElement=_,t.createFactory=function(e){var t=_.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:c,render:e}},t.isValidElement=C,t.lazy=function(e){return{$$typeof:p,_payload:{_status:-1,_result:e},_init:L}},t.memo=function(e,t){return{$$typeof:d,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=R.transition;R.transition={};try{e()}finally{R.transition=t}},t.unstable_act=D,t.useCallback=function(e,t){return N.current.useCallback(e,t)},t.useContext=function(e){return N.current.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e){return N.current.useDeferredValue(e)},t.useEffect=function(e,t){return N.current.useEffect(e,t)},t.useId=function(){return N.current.useId()},t.useImperativeHandle=function(e,t,n){return N.current.useImperativeHandle(e,t,n)},t.useInsertionEffect=function(e,t){return N.current.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return N.current.useLayoutEffect(e,t)},t.useMemo=function(e,t){return N.current.useMemo(e,t)},t.useReducer=function(e,t,n){return N.current.useReducer(e,t,n)},t.useRef=function(e){return N.current.useRef(e)},t.useState=function(e){return N.current.useState(e)},t.useSyncExternalStore=function(e,t,n){return N.current.useSyncExternalStore(e,t,n)},t.useTransition=function(){return N.current.useTransition()},t.version="18.3.1"},6540:(e,t,n)=>{"use strict";e.exports=n(5287)},4848:(e,t,n)=>{"use strict";e.exports=n(1020)},7463:(e,t)=>{"use strict";function n(e,t){var n=e.length;e.push(t);e:for(;0<n;){var r=n-1>>>1,a=e[r];if(!(0<o(a,t)))break e;e[r]=t,e[n]=a,n=r}}function r(e){return 0===e.length?null:e[0]}function a(e){if(0===e.length)return null;var t=e[0],n=e.pop();if(n!==t){e[0]=n;e:for(var r=0,a=e.length,i=a>>>1;r<i;){var l=2*(r+1)-1,s=e[l],c=l+1,u=e[c];if(0>o(s,n))c<a&&0>o(u,s)?(e[r]=u,e[c]=n,r=c):(e[r]=s,e[l]=n,r=l);else{if(!(c<a&&0>o(u,n)))break e;e[r]=u,e[c]=n,r=c}}}return t}function o(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}if("object"==typeof performance&&"function"==typeof performance.now){var i=performance;t.unstable_now=function(){return i.now()}}else{var l=Date,s=l.now();t.unstable_now=function(){return l.now()-s}}var c=[],u=[],d=1,p=null,f=3,m=!1,h=!1,g=!1,b="function"==typeof setTimeout?setTimeout:null,y="function"==typeof clearTimeout?clearTimeout:null,v="undefined"!=typeof setImmediate?setImmediate:null;function w(e){for(var t=r(u);null!==t;){if(null===t.callback)a(u);else{if(!(t.startTime<=e))break;a(u),t.sortIndex=t.expirationTime,n(c,t)}t=r(u)}}function k(e){if(g=!1,w(e),!h)if(null!==r(c))h=!0,R(x);else{var t=r(u);null!==t&&O(k,t.startTime-e)}}function x(e,n){h=!1,g&&(g=!1,y(C),C=-1),m=!0;var o=f;try{for(w(n),p=r(c);null!==p&&(!(p.expirationTime>n)||e&&!P());){var i=p.callback;if("function"==typeof i){p.callback=null,f=p.priorityLevel;var l=i(p.expirationTime<=n);n=t.unstable_now(),"function"==typeof l?p.callback=l:p===r(c)&&a(c),w(n)}else a(c);p=r(c)}if(null!==p)var s=!0;else{var d=r(u);null!==d&&O(k,d.startTime-n),s=!1}return s}finally{p=null,f=o,m=!1}}"undefined"!=typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);var S,E=!1,_=null,C=-1,A=5,T=-1;function P(){return!(t.unstable_now()-T<A)}function j(){if(null!==_){var e=t.unstable_now();T=e;var n=!0;try{n=_(!0,e)}finally{n?S():(E=!1,_=null)}}else E=!1}if("function"==typeof v)S=function(){v(j)};else if("undefined"!=typeof MessageChannel){var L=new MessageChannel,N=L.port2;L.port1.onmessage=j,S=function(){N.postMessage(null)}}else S=function(){b(j,0)};function R(e){_=e,E||(E=!0,S())}function O(e,n){C=b((function(){e(t.unstable_now())}),n)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_continueExecution=function(){h||m||(h=!0,R(x))},t.unstable_forceFrameRate=function(e){0>e||125<e?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):A=0<e?Math.floor(1e3/e):5},t.unstable_getCurrentPriorityLevel=function(){return f},t.unstable_getFirstCallbackNode=function(){return r(c)},t.unstable_next=function(e){switch(f){case 1:case 2:case 3:var t=3;break;default:t=f}var n=f;f=t;try{return e()}finally{f=n}},t.unstable_pauseExecution=function(){},t.unstable_requestPaint=function(){},t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=f;f=e;try{return t()}finally{f=n}},t.unstable_scheduleCallback=function(e,a,o){var i=t.unstable_now();switch("object"==typeof o&&null!==o?o="number"==typeof(o=o.delay)&&0<o?i+o:i:o=i,e){case 1:var l=-1;break;case 2:l=250;break;case 5:l=1073741823;break;case 4:l=1e4;break;default:l=5e3}return e={id:d++,callback:a,priorityLevel:e,startTime:o,expirationTime:l=o+l,sortIndex:-1},o>i?(e.sortIndex=o,n(u,e),null===r(c)&&e===r(u)&&(g?(y(C),C=-1):g=!0,O(k,o-i))):(e.sortIndex=l,n(c,e),h||m||(h=!0,R(x))),e},t.unstable_shouldYield=P,t.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}},9982:(e,t,n)=>{"use strict";e.exports=n(7463)},2833:e=>{e.exports=function(e,t,n,r){var a=n?n.call(r,e,t):void 0;if(void 0!==a)return!!a;if(e===t)return!0;if("object"!=typeof e||!e||"object"!=typeof t||!t)return!1;var o=Object.keys(e),i=Object.keys(t);if(o.length!==i.length)return!1;for(var l=Object.prototype.hasOwnProperty.bind(t),s=0;s<o.length;s++){var c=o[s];if(!l(c))return!1;var u=e[c],d=t[c];if(!1===(a=n?n.call(r,u,d,c):void 0)||void 0===a&&u!==d)return!1}return!0}},4784:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});const r={title:"PikiwiDB(Pika)",tagline:"\u4e3a\u6d77\u91cf\u6570\u636e\u5b58\u50a8\u8bbe\u8ba1\u7684\u9ad8\u53ef\u7528\u952e\u503c\u6570\u636e\u5e93",favicon:"img/favicon.ico",url:"https://www.pikiwidb.com",baseUrl:"/",organizationName:"PikiwiDB(Pika) \u5f00\u6e90\u793e\u533a",projectName:"PikiwiDB(Pika)",onBrokenLinks:"throw",onBrokenMarkdownLinks:"warn",i18n:{defaultLocale:"zh-Hans",locales:["zh-Hans"],path:"i18n",localeConfigs:{}},presets:[["classic",{docs:{sidebarPath:"./sidebars.js",editUrl:"https://atomgit.com/zouxiangneihe/website/tree/master",remarkPlugins:[null],rehypePlugins:[null]},theme:{customCss:"./src/css/custom.css"},blog:{blogSidebarTitle:"\u5168\u90e8\u6587\u7ae0",blogSidebarCount:"ALL"}}]],stylesheets:[{href:"/css/katex.min.css",type:"text/css"}],themeConfig:{image:"img/docusaurus-social-card.jpg",navbar:{title:"",logo:{alt:"Logo",src:"img/PikiwiDB-Logo.png"},items:[{to:"docs/\u5e8f\u8a00",label:"\u6587\u6863",position:"left"},{to:"blog",label:"\u535a\u5ba2",position:"left"}],hideOnScroll:!1},footer:{style:"dark",links:[{title:"\u5fae\u4fe1\u516c\u4f17\u53f7",items:[{label:"PikiwiDB(Pika) \u516c\u4f17\u53f7",href:"https://mp.weixin.qq.com/s/CvIdQs3g31DC8JztyymuqQ"}]},{title:"Github \u4ed3\u5e93",items:[{label:"PikiwiDB(Pika) \u4ed3\u5e93",href:"https://github.com/OpenAtomFoundation/pika"}]},{title:"\u6587\u6863\u4ed3\u5e93",items:[{label:"PikiwiDB(Pika) \u6587\u6863\u4ed3\u5e93",href:"https://github.com/pikiwidb/website"}]}],copyright:"Copyright \xa9 2024 PikiwiDB \u5f00\u6e90\u6570\u636e\u5e93\u793e\u533a"},prism:{theme:{plain:{color:"#393A34",backgroundColor:"#f6f8fa"},styles:[{types:["comment","prolog","doctype","cdata"],style:{color:"#999988",fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}},{types:["string","attr-value"],style:{color:"#e3116c"}},{types:["punctuation","operator"],style:{color:"#393A34"}},{types:["entity","url","symbol","number","boolean","variable","constant","property","regex","inserted"],style:{color:"#36acaa"}},{types:["atrule","keyword","attr-name","selector"],style:{color:"#00a4db"}},{types:["function","deleted","tag"],style:{color:"#d73a49"}},{types:["function-variable"],style:{color:"#6f42c1"}},{types:["tag","selector","keyword"],style:{color:"#00009f"}}]},darkTheme:{plain:{color:"#F8F8F2",backgroundColor:"#282A36"},styles:[{types:["prolog","constant","builtin"],style:{color:"rgb(189, 147, 249)"}},{types:["inserted","function"],style:{color:"rgb(80, 250, 123)"}},{types:["deleted"],style:{color:"rgb(255, 85, 85)"}},{types:["changed"],style:{color:"rgb(255, 184, 108)"}},{types:["punctuation","symbol"],style:{color:"rgb(248, 248, 242)"}},{types:["string","char","tag","selector"],style:{color:"rgb(255, 121, 198)"}},{types:["keyword","variable"],style:{color:"rgb(189, 147, 249)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(98, 114, 164)"}},{types:["attr-name"],style:{color:"rgb(241, 250, 140)"}}]},additionalLanguages:[],magicComments:[{className:"theme-code-block-highlighted-line",line:"highlight-next-line",block:{start:"highlight-start",end:"highlight-end"}}]},colorMode:{defaultMode:"light",disableSwitch:!1,respectPrefersColorScheme:!1},docs:{versionPersistence:"localStorage",sidebar:{hideable:!1,autoCollapseCategories:!1}},metadata:[],tableOfContents:{minHeadingLevel:2,maxHeadingLevel:3}},baseUrlIssueBanner:!0,future:{experimental_storage:{type:"localStorage",namespace:!1},experimental_router:"browser"},onBrokenAnchors:"warn",onDuplicateRoutes:"warn",staticDirectories:["static"],customFields:{},plugins:[],themes:[],scripts:[],headTags:[],clientModules:[],titleDelimiter:"|",noIndex:!1,markdown:{format:"mdx",mermaid:!1,mdx1Compat:{comments:!0,admonitions:!0,headingIds:!0},anchors:{maintainCase:!1}}}},8168:(e,t,n)=>{"use strict";function r(){return r=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},r.apply(null,arguments)}n.d(t,{A:()=>r})},2892:(e,t,n)=>{"use strict";function r(e,t){return r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},r(e,t)}function a(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,r(e,t)}n.d(t,{A:()=>a})},8587:(e,t,n)=>{"use strict";function r(e,t){if(null==e)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.includes(r))continue;n[r]=e[r]}return n}n.d(t,{A:()=>r})},4164:(e,t,n)=>{"use strict";function r(e){var t,n,a="";if("string"==typeof e||"number"==typeof e)a+=e;else if("object"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(n=r(e[t]))&&(a&&(a+=" "),a+=n)}else for(n in e)e[n]&&(a&&(a+=" "),a+=n);return a}n.d(t,{A:()=>a});const a=function(){for(var e,t,n=0,a="",o=arguments.length;n<o;n++)(e=arguments[n])&&(t=r(e))&&(a&&(a+=" "),a+=t);return a}},1765:(e,t,n)=>{"use strict";n.d(t,{My:()=>A,f4:()=>ee});var r,a,o,i,l,s,c,u=n(6540),d=n(4164),p=Object.create,f=Object.defineProperty,m=Object.defineProperties,h=Object.getOwnPropertyDescriptor,g=Object.getOwnPropertyDescriptors,b=Object.getOwnPropertyNames,y=Object.getOwnPropertySymbols,v=Object.getPrototypeOf,w=Object.prototype.hasOwnProperty,k=Object.prototype.propertyIsEnumerable,x=(e,t,n)=>t in e?f(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,S=(e,t)=>{for(var n in t||(t={}))w.call(t,n)&&x(e,n,t[n]);if(y)for(var n of y(t))k.call(t,n)&&x(e,n,t[n]);return e},E=(e,t)=>m(e,g(t)),_=(e,t)=>{var n={};for(var r in e)w.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&y)for(var r of y(e))t.indexOf(r)<0&&k.call(e,r)&&(n[r]=e[r]);return n},C=(r={"../../node_modules/.pnpm/prismjs@1.29.0_patch_hash=vrxx3pzkik6jpmgpayxfjunetu/node_modules/prismjs/prism.js"(e,t){var n=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof a?new a(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/</g,"<").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++t}),e.__id},clone:function e(t,n){var a,o;switch(n=n||{},r.util.type(t)){case"Object":if(o=r.util.objId(t),n[o])return n[o];for(var i in a={},n[o]=a,t)t.hasOwnProperty(i)&&(a[i]=e(t[i],n));return a;case"Array":return o=r.util.objId(t),n[o]?n[o]:(a=[],n[o]=a,t.forEach((function(t,r){a[r]=e(t,n)})),a);default:return t}},getLanguage:function(t){for(;t;){var n=e.exec(t.className);if(n)return n[1].toLowerCase();t=t.parentElement}return"none"},setLanguage:function(t,n){t.className=t.className.replace(RegExp(e,"gi"),""),t.classList.add("language-"+n)},isActive:function(e,t,n){for(var r="no-"+t;e;){var a=e.classList;if(a.contains(t))return!0;if(a.contains(r))return!1;e=e.parentElement}return!!n}},languages:{plain:n,plaintext:n,text:n,txt:n,extend:function(e,t){var n=r.util.clone(r.languages[e]);for(var a in t)n[a]=t[a];return n},insertBefore:function(e,t,n,a){var o=(a=a||r.languages)[e],i={};for(var l in o)if(o.hasOwnProperty(l)){if(l==t)for(var s in n)n.hasOwnProperty(s)&&(i[s]=n[s]);n.hasOwnProperty(l)||(i[l]=o[l])}var c=a[e];return a[e]=i,r.languages.DFS(r.languages,(function(t,n){n===c&&t!=e&&(this[t]=i)})),i},DFS:function e(t,n,a,o){o=o||{};var i=r.util.objId;for(var l in t)if(t.hasOwnProperty(l)){n.call(t,l,t[l],a||l);var s=t[l],c=r.util.type(s);"Object"!==c||o[i(s)]?"Array"!==c||o[i(s)]||(o[i(s)]=!0,e(s,n,l,o)):(o[i(s)]=!0,e(s,n,null,o))}}},plugins:{},highlight:function(e,t,n){var o={code:e,grammar:t,language:n};if(r.hooks.run("before-tokenize",o),!o.grammar)throw new Error('The language "'+o.language+'" has no grammar.');return o.tokens=r.tokenize(o.code,o.grammar),r.hooks.run("after-tokenize",o),a.stringify(r.util.encode(o.tokens),o.language)},tokenize:function(e,t){var n=t.rest;if(n){for(var r in n)t[r]=n[r];delete t.rest}var a=new l;return s(a,a.head,e),i(e,a,t,a.head,0),function(e){for(var t=[],n=e.head.next;n!==e.tail;)t.push(n.value),n=n.next;return t}(a)},hooks:{all:{},add:function(e,t){var n=r.hooks.all;n[e]=n[e]||[],n[e].push(t)},run:function(e,t){var n=r.hooks.all[e];if(n&&n.length)for(var a,o=0;a=n[o++];)a(t)}},Token:a};function a(e,t,n,r){this.type=e,this.content=t,this.alias=n,this.length=0|(r||"").length}function o(e,t,n,r){e.lastIndex=t;var a=e.exec(n);if(a&&r&&a[1]){var o=a[1].length;a.index+=o,a[0]=a[0].slice(o)}return a}function i(e,t,n,l,u,d){for(var p in n)if(n.hasOwnProperty(p)&&n[p]){var f=n[p];f=Array.isArray(f)?f:[f];for(var m=0;m<f.length;++m){if(d&&d.cause==p+","+m)return;var h=f[m],g=h.inside,b=!!h.lookbehind,y=!!h.greedy,v=h.alias;if(y&&!h.pattern.global){var w=h.pattern.toString().match(/[imsuy]*$/)[0];h.pattern=RegExp(h.pattern.source,w+"g")}for(var k=h.pattern||h,x=l.next,S=u;x!==t.tail&&!(d&&S>=d.reach);S+=x.value.length,x=x.next){var E=x.value;if(t.length>e.length)return;if(!(E instanceof a)){var _,C=1;if(y){if(!(_=o(k,S,e,b))||_.index>=e.length)break;var A=_.index,T=_.index+_[0].length,P=S;for(P+=x.value.length;A>=P;)P+=(x=x.next).value.length;if(S=P-=x.value.length,x.value instanceof a)continue;for(var j=x;j!==t.tail&&(P<T||"string"==typeof j.value);j=j.next)C++,P+=j.value.length;C--,E=e.slice(S,P),_.index-=S}else if(!(_=o(k,0,E,b)))continue;A=_.index;var L=_[0],N=E.slice(0,A),R=E.slice(A+L.length),O=S+E.length;d&&O>d.reach&&(d.reach=O);var D=x.prev;if(N&&(D=s(t,D,N),S+=N.length),c(t,D,C),x=s(t,D,new a(p,g?r.tokenize(L,g):L,v,L)),R&&s(t,x,R),C>1){var I={cause:p+","+m,reach:O};i(e,t,n,x.prev,S,I),d&&I.reach>d.reach&&(d.reach=I.reach)}}}}}}function l(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function s(e,t,n){var r=t.next,a={value:n,prev:t,next:r};return t.next=a,r.prev=a,e.length++,a}function c(e,t,n){for(var r=t.next,a=0;a<n&&r!==e.tail;a++)r=r.next;t.next=r,r.prev=t,e.length-=a}return a.stringify=function e(t,n){if("string"==typeof t)return t;if(Array.isArray(t)){var a="";return t.forEach((function(t){a+=e(t,n)})),a}var o={type:t.type,content:e(t.content,n),tag:"span",classes:["token",t.type],attributes:{},language:n},i=t.alias;i&&(Array.isArray(i)?Array.prototype.push.apply(o.classes,i):o.classes.push(i)),r.hooks.run("wrap",o);var l="";for(var s in o.attributes)l+=" "+s+'="'+(o.attributes[s]||"").replace(/"/g,""")+'"';return"<"+o.tag+' class="'+o.classes.join(" ")+'"'+l+">"+o.content+"</"+o.tag+">"},r}();t.exports=n,n.default=n}},function(){return a||(0,r[b(r)[0]])((a={exports:{}}).exports,a),a.exports}),A=((e,t,n)=>(n=null!=e?p(v(e)):{},((e,t,n,r)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let a of b(t))w.call(e,a)||a===n||f(e,a,{get:()=>t[a],enumerable:!(r=h(t,a))||r.enumerable});return e})(!t&&e&&e.__esModule?n:f(n,"default",{value:e,enumerable:!0}),e)))(C());A.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\s\S])*?-->/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},A.languages.markup.tag.inside["attr-value"].inside.entity=A.languages.markup.entity,A.languages.markup.doctype.inside["internal-subset"].inside=A.languages.markup,A.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(A.languages.markup.tag,"addInlined",{value:function(e,t){var n;(t=((n=((n={})["language-"+t]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:A.languages[t]},n.cdata=/^<!\[CDATA\[|\]\]>$/i,{"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:n}}))["language-"+t]={pattern:/[\s\S]+/,inside:A.languages[t]},{}))[e]={pattern:RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:n},A.languages.insertBefore("markup","cdata",t)}}),Object.defineProperty(A.languages.markup.tag,"addAttribute",{value:function(e,t){A.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:A.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),A.languages.html=A.languages.markup,A.languages.mathml=A.languages.markup,A.languages.svg=A.languages.markup,A.languages.xml=A.languages.extend("markup",{}),A.languages.ssml=A.languages.xml,A.languages.atom=A.languages.xml,A.languages.rss=A.languages.xml,o=A,i={pattern:/\\[\\(){}[\]^$+*?|.]/,alias:"escape"},s="(?:[^\\\\-]|"+(l=/\\(?:x[\da-fA-F]{2}|u[\da-fA-F]{4}|u\{[\da-fA-F]+\}|0[0-7]{0,2}|[123][0-7]{2}|c[a-zA-Z]|.)/).source+")",s=RegExp(s+"-"+s),c={pattern:/(<|')[^<>']+(?=[>']$)/,lookbehind:!0,alias:"variable"},o.languages.regex={"char-class":{pattern:/((?:^|[^\\])(?:\\\\)*)\[(?:[^\\\]]|\\[\s\S])*\]/,lookbehind:!0,inside:{"char-class-negation":{pattern:/(^\[)\^/,lookbehind:!0,alias:"operator"},"char-class-punctuation":{pattern:/^\[|\]$/,alias:"punctuation"},range:{pattern:s,inside:{escape:l,"range-punctuation":{pattern:/-/,alias:"operator"}}},"special-escape":i,"char-set":{pattern:/\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},escape:l}},"special-escape":i,"char-set":{pattern:/\.|\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},backreference:[{pattern:/\\(?![123][0-7]{2})[1-9]/,alias:"keyword"},{pattern:/\\k<[^<>']+>/,alias:"keyword",inside:{"group-name":c}}],anchor:{pattern:/[$^]|\\[ABbGZz]/,alias:"function"},escape:l,group:[{pattern:/\((?:\?(?:<[^<>']+>|'[^<>']+'|[>:]|<?[=!]|[idmnsuxU]+(?:-[idmnsuxU]+)?:?))?/,alias:"punctuation",inside:{"group-name":c}},{pattern:/\)/,alias:"punctuation"}],quantifier:{pattern:/(?:[+*?]|\{\d+(?:,\d*)?\})[?+]?/,alias:"number"},alternation:{pattern:/\|/,alias:"keyword"}},A.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},A.languages.javascript=A.languages.extend("clike",{"class-name":[A.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),A.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,A.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:A.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:A.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:A.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:A.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:A.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),A.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:A.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),A.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),A.languages.markup&&(A.languages.markup.tag.addInlined("script","javascript"),A.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),A.languages.js=A.languages.javascript,A.languages.actionscript=A.languages.extend("javascript",{keyword:/\b(?:as|break|case|catch|class|const|default|delete|do|dynamic|each|else|extends|final|finally|for|function|get|if|implements|import|in|include|instanceof|interface|internal|is|namespace|native|new|null|override|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|use|var|void|while|with)\b/,operator:/\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<<?|>>?>?|[!=]=?)=?|[~?@]/}),A.languages.actionscript["class-name"].alias="function",delete A.languages.actionscript.parameter,delete A.languages.actionscript["literal-property"],A.languages.markup&&A.languages.insertBefore("actionscript","string",{xml:{pattern:/(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\[\s\S]|(?!\2)[^\\])*\2)*\s*\/?>/,lookbehind:!0,inside:A.languages.markup}}),function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(A),function(e){var t=e.languages.javadoclike={parameter:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*@(?:arg|arguments|param)\s+)\w+/m,lookbehind:!0},keyword:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,lookbehind:!0},punctuation:/[{}]/};Object.defineProperty(t,"addSupport",{value:function(t,n){(t="string"==typeof t?[t]:t).forEach((function(t){var r=function(e){e.inside||(e.inside={}),e.inside.rest=n},a="doc-comment";if(o=e.languages[t]){var o,i=o[a];if((i=i||(o=e.languages.insertBefore(t,"comment",{"doc-comment":{pattern:/(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,lookbehind:!0,alias:"comment"}}))[a])instanceof RegExp&&(i=o[a]={pattern:i}),Array.isArray(i))for(var l=0,s=i.length;l<s;l++)i[l]instanceof RegExp&&(i[l]={pattern:i[l]}),r(i[l]);else r(i)}}))}}),t.addSupport(["java","javascript","php"],t)}(A),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;(t=(e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+t.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css,e.languages.markup))&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(A),function(e){var t=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,n=(t=(e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+t.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[t,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}}),{pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0}),{pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0});e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|RebeccaPurple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,number:n})}(A),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",a=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-]<PLAIN>)(?:[ \t]*(?:(?![#:])<PLAIN>|:<PLAIN>))*/.source.replace(/<PLAIN>/g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<<prop>>[ \t]+)?)(?:<<value>>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<<prop>>/g,(function(){return r})).replace(/<<value>>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<<prop>>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<<prop>>/g,(function(){return r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<<prop>>[ \t]+)?)<<key>>(?=\s*:\s)/.source.replace(/<<prop>>/g,(function(){return r})).replace(/<<key>>/g,(function(){return"(?:"+a+"|"+o+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(o),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(A),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(/<inner>/g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,a=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),o=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source,i=(e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+a+o+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+o+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+o+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)<inner>|_(?:(?!_)<inner>)+_)+__\b|\*\*(?:(?!\*)<inner>|\*(?:(?!\*)<inner>)+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)<inner>|__(?:(?!_)<inner>)+__)+_\b|\*(?:(?!\*)<inner>|\*\*(?:(?!\*)<inner>)+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~)<inner>)+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\])<inner>)+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\])<inner>)+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,r=t.length;n<r;n++){var a,o=t[n];"code"!==o.type?e(o.content):(a=o.content[1],o=o.content[3],a&&o&&"code-language"===a.type&&"code-block"===o.type&&"string"==typeof a.content&&(a=a.content.replace(/\b#/g,"sharp").replace(/\b\+\+/g,"pp"),a="language-"+(a=(/[a-z][\w-]*/i.exec(a)||[""])[0].toLowerCase()),o.alias?"string"==typeof o.alias?o.alias=[o.alias,a]:o.alias.push(a):o.alias=[a]))}}(e.tokens)})),e.hooks.add("wrap",(function(t){if("code-block"===t.type){for(var n="",r=0,a=t.classes.length;r<a;r++){var o=t.classes[r];if(o=/language-(.+)/.exec(o)){n=o[1];break}}var c,u=e.languages[n];u?t.content=e.highlight(t.content.replace(i,"").replace(/&(\w{1,8}|#x?[\da-f]{1,8});/gi,(function(e,t){var n;return"#"===(t=t.toLowerCase())[0]?(n="x"===t[1]?parseInt(t.slice(2),16):Number(t.slice(1)),s(n)):l[t]||e})),u,n):n&&"none"!==n&&e.plugins.autoloader&&(c="md-"+(new Date).valueOf()+"-"+Math.floor(1e16*Math.random()),t.attributes.id=c,e.plugins.autoloader.loadLanguages(n,(function(){var t=document.getElementById(c);t&&(t.innerHTML=e.highlight(t.textContent,e.languages[n],n))})))}})),RegExp(e.languages.markup.tag.pattern.source,"gi")),l={amp:"&",lt:"<",gt:">",quot:'"'},s=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(A),A.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:A.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},A.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n<t.length;){var r=t[n++];if("keyword"===r.type&&"mutation"===r.content){var a=[];if(d(["definition-mutation","punctuation"])&&"("===u(1).content){n+=2;var o=p(/^\($/,/^\)$/);if(-1===o)continue;for(;n<o;n++){var i=u(0);"variable"===i.type&&(f(i,"variable-input"),a.push(i.content))}n=o+1}if(d(["punctuation","property-query"])&&"{"===u(0).content&&(n++,f(u(0),"property-mutation"),0<a.length)){var l=p(/^\{$/,/^\}$/);if(-1!==l)for(var s=n;s<l;s++){var c=t[s];"variable"===c.type&&0<=a.indexOf(c.content)&&f(c,"variable-input")}}}}function u(e){return t[n+e]}function d(e,t){t=t||0;for(var n=0;n<e.length;n++){var r=u(n+t);if(!r||r.type!==e[n])return}return 1}function p(e,r){for(var a=1,o=n;o<t.length;o++){var i=t[o],l=i.content;if("punctuation"===i.type&&"string"==typeof l)if(e.test(l))a++;else if(r.test(l)&&0==--a)return o}return-1}function f(e,t){var n=e.alias;n?Array.isArray(n)||(e.alias=n=[n]):e.alias=n=[],n.push(t)}})),A.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,a=r.inside["interpolation-punctuation"],o=r.pattern.source;function i(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function l(t,n,r){return t={code:t,grammar:n,language:r},e.hooks.run("before-tokenize",t),t.tokens=e.tokenize(t.code,t.grammar),e.hooks.run("after-tokenize",t),t.tokens}function s(t,n,i){var s=e.tokenize(t,{interpolation:{pattern:RegExp(o),lookbehind:!0}}),c=0,u={},d=(s=l(s.map((function(e){if("string"==typeof e)return e;var n,r;for(e=e.content;-1!==t.indexOf((r=c++,n="___"+i.toUpperCase()+"_"+r+"___")););return u[n]=e,n})).join(""),n,i),Object.keys(u));return c=0,function t(n){for(var o=0;o<n.length;o++){if(c>=d.length)return;var i,s,p,f,m,h,g,b=n[o];"string"==typeof b||"string"==typeof b.content?(i=d[c],-1!==(g=(h="string"==typeof b?b:b.content).indexOf(i))&&(++c,s=h.substring(0,g),m=u[i],p=void 0,(f={})["interpolation-punctuation"]=a,3===(f=e.tokenize(m,f)).length&&((p=[1,1]).push.apply(p,l(f[1],e.languages.javascript,"javascript")),f.splice.apply(f,p)),p=new e.Token("interpolation",f,r.alias,m),f=h.substring(g+i.length),m=[],s&&m.push(s),m.push(p),f&&(t(h=[f]),m.push.apply(m,h)),"string"==typeof b?(n.splice.apply(n,[o,1].concat(m)),o+=m.length-1):b.content=m)):(g=b.content,Array.isArray(g)?t(g):t([g]))}}(s),new e.Token(i,s,"language-"+i,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var c={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function u(e){return"string"==typeof e?e:Array.isArray(e)?e.map(u).join(""):u(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in c&&function t(n){for(var r=0,a=n.length;r<a;r++){var o,i,l,c=n[r];"string"!=typeof c&&(o=c.content,Array.isArray(o)?"template-string"===c.type?(c=o[1],3===o.length&&"string"!=typeof c&&"embedded-code"===c.type&&(i=u(c),c=c.alias,c=Array.isArray(c)?c[0]:c,l=e.languages[c])&&(o[1]=s(i,l,c))):t(o):"string"!=typeof o&&t([o]))}}(t.tokens)}))}(A),function(e){e.languages.typescript=e.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(A),function(e){var t=e.languages.javascript,n=/\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})+\}/.source,r="(@(?:arg|argument|param|property)\\s+(?:"+n+"\\s+)?)";e.languages.jsdoc=e.languages.extend("javadoclike",{parameter:{pattern:RegExp(r+/(?:(?!\s)[$\w\xA0-\uFFFF.])+(?=\s|$)/.source),lookbehind:!0,inside:{punctuation:/\./}}}),e.languages.insertBefore("jsdoc","keyword",{"optional-parameter":{pattern:RegExp(r+/\[(?:(?!\s)[$\w\xA0-\uFFFF.])+(?:=[^[\]]+)?\](?=\s|$)/.source),lookbehind:!0,inside:{parameter:{pattern:/(^\[)[$\w\xA0-\uFFFF\.]+/,lookbehind:!0,inside:{punctuation:/\./}},code:{pattern:/(=)[\s\S]*(?=\]$)/,lookbehind:!0,inside:t,alias:"language-javascript"},punctuation:/[=[\]]/}},"class-name":[{pattern:RegExp(/(@(?:augments|class|extends|interface|memberof!?|template|this|typedef)\s+(?:<TYPE>\s+)?)[A-Z]\w*(?:\.[A-Z]\w*)*/.source.replace(/<TYPE>/g,(function(){return n}))),lookbehind:!0,inside:{punctuation:/\./}},{pattern:RegExp("(@[a-z]+\\s+)"+n),lookbehind:!0,inside:{string:t.string,number:t.number,boolean:t.boolean,keyword:e.languages.typescript.keyword,operator:/=>|\.\.\.|[&|?:*]/,punctuation:/[.,;=<>{}()[\]]/}}],example:{pattern:/(@example\s+(?!\s))(?:[^@\s]|\s+(?!\s))+?(?=\s*(?:\*\s*)?(?:@\w|\*\/))/,lookbehind:!0,inside:{code:{pattern:/^([\t ]*(?:\*\s*)?)\S.*$/m,lookbehind:!0,inside:t,alias:"language-javascript"}}}}),e.languages.javadoclike.addSupport("javascript",e.languages.jsdoc)}(A),function(e){e.languages.flow=e.languages.extend("javascript",{}),e.languages.insertBefore("flow","keyword",{type:[{pattern:/\b(?:[Bb]oolean|Function|[Nn]umber|[Ss]tring|[Ss]ymbol|any|mixed|null|void)\b/,alias:"class-name"}]}),e.languages.flow["function-variable"].pattern=/(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=\s*(?:function\b|(?:\([^()]*\)(?:\s*:\s*\w+)?|(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/i,delete e.languages.flow.parameter,e.languages.insertBefore("flow","operator",{"flow-punctuation":{pattern:/\{\||\|\}/,alias:"punctuation"}}),Array.isArray(e.languages.flow.keyword)||(e.languages.flow.keyword=[e.languages.flow.keyword]),e.languages.flow.keyword.unshift({pattern:/(^|[^$]\b)(?:Class|declare|opaque|type)\b(?!\$)/,lookbehind:!0},{pattern:/(^|[^$]\B)\$(?:Diff|Enum|Exact|Keys|ObjMap|PropertyType|Record|Shape|Subtype|Supertype|await)\b(?!\$)/,lookbehind:!0})}(A),A.languages.n4js=A.languages.extend("javascript",{keyword:/\b(?:Array|any|boolean|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|module|new|null|number|package|private|protected|public|return|set|static|string|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/}),A.languages.insertBefore("n4js","constant",{annotation:{pattern:/@+\w+/,alias:"operator"}}),A.languages.n4jsd=A.languages.n4js,function(e){function t(e,t){return RegExp(e.replace(/<ID>/g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:<ID>(?:\s*,\s*(?:\*\s*as\s+<ID>|\{[^{}]*\}))?|\*\s*as\s+<ID>|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+<ID>)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?<ID>/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],r=0;r<n.length;r++){var a=n[r],o=e.languages.javascript[a];a=(o="RegExp"===e.util.type(o)?e.languages.javascript[a]={pattern:o}:o).inside||{};(o.inside=a)["maybe-class-name"]=/^[A-Z][\s\S]*/}}(A),function(e){var t=e.util.clone(e.languages.javascript),n=/(?:\s|\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))\*\/)/.source,r=/(?:\{(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])*\})/.source,a=/(?:\{<S>*\.{3}(?:[^{}]|<BRACES>)*\})/.source;function o(e,t){return e=e.replace(/<S>/g,(function(){return n})).replace(/<BRACES>/g,(function(){return r})).replace(/<SPREAD>/g,(function(){return a})),RegExp(e,t)}function i(t){for(var n=[],r=0;r<t.length;r++){var a=t[r],o=!1;"string"!=typeof a&&("tag"===a.type&&a.content[0]&&"tag"===a.content[0].type?"</"===a.content[0].content[0].content?0<n.length&&n[n.length-1].tagName===l(a.content[0].content[1])&&n.pop():"/>"!==a.content[a.content.length-1].content&&n.push({tagName:l(a.content[0].content[1]),openedBraces:0}):0<n.length&&"punctuation"===a.type&&"{"===a.content?n[n.length-1].openedBraces++:0<n.length&&0<n[n.length-1].openedBraces&&"punctuation"===a.type&&"}"===a.content?n[n.length-1].openedBraces--:o=!0),(o||"string"==typeof a)&&0<n.length&&0===n[n.length-1].openedBraces&&(o=l(a),r<t.length-1&&("string"==typeof t[r+1]||"plain-text"===t[r+1].type)&&(o+=l(t[r+1]),t.splice(r+1,1)),0<r&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(o=l(t[r-1])+o,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",o,null,o)),a.content&&"string"!=typeof a.content&&i(a.content)}}a=o(a).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=o(/<\/?(?:[\w.:-]+(?:<S>+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|<BRACES>))?|<SPREAD>))*<S>*\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:o(/<SPREAD>/.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:o(/=<BRACES>/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var l=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(l).join(""):""};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||i(e.tokens)}))}(A),function(e){var t=e.util.clone(e.languages.typescript);(t=(e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"],e.languages.tsx.tag)).pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+t.pattern.source+")",t.pattern.flags),t.lookbehind=!0}(A),A.languages.swift={comment:{pattern:/(^|[^\\:])(?:\/\/.*|\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\/)/,lookbehind:!0,greedy:!0},"string-literal":[{pattern:RegExp(/(^|[^"#])/.source+"(?:"+/"(?:\\(?:\((?:[^()]|\([^()]*\))*\)|\r\n|[^(])|[^\\\r\n"])*"/.source+"|"+/"""(?:\\(?:\((?:[^()]|\([^()]*\))*\)|[^(])|[^\\"]|"(?!""))*"""/.source+")"+/(?!["#])/.source),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\\($/,alias:"punctuation"},punctuation:/\\(?=[\r\n])/,string:/[\s\S]+/}},{pattern:RegExp(/(^|[^"#])(#+)/.source+"(?:"+/"(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|\r\n|[^#])|[^\\\r\n])*?"/.source+"|"+/"""(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|[^#])|[^\\])*?"""/.source+")\\2"),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\#+\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\#+\($/,alias:"punctuation"},string:/[\s\S]+/}}],directive:{pattern:RegExp(/#/.source+"(?:"+/(?:elseif|if)\b/.source+"(?:[ \t]*"+/(?:![ \t]*)?(?:\b\w+\b(?:[ \t]*\((?:[^()]|\([^()]*\))*\))?|\((?:[^()]|\([^()]*\))*\))(?:[ \t]*(?:&&|\|\|))?/.source+")+|"+/(?:else|endif)\b/.source+")"),alias:"property",inside:{"directive-name":/^#\w+/,boolean:/\b(?:false|true)\b/,number:/\b\d+(?:\.\d+)*\b/,operator:/!|&&|\|\||[<>]=?/,punctuation:/[(),]/}},literal:{pattern:/#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,alias:"constant"},"other-directive":{pattern:/#\w+\b/,alias:"property"},attribute:{pattern:/@\w+/,alias:"atrule"},"function-definition":{pattern:/(\bfunc\s+)\w+/,lookbehind:!0,alias:"function"},label:{pattern:/\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,lookbehind:!0,alias:"important"},keyword:/\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,boolean:/\b(?:false|true)\b/,nil:{pattern:/\bnil\b/,alias:"constant"},"short-argument":/\$\d+\b/,omit:{pattern:/\b_\b/,alias:"keyword"},number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,"class-name":/\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,operator:/[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,punctuation:/[{}[\]();,.:\\]/},A.languages.swift["string-literal"].forEach((function(e){e.inside.interpolation.inside=A.languages.swift})),function(e){e.languages.kotlin=e.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete e.languages.kotlin["class-name"];var t={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:e.languages.kotlin}};e.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:t},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:t},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete e.languages.kotlin.string,e.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),e.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),e.languages.kt=e.languages.kotlin,e.languages.kts=e.languages.kotlin}(A),A.languages.c=A.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),A.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),A.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},A.languages.c.string],char:A.languages.c.char,comment:A.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:A.languages.c}}}}),A.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete A.languages.c.boolean,A.languages.objectivec=A.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<<?=?|>>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete A.languages.objectivec["class-name"],A.languages.objc=A.languages.objectivec,A.languages.reason=A.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),A.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete A.languages.reason.function,function(e){for(var t=/\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|<self>)*\*\//.source,n=0;n<2;n++)t=t.replace(/<self>/g,(function(){return t}));t=t.replace(/<self>/g,(function(){return/[^\s\S]/.source})),e.languages.rust={comment:[{pattern:RegExp(/(^|[^\\])/.source+t),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|trait|type|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<<?=?|>>?=?|[@?]/},e.languages.rust["closure-params"].inside.rest=e.languages.rust,e.languages.rust.attribute.inside.string=e.languages.rust.string}(A),A.languages.go=A.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),A.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete A.languages.go["class-name"],function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!<keyword>)\w+(?:\s*\.\s*\w+)*\b/.source.replace(/<keyword>/g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!<keyword>)\w+/.source.replace(/<keyword>/g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/<mod-name>(?:\s*:\s*<mod-name>)?|:\s*<mod-name>/.source.replace(/<mod-name>/g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(A),A.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},A.languages.python["string-interpolation"].inside.interpolation.inside.rest=A.languages.python,A.languages.py=A.languages.python;((e,t)=>{for(var n in t)f(e,n,{get:t[n],enumerable:!0})})({},{dracula:()=>T,duotoneDark:()=>P,duotoneLight:()=>j,github:()=>L,jettwaveDark:()=>H,jettwaveLight:()=>G,nightOwl:()=>N,nightOwlLight:()=>R,oceanicNext:()=>I,okaidia:()=>M,oneDark:()=>V,oneLight:()=>W,palenight:()=>F,shadesOfPurple:()=>z,synthwave84:()=>B,ultramin:()=>$,vsDark:()=>U,vsLight:()=>q});var T={plain:{color:"#F8F8F2",backgroundColor:"#282A36"},styles:[{types:["prolog","constant","builtin"],style:{color:"rgb(189, 147, 249)"}},{types:["inserted","function"],style:{color:"rgb(80, 250, 123)"}},{types:["deleted"],style:{color:"rgb(255, 85, 85)"}},{types:["changed"],style:{color:"rgb(255, 184, 108)"}},{types:["punctuation","symbol"],style:{color:"rgb(248, 248, 242)"}},{types:["string","char","tag","selector"],style:{color:"rgb(255, 121, 198)"}},{types:["keyword","variable"],style:{color:"rgb(189, 147, 249)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(98, 114, 164)"}},{types:["attr-name"],style:{color:"rgb(241, 250, 140)"}}]},P={plain:{backgroundColor:"#2a2734",color:"#9a86fd"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#6c6783"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#e09142"}},{types:["property","function"],style:{color:"#9a86fd"}},{types:["tag-id","selector","atrule-id"],style:{color:"#eeebff"}},{types:["attr-name"],style:{color:"#c4b9fe"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","atrule","placeholder","variable"],style:{color:"#ffcc99"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#c4b9fe"}}]},j={plain:{backgroundColor:"#faf8f5",color:"#728fcb"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#b6ad9a"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#063289"}},{types:["property","function"],style:{color:"#b29762"}},{types:["tag-id","selector","atrule-id"],style:{color:"#2d2006"}},{types:["attr-name"],style:{color:"#896724"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","atrule"],style:{color:"#728fcb"}},{types:["placeholder","variable"],style:{color:"#93abdc"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#896724"}}]},L={plain:{color:"#393A34",backgroundColor:"#f6f8fa"},styles:[{types:["comment","prolog","doctype","cdata"],style:{color:"#999988",fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}},{types:["string","attr-value"],style:{color:"#e3116c"}},{types:["punctuation","operator"],style:{color:"#393A34"}},{types:["entity","url","symbol","number","boolean","variable","constant","property","regex","inserted"],style:{color:"#36acaa"}},{types:["atrule","keyword","attr-name","selector"],style:{color:"#00a4db"}},{types:["function","deleted","tag"],style:{color:"#d73a49"}},{types:["function-variable"],style:{color:"#6f42c1"}},{types:["tag","selector","keyword"],style:{color:"#00009f"}}]},N={plain:{color:"#d6deeb",backgroundColor:"#011627"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)",fontStyle:"italic"}},{types:["inserted","attr-name"],style:{color:"rgb(173, 219, 103)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(99, 119, 119)",fontStyle:"italic"}},{types:["string","url"],style:{color:"rgb(173, 219, 103)"}},{types:["variable"],style:{color:"rgb(214, 222, 235)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation"],style:{color:"rgb(199, 146, 234)"}},{types:["selector","doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["class-name"],style:{color:"rgb(255, 203, 139)"}},{types:["tag","operator","keyword"],style:{color:"rgb(127, 219, 202)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["property"],style:{color:"rgb(128, 203, 196)"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}}]},R={plain:{color:"#403f53",backgroundColor:"#FBFBFB"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)",fontStyle:"italic"}},{types:["inserted","attr-name"],style:{color:"rgb(72, 118, 214)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(152, 159, 177)",fontStyle:"italic"}},{types:["string","builtin","char","constant","url"],style:{color:"rgb(72, 118, 214)"}},{types:["variable"],style:{color:"rgb(201, 103, 101)"}},{types:["number"],style:{color:"rgb(170, 9, 130)"}},{types:["punctuation"],style:{color:"rgb(153, 76, 195)"}},{types:["function","selector","doctype"],style:{color:"rgb(153, 76, 195)",fontStyle:"italic"}},{types:["class-name"],style:{color:"rgb(17, 17, 17)"}},{types:["tag"],style:{color:"rgb(153, 76, 195)"}},{types:["operator","property","keyword","namespace"],style:{color:"rgb(12, 150, 155)"}},{types:["boolean"],style:{color:"rgb(188, 84, 84)"}}]},O="#c5a5c5",D="#8dc891",I={plain:{backgroundColor:"#282c34",color:"#ffffff"},styles:[{types:["attr-name"],style:{color:O}},{types:["attr-value"],style:{color:D}},{types:["comment","block-comment","prolog","doctype","cdata","shebang"],style:{color:"#999999"}},{types:["property","number","function-name","constant","symbol","deleted"],style:{color:"#5a9bcf"}},{types:["boolean"],style:{color:"#ff8b50"}},{types:["tag"],style:{color:"#fc929e"}},{types:["string"],style:{color:D}},{types:["punctuation"],style:{color:D}},{types:["selector","char","builtin","inserted"],style:{color:"#D8DEE9"}},{types:["function"],style:{color:"#79b6f2"}},{types:["operator","entity","url","variable"],style:{color:"#d7deea"}},{types:["keyword"],style:{color:O}},{types:["atrule","class-name"],style:{color:"#FAC863"}},{types:["important"],style:{fontWeight:"400"}},{types:["bold"],style:{fontWeight:"bold"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}}]},M={plain:{color:"#f8f8f2",backgroundColor:"#272822"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"#f92672",fontStyle:"italic"}},{types:["inserted"],style:{color:"rgb(173, 219, 103)",fontStyle:"italic"}},{types:["comment"],style:{color:"#8292a2",fontStyle:"italic"}},{types:["string","url"],style:{color:"#a6e22e"}},{types:["variable"],style:{color:"#f8f8f2"}},{types:["number"],style:{color:"#ae81ff"}},{types:["builtin","char","constant","function","class-name"],style:{color:"#e6db74"}},{types:["punctuation"],style:{color:"#f8f8f2"}},{types:["selector","doctype"],style:{color:"#a6e22e",fontStyle:"italic"}},{types:["tag","operator","keyword"],style:{color:"#66d9ef"}},{types:["boolean"],style:{color:"#ae81ff"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)",opacity:.7}},{types:["tag","property"],style:{color:"#f92672"}},{types:["attr-name"],style:{color:"#a6e22e !important"}},{types:["doctype"],style:{color:"#8292a2"}},{types:["rule"],style:{color:"#e6db74"}}]},F={plain:{color:"#bfc7d5",backgroundColor:"#292d3e"},styles:[{types:["comment"],style:{color:"rgb(105, 112, 152)",fontStyle:"italic"}},{types:["string","inserted"],style:{color:"rgb(195, 232, 141)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation","selector"],style:{color:"rgb(199, 146, 234)"}},{types:["variable"],style:{color:"rgb(191, 199, 213)"}},{types:["class-name","attr-name"],style:{color:"rgb(255, 203, 107)"}},{types:["tag","deleted"],style:{color:"rgb(255, 85, 114)"}},{types:["operator"],style:{color:"rgb(137, 221, 255)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["keyword"],style:{fontStyle:"italic"}},{types:["doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}},{types:["url"],style:{color:"rgb(221, 221, 221)"}}]},z={plain:{color:"#9EFEFF",backgroundColor:"#2D2A55"},styles:[{types:["changed"],style:{color:"rgb(255, 238, 128)"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)"}},{types:["inserted"],style:{color:"rgb(173, 219, 103)"}},{types:["comment"],style:{color:"rgb(179, 98, 255)",fontStyle:"italic"}},{types:["punctuation"],style:{color:"rgb(255, 255, 255)"}},{types:["constant"],style:{color:"rgb(255, 98, 140)"}},{types:["string","url"],style:{color:"rgb(165, 255, 144)"}},{types:["variable"],style:{color:"rgb(255, 238, 128)"}},{types:["number","boolean"],style:{color:"rgb(255, 98, 140)"}},{types:["attr-name"],style:{color:"rgb(255, 180, 84)"}},{types:["keyword","operator","property","namespace","tag","selector","doctype"],style:{color:"rgb(255, 157, 0)"}},{types:["builtin","char","constant","function","class-name"],style:{color:"rgb(250, 208, 0)"}}]},B={plain:{backgroundColor:"linear-gradient(to bottom, #2a2139 75%, #34294f)",backgroundImage:"#34294f",color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"},styles:[{types:["comment","block-comment","prolog","doctype","cdata"],style:{color:"#495495",fontStyle:"italic"}},{types:["punctuation"],style:{color:"#ccc"}},{types:["tag","attr-name","namespace","number","unit","hexcode","deleted"],style:{color:"#e2777a"}},{types:["property","selector"],style:{color:"#72f1b8",textShadow:"0 0 2px #100c0f, 0 0 10px #257c5575, 0 0 35px #21272475"}},{types:["function-name"],style:{color:"#6196cc"}},{types:["boolean","selector-id","function"],style:{color:"#fdfdfd",textShadow:"0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975"}},{types:["class-name","maybe-class-name","builtin"],style:{color:"#fff5f6",textShadow:"0 0 2px #000, 0 0 10px #fc1f2c75, 0 0 5px #fc1f2c75, 0 0 25px #fc1f2c75"}},{types:["constant","symbol"],style:{color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"}},{types:["important","atrule","keyword","selector-class"],style:{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575"}},{types:["string","char","attr-value","regex","variable"],style:{color:"#f87c32"}},{types:["parameter"],style:{fontStyle:"italic"}},{types:["entity","url"],style:{color:"#67cdcc"}},{types:["operator"],style:{color:"ffffffee"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["entity"],style:{cursor:"help"}},{types:["inserted"],style:{color:"green"}}]},$={plain:{color:"#282a2e",backgroundColor:"#ffffff"},styles:[{types:["comment"],style:{color:"rgb(197, 200, 198)"}},{types:["string","number","builtin","variable"],style:{color:"rgb(150, 152, 150)"}},{types:["class-name","function","tag","attr-name"],style:{color:"rgb(40, 42, 46)"}}]},U={plain:{color:"#9CDCFE",backgroundColor:"#1E1E1E"},styles:[{types:["prolog"],style:{color:"rgb(0, 0, 128)"}},{types:["comment"],style:{color:"rgb(106, 153, 85)"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"rgb(86, 156, 214)"}},{types:["number","inserted"],style:{color:"rgb(181, 206, 168)"}},{types:["constant"],style:{color:"rgb(100, 102, 149)"}},{types:["attr-name","variable"],style:{color:"rgb(156, 220, 254)"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"rgb(206, 145, 120)"}},{types:["selector"],style:{color:"rgb(215, 186, 125)"}},{types:["tag"],style:{color:"rgb(78, 201, 176)"}},{types:["tag"],languages:["markup"],style:{color:"rgb(86, 156, 214)"}},{types:["punctuation","operator"],style:{color:"rgb(212, 212, 212)"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"rgb(220, 220, 170)"}},{types:["class-name"],style:{color:"rgb(78, 201, 176)"}},{types:["char"],style:{color:"rgb(209, 105, 105)"}}]},q={plain:{color:"#000000",backgroundColor:"#ffffff"},styles:[{types:["comment"],style:{color:"rgb(0, 128, 0)"}},{types:["builtin"],style:{color:"rgb(0, 112, 193)"}},{types:["number","variable","inserted"],style:{color:"rgb(9, 134, 88)"}},{types:["operator"],style:{color:"rgb(0, 0, 0)"}},{types:["constant","char"],style:{color:"rgb(129, 31, 63)"}},{types:["tag"],style:{color:"rgb(128, 0, 0)"}},{types:["attr-name"],style:{color:"rgb(255, 0, 0)"}},{types:["deleted","string"],style:{color:"rgb(163, 21, 21)"}},{types:["changed","punctuation"],style:{color:"rgb(4, 81, 165)"}},{types:["function","keyword"],style:{color:"rgb(0, 0, 255)"}},{types:["class-name"],style:{color:"rgb(38, 127, 153)"}}]},H={plain:{color:"#f8fafc",backgroundColor:"#011627"},styles:[{types:["prolog"],style:{color:"#000080"}},{types:["comment"],style:{color:"#6A9955"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"#569CD6"}},{types:["number","inserted"],style:{color:"#B5CEA8"}},{types:["constant"],style:{color:"#f8fafc"}},{types:["attr-name","variable"],style:{color:"#9CDCFE"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"#cbd5e1"}},{types:["selector"],style:{color:"#D7BA7D"}},{types:["tag"],style:{color:"#0ea5e9"}},{types:["tag"],languages:["markup"],style:{color:"#0ea5e9"}},{types:["punctuation","operator"],style:{color:"#D4D4D4"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"#7dd3fc"}},{types:["class-name"],style:{color:"#0ea5e9"}},{types:["char"],style:{color:"#D16969"}}]},G={plain:{color:"#0f172a",backgroundColor:"#f1f5f9"},styles:[{types:["prolog"],style:{color:"#000080"}},{types:["comment"],style:{color:"#6A9955"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"#0c4a6e"}},{types:["number","inserted"],style:{color:"#B5CEA8"}},{types:["constant"],style:{color:"#0f172a"}},{types:["attr-name","variable"],style:{color:"#0c4a6e"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"#64748b"}},{types:["selector"],style:{color:"#D7BA7D"}},{types:["tag"],style:{color:"#0ea5e9"}},{types:["tag"],languages:["markup"],style:{color:"#0ea5e9"}},{types:["punctuation","operator"],style:{color:"#475569"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"#0e7490"}},{types:["class-name"],style:{color:"#0ea5e9"}},{types:["char"],style:{color:"#D16969"}}]},V={plain:{backgroundColor:"hsl(220, 13%, 18%)",color:"hsl(220, 14%, 71%)",textShadow:"0 1px rgba(0, 0, 0, 0.3)"},styles:[{types:["comment","prolog","cdata"],style:{color:"hsl(220, 10%, 40%)"}},{types:["doctype","punctuation","entity"],style:{color:"hsl(220, 14%, 71%)"}},{types:["attr-name","class-name","maybe-class-name","boolean","constant","number","atrule"],style:{color:"hsl(29, 54%, 61%)"}},{types:["keyword"],style:{color:"hsl(286, 60%, 67%)"}},{types:["property","tag","symbol","deleted","important"],style:{color:"hsl(355, 65%, 65%)"}},{types:["selector","string","char","builtin","inserted","regex","attr-value"],style:{color:"hsl(95, 38%, 62%)"}},{types:["variable","operator","function"],style:{color:"hsl(207, 82%, 66%)"}},{types:["url"],style:{color:"hsl(187, 47%, 55%)"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"hsl(220, 14%, 71%)"}}]},W={plain:{backgroundColor:"hsl(230, 1%, 98%)",color:"hsl(230, 8%, 24%)"},styles:[{types:["comment","prolog","cdata"],style:{color:"hsl(230, 4%, 64%)"}},{types:["doctype","punctuation","entity"],style:{color:"hsl(230, 8%, 24%)"}},{types:["attr-name","class-name","boolean","constant","number","atrule"],style:{color:"hsl(35, 99%, 36%)"}},{types:["keyword"],style:{color:"hsl(301, 63%, 40%)"}},{types:["property","tag","symbol","deleted","important"],style:{color:"hsl(5, 74%, 59%)"}},{types:["selector","string","char","builtin","inserted","regex","attr-value","punctuation"],style:{color:"hsl(119, 34%, 47%)"}},{types:["variable","operator","function"],style:{color:"hsl(221, 87%, 60%)"}},{types:["url"],style:{color:"hsl(198, 99%, 37%)"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"hsl(230, 8%, 24%)"}}]},Q=(e,t)=>{const{plain:n}=e,r=e.styles.reduce(((e,n)=>{const{languages:r,style:a}=n;return r&&!r.includes(t)||n.types.forEach((t=>{const n=S(S({},e[t]),a);e[t]=n})),e}),{});return r.root=n,r.plain=E(S({},n),{backgroundColor:void 0}),r},K=/\r\n|\r|\n/,Y=e=>{0===e.length?e.push({types:["plain"],content:"\n",empty:!0}):1===e.length&&""===e[0].content&&(e[0].content="\n",e[0].empty=!0)},Z=(e,t)=>{const n=e.length;return n>0&&e[n-1]===t?e:e.concat(t)},X=e=>{const t=[[]],n=[e],r=[0],a=[e.length];let o=0,i=0,l=[];const s=[l];for(;i>-1;){for(;(o=r[i]++)<a[i];){let e,c=t[i];const u=n[i][o];if("string"==typeof u?(c=i>0?c:["plain"],e=u):(c=Z(c,u.type),u.alias&&(c=Z(c,u.alias)),e=u.content),"string"!=typeof e){i++,t.push(c),n.push(e),r.push(0),a.push(e.length);continue}const d=e.split(K),p=d.length;l.push({types:c,content:d[0]});for(let t=1;t<p;t++)Y(l),s.push(l=[]),l.push({types:c,content:d[t]})}i--,t.pop(),n.pop(),r.pop(),a.pop()}return Y(l),s},J=({children:e,language:t,code:n,theme:r,prism:a})=>{const o=t.toLowerCase(),i=((e,t)=>{const[n,r]=(0,u.useState)(Q(t,e)),a=(0,u.useRef)(),o=(0,u.useRef)();return(0,u.useEffect)((()=>{t===a.current&&e===o.current||(a.current=t,o.current=e,r(Q(t,e)))}),[e,t]),n})(o,r),l=(e=>(0,u.useCallback)((t=>{var n=t,{className:r,style:a,line:o}=n,i=_(n,["className","style","line"]);const l=E(S({},i),{className:(0,d.A)("token-line",r)});return"object"==typeof e&&"plain"in e&&(l.style=e.plain),"object"==typeof a&&(l.style=S(S({},l.style||{}),a)),l}),[e]))(i),s=(e=>{const t=(0,u.useCallback)((({types:t,empty:n})=>{if(null!=e)return 1===t.length&&"plain"===t[0]?null!=n?{display:"inline-block"}:void 0:1===t.length&&null!=n?e[t[0]]:Object.assign(null!=n?{display:"inline-block"}:{},...t.map((t=>e[t])))}),[e]);return(0,u.useCallback)((e=>{var n=e,{token:r,className:a,style:o}=n,i=_(n,["token","className","style"]);const l=E(S({},i),{className:(0,d.A)("token",...r.types,a),children:r.content,style:t(r)});return null!=o&&(l.style=S(S({},l.style||{}),o)),l}),[t])})(i),c=(({prism:e,code:t,grammar:n,language:r})=>{const a=(0,u.useRef)(e);return(0,u.useMemo)((()=>{if(null==n)return X([t]);const e={code:t,grammar:n,language:r,tokens:[]};return a.current.hooks.run("before-tokenize",e),e.tokens=a.current.tokenize(t,n),a.current.hooks.run("after-tokenize",e),X(e.tokens)}),[t,n,r])})({prism:a,language:o,code:n,grammar:a.languages[o]});return e({tokens:c,className:`prism-code language-${o}`,style:null!=i?i.root:{},getLineProps:l,getTokenProps:s})},ee=e=>(0,u.createElement)(J,E(S({},e),{prism:e.prism||A,theme:e.theme||U,code:e.code,language:e.language}))},1561:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=!0,a="Invariant failed";function o(e,t){if(!e){if(r)throw new Error(a);var n="function"==typeof t?t():t,o=n?"".concat(a,": ").concat(n):a;throw new Error(o)}}},2654:e=>{"use strict";e.exports=JSON.parse('{"theme.AnnouncementBar.closeButtonAriaLabel":"\u5173\u95ed","theme.BackToTopButton.buttonAriaLabel":"\u56de\u5230\u9876\u90e8","theme.CodeBlock.copied":"\u590d\u5236\u6210\u529f","theme.CodeBlock.copy":"\u590d\u5236","theme.CodeBlock.copyButtonAriaLabel":"\u590d\u5236\u4ee3\u7801\u5230\u526a\u8d34\u677f","theme.CodeBlock.wordWrapToggle":"\u5207\u6362\u81ea\u52a8\u6362\u884c","theme.DocSidebarItem.collapseCategoryAriaLabel":"\u6298\u53e0\u4fa7\u8fb9\u680f\u5206\u7c7b \'{label}\'","theme.DocSidebarItem.expandCategoryAriaLabel":"\u5c55\u5f00\u4fa7\u8fb9\u680f\u5206\u7c7b \'{label}\'","theme.ErrorPageContent.title":"\u9875\u9762\u5df2\u5d29\u6e83\u3002","theme.ErrorPageContent.tryAgain":"\u91cd\u8bd5","theme.NavBar.navAriaLabel":"\u4e3b\u5bfc\u822a","theme.NotFound.p1":"\u6211\u4eec\u627e\u4e0d\u5230\u60a8\u8981\u627e\u7684\u9875\u9762\u3002","theme.NotFound.p2":"\u8bf7\u8054\u7cfb\u539f\u59cb\u94fe\u63a5\u6765\u6e90\u7f51\u7ad9\u7684\u6240\u6709\u8005\uff0c\u5e76\u544a\u77e5\u4ed6\u4eec\u94fe\u63a5\u5df2\u635f\u574f\u3002","theme.NotFound.title":"\u627e\u4e0d\u5230\u9875\u9762","theme.TOCCollapsible.toggleButtonLabel":"\u672c\u9875\u603b\u89c8","theme.admonition.caution":"\u8b66\u544a","theme.admonition.danger":"\u5371\u9669","theme.admonition.info":"\u4fe1\u606f","theme.admonition.note":"\u5907\u6ce8","theme.admonition.tip":"\u63d0\u793a","theme.admonition.warning":"\u6ce8\u610f","theme.blog.archive.description":"\u5386\u53f2\u535a\u6587","theme.blog.archive.title":"\u5386\u53f2\u535a\u6587","theme.blog.paginator.navAriaLabel":"\u535a\u6587\u5217\u8868\u5206\u9875\u5bfc\u822a","theme.blog.paginator.newerEntries":"\u8f83\u65b0\u7684\u535a\u6587","theme.blog.paginator.olderEntries":"\u8f83\u65e7\u7684\u535a\u6587","theme.blog.post.paginator.navAriaLabel":"\u535a\u6587\u5206\u9875\u5bfc\u822a","theme.blog.post.paginator.newerPost":"\u8f83\u65b0\u4e00\u7bc7","theme.blog.post.paginator.olderPost":"\u8f83\u65e7\u4e00\u7bc7","theme.blog.post.plurals":"{count} \u7bc7\u535a\u6587","theme.blog.post.readMore":"\u9605\u8bfb\u66f4\u591a","theme.blog.post.readMoreLabel":"\u9605\u8bfb {title} \u7684\u5168\u6587","theme.blog.post.readingTime.plurals":"\u9605\u8bfb\u9700 {readingTime} \u5206\u949f","theme.blog.sidebar.navAriaLabel":"\u6700\u8fd1\u535a\u6587\u5bfc\u822a","theme.blog.tagTitle":"{nPosts} \u542b\u6709\u6807\u7b7e\u300c{tagName}\u300d","theme.colorToggle.ariaLabel":"\u5207\u6362\u6d45\u8272/\u6697\u9ed1\u6a21\u5f0f\uff08\u5f53\u524d\u4e3a{mode}\uff09","theme.colorToggle.ariaLabel.mode.dark":"\u6697\u9ed1\u6a21\u5f0f","theme.colorToggle.ariaLabel.mode.light":"\u6d45\u8272\u6a21\u5f0f","theme.common.editThisPage":"\u7f16\u8f91\u6b64\u9875","theme.common.headingLinkTitle":"{heading}\u7684\u76f4\u63a5\u94fe\u63a5","theme.common.skipToMainContent":"\u8df3\u5230\u4e3b\u8981\u5185\u5bb9","theme.docs.DocCard.categoryDescription.plurals":"{count} \u4e2a\u9879\u76ee","theme.docs.breadcrumbs.home":"\u4e3b\u9875\u9762","theme.docs.breadcrumbs.navAriaLabel":"\u9875\u9762\u8def\u5f84","theme.docs.paginator.navAriaLabel":"\u6587\u4ef6\u9009\u9879\u5361","theme.docs.paginator.next":"\u4e0b\u4e00\u9875","theme.docs.paginator.previous":"\u4e0a\u4e00\u9875","theme.docs.sidebar.closeSidebarButtonAriaLabel":"\u5173\u95ed\u5bfc\u822a\u680f","theme.docs.sidebar.collapseButtonAriaLabel":"\u6536\u8d77\u4fa7\u8fb9\u680f","theme.docs.sidebar.collapseButtonTitle":"\u6536\u8d77\u4fa7\u8fb9\u680f","theme.docs.sidebar.expandButtonAriaLabel":"\u5c55\u5f00\u4fa7\u8fb9\u680f","theme.docs.sidebar.expandButtonTitle":"\u5c55\u5f00\u4fa7\u8fb9\u680f","theme.docs.sidebar.navAriaLabel":"\u6587\u6863\u4fa7\u8fb9\u680f","theme.docs.sidebar.toggleSidebarButtonAriaLabel":"\u5207\u6362\u5bfc\u822a\u680f","theme.docs.tagDocListPageTitle":"{nDocsTagged}\u300c{tagName}\u300d","theme.docs.tagDocListPageTitle.nDocsTagged":"{count} \u7bc7\u6587\u6863\u5e26\u6709\u6807\u7b7e","theme.docs.versionBadge.label":"\u7248\u672c\uff1a{versionLabel}","theme.docs.versions.latestVersionLinkLabel":"\u6700\u65b0\u7248\u672c","theme.docs.versions.latestVersionSuggestionLabel":"\u6700\u65b0\u7684\u6587\u6863\u8bf7\u53c2\u9605 {latestVersionLink} ({versionLabel})\u3002","theme.docs.versions.unmaintainedVersionLabel":"\u6b64\u4e3a {siteTitle} {versionLabel} \u7248\u7684\u6587\u6863\uff0c\u73b0\u5df2\u4e0d\u518d\u79ef\u6781\u7ef4\u62a4\u3002","theme.docs.versions.unreleasedVersionLabel":"\u6b64\u4e3a {siteTitle} {versionLabel} \u7248\u5c1a\u672a\u53d1\u884c\u7684\u6587\u6863\u3002","theme.lastUpdated.atDate":"\u4e8e {date} ","theme.lastUpdated.byUser":"\u7531 {user} ","theme.lastUpdated.lastUpdatedAtBy":"\u6700\u540e{byUser}{atDate}\u66f4\u65b0","theme.navbar.mobileLanguageDropdown.label":"\u9009\u62e9\u8bed\u8a00","theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel":"\u2190 \u56de\u5230\u4e3b\u83dc\u5355","theme.navbar.mobileVersionsDropdown.label":"\u9009\u62e9\u7248\u672c","theme.tags.tagsListLabel":"\u6807\u7b7e\uff1a","theme.tags.tagsPageLink":"\u67e5\u770b\u6240\u6709\u6807\u7b7e","theme.tags.tagsPageTitle":"\u6807\u7b7e","theme.unlistedContent.message":"\u6b64\u9875\u9762\u672a\u5217\u51fa\u3002\u641c\u7d22\u5f15\u64ce\u4e0d\u4f1a\u5bf9\u5176\u7d22\u5f15\uff0c\u53ea\u6709\u62e5\u6709\u76f4\u63a5\u94fe\u63a5\u7684\u7528\u6237\u624d\u80fd\u8bbf\u95ee\u3002","theme.unlistedContent.title":"\u672a\u5217\u51fa\u9875"}')},4054:e=>{"use strict";e.exports=JSON.parse('{"/blog-b7e":{"__comp":"a6aa9e1f","__context":{"plugin":"36994c47"},"sidebar":"814f3328","items":[{"content":"5845532a"},{"content":"56a9bc23"},{"content":"a5dfed40"},{"content":"2571fc76"},{"content":"ea50f5f5"},{"content":"2571fc76"},{"content":"c8b8756d"},{"content":"c823c29b"}],"__props":"c15d9823"},"/blog/archive-182":{"__comp":"9e4087bc","__context":{"plugin":"36994c47"},"__props":"f81c1134"},"/blog/Pika-3.5.0-eeb":{"__comp":"ccc49370","__context":{"data":{"blogMetadata":"acecf23e"},"plugin":"36994c47"},"sidebar":"814f3328","content":"f7836a87"},"/blog/Pika-3.5.0-104":{"__comp":"ccc49370","__context":{"data":{"blogMetadata":"acecf23e"},"plugin":"36994c47"},"sidebar":"814f3328","content":"2859d2fb"},"/blog/Pika-3.5.1-780":{"__comp":"ccc49370","__context":{"data":{"blogMetadata":"acecf23e"},"plugin":"36994c47"},"sidebar":"814f3328","content":"8cf6d7a7"},"/blog/Pika-3.5.3-f4a":{"__comp":"ccc49370","__context":{"data":{"blogMetadata":"acecf23e"},"plugin":"36994c47"},"sidebar":"814f3328","content":"2c217be1"},"/blog/Pika-3.5.4-7a0":{"__comp":"ccc49370","__context":{"data":{"blogMetadata":"acecf23e"},"plugin":"36994c47"},"sidebar":"814f3328","content":"6edb4994"},"/blog/pika-blackwidow-396":{"__comp":"ccc49370","__context":{"data":{"blogMetadata":"acecf23e"},"plugin":"36994c47"},"sidebar":"814f3328","content":"569b9636"},"/blog/Pika-Tools-Port-Bin-dc3":{"__comp":"ccc49370","__context":{"data":{"blogMetadata":"acecf23e"},"plugin":"36994c47"},"sidebar":"814f3328","content":"fdbae498"},"/blog/PikiwiDB-Pika--4.0.0-c12":{"__comp":"ccc49370","__context":{"data":{"blogMetadata":"acecf23e"},"plugin":"36994c47"},"sidebar":"814f3328","content":"878f190b"},"/docs-c12":{"__comp":"5e95c892","__context":{"plugin":"aba21aa0"}},"/docs-fcc":{"__comp":"a7bd4aaa","__props":"0058b4c6"},"/docs-6ad":{"__comp":"a94703ab"},"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/-5f5":{"__comp":"17896441","content":"ffc6e5ef"},"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/page info \u4fe1\u606f\u8bf4\u660e/-eef":{"__comp":"17896441","content":"29ba892c"},"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/Pika \u6700\u4f73\u5b9e\u8df5/-5e2":{"__comp":"17896441","content":"03ab4acf"},"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5206\u5e03\u5f0f\u6a21\u5f0f\u7b80\u5355\u6559\u7a0b/-3df":{"__comp":"17896441","content":"14c2ce36"},"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5206\u7247\u6559\u7a0b/-c6b":{"__comp":"17896441","content":"a7776ad8"},"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u526f\u672c\u4e00\u81f4\u6027\uff08\u4f7f\u7528\u6587\u6863\uff09/-e86":{"__comp":"17896441","content":"06983a96"},"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u526f\u672c\u4e00\u81f4\u6027\uff08\u8bbe\u8ba1\u6587\u6863\uff09/-b1e":{"__comp":"17896441","content":"7777193d"},"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u591a\u5e93\u7248\u547d\u4ee4/-3c5":{"__comp":"17896441","content":"82bececd"},"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5b89\u88c5\u4f7f\u7528/-3a0":{"__comp":"17896441","content":"d126de26"},"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u5dee\u5f02\u5316\u547d\u4ee4/-fcf":{"__comp":"17896441","content":"ae7197e3"},"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u6570\u636e\u76ee\u5f55/-d15":{"__comp":"17896441","content":"1b3a196b"},"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u670d\u52a1\u5668\u72b6\u6001\u76d1\u63a7/-a79":{"__comp":"17896441","content":"fdc83c8b"},"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u7ba1\u7406\u6307\u4ee4/-0bc":{"__comp":"17896441","content":"e13eafd3"},"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u81ea\u52a8\u5bb9\u707e/-1d2":{"__comp":"17896441","content":"063090b1"},"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u8ba2\u9605/-18e":{"__comp":"17896441","content":"49fb2c28"},"/docs/\u4f7f\u7528\u4e0e\u8fd0\u7ef4/\u914d\u7f6e\u6587\u4ef6\u8bf4\u660e/-17b":{"__comp":"17896441","content":"c6bc127f"},"/docs/\u5e8f\u8a00/-db5":{"__comp":"17896441","content":"9805f35a"},"/docs/\u5e8f\u8a00/FAQ/-b59":{"__comp":"17896441","content":"94717405"},"/docs/\u5e8f\u8a00/\u652f\u6301\u7684 Redis \u63a5\u53e3\u4e0e\u517c\u5bb9\u60c5\u51b5/-10f":{"__comp":"17896441","content":"07f9788a"},"/docs/\u5e8f\u8a00/\u7b80\u4ecb/-70a":{"__comp":"17896441","content":"38236c5e"},"/docs/\u5f00\u53d1\u6587\u6863/-7cf":{"__comp":"17896441","content":"fac0ae3c"},"/docs/\u5f00\u53d1\u6587\u6863/coding-style/-329":{"__comp":"17896441","content":"affdd1e0"},"/docs/\u5f00\u53d1\u6587\u6863/\u7f16\u7801\u89c4\u8303/-f7c":{"__comp":"17896441","content":"e60cd9a4"},"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/-fd2":{"__comp":"17896441","content":"a74ce679"},"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/3.2.x \u6027\u80fd/-b31":{"__comp":"17896441","content":"adc1ab20"},"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika 3.5 \u53c2\u6570\u4f18\u5316\u624b\u518c/-e0f":{"__comp":"17896441","content":"30dc2be3"},"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/-088":{"__comp":"17896441","content":"bb6459ea"},"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/\u559c\u9a6c\u62c9\u96c5 Redis \u4e0e Pika \u7f13\u5b58\u4f7f\u7528\u519b\u89c4/-51b":{"__comp":"17896441","content":"1174a4a6"},"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u4f18\u5316\u6848\u4f8b/\u8c03\u6574 max-write-buffer-size \u4f18\u5316 pika \u6027\u80fd10\u500d\u7684\u6848\u4f8b/-d3e":{"__comp":"17896441","content":"7074118c"},"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Pika \u5185\u5b58\u4f7f\u7528/-c7d":{"__comp":"17896441","content":"bbb97d2b"},"/docs/\u6027\u80fd\u4e0e\u4f18\u5316/Redis \u4e0e Pika scan \u6027\u80fd\u5bf9\u6bd4/-601":{"__comp":"17896441","content":"eb808821"},"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/-9ca":{"__comp":"17896441","content":"9994e0b3"},"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/NoSQL \u539f\u7406\u6982\u8ff0/-472":{"__comp":"17896441","content":"c3d344d9"},"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4e0e Codis/-f53":{"__comp":"17896441","content":"107669ab"},"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/-2f6":{"__comp":"17896441","content":"9b4df08c"},"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u4e3b\u4ece\u540c\u6b65/-911":{"__comp":"17896441","content":"2fcac357"},"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u7ebf\u7a0b\u6a21\u578b/-6ce":{"__comp":"17896441","content":"a3821efb"},"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u4f20\u706b\u8ba1\u5212/\u8bfb\u5199\u6d41\u7a0b/-5dc":{"__comp":"17896441","content":"a950bb08"},"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/-48f":{"__comp":"17896441","content":"8d7aab24"},"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/Pika \u548c RockSDB \u7684\u5bf9\u63a5/-9cf":{"__comp":"17896441","content":"4061d127"},"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/Pika \u7684\u547d\u4ee4\u6267\u884c\u6846\u67b6/-26a":{"__comp":"17896441","content":"87292243"},"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/PubSub \u673a\u5236/-e15":{"__comp":"17896441","content":"a605574d"},"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/Pika \u6e90\u7801\u5b66\u4e60\u7b14\u8bb0/\u901a\u4fe1\u548c\u7ebf\u7a0b\u6a21\u578b/-a01":{"__comp":"17896441","content":"70e8c784"},"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u4e3b\u4ece\u540c\u6b65/-4d3":{"__comp":"17896441","content":"65ee69ef"},"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u5168\u540c\u6b65/-248":{"__comp":"17896441","content":"43fd4db6"},"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u526f\u672c\u4e00\u81f4\u6027/-97a":{"__comp":"17896441","content":"6533aa10"},"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u589e\u91cf\u540c\u6b65/-ea1":{"__comp":"17896441","content":"15d8eb8d"},"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u5feb\u7167\u5f0f\u5907\u4efd/-1e5":{"__comp":"17896441","content":"937cdc77"},"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u6574\u4f53\u6280\u672f\u67b6\u6784/-ccd":{"__comp":"17896441","content":"1845589b"},"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65b0\u5b58\u50a8\u65b9\u6848\uff1a\u8be6\u7ec6\u89e3\u6790/-948":{"__comp":"17896441","content":"d049632c"},"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65b0\u5b58\u50a8\u7ed3\u6784/-571":{"__comp":"17896441","content":"8ad00878"},"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u65e7\u5b58\u50a8\u7ed3\u6784/-f6e":{"__comp":"17896441","content":"ab946cbc"},"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u7ebf\u7a0b\u6a21\u578b/-334":{"__comp":"17896441","content":"e85952ae"},"/docs/\u8bbe\u8ba1\u4e0e\u5b9e\u73b0/\u9501\u7684\u5e94\u7528/-581":{"__comp":"17896441","content":"b50c085f"},"/-2e1":{"__comp":"c4f5d8e4","__context":{"plugin":"a7456010"},"config":"5e9f5e1a"}}')}},e=>{e.O(0,[1869],(()=>{return t=8536,e(e.s=t);var t}));e.O()}]); \ No newline at end of file diff --git a/build/assets/js/main.6530b181.js.LICENSE.txt b/build/assets/js/main.6530b181.js.LICENSE.txt new file mode 100644 index 0000000..91dc894 --- /dev/null +++ b/build/assets/js/main.6530b181.js.LICENSE.txt @@ -0,0 +1,64 @@ +/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress + * @license MIT */ + +/*! Bundled license information: + +prismjs/prism.js: + (** + * Prism: Lightweight, robust, elegant syntax highlighting + * + * @license MIT <https://opensource.org/licenses/MIT> + * @author Lea Verou <https://lea.verou.me> + * @namespace + * @public + *) +*/ + +/** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** + * @license React + * react-jsx-runtime.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** + * @license React + * scheduler.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** @license React v16.13.1 + * react-is.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ diff --git a/build/assets/js/runtime~main.8cd2d291.js b/build/assets/js/runtime~main.8cd2d291.js new file mode 100644 index 0000000..29aca4a --- /dev/null +++ b/build/assets/js/runtime~main.8cd2d291.js @@ -0,0 +1 @@ +(()=>{"use strict";var e,a,c,d,f,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var c=t[e]={id:e,loaded:!1,exports:{}};return b[e].call(c.exports,c,c.exports,r),c.loaded=!0,c.exports}r.m=b,r.c=t,e=[],r.O=(a,c,d,f)=>{if(!c){var b=1/0;for(i=0;i<e.length;i++){c=e[i][0],d=e[i][1],f=e[i][2];for(var t=!0,o=0;o<c.length;o++)(!1&f||b>=f)&&Object.keys(r.O).every((e=>r.O[e](c[o])))?c.splice(o--,1):(t=!1,f<b&&(b=f));if(t){e.splice(i--,1);var n=d();void 0!==n&&(a=n)}}return a}f=f||0;for(var i=e.length;i>0&&e[i-1][2]>f;i--)e[i]=e[i-1];e[i]=[c,d,f]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},c=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,d){if(1&d&&(e=this(e)),8&d)return e;if("object"==typeof e&&e){if(4&d&&e.__esModule)return e;if(16&d&&"function"==typeof e.then)return e}var f=Object.create(null);r.r(f);var b={};a=a||[null,c({}),c([]),c(c)];for(var t=2&d&&e;"object"==typeof t&&!~a.indexOf(t);t=c(t))Object.getOwnPropertyNames(t).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,r.d(f,b),f},r.d=(e,a)=>{for(var c in a)r.o(a,c)&&!r.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:a[c]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,c)=>(r.f[c](e,a),a)),[])),r.u=e=>"assets/js/"+({24:"ffc6e5ef",72:"6edb4994",154:"878f190b",321:"c823c29b",539:"adc1ab20",736:"15d8eb8d",849:"0058b4c6",902:"d049632c",935:"e60cd9a4",1169:"bb6459ea",1173:"fac0ae3c",1235:"a7456010",1398:"43fd4db6",1571:"1845589b",1661:"eb808821",1742:"fdbae498",1903:"03ab4acf",1970:"5845532a",2001:"107669ab",2439:"d126de26",2516:"fdc83c8b",2526:"ea50f5f5",2634:"c4f5d8e4",2711:"9e4087bc",2767:"29ba892c",2885:"2fcac357",2891:"06983a96",2941:"2859d2fb",2978:"a950bb08",2995:"a3821efb",3053:"f7836a87",3215:"9b4df08c",3249:"ccc49370",3365:"ae7197e3",3717:"30dc2be3",3780:"38236c5e",3805:"569b9636",3934:"1174a4a6",4196:"a5dfed40",4284:"acecf23e",4292:"4061d127",4434:"b50c085f",4487:"a605574d",4538:"9805f35a",4624:"063090b1",4674:"7074118c",4700:"2c217be1",5091:"814f3328",5491:"6533aa10",5496:"8d7aab24",5533:"ab946cbc",5742:"aba21aa0",5970:"c8b8756d",6230:"a7776ad8",6284:"7777193d",6824:"94717405",6871:"8cf6d7a7",7043:"c3d344d9",7084:"9994e0b3",7098:"a7bd4aaa",7191:"70e8c784",7257:"a74ce679",7381:"bbb97d2b",7472:"14c2ce36",7643:"a6aa9e1f",7765:"49fb2c28",7938:"affdd1e0",7963:"e13eafd3",8130:"f81c1134",8140:"1b3a196b",8146:"c15d9823",8183:"c6bc127f",8184:"65ee69ef",8401:"17896441",9044:"937cdc77",9048:"a94703ab",9145:"e85952ae",9315:"07f9788a",9419:"8ad00878",9460:"56a9bc23",9595:"82bececd",9647:"5e95c892",9800:"87292243",9858:"36994c47",9974:"2571fc76"}[e]||e)+"."+{24:"e44305e4",72:"49230d1c",154:"3d1a7843",321:"818d0605",539:"088767d8",736:"f7365b8e",849:"1e250fdb",902:"b3b21402",935:"0742af8f",1169:"8bfab866",1173:"a652baa1",1235:"2a0622b5",1398:"091730e4",1571:"788a4462",1661:"b43bbd7d",1742:"94d380c6",1903:"473ee52d",1970:"247425f5",2001:"f44b5cb6",2237:"be965d46",2439:"6561c01d",2516:"e95e7c72",2526:"25d05aae",2634:"af8bc74d",2711:"59edf690",2767:"45b425a1",2885:"f2526d07",2891:"64bb3f34",2941:"b7b079cf",2978:"7dd7756a",2995:"66699296",3053:"0e0f687b",3215:"2ee68b93",3249:"9149b5a4",3365:"0752e912",3717:"63f16889",3780:"89df4baf",3805:"d0a44d1b",3834:"d9ccb168",3934:"952832c1",4196:"a6c5c98b",4284:"0e0d3ee9",4292:"59241894",4434:"4327eff2",4487:"4eb228bb",4538:"e06ac37e",4624:"288e2721",4674:"fde43517",4700:"4a8642f5",5091:"29c9ae20",5491:"2ec72a61",5496:"d707aca5",5533:"1916eb51",5742:"1ad3e19a",5970:"9cc0a977",6230:"cf330829",6284:"ef00cbf7",6824:"3af1cfa9",6871:"10b5258b",7043:"92c897fc",7084:"349859dc",7098:"b940ea01",7191:"75d52a62",7257:"5c25c20b",7381:"7b5cadc5",7472:"f7eddbf1",7643:"66477f6d",7765:"1c1b9522",7938:"cf591274",7963:"b5e529e3",8130:"f506d7d6",8140:"557d332c",8146:"1bfda436",8183:"1e31d41b",8184:"ff80038c",8401:"be2148b0",8554:"5845e862",9044:"685ed5fa",9048:"d79ecc22",9145:"8483bccd",9315:"452e6f40",9419:"27a2486f",9460:"2d1645ba",9595:"1c5cd812",9647:"4ef812a6",9800:"de647f30",9858:"411c604c",9974:"ca7462da"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),d={},f="PikiwiDB(Pika) \u5f00\u6e90\u6570\u636e\u5e93:",r.l=(e,a,c,b)=>{if(d[e])d[e].push(a);else{var t,o;if(void 0!==c)for(var n=document.getElementsByTagName("script"),i=0;i<n.length;i++){var u=n[i];if(u.getAttribute("src")==e||u.getAttribute("data-webpack")==f+c){t=u;break}}t||(o=!0,(t=document.createElement("script")).charset="utf-8",t.timeout=120,r.nc&&t.setAttribute("nonce",r.nc),t.setAttribute("data-webpack",f+c),t.src=e),d[e]=[a];var l=(a,c)=>{t.onerror=t.onload=null,clearTimeout(s);var f=d[e];if(delete d[e],t.parentNode&&t.parentNode.removeChild(t),f&&f.forEach((e=>e(c))),a)return a(c)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/",r.gca=function(e){return e={17896441:"8401",87292243:"9800",94717405:"6824",ffc6e5ef:"24","6edb4994":"72","878f190b":"154",c823c29b:"321",adc1ab20:"539","15d8eb8d":"736","0058b4c6":"849",d049632c:"902",e60cd9a4:"935",bb6459ea:"1169",fac0ae3c:"1173",a7456010:"1235","43fd4db6":"1398","1845589b":"1571",eb808821:"1661",fdbae498:"1742","03ab4acf":"1903","5845532a":"1970","107669ab":"2001",d126de26:"2439",fdc83c8b:"2516",ea50f5f5:"2526",c4f5d8e4:"2634","9e4087bc":"2711","29ba892c":"2767","2fcac357":"2885","06983a96":"2891","2859d2fb":"2941",a950bb08:"2978",a3821efb:"2995",f7836a87:"3053","9b4df08c":"3215",ccc49370:"3249",ae7197e3:"3365","30dc2be3":"3717","38236c5e":"3780","569b9636":"3805","1174a4a6":"3934",a5dfed40:"4196",acecf23e:"4284","4061d127":"4292",b50c085f:"4434",a605574d:"4487","9805f35a":"4538","063090b1":"4624","7074118c":"4674","2c217be1":"4700","814f3328":"5091","6533aa10":"5491","8d7aab24":"5496",ab946cbc:"5533",aba21aa0:"5742",c8b8756d:"5970",a7776ad8:"6230","7777193d":"6284","8cf6d7a7":"6871",c3d344d9:"7043","9994e0b3":"7084",a7bd4aaa:"7098","70e8c784":"7191",a74ce679:"7257",bbb97d2b:"7381","14c2ce36":"7472",a6aa9e1f:"7643","49fb2c28":"7765",affdd1e0:"7938",e13eafd3:"7963",f81c1134:"8130","1b3a196b":"8140",c15d9823:"8146",c6bc127f:"8183","65ee69ef":"8184","937cdc77":"9044",a94703ab:"9048",e85952ae:"9145","07f9788a":"9315","8ad00878":"9419","56a9bc23":"9460","82bececd":"9595","5e95c892":"9647","36994c47":"9858","2571fc76":"9974"}[e]||e,r.p+r.u(e)},(()=>{var e={5354:0,1869:0};r.f.j=(a,c)=>{var d=r.o(e,a)?e[a]:void 0;if(0!==d)if(d)c.push(d[2]);else if(/^(1869|5354)$/.test(a))e[a]=0;else{var f=new Promise(((c,f)=>d=e[a]=[c,f]));c.push(d[2]=f);var b=r.p+r.u(a),t=new Error;r.l(b,(c=>{if(r.o(e,a)&&(0!==(d=e[a])&&(e[a]=void 0),d)){var f=c&&("load"===c.type?"missing":c.type),b=c&&c.target&&c.target.src;t.message="Loading chunk "+a+" failed.\n("+f+": "+b+")",t.name="ChunkLoadError",t.type=f,t.request=b,d[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,c)=>{var d,f,b=c[0],t=c[1],o=c[2],n=0;if(b.some((a=>0!==e[a]))){for(d in t)r.o(t,d)&&(r.m[d]=t[d]);if(o)var i=o(r)}for(a&&a(c);n<b.length;n++)f=b[n],r.o(e,f)&&e[f]&&e[f][0](),e[f]=0;return r.O(i)},c=self.webpackChunkPikiwiDB_Pika_=self.webpackChunkPikiwiDB_Pika_||[];c.forEach(a.bind(null,0)),c.push=a.bind(null,c.push.bind(c))})()})(); \ No newline at end of file diff --git a/build/blog/Pika-3.5.0/index.html b/build/blog/Pika-3.5.0/index.html new file mode 100644 index 0000000..b23abce --- /dev/null +++ b/build/blog/Pika-3.5.0/index.html @@ -0,0 +1,47 @@ +<!doctype html> +<html lang="zh-Hans" dir="ltr" class="blog-wrapper blog-post-page plugin-blog plugin-id-default" data-has-hydrated="false"> +<head> +<meta charset="UTF-8"> +<meta name="generator" content="Docusaurus v3.4.0"> +<title data-rh="true">What's new in Pika v3.5.0 | PikiwiDB(Pika) + + + + + + + + + +

What's new in Pika v3.5.0

· 阅读需 3 分钟
于雨
dubbo-go开源社区

Pika 社区近期发布了备受期待的 v3.5.2 版本 https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.2-alpha ,不仅解决了历史遗留的 Bug 问题,还引入了多项新特性。这些新特性主要包括 Pika 支持 Redis 事务、Pika 上层增加缓存层实现冷热数据分离、提升读性能、Codis-Proxy 支持动态修改配置参数等等,无疑将会让用户感受到更为高效和稳定的使用体验。

+

新特性

+ +

bugfix

+ +

下期版本规划

+

预计再过两个月左右,我们会在农历新年前发布 3.5.3 版本,相关关键特性有:

+ +

感谢大家对 Pika 开源公众号的关注 ,Pika 3.5 版本重大特性及使用规范我们会在稍后的文章中进行介绍,我们下期再见~

+

2023-09-28-Pika-3.5.2-connect

+ + \ No newline at end of file diff --git a/build/blog/Pika-3.5.1/index.html b/build/blog/Pika-3.5.1/index.html new file mode 100644 index 0000000..18ff75f --- /dev/null +++ b/build/blog/Pika-3.5.1/index.html @@ -0,0 +1,47 @@ + + + + + +What's new in Pika v3.5.1 | PikiwiDB(Pika) + + + + + + + + + +

What's new in Pika v3.5.1

· 阅读需 5 分钟
于雨
dubbo-go开源社区

Pika 社区很高兴宣布,我们今天发布已经过我们生产环境验证 v3.5.1 版本 https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.1

+

该版本不仅做了很多优化工作,还引入了多项新功能。这些新功能包括 动态关闭 WAL、ReplicationID 检测是否增量复制、在 K8s 环境上 Pika 服务的自动注册从而实现集群的自组织、以及 exporter 检测集群指标等等,无疑将会让用户享受到更为稳定和高效的 NoSQL 使用体验。

+

新特性

+
    +
  • 1 Slow log 增加队列等待时间统计,在队列阻塞的时候方便我们进行问题定位。PR 1997, 作者 wangshao1。
  • +
  • 2 主从复制使用 ReplicationID 判断是否进行增量同步,解决原主从同步方式切主后整个数据集会进行全量复制的问题,可以提升 Pika 性能。PR 1951, 作者 Mixficsol。
  • +
  • 3 WAL 以 'disablewal' 命令方式支持动态关闭,在写性能遇到瓶颈的时候,可以通过命令关闭 WAL 缓解写性能下降的问题,关闭 WAL 有机器宕机后丢失数据的风险,用户需要根据自己的使用习惯权衡。PR 2015,作者 Mixficsol。
  • +
  • 4 flush 线程数和 compaction 线程数合二为一,在 Compaction 性能瓶颈时,可以动态调整线程数,缓解 Comapction 损耗 Pika 性能的问题。PR 2014, 作者 Tianpingan。
  • +
  • 5 升级了 RocksDB 版本到 v8.3.3。PR 2000, 作者 dingxiaoshuai123。
  • +
  • 6 新增周期性打印工作队列的长度功能,在队列阻塞的时候可以快速定位问题。PR 1978, 作者 Tianpingan。
  • +
  • 7 新增利用一个 pika_exporter 监测整个集群的指标,实现一个 Pika Exporter 实例监控整个集群,解决了 3.5.0 版本一个 Pika Exporter 监测一个 Pika 实例消耗资源的问题。PR 1953, 作者 chenbt-hz。
  • +
  • 8 实现在 K8s 环境上 Pika 服务的自动注册,在启动时自动注册,从而实现集群的自组织 ,实现了通过命令拉起整个 Pika Cluster 集群。PR 1931, 作者 machinly。
  • +
+

2 bug 修复

+
    +
  • 1 调整了 Rate_limit 参数,修复了压测时出现 RPS 为 0 的情况 。PR 2009, 作者 Mixficsol。
  • +
  • 2 修复了 INFODATA 命令中对于遍历数据文件时出现空路径的逻辑判断。PR 1996, 作者 Mixficsol。
  • +
  • 3 修复了 Codis 在线上出现大毛刺的问题。PR 2016, 作者 chejinge。
  • +
  • 4 修复了 macOS 环境下编译使用 tools 导致编译不过的问题 。PR 2011, 作者 A2ureStone。
  • +
  • 5 减少了 exporter 非必要日志的打印,降低 了资源利用率。PR 1945, 作者 Mixficsol。
  • +
+

3 使用建议

+

本次新增了几个配置参数,大家在使用过程中,需要根据使用情况按需调整:

+
    +
  • 1 max-rsync-parallel-num:主从全量复制线程数,需要根据自己机器 CPU 核数和部署实例个数进行调整,建议最小设置为 2。
  • +
  • 2 rate-limiter-bandwidth: 限制 RocksDB 数据库读写速度,限制数据库在一定时间内可以读写的数据量,默认 2000MiB/s,需要根据自己的机器性能和部署实例做调整。
  • +
  • max-background-jobs: compaction 和 flushdb 线程数,要根据自己机器 CPU 核数和部署实例个数进行调整,建议最小设置为 4。
  • +
  • 3 throttle-bytes-per-second: 主从复制传输限速参数,默认为 200MiB/s,该参数可以根据机器网卡的配置及部署 pika 实例的个数进行调整。
  • +
+

2023-09-28-Pika-3.5.1-connect.png

+ + \ No newline at end of file diff --git a/build/blog/Pika-3.5.3/index.html b/build/blog/Pika-3.5.3/index.html new file mode 100644 index 0000000..00ac715 --- /dev/null +++ b/build/blog/Pika-3.5.3/index.html @@ -0,0 +1,344 @@ + + + + + +What's new in Pika v3.5.3 | PikiwiDB(Pika) + + + + + + + + + +

What's new in Pika v3.5.3

· 阅读需 15 分钟
360 中间件团队
Pika 开源社区

随着 Redis 宣布采用双协议以维护其商业利益之际,PikiwiDB(Pika) 社区非常荣幸地宣布,我们的最新 v3.5.3 正式生产可用版本现已发布。

+

v3.5.3 解决了历史遗留的 Bug,引入了多项新特性。这些特性主要包括 Pika 支持 ACL、删除 Sharing 模式残留的 Slot 代码、快慢命令分离、 Redis Stream、大 key 分析工具、Pika 分布式集群支持全自动化 failover 等功能,同时,我们在 3.5.3 版本丰富了更多的自动化测试 case,提升 Pika 服务的稳定性和健壮性,会让用户感受到更为高效和稳定的使用体验,本文主要阐述本次改动的相关重大 feature、bugfix 性能提升项。

+

在深入探讨 3.5.3 版本的更新内容之前,请注意以下几点声明:

+
    +
  1. 由于商标问题,Pika 项目已更名为 PikiwiDB。文中以 PikiwiDB(Pika) 指代项目
    +https://github.com/OpenAtomFoundation/pika
  2. +
  3. 我们新创建了一个项目
    +https://github.com/OpenAtomFoundation/pikiwidb +这是一个基于 Raft 协议实现的兼容 Redis 协议的大容量 KV 数据库,主要面向强一致性数据场景,例如存储约 10TiB 规模的元数据。PikiwiDB 将专门用于指代此项目。
  4. +
  5. 我们为 PikiwiDB 设计了一个新的 logo,作为其商标,并已在相关政府机构注册。
  6. +
+

2024-03-27-Pika-3.5.3-logo

+

1 重大改进

+

1.1 PikiwiDB(Pika) 支持 ACL

+

PikiwiDB(Pika) 3.5.3 版本正式全面支持 Redis ACL,为未来在云原生 Pika 集群中支持多租户场景奠定了基础。在此之前,Pika 已经支持了 Redis 的用户认证方式,如 auth/userpass/requirepass,以及通过 pika.conf 中的 userblacklist 配置命令黑名单模式。本次更新保持了向后兼容,并支持这些已有的使用方式。

+

我们还确保 PikiwiDB(Pika) 的 ACL 实现与 Redis ACL 完全兼容,通过将 Redis 的所有 ACL TCL 测试集纳入 PikiwiDB(Pika) 的测试集中。

+

关键 PR:

+ +

1.2 混合存储模型支持 bitmap

+

在单体环境下,同时优化 PikiwiDB(Pika) 的读/写/compaction 是一项挑战。在 v3.5.2 版本中,我们引入了由缓存 Redis 和 RocksDB 构成的混合存储模型,并支持了 string/list/set/zset/hashtable 五种数据结构。在 3.5.3 版本中,我们增加了对 bitmap 的支持。

+

此外,我们在 3.5.3 版本中支持对 Redis 缓存进行动态参数调整。

+

关键 PR 链接:

+ +

1.3 快慢命令分离

+ +

1.4 Redis Stream

+

虽然 PikiwiDB(Pika) 之前支持了 Redis pubsub,但它只能进行在线消息传递。在 3.5.3 版本中,我们增加了对 Redis Stream 的有限支持,类似于消息队列(MQ),以便更安全地传递消息。为了确保数据的安全性,我们在底层引擎 BlackWidow 中特别添加了对 Stream 数据类型的支持。 +关键 PR:

+ +

1.5 云原生集群

+

在 PikiwiDB(Pika) 3.5.0 版本中,我们开源了 Pika-Operator,它支持在 K8s 上部署 Pika 主从对。在 3.5.2 版本中,我们基于 Kubeblocks 的 Pika-Operator 支持了在 K8s 上部署类似 Codis 的 Pika Cluster,但当时还不支持动态扩缩容。

+

在 3.5.3 版本中,最新的 Pika-Operator 已经支持了 Codis Group 级别的节点扩缩容,并且支持数据的 Rebalance。 +关键 PR:

+ +

PikiwiDB(Pika) 的底层磁盘存储引擎 RocksDB 在进行 compaction 时会显著影响 PikiwiDB(Pika) 的读写性能。因此,控制好 compaction 是优化 Pika 读写性能的关键。 +有关 compaction 的关键优化 PR 如下:

+ +

1.7 自动 Failover

+

PikiwiDB(Pika) 集群目前是基于 Codis 实现的。为了提高基于 Codis 的 PikiwiDB(Pika) Cluster 的易用性,我们对 Codis 进行了许多扩展。

+

原始的 Codis 不支持 Group 内的 Failover,需要使用 Redis Sentinel,这会导致运维成本增加。我们在 Codis Dashboard 中加入了 sentinel 的功能,实现了对 Group 内主从的自动 failover。

+

关键 PR:

+ +

1.8 可观测性提升

+

PikiwiDB(Pika) 的可观测性关键组件是 Pika-Exporter。在 3.5.2 版本中,我们虽然添加了 Redis Cache 缓存热数据,但缺少监控指标。在 3.5.3 版本中,我们增加了包括命中率、每秒命中次数、Redis Cache 内存使用量、Redis Cache 个数、Redis Cache DB 个数 等指标。

+

关键 PR:

+ +

关键 PR:

+ +

1.10 添加测试集

+

PikiwiDB(Pika) 测试集由 gtest 单测、Redis TCL 测试集和 Go 测试集组成:

+
    +
  • gtest 单测主要测试 Pika C++ 代码
  • +
  • Redis TCL 测试集来自 Redis,用于测试 PikiwiDB(Pika) 对 Redis 标准命令兼容度
  • +
  • Go 测试集可对 Pika 进行 Redis 命令测试、主从和 Codis 集群 e2e 测试
  • +
+

3.5.3 中添加了 Codis 集群 e2e 测试,关键 PR 如下:

+ +

1.11 工具集 +PikiwiDB(Pika) 一直重视工具集的建设,所有相关工具都可以在 https://github.com/OpenAtomFoundation/pika/tree/unstable/tools 中找到。在 3.5.3 版本中,我们新增了一个工具:

+

PikiwiDB(Pika) 支持大 key 分析工具 +https://github.com/OpenAtomFoundation/pika/pull/2195

+

1.12 文档更新

+

PikiwiDB(Pika) 的文档主要是 wiki 文档。在 3.5.3 版本中,我们更新了 Pika 支持的 Redis 命令文档。

+

文档链接: https://github.com/OpenAtomFoundation/pika/wiki/pika-%E6%94%AF%E6%8C%81%E7%9A%84redis%E6%8E%A5%E5%8F%A3%E5%8F%8A%E5%85%BC%E5%AE%B9%E6%83%85%E5%86%B5 +2 改进列表

+

在第一章节中,我们概述了 3.5.3 版本的主要功能升级和改进。下面详细列出了本次发版的相关 PR。

+

2.1 新特性

+ +

2.2 bug 修复

+ +

2.3 发版 tag +https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.3 +3 社区

+

如果你有任何疑问,欢迎加入交流群,PikiwiDB(Pika) 开源社区感谢大家的支持和帮助。

+

2024-03-27-Pika-3.5.3-connect

+ + \ No newline at end of file diff --git a/build/blog/Pika-3.5.4/index.html b/build/blog/Pika-3.5.4/index.html new file mode 100644 index 0000000..c9be940 --- /dev/null +++ b/build/blog/Pika-3.5.4/index.html @@ -0,0 +1,93 @@ + + + + + +What's new in Pika v3.5.4 | PikiwiDB(Pika) + + + + + + + + + +

What's new in Pika v3.5.4

· 阅读需 6 分钟
于雨
dubbogo示土区

PikiwiDB(Pika) 社区非常荣幸地宣布,我们的最新 v3.5.4 正式生产可用版本现已发布。 +v3.5.4 解决了历史遗留的 bug,对 PikiwiDB(Pika) 的一些遗留 bug 进行修复和优化,旨在打造出一个高稳定性的版本。本次的重点优化主要包括,PikiwiDB(Pika)支持动态调整限速参数、增强 PikiwiDB(Pika) 的客观测性指标、 磁盘 IO 限速支持读限速及写限速等。 +1 新特性

+
    +
  1. Pika 支持动态调整全量同步限速参数 rsync-timeout-ms 和 throttle-bytes-per-second。
  2. +
+

自 v3.5.0 版本开始,PikiwiDB(Pika) 服务摒弃了通过子进程内使用原来 rsync 工具进行主从全量同步的逻辑,在 PikiwiDB(Pika) 内部以线程方式【称作 rsync 线程】自行实现了新的全量同步逻辑,避免因为外部进程不可控引起的主从同步问题,根据 360 内部 Pika 线上大规模集群运维的经验,在 PikiwiDB(Pika) 主从进行全量同步的过程中,如果遇到某些不利的外部因素,如网络波动,硬件故障(如网卡降速导致的主从网卡速率不匹配)等,可能引起 rsync 线程请求持续超时(PikiwiDB(Pika) 内置 rsync 模块用于全量同步阶段的文件传输),且超时重试所发出的包可能引发更大的网络信道负担。此时对于运维人员来说,如果能动态调整 rsync 请求的超时时间和 rsync 传输的速率上限,不仅意味着对全量同步阶段控制粒度的进一步细化,更大大降低了在该场景下的运维处置难度。

+

关键PR:

+

https://github.com/OpenAtomFoundation/pika/pull/2633

+
    +
  1. 将 info key space 1 的结果输出至 info all 并展示到监控界面中。
  2. +
+

PikiwiDB(Pika) 是通过 Info 命令采集数据至 Pika-Exporter,展示到 Grafana 界面上的,目前界面上部分数据是没有展示的,如 keys 的数量,本次将执行 info keyspace 的结果展示到监控界面,用户可以通过这个指标来查看存储的量级等。

+

关键PR:

+

https://github.com/OpenAtomFoundation/pika/pull/2603

+

3.Pika 磁盘IO 限速参数支持 OnlyRead、OnlyWrite、ReadAndWrite,默认支持OnlyWrite。

+

自3.5.0版本开始,PikiwiDB(Pika) 服务可以通过调整 rate-limit 参数实现写限速,防止在网卡质量不高的情况下磁盘 IO 过重导致服务不可用,或者 binlog 阻塞的情况发生。360内部 Pika 线上大规模集群运维的经验,在 PikiwiDB(Pika) 实例的网卡较差情况下,也需要对读实例进行限速,本次修改支持读、写限速,默认是写限速,调整 config 配置中的 rate-limiter-mode 可以设置为读限速,或者同时读写限速。

+

关键PR:

+

https://github.com/OpenAtomFoundation/pika/pull/2599

+

2 改进列表

+

slotmigrate 添加 go test。

+

https://github.com/OpenAtomFoundation/pika/pull/2576

+

INFO 命令耗时优化,降低查磁盘频率,避免因为数据采集调用 info 命令时查磁盘太过频繁导致服务性能下降。

+

https://github.com/OpenAtomFoundation/pika/pull/2554

+

对五种基本数据类型命令增加 Redis tcl 测试。

+

https://github.com/OpenAtomFoundation/pika/pull/2527

+

3 Bug 修复

+

修复使用 Pika Exporter 时可能会出现 slots 分配不均衡的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2651

+

修复 Codis dashboard 不能正确更新 master 实例状态的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2650

+

修复 Redis 事务 binlog 解析失败导致的主从同步异常问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2642

+

修复 Pika Expoter 启动时不带参数导致启动失败问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2640

+

修复使用 Pika Operater 拉起集群 Codis-proxy panic 的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2633

+

修复 CI 编译出的二进制进行自动化测试时 cp 命令失败问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2614

+

修复变量未初始化导致 cache 启动失败的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2613

+

修复 userpass 和 userblacklist 动态修改参数功能异常问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2600

+

修复 scard sscan 结果不一致的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2596

+

修复当 max-rsync-parallel-num 大于4,slave 会在主从复制时 coredump 的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2595

+

调整不常用的线程池线程数,避免因为空跑导致性能损耗。

+

https://github.com/OpenAtomFoundation/pika/pull/2590

+

修复 Pika 事务边缘测试 case 不通过的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2586

+

将 cache-model 修改成 cache-mode。

+

https://github.com/OpenAtomFoundation/pika/pull/2585

+

修复使用 info keyspace 后,info all 死锁的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2584

+

修复因修改 zsetscorekey comparator impl 字典序比较熟顺序,导致 353 352极端场景不兼容的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2583

+

修复 compact 死锁的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2581

+

Slotmigrate 添加 go test。

+

https://github.com/OpenAtomFoundation/pika/pull/2576

+

更新 Pika Operater 使用的 pika 版本。

+

https://github.com/OpenAtomFoundation/pika/pull/2572

+

修复 config rewrite 后 blockcache 数值异常的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2561

+

修复 slotmigrate 动态修复后值错误的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2548

+

修复 spop 可能会出现主从数据不一致的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2541

+

修复 CloseFd(it->second[i]) 出现越界的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2539

+

修复 Flushall 和 FlushDB 死锁的隐患,并删除 FlushSubDB 接口。

+

https://github.com/OpenAtomFoundation/pika/pull/2533

+

增加参数控制是否清理 tcl 测试后产生的数据文件,防止废弃数据占据磁盘。

+

https://github.com/OpenAtomFoundation/pika/pull/2507

+

2024-05-16-Pika-3.5.4-connect.png

+ + \ No newline at end of file diff --git a/build/blog/Pika-Tools-Port-Bin/index.html b/build/blog/Pika-Tools-Port-Bin/index.html new file mode 100644 index 0000000..9b127a7 --- /dev/null +++ b/build/blog/Pika-Tools-Port-Bin/index.html @@ -0,0 +1,55 @@ + + + + + +pika_port 迁移工具 | PikiwiDB(Pika) + + + + + + + + + +

pika_port 迁移工具

· 阅读需 3 分钟
于雨
Pika 开源社区

项目作者:

+

AlexStocks

+

适用版本:

+

3.1 和 2.x

+

项目地址:

+

https://github.com/ipixiu/pika-tools

+

https://github.com/Axlgrep/pika-tools 长期维护地址需自行编译

+

二进制包:

+

https://github.com/ipixiu/pika-port-bin

+

功能:

+

将Pika中的数据在线迁移到Pika、Redis(支持全量、增量同步)

+

开发背景:

+

之前Pika项目官方提供的pika_to_redis工具仅支持离线将Pika的DB中的数据迁移到Pika、Redis, 且无法增量同步,该工具可以直接伪装为一个Pika的从库,将主库数据通过同步获取并转发给Pika、Redis,同时并支持增量同步

+

实现:

+

trysync线程

+
    +
  1. 尝试与主库建立同步关系
  2. +
  3. 如果需要全同步,则在接收到master的db之后,启动migrator和sender线程将db里面的数据发送给Pika、Redis
  4. +
  5. 启动Slaveping线程定期给主库发送心跳,完成建立主从关系
  6. +
+

binlog_receiver线程

+
    +
  1. 接收主库发送过来的binlog并且将其解析成redis命令
  2. +
  3. 将redis命令转发给Pika、Redis
  4. +
+

migrator线程

+
    +
  1. 扫描不同数据类型的分库
  2. +
  3. 将key进行解析成响应数据Pika、redis指令
  4. +
  5. 将解析好的redis指令加载到sender的发送buf中
  6. +
+

sender线程

+
    +
  1. 从发送buf中读取数据,以非阻塞方式向Pika、redis发送数据
  2. +
  3. 接收Pika、redis返回的结果并解析,如果出现错误则显示错误结果
  4. +
+

使用帮助:

+
Usage: 
pika_port [-h] [-t local_ip -p local_port -i master_ip -o master_port
-m forward_ip -n forward_port -x forward_thread_num -y forward_passwd]
-f filenum -s offset -w password -r rsync_dump_path -l log_path
-h -- show this help
-t -- local host ip(OPTIONAL default: 127.0.0.1)
-p -- local port(OPTIONAL)
-i -- master ip(OPTIONAL default: 127.0.0.1)
-o -- master port(REQUIRED)
-m -- forward ip(OPTIONAL default: 127.0.0.1)
-n -- forward port(REQUIRED)
-x -- forward thread num(OPTIONAL default: 1)
-y -- forward password(OPTIONAL)
-f -- binlog filenum(OPTIONAL default: local offset)
-s -- binlog offset(OPTIONAL default: local offset)
-w -- password for master(OPTIONAL)
-r -- rsync dump data path(OPTIONAL default: ./rsync_dump)
-l -- local log path(OPTIONAL default: ./log)
-b -- max batch number when port rsync dump data (OPTIONAL default: 512)
-d -- daemonize(OPTIONAL)
example: ./pika_port -t 127.0.0.1 -p 12345 -i 127.0.0.1 -o 9221 -m 127.0.0.1 -n 6379 -x 7 -f 0 -s 0 -w abc -l ./log -r ./rsync_dump -b 512 -d
+ + \ No newline at end of file diff --git a/build/blog/PikiwiDB-Pika--4.0.0/index.html b/build/blog/PikiwiDB-Pika--4.0.0/index.html new file mode 100644 index 0000000..e99d568 --- /dev/null +++ b/build/blog/PikiwiDB-Pika--4.0.0/index.html @@ -0,0 +1,244 @@ + + + + + +What's new in PikiwiDB(Pika) v4.0.0 | PikiwiDB(Pika) + + + + + + + + + +

What's new in PikiwiDB(Pika) v4.0.0

· 阅读需 18 分钟
360 车金鸽
Pika 开源社区

尊敬的社区成员及技术爱好者们: +PikiwiDB 社区荣耀地宣告——经过 9 个月打磨并在生产环境稳定运行 5 个月的 PikiwiDB(Pika) v4.0.0 【下文简称 Pika】今天正式发布。希望基于第三代存储引擎 Floyd 的这个新版本能为社区用户们带来更卓越的体验。

+

1 重大改进

+

1.1 第三代存储引擎 Floyd +Floyd 如同其前代 Blackwidow,基于 RocksDB,不仅支持基础的 String 结构,也原生支持了 Hash、List、Set、Stream及 ZSet 等 KKV 形式的复合数据结构。

+
    +
  • RocksDB 实例数可配置
  • +
+

摒弃了 Blackwidow 按数据类型采用 RocksDB 实例的物理隔离模式,Floyd 采用了 RocksDB 的 Column-Family 虚拟隔离机制,在单个 RocksDB 实例下可存储所有类型的数据。用户可自由设定 Pika 实例中每个 DB【等同于Redis DB】中 RocksDB 实例的数量,而数据的存储则依据 key 的 hash 值分配至相应的 RocksDB 实例,减小了数据的空间放大和读放大效应,实现了机器资源的高效利用。

+
    +
  • 禁止重复 key
  • +
+

2024-05-16-PikiwiDB(Pika)-4.0.0-key +基于 RocksDB 的 Column-Family 虚拟隔离机制,Floyd 把所有类型的 key 和 string 一起存储在 Column-Family 0。在此存储基础之上,可明确禁止不同类型的 key 重复,这一设计旨在杜绝潜在的数据冗余与不一致性,与 Redis 服务特性保持一致,进一步提升了系统的整体效率与数据质量。

+
    +
  • Floyd 详细说明
  • +
+

如果对 Floyd 存储引擎感兴趣,请详阅《Floyd 存储引擎》【链接:https://github.com/OpenAtomFoundation/pika/discussions/2052】。由于 Floyd 前后进行了多个版本的迭代,所以阅读该 github discussion 文档时请注意前后时间,如有相关冲突性说法,以最新日期的文字为准。

+

关键 PR:

+ +

1.2 Mget 批量查询缓存

+

Pika v3.5.2 的热数据缓存只实现了对热点 Key 的点查(如get/hget),在后续的 v3.5.3 和 v3.5.4 修复若干 bug 后,对热数据的点查目前已经非常稳定。然而并未支持批量查询(如 mget etc)。 +内部业务侧反馈批量查询速度比较慢,在 40C/256GiB/2TiB SATA SSD 规格机器上数据量超过 100GiB 时,Pika v3.3.6 30% 批量查询延迟超过 35ms。但由于 Pika 热数据缓存尚未支持批量查询,性能并未改善。

+

为了满足业务需求,Pika 团队开发了批量查询热数据缓存功能,显著提升了批量查询性能,降低了查询延迟和失败率。相关技术细节请阅读《PikiwiDB (Pika) 混合存储之批量查询》 【链接:https://mp.weixin.qq.com/s/KFLPruSdB66TMRxUfR9PbQ 】。

+

关键 PR :

+ +

1.3 主从复制

+

Pika v3.3.6 有很多主从复制的缺陷。v4.0.0 版本对 Pika 全量复制及增量复制进行了大量优化和 bug 修复,取得了非常好的效果。 +并在 info 命令中输出了 "repl_connect_status" 指标(PR 2638),以方便用户更加明确清晰的确定当前的主从复制状态。

+

关键 PR :

+ +

1.4 Redis Stream

+

Redis Stream 类似于消息队列(MQ),以便更安全地传递消息。为了确保数据的安全性,底层引擎 BlackWidow 和 Floyd 中特别添加了对 Stream 数据类型的支持。 +关键 PR:

+ +

1.5 Compaction

+

PikiwiDB(Pika) 的底层磁盘存储引擎 RocksDB 在进行 compaction 时会显著影响 PikiwiDB(Pika) 的读写性能。因此,控制好 compaction 是优化 Pika 读写性能的关键。

+

Floyd 使用了 v8.7.3 版本的 RocksDB,开放了更多 RocksDB 参数,以方便用户优化 RocksDB 性能:

+
    +
  • enable-partitioned-index-filters: 支持加载分区索引过滤器,加快 RocksDB 查找速度。
  • +
  • min-write-buffer-number-to-merge: 默认值为 1,如果将此值设置得更大,意味着需要更多的写缓冲区被填满后才进行 flush。这样可以减少 flush 的频率,增加数据在内存中的累积量,从而可能提高写入吞吐量。
  • +
  • level0-stop-writes-trigger: 默认值为 36,定义了 L0 层中 sst 文件的最大数量,一旦达到这个数量,RocksDB 将会采取 暂停写入、强制 compaction 等措施来防止写入操作继续累积,以避免 L0 层变得过于庞大,进而可能导致写入放大、查询性能下降等问题。
  • +
  • level0-slowdown-writes-trigger:默认值为 20,用于控制当 Level 0 的 SST 文件数量达到这个阈值时,触发写减速(write slowdown),防止 Level 0 的文件数量过多,导致后续 compaction 操作的压力过大。
  • +
  • level0-file-num-compaction-trigger:默认值为 4,当 Level 0 的 SST 文件数量达到这个参数设定的阈值时,RocksDB 会开始执行 compaction 操作,将 Level 0 的文件合并到 Level 1,以减少 Level 0 的文件数量,降低读取延迟,并优化存储空间的利用率。
  • +
  • max-subcompactions:默认值为 1,用于控制RocksDB 中并发执行的 sub-compaction 任务数量,其值为 1 表示关闭 sub-compaction。如果系统资源充足,建议提升该参数以优化 compaction 效率。
  • +
  • max-bytes-for-level-base:指定了 L1 SST 文件总的大小。这个大小是 RocksDB 进行数据分层管理和 compaction 决策的重要依据:如果 L1 层的大小设置得太小,可能会导致 L0 层的 compaction 过于频繁,进而影响写性能。反之,如果设置得太大,可能会占用较多的磁盘空间,并且影响读取性能,因为读取操作可能需要跨越更多的层级。Pika 没有在 pika.conf 中开放此参数给用户配置,而是使用其他参数(level0-file-num-compaction-trigger 和 write-buffer-size)计算后的结果。
  • +
+

storage_options_.options.max_bytes_for_level_base = g_pika_conf->level0_file_num_compaction_trigger() * g_pika_conf->write_buffer_size()

+

关键 PR: +添加 Floyd 的 compaction-filter 的 Gtest +https://github.com/OpenAtomFoundation/pika/pull/2669 +添加支持分区索引过滤的功能 +https://github.com/OpenAtomFoundation/pika/pull/2601 +新增 RocksDB Compaction 策略动态调整参数,用户可以根据业务调整 Compaction 策略,降低 Compaction 操作对服务性能的损耗 +https://github.com/OpenAtomFoundation/pika/pull/2538 +1.6 可观测性 +v3.5 版本增加了包括命中率、每秒命中次数、Redis Cache 内存使用量、Redis Cache 个数、Redis Cache DB 个数 等指标,但是在集群方面的可观测性是缺失的。v4.0.0 对 Codis-Proxy 的 P99、P999、延迟等监控指标进行采集和展示,可以直观地反映线上 Codis-proxy 的运行情况。

+

v4.0.0 开始还提供新的工具:根据 pika benchmark 工具压测结果自动生成可视化的统计图表。

+

关键 PR: +Codis 支持 info 命令, 可以通过该命令查询 Codis-proxy 的 info 信息 +https://github.com/OpenAtomFoundation/pika/pull/2688 +Codis-proxy 新增 P99 P95 等监控耗时指标 +https://github.com/OpenAtomFoundation/pika/pull/2668 +添加 Pika 压测指标,提升 Pika 压测效率,并输出可视化的统计图表 +https://github.com/OpenAtomFoundation/pika/pull/2663

+

1.7 测试集 +PikiwiDB(Pika) 测试集由 gtest 单测、Redis TCL 测试集和 Go 测试集组成。v4.0.0 中丰富了诸多特性的 go test 功能,并进一步完善了基本数据类型的 TCL 测试。 +关键 PR: +添加 Floyd 的 compaction-filter 的 Gtest +https://github.com/OpenAtomFoundation/pika/pull/2669 +Pika Geo 数据类型增加 TCL 测试,并修复测试过程中遇到的缺陷 +https://github.com/OpenAtomFoundation/pika/pull/2753 +1.8 跨平台 +PikiwiDB(Pika) 以往仅支持 centos 和 ubuntu 等 linux 平台,v3.5 开始支持 Mac 等平台。v4.0.0 将对 Mac 平台的支持扩展至 FreeBSD 平台。 +关键 PR: +Pika 支持在 FreeBSD14 平台上进行编译 +https://github.com/OpenAtomFoundation/pika/pull/2711 +2 改进列表 +下面详细列出了本次发版的主要功能升级和改进。 +2.1 新特性

+ +

2.2 bug 修复

+ +

2.3 提升改进项

+ +

2.4 发版 tag

+

https://github.com/OpenAtomFoundation/pika/releases/tag/v4.0.0 +3 社区 +感谢所有为 v4.0.0 做出贡献的社区成员,包括 issue/PR 提交者、代码 reviewer 【排名不分先后,依据字母序列】:

+

AlexStocks

+

baerwang

+

chejinge

+

cheniujh

+

chienguo

+

guangkun123

+

gukj-spel

+

longfar-ncy

+

lqxhub

+

luky116

+

Mixficsol

+

saz97

+

wangshao1

+

PikiwiDB (Pika) 开源社区热烈欢迎您的参与和支持。如果您有任何问题、意见或建议,请扫码添加 PikiwiDB 小助手【微信号: PikiwiDB】为好友,它会拉您加入官方微信群。

+

2024-07-08-PikiwiDB(Pika)-4.0.0-connect

+ + \ No newline at end of file diff --git a/build/blog/archive/index.html b/build/blog/archive/index.html new file mode 100644 index 0000000..d25155c --- /dev/null +++ b/build/blog/archive/index.html @@ -0,0 +1,18 @@ + + + + + +历史博文 | PikiwiDB(Pika) + + + + + + + + + + + + \ No newline at end of file diff --git a/build/blog/atom.xml b/build/blog/atom.xml new file mode 100644 index 0000000..5ae8c02 --- /dev/null +++ b/build/blog/atom.xml @@ -0,0 +1,919 @@ + + + https://www.pikiwidb.com/blog + PikiwiDB(Pika) Blog + 2024-07-08T00:00:00.000Z + https://github.com/jpmonette/feed + + PikiwiDB(Pika) Blog + https://www.pikiwidb.com/img/favicon.ico + + <![CDATA[What's new in PikiwiDB(Pika) v4.0.0]]> + https://www.pikiwidb.com/blog/PikiwiDB-Pika--4.0.0 + + 2024-07-08T00:00:00.000Z + + 尊敬的社区成员及技术爱好者们: +PikiwiDB 社区荣耀地宣告——经过 9 个月打磨并在生产环境稳定运行 5 个月的 PikiwiDB(Pika) v4.0.0 【下文简称 Pika】今天正式发布。希望基于第三代存储引擎 Floyd 的这个新版本能为社区用户们带来更卓越的体验。

+

1 重大改进

+

1.1 第三代存储引擎 Floyd +Floyd 如同其前代 Blackwidow,基于 RocksDB,不仅支持基础的 String 结构,也原生支持了 Hash、List、Set、Stream及 ZSet 等 KKV 形式的复合数据结构。

+
    +
  • RocksDB 实例数可配置
  • +
+

摒弃了 Blackwidow 按数据类型采用 RocksDB 实例的物理隔离模式,Floyd 采用了 RocksDB 的 Column-Family 虚拟隔离机制,在单个 RocksDB 实例下可存储所有类型的数据。用户可自由设定 Pika 实例中每个 DB【等同于Redis DB】中 RocksDB 实例的数量,而数据的存储则依据 key 的 hash 值分配至相应的 RocksDB 实例,减小了数据的空间放大和读放大效应,实现了机器资源的高效利用。

+
    +
  • 禁止重复 key
  • +
+

2024-05-16-PikiwiDB(Pika)-4.0.0-key +基于 RocksDB 的 Column-Family 虚拟隔离机制,Floyd 把所有类型的 key 和 string 一起存储在 Column-Family 0。在此存储基础之上,可明确禁止不同类型的 key 重复,这一设计旨在杜绝潜在的数据冗余与不一致性,与 Redis 服务特性保持一致,进一步提升了系统的整体效率与数据质量。

+
    +
  • Floyd 详细说明
  • +
+

如果对 Floyd 存储引擎感兴趣,请详阅《Floyd 存储引擎》【链接:https://github.com/OpenAtomFoundation/pika/discussions/2052】。由于 Floyd 前后进行了多个版本的迭代,所以阅读该 github discussion 文档时请注意前后时间,如有相关冲突性说法,以最新日期的文字为准。

+

关键 PR:

+ +

1.2 Mget 批量查询缓存

+

Pika v3.5.2 的热数据缓存只实现了对热点 Key 的点查(如get/hget),在后续的 v3.5.3 和 v3.5.4 修复若干 bug 后,对热数据的点查目前已经非常稳定。然而并未支持批量查询(如 mget etc)。 +内部业务侧反馈批量查询速度比较慢,在 40C/256GiB/2TiB SATA SSD 规格机器上数据量超过 100GiB 时,Pika v3.3.6 30% 批量查询延迟超过 35ms。但由于 Pika 热数据缓存尚未支持批量查询,性能并未改善。

+

为了满足业务需求,Pika 团队开发了批量查询热数据缓存功能,显著提升了批量查询性能,降低了查询延迟和失败率。相关技术细节请阅读《PikiwiDB (Pika) 混合存储之批量查询》 【链接:https://mp.weixin.qq.com/s/KFLPruSdB66TMRxUfR9PbQ 】。

+

关键 PR :

+ +

1.3 主从复制

+

Pika v3.3.6 有很多主从复制的缺陷。v4.0.0 版本对 Pika 全量复制及增量复制进行了大量优化和 bug 修复,取得了非常好的效果。 +并在 info 命令中输出了 "repl_connect_status" 指标(PR 2638),以方便用户更加明确清晰的确定当前的主从复制状态。

+

关键 PR :

+ +

1.4 Redis Stream

+

Redis Stream 类似于消息队列(MQ),以便更安全地传递消息。为了确保数据的安全性,底层引擎 BlackWidow 和 Floyd 中特别添加了对 Stream 数据类型的支持。 +关键 PR:

+ +

1.5 Compaction

+

PikiwiDB(Pika) 的底层磁盘存储引擎 RocksDB 在进行 compaction 时会显著影响 PikiwiDB(Pika) 的读写性能。因此,控制好 compaction 是优化 Pika 读写性能的关键。

+

Floyd 使用了 v8.7.3 版本的 RocksDB,开放了更多 RocksDB 参数,以方便用户优化 RocksDB 性能:

+
    +
  • enable-partitioned-index-filters: 支持加载分区索引过滤器,加快 RocksDB 查找速度。
  • +
  • min-write-buffer-number-to-merge: 默认值为 1,如果将此值设置得更大,意味着需要更多的写缓冲区被填满后才进行 flush。这样可以减少 flush 的频率,增加数据在内存中的累积量,从而可能提高写入吞吐量。
  • +
  • level0-stop-writes-trigger: 默认值为 36,定义了 L0 层中 sst 文件的最大数量,一旦达到这个数量,RocksDB 将会采取 暂停写入、强制 compaction 等措施来防止写入操作继续累积,以避免 L0 层变得过于庞大,进而可能导致写入放大、查询性能下降等问题。
  • +
  • level0-slowdown-writes-trigger:默认值为 20,用于控制当 Level 0 的 SST 文件数量达到这个阈值时,触发写减速(write slowdown),防止 Level 0 的文件数量过多,导致后续 compaction 操作的压力过大。
  • +
  • level0-file-num-compaction-trigger:默认值为 4,当 Level 0 的 SST 文件数量达到这个参数设定的阈值时,RocksDB 会开始执行 compaction 操作,将 Level 0 的文件合并到 Level 1,以减少 Level 0 的文件数量,降低读取延迟,并优化存储空间的利用率。
  • +
  • max-subcompactions:默认值为 1,用于控制RocksDB 中并发执行的 sub-compaction 任务数量,其值为 1 表示关闭 sub-compaction。如果系统资源充足,建议提升该参数以优化 compaction 效率。
  • +
  • max-bytes-for-level-base:指定了 L1 SST 文件总的大小。这个大小是 RocksDB 进行数据分层管理和 compaction 决策的重要依据:如果 L1 层的大小设置得太小,可能会导致 L0 层的 compaction 过于频繁,进而影响写性能。反之,如果设置得太大,可能会占用较多的磁盘空间,并且影响读取性能,因为读取操作可能需要跨越更多的层级。Pika 没有在 pika.conf 中开放此参数给用户配置,而是使用其他参数(level0-file-num-compaction-trigger 和 write-buffer-size)计算后的结果。
  • +
+

storage_options_.options.max_bytes_for_level_base = g_pika_conf->level0_file_num_compaction_trigger() * g_pika_conf->write_buffer_size()

+

关键 PR: +添加 Floyd 的 compaction-filter 的 Gtest +https://github.com/OpenAtomFoundation/pika/pull/2669 +添加支持分区索引过滤的功能 +https://github.com/OpenAtomFoundation/pika/pull/2601 +新增 RocksDB Compaction 策略动态调整参数,用户可以根据业务调整 Compaction 策略,降低 Compaction 操作对服务性能的损耗 +https://github.com/OpenAtomFoundation/pika/pull/2538 +1.6 可观测性 +v3.5 版本增加了包括命中率、每秒命中次数、Redis Cache 内存使用量、Redis Cache 个数、Redis Cache DB 个数 等指标,但是在集群方面的可观测性是缺失的。v4.0.0 对 Codis-Proxy 的 P99、P999、延迟等监控指标进行采集和展示,可以直观地反映线上 Codis-proxy 的运行情况。

+

v4.0.0 开始还提供新的工具:根据 pika benchmark 工具压测结果自动生成可视化的统计图表。

+

关键 PR: +Codis 支持 info 命令, 可以通过该命令查询 Codis-proxy 的 info 信息 +https://github.com/OpenAtomFoundation/pika/pull/2688 +Codis-proxy 新增 P99 P95 等监控耗时指标 +https://github.com/OpenAtomFoundation/pika/pull/2668 +添加 Pika 压测指标,提升 Pika 压测效率,并输出可视化的统计图表 +https://github.com/OpenAtomFoundation/pika/pull/2663

+

1.7 测试集 +PikiwiDB(Pika) 测试集由 gtest 单测、Redis TCL 测试集和 Go 测试集组成。v4.0.0 中丰富了诸多特性的 go test 功能,并进一步完善了基本数据类型的 TCL 测试。 +关键 PR: +添加 Floyd 的 compaction-filter 的 Gtest +https://github.com/OpenAtomFoundation/pika/pull/2669 +Pika Geo 数据类型增加 TCL 测试,并修复测试过程中遇到的缺陷 +https://github.com/OpenAtomFoundation/pika/pull/2753 +1.8 跨平台 +PikiwiDB(Pika) 以往仅支持 centos 和 ubuntu 等 linux 平台,v3.5 开始支持 Mac 等平台。v4.0.0 将对 Mac 平台的支持扩展至 FreeBSD 平台。 +关键 PR: +Pika 支持在 FreeBSD14 平台上进行编译 +https://github.com/OpenAtomFoundation/pika/pull/2711 +2 改进列表 +下面详细列出了本次发版的主要功能升级和改进。 +2.1 新特性

+ +

2.2 bug 修复

+ +

2.3 提升改进项

+ +

2.4 发版 tag

+

https://github.com/OpenAtomFoundation/pika/releases/tag/v4.0.0 +3 社区 +感谢所有为 v4.0.0 做出贡献的社区成员,包括 issue/PR 提交者、代码 reviewer 【排名不分先后,依据字母序列】:

+

AlexStocks

+

baerwang

+

chejinge

+

cheniujh

+

chienguo

+

guangkun123

+

gukj-spel

+

longfar-ncy

+

lqxhub

+

luky116

+

Mixficsol

+

saz97

+

wangshao1

+

PikiwiDB (Pika) 开源社区热烈欢迎您的参与和支持。如果您有任何问题、意见或建议,请扫码添加 PikiwiDB 小助手【微信号: PikiwiDB】为好友,它会拉您加入官方微信群。

+

2024-07-08-PikiwiDB(Pika)-4.0.0-connect

]]>
+ + 360 车金鸽 + +
+ + <![CDATA[What's new in Pika v3.5.4]]> + https://www.pikiwidb.com/blog/Pika-3.5.4 + + 2024-05-16T00:00:00.000Z + + PikiwiDB(Pika) 社区非常荣幸地宣布,我们的最新 v3.5.4 正式生产可用版本现已发布。 +v3.5.4 解决了历史遗留的 bug,对 PikiwiDB(Pika) 的一些遗留 bug 进行修复和优化,旨在打造出一个高稳定性的版本。本次的重点优化主要包括,PikiwiDB(Pika)支持动态调整限速参数、增强 PikiwiDB(Pika) 的客观测性指标、 磁盘 IO 限速支持读限速及写限速等。 +1 新特性

+
    +
  1. Pika 支持动态调整全量同步限速参数 rsync-timeout-ms 和 throttle-bytes-per-second。
  2. +
+

自 v3.5.0 版本开始,PikiwiDB(Pika) 服务摒弃了通过子进程内使用原来 rsync 工具进行主从全量同步的逻辑,在 PikiwiDB(Pika) 内部以线程方式【称作 rsync 线程】自行实现了新的全量同步逻辑,避免因为外部进程不可控引起的主从同步问题,根据 360 内部 Pika 线上大规模集群运维的经验,在 PikiwiDB(Pika) 主从进行全量同步的过程中,如果遇到某些不利的外部因素,如网络波动,硬件故障(如网卡降速导致的主从网卡速率不匹配)等,可能引起 rsync 线程请求持续超时(PikiwiDB(Pika) 内置 rsync 模块用于全量同步阶段的文件传输),且超时重试所发出的包可能引发更大的网络信道负担。此时对于运维人员来说,如果能动态调整 rsync 请求的超时时间和 rsync 传输的速率上限,不仅意味着对全量同步阶段控制粒度的进一步细化,更大大降低了在该场景下的运维处置难度。

+

关键PR:

+

https://github.com/OpenAtomFoundation/pika/pull/2633

+
    +
  1. 将 info key space 1 的结果输出至 info all 并展示到监控界面中。
  2. +
+

PikiwiDB(Pika) 是通过 Info 命令采集数据至 Pika-Exporter,展示到 Grafana 界面上的,目前界面上部分数据是没有展示的,如 keys 的数量,本次将执行 info keyspace 的结果展示到监控界面,用户可以通过这个指标来查看存储的量级等。

+

关键PR:

+

https://github.com/OpenAtomFoundation/pika/pull/2603

+

3.Pika 磁盘IO 限速参数支持 OnlyRead、OnlyWrite、ReadAndWrite,默认支持OnlyWrite。

+

自3.5.0版本开始,PikiwiDB(Pika) 服务可以通过调整 rate-limit 参数实现写限速,防止在网卡质量不高的情况下磁盘 IO 过重导致服务不可用,或者 binlog 阻塞的情况发生。360内部 Pika 线上大规模集群运维的经验,在 PikiwiDB(Pika) 实例的网卡较差情况下,也需要对读实例进行限速,本次修改支持读、写限速,默认是写限速,调整 config 配置中的 rate-limiter-mode 可以设置为读限速,或者同时读写限速。

+

关键PR:

+

https://github.com/OpenAtomFoundation/pika/pull/2599

+

2 改进列表

+

slotmigrate 添加 go test。

+

https://github.com/OpenAtomFoundation/pika/pull/2576

+

INFO 命令耗时优化,降低查磁盘频率,避免因为数据采集调用 info 命令时查磁盘太过频繁导致服务性能下降。

+

https://github.com/OpenAtomFoundation/pika/pull/2554

+

对五种基本数据类型命令增加 Redis tcl 测试。

+

https://github.com/OpenAtomFoundation/pika/pull/2527

+

3 Bug 修复

+

修复使用 Pika Exporter 时可能会出现 slots 分配不均衡的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2651

+

修复 Codis dashboard 不能正确更新 master 实例状态的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2650

+

修复 Redis 事务 binlog 解析失败导致的主从同步异常问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2642

+

修复 Pika Expoter 启动时不带参数导致启动失败问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2640

+

修复使用 Pika Operater 拉起集群 Codis-proxy panic 的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2633

+

修复 CI 编译出的二进制进行自动化测试时 cp 命令失败问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2614

+

修复变量未初始化导致 cache 启动失败的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2613

+

修复 userpass 和 userblacklist 动态修改参数功能异常问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2600

+

修复 scard sscan 结果不一致的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2596

+

修复当 max-rsync-parallel-num 大于4,slave 会在主从复制时 coredump 的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2595

+

调整不常用的线程池线程数,避免因为空跑导致性能损耗。

+

https://github.com/OpenAtomFoundation/pika/pull/2590

+

修复 Pika 事务边缘测试 case 不通过的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2586

+

将 cache-model 修改成 cache-mode。

+

https://github.com/OpenAtomFoundation/pika/pull/2585

+

修复使用 info keyspace 后,info all 死锁的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2584

+

修复因修改 zsetscorekey comparator impl 字典序比较熟顺序,导致 353 352极端场景不兼容的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2583

+

修复 compact 死锁的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2581

+

Slotmigrate 添加 go test。

+

https://github.com/OpenAtomFoundation/pika/pull/2576

+

更新 Pika Operater 使用的 pika 版本。

+

https://github.com/OpenAtomFoundation/pika/pull/2572

+

修复 config rewrite 后 blockcache 数值异常的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2561

+

修复 slotmigrate 动态修复后值错误的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2548

+

修复 spop 可能会出现主从数据不一致的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2541

+

修复 CloseFd(it->second[i]) 出现越界的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2539

+

修复 Flushall 和 FlushDB 死锁的隐患,并删除 FlushSubDB 接口。

+

https://github.com/OpenAtomFoundation/pika/pull/2533

+

增加参数控制是否清理 tcl 测试后产生的数据文件,防止废弃数据占据磁盘。

+

https://github.com/OpenAtomFoundation/pika/pull/2507

+

2024-05-16-Pika-3.5.4-connect.png

]]>
+ + 于雨 + +
+ + <![CDATA[What's new in Pika v3.5.3 ]]> + https://www.pikiwidb.com/blog/Pika-3.5.3 + + 2024-03-27T00:00:00.000Z + + 随着 Redis 宣布采用双协议以维护其商业利益之际,PikiwiDB(Pika) 社区非常荣幸地宣布,我们的最新 v3.5.3 正式生产可用版本现已发布。

+

v3.5.3 解决了历史遗留的 Bug,引入了多项新特性。这些特性主要包括 Pika 支持 ACL、删除 Sharing 模式残留的 Slot 代码、快慢命令分离、 Redis Stream、大 key 分析工具、Pika 分布式集群支持全自动化 failover 等功能,同时,我们在 3.5.3 版本丰富了更多的自动化测试 case,提升 Pika 服务的稳定性和健壮性,会让用户感受到更为高效和稳定的使用体验,本文主要阐述本次改动的相关重大 feature、bugfix 性能提升项。

+

在深入探讨 3.5.3 版本的更新内容之前,请注意以下几点声明:

+
    +
  1. 由于商标问题,Pika 项目已更名为 PikiwiDB。文中以 PikiwiDB(Pika) 指代项目
    +https://github.com/OpenAtomFoundation/pika
  2. +
  3. 我们新创建了一个项目
    +https://github.com/OpenAtomFoundation/pikiwidb +这是一个基于 Raft 协议实现的兼容 Redis 协议的大容量 KV 数据库,主要面向强一致性数据场景,例如存储约 10TiB 规模的元数据。PikiwiDB 将专门用于指代此项目。
  4. +
  5. 我们为 PikiwiDB 设计了一个新的 logo,作为其商标,并已在相关政府机构注册。
  6. +
+

2024-03-27-Pika-3.5.3-logo

+

1 重大改进

+

1.1 PikiwiDB(Pika) 支持 ACL

+

PikiwiDB(Pika) 3.5.3 版本正式全面支持 Redis ACL,为未来在云原生 Pika 集群中支持多租户场景奠定了基础。在此之前,Pika 已经支持了 Redis 的用户认证方式,如 auth/userpass/requirepass,以及通过 pika.conf 中的 userblacklist 配置命令黑名单模式。本次更新保持了向后兼容,并支持这些已有的使用方式。

+

我们还确保 PikiwiDB(Pika) 的 ACL 实现与 Redis ACL 完全兼容,通过将 Redis 的所有 ACL TCL 测试集纳入 PikiwiDB(Pika) 的测试集中。

+

关键 PR:

+ +

1.2 混合存储模型支持 bitmap

+

在单体环境下,同时优化 PikiwiDB(Pika) 的读/写/compaction 是一项挑战。在 v3.5.2 版本中,我们引入了由缓存 Redis 和 RocksDB 构成的混合存储模型,并支持了 string/list/set/zset/hashtable 五种数据结构。在 3.5.3 版本中,我们增加了对 bitmap 的支持。

+

此外,我们在 3.5.3 版本中支持对 Redis 缓存进行动态参数调整。

+

关键 PR 链接:

+ +

1.3 快慢命令分离

+ +

1.4 Redis Stream

+

虽然 PikiwiDB(Pika) 之前支持了 Redis pubsub,但它只能进行在线消息传递。在 3.5.3 版本中,我们增加了对 Redis Stream 的有限支持,类似于消息队列(MQ),以便更安全地传递消息。为了确保数据的安全性,我们在底层引擎 BlackWidow 中特别添加了对 Stream 数据类型的支持。 +关键 PR:

+ +

1.5 云原生集群

+

在 PikiwiDB(Pika) 3.5.0 版本中,我们开源了 Pika-Operator,它支持在 K8s 上部署 Pika 主从对。在 3.5.2 版本中,我们基于 Kubeblocks 的 Pika-Operator 支持了在 K8s 上部署类似 Codis 的 Pika Cluster,但当时还不支持动态扩缩容。

+

在 3.5.3 版本中,最新的 Pika-Operator 已经支持了 Codis Group 级别的节点扩缩容,并且支持数据的 Rebalance。 +关键 PR:

+ +

PikiwiDB(Pika) 的底层磁盘存储引擎 RocksDB 在进行 compaction 时会显著影响 PikiwiDB(Pika) 的读写性能。因此,控制好 compaction 是优化 Pika 读写性能的关键。 +有关 compaction 的关键优化 PR 如下:

+ +

1.7 自动 Failover

+

PikiwiDB(Pika) 集群目前是基于 Codis 实现的。为了提高基于 Codis 的 PikiwiDB(Pika) Cluster 的易用性,我们对 Codis 进行了许多扩展。

+

原始的 Codis 不支持 Group 内的 Failover,需要使用 Redis Sentinel,这会导致运维成本增加。我们在 Codis Dashboard 中加入了 sentinel 的功能,实现了对 Group 内主从的自动 failover。

+

关键 PR:

+ +

1.8 可观测性提升

+

PikiwiDB(Pika) 的可观测性关键组件是 Pika-Exporter。在 3.5.2 版本中,我们虽然添加了 Redis Cache 缓存热数据,但缺少监控指标。在 3.5.3 版本中,我们增加了包括命中率、每秒命中次数、Redis Cache 内存使用量、Redis Cache 个数、Redis Cache DB 个数 等指标。

+

关键 PR:

+ +

关键 PR:

+ +

1.10 添加测试集

+

PikiwiDB(Pika) 测试集由 gtest 单测、Redis TCL 测试集和 Go 测试集组成:

+
    +
  • gtest 单测主要测试 Pika C++ 代码
  • +
  • Redis TCL 测试集来自 Redis,用于测试 PikiwiDB(Pika) 对 Redis 标准命令兼容度
  • +
  • Go 测试集可对 Pika 进行 Redis 命令测试、主从和 Codis 集群 e2e 测试
  • +
+

3.5.3 中添加了 Codis 集群 e2e 测试,关键 PR 如下:

+ +

1.11 工具集 +PikiwiDB(Pika) 一直重视工具集的建设,所有相关工具都可以在 https://github.com/OpenAtomFoundation/pika/tree/unstable/tools 中找到。在 3.5.3 版本中,我们新增了一个工具:

+

PikiwiDB(Pika) 支持大 key 分析工具 +https://github.com/OpenAtomFoundation/pika/pull/2195

+

1.12 文档更新

+

PikiwiDB(Pika) 的文档主要是 wiki 文档。在 3.5.3 版本中,我们更新了 Pika 支持的 Redis 命令文档。

+

文档链接: https://github.com/OpenAtomFoundation/pika/wiki/pika-%E6%94%AF%E6%8C%81%E7%9A%84redis%E6%8E%A5%E5%8F%A3%E5%8F%8A%E5%85%BC%E5%AE%B9%E6%83%85%E5%86%B5 +2 改进列表

+

在第一章节中,我们概述了 3.5.3 版本的主要功能升级和改进。下面详细列出了本次发版的相关 PR。

+

2.1 新特性

+ +

2.2 bug 修复

+ +

2.3 发版 tag +https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.3 +3 社区

+

如果你有任何疑问,欢迎加入交流群,PikiwiDB(Pika) 开源社区感谢大家的支持和帮助。

+

2024-03-27-Pika-3.5.3-connect

]]>
+ + 360 中间件团队 + +
+ + <![CDATA[What's new in Pika v3.5.0]]> + https://www.pikiwidb.com/blog/Pika-3.5.0 + + 2023-12-03T00:00:00.000Z + + Pika 社区近期发布了备受期待的 v3.5.2 版本 https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.2-alpha ,不仅解决了历史遗留的 Bug 问题,还引入了多项新特性。这些新特性主要包括 Pika 支持 Redis 事务、Pika 上层增加缓存层实现冷热数据分离、提升读性能、Codis-Proxy 支持动态修改配置参数等等,无疑将会让用户感受到更为高效和稳定的使用体验。

+

新特性

+ +

bugfix

+ +

下期版本规划

+

预计再过两个月左右,我们会在农历新年前发布 3.5.3 版本,相关关键特性有:

+ +

感谢大家对 Pika 开源公众号的关注 ,Pika 3.5 版本重大特性及使用规范我们会在稍后的文章中进行介绍,我们下期再见~

+

2023-09-28-Pika-3.5.2-connect

]]>
+ + 于雨 + +
+ + <![CDATA[What's new in Pika v3.5.1]]> + https://www.pikiwidb.com/blog/Pika-3.5.1 + + 2023-09-28T00:00:00.000Z + + Pika 社区很高兴宣布,我们今天发布已经过我们生产环境验证 v3.5.1 版本 https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.1

+

该版本不仅做了很多优化工作,还引入了多项新功能。这些新功能包括 动态关闭 WAL、ReplicationID 检测是否增量复制、在 K8s 环境上 Pika 服务的自动注册从而实现集群的自组织、以及 exporter 检测集群指标等等,无疑将会让用户享受到更为稳定和高效的 NoSQL 使用体验。

+

新特性

+
    +
  • 1 Slow log 增加队列等待时间统计,在队列阻塞的时候方便我们进行问题定位。PR 1997, 作者 wangshao1。
  • +
  • 2 主从复制使用 ReplicationID 判断是否进行增量同步,解决原主从同步方式切主后整个数据集会进行全量复制的问题,可以提升 Pika 性能。PR 1951, 作者 Mixficsol。
  • +
  • 3 WAL 以 'disablewal' 命令方式支持动态关闭,在写性能遇到瓶颈的时候,可以通过命令关闭 WAL 缓解写性能下降的问题,关闭 WAL 有机器宕机后丢失数据的风险,用户需要根据自己的使用习惯权衡。PR 2015,作者 Mixficsol。
  • +
  • 4 flush 线程数和 compaction 线程数合二为一,在 Compaction 性能瓶颈时,可以动态调整线程数,缓解 Comapction 损耗 Pika 性能的问题。PR 2014, 作者 Tianpingan。
  • +
  • 5 升级了 RocksDB 版本到 v8.3.3。PR 2000, 作者 dingxiaoshuai123。
  • +
  • 6 新增周期性打印工作队列的长度功能,在队列阻塞的时候可以快速定位问题。PR 1978, 作者 Tianpingan。
  • +
  • 7 新增利用一个 pika_exporter 监测整个集群的指标,实现一个 Pika Exporter 实例监控整个集群,解决了 3.5.0 版本一个 Pika Exporter 监测一个 Pika 实例消耗资源的问题。PR 1953, 作者 chenbt-hz。
  • +
  • 8 实现在 K8s 环境上 Pika 服务的自动注册,在启动时自动注册,从而实现集群的自组织 ,实现了通过命令拉起整个 Pika Cluster 集群。PR 1931, 作者 machinly。
  • +
+

2 bug 修复

+
    +
  • 1 调整了 Rate_limit 参数,修复了压测时出现 RPS 为 0 的情况 。PR 2009, 作者 Mixficsol。
  • +
  • 2 修复了 INFODATA 命令中对于遍历数据文件时出现空路径的逻辑判断。PR 1996, 作者 Mixficsol。
  • +
  • 3 修复了 Codis 在线上出现大毛刺的问题。PR 2016, 作者 chejinge。
  • +
  • 4 修复了 macOS 环境下编译使用 tools 导致编译不过的问题 。PR 2011, 作者 A2ureStone。
  • +
  • 5 减少了 exporter 非必要日志的打印,降低 了资源利用率。PR 1945, 作者 Mixficsol。
  • +
+

3 使用建议

+

本次新增了几个配置参数,大家在使用过程中,需要根据使用情况按需调整:

+
    +
  • 1 max-rsync-parallel-num:主从全量复制线程数,需要根据自己机器 CPU 核数和部署实例个数进行调整,建议最小设置为 2。
  • +
  • 2 rate-limiter-bandwidth: 限制 RocksDB 数据库读写速度,限制数据库在一定时间内可以读写的数据量,默认 2000MiB/s,需要根据自己的机器性能和部署实例做调整。
  • +
  • max-background-jobs: compaction 和 flushdb 线程数,要根据自己机器 CPU 核数和部署实例个数进行调整,建议最小设置为 4。
  • +
  • 3 throttle-bytes-per-second: 主从复制传输限速参数,默认为 200MiB/s,该参数可以根据机器网卡的配置及部署 pika 实例的个数进行调整。
  • +
+

2023-09-28-Pika-3.5.1-connect.png

]]>
+ + 于雨 + +
+ + <![CDATA[What's new in Pika v3.5.0]]> + https://www.pikiwidb.com/blog/Pika-3.5.0 + + 2023-08-25T00:00:00.000Z + + Pika 社区近期发布了备受期待的 v3.5.2 版本 https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.2-alpha ,不仅解决了历史遗留的 Bug 问题,还引入了多项新特性。这些新特性主要包括 Pika 支持 Redis 事务、Pika 上层增加缓存层实现冷热数据分离、提升读性能、Codis-Proxy 支持动态修改配置参数等等,无疑将会让用户感受到更为高效和稳定的使用体验。

+

新特性

+ +

bugfix

+ +

下期版本规划

+

预计再过两个月左右,我们会在农历新年前发布 3.5.3 版本,相关关键特性有:

+ +

感谢大家对 Pika 开源公众号的关注 ,Pika 3.5 版本重大特性及使用规范我们会在稍后的文章中进行介绍,我们下期再见~

+

2023-09-28-Pika-3.5.2-connect

]]>
+ + 于雨 + +
+ + <![CDATA[Pika Blackwidow 引擎数据存储格式]]> + https://www.pikiwidb.com/blog/pika-blackwidow + + 2020-07-16T00:00:00.000Z + + Blackwidow本质上是基于rocksdb的封装,使本身只支持kv存储的rocksdb能够支持多种数据结构, 目前Blackwidow支持五种数据结构的存储:String结构(实际上就是存储key, value), Hash结构,List结构,Set结构和ZSet结构, 因为Rocksdb的存储方式只有kv一种, 所以上述五种数据结构最终都要落盘到Rocksdb的kv存储方式上,下面我们展示Blackwidow和rocksdb的关系并且说明我们是如何用kv来模拟多数据结构的。

+

pika-blackwidow-1

+

1. String结构的存储

+

String本质上就是Key, Value, 我们知道Rocksdb本身就是支持kv存储的, 我们为了实现Redis中的expire功能,所以在value后面添加了4 Bytes用于存储timestamp, 作为最后Rocksdb落盘的kv格式,下面是具体的实现方式:

+

pika-blackwidow-2

+

如果我们没有对该String对象设置超时时间,则timestamp存储的值就是默认值0, 否则就是该对象过期时间的时间戳, 每次我们获取一个String对象的时候, 首先会解析Value部分的后四字节, 获取到timestamp做出判断之后再返回结果。

+

2. Hash结构的存储

+

blackwidow中的hash表由两部分构成,元数据(meta_key, meta_value), 和普通数据(data_key, data_value), 元数据中存储的主要是hash表的一些信息, 比如说当前hash表的域的数量以及当前hash表的版本号和过期时间(用做秒删功能), 而普通数据主要就是指的同一个hash表中一一对应的field和value,作为具体最后Rocksdb落盘的kv格式,下面是具体的实现方式:

+
    +
  1. 每个hash表的meta_key和meta_value的落盘方式: +pika-blackwidow-3
  2. +
+

meta_key实际上就是hash表的key, 而meta_value由三个部分构成: 4Bytes的Hash size(用于存储当前hash表的大小) + 4Bytes的Version(用于秒删功能) + 4Bytes的Timestamp(用于记录我们给这个Hash表设置的超时时间的时间戳, 默认为0)

+
    +
  1. hash表中data_key和data_value的落盘方式: +pika-blackwidow-4
  2. +
+

data_key由四个部分构成: 4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + Field的内容, 而data_value就是hash表某个field对应的value。

+
    +
  1. 如果我们需要查找一个hash表中的某一个field对应的value, 我们首先会获取到meta_value解析出其中的timestamp判断这个hash表是否过期, 如果没有过期, 我们可以拿到其中的version, 然后我们使用key, version,和field拼出data_key, 进而找到对应的data_value(如果存在的话)
  2. +
+

3. List结构的存储

+

blackwidow中的list由两部分构成,元数据(meta_key, meta_value), 和普通数据(data_key, data_value), 元数据中存储的主要是list链表的一些信息, 比如说当前list链表结点的的数量以及当前list链表的版本号和过期时间(用做秒删功能), 还有当前list链表的左右边界(由于nemo实现的链表结构被吐槽lrange效率低下,所以这次blackwidow我们底层用数组来模拟链表,这样lrange速度会大大提升,因为结点存储都是有序的), 普通数据实际上就是指的list中每一个结点中的数据,作为具体最后Rocksdb落盘的kv格式,下面是具体的实现方式

+
    +
  1. 每个list链表的meta_key和meta_value的落盘方式: +pika-blackwidow-5
  2. +
+

meta_key实际上就是list链表的key, 而meta_value由五个部分构成: 8Bytes的List size(用于存储当前链表中总共有多少个结点) + 4Bytes的Version(用于秒删功能) + 4Bytes的Timestamp(用于记录我们给这个List链表设置的超时时间的时间戳, 默认为0) + 8Bytes的Left Index(数组的左边界) + 8Bytes的Right Index(数组的右边界)

+
    +
  1. list链表中data_key和data_value的落盘方式: +pika-blackwidow-6
  2. +
+

data_key由四个部分构成: 4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + 8Bytes的Index(这个记录的就是当前结点的在这个list链表中的索引), 而data_value就是list链表该node中存储的值

+

4. Set结构的存储

+

blackwidow中的set由两部分构成,元数据(meta_key, meta_value), 和普通数据(data_key, data_value), 元数据中存储的主要是set集合的一些信息, 比如说当前set集合member的数量以及当前set集合的版本号和过期时间(用做秒删功能), 普通数据实际上就是指的set集合中的member,作为具体最后Rocksdb落盘的kv格式,下面是具体的实现方式:

+
    +
  1. 每个set集合的meta_key和meta_value的落盘方式: +pika-blackwidow-7
  2. +
+

meta_key实际上就是set集合的key, 而meta_value由三个部分构成: 4Bytes的Set size(用于存储当前Set集合的大小) + 4Bytes的Version(用于秒删功能) + 4Bytes的Timestamp(用于记录我们给这个set集合设置的超时时间的时间戳, 默认为0)

+
    +
  1. set集合中data_key和data_value的落盘方式: +pika-blackwidow-8
  2. +
+

data_key由四个部分构成: 4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + member的内容, 由于set集合只需要存储member, 所以data_value实际上就是空串

+

5. ZSet结构的存储

+

blackwidow中的zset由两部部分构成,元数据(meta_key, meta_value), 和普通数据(data_key, data_value), 元数据中存储的主要是zset集合的一些信息, 比如说当前zset集合member的数量以及当前zset集合的版本号和过期时间(用做秒删功能), 而普通数据就是指的zset中每个member以及对应的score, 由于zset这种数据结构比较特殊,需要按照memer进行排序,也需要按照score进行排序, 所以我们对于每一个zset我们会按照不同的格式存储两份普通数据, 在这里我们称为member to score和score to member,作为具体最后Rocksdb落盘的kv格式,下面是具体的实现方式:

+
    +
  1. 每个zset集合的meta_key和meta_value的落盘方式: +
  2. +
+

meta_key实际上就是zset集合的key, 而meta_value由三个部分构成: 4Bytes的ZSet size(用于存储当前zSet集合的大小) + 4Bytes的Version(用于秒删功能) + 4Bytes的Timestamp(用于记录我们给这个Zset集合设置的超时时间的时间戳, 默认为0)

+
    +
  1. 每个zset集合的data_key和data_value的落盘方式(member to score): +
  2. +
+

member to socre的data_key由四个部分构成:4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + member的内容, data_value中存储的其member对应的score的值,大小为8个字节,由于rocksdb默认是按照字典序进行排列的,所以同一个zset中不同的member就是按照member的字典序来排列的(同一个zset的key size, key, 以及version,也就是前缀都是一致的,不同的只有末端的member).

+
    +
  1. 每个zset集合的data_key和data_value的落盘方式(score to member): +
  2. +
+

score to member的data_key由五个部分构成:4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + 8Bytes的Score + member的内容, 由于score和member都已经放在data_key中进行存储了所以data_value就是一个空串,无需存储其他内容了,对于score to member中的data_key我们自己实现了rocksdb的comparator,同一个zset中score to member的data_key会首先按照score来排序, 在score相同的情况下再按照member来排序

+

Blackwidow相对于Nemo有哪些优势

+
    +
  1. Blackwidow采用了rocksdb的column families的新特性,将元数据和实际数据分开存放(对应于上面的meta数据和data数据), 这种存储方式相对于Nemo将meta, data混在一起存放更加合理, 并且可以提升查找效率(比如info keyspace的效率会大大提升)
  2. +
  3. Blackwidow中参数传递大量采用Slice而Nemo中采用的是std::string, 所以Nemo会有很多没有必要的string对象的构造函数以及析构函数的调用,造成额外的资源消耗,而Blackwidow则不会有这个问题
  4. +
  5. Blackwidow对kv模拟多数据结构的存储格式上做了重新设计(具体可以参考Nemo引擎数据存储格式和本篇文章),使之前在Nemo上出现的一些无法解决的性能问题得以解决,所以Blackwidow的多数据结构在某些场景下性能远远优于Nemo
  6. +
  7. 原来Nemo对多数据结构的Key的长度最大只能支持到256 Bytes,而Blackwidow经过重新设计,放开了多数据结构Key长度的这个限制
  8. +
  9. Blackwidow相对于Nemo更加节省空间,Nemo由于需要nemo-rocksdb的支持,所以不管在meta还是data数据部分都追加了version和timestamp这些信息,并且为了区分meta_key和data_key, 在最前面加入s和S(拿Set数据结构打比方),Blackwidow在这方面做了优化,使同样的数据量下Blackwidow所占用的空间比Nemo要小(举个例子,Blackwidow中List结构中的一个Node就比Nemo中的一个Node节省了16 Bytes的空间)
  10. +
  11. Blackwidow在锁的实现上参照了RocksDB事务里锁的实现方法,而弃用了之前Nemo的行锁,所以在多线程对同一把锁有抢占的情况下性能会有所提升
  12. +
]]>
+ + Axlgrep + +
+ + <![CDATA[pika_port 迁移工具]]> + https://www.pikiwidb.com/blog/Pika-Tools-Port-Bin + + 2020-04-26T00:00:00.000Z + + 项目作者: +

AlexStocks

+

适用版本:

+

3.1 和 2.x

+

项目地址:

+

https://github.com/ipixiu/pika-tools

+

https://github.com/Axlgrep/pika-tools 长期维护地址需自行编译

+

二进制包:

+

https://github.com/ipixiu/pika-port-bin

+

功能:

+

将Pika中的数据在线迁移到Pika、Redis(支持全量、增量同步)

+

开发背景:

+

之前Pika项目官方提供的pika_to_redis工具仅支持离线将Pika的DB中的数据迁移到Pika、Redis, 且无法增量同步,该工具可以直接伪装为一个Pika的从库,将主库数据通过同步获取并转发给Pika、Redis,同时并支持增量同步

+

实现:

+

trysync线程

+
    +
  1. 尝试与主库建立同步关系
  2. +
  3. 如果需要全同步,则在接收到master的db之后,启动migrator和sender线程将db里面的数据发送给Pika、Redis
  4. +
  5. 启动Slaveping线程定期给主库发送心跳,完成建立主从关系
  6. +
+

binlog_receiver线程

+
    +
  1. 接收主库发送过来的binlog并且将其解析成redis命令
  2. +
  3. 将redis命令转发给Pika、Redis
  4. +
+

migrator线程

+
    +
  1. 扫描不同数据类型的分库
  2. +
  3. 将key进行解析成响应数据Pika、redis指令
  4. +
  5. 将解析好的redis指令加载到sender的发送buf中
  6. +
+

sender线程

+
    +
  1. 从发送buf中读取数据,以非阻塞方式向Pika、redis发送数据
  2. +
  3. 接收Pika、redis返回的结果并解析,如果出现错误则显示错误结果
  4. +
+

使用帮助:

+
Usage: 
pika_port [-h] [-t local_ip -p local_port -i master_ip -o master_port
-m forward_ip -n forward_port -x forward_thread_num -y forward_passwd]
-f filenum -s offset -w password -r rsync_dump_path -l log_path
-h -- show this help
-t -- local host ip(OPTIONAL default: 127.0.0.1)
-p -- local port(OPTIONAL)
-i -- master ip(OPTIONAL default: 127.0.0.1)
-o -- master port(REQUIRED)
-m -- forward ip(OPTIONAL default: 127.0.0.1)
-n -- forward port(REQUIRED)
-x -- forward thread num(OPTIONAL default: 1)
-y -- forward password(OPTIONAL)
-f -- binlog filenum(OPTIONAL default: local offset)
-s -- binlog offset(OPTIONAL default: local offset)
-w -- password for master(OPTIONAL)
-r -- rsync dump data path(OPTIONAL default: ./rsync_dump)
-l -- local log path(OPTIONAL default: ./log)
-b -- max batch number when port rsync dump data (OPTIONAL default: 512)
-d -- daemonize(OPTIONAL)
example: ./pika_port -t 127.0.0.1 -p 12345 -i 127.0.0.1 -o 9221 -m 127.0.0.1 -n 6379 -x 7 -f 0 -s 0 -w abc -l ./log -r ./rsync_dump -b 512 -d
]]>
+ + 于雨 + +
+
\ No newline at end of file diff --git a/build/blog/index.html b/build/blog/index.html new file mode 100644 index 0000000..4487be3 --- /dev/null +++ b/build/blog/index.html @@ -0,0 +1,1037 @@ + + + + + +Blog | PikiwiDB(Pika) + + + + + + + + + +

What's new in PikiwiDB(Pika) v4.0.0

· 阅读需 18 分钟
360 车金鸽
Pika 开源社区

尊敬的社区成员及技术爱好者们: +PikiwiDB 社区荣耀地宣告——经过 9 个月打磨并在生产环境稳定运行 5 个月的 PikiwiDB(Pika) v4.0.0 【下文简称 Pika】今天正式发布。希望基于第三代存储引擎 Floyd 的这个新版本能为社区用户们带来更卓越的体验。

+

1 重大改进

+

1.1 第三代存储引擎 Floyd +Floyd 如同其前代 Blackwidow,基于 RocksDB,不仅支持基础的 String 结构,也原生支持了 Hash、List、Set、Stream及 ZSet 等 KKV 形式的复合数据结构。

+
    +
  • RocksDB 实例数可配置
  • +
+

摒弃了 Blackwidow 按数据类型采用 RocksDB 实例的物理隔离模式,Floyd 采用了 RocksDB 的 Column-Family 虚拟隔离机制,在单个 RocksDB 实例下可存储所有类型的数据。用户可自由设定 Pika 实例中每个 DB【等同于Redis DB】中 RocksDB 实例的数量,而数据的存储则依据 key 的 hash 值分配至相应的 RocksDB 实例,减小了数据的空间放大和读放大效应,实现了机器资源的高效利用。

+
    +
  • 禁止重复 key
  • +
+

2024-05-16-PikiwiDB(Pika)-4.0.0-key +基于 RocksDB 的 Column-Family 虚拟隔离机制,Floyd 把所有类型的 key 和 string 一起存储在 Column-Family 0。在此存储基础之上,可明确禁止不同类型的 key 重复,这一设计旨在杜绝潜在的数据冗余与不一致性,与 Redis 服务特性保持一致,进一步提升了系统的整体效率与数据质量。

+
    +
  • Floyd 详细说明
  • +
+

如果对 Floyd 存储引擎感兴趣,请详阅《Floyd 存储引擎》【链接:https://github.com/OpenAtomFoundation/pika/discussions/2052】。由于 Floyd 前后进行了多个版本的迭代,所以阅读该 github discussion 文档时请注意前后时间,如有相关冲突性说法,以最新日期的文字为准。

+

关键 PR:

+ +

1.2 Mget 批量查询缓存

+

Pika v3.5.2 的热数据缓存只实现了对热点 Key 的点查(如get/hget),在后续的 v3.5.3 和 v3.5.4 修复若干 bug 后,对热数据的点查目前已经非常稳定。然而并未支持批量查询(如 mget etc)。 +内部业务侧反馈批量查询速度比较慢,在 40C/256GiB/2TiB SATA SSD 规格机器上数据量超过 100GiB 时,Pika v3.3.6 30% 批量查询延迟超过 35ms。但由于 Pika 热数据缓存尚未支持批量查询,性能并未改善。

+

为了满足业务需求,Pika 团队开发了批量查询热数据缓存功能,显著提升了批量查询性能,降低了查询延迟和失败率。相关技术细节请阅读《PikiwiDB (Pika) 混合存储之批量查询》 【链接:https://mp.weixin.qq.com/s/KFLPruSdB66TMRxUfR9PbQ 】。

+

关键 PR :

+ +

1.3 主从复制

+

Pika v3.3.6 有很多主从复制的缺陷。v4.0.0 版本对 Pika 全量复制及增量复制进行了大量优化和 bug 修复,取得了非常好的效果。 +并在 info 命令中输出了 "repl_connect_status" 指标(PR 2638),以方便用户更加明确清晰的确定当前的主从复制状态。

+

关键 PR :

+ +

1.4 Redis Stream

+

Redis Stream 类似于消息队列(MQ),以便更安全地传递消息。为了确保数据的安全性,底层引擎 BlackWidow 和 Floyd 中特别添加了对 Stream 数据类型的支持。 +关键 PR:

+ +

1.5 Compaction

+

PikiwiDB(Pika) 的底层磁盘存储引擎 RocksDB 在进行 compaction 时会显著影响 PikiwiDB(Pika) 的读写性能。因此,控制好 compaction 是优化 Pika 读写性能的关键。

+

Floyd 使用了 v8.7.3 版本的 RocksDB,开放了更多 RocksDB 参数,以方便用户优化 RocksDB 性能:

+
    +
  • enable-partitioned-index-filters: 支持加载分区索引过滤器,加快 RocksDB 查找速度。
  • +
  • min-write-buffer-number-to-merge: 默认值为 1,如果将此值设置得更大,意味着需要更多的写缓冲区被填满后才进行 flush。这样可以减少 flush 的频率,增加数据在内存中的累积量,从而可能提高写入吞吐量。
  • +
  • level0-stop-writes-trigger: 默认值为 36,定义了 L0 层中 sst 文件的最大数量,一旦达到这个数量,RocksDB 将会采取 暂停写入、强制 compaction 等措施来防止写入操作继续累积,以避免 L0 层变得过于庞大,进而可能导致写入放大、查询性能下降等问题。
  • +
  • level0-slowdown-writes-trigger:默认值为 20,用于控制当 Level 0 的 SST 文件数量达到这个阈值时,触发写减速(write slowdown),防止 Level 0 的文件数量过多,导致后续 compaction 操作的压力过大。
  • +
  • level0-file-num-compaction-trigger:默认值为 4,当 Level 0 的 SST 文件数量达到这个参数设定的阈值时,RocksDB 会开始执行 compaction 操作,将 Level 0 的文件合并到 Level 1,以减少 Level 0 的文件数量,降低读取延迟,并优化存储空间的利用率。
  • +
  • max-subcompactions:默认值为 1,用于控制RocksDB 中并发执行的 sub-compaction 任务数量,其值为 1 表示关闭 sub-compaction。如果系统资源充足,建议提升该参数以优化 compaction 效率。
  • +
  • max-bytes-for-level-base:指定了 L1 SST 文件总的大小。这个大小是 RocksDB 进行数据分层管理和 compaction 决策的重要依据:如果 L1 层的大小设置得太小,可能会导致 L0 层的 compaction 过于频繁,进而影响写性能。反之,如果设置得太大,可能会占用较多的磁盘空间,并且影响读取性能,因为读取操作可能需要跨越更多的层级。Pika 没有在 pika.conf 中开放此参数给用户配置,而是使用其他参数(level0-file-num-compaction-trigger 和 write-buffer-size)计算后的结果。
  • +
+

storage_options_.options.max_bytes_for_level_base = g_pika_conf->level0_file_num_compaction_trigger() * g_pika_conf->write_buffer_size()

+

关键 PR: +添加 Floyd 的 compaction-filter 的 Gtest +https://github.com/OpenAtomFoundation/pika/pull/2669 +添加支持分区索引过滤的功能 +https://github.com/OpenAtomFoundation/pika/pull/2601 +新增 RocksDB Compaction 策略动态调整参数,用户可以根据业务调整 Compaction 策略,降低 Compaction 操作对服务性能的损耗 +https://github.com/OpenAtomFoundation/pika/pull/2538 +1.6 可观测性 +v3.5 版本增加了包括命中率、每秒命中次数、Redis Cache 内存使用量、Redis Cache 个数、Redis Cache DB 个数 等指标,但是在集群方面的可观测性是缺失的。v4.0.0 对 Codis-Proxy 的 P99、P999、延迟等监控指标进行采集和展示,可以直观地反映线上 Codis-proxy 的运行情况。

+

v4.0.0 开始还提供新的工具:根据 pika benchmark 工具压测结果自动生成可视化的统计图表。

+

关键 PR: +Codis 支持 info 命令, 可以通过该命令查询 Codis-proxy 的 info 信息 +https://github.com/OpenAtomFoundation/pika/pull/2688 +Codis-proxy 新增 P99 P95 等监控耗时指标 +https://github.com/OpenAtomFoundation/pika/pull/2668 +添加 Pika 压测指标,提升 Pika 压测效率,并输出可视化的统计图表 +https://github.com/OpenAtomFoundation/pika/pull/2663

+

1.7 测试集 +PikiwiDB(Pika) 测试集由 gtest 单测、Redis TCL 测试集和 Go 测试集组成。v4.0.0 中丰富了诸多特性的 go test 功能,并进一步完善了基本数据类型的 TCL 测试。 +关键 PR: +添加 Floyd 的 compaction-filter 的 Gtest +https://github.com/OpenAtomFoundation/pika/pull/2669 +Pika Geo 数据类型增加 TCL 测试,并修复测试过程中遇到的缺陷 +https://github.com/OpenAtomFoundation/pika/pull/2753 +1.8 跨平台 +PikiwiDB(Pika) 以往仅支持 centos 和 ubuntu 等 linux 平台,v3.5 开始支持 Mac 等平台。v4.0.0 将对 Mac 平台的支持扩展至 FreeBSD 平台。 +关键 PR: +Pika 支持在 FreeBSD14 平台上进行编译 +https://github.com/OpenAtomFoundation/pika/pull/2711 +2 改进列表 +下面详细列出了本次发版的主要功能升级和改进。 +2.1 新特性

+ +

2.2 bug 修复

+ +

2.3 提升改进项

+ +

2.4 发版 tag

+

https://github.com/OpenAtomFoundation/pika/releases/tag/v4.0.0 +3 社区 +感谢所有为 v4.0.0 做出贡献的社区成员,包括 issue/PR 提交者、代码 reviewer 【排名不分先后,依据字母序列】:

+

AlexStocks

+

baerwang

+

chejinge

+

cheniujh

+

chienguo

+

guangkun123

+

gukj-spel

+

longfar-ncy

+

lqxhub

+

luky116

+

Mixficsol

+

saz97

+

wangshao1

+

PikiwiDB (Pika) 开源社区热烈欢迎您的参与和支持。如果您有任何问题、意见或建议,请扫码添加 PikiwiDB 小助手【微信号: PikiwiDB】为好友,它会拉您加入官方微信群。

+

2024-07-08-PikiwiDB(Pika)-4.0.0-connect

What's new in Pika v3.5.4

· 阅读需 6 分钟
于雨
dubbogo示土区

PikiwiDB(Pika) 社区非常荣幸地宣布,我们的最新 v3.5.4 正式生产可用版本现已发布。 +v3.5.4 解决了历史遗留的 bug,对 PikiwiDB(Pika) 的一些遗留 bug 进行修复和优化,旨在打造出一个高稳定性的版本。本次的重点优化主要包括,PikiwiDB(Pika)支持动态调整限速参数、增强 PikiwiDB(Pika) 的客观测性指标、 磁盘 IO 限速支持读限速及写限速等。 +1 新特性

+
    +
  1. Pika 支持动态调整全量同步限速参数 rsync-timeout-ms 和 throttle-bytes-per-second。
  2. +
+

自 v3.5.0 版本开始,PikiwiDB(Pika) 服务摒弃了通过子进程内使用原来 rsync 工具进行主从全量同步的逻辑,在 PikiwiDB(Pika) 内部以线程方式【称作 rsync 线程】自行实现了新的全量同步逻辑,避免因为外部进程不可控引起的主从同步问题,根据 360 内部 Pika 线上大规模集群运维的经验,在 PikiwiDB(Pika) 主从进行全量同步的过程中,如果遇到某些不利的外部因素,如网络波动,硬件故障(如网卡降速导致的主从网卡速率不匹配)等,可能引起 rsync 线程请求持续超时(PikiwiDB(Pika) 内置 rsync 模块用于全量同步阶段的文件传输),且超时重试所发出的包可能引发更大的网络信道负担。此时对于运维人员来说,如果能动态调整 rsync 请求的超时时间和 rsync 传输的速率上限,不仅意味着对全量同步阶段控制粒度的进一步细化,更大大降低了在该场景下的运维处置难度。

+

关键PR:

+

https://github.com/OpenAtomFoundation/pika/pull/2633

+
    +
  1. 将 info key space 1 的结果输出至 info all 并展示到监控界面中。
  2. +
+

PikiwiDB(Pika) 是通过 Info 命令采集数据至 Pika-Exporter,展示到 Grafana 界面上的,目前界面上部分数据是没有展示的,如 keys 的数量,本次将执行 info keyspace 的结果展示到监控界面,用户可以通过这个指标来查看存储的量级等。

+

关键PR:

+

https://github.com/OpenAtomFoundation/pika/pull/2603

+

3.Pika 磁盘IO 限速参数支持 OnlyRead、OnlyWrite、ReadAndWrite,默认支持OnlyWrite。

+

自3.5.0版本开始,PikiwiDB(Pika) 服务可以通过调整 rate-limit 参数实现写限速,防止在网卡质量不高的情况下磁盘 IO 过重导致服务不可用,或者 binlog 阻塞的情况发生。360内部 Pika 线上大规模集群运维的经验,在 PikiwiDB(Pika) 实例的网卡较差情况下,也需要对读实例进行限速,本次修改支持读、写限速,默认是写限速,调整 config 配置中的 rate-limiter-mode 可以设置为读限速,或者同时读写限速。

+

关键PR:

+

https://github.com/OpenAtomFoundation/pika/pull/2599

+

2 改进列表

+

slotmigrate 添加 go test。

+

https://github.com/OpenAtomFoundation/pika/pull/2576

+

INFO 命令耗时优化,降低查磁盘频率,避免因为数据采集调用 info 命令时查磁盘太过频繁导致服务性能下降。

+

https://github.com/OpenAtomFoundation/pika/pull/2554

+

对五种基本数据类型命令增加 Redis tcl 测试。

+

https://github.com/OpenAtomFoundation/pika/pull/2527

+

3 Bug 修复

+

修复使用 Pika Exporter 时可能会出现 slots 分配不均衡的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2651

+

修复 Codis dashboard 不能正确更新 master 实例状态的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2650

+

修复 Redis 事务 binlog 解析失败导致的主从同步异常问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2642

+

修复 Pika Expoter 启动时不带参数导致启动失败问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2640

+

修复使用 Pika Operater 拉起集群 Codis-proxy panic 的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2633

+

修复 CI 编译出的二进制进行自动化测试时 cp 命令失败问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2614

+

修复变量未初始化导致 cache 启动失败的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2613

+

修复 userpass 和 userblacklist 动态修改参数功能异常问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2600

+

修复 scard sscan 结果不一致的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2596

+

修复当 max-rsync-parallel-num 大于4,slave 会在主从复制时 coredump 的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2595

+

调整不常用的线程池线程数,避免因为空跑导致性能损耗。

+

https://github.com/OpenAtomFoundation/pika/pull/2590

+

修复 Pika 事务边缘测试 case 不通过的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2586

+

将 cache-model 修改成 cache-mode。

+

https://github.com/OpenAtomFoundation/pika/pull/2585

+

修复使用 info keyspace 后,info all 死锁的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2584

+

修复因修改 zsetscorekey comparator impl 字典序比较熟顺序,导致 353 352极端场景不兼容的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2583

+

修复 compact 死锁的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2581

+

Slotmigrate 添加 go test。

+

https://github.com/OpenAtomFoundation/pika/pull/2576

+

更新 Pika Operater 使用的 pika 版本。

+

https://github.com/OpenAtomFoundation/pika/pull/2572

+

修复 config rewrite 后 blockcache 数值异常的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2561

+

修复 slotmigrate 动态修复后值错误的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2548

+

修复 spop 可能会出现主从数据不一致的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2541

+

修复 CloseFd(it->second[i]) 出现越界的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2539

+

修复 Flushall 和 FlushDB 死锁的隐患,并删除 FlushSubDB 接口。

+

https://github.com/OpenAtomFoundation/pika/pull/2533

+

增加参数控制是否清理 tcl 测试后产生的数据文件,防止废弃数据占据磁盘。

+

https://github.com/OpenAtomFoundation/pika/pull/2507

+

2024-05-16-Pika-3.5.4-connect.png

What's new in Pika v3.5.3

· 阅读需 15 分钟
360 中间件团队
Pika 开源社区

随着 Redis 宣布采用双协议以维护其商业利益之际,PikiwiDB(Pika) 社区非常荣幸地宣布,我们的最新 v3.5.3 正式生产可用版本现已发布。

+

v3.5.3 解决了历史遗留的 Bug,引入了多项新特性。这些特性主要包括 Pika 支持 ACL、删除 Sharing 模式残留的 Slot 代码、快慢命令分离、 Redis Stream、大 key 分析工具、Pika 分布式集群支持全自动化 failover 等功能,同时,我们在 3.5.3 版本丰富了更多的自动化测试 case,提升 Pika 服务的稳定性和健壮性,会让用户感受到更为高效和稳定的使用体验,本文主要阐述本次改动的相关重大 feature、bugfix 性能提升项。

+

在深入探讨 3.5.3 版本的更新内容之前,请注意以下几点声明:

+
    +
  1. 由于商标问题,Pika 项目已更名为 PikiwiDB。文中以 PikiwiDB(Pika) 指代项目
    +https://github.com/OpenAtomFoundation/pika
  2. +
  3. 我们新创建了一个项目
    +https://github.com/OpenAtomFoundation/pikiwidb +这是一个基于 Raft 协议实现的兼容 Redis 协议的大容量 KV 数据库,主要面向强一致性数据场景,例如存储约 10TiB 规模的元数据。PikiwiDB 将专门用于指代此项目。
  4. +
  5. 我们为 PikiwiDB 设计了一个新的 logo,作为其商标,并已在相关政府机构注册。
  6. +
+

2024-03-27-Pika-3.5.3-logo

+

1 重大改进

+

1.1 PikiwiDB(Pika) 支持 ACL

+

PikiwiDB(Pika) 3.5.3 版本正式全面支持 Redis ACL,为未来在云原生 Pika 集群中支持多租户场景奠定了基础。在此之前,Pika 已经支持了 Redis 的用户认证方式,如 auth/userpass/requirepass,以及通过 pika.conf 中的 userblacklist 配置命令黑名单模式。本次更新保持了向后兼容,并支持这些已有的使用方式。

+

我们还确保 PikiwiDB(Pika) 的 ACL 实现与 Redis ACL 完全兼容,通过将 Redis 的所有 ACL TCL 测试集纳入 PikiwiDB(Pika) 的测试集中。

+

关键 PR:

+ +

1.2 混合存储模型支持 bitmap

+

在单体环境下,同时优化 PikiwiDB(Pika) 的读/写/compaction 是一项挑战。在 v3.5.2 版本中,我们引入了由缓存 Redis 和 RocksDB 构成的混合存储模型,并支持了 string/list/set/zset/hashtable 五种数据结构。在 3.5.3 版本中,我们增加了对 bitmap 的支持。

+

此外,我们在 3.5.3 版本中支持对 Redis 缓存进行动态参数调整。

+

关键 PR 链接:

+ +

1.3 快慢命令分离

+ +

1.4 Redis Stream

+

虽然 PikiwiDB(Pika) 之前支持了 Redis pubsub,但它只能进行在线消息传递。在 3.5.3 版本中,我们增加了对 Redis Stream 的有限支持,类似于消息队列(MQ),以便更安全地传递消息。为了确保数据的安全性,我们在底层引擎 BlackWidow 中特别添加了对 Stream 数据类型的支持。 +关键 PR:

+ +

1.5 云原生集群

+

在 PikiwiDB(Pika) 3.5.0 版本中,我们开源了 Pika-Operator,它支持在 K8s 上部署 Pika 主从对。在 3.5.2 版本中,我们基于 Kubeblocks 的 Pika-Operator 支持了在 K8s 上部署类似 Codis 的 Pika Cluster,但当时还不支持动态扩缩容。

+

在 3.5.3 版本中,最新的 Pika-Operator 已经支持了 Codis Group 级别的节点扩缩容,并且支持数据的 Rebalance。 +关键 PR:

+ +

PikiwiDB(Pika) 的底层磁盘存储引擎 RocksDB 在进行 compaction 时会显著影响 PikiwiDB(Pika) 的读写性能。因此,控制好 compaction 是优化 Pika 读写性能的关键。 +有关 compaction 的关键优化 PR 如下:

+ +

1.7 自动 Failover

+

PikiwiDB(Pika) 集群目前是基于 Codis 实现的。为了提高基于 Codis 的 PikiwiDB(Pika) Cluster 的易用性,我们对 Codis 进行了许多扩展。

+

原始的 Codis 不支持 Group 内的 Failover,需要使用 Redis Sentinel,这会导致运维成本增加。我们在 Codis Dashboard 中加入了 sentinel 的功能,实现了对 Group 内主从的自动 failover。

+

关键 PR:

+ +

1.8 可观测性提升

+

PikiwiDB(Pika) 的可观测性关键组件是 Pika-Exporter。在 3.5.2 版本中,我们虽然添加了 Redis Cache 缓存热数据,但缺少监控指标。在 3.5.3 版本中,我们增加了包括命中率、每秒命中次数、Redis Cache 内存使用量、Redis Cache 个数、Redis Cache DB 个数 等指标。

+

关键 PR:

+ +

关键 PR:

+ +

1.10 添加测试集

+

PikiwiDB(Pika) 测试集由 gtest 单测、Redis TCL 测试集和 Go 测试集组成:

+
    +
  • gtest 单测主要测试 Pika C++ 代码
  • +
  • Redis TCL 测试集来自 Redis,用于测试 PikiwiDB(Pika) 对 Redis 标准命令兼容度
  • +
  • Go 测试集可对 Pika 进行 Redis 命令测试、主从和 Codis 集群 e2e 测试
  • +
+

3.5.3 中添加了 Codis 集群 e2e 测试,关键 PR 如下:

+ +

1.11 工具集 +PikiwiDB(Pika) 一直重视工具集的建设,所有相关工具都可以在 https://github.com/OpenAtomFoundation/pika/tree/unstable/tools 中找到。在 3.5.3 版本中,我们新增了一个工具:

+

PikiwiDB(Pika) 支持大 key 分析工具 +https://github.com/OpenAtomFoundation/pika/pull/2195

+

1.12 文档更新

+

PikiwiDB(Pika) 的文档主要是 wiki 文档。在 3.5.3 版本中,我们更新了 Pika 支持的 Redis 命令文档。

+

文档链接: https://github.com/OpenAtomFoundation/pika/wiki/pika-%E6%94%AF%E6%8C%81%E7%9A%84redis%E6%8E%A5%E5%8F%A3%E5%8F%8A%E5%85%BC%E5%AE%B9%E6%83%85%E5%86%B5 +2 改进列表

+

在第一章节中,我们概述了 3.5.3 版本的主要功能升级和改进。下面详细列出了本次发版的相关 PR。

+

2.1 新特性

+ +

2.2 bug 修复

+ +

2.3 发版 tag +https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.3 +3 社区

+

如果你有任何疑问,欢迎加入交流群,PikiwiDB(Pika) 开源社区感谢大家的支持和帮助。

+

2024-03-27-Pika-3.5.3-connect

What's new in Pika v3.5.0

· 阅读需 10 分钟
于雨
dubbogo示土区

时隔两年,Pika 社区正式发布经由社区 50 多人参与开发并在 360 生产环境验证可用的 v3.5.0 版本,新版本在提升性能的同时,也支持了 Codis 集群部署,BlobDB KV 分离,增加 Exporter 等新特性。

+

我们将详细介绍该版本引入的重要新特性。

+

1 去除 Rsync

+

在 v3.5.0 版本之前,Pika 使用 Rsync 工具进行引擎中存量数据的同步,Pika 进程启动时创建 Rsync 子进程。这种同步方式在实际使用中出现了一些问题,包括Pika 进程 crash 后重新拉起无法正常同步以及同步过程中 Rsync 进程无故退出等。在今年发布的 v3.5.0 版本中,我们在全量同步方案方面进行了重要的改进,摒弃了以往使用的 Rsync,实现了全新的数据同步方案,支持了断点续传,动态调节传输限速等特性,以确保同步过程更加稳定、可控。这些改进不仅增强了同步的可靠性,还为用户提供了更好的使用体验。

+ +

2 兼容更多 Redis 命令

+

在 v3.5.0 版本中,我们迈出了更大的一步,提升了对 Redis 命令的兼容性,对 Redis 命令提供了更广泛的支持。这个版本的改进使得 Pika 在与 Redis 生态系统的集成中表现更加出色,为用户提供了更丰富的功能和更广阔的可能性。我们对命令支持的扩展,为用户提供了更多的灵活性,以满足不同场景下的需求。

+ +

3 RocksDB 版本升级和分级压缩

+

在 v3.5.0 版本中,我们进行了一项重要的升级,将 RocksDB 引擎升级至 v8.1.1 版本,并实现了分级压缩功能的整合。这一升级不仅是技术的飞跃,也是我们对系统性能和优化的持续关注的体现。通过这项升级,我们为 Pika 增加了更高级别的数据管理能力,同时也让系统更好地适应不同的压缩需求,为用户的数据存储和检索提供了更大的灵活性和效率。

+ +

4 支持 BlobDB

+

在 v3.5.0 版本中,我们引入了引人瞩目的创新--对 BlobDB 和 KV 存储层进行了分离,为我们的系统注入了新的活力。这个版本的升级使得 Pika 在数据存储方面更加灵活和高效。我们通过支持 BlobDB KV 分离,提供了更优化的数据存储结构,为用户的数据管理和查询操作带来了更深层次的优势。这一重要改进将在更多应用场景下展现出其强大的潜力。

+ +

5 基于 Codis 的集群模式

+

在 v3.5.0 版本中,我们积极引入了 Codis 集群模式,此外,我们不仅仅将 Codis 集群模式融入了系统中,还为其提供了迁移 slot 的命令支持,从而实现了更加智能化的集群管理。这一重大变革不仅扩展了 Pika 在大规模数据存储场景中的应用范围,还进一步提升了系统的可扩展性和高可用性。通过引入 Codis 集群模式,我们对用户的数据处理和管理提供了更优化的解决方案。

+ +

6 可观测性

+

在 v3.5.0 版本中,我们引入了一个创新性的工具--pika_exporter,以提升对 Pika 数据库的可观测性。这一工具的加入不仅是对我们对系统监测能力的持续增强的反映。而在版本的后续更新中,我们进一步充实了指标,不断丰富了 Pika 的可观测性。为用户提供了更为全面和精准的数据洞察力。

+ +

7 容器化部署

+

在 v3.5.0 版本中,我们引入了一个具有创新意义的里程碑--pika-operator mvp 版本,这一版本在技术上实现了一个重要目标:将 Pika 单实例服务迁移到 Kubernetes(K8s)平台上的快速部署。这不仅是对我们持续关注行业发展的体现,也是我们不断提升用户体验的追求。通过 pika-operator,我们为用户提供了更便捷的部署方案,将 Pika 的高性能数据库引擎与 Kubernetes 的灵活性相融合,从而为用户的应用环境带来更高效、更弹性的支持。

+ +

8 跨平台编译

+

在 v3.5.0 版本中,Pika 呈现出一种全面性的蓬勃发展态势,得以在不同操作系统平台上展现其优越性。此版本的突破性之处在于,Pika 实现了对 MacOS、CentOS 和 Ubuntu 这些主要平台的完整编译和使用支持。这个举措不仅仅体现了我们对多样化技术环境的关注,也是为了最大程度地拓展用户基础,为广泛的用户群体提供灵活、高效的数据库解决方案。这种跨平台兼容性的加强将 Pika 推向更广阔的技术生态。

+ +

9 多平台集成测试及单元测试

+

在 v3.5.0 版本中,我们迈出了一个令人瞩目的步伐,不仅在多个主要操作系统平台上实现了支持,还在测试领域实施了全面升级。我们为 Ubuntu、CentOS 和 MacOS 这三大平台搭建了持续集成(CI)环境,以确保系统的完整性和稳定性。在测试方面,我们引入了更为广泛的覆盖,包括 Go 语言的集成测试、TCL 的单元测试以及 Python 的端到端(E2E)测试。通过这些测试策略的升级,我们在确保系统性能和可靠性方面迈出了更大的一步。

+ +

10 Others

+

若您有任何疑问,诚挚欢迎您扫描微信二维码,加入我们的交流群,与一众志同道合的成员展开深入的讨论,我们热切期待与您分享见解、交流心得,为共同的技术探索和创新之旅添砖加瓦。在这个群体中,我们将以卓越的智慧和互动的合作精神,构建出一个相互学习、不断进步的技术共同体。

+

2023-08-25-Pika-3.5.0

What's new in Pika v3.5.1

· 阅读需 5 分钟
于雨
dubbo-go开源社区

Pika 社区很高兴宣布,我们今天发布已经过我们生产环境验证 v3.5.1 版本 https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.1

+

该版本不仅做了很多优化工作,还引入了多项新功能。这些新功能包括 动态关闭 WAL、ReplicationID 检测是否增量复制、在 K8s 环境上 Pika 服务的自动注册从而实现集群的自组织、以及 exporter 检测集群指标等等,无疑将会让用户享受到更为稳定和高效的 NoSQL 使用体验。

+

新特性

+
    +
  • 1 Slow log 增加队列等待时间统计,在队列阻塞的时候方便我们进行问题定位。PR 1997, 作者 wangshao1。
  • +
  • 2 主从复制使用 ReplicationID 判断是否进行增量同步,解决原主从同步方式切主后整个数据集会进行全量复制的问题,可以提升 Pika 性能。PR 1951, 作者 Mixficsol。
  • +
  • 3 WAL 以 'disablewal' 命令方式支持动态关闭,在写性能遇到瓶颈的时候,可以通过命令关闭 WAL 缓解写性能下降的问题,关闭 WAL 有机器宕机后丢失数据的风险,用户需要根据自己的使用习惯权衡。PR 2015,作者 Mixficsol。
  • +
  • 4 flush 线程数和 compaction 线程数合二为一,在 Compaction 性能瓶颈时,可以动态调整线程数,缓解 Comapction 损耗 Pika 性能的问题。PR 2014, 作者 Tianpingan。
  • +
  • 5 升级了 RocksDB 版本到 v8.3.3。PR 2000, 作者 dingxiaoshuai123。
  • +
  • 6 新增周期性打印工作队列的长度功能,在队列阻塞的时候可以快速定位问题。PR 1978, 作者 Tianpingan。
  • +
  • 7 新增利用一个 pika_exporter 监测整个集群的指标,实现一个 Pika Exporter 实例监控整个集群,解决了 3.5.0 版本一个 Pika Exporter 监测一个 Pika 实例消耗资源的问题。PR 1953, 作者 chenbt-hz。
  • +
  • 8 实现在 K8s 环境上 Pika 服务的自动注册,在启动时自动注册,从而实现集群的自组织 ,实现了通过命令拉起整个 Pika Cluster 集群。PR 1931, 作者 machinly。
  • +
+

2 bug 修复

+
    +
  • 1 调整了 Rate_limit 参数,修复了压测时出现 RPS 为 0 的情况 。PR 2009, 作者 Mixficsol。
  • +
  • 2 修复了 INFODATA 命令中对于遍历数据文件时出现空路径的逻辑判断。PR 1996, 作者 Mixficsol。
  • +
  • 3 修复了 Codis 在线上出现大毛刺的问题。PR 2016, 作者 chejinge。
  • +
  • 4 修复了 macOS 环境下编译使用 tools 导致编译不过的问题 。PR 2011, 作者 A2ureStone。
  • +
  • 5 减少了 exporter 非必要日志的打印,降低 了资源利用率。PR 1945, 作者 Mixficsol。
  • +
+

3 使用建议

+

本次新增了几个配置参数,大家在使用过程中,需要根据使用情况按需调整:

+
    +
  • 1 max-rsync-parallel-num:主从全量复制线程数,需要根据自己机器 CPU 核数和部署实例个数进行调整,建议最小设置为 2。
  • +
  • 2 rate-limiter-bandwidth: 限制 RocksDB 数据库读写速度,限制数据库在一定时间内可以读写的数据量,默认 2000MiB/s,需要根据自己的机器性能和部署实例做调整。
  • +
  • max-background-jobs: compaction 和 flushdb 线程数,要根据自己机器 CPU 核数和部署实例个数进行调整,建议最小设置为 4。
  • +
  • 3 throttle-bytes-per-second: 主从复制传输限速参数,默认为 200MiB/s,该参数可以根据机器网卡的配置及部署 pika 实例的个数进行调整。
  • +
+

2023-09-28-Pika-3.5.1-connect.png

What's new in Pika v3.5.0

· 阅读需 10 分钟
于雨
dubbogo示土区

时隔两年,Pika 社区正式发布经由社区 50 多人参与开发并在 360 生产环境验证可用的 v3.5.0 版本,新版本在提升性能的同时,也支持了 Codis 集群部署,BlobDB KV 分离,增加 Exporter 等新特性。

+

我们将详细介绍该版本引入的重要新特性。

+

1 去除 Rsync

+

在 v3.5.0 版本之前,Pika 使用 Rsync 工具进行引擎中存量数据的同步,Pika 进程启动时创建 Rsync 子进程。这种同步方式在实际使用中出现了一些问题,包括Pika 进程 crash 后重新拉起无法正常同步以及同步过程中 Rsync 进程无故退出等。在今年发布的 v3.5.0 版本中,我们在全量同步方案方面进行了重要的改进,摒弃了以往使用的 Rsync,实现了全新的数据同步方案,支持了断点续传,动态调节传输限速等特性,以确保同步过程更加稳定、可控。这些改进不仅增强了同步的可靠性,还为用户提供了更好的使用体验。

+ +

2 兼容更多 Redis 命令

+

在 v3.5.0 版本中,我们迈出了更大的一步,提升了对 Redis 命令的兼容性,对 Redis 命令提供了更广泛的支持。这个版本的改进使得 Pika 在与 Redis 生态系统的集成中表现更加出色,为用户提供了更丰富的功能和更广阔的可能性。我们对命令支持的扩展,为用户提供了更多的灵活性,以满足不同场景下的需求。

+ +

3 RocksDB 版本升级和分级压缩

+

在 v3.5.0 版本中,我们进行了一项重要的升级,将 RocksDB 引擎升级至 v8.1.1 版本,并实现了分级压缩功能的整合。这一升级不仅是技术的飞跃,也是我们对系统性能和优化的持续关注的体现。通过这项升级,我们为 Pika 增加了更高级别的数据管理能力,同时也让系统更好地适应不同的压缩需求,为用户的数据存储和检索提供了更大的灵活性和效率。

+ +

4 支持 BlobDB

+

在 v3.5.0 版本中,我们引入了引人瞩目的创新--对 BlobDB 和 KV 存储层进行了分离,为我们的系统注入了新的活力。这个版本的升级使得 Pika 在数据存储方面更加灵活和高效。我们通过支持 BlobDB KV 分离,提供了更优化的数据存储结构,为用户的数据管理和查询操作带来了更深层次的优势。这一重要改进将在更多应用场景下展现出其强大的潜力。

+ +

5 基于 Codis 的集群模式

+

在 v3.5.0 版本中,我们积极引入了 Codis 集群模式,此外,我们不仅仅将 Codis 集群模式融入了系统中,还为其提供了迁移 slot 的命令支持,从而实现了更加智能化的集群管理。这一重大变革不仅扩展了 Pika 在大规模数据存储场景中的应用范围,还进一步提升了系统的可扩展性和高可用性。通过引入 Codis 集群模式,我们对用户的数据处理和管理提供了更优化的解决方案。

+ +

6 可观测性

+

在 v3.5.0 版本中,我们引入了一个创新性的工具--pika_exporter,以提升对 Pika 数据库的可观测性。这一工具的加入不仅是对我们对系统监测能力的持续增强的反映。而在版本的后续更新中,我们进一步充实了指标,不断丰富了 Pika 的可观测性。为用户提供了更为全面和精准的数据洞察力。

+ +

7 容器化部署

+

在 v3.5.0 版本中,我们引入了一个具有创新意义的里程碑--pika-operator mvp 版本,这一版本在技术上实现了一个重要目标:将 Pika 单实例服务迁移到 Kubernetes(K8s)平台上的快速部署。这不仅是对我们持续关注行业发展的体现,也是我们不断提升用户体验的追求。通过 pika-operator,我们为用户提供了更便捷的部署方案,将 Pika 的高性能数据库引擎与 Kubernetes 的灵活性相融合,从而为用户的应用环境带来更高效、更弹性的支持。

+ +

8 跨平台编译

+

在 v3.5.0 版本中,Pika 呈现出一种全面性的蓬勃发展态势,得以在不同操作系统平台上展现其优越性。此版本的突破性之处在于,Pika 实现了对 MacOS、CentOS 和 Ubuntu 这些主要平台的完整编译和使用支持。这个举措不仅仅体现了我们对多样化技术环境的关注,也是为了最大程度地拓展用户基础,为广泛的用户群体提供灵活、高效的数据库解决方案。这种跨平台兼容性的加强将 Pika 推向更广阔的技术生态。

+ +

9 多平台集成测试及单元测试

+

在 v3.5.0 版本中,我们迈出了一个令人瞩目的步伐,不仅在多个主要操作系统平台上实现了支持,还在测试领域实施了全面升级。我们为 Ubuntu、CentOS 和 MacOS 这三大平台搭建了持续集成(CI)环境,以确保系统的完整性和稳定性。在测试方面,我们引入了更为广泛的覆盖,包括 Go 语言的集成测试、TCL 的单元测试以及 Python 的端到端(E2E)测试。通过这些测试策略的升级,我们在确保系统性能和可靠性方面迈出了更大的一步。

+ +

10 Others

+

若您有任何疑问,诚挚欢迎您扫描微信二维码,加入我们的交流群,与一众志同道合的成员展开深入的讨论,我们热切期待与您分享见解、交流心得,为共同的技术探索和创新之旅添砖加瓦。在这个群体中,我们将以卓越的智慧和互动的合作精神,构建出一个相互学习、不断进步的技术共同体。

+

2023-08-25-Pika-3.5.0

Pika Blackwidow 引擎数据存储格式

· 阅读需 13 分钟
Axlgrep
Pika 开源社区

Blackwidow本质上是基于rocksdb的封装,使本身只支持kv存储的rocksdb能够支持多种数据结构, 目前Blackwidow支持五种数据结构的存储:String结构(实际上就是存储key, value), Hash结构,List结构,Set结构和ZSet结构, 因为Rocksdb的存储方式只有kv一种, 所以上述五种数据结构最终都要落盘到Rocksdb的kv存储方式上,下面我们展示Blackwidow和rocksdb的关系并且说明我们是如何用kv来模拟多数据结构的。

+

pika-blackwidow-1

+

1. String结构的存储

+

String本质上就是Key, Value, 我们知道Rocksdb本身就是支持kv存储的, 我们为了实现Redis中的expire功能,所以在value后面添加了4 Bytes用于存储timestamp, 作为最后Rocksdb落盘的kv格式,下面是具体的实现方式:

+

pika-blackwidow-2

+

如果我们没有对该String对象设置超时时间,则timestamp存储的值就是默认值0, 否则就是该对象过期时间的时间戳, 每次我们获取一个String对象的时候, 首先会解析Value部分的后四字节, 获取到timestamp做出判断之后再返回结果。

+

2. Hash结构的存储

+

blackwidow中的hash表由两部分构成,元数据(meta_key, meta_value), 和普通数据(data_key, data_value), 元数据中存储的主要是hash表的一些信息, 比如说当前hash表的域的数量以及当前hash表的版本号和过期时间(用做秒删功能), 而普通数据主要就是指的同一个hash表中一一对应的field和value,作为具体最后Rocksdb落盘的kv格式,下面是具体的实现方式:

+
    +
  1. 每个hash表的meta_key和meta_value的落盘方式: +pika-blackwidow-3
  2. +
+

meta_key实际上就是hash表的key, 而meta_value由三个部分构成: 4Bytes的Hash size(用于存储当前hash表的大小) + 4Bytes的Version(用于秒删功能) + 4Bytes的Timestamp(用于记录我们给这个Hash表设置的超时时间的时间戳, 默认为0)

+
    +
  1. hash表中data_key和data_value的落盘方式: +pika-blackwidow-4
  2. +
+

data_key由四个部分构成: 4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + Field的内容, 而data_value就是hash表某个field对应的value。

+
    +
  1. 如果我们需要查找一个hash表中的某一个field对应的value, 我们首先会获取到meta_value解析出其中的timestamp判断这个hash表是否过期, 如果没有过期, 我们可以拿到其中的version, 然后我们使用key, version,和field拼出data_key, 进而找到对应的data_value(如果存在的话)
  2. +
+

3. List结构的存储

+

blackwidow中的list由两部分构成,元数据(meta_key, meta_value), 和普通数据(data_key, data_value), 元数据中存储的主要是list链表的一些信息, 比如说当前list链表结点的的数量以及当前list链表的版本号和过期时间(用做秒删功能), 还有当前list链表的左右边界(由于nemo实现的链表结构被吐槽lrange效率低下,所以这次blackwidow我们底层用数组来模拟链表,这样lrange速度会大大提升,因为结点存储都是有序的), 普通数据实际上就是指的list中每一个结点中的数据,作为具体最后Rocksdb落盘的kv格式,下面是具体的实现方式

+
    +
  1. 每个list链表的meta_key和meta_value的落盘方式: +pika-blackwidow-5
  2. +
+

meta_key实际上就是list链表的key, 而meta_value由五个部分构成: 8Bytes的List size(用于存储当前链表中总共有多少个结点) + 4Bytes的Version(用于秒删功能) + 4Bytes的Timestamp(用于记录我们给这个List链表设置的超时时间的时间戳, 默认为0) + 8Bytes的Left Index(数组的左边界) + 8Bytes的Right Index(数组的右边界)

+
    +
  1. list链表中data_key和data_value的落盘方式: +pika-blackwidow-6
  2. +
+

data_key由四个部分构成: 4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + 8Bytes的Index(这个记录的就是当前结点的在这个list链表中的索引), 而data_value就是list链表该node中存储的值

+

4. Set结构的存储

+

blackwidow中的set由两部分构成,元数据(meta_key, meta_value), 和普通数据(data_key, data_value), 元数据中存储的主要是set集合的一些信息, 比如说当前set集合member的数量以及当前set集合的版本号和过期时间(用做秒删功能), 普通数据实际上就是指的set集合中的member,作为具体最后Rocksdb落盘的kv格式,下面是具体的实现方式:

+
    +
  1. 每个set集合的meta_key和meta_value的落盘方式: +pika-blackwidow-7
  2. +
+

meta_key实际上就是set集合的key, 而meta_value由三个部分构成: 4Bytes的Set size(用于存储当前Set集合的大小) + 4Bytes的Version(用于秒删功能) + 4Bytes的Timestamp(用于记录我们给这个set集合设置的超时时间的时间戳, 默认为0)

+
    +
  1. set集合中data_key和data_value的落盘方式: +pika-blackwidow-8
  2. +
+

data_key由四个部分构成: 4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + member的内容, 由于set集合只需要存储member, 所以data_value实际上就是空串

+

5. ZSet结构的存储

+

blackwidow中的zset由两部部分构成,元数据(meta_key, meta_value), 和普通数据(data_key, data_value), 元数据中存储的主要是zset集合的一些信息, 比如说当前zset集合member的数量以及当前zset集合的版本号和过期时间(用做秒删功能), 而普通数据就是指的zset中每个member以及对应的score, 由于zset这种数据结构比较特殊,需要按照memer进行排序,也需要按照score进行排序, 所以我们对于每一个zset我们会按照不同的格式存储两份普通数据, 在这里我们称为member to score和score to member,作为具体最后Rocksdb落盘的kv格式,下面是具体的实现方式:

+
    +
  1. 每个zset集合的meta_key和meta_value的落盘方式: +
  2. +
+

meta_key实际上就是zset集合的key, 而meta_value由三个部分构成: 4Bytes的ZSet size(用于存储当前zSet集合的大小) + 4Bytes的Version(用于秒删功能) + 4Bytes的Timestamp(用于记录我们给这个Zset集合设置的超时时间的时间戳, 默认为0)

+
    +
  1. 每个zset集合的data_key和data_value的落盘方式(member to score): +
  2. +
+

member to socre的data_key由四个部分构成:4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + member的内容, data_value中存储的其member对应的score的值,大小为8个字节,由于rocksdb默认是按照字典序进行排列的,所以同一个zset中不同的member就是按照member的字典序来排列的(同一个zset的key size, key, 以及version,也就是前缀都是一致的,不同的只有末端的member).

+
    +
  1. 每个zset集合的data_key和data_value的落盘方式(score to member): +
  2. +
+

score to member的data_key由五个部分构成:4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + 8Bytes的Score + member的内容, 由于score和member都已经放在data_key中进行存储了所以data_value就是一个空串,无需存储其他内容了,对于score to member中的data_key我们自己实现了rocksdb的comparator,同一个zset中score to member的data_key会首先按照score来排序, 在score相同的情况下再按照member来排序

+

Blackwidow相对于Nemo有哪些优势

+
    +
  1. Blackwidow采用了rocksdb的column families的新特性,将元数据和实际数据分开存放(对应于上面的meta数据和data数据), 这种存储方式相对于Nemo将meta, data混在一起存放更加合理, 并且可以提升查找效率(比如info keyspace的效率会大大提升)
  2. +
  3. Blackwidow中参数传递大量采用Slice而Nemo中采用的是std::string, 所以Nemo会有很多没有必要的string对象的构造函数以及析构函数的调用,造成额外的资源消耗,而Blackwidow则不会有这个问题
  4. +
  5. Blackwidow对kv模拟多数据结构的存储格式上做了重新设计(具体可以参考Nemo引擎数据存储格式和本篇文章),使之前在Nemo上出现的一些无法解决的性能问题得以解决,所以Blackwidow的多数据结构在某些场景下性能远远优于Nemo
  6. +
  7. 原来Nemo对多数据结构的Key的长度最大只能支持到256 Bytes,而Blackwidow经过重新设计,放开了多数据结构Key长度的这个限制
  8. +
  9. Blackwidow相对于Nemo更加节省空间,Nemo由于需要nemo-rocksdb的支持,所以不管在meta还是data数据部分都追加了version和timestamp这些信息,并且为了区分meta_key和data_key, 在最前面加入s和S(拿Set数据结构打比方),Blackwidow在这方面做了优化,使同样的数据量下Blackwidow所占用的空间比Nemo要小(举个例子,Blackwidow中List结构中的一个Node就比Nemo中的一个Node节省了16 Bytes的空间)
  10. +
  11. Blackwidow在锁的实现上参照了RocksDB事务里锁的实现方法,而弃用了之前Nemo的行锁,所以在多线程对同一把锁有抢占的情况下性能会有所提升
  12. +

pika_port 迁移工具

· 阅读需 3 分钟
于雨
Pika 开源社区

项目作者:

+

AlexStocks

+

适用版本:

+

3.1 和 2.x

+

项目地址:

+

https://github.com/ipixiu/pika-tools

+

https://github.com/Axlgrep/pika-tools 长期维护地址需自行编译

+

二进制包:

+

https://github.com/ipixiu/pika-port-bin

+

功能:

+

将Pika中的数据在线迁移到Pika、Redis(支持全量、增量同步)

+

开发背景:

+

之前Pika项目官方提供的pika_to_redis工具仅支持离线将Pika的DB中的数据迁移到Pika、Redis, 且无法增量同步,该工具可以直接伪装为一个Pika的从库,将主库数据通过同步获取并转发给Pika、Redis,同时并支持增量同步

+

实现:

+

trysync线程

+
    +
  1. 尝试与主库建立同步关系
  2. +
  3. 如果需要全同步,则在接收到master的db之后,启动migrator和sender线程将db里面的数据发送给Pika、Redis
  4. +
  5. 启动Slaveping线程定期给主库发送心跳,完成建立主从关系
  6. +
+

binlog_receiver线程

+
    +
  1. 接收主库发送过来的binlog并且将其解析成redis命令
  2. +
  3. 将redis命令转发给Pika、Redis
  4. +
+

migrator线程

+
    +
  1. 扫描不同数据类型的分库
  2. +
  3. 将key进行解析成响应数据Pika、redis指令
  4. +
  5. 将解析好的redis指令加载到sender的发送buf中
  6. +
+

sender线程

+
    +
  1. 从发送buf中读取数据,以非阻塞方式向Pika、redis发送数据
  2. +
  3. 接收Pika、redis返回的结果并解析,如果出现错误则显示错误结果
  4. +
+

使用帮助:

+
Usage: 
pika_port [-h] [-t local_ip -p local_port -i master_ip -o master_port
-m forward_ip -n forward_port -x forward_thread_num -y forward_passwd]
-f filenum -s offset -w password -r rsync_dump_path -l log_path
-h -- show this help
-t -- local host ip(OPTIONAL default: 127.0.0.1)
-p -- local port(OPTIONAL)
-i -- master ip(OPTIONAL default: 127.0.0.1)
-o -- master port(REQUIRED)
-m -- forward ip(OPTIONAL default: 127.0.0.1)
-n -- forward port(REQUIRED)
-x -- forward thread num(OPTIONAL default: 1)
-y -- forward password(OPTIONAL)
-f -- binlog filenum(OPTIONAL default: local offset)
-s -- binlog offset(OPTIONAL default: local offset)
-w -- password for master(OPTIONAL)
-r -- rsync dump data path(OPTIONAL default: ./rsync_dump)
-l -- local log path(OPTIONAL default: ./log)
-b -- max batch number when port rsync dump data (OPTIONAL default: 512)
-d -- daemonize(OPTIONAL)
example: ./pika_port -t 127.0.0.1 -p 12345 -i 127.0.0.1 -o 9221 -m 127.0.0.1 -n 6379 -x 7 -f 0 -s 0 -w abc -l ./log -r ./rsync_dump -b 512 -d
+ + \ No newline at end of file diff --git a/build/blog/pika-blackwidow/index.html b/build/blog/pika-blackwidow/index.html new file mode 100644 index 0000000..6a86625 --- /dev/null +++ b/build/blog/pika-blackwidow/index.html @@ -0,0 +1,88 @@ + + + + + +Pika Blackwidow 引擎数据存储格式 | PikiwiDB(Pika) + + + + + + + + + +

Pika Blackwidow 引擎数据存储格式

· 阅读需 13 分钟
Axlgrep
Pika 开源社区

Blackwidow本质上是基于rocksdb的封装,使本身只支持kv存储的rocksdb能够支持多种数据结构, 目前Blackwidow支持五种数据结构的存储:String结构(实际上就是存储key, value), Hash结构,List结构,Set结构和ZSet结构, 因为Rocksdb的存储方式只有kv一种, 所以上述五种数据结构最终都要落盘到Rocksdb的kv存储方式上,下面我们展示Blackwidow和rocksdb的关系并且说明我们是如何用kv来模拟多数据结构的。

+

pika-blackwidow-1

+

1. String结构的存储

+

String本质上就是Key, Value, 我们知道Rocksdb本身就是支持kv存储的, 我们为了实现Redis中的expire功能,所以在value后面添加了4 Bytes用于存储timestamp, 作为最后Rocksdb落盘的kv格式,下面是具体的实现方式:

+

pika-blackwidow-2

+

如果我们没有对该String对象设置超时时间,则timestamp存储的值就是默认值0, 否则就是该对象过期时间的时间戳, 每次我们获取一个String对象的时候, 首先会解析Value部分的后四字节, 获取到timestamp做出判断之后再返回结果。

+

2. Hash结构的存储

+

blackwidow中的hash表由两部分构成,元数据(meta_key, meta_value), 和普通数据(data_key, data_value), 元数据中存储的主要是hash表的一些信息, 比如说当前hash表的域的数量以及当前hash表的版本号和过期时间(用做秒删功能), 而普通数据主要就是指的同一个hash表中一一对应的field和value,作为具体最后Rocksdb落盘的kv格式,下面是具体的实现方式:

+
    +
  1. 每个hash表的meta_key和meta_value的落盘方式: +pika-blackwidow-3
  2. +
+

meta_key实际上就是hash表的key, 而meta_value由三个部分构成: 4Bytes的Hash size(用于存储当前hash表的大小) + 4Bytes的Version(用于秒删功能) + 4Bytes的Timestamp(用于记录我们给这个Hash表设置的超时时间的时间戳, 默认为0)

+
    +
  1. hash表中data_key和data_value的落盘方式: +pika-blackwidow-4
  2. +
+

data_key由四个部分构成: 4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + Field的内容, 而data_value就是hash表某个field对应的value。

+
    +
  1. 如果我们需要查找一个hash表中的某一个field对应的value, 我们首先会获取到meta_value解析出其中的timestamp判断这个hash表是否过期, 如果没有过期, 我们可以拿到其中的version, 然后我们使用key, version,和field拼出data_key, 进而找到对应的data_value(如果存在的话)
  2. +
+

3. List结构的存储

+

blackwidow中的list由两部分构成,元数据(meta_key, meta_value), 和普通数据(data_key, data_value), 元数据中存储的主要是list链表的一些信息, 比如说当前list链表结点的的数量以及当前list链表的版本号和过期时间(用做秒删功能), 还有当前list链表的左右边界(由于nemo实现的链表结构被吐槽lrange效率低下,所以这次blackwidow我们底层用数组来模拟链表,这样lrange速度会大大提升,因为结点存储都是有序的), 普通数据实际上就是指的list中每一个结点中的数据,作为具体最后Rocksdb落盘的kv格式,下面是具体的实现方式

+
    +
  1. 每个list链表的meta_key和meta_value的落盘方式: +pika-blackwidow-5
  2. +
+

meta_key实际上就是list链表的key, 而meta_value由五个部分构成: 8Bytes的List size(用于存储当前链表中总共有多少个结点) + 4Bytes的Version(用于秒删功能) + 4Bytes的Timestamp(用于记录我们给这个List链表设置的超时时间的时间戳, 默认为0) + 8Bytes的Left Index(数组的左边界) + 8Bytes的Right Index(数组的右边界)

+
    +
  1. list链表中data_key和data_value的落盘方式: +pika-blackwidow-6
  2. +
+

data_key由四个部分构成: 4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + 8Bytes的Index(这个记录的就是当前结点的在这个list链表中的索引), 而data_value就是list链表该node中存储的值

+

4. Set结构的存储

+

blackwidow中的set由两部分构成,元数据(meta_key, meta_value), 和普通数据(data_key, data_value), 元数据中存储的主要是set集合的一些信息, 比如说当前set集合member的数量以及当前set集合的版本号和过期时间(用做秒删功能), 普通数据实际上就是指的set集合中的member,作为具体最后Rocksdb落盘的kv格式,下面是具体的实现方式:

+
    +
  1. 每个set集合的meta_key和meta_value的落盘方式: +pika-blackwidow-7
  2. +
+

meta_key实际上就是set集合的key, 而meta_value由三个部分构成: 4Bytes的Set size(用于存储当前Set集合的大小) + 4Bytes的Version(用于秒删功能) + 4Bytes的Timestamp(用于记录我们给这个set集合设置的超时时间的时间戳, 默认为0)

+
    +
  1. set集合中data_key和data_value的落盘方式: +pika-blackwidow-8
  2. +
+

data_key由四个部分构成: 4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + member的内容, 由于set集合只需要存储member, 所以data_value实际上就是空串

+

5. ZSet结构的存储

+

blackwidow中的zset由两部部分构成,元数据(meta_key, meta_value), 和普通数据(data_key, data_value), 元数据中存储的主要是zset集合的一些信息, 比如说当前zset集合member的数量以及当前zset集合的版本号和过期时间(用做秒删功能), 而普通数据就是指的zset中每个member以及对应的score, 由于zset这种数据结构比较特殊,需要按照memer进行排序,也需要按照score进行排序, 所以我们对于每一个zset我们会按照不同的格式存储两份普通数据, 在这里我们称为member to score和score to member,作为具体最后Rocksdb落盘的kv格式,下面是具体的实现方式:

+
    +
  1. 每个zset集合的meta_key和meta_value的落盘方式: +
  2. +
+

meta_key实际上就是zset集合的key, 而meta_value由三个部分构成: 4Bytes的ZSet size(用于存储当前zSet集合的大小) + 4Bytes的Version(用于秒删功能) + 4Bytes的Timestamp(用于记录我们给这个Zset集合设置的超时时间的时间戳, 默认为0)

+
    +
  1. 每个zset集合的data_key和data_value的落盘方式(member to score): +
  2. +
+

member to socre的data_key由四个部分构成:4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + member的内容, data_value中存储的其member对应的score的值,大小为8个字节,由于rocksdb默认是按照字典序进行排列的,所以同一个zset中不同的member就是按照member的字典序来排列的(同一个zset的key size, key, 以及version,也就是前缀都是一致的,不同的只有末端的member).

+
    +
  1. 每个zset集合的data_key和data_value的落盘方式(score to member): +
  2. +
+

score to member的data_key由五个部分构成:4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + 8Bytes的Score + member的内容, 由于score和member都已经放在data_key中进行存储了所以data_value就是一个空串,无需存储其他内容了,对于score to member中的data_key我们自己实现了rocksdb的comparator,同一个zset中score to member的data_key会首先按照score来排序, 在score相同的情况下再按照member来排序

+

Blackwidow相对于Nemo有哪些优势

+
    +
  1. Blackwidow采用了rocksdb的column families的新特性,将元数据和实际数据分开存放(对应于上面的meta数据和data数据), 这种存储方式相对于Nemo将meta, data混在一起存放更加合理, 并且可以提升查找效率(比如info keyspace的效率会大大提升)
  2. +
  3. Blackwidow中参数传递大量采用Slice而Nemo中采用的是std::string, 所以Nemo会有很多没有必要的string对象的构造函数以及析构函数的调用,造成额外的资源消耗,而Blackwidow则不会有这个问题
  4. +
  5. Blackwidow对kv模拟多数据结构的存储格式上做了重新设计(具体可以参考Nemo引擎数据存储格式和本篇文章),使之前在Nemo上出现的一些无法解决的性能问题得以解决,所以Blackwidow的多数据结构在某些场景下性能远远优于Nemo
  6. +
  7. 原来Nemo对多数据结构的Key的长度最大只能支持到256 Bytes,而Blackwidow经过重新设计,放开了多数据结构Key长度的这个限制
  8. +
  9. Blackwidow相对于Nemo更加节省空间,Nemo由于需要nemo-rocksdb的支持,所以不管在meta还是data数据部分都追加了version和timestamp这些信息,并且为了区分meta_key和data_key, 在最前面加入s和S(拿Set数据结构打比方),Blackwidow在这方面做了优化,使同样的数据量下Blackwidow所占用的空间比Nemo要小(举个例子,Blackwidow中List结构中的一个Node就比Nemo中的一个Node节省了16 Bytes的空间)
  10. +
  11. Blackwidow在锁的实现上参照了RocksDB事务里锁的实现方法,而弃用了之前Nemo的行锁,所以在多线程对同一把锁有抢占的情况下性能会有所提升
  12. +
+ + \ No newline at end of file diff --git a/build/blog/rss.xml b/build/blog/rss.xml new file mode 100644 index 0000000..7d23aa1 --- /dev/null +++ b/build/blog/rss.xml @@ -0,0 +1,897 @@ + + + + PikiwiDB(Pika) Blog + https://www.pikiwidb.com/blog + PikiwiDB(Pika) Blog + Mon, 08 Jul 2024 00:00:00 GMT + https://validator.w3.org/feed/docs/rss2.html + https://github.com/jpmonette/feed + zh-Hans + + <![CDATA[What's new in PikiwiDB(Pika) v4.0.0]]> + https://www.pikiwidb.com/blog/PikiwiDB-Pika--4.0.0 + https://www.pikiwidb.com/blog/PikiwiDB-Pika--4.0.0 + Mon, 08 Jul 2024 00:00:00 GMT + + 尊敬的社区成员及技术爱好者们: +PikiwiDB 社区荣耀地宣告——经过 9 个月打磨并在生产环境稳定运行 5 个月的 PikiwiDB(Pika) v4.0.0 【下文简称 Pika】今天正式发布。希望基于第三代存储引擎 Floyd 的这个新版本能为社区用户们带来更卓越的体验。

+

1 重大改进

+

1.1 第三代存储引擎 Floyd +Floyd 如同其前代 Blackwidow,基于 RocksDB,不仅支持基础的 String 结构,也原生支持了 Hash、List、Set、Stream及 ZSet 等 KKV 形式的复合数据结构。

+
    +
  • RocksDB 实例数可配置
  • +
+

摒弃了 Blackwidow 按数据类型采用 RocksDB 实例的物理隔离模式,Floyd 采用了 RocksDB 的 Column-Family 虚拟隔离机制,在单个 RocksDB 实例下可存储所有类型的数据。用户可自由设定 Pika 实例中每个 DB【等同于Redis DB】中 RocksDB 实例的数量,而数据的存储则依据 key 的 hash 值分配至相应的 RocksDB 实例,减小了数据的空间放大和读放大效应,实现了机器资源的高效利用。

+
    +
  • 禁止重复 key
  • +
+

2024-05-16-PikiwiDB(Pika)-4.0.0-key +基于 RocksDB 的 Column-Family 虚拟隔离机制,Floyd 把所有类型的 key 和 string 一起存储在 Column-Family 0。在此存储基础之上,可明确禁止不同类型的 key 重复,这一设计旨在杜绝潜在的数据冗余与不一致性,与 Redis 服务特性保持一致,进一步提升了系统的整体效率与数据质量。

+
    +
  • Floyd 详细说明
  • +
+

如果对 Floyd 存储引擎感兴趣,请详阅《Floyd 存储引擎》【链接:https://github.com/OpenAtomFoundation/pika/discussions/2052】。由于 Floyd 前后进行了多个版本的迭代,所以阅读该 github discussion 文档时请注意前后时间,如有相关冲突性说法,以最新日期的文字为准。

+

关键 PR:

+ +

1.2 Mget 批量查询缓存

+

Pika v3.5.2 的热数据缓存只实现了对热点 Key 的点查(如get/hget),在后续的 v3.5.3 和 v3.5.4 修复若干 bug 后,对热数据的点查目前已经非常稳定。然而并未支持批量查询(如 mget etc)。 +内部业务侧反馈批量查询速度比较慢,在 40C/256GiB/2TiB SATA SSD 规格机器上数据量超过 100GiB 时,Pika v3.3.6 30% 批量查询延迟超过 35ms。但由于 Pika 热数据缓存尚未支持批量查询,性能并未改善。

+

为了满足业务需求,Pika 团队开发了批量查询热数据缓存功能,显著提升了批量查询性能,降低了查询延迟和失败率。相关技术细节请阅读《PikiwiDB (Pika) 混合存储之批量查询》 【链接:https://mp.weixin.qq.com/s/KFLPruSdB66TMRxUfR9PbQ 】。

+

关键 PR :

+ +

1.3 主从复制

+

Pika v3.3.6 有很多主从复制的缺陷。v4.0.0 版本对 Pika 全量复制及增量复制进行了大量优化和 bug 修复,取得了非常好的效果。 +并在 info 命令中输出了 "repl_connect_status" 指标(PR 2638),以方便用户更加明确清晰的确定当前的主从复制状态。

+

关键 PR :

+ +

1.4 Redis Stream

+

Redis Stream 类似于消息队列(MQ),以便更安全地传递消息。为了确保数据的安全性,底层引擎 BlackWidow 和 Floyd 中特别添加了对 Stream 数据类型的支持。 +关键 PR:

+ +

1.5 Compaction

+

PikiwiDB(Pika) 的底层磁盘存储引擎 RocksDB 在进行 compaction 时会显著影响 PikiwiDB(Pika) 的读写性能。因此,控制好 compaction 是优化 Pika 读写性能的关键。

+

Floyd 使用了 v8.7.3 版本的 RocksDB,开放了更多 RocksDB 参数,以方便用户优化 RocksDB 性能:

+
    +
  • enable-partitioned-index-filters: 支持加载分区索引过滤器,加快 RocksDB 查找速度。
  • +
  • min-write-buffer-number-to-merge: 默认值为 1,如果将此值设置得更大,意味着需要更多的写缓冲区被填满后才进行 flush。这样可以减少 flush 的频率,增加数据在内存中的累积量,从而可能提高写入吞吐量。
  • +
  • level0-stop-writes-trigger: 默认值为 36,定义了 L0 层中 sst 文件的最大数量,一旦达到这个数量,RocksDB 将会采取 暂停写入、强制 compaction 等措施来防止写入操作继续累积,以避免 L0 层变得过于庞大,进而可能导致写入放大、查询性能下降等问题。
  • +
  • level0-slowdown-writes-trigger:默认值为 20,用于控制当 Level 0 的 SST 文件数量达到这个阈值时,触发写减速(write slowdown),防止 Level 0 的文件数量过多,导致后续 compaction 操作的压力过大。
  • +
  • level0-file-num-compaction-trigger:默认值为 4,当 Level 0 的 SST 文件数量达到这个参数设定的阈值时,RocksDB 会开始执行 compaction 操作,将 Level 0 的文件合并到 Level 1,以减少 Level 0 的文件数量,降低读取延迟,并优化存储空间的利用率。
  • +
  • max-subcompactions:默认值为 1,用于控制RocksDB 中并发执行的 sub-compaction 任务数量,其值为 1 表示关闭 sub-compaction。如果系统资源充足,建议提升该参数以优化 compaction 效率。
  • +
  • max-bytes-for-level-base:指定了 L1 SST 文件总的大小。这个大小是 RocksDB 进行数据分层管理和 compaction 决策的重要依据:如果 L1 层的大小设置得太小,可能会导致 L0 层的 compaction 过于频繁,进而影响写性能。反之,如果设置得太大,可能会占用较多的磁盘空间,并且影响读取性能,因为读取操作可能需要跨越更多的层级。Pika 没有在 pika.conf 中开放此参数给用户配置,而是使用其他参数(level0-file-num-compaction-trigger 和 write-buffer-size)计算后的结果。
  • +
+

storage_options_.options.max_bytes_for_level_base = g_pika_conf->level0_file_num_compaction_trigger() * g_pika_conf->write_buffer_size()

+

关键 PR: +添加 Floyd 的 compaction-filter 的 Gtest +https://github.com/OpenAtomFoundation/pika/pull/2669 +添加支持分区索引过滤的功能 +https://github.com/OpenAtomFoundation/pika/pull/2601 +新增 RocksDB Compaction 策略动态调整参数,用户可以根据业务调整 Compaction 策略,降低 Compaction 操作对服务性能的损耗 +https://github.com/OpenAtomFoundation/pika/pull/2538 +1.6 可观测性 +v3.5 版本增加了包括命中率、每秒命中次数、Redis Cache 内存使用量、Redis Cache 个数、Redis Cache DB 个数 等指标,但是在集群方面的可观测性是缺失的。v4.0.0 对 Codis-Proxy 的 P99、P999、延迟等监控指标进行采集和展示,可以直观地反映线上 Codis-proxy 的运行情况。

+

v4.0.0 开始还提供新的工具:根据 pika benchmark 工具压测结果自动生成可视化的统计图表。

+

关键 PR: +Codis 支持 info 命令, 可以通过该命令查询 Codis-proxy 的 info 信息 +https://github.com/OpenAtomFoundation/pika/pull/2688 +Codis-proxy 新增 P99 P95 等监控耗时指标 +https://github.com/OpenAtomFoundation/pika/pull/2668 +添加 Pika 压测指标,提升 Pika 压测效率,并输出可视化的统计图表 +https://github.com/OpenAtomFoundation/pika/pull/2663

+

1.7 测试集 +PikiwiDB(Pika) 测试集由 gtest 单测、Redis TCL 测试集和 Go 测试集组成。v4.0.0 中丰富了诸多特性的 go test 功能,并进一步完善了基本数据类型的 TCL 测试。 +关键 PR: +添加 Floyd 的 compaction-filter 的 Gtest +https://github.com/OpenAtomFoundation/pika/pull/2669 +Pika Geo 数据类型增加 TCL 测试,并修复测试过程中遇到的缺陷 +https://github.com/OpenAtomFoundation/pika/pull/2753 +1.8 跨平台 +PikiwiDB(Pika) 以往仅支持 centos 和 ubuntu 等 linux 平台,v3.5 开始支持 Mac 等平台。v4.0.0 将对 Mac 平台的支持扩展至 FreeBSD 平台。 +关键 PR: +Pika 支持在 FreeBSD14 平台上进行编译 +https://github.com/OpenAtomFoundation/pika/pull/2711 +2 改进列表 +下面详细列出了本次发版的主要功能升级和改进。 +2.1 新特性

+ +

2.2 bug 修复

+ +

2.3 提升改进项

+ +

2.4 发版 tag

+

https://github.com/OpenAtomFoundation/pika/releases/tag/v4.0.0 +3 社区 +感谢所有为 v4.0.0 做出贡献的社区成员,包括 issue/PR 提交者、代码 reviewer 【排名不分先后,依据字母序列】:

+

AlexStocks

+

baerwang

+

chejinge

+

cheniujh

+

chienguo

+

guangkun123

+

gukj-spel

+

longfar-ncy

+

lqxhub

+

luky116

+

Mixficsol

+

saz97

+

wangshao1

+

PikiwiDB (Pika) 开源社区热烈欢迎您的参与和支持。如果您有任何问题、意见或建议,请扫码添加 PikiwiDB 小助手【微信号: PikiwiDB】为好友,它会拉您加入官方微信群。

+

2024-07-08-PikiwiDB(Pika)-4.0.0-connect

]]>
+
+ + <![CDATA[What's new in Pika v3.5.4]]> + https://www.pikiwidb.com/blog/Pika-3.5.4 + https://www.pikiwidb.com/blog/Pika-3.5.4 + Thu, 16 May 2024 00:00:00 GMT + + PikiwiDB(Pika) 社区非常荣幸地宣布,我们的最新 v3.5.4 正式生产可用版本现已发布。 +v3.5.4 解决了历史遗留的 bug,对 PikiwiDB(Pika) 的一些遗留 bug 进行修复和优化,旨在打造出一个高稳定性的版本。本次的重点优化主要包括,PikiwiDB(Pika)支持动态调整限速参数、增强 PikiwiDB(Pika) 的客观测性指标、 磁盘 IO 限速支持读限速及写限速等。 +1 新特性

+
    +
  1. Pika 支持动态调整全量同步限速参数 rsync-timeout-ms 和 throttle-bytes-per-second。
  2. +
+

自 v3.5.0 版本开始,PikiwiDB(Pika) 服务摒弃了通过子进程内使用原来 rsync 工具进行主从全量同步的逻辑,在 PikiwiDB(Pika) 内部以线程方式【称作 rsync 线程】自行实现了新的全量同步逻辑,避免因为外部进程不可控引起的主从同步问题,根据 360 内部 Pika 线上大规模集群运维的经验,在 PikiwiDB(Pika) 主从进行全量同步的过程中,如果遇到某些不利的外部因素,如网络波动,硬件故障(如网卡降速导致的主从网卡速率不匹配)等,可能引起 rsync 线程请求持续超时(PikiwiDB(Pika) 内置 rsync 模块用于全量同步阶段的文件传输),且超时重试所发出的包可能引发更大的网络信道负担。此时对于运维人员来说,如果能动态调整 rsync 请求的超时时间和 rsync 传输的速率上限,不仅意味着对全量同步阶段控制粒度的进一步细化,更大大降低了在该场景下的运维处置难度。

+

关键PR:

+

https://github.com/OpenAtomFoundation/pika/pull/2633

+
    +
  1. 将 info key space 1 的结果输出至 info all 并展示到监控界面中。
  2. +
+

PikiwiDB(Pika) 是通过 Info 命令采集数据至 Pika-Exporter,展示到 Grafana 界面上的,目前界面上部分数据是没有展示的,如 keys 的数量,本次将执行 info keyspace 的结果展示到监控界面,用户可以通过这个指标来查看存储的量级等。

+

关键PR:

+

https://github.com/OpenAtomFoundation/pika/pull/2603

+

3.Pika 磁盘IO 限速参数支持 OnlyRead、OnlyWrite、ReadAndWrite,默认支持OnlyWrite。

+

自3.5.0版本开始,PikiwiDB(Pika) 服务可以通过调整 rate-limit 参数实现写限速,防止在网卡质量不高的情况下磁盘 IO 过重导致服务不可用,或者 binlog 阻塞的情况发生。360内部 Pika 线上大规模集群运维的经验,在 PikiwiDB(Pika) 实例的网卡较差情况下,也需要对读实例进行限速,本次修改支持读、写限速,默认是写限速,调整 config 配置中的 rate-limiter-mode 可以设置为读限速,或者同时读写限速。

+

关键PR:

+

https://github.com/OpenAtomFoundation/pika/pull/2599

+

2 改进列表

+

slotmigrate 添加 go test。

+

https://github.com/OpenAtomFoundation/pika/pull/2576

+

INFO 命令耗时优化,降低查磁盘频率,避免因为数据采集调用 info 命令时查磁盘太过频繁导致服务性能下降。

+

https://github.com/OpenAtomFoundation/pika/pull/2554

+

对五种基本数据类型命令增加 Redis tcl 测试。

+

https://github.com/OpenAtomFoundation/pika/pull/2527

+

3 Bug 修复

+

修复使用 Pika Exporter 时可能会出现 slots 分配不均衡的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2651

+

修复 Codis dashboard 不能正确更新 master 实例状态的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2650

+

修复 Redis 事务 binlog 解析失败导致的主从同步异常问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2642

+

修复 Pika Expoter 启动时不带参数导致启动失败问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2640

+

修复使用 Pika Operater 拉起集群 Codis-proxy panic 的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2633

+

修复 CI 编译出的二进制进行自动化测试时 cp 命令失败问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2614

+

修复变量未初始化导致 cache 启动失败的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2613

+

修复 userpass 和 userblacklist 动态修改参数功能异常问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2600

+

修复 scard sscan 结果不一致的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2596

+

修复当 max-rsync-parallel-num 大于4,slave 会在主从复制时 coredump 的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2595

+

调整不常用的线程池线程数,避免因为空跑导致性能损耗。

+

https://github.com/OpenAtomFoundation/pika/pull/2590

+

修复 Pika 事务边缘测试 case 不通过的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2586

+

将 cache-model 修改成 cache-mode。

+

https://github.com/OpenAtomFoundation/pika/pull/2585

+

修复使用 info keyspace 后,info all 死锁的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2584

+

修复因修改 zsetscorekey comparator impl 字典序比较熟顺序,导致 353 352极端场景不兼容的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2583

+

修复 compact 死锁的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2581

+

Slotmigrate 添加 go test。

+

https://github.com/OpenAtomFoundation/pika/pull/2576

+

更新 Pika Operater 使用的 pika 版本。

+

https://github.com/OpenAtomFoundation/pika/pull/2572

+

修复 config rewrite 后 blockcache 数值异常的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2561

+

修复 slotmigrate 动态修复后值错误的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2548

+

修复 spop 可能会出现主从数据不一致的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2541

+

修复 CloseFd(it->second[i]) 出现越界的问题。

+

https://github.com/OpenAtomFoundation/pika/pull/2539

+

修复 Flushall 和 FlushDB 死锁的隐患,并删除 FlushSubDB 接口。

+

https://github.com/OpenAtomFoundation/pika/pull/2533

+

增加参数控制是否清理 tcl 测试后产生的数据文件,防止废弃数据占据磁盘。

+

https://github.com/OpenAtomFoundation/pika/pull/2507

+

2024-05-16-Pika-3.5.4-connect.png

]]>
+
+ + <![CDATA[What's new in Pika v3.5.3 ]]> + https://www.pikiwidb.com/blog/Pika-3.5.3 + https://www.pikiwidb.com/blog/Pika-3.5.3 + Wed, 27 Mar 2024 00:00:00 GMT + + 随着 Redis 宣布采用双协议以维护其商业利益之际,PikiwiDB(Pika) 社区非常荣幸地宣布,我们的最新 v3.5.3 正式生产可用版本现已发布。

+

v3.5.3 解决了历史遗留的 Bug,引入了多项新特性。这些特性主要包括 Pika 支持 ACL、删除 Sharing 模式残留的 Slot 代码、快慢命令分离、 Redis Stream、大 key 分析工具、Pika 分布式集群支持全自动化 failover 等功能,同时,我们在 3.5.3 版本丰富了更多的自动化测试 case,提升 Pika 服务的稳定性和健壮性,会让用户感受到更为高效和稳定的使用体验,本文主要阐述本次改动的相关重大 feature、bugfix 性能提升项。

+

在深入探讨 3.5.3 版本的更新内容之前,请注意以下几点声明:

+
    +
  1. 由于商标问题,Pika 项目已更名为 PikiwiDB。文中以 PikiwiDB(Pika) 指代项目
    +https://github.com/OpenAtomFoundation/pika
  2. +
  3. 我们新创建了一个项目
    +https://github.com/OpenAtomFoundation/pikiwidb +这是一个基于 Raft 协议实现的兼容 Redis 协议的大容量 KV 数据库,主要面向强一致性数据场景,例如存储约 10TiB 规模的元数据。PikiwiDB 将专门用于指代此项目。
  4. +
  5. 我们为 PikiwiDB 设计了一个新的 logo,作为其商标,并已在相关政府机构注册。
  6. +
+

2024-03-27-Pika-3.5.3-logo

+

1 重大改进

+

1.1 PikiwiDB(Pika) 支持 ACL

+

PikiwiDB(Pika) 3.5.3 版本正式全面支持 Redis ACL,为未来在云原生 Pika 集群中支持多租户场景奠定了基础。在此之前,Pika 已经支持了 Redis 的用户认证方式,如 auth/userpass/requirepass,以及通过 pika.conf 中的 userblacklist 配置命令黑名单模式。本次更新保持了向后兼容,并支持这些已有的使用方式。

+

我们还确保 PikiwiDB(Pika) 的 ACL 实现与 Redis ACL 完全兼容,通过将 Redis 的所有 ACL TCL 测试集纳入 PikiwiDB(Pika) 的测试集中。

+

关键 PR:

+ +

1.2 混合存储模型支持 bitmap

+

在单体环境下,同时优化 PikiwiDB(Pika) 的读/写/compaction 是一项挑战。在 v3.5.2 版本中,我们引入了由缓存 Redis 和 RocksDB 构成的混合存储模型,并支持了 string/list/set/zset/hashtable 五种数据结构。在 3.5.3 版本中,我们增加了对 bitmap 的支持。

+

此外,我们在 3.5.3 版本中支持对 Redis 缓存进行动态参数调整。

+

关键 PR 链接:

+ +

1.3 快慢命令分离

+ +

1.4 Redis Stream

+

虽然 PikiwiDB(Pika) 之前支持了 Redis pubsub,但它只能进行在线消息传递。在 3.5.3 版本中,我们增加了对 Redis Stream 的有限支持,类似于消息队列(MQ),以便更安全地传递消息。为了确保数据的安全性,我们在底层引擎 BlackWidow 中特别添加了对 Stream 数据类型的支持。 +关键 PR:

+ +

1.5 云原生集群

+

在 PikiwiDB(Pika) 3.5.0 版本中,我们开源了 Pika-Operator,它支持在 K8s 上部署 Pika 主从对。在 3.5.2 版本中,我们基于 Kubeblocks 的 Pika-Operator 支持了在 K8s 上部署类似 Codis 的 Pika Cluster,但当时还不支持动态扩缩容。

+

在 3.5.3 版本中,最新的 Pika-Operator 已经支持了 Codis Group 级别的节点扩缩容,并且支持数据的 Rebalance。 +关键 PR:

+ +

PikiwiDB(Pika) 的底层磁盘存储引擎 RocksDB 在进行 compaction 时会显著影响 PikiwiDB(Pika) 的读写性能。因此,控制好 compaction 是优化 Pika 读写性能的关键。 +有关 compaction 的关键优化 PR 如下:

+ +

1.7 自动 Failover

+

PikiwiDB(Pika) 集群目前是基于 Codis 实现的。为了提高基于 Codis 的 PikiwiDB(Pika) Cluster 的易用性,我们对 Codis 进行了许多扩展。

+

原始的 Codis 不支持 Group 内的 Failover,需要使用 Redis Sentinel,这会导致运维成本增加。我们在 Codis Dashboard 中加入了 sentinel 的功能,实现了对 Group 内主从的自动 failover。

+

关键 PR:

+ +

1.8 可观测性提升

+

PikiwiDB(Pika) 的可观测性关键组件是 Pika-Exporter。在 3.5.2 版本中,我们虽然添加了 Redis Cache 缓存热数据,但缺少监控指标。在 3.5.3 版本中,我们增加了包括命中率、每秒命中次数、Redis Cache 内存使用量、Redis Cache 个数、Redis Cache DB 个数 等指标。

+

关键 PR:

+ +

关键 PR:

+ +

1.10 添加测试集

+

PikiwiDB(Pika) 测试集由 gtest 单测、Redis TCL 测试集和 Go 测试集组成:

+
    +
  • gtest 单测主要测试 Pika C++ 代码
  • +
  • Redis TCL 测试集来自 Redis,用于测试 PikiwiDB(Pika) 对 Redis 标准命令兼容度
  • +
  • Go 测试集可对 Pika 进行 Redis 命令测试、主从和 Codis 集群 e2e 测试
  • +
+

3.5.3 中添加了 Codis 集群 e2e 测试,关键 PR 如下:

+ +

1.11 工具集 +PikiwiDB(Pika) 一直重视工具集的建设,所有相关工具都可以在 https://github.com/OpenAtomFoundation/pika/tree/unstable/tools 中找到。在 3.5.3 版本中,我们新增了一个工具:

+

PikiwiDB(Pika) 支持大 key 分析工具 +https://github.com/OpenAtomFoundation/pika/pull/2195

+

1.12 文档更新

+

PikiwiDB(Pika) 的文档主要是 wiki 文档。在 3.5.3 版本中,我们更新了 Pika 支持的 Redis 命令文档。

+

文档链接: https://github.com/OpenAtomFoundation/pika/wiki/pika-%E6%94%AF%E6%8C%81%E7%9A%84redis%E6%8E%A5%E5%8F%A3%E5%8F%8A%E5%85%BC%E5%AE%B9%E6%83%85%E5%86%B5 +2 改进列表

+

在第一章节中,我们概述了 3.5.3 版本的主要功能升级和改进。下面详细列出了本次发版的相关 PR。

+

2.1 新特性

+ +

2.2 bug 修复

+ +

2.3 发版 tag +https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.3 +3 社区

+

如果你有任何疑问,欢迎加入交流群,PikiwiDB(Pika) 开源社区感谢大家的支持和帮助。

+

2024-03-27-Pika-3.5.3-connect

]]>
+
+ + <![CDATA[What's new in Pika v3.5.0]]> + https://www.pikiwidb.com/blog/Pika-3.5.0 + https://www.pikiwidb.com/blog/Pika-3.5.0 + Sun, 03 Dec 2023 00:00:00 GMT + + Pika 社区近期发布了备受期待的 v3.5.2 版本 https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.2-alpha ,不仅解决了历史遗留的 Bug 问题,还引入了多项新特性。这些新特性主要包括 Pika 支持 Redis 事务、Pika 上层增加缓存层实现冷热数据分离、提升读性能、Codis-Proxy 支持动态修改配置参数等等,无疑将会让用户感受到更为高效和稳定的使用体验。

+

新特性

+ +

bugfix

+ +

下期版本规划

+

预计再过两个月左右,我们会在农历新年前发布 3.5.3 版本,相关关键特性有:

+ +

感谢大家对 Pika 开源公众号的关注 ,Pika 3.5 版本重大特性及使用规范我们会在稍后的文章中进行介绍,我们下期再见~

+

2023-09-28-Pika-3.5.2-connect

]]>
+
+ + <![CDATA[What's new in Pika v3.5.1]]> + https://www.pikiwidb.com/blog/Pika-3.5.1 + https://www.pikiwidb.com/blog/Pika-3.5.1 + Thu, 28 Sep 2023 00:00:00 GMT + + Pika 社区很高兴宣布,我们今天发布已经过我们生产环境验证 v3.5.1 版本 https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.1

+

该版本不仅做了很多优化工作,还引入了多项新功能。这些新功能包括 动态关闭 WAL、ReplicationID 检测是否增量复制、在 K8s 环境上 Pika 服务的自动注册从而实现集群的自组织、以及 exporter 检测集群指标等等,无疑将会让用户享受到更为稳定和高效的 NoSQL 使用体验。

+

新特性

+
    +
  • 1 Slow log 增加队列等待时间统计,在队列阻塞的时候方便我们进行问题定位。PR 1997, 作者 wangshao1。
  • +
  • 2 主从复制使用 ReplicationID 判断是否进行增量同步,解决原主从同步方式切主后整个数据集会进行全量复制的问题,可以提升 Pika 性能。PR 1951, 作者 Mixficsol。
  • +
  • 3 WAL 以 'disablewal' 命令方式支持动态关闭,在写性能遇到瓶颈的时候,可以通过命令关闭 WAL 缓解写性能下降的问题,关闭 WAL 有机器宕机后丢失数据的风险,用户需要根据自己的使用习惯权衡。PR 2015,作者 Mixficsol。
  • +
  • 4 flush 线程数和 compaction 线程数合二为一,在 Compaction 性能瓶颈时,可以动态调整线程数,缓解 Comapction 损耗 Pika 性能的问题。PR 2014, 作者 Tianpingan。
  • +
  • 5 升级了 RocksDB 版本到 v8.3.3。PR 2000, 作者 dingxiaoshuai123。
  • +
  • 6 新增周期性打印工作队列的长度功能,在队列阻塞的时候可以快速定位问题。PR 1978, 作者 Tianpingan。
  • +
  • 7 新增利用一个 pika_exporter 监测整个集群的指标,实现一个 Pika Exporter 实例监控整个集群,解决了 3.5.0 版本一个 Pika Exporter 监测一个 Pika 实例消耗资源的问题。PR 1953, 作者 chenbt-hz。
  • +
  • 8 实现在 K8s 环境上 Pika 服务的自动注册,在启动时自动注册,从而实现集群的自组织 ,实现了通过命令拉起整个 Pika Cluster 集群。PR 1931, 作者 machinly。
  • +
+

2 bug 修复

+
    +
  • 1 调整了 Rate_limit 参数,修复了压测时出现 RPS 为 0 的情况 。PR 2009, 作者 Mixficsol。
  • +
  • 2 修复了 INFODATA 命令中对于遍历数据文件时出现空路径的逻辑判断。PR 1996, 作者 Mixficsol。
  • +
  • 3 修复了 Codis 在线上出现大毛刺的问题。PR 2016, 作者 chejinge。
  • +
  • 4 修复了 macOS 环境下编译使用 tools 导致编译不过的问题 。PR 2011, 作者 A2ureStone。
  • +
  • 5 减少了 exporter 非必要日志的打印,降低 了资源利用率。PR 1945, 作者 Mixficsol。
  • +
+

3 使用建议

+

本次新增了几个配置参数,大家在使用过程中,需要根据使用情况按需调整:

+
    +
  • 1 max-rsync-parallel-num:主从全量复制线程数,需要根据自己机器 CPU 核数和部署实例个数进行调整,建议最小设置为 2。
  • +
  • 2 rate-limiter-bandwidth: 限制 RocksDB 数据库读写速度,限制数据库在一定时间内可以读写的数据量,默认 2000MiB/s,需要根据自己的机器性能和部署实例做调整。
  • +
  • max-background-jobs: compaction 和 flushdb 线程数,要根据自己机器 CPU 核数和部署实例个数进行调整,建议最小设置为 4。
  • +
  • 3 throttle-bytes-per-second: 主从复制传输限速参数,默认为 200MiB/s,该参数可以根据机器网卡的配置及部署 pika 实例的个数进行调整。
  • +
+

2023-09-28-Pika-3.5.1-connect.png

]]>
+
+ + <![CDATA[What's new in Pika v3.5.0]]> + https://www.pikiwidb.com/blog/Pika-3.5.0 + https://www.pikiwidb.com/blog/Pika-3.5.0 + Fri, 25 Aug 2023 00:00:00 GMT + + Pika 社区近期发布了备受期待的 v3.5.2 版本 https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.2-alpha ,不仅解决了历史遗留的 Bug 问题,还引入了多项新特性。这些新特性主要包括 Pika 支持 Redis 事务、Pika 上层增加缓存层实现冷热数据分离、提升读性能、Codis-Proxy 支持动态修改配置参数等等,无疑将会让用户感受到更为高效和稳定的使用体验。

+

新特性

+ +

bugfix

+ +

下期版本规划

+

预计再过两个月左右,我们会在农历新年前发布 3.5.3 版本,相关关键特性有:

+ +

感谢大家对 Pika 开源公众号的关注 ,Pika 3.5 版本重大特性及使用规范我们会在稍后的文章中进行介绍,我们下期再见~

+

2023-09-28-Pika-3.5.2-connect

]]>
+
+ + <![CDATA[Pika Blackwidow 引擎数据存储格式]]> + https://www.pikiwidb.com/blog/pika-blackwidow + https://www.pikiwidb.com/blog/pika-blackwidow + Thu, 16 Jul 2020 00:00:00 GMT + + Blackwidow本质上是基于rocksdb的封装,使本身只支持kv存储的rocksdb能够支持多种数据结构, 目前Blackwidow支持五种数据结构的存储:String结构(实际上就是存储key, value), Hash结构,List结构,Set结构和ZSet结构, 因为Rocksdb的存储方式只有kv一种, 所以上述五种数据结构最终都要落盘到Rocksdb的kv存储方式上,下面我们展示Blackwidow和rocksdb的关系并且说明我们是如何用kv来模拟多数据结构的。

+

pika-blackwidow-1

+

1. String结构的存储

+

String本质上就是Key, Value, 我们知道Rocksdb本身就是支持kv存储的, 我们为了实现Redis中的expire功能,所以在value后面添加了4 Bytes用于存储timestamp, 作为最后Rocksdb落盘的kv格式,下面是具体的实现方式:

+

pika-blackwidow-2

+

如果我们没有对该String对象设置超时时间,则timestamp存储的值就是默认值0, 否则就是该对象过期时间的时间戳, 每次我们获取一个String对象的时候, 首先会解析Value部分的后四字节, 获取到timestamp做出判断之后再返回结果。

+

2. Hash结构的存储

+

blackwidow中的hash表由两部分构成,元数据(meta_key, meta_value), 和普通数据(data_key, data_value), 元数据中存储的主要是hash表的一些信息, 比如说当前hash表的域的数量以及当前hash表的版本号和过期时间(用做秒删功能), 而普通数据主要就是指的同一个hash表中一一对应的field和value,作为具体最后Rocksdb落盘的kv格式,下面是具体的实现方式:

+
    +
  1. 每个hash表的meta_key和meta_value的落盘方式: +pika-blackwidow-3
  2. +
+

meta_key实际上就是hash表的key, 而meta_value由三个部分构成: 4Bytes的Hash size(用于存储当前hash表的大小) + 4Bytes的Version(用于秒删功能) + 4Bytes的Timestamp(用于记录我们给这个Hash表设置的超时时间的时间戳, 默认为0)

+
    +
  1. hash表中data_key和data_value的落盘方式: +pika-blackwidow-4
  2. +
+

data_key由四个部分构成: 4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + Field的内容, 而data_value就是hash表某个field对应的value。

+
    +
  1. 如果我们需要查找一个hash表中的某一个field对应的value, 我们首先会获取到meta_value解析出其中的timestamp判断这个hash表是否过期, 如果没有过期, 我们可以拿到其中的version, 然后我们使用key, version,和field拼出data_key, 进而找到对应的data_value(如果存在的话)
  2. +
+

3. List结构的存储

+

blackwidow中的list由两部分构成,元数据(meta_key, meta_value), 和普通数据(data_key, data_value), 元数据中存储的主要是list链表的一些信息, 比如说当前list链表结点的的数量以及当前list链表的版本号和过期时间(用做秒删功能), 还有当前list链表的左右边界(由于nemo实现的链表结构被吐槽lrange效率低下,所以这次blackwidow我们底层用数组来模拟链表,这样lrange速度会大大提升,因为结点存储都是有序的), 普通数据实际上就是指的list中每一个结点中的数据,作为具体最后Rocksdb落盘的kv格式,下面是具体的实现方式

+
    +
  1. 每个list链表的meta_key和meta_value的落盘方式: +pika-blackwidow-5
  2. +
+

meta_key实际上就是list链表的key, 而meta_value由五个部分构成: 8Bytes的List size(用于存储当前链表中总共有多少个结点) + 4Bytes的Version(用于秒删功能) + 4Bytes的Timestamp(用于记录我们给这个List链表设置的超时时间的时间戳, 默认为0) + 8Bytes的Left Index(数组的左边界) + 8Bytes的Right Index(数组的右边界)

+
    +
  1. list链表中data_key和data_value的落盘方式: +pika-blackwidow-6
  2. +
+

data_key由四个部分构成: 4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + 8Bytes的Index(这个记录的就是当前结点的在这个list链表中的索引), 而data_value就是list链表该node中存储的值

+

4. Set结构的存储

+

blackwidow中的set由两部分构成,元数据(meta_key, meta_value), 和普通数据(data_key, data_value), 元数据中存储的主要是set集合的一些信息, 比如说当前set集合member的数量以及当前set集合的版本号和过期时间(用做秒删功能), 普通数据实际上就是指的set集合中的member,作为具体最后Rocksdb落盘的kv格式,下面是具体的实现方式:

+
    +
  1. 每个set集合的meta_key和meta_value的落盘方式: +pika-blackwidow-7
  2. +
+

meta_key实际上就是set集合的key, 而meta_value由三个部分构成: 4Bytes的Set size(用于存储当前Set集合的大小) + 4Bytes的Version(用于秒删功能) + 4Bytes的Timestamp(用于记录我们给这个set集合设置的超时时间的时间戳, 默认为0)

+
    +
  1. set集合中data_key和data_value的落盘方式: +pika-blackwidow-8
  2. +
+

data_key由四个部分构成: 4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + member的内容, 由于set集合只需要存储member, 所以data_value实际上就是空串

+

5. ZSet结构的存储

+

blackwidow中的zset由两部部分构成,元数据(meta_key, meta_value), 和普通数据(data_key, data_value), 元数据中存储的主要是zset集合的一些信息, 比如说当前zset集合member的数量以及当前zset集合的版本号和过期时间(用做秒删功能), 而普通数据就是指的zset中每个member以及对应的score, 由于zset这种数据结构比较特殊,需要按照memer进行排序,也需要按照score进行排序, 所以我们对于每一个zset我们会按照不同的格式存储两份普通数据, 在这里我们称为member to score和score to member,作为具体最后Rocksdb落盘的kv格式,下面是具体的实现方式:

+
    +
  1. 每个zset集合的meta_key和meta_value的落盘方式: +
  2. +
+

meta_key实际上就是zset集合的key, 而meta_value由三个部分构成: 4Bytes的ZSet size(用于存储当前zSet集合的大小) + 4Bytes的Version(用于秒删功能) + 4Bytes的Timestamp(用于记录我们给这个Zset集合设置的超时时间的时间戳, 默认为0)

+
    +
  1. 每个zset集合的data_key和data_value的落盘方式(member to score): +
  2. +
+

member to socre的data_key由四个部分构成:4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + member的内容, data_value中存储的其member对应的score的值,大小为8个字节,由于rocksdb默认是按照字典序进行排列的,所以同一个zset中不同的member就是按照member的字典序来排列的(同一个zset的key size, key, 以及version,也就是前缀都是一致的,不同的只有末端的member).

+
    +
  1. 每个zset集合的data_key和data_value的落盘方式(score to member): +
  2. +
+

score to member的data_key由五个部分构成:4Bytes的Key size(用于记录后面追加的key的长度,便与解析) + key的内容 + 4Bytes的Version + 8Bytes的Score + member的内容, 由于score和member都已经放在data_key中进行存储了所以data_value就是一个空串,无需存储其他内容了,对于score to member中的data_key我们自己实现了rocksdb的comparator,同一个zset中score to member的data_key会首先按照score来排序, 在score相同的情况下再按照member来排序

+

Blackwidow相对于Nemo有哪些优势

+
    +
  1. Blackwidow采用了rocksdb的column families的新特性,将元数据和实际数据分开存放(对应于上面的meta数据和data数据), 这种存储方式相对于Nemo将meta, data混在一起存放更加合理, 并且可以提升查找效率(比如info keyspace的效率会大大提升)
  2. +
  3. Blackwidow中参数传递大量采用Slice而Nemo中采用的是std::string, 所以Nemo会有很多没有必要的string对象的构造函数以及析构函数的调用,造成额外的资源消耗,而Blackwidow则不会有这个问题
  4. +
  5. Blackwidow对kv模拟多数据结构的存储格式上做了重新设计(具体可以参考Nemo引擎数据存储格式和本篇文章),使之前在Nemo上出现的一些无法解决的性能问题得以解决,所以Blackwidow的多数据结构在某些场景下性能远远优于Nemo
  6. +
  7. 原来Nemo对多数据结构的Key的长度最大只能支持到256 Bytes,而Blackwidow经过重新设计,放开了多数据结构Key长度的这个限制
  8. +
  9. Blackwidow相对于Nemo更加节省空间,Nemo由于需要nemo-rocksdb的支持,所以不管在meta还是data数据部分都追加了version和timestamp这些信息,并且为了区分meta_key和data_key, 在最前面加入s和S(拿Set数据结构打比方),Blackwidow在这方面做了优化,使同样的数据量下Blackwidow所占用的空间比Nemo要小(举个例子,Blackwidow中List结构中的一个Node就比Nemo中的一个Node节省了16 Bytes的空间)
  10. +
  11. Blackwidow在锁的实现上参照了RocksDB事务里锁的实现方法,而弃用了之前Nemo的行锁,所以在多线程对同一把锁有抢占的情况下性能会有所提升
  12. +
]]>
+
+ + <![CDATA[pika_port 迁移工具]]> + https://www.pikiwidb.com/blog/Pika-Tools-Port-Bin + https://www.pikiwidb.com/blog/Pika-Tools-Port-Bin + Sun, 26 Apr 2020 00:00:00 GMT + + 项目作者: +

AlexStocks

+

适用版本:

+

3.1 和 2.x

+

项目地址:

+

https://github.com/ipixiu/pika-tools

+

https://github.com/Axlgrep/pika-tools 长期维护地址需自行编译

+

二进制包:

+

https://github.com/ipixiu/pika-port-bin

+

功能:

+

将Pika中的数据在线迁移到Pika、Redis(支持全量、增量同步)

+

开发背景:

+

之前Pika项目官方提供的pika_to_redis工具仅支持离线将Pika的DB中的数据迁移到Pika、Redis, 且无法增量同步,该工具可以直接伪装为一个Pika的从库,将主库数据通过同步获取并转发给Pika、Redis,同时并支持增量同步

+

实现:

+

trysync线程

+
    +
  1. 尝试与主库建立同步关系
  2. +
  3. 如果需要全同步,则在接收到master的db之后,启动migrator和sender线程将db里面的数据发送给Pika、Redis
  4. +
  5. 启动Slaveping线程定期给主库发送心跳,完成建立主从关系
  6. +
+

binlog_receiver线程

+
    +
  1. 接收主库发送过来的binlog并且将其解析成redis命令
  2. +
  3. 将redis命令转发给Pika、Redis
  4. +
+

migrator线程

+
    +
  1. 扫描不同数据类型的分库
  2. +
  3. 将key进行解析成响应数据Pika、redis指令
  4. +
  5. 将解析好的redis指令加载到sender的发送buf中
  6. +
+

sender线程

+
    +
  1. 从发送buf中读取数据,以非阻塞方式向Pika、redis发送数据
  2. +
  3. 接收Pika、redis返回的结果并解析,如果出现错误则显示错误结果
  4. +
+

使用帮助:

+
Usage: 
pika_port [-h] [-t local_ip -p local_port -i master_ip -o master_port
-m forward_ip -n forward_port -x forward_thread_num -y forward_passwd]
-f filenum -s offset -w password -r rsync_dump_path -l log_path
-h -- show this help
-t -- local host ip(OPTIONAL default: 127.0.0.1)
-p -- local port(OPTIONAL)
-i -- master ip(OPTIONAL default: 127.0.0.1)
-o -- master port(REQUIRED)
-m -- forward ip(OPTIONAL default: 127.0.0.1)
-n -- forward port(REQUIRED)
-x -- forward thread num(OPTIONAL default: 1)
-y -- forward password(OPTIONAL)
-f -- binlog filenum(OPTIONAL default: local offset)
-s -- binlog offset(OPTIONAL default: local offset)
-w -- password for master(OPTIONAL)
-r -- rsync dump data path(OPTIONAL default: ./rsync_dump)
-l -- local log path(OPTIONAL default: ./log)
-b -- max batch number when port rsync dump data (OPTIONAL default: 512)
-d -- daemonize(OPTIONAL)
example: ./pika_port -t 127.0.0.1 -p 12345 -i 127.0.0.1 -o 9221 -m 127.0.0.1 -n 6379 -x 7 -f 0 -s 0 -w abc -l ./log -r ./rsync_dump -b 512 -d
]]>
+
+
+
\ No newline at end of file diff --git "a/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/Pika \346\234\200\344\275\263\345\256\236\350\267\265/index.html" "b/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/Pika \346\234\200\344\275\263\345\256\236\350\267\265/index.html" new file mode 100644 index 0000000..6edd3a2 --- /dev/null +++ "b/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/Pika \346\234\200\344\275\263\345\256\236\350\267\265/index.html" @@ -0,0 +1,106 @@ + + + + + +Pika 最佳实践 | PikiwiDB(Pika) + + + + + + + + + +

Pika 最佳实践

我们根据360内部的pika使用经验及社区用户的问题反馈,整理了如下文档并会不断更新

+
+

为了避免以后你可能找不到本文,可点击右上方的star进行关注

+
+

pika最佳实践之零:

+

在群里提问主动带上版本号能大幅度加快问题解决速度(QQ群:294254078)

+

pika最佳实践之一:

+

我们建议使用3.0的最新版,如果不愿意使用3.X,请使用2.3.6,否则你会发现你遇到的很多问题都在我们的bug修复列表中。(目前2.0版本已不再维护)

+

pika最佳实践之二:

+

pika的线程数量建议和cpu总线程数一致,如果是单机多实例的部署,每个pika实例的线程数量可以酌情降低,但不建议低于cpu总线程数的1/2

+

pika最佳实践之三:

+

pika的性能和IO性能息息相关,我们不建议在机械盘上部署耗时敏感项目的pika,另外为了避免一些稀奇古怪的问题,主从服务器的硬件性能应当尽量一致

+

pika最佳实践之四:

+

在使用pika多数据结构的时候,尽量确保每个key中的field不要太多,建议每个key的field数量不要超过1万个,特大key可以考虑拆分为多个小key,这样可以避免超大key很多潜在的性能风险

+

pika最佳实践之五:

+

root-connection-num参数非常有用,意为“允许通过127.0.0.1登录pika的连接数”,它与最大连接数配置项maxclients独立,maxclients的用尽并不会影响root-connection-num,因此在发生异常maxclients被用尽的场景中,管理员仍然可以登录pika所在服务器并通过127.0.0.1来登入pika处理问题,避免了maxclients耗尽无法登录处理的尴尬局面

+

pika最佳实践之六:

+

client kill命令被加强了,如果你想一次性杀掉当前pika的所有连接,只需要执行client kill all,不用担心,用于同步的连接不会受到影响

+

pika最佳实践之七:

+

适当的调整timeout参数,通过该参数pika会主动断开不活动时间超过timeout值的连接,避免连接数耗尽问题的发生,由于连接也需要申请内存,因此合理的配置timeout参数也能够在一定程度上降低pika的内存占用

+

pika最佳实践之八:

+

pika的内存占用主要集中在sst文件的cache和连接申请内存,而通常连接申请内存会比sst的cache要大很多,pika目前已支持连接申请内存的动态调整、回收,因此连接占用的总内存大小是可以粗略估算的,如果你的pika内存占用远超预估或大于10g,那么可能是内存泄漏了,尝试依次执行命令client kill alltcmalloc free来对连接内存进行强制回收,如果效果不好请升级到最新版本

+

pika最佳实践之九:

+

非常不建议单机运行pika,最简集群状态应为一主一从,而主从集群的容灾模式有很多种,可以考虑使用lvs、vip漂移、配置管理中间件等

+

pika最佳实践之十:

+

建议使用主从集群而不是双主模式,在实际使用中双主模式对使用规范的要求、网络环境要求相对更高,使用不规范、网络环境不好会造成双主模式出现问题,在出现问题后,双主模式的数据修复比主从集群数据修复复杂度要大

+

pika最佳实践之十一:

+

如果你的pika单机运行(非主从、主主集群),并部署在可靠的存储上,那么可以考虑通过关闭binlog(将write-binlog参数设置为no)来提高写入性能,不过我们并不推荐单机运行,至少应当有一个从库用于容灾,所以非单机运行pika 不建议关闭binlog

+

pika最佳实践之十二:

+

pika的数据目录中有大量的sst文件,这些文件随着pika数据量的增加而增加,因此你需要为pika配置一个更大的open_file_limit避免不够用,如果你不希望pika占用太多的文件文件描述符,可以通过适当增大单个sst的体积来降低sst的总数量,对应参数为target-file-size-base

+

pika最佳实践之十三:

+

不要修改log目录中的write2file文件和manifest,它们是同步相关的重要文件,write2filebinlog角色,而manifest则用来确保实例重启后的binlog续写及实例为从库时帮助同步中断重连后续传

+

pika最佳实践之十四:

+

pika的全量同步是通过rsync来进行的,因此我们提供了rsync的传输限速参数db-sync-speed,该参数的单位是mb,我们建议在千兆环境中该参数设置不应高于75,而在万兆环境中不应高于500,这样可以避免pika在全量同步的时候将所在服务器网卡用尽而影响到部署在服务器上的其它服务

+

pika最佳实践之十五:

+

在pika中执行key *并不会造成pika阻塞(pika是多线程的),但在存在巨量key的场景下可能会造成临时占用巨量内存(这些内存用于该连接存放key *的执行结果,会在key *执行完毕后释放),因此使用keys *一定要小心谨慎

+

pika最佳实践之十六:

+

如果发现pika有数据但info keyspace的显示均为0,这是因为pika并没有像Redis对key的数量做实时统计并展示,pika中key的统计需要人工触发,执行info keyspace 1,注意执行info keyspace是不会触发统计的,没有带上最后的参数1将会仅仅展示上一次的统计结果,key的统计是需要时间的(这是一个异步的操作),执行状态可以通过info stats中的is_scaning_keyspace进行查看,该项值为yes表明统计正在进行,为no时表明没有正在进行的统计/上一次统计已结束,在统计执行完毕前info keyspace不会更新,info keyspace的数据是存放在内存里的,重启将清零

+

pika最佳实践之十七:

+

不要在pika执行全量compact的时候触发key统计(info keyspace 1)或执行keys *,否则会造成数据体积暂时膨胀直到key统计、keys *执行结束

+

pika最佳实践之十八:

+

对存在大量过期、多数据结构内元素操作的实例配置compact-cron可以非常好的避免无效但还未被彻底清理的数据对性能造成的影响,或升级到3.0后打开新的key级auto_compact功能 +如果你遇到了下面的情况,那么你的实例可能存在未及时清理的无效数据带来的性能风险:

+
    +
  1. 异常的数据体积(大于估算值10%以上),可以通过执行compact命令,在compact执行完毕后观察数据体积是否恢复正常
  2. +
  3. 请求耗时突然异常增大,可以通过执行compact命令,在compact执行完毕后观察请求耗时是否恢复正常
  4. +
+

pika最佳实践之十九:

+

在pika3.0中我们提供了过期key的统计(可通过info keyspace 1来触发统计,通过info keyspace查看统计结果),统计结果中的invaild_keys的值为“已删除/过期但还未被物理删除的key的数量”,建议关注该值并在无效key数量较多时通过compact命令来清理,这样能够将未物理清理的无效数据控制在一个较好的程度从而确保pika的性能稳定,如果pika中存储的数据是规律性过期的,例如每个key的过期时间为7天,那么建议通过配置compact-cron参数来实现每天的定时全自动全量compactcompact会占用一定的io资源,因此如果磁盘IO压力过大,建议将其配置为业务低峰期执行,例如深夜

+

pika最佳实践之二十:

+

write2file的角色相当于binlog,应当根据实际写入情况调整write2file到合适的保留周期/数量,建议write2file保留周期/数量不低于48小时,足够的write2file能够让很多情况变得轻松,例如:大数据集群的从库扩容、从库服务器关机维修、从库迁移等等,不会因为主库write2file过期而被迫全量重传

+

pika最佳实践之二十一:

+

在主库写入量过大(普通ssd,大致写入qps大于5万)的情况下从库可能会发生同步延迟问题,可以调整从库的sync-thread-num参数来提高从库同步性能,该参数控制着从库的同步线程,每个线程通过hash来负责对应的key的同步,因此主库写入操作的不同的key的数量越多该参数的效果就会越好,而如果巨量的写入仅集中在几个key中,那么该参数可能无法达到预期效果

+

pika最佳实践之二十二:

+

pika的备份生成为快照式,通过硬链接存放在dump目录中以日期为后缀,备份每天只能生成一份,多次生成备份时新的备份会覆盖之前的。在生成备份快照的时候,为了确保数据的一致性pika会暂时阻塞写入,阻塞时间与实际数据量相关,根据测试500g的pika生成备份快照也仅需50ms,在写入阻塞的过程中连接不会中断请求不会异常,但client会感觉到“在那一瞬间请求耗时增加了一些”。由于pika的快照是db目录中sst文件的硬连接,因此最初这个目录是不会占用磁盘空间的,而在pika db目录中的sst文件发生了合并、删除后,硬链接会因为其特性而体现真实体积从而开始占用磁盘空间,所以请根据实际的磁盘空间调整备份保留天数,避免备份太多而造成磁盘空间用尽

+

pika最佳实践之二十三:

+

如果写入量巨大且磁盘性能不足以满足rocksdb memtable的及时刷盘需求,那么rocksdb很可能会进入写保护模式(写入将被全部阻塞),对于该问题我们建议更换性能更好的存储来支撑,或者降低写入频率(例如将集中写数据的2小时拉长到4小时),也可适当加大write-buffer-size的值来提高memtable的总容量从而降低整个memtable被写满的可能,但实际根据测试发现修改该参数并不能彻底解决该问题,因为“写的memtable迟早要刷下去的!之前刷不动,现在也刷不动!”

+

pika最佳实践之二十四:

+

pika对数据进行了压缩,默认压缩算法为snappy,并允许改为zlib,因此每一次数据的存入、读出都需要经过压缩、解压,这对cpu有一定的消耗,非常建议像使用Redis一样使用pika:在pika中关闭压缩,而在client中完成数据的压缩、解压,这样不仅能够降低数据体积,还能有效降低pika的cpu压力,如果你的存储空间不是问题但并不想调整client,可以关闭压缩来降低cpu压力,代价是磁盘占用的增加,注意关闭、开启压缩需要重启实例但无需重做数据

+

pika最佳实践之二十五:

+

读写分离很重要,pika在常见的主从集群中由于写入是单点的(主库),因此写入性能是有极限的,而读取可以通过多个从库来共同支撑,因此pika集群的读取性能是随着从库数量的增加而增加的,所以对于读取量很大的场景,建议在业务层代码加入读写分离策略同时在pika层增加从库数量通过多个从库来提供读服务,这样能够大幅度提高集群稳定性并有效降低读耗时

+

pika最佳实践之二十六:

+

全量compact的原理是逐步对rocksdb的每一层做数据合并、清理工作,在这个过程中会新增、删除大量的sst文件,因此在执行全量compact的时候可以发现数据体积先增大后减小并最终减小到一个稳定值(无效、重复数据合并、清理完毕仅剩有效数据),建议在执行compact前确保磁盘空余空间不低于30%避免新增sst文件时将磁盘空间耗尽,另外pika支持对指定数据结构进行compact,例如一个实例中已知hash结构的无效数据很少但hash结构数据量很大,set结构数据量很大且无效数据很多,在这个例子中hash结构的compact是没有必要的,你可以通过compact set实现仅仅对set结构的compact

+

pika最佳实践之二十七:

+

备份是以硬链接db目录中的sst的方式产生的,因此在存在备份文件的情况下,一旦执行全量compact由于pika db目录中的所有sst都会被compact“清洗”一遍(逐步将所有老的sst删除替换成新的sst),这将造成备份硬链接文件的体积变为真实体积,极端情况下备份文件会额外占用一倍的空间,因此如果你的磁盘空余空间不大,那么在执行全量compact之前最好删除备份

+

pika最佳实践之二十八:

+

pika和Redis一样支持慢日志功能并可通过slowlog命令查看,但我们知道slowlog的存储是有上限的,这个上限取决于你的配置,如果配置过大会造成slowlog占用太多内存,而pika允许将慢日志记录到pika.ERROR日志中用于追溯、分析,该功能需要将slowlog-write-errorlog设置为yes

+

pika最佳实践之二十九:

+

pika没有提供Redis的命令改名(rename-command)功能,因为部分命令的改名会造成一些工具、中间件的工作异常(例如将config改名后哨兵会无法工作),因此pika额外增加了userpassuserblacklist来解决这一问题。userpass对应requirepass,使用userpass登录的用户会受到userblacklist的限制,它们无法执行配置在userblacklist中的命令,而requirepass则不受影响,可以简单的将通过requirepass登录pika的用户理解为“超级用户”,将通过userpass登录pika的用户理解为“普通用户”,我们非常建议pika运维将userpass提供给业务用于代码访问并在userblacklist增加例如slaveof,config,shutdown,bgsave,dumpoff,client,keys等管理类、风险性命令来避免误操作造成的故障

+

pika最佳实践之三十:

+

Pika在3.0.7版本对网络库进行了改造,原先网络通信以及数据查询插入操作都在配置文件中thread-num对应的线程中执行,改造过后网络通信还是在thread-num对应线程中执行,而数据写入和删除操作由配置文件中thread-pool-size控制的线程池中执行,用户可以根据自己的场景对这两个参数进行调整,如果客户端执行的是一些比较重的操作,可以适量将thread-pool-size调大,一般情况下我们建议thread-pool-size = 2 * thread-num

+

pika最佳实践之三十一:

+

Pika从3.0.5开始提供了更细致的compact策略,该策略允许对key的操作进行监控并在达到设置阈值的时候对该key进行单独的compact,这个功能仅对hash,set,zset,list这四种含有field的数据结构生效,对应的参数为:

+
    +
  • max-cache-statistic-keys 设置受监控key的数量,例如10000(监控1万个key)
  • +
  • small-compaction-threshold 设置操作阈值(该key中有多少个field被修改或该key中的filed被修改超多多少次),例如500
  • +
+

该功能特别适合(包括并不限于)以下或类似的使用场景,它能够将这些场景中的无效数据及时的清除从而确保性能的持续稳定:

+
    +
  1. 大量hash结构数据,频繁的修改、新增、删除对应key中的数据
  2. +
  3. 大量list结构,以类似队列的方式使用pika
  4. +
  5. 经常需要对多数据结构类型的key直接删除然后复用
  6. +
+

pika最佳实践之三十二:

+

在业务压力大、IO使用率高的时候尽量不要执行compact,因为在IO资源不足时compact过程中带来的IO消耗可能会与业务请求发生IO争抢,使实例整体性能下降,如果不小心执行了也没有关系,重启pika即可,数据不会损坏不会丢失,上一次未完成的compact残留的sst文件会被rocksdb自动安全的全部清理

+

pika最佳实践之三十三:

+

在建立主从的时候发现从库反复的进行全同步很可能是由于主库写入量太大,在全同步完毕期间清理掉了原先dumpdb时的binlog点位,导致从库在替换了db之后重新trysync发现点位又找不到,然后重新触发全同步,陷入了循环,这种场景下可以动态将主库的expire-logs-nums调大,让其保留尽量多的binlog, 建立主从成功之后再调节回来即可

+
+

不断更新

+ + \ No newline at end of file diff --git "a/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/index.html" "b/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/index.html" new file mode 100644 index 0000000..2b219d2 --- /dev/null +++ "b/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/index.html" @@ -0,0 +1,18 @@ + + + + + +使用与运维 | PikiwiDB(Pika) + + + + + + + + + + + + \ No newline at end of file diff --git "a/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/page info \344\277\241\346\201\257\350\257\264\346\230\216/index.html" "b/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/page info \344\277\241\346\201\257\350\257\264\346\230\216/index.html" new file mode 100644 index 0000000..8c07cb7 --- /dev/null +++ "b/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/page info \344\277\241\346\201\257\350\257\264\346\230\216/index.html" @@ -0,0 +1,20 @@ + + + + + +page info 信息说明 | PikiwiDB(Pika) + + + + + + + + + +

page info 信息说明

执行INFO命令

+
127.0.0.1:9221> info [section]
+
#主库:
# Server
pika_version:2.3.0 -------------------------------------------- pika 版本信息
pika_git_sha:3668a2807a3d047ea43656b58a2130c1566eeb65 --------- git的sha值
pika_build_compile_date: Nov 14 2017 -------------------------- pika的编译日期
os:Linux 2.6.32-2.0.0.8-6 x86_64 ------------------------------ 操作系统信息
arch_bits:64 -------------------------------------------------- 操作系统位数
process_id:12969 ---------------------------------------------- pika pid信息
tcp_port:9001 ------------------------------------------------- pika 端口信息
thread_num:12 ------------------------------------------------- pika 线程数量
sync_thread_num:6 --------------------------------------------- sync线程数量
uptime_in_seconds:3074 ---------------------------------------- pika 运行时间(秒)
uptime_in_days:0 ---------------------------------------------- pika 运行时间(天)
config_file:/data1/pika9001/pika9001.conf --------------------- pika conf文件位置
server_id:1 --------------------------------------------------- pika的server id

# Data
db_size:770439 ------------------------------------------------ db的大小(Byte)
db_size_human:0M ---------------------------------------------- 人类可读的db大小(M)
compression:snappy -------------------------------------------- 压缩方式
used_memory:4248 ---------------------------------------------- 使用的内存大小(Byte)
used_memory_human:0M ------------------------------------------ 人类可读的使用的内存大小(M)
db_memtable_usage:4120 ---------------------------------------- memtable的使用量(Byte)
db_tablereader_usage:128 -------------------------------------- tablereader的使用量(Byte)

# Log
log_size:110174 ----------------------------------------------- binlog的大小(Byte)
log_size_human:0M --------------------------------------------- 人类可读的binlog大小(M)
safety_purge:none --------------------------------------------- 目前可以安全删除的文件名
expire_logs_days:7 -------------------------------------------- 设置binlog过期天数
expire_logs_nums:10 ------------------------------------------- 设置binlog过期数量
binlog_offset:0 388 ------------------------------------------- binlog偏移量(文件号,偏移量)

# Clients
connected_clients:2 ------------------------------------------- 当前连接数

# Stats
total_connections_received:18 --------------------------------- 总连接次数统计
instantaneous_ops_per_sec:1 ----------------------------------- 当前qps
total_commands_processed:633 ---------------------------------- 请求总计
is_bgsaving:No, , 0 ------------------------------------------- pika 备份信息:是否在备份,备份名称,备份
is_scaning_keyspace:No ---------------------------------------- 是否在执行scan操作
is_compact:No ------------------------------------------------- 是否在执行数据压缩操作
compact_cron: ------------------------------------------------- 定时compact(format: start-end/ratio, eg. 02-04/60)
compact_interval: --------------------------------------------- compact的间隔(format: interval/ratio, eg. 6/60)

# CPU
used_cpu_sys:48.52 -------------------------------------------- Pika进程系统CPU占用时间
used_cpu_user:73.10 ------------------------------------------- Pika进程用户CPU占用时间
used_cpu_sys_children:0.05 ------------------------------------ Pika子进程系统CPU占用时间
used_cpu_user_children:0.05 ----------------------------------- Pika子进程用户CPU占用时间

# Replication(MASTER)
role:master --------------------------------------------------- 本实例角色
connected_slaves:1 -------------------------------------------- 当前从库数量
slave0:ip=192.168.1.1,port=57765,state=online,sid=2,lag=0 ----- lag:当前主从binlog相差的字节数(byte),如果有多个从库则依次展示

#从库(区别仅在于同步信息的展示):
# Replication(SLAVE)
role:slave ---------------------------------------------------- 本实例角色
master_host:192.168.1.2 --------------------------------------- 主库IP
master_port:9001 ---------------------------------------------- 主库端口
master_link_status:up ----------------------------------------- 当前同步状态
slave_read_only:1 --------------------------------------------- 从库是否readonly
repl_state: connected ----------------------------------------- 从库同步连接的当前状态

# Keyspace(key数量展示,按照数据类型分类展示,默认不更新,仅在执行info keyspace 1的时候刷新该信息)
# Time:2016-04-22 17:08:33 ------------------------------------ 上一次统计的时间
db0 Strings_keys=100004, expires=0, invaild_keys=0
db0 Hashes_keys=2, expires=0, invaild_keys=0
db0 Lists_keys=0, expires=0, invaild_keys=0
db0 Zsets_keys=1, expires=0, invaild_keys=0
db0 Sets_keys=0, expires=0, invaild_keys=0
# keys:当前有效KEY的数量,等同于redis的keys
# expires:keys中带有expire属性的key的数量,等同于Redis
# invalid_keys:pika独有,指已经失效(标记删除),但还未被rocksdb彻底物理删除的key,虽然这些key不再会被访问到,但会占用一定磁盘空间,如果发现较大可以通过执行compact来彻底清理

# DoubleMaster(MASTER)
role:master --------------------------------------------------- 双主角色
the peer-master host: ----------------------------------------- 双主对端IP
the peer-master port:0 ---------------------------------------- 双主对端Port
the peer-master server_id:0 ----------------------------------- 双主对端server id
double_master_mode: False ------------------------------------- 是否配置双主模式
repl_state: 0 ------------------------------------------------- 双主连接状态
double_master_recv_info: filenum 0 offset 0 ------------------- 从对端接受的Binlog偏移量
+ + \ No newline at end of file diff --git "a/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\345\210\206\345\270\203\345\274\217\346\250\241\345\274\217\347\256\200\345\215\225\346\225\231\347\250\213/index.html" "b/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\345\210\206\345\270\203\345\274\217\346\250\241\345\274\217\347\256\200\345\215\225\346\225\231\347\250\213/index.html" new file mode 100644 index 0000000..cc93873 --- /dev/null +++ "b/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\345\210\206\345\270\203\345\274\217\346\250\241\345\274\217\347\256\200\345\215\225\346\225\231\347\250\213/index.html" @@ -0,0 +1,39 @@ + + + + + +分布式模式简单教程 | PikiwiDB(Pika) + + + + + + + + + +

分布式模式简单教程

关于sharding mode,pika底层提供slot 的概念。Pika将key进行哈希取模之后散列到各个slot当中处理。sharding mode 根据线上的具体情况可以应用于单个pika,也可以应用到多个pika组成的pika cluster。这个tutorial主要介绍开启sharding mode 需要了解的一些概念,以及需要调整的一些配置参数。

+

0. 模式的选择

+

目前pika 分为两种模式,两种模式不可兼容,所以请一定先根据业务确定使用哪一种模式。

+

一种是经典模式(classic),经典模式下可以支持绝大多数的业务压力,同时支持8个db(db0-db7)的并发读写。建议一般的业务线可以先压测这个模式。

+

如果经典模式不能满足线上巨大的压力,可以尝试另一种模式,集群模式(sharding),相对于经典模式,集群模式会提供更高的QPS,同时也会占用更多的硬件资源。以Codis下配置pika为其后端存储为例,codis 默认是集群slots总数为1024,每个slots 都提供五种数据结构的读写。对应每一种数据结构,pika都会起rocksdb实例。这样,集群需要起1024*5个rocksdb实例,集群模式的意义当然是把这些5120个pika实例分布在各个机器的pika实例上。所以我们推荐集群需要一定规模的物理机,这个样每个物理机上承载的rocksdb实例不会太多。当然我们的设计之初当然是使用人员自行决定需要多少物理机来分布5120个rocksdb实例。为什么不能布置在一台物理机上呢?原因如下:

+

1,过多的rocksdb 实例同时compaction的概率变高,对磁盘的压力过大。

+

2, 每个rocksdb会占用一定数量的文件描述符和内存,这个数字乘以5120很容易将系统资源耗尽。

+

总之,一定是更多的硬件资源提供更多的性能,建议新接触pika的同学可以用我们的经典模式,如果完全满足不了目前的需求,可以考虑用更多的物理资源,使用集群模式。

+

具体的性能测试可以参考 3.2.x Performance

+

1. 所需要版本

+

Pika 从3.2.0版本之后支持sharding mode,建议用最新release。

+

2. 基本操作

+

关于slots的基本操作详见 slot commands

+

3. 配置文件说明

+

相关的配置文件调参

+
# default slot number each table in sharding mode
default-slot-num : 1024

# if this option is set to 'classic', that means pika support multiple DB, in
# this mode, option databases enable
# if this option is set to 'sharding', that means pika support multiple Table, you
# can specify slot num for each table, in this mode, option default-slot-num enable
# Pika instance mode [classic | sharding]
instance-mode : sharding

# Pika write-buffer-size
write-buffer-size : 67108864

# If the total size of all live memtables of all the DBs exceeds
# the limit, a flush will be triggered in the next DB to which the next write
# is issued.
max-write-buffer-size : 10737418240

# maximum value of Rocksdb cached open file descriptors
max-cache-files : 100
+

配置文件的说明可以在配置说明中找到。 +特别说明的是write-buffer-size 代表的是每一个rockdb实例的每一个memtable的大小,所有的rocksdb的所有的memtable大小上限由 +max-write-buffer-size控制。如果达到max-write-buffer-size数值,每个rocksdb 实例都会尝试flush当前的memtable以减少内存使用。

+

4. 兼容codis,twemproxy方案

+

目前的分布式框架依赖于开源项目,目前pika兼容codis,twemproxy。

+

具体的兼容方案详见Support Cluster Slots

+ + \ No newline at end of file diff --git "a/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\345\210\206\347\211\207\346\225\231\347\250\213/index.html" "b/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\345\210\206\347\211\207\346\225\231\347\250\213/index.html" new file mode 100644 index 0000000..10b28a7 --- /dev/null +++ "b/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\345\210\206\347\211\207\346\225\231\347\250\213/index.html" @@ -0,0 +1,76 @@ + + + + + +分片教程(3.1.2 ‐ 3.3.6) | PikiwiDB(Pika) + + + + + + + + + +

分片教程(3.1.2 ‐ 3.3.6)

Pika自版本3.1.2起开始对分片做了一系列支持,为此我们为分片模式添加了一系列的命令.

+

在Pika分片版本我们引入了Table的概念,一个Table下面可以有若干个slot(slot的数量受配置文件中default-slot-num限制)客户端过来的读写请求会根据Key进行映射,如果该pika负责这个slot,该key会打到对应的slot上执行.

+

用分片模式启动,Pika会为我们创建一个默认的Table(名称为db0),用户可以执行addslots命令向这个Table上增加slot,Pika会将Table对应的slot信息记录到db-path目录下的meta文件里.

+

不同Pika实例之间的slot是可以同步数据的,slot的身份可以是主可以是从,也可以既是主也是从,一旦slot有从的身份那么就是不可写的.

+

1.pkcluster info命令:

+

作用:用于展示slot的同步信息(包括Binlog偏移量,主从身份等)

+

pkcluster info slot: 查看默认table中所有slot的同步信息

+

pkcluster info slot db0:0-6,7,8: 查看table0下ID为0-6,7,8对应slot的同步信息

+

pkcluster info table 1: 查看table1的信息,包括QPS,table分片个数等信息。

+

2.pkcluster addslots命令:

+

作用:在默认table中添加指定ID的slot,ID的区间为[0,default-slot-num - 1],支持以下三种指定ID的语法

+

pkcluster addslots 0-2: 在默认的table中添加id为0,1,2的三个slot

+

pkcluster addslots 0-2,3: 在默认的table中添加id为0,1,2,3的四个slot

+

pkcluster addslots 0,1,2,3,4: 在默认的table中添加id为0,1,2,3,4的五个slot

+

3.pkcluster delslots命令:

+

作用:在默认table中删除指定ID的slot,ID的区间为[0,default-slot-num - 1],支持以下三种指定ID的语法

+

pkcluster delslots 0-2: 在默认的table中删除id为0,1,2的三个slot

+

pkcluster delslots 0-2,3: 在默认的table中删除id为0,1,2,3的四个slot

+

pkcluster delslots 0,1,2,3,4: 在默认的table中删除id为0,1,2,3,4的五个slot

+

4.pkcluster slotsslaveof命令:

+

作用:用于默认table下某些slot向其他Pika实例对应slot发起同步数据请求或者取消同步请求,指定slot的语法和上面addslots/delslots类似,但是这个命令中还支持使用all,表示默认table下的所有slot

+

pkcluster slotsslaveof no one [0-3,8-11 | all] 指定的slot断开主从同步

+

pkcluster slotsslaveof ip port [0-3,8,9,10,11 | all] 指定的slot建立主从同步

+

pkcluster slotsslaveof ip port [0,2,4,6,7,8,9 | all] force 指定的slot进行全同步

+

5.slaveof 命令

+

等价于 pkcluster slotsslave ip port all 命令

+

自pika3.3开始,分片模式支持动态创建table的功能。为了保持与原命令的兼容性和减少对多table不使用者的学习成本,pika默认会自动创建table 0,slot num为配置文件中的配置。使用其他table时,需要手动创建。

+

1. pkcluster addtable 命令:

+

作用:用于创建table,创建时需指定table-id,max-slot-num。默认table-id为0。

+

pkcluster addtable 1 64:创建table-id为1,max-slot-num为64的表。

+

2. pkcluster deltalbe 命令:

+

作用:用于删除table-id的表,并删除表中所有slot

+

pkcluster deltable 1 :删除table-id 为1的表,并删除表中所有slot。

+

3.pkcluster addslots命令:

+

作用:在table-id的表中中添加指定ID的slot,ID的区间为[0,max-slot-num - 1],支持以下三种指定ID的语法.不指定table-id时在默认表中添加。

+

pkcluster addslots 0-2 1: 在table-id为1的表中添加id为0,1,2的三个slot

+

pkcluster addslots 0-2,3 1: 在table-id为1的表中添加id为0,1,2,3的四个slot

+

pkcluster addslots 0,1,2,3,4 1: 在table-id为1的表中添加id为0,1,2,3,4的五个slot

+

4.pkcluster delslots命令:

+

作用:在table-id的表中删除指定ID的slot,ID的区间为[0,max-slot-num - 1],支持以下三种指定ID的语法

+

pkcluster delslots 0-2 1: 在table-id为1的表中删除id为0,1,2的三个slot

+

pkcluster delslots 0-2,3 1: 在table-id为1的表中删除id为0,1,2,3的四个slot

+

pkcluster delslots 0,1,2,3,4 1: 在table-id为1的表中删除id为0,1,2,3,4的五个slot

+

5.pkcluster slotsslaveof命令:

+

作用:用于table-id的表下某些slot向其他Pika实例对应slot发起同步数据请求或者取消同步请求,指定slot的语法和上面addslots/delslots类似,但是这个命令中还支持使用all,表示table-id下的所有slot

+

pkcluster slotsslaveof no one [0-3,8-11 | all] 1 指定table-id为1的表中slot断开主从同步

+

pkcluster slotsslaveof ip port [0-3,8,9,10,11 | all] 1 指定table-id为1的表中slot建立主从同步

+

pkcluster slotsslaveof ip port [0,2,4,6,7,8,9 | all] force 1 指定table-id为1的表中slot进行全同步

+
+

注意:

+

在分片模式下,pika全面支持输入参数为单个key的命令。

+

但对于输入参数可以是多个key的命令,在分片模式下进行了部分支持

+
+

目前分片模式不支持的命令

+
MsetnxScanKeys
ScanxPKScanRangePKRScanRange
RPopLPushZUnionstoreZInterstore
SUnionSUnionstoreSInter
SInterstoreSDiffSDiffstore
SMoveBitOpPfAdd
PfCountPfMergeGeoAdd
GeoPosGeoDistGeoHash
GeoRadiusGeoRadiusByMember
+

分片模式命令支持计划

+

基础设施:支持hash tags数据分片。用户可以针对具体的使用场景,一定程度上控制数据在集群中的分布。

+

基本方针:针对涉及多个Key的命令,Keys需要位于同一分片上,即只支持分片内的操作。而全局空间的命令将暂不支持。

+

例如:支持'RPOPLPUSH src dst',需要src和dst列表位于同一分片上,而用户可以通过加入hash tag的方式达到该目的。

+ + \ No newline at end of file diff --git "a/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\345\211\257\346\234\254\344\270\200\350\207\264\346\200\247\357\274\210\344\275\277\347\224\250\346\226\207\346\241\243\357\274\211/index.html" "b/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\345\211\257\346\234\254\344\270\200\350\207\264\346\200\247\357\274\210\344\275\277\347\224\250\346\226\207\346\241\243\357\274\211/index.html" new file mode 100644 index 0000000..d70a686 --- /dev/null +++ "b/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\345\211\257\346\234\254\344\270\200\350\207\264\346\200\247\357\274\210\344\275\277\347\224\250\346\226\207\346\241\243\357\274\211/index.html" @@ -0,0 +1,49 @@ + + + + + +副本一致性(使用文档) | PikiwiDB(Pika) + + + + + + + + + +

副本一致性(使用文档)

简介

+

副本一致性提供主从副本在短时间内达到数据一致的功能。

+

具体请求流程如下:

+

1,客户端请求到主分片上

+

2,主分片同步请求到一定个数(replication-num)从分片上

+

3,主接收到一定个数(consensus-level)的从反馈ACK

+

4,数据落盘,返回客户端请求

+

注意

+

目前副本一致性功能只能在分片模式下运行。

+

由于成员变换的功能暂时不支持,不建议在主从关系建立之后更换新的从副本。

+

关于配置:

+
# replication num defines how many followers in a single raft group, only [0, 1, 2, 3, 4] is valid
replication-num : 0
# consensus level defines how many confirms does leader get, before commit this log to client,
# only [0, ...replicaiton-num] is valid
consensus-level : 0

+

replication-num 含义是在分片副本中,从副本的个数。目前可以配置的参数范围为[0, 1, 2, 3, 4]

+

consensus-level 含义在返回客户端之前需要有多少从确认已经收到了这一条日志。目前可以配置的参数范围为[0, ...replicaiton-num]

+

example:

+

a) 使用3个副本(1主2从)场景,希望主分片上收到2副本ACK之后再返回客户端。

+

replication-num: 2

+

consensus-level: 2

+

b) 使用3个副本(1主2从)场景,希望写入大多数副本,即希望主分片上收到1副本ACK之后再返回客户端。

+

replication-num: 2

+

consensus-level: 1

+

c) 默认场景不开启一致性,希望写入主副本之后立马返回客户端,采用异步同步的方式将LOG同步给从副本。

+

replication-num: 0

+

consensus-level: 0

+

关于切主:

+

在一些场景下,例如写大多数场景,不能保证主上面的新写入数据一定会马上同步到所有从上面。这时候主副本down了,需要管理员根据各个副本的日志状况选择切主。如果切主不当可能会造成数据丢失,同步异常等情况,请小心操作。

+

具体流程:

+

使用 pkcluster info slot 中查看各个从副本的分片日志信息,选择term 更大,或者term相同 index 更大的分片成为主。

+

example:

+

副本1 consensus_last_log=filenum: 9 offset: 65234985 term: 33 index: 998386

+

副本2 consensus_last_log=filenum: 9 offset: 65234985 term: 33 index: 998300

+

此时应该选择副本2为新主。管理员使用 pkcluster slotsslaveof ip port [0-3,8,9,10,11 | all] 命令可以进行切主操作。具体命令使用方法见Pika分片命令

+ + \ No newline at end of file diff --git "a/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\345\211\257\346\234\254\344\270\200\350\207\264\346\200\247\357\274\210\350\256\276\350\256\241\346\226\207\346\241\243\357\274\211/index.html" "b/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\345\211\257\346\234\254\344\270\200\350\207\264\346\200\247\357\274\210\350\256\276\350\256\241\346\226\207\346\241\243\357\274\211/index.html" new file mode 100644 index 0000000..a56d423 --- /dev/null +++ "b/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\345\211\257\346\234\254\344\270\200\350\207\264\346\200\247\357\274\210\350\256\276\350\256\241\346\226\207\346\241\243\357\274\211/index.html" @@ -0,0 +1,79 @@ + + + + + +副本一致性(设计文档) | PikiwiDB(Pika) + + + + + + + + + +

副本一致性(设计文档)

目前线程模型

+

非一致性场景

+

1,客户端请求加锁写入db和binlog文件

+

2,将结果返回客户端

+

3,通过发送BinlogSync请求向从库同步

+

4,从库返回BinlogSyncAck报告同步状况

+

+

一致性场景

+

1,客户端请求先写入binlog文件

+

2,通过发送BinlogSync请求向从库同步

+

3,从库返回BinlogSyncAck报告同步状况

+

4,将相应的请求写入db

+

5,将结果返回客户端

+

+

Binlog Header变动

+
/*
* *****************Type First Binlog Item Format******************
* |<Type>|<CreateTime>|<Term Id>|<Logic Id>|<File Num>|<Offset>|<Content Length>|<Content>|
* | 2 | 4 | 4 | 8 | 4 | 8 | 4 | ... |
* |----------------------------------------- 34 Bytes ------------------------------------|
*/
+

其中 TermId, 和Logic id是沿用Raft论文中term 和log index 的概念。具体的详见论文。

+

其中 File Num 和offset 是本条binlog在文件中的偏移量。

+

Pika的Binlog存在的意义是为了保证主从能够增量同步,而Raft Log存在的意义是为了保证Leader 和Follower 的数据够一致。某种意义上说这两个"Log"的概念是一样的,所以在实现上,将binlog 和 Raft Log 复用成一条log,目前的binlog header 中 Term Id 和 Logic Id 属于 Raft Log(简称日志)的信息,而File Num 和Offset 属于Binlog 的信息。

+

一致性协议的三阶段

+

日志恢复和复制基本按照Raft论文当中所做操作,这里不做过多解释。实现上,这里分为三个阶段。分别是日志的复制,日志的恢复,日志的协商。

+

熟悉Raft协议的读者可能会发现,这里的三个阶段跟Raft日志复制不是完全一样。在Pika的实现当中,基于pika现有的代码结构,我们把Leader 和Follower同步点位回退的逻辑单独提取出来,形成了Pika Trsysync的状态。任何日志的复制出错,pika会终止当前的日志复制(BinlogSync)状态,转而将状态机转化成Trysync的状态,进而Leader 和Follower 会进入日志的协商逻辑。协商成功之后会转入日志复制的逻辑。

+

+

日志复制

+

日志的逻辑结构如下,上面部分是Leader可能的log点位,下部分是Follower可能的log点位。

+

+

1,日志的复制的逻辑可以参考Raft协议的逻辑,这里举例说说明客户端从请求到返回,日志经过了怎样的流程。

+

Leader Status:

+

Committed Index : 10

+

Applied Index:8

+

Last Index: 15

+

Follower Status:

+

Committed Index : 7

+

Applied Index:5

+

LastIndex: 12

+

2,当Leader 发送13-15的日志到Follower的时候,Follower的状态会做如下更新:

+

Follower Status:

+

Committed Index : 10

+

Applied Index:5

+

LastIndex: 15

+

这时候日志6-10都是可以被应用到状态机的。但是对于日志11-15来说只能等到下一次收到Leader Committed Index 大于15的时候这些日志才能够被更新,这时候如果客户端没有继续写入,Follower的Committed index可以依靠ping消息(携带了Leader 的committed index)进行更新。

+

3,当Leader 接收到Follower的ack信息的时候,Leader 状态会做如下更新:

+

Leader Status:

+

Committed Index : 15

+

Applied Index: 8

+

Last Index: 15

+

此时日志9-15都是可以被应用到状态机,这里是写db,当日志9写入db之后,就会返回客户端,相应的Applied Index 更新为9。这时候日志9就可以返回客户端。

+

对于从来说,整体的日志复制的逻辑还是按照Raft论文当中进行的。唯一不同的是论文中日志回退的一部分逻辑放到了日志协商阶段进行。

+

日志恢复:

+

重启pika的时候,根据持久话的一致性信息(applied index 等)回复出之前的一致性状态。

+

日志协商:

+

这个阶段Follower节点主动发起Trysync流程,携带Last Index,向Leader发送协商同步点位请求。协商过程如下:

+

Follower携带last_index发动到Leader, Leader 通过Follower的last_index位置判断是否自己能够找到last_index对应的自己的相应的log,如果找到log并且两个log一致,Leader返回okay协商结束。如果没有找到,或者log不一致,Leader向Follower发送hints,hints是Leader本地的最新的日志。Follower通过hints,回退本地日志,更新自己的last_index,重新向主协商。最终Leader Follower达成一致,结束TrySync流程,进行日志复制流程。

+

+

Leader 日志协商的伪代码如下:

+
Status LeaderNegotiate() {
reject = true
if (follower.last_index > last_index) {
send[last_index - 100, last_index]
} else if (follower.last_index < first_index) {
need dbsync
}
if (follower.last_index not found) {
need dbsync
}
if (follower.last_index found but term not equal) {
send[found_index - 100, found_index]
}
reject = false
return ok;
}
+

Follower日志协商的伪代码日下:

+
Status FollowerNegotiate() {
if last_index > hints[hints.size() - 1] {
TruncateTo(hints[hints.size() - 1]);
}
for (reverse loop hints) {
if (hint.index exist && hint.term == term) {
TruncateTo(hint.index)
send trysync with log_index = hint.index
return ok;
}
}
// cant find any match
TruncateTo(hints[0])
send trysync with log_index = last_index
}
+

以上介绍了关于日志的具体三个阶段。整体的逻辑遵从与Raft论文的设计,在实现细节上根据Pika目前的代码结构进行了一些列的调整。

+

关于选主和成员变换

+

目前选主需要管理员手动介入,详见副本一致性使用文档

+

成员变换的功能目前暂不支持。

+ + \ No newline at end of file diff --git "a/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\345\244\232\345\272\223\347\211\210\345\221\275\344\273\244/index.html" "b/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\345\244\232\345\272\223\347\211\210\345\221\275\344\273\244/index.html" new file mode 100644 index 0000000..24faae5 --- /dev/null +++ "b/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\345\244\232\345\272\223\347\211\210\345\221\275\344\273\244/index.html" @@ -0,0 +1,65 @@ + + + + + +多库版命令 | PikiwiDB(Pika) + + + + + + + + + +

多库版命令

Pika自版本3.1.0起开始支持多db,为了兼容多db部分命令、配置参数发生了变化,具体变化如下:

+

1.info keyspace命令:

+

保留

+

info keyspace [1|0]:触发统计并展示、仅展示所有db的key信息

+

新增:

+

info keyspace [1|0] db0:触发统计并展示、仅展示db0的key信息

+

info keyspace [1|0] db0,db2:触发统计并展示、仅展示db0和db2的key信息

+

注意:db-name仅允许使用db[0-7]来表示,多个db-name使用逗号隔开

+

2.compact命令:

+

保留:

+

compact:对所有db进行compact

+

compact [string/hash/set/zset/list/all]:对所有db的某个数据结构、所有数据结构进行compact

+

新增:

+

compact db0 all:仅对db0的所有数据结构进行compact

+

compact db0,db2 all:对db0及db2的所有数据结构进行compact

+

compact db1 string:仅对db1的string数据结构进行compact

+

compact db1,db3 hash:对db1及db3的hash数据结构进行compact

+

注意:db-name仅允许使用db[0-7]来表示,多个db-name使用逗号隔开

+

3.slaveof命令:

+

保留:

+

slaveof 192.168.1.1 6236 [force]:为pika实例创建同步关系,影响所有db,可通过force参数进行实例级全量同步

+

删除:

+

slaveof 192.168.1.1 6236 1234 111222333:全局创建同步关系时不再允许指定write2file文件号、write2file文件偏移量

+

4.bgsave命令:

+

保留:

+

bgsave:对所有db进行快照式备份

+

新增:

+

bgsave db0:仅备份db0

+

bgsave db0,db3:仅备份db0及db3

+

注意:db-name仅允许使用db[0-7]来表示,多个db-name使用逗号隔开

+

5.purgelogsto命令:

+

保留:

+

purgelogsto write2file1000:删除db0中的write2file1000以前的所有write2file

+

新增:

+

purgelogsto write2file1000 db1:删除db1中的write2file1000以前的所有write2file,每次仅允许操作一个db

+

注意:db-name仅允许使用db[0-7]来表示

+

6.flushdb命令:

+

保留:

+

flushdb [string/hash/set/zset/list]:删除某个db中的某个数据结构

+

新增:

+

flushdb:删除某个db中的所有数据结构

+

注意:与redis一致,在pika中执行flushdb前请先select到准确的db,以防误删数据

+

7.dbslaveof命令:

+

dbslaveof db[0 ~ 7]: 同步某一个db

+

dbslaveof db[0 ~ 7] force: 全量同步某一个db

+

dbslaveof db[0 ~ 7] no one: 停止同步某一个db

+

dbslaveof db[0 ~ 7] filenum offset: 指定偏移量同步某一个db

+

注意:该命令需要在两个Pika实例已经建立了主从关系之后才能对单个db的同步状态进行控制

+ + \ No newline at end of file diff --git "a/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\345\256\211\350\243\205\344\275\277\347\224\250/index.html" "b/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\345\256\211\350\243\205\344\275\277\347\224\250/index.html" new file mode 100644 index 0000000..fa16d92 --- /dev/null +++ "b/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\345\256\211\350\243\205\344\275\277\347\224\250/index.html" @@ -0,0 +1,82 @@ + + + + + +安装使用 | PikiwiDB(Pika) + + + + + + + + + +

安装使用

快速试用

+

如果想快速试用pika,目前提供了Centos5,Centos6和Debian(Ubuntu16) binary版本,可以在release页面看到,具体文件是pikaX.Y.Z_xxx_bin.tar.gz。

+
1. unzip file
$ tar zxf pikaX.Y.Z_xxx_bin.tar.gz
2. change working directory to output
note: we should in this directory, caz the RPATH is ./lib;
$ cd output
3. run pika:
$ ./bin/pika -c conf/pika.conf
+

编译安装

+

CentOS (Fedora, Redhat)

+
    +
  • 安装必要的lib
  • +
+
$ sudo yum install gflags-devel snappy-devel glog-devel protobuf-devel
+
    +
  • 可选择的lib
  • +
+
$ sudo yum install zlib-devel lz4-devel libzstd-devel
+
    +
  • 安装gcc
  • +
+
$ sudo yum install gcc-c++
+
    +
  • 如果机器gcc版本低于4.8,需要切换到gcc4.8或者以上,下面指令可临时切换到gcc4.8
  • +
+
$ sudo wget -O /etc/yum.repos.d/slc6-devtoolset.repo http://linuxsoft.cern.ch/cern/devtoolset/slc6-devtoolset.repo
$ sudo yum install --nogpgcheck devtoolset-2
$ scl enable devtoolset-2 bash
+
    +
  • 获取项目源代码
  • +
+
$ git clone https://github.com/OpenAtomFoundation/pika.git
+
    +
  • 更新依赖的子项目
  • +
+
$ cd pika
$ git submodule update --init
+
    +
  • 切换到最新release版本
  • +
+
a. 执行 git tag 查看最新的release tag,(如 v2.3.1)
b. 执行 git checkout TAG切换到最新版本,(如 git checkout v2.3.1)
+
    +
  • 编译
  • +
+
$ make
+
+

note: 若编译过程中,提示有依赖的库没有安装,则有提示安装后再重新编译

+
+

Debian (Ubuntu)

+
    +
  • 安装必要的lib
  • +
+
$ sudo apt-get install libgflags-dev libsnappy-dev
$ sudo apt-get install libprotobuf-dev protobuf-compiler
$ sudo apt install libgoogle-glog-dev
+
    +
  • 获取项目源代码
  • +
+
$ git clone https://github.com/OpenAtomFoundation/pika.git
$ cd pika
+
    +
  • 切换到最新release版本
  • +
+
a. 执行 git tag 查看最新的release tag,(如 v2.3.1)
b. 执行 git checkout TAG切换到最新版本,(如 git checkout v2.3.1)
+
    +
  • 编译
  • +
+
$ make
+
+

note: 若编译过程中,提示有依赖的库没有安装,则有提示安装后再重新编译

+
+

静态编译方法

+

使用

+
$ ./output/bin/pika -c ./conf/pika.conf
+

注意

+

启动出现 Attempt to free invalid pointer 问题请尝试升级tcmalloc 版本,建议使用gperftools 2.7 版本包含的tcmalloc。

+ + \ No newline at end of file diff --git "a/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\345\267\256\345\274\202\345\214\226\345\221\275\344\273\244/index.html" "b/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\345\267\256\345\274\202\345\214\226\345\221\275\344\273\244/index.html" new file mode 100644 index 0000000..5aaa6c8 --- /dev/null +++ "b/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\345\267\256\345\274\202\345\214\226\345\221\275\344\273\244/index.html" @@ -0,0 +1,79 @@ + + + + + +差异化命令 | PikiwiDB(Pika) + + + + + + + + + +

差异化命令

config [get | set | rewrite]

+

在服务器配置中,支持参数的get、set、rewrite,支持的参数如下:

+
-GETSET
binlog-file-sizeox
compact-cronoo
compact-intervaloo
compressionox
daemonizeox
db-pathox
db-sync-pathox
db-sync-speedox
double-master-ipoo
double-master-portox
double-master-sidox
dump-expireoo
dump-pathox
dump-prefixoo
expire-logs-daysoo
expire-logs-numsoo
identify-binlog-typeoo
logleveloo
log-pathox
masterauthoo
max-background-compactionsox
max-background-flushesox
max-bytes-for-level-multiplierox
max-cache-filesox
maxclientsoo
maxmemoryox
network-interfaceox
pidfileox
portox
requirepassoo
root-connection-numoo
slaveofox
slave-priorityoo
slave-read-onlyoo
slotmigrateo (小于 3.0.0)o (小于 3.0.0)
slowlog-log-slower-thanoo
slowlog-write-errorlogo (小于 3.0.2)o(小于3.0.2)
sync-buffer-sizeox
sync-thread-numox
target-file-size-baseox
thread-numox
timeoutoo
userblacklistoo
userpassoo
write-buffer-sizeox
max-cache-statistic-keyso(小于3.0.6)o(小于3.0.6)
small-compaction-thresholdo(小于3.0.6)o(小于3.0.6)
databaseso(小于3.1.0)x
write-binlogoo
thread-pool-sizeox
slowlog-max-lenoo
share-block-cacheox
optimize-filters-for-hitsox
level-compaction-dynamic-level-bytesox
cache-index-and-filter-blocksox
block-sizeox
block-cacheox
sync-window-sizeoo
+

purgelogsto [write2file-name]

+

purgelogsto为pika原创命令, 功能为手动清理日志, 类似mysql的purge master logs to命令, 该命令有多重检测机制以确保日志一定为安全清理

+

client list

+

与redis相比, 展示的信息少于redis

+

client list order by [addr|idle]

+

pika原创命令,功能为按照ip address 或者 connection idle时间排序

+

client kill all

+

pika原创命令, 功能为杀死当前所有链接(不包括同步进程但包含自己)

+

慢日志(slowlog)

+

与redis不同, pika的慢日志不仅存放内存中允许通过slow log命令查看,同时也允许存放在error log中并无条数限制方便接分析,但需要打开slowlog-write-errorlog参数

+

bgsave

+

类似redis的bgsave, 先生成一个快照, 然后再将快照数据进行备份, 备份文件存放在dump目录下

+

dumpoff

+

强行终止正在执行的dump进程(bgsave), 执行该命令后备份会立即停止然后在dump目录下生成一个dump-failed文件夹(Deprecated from v2.0)

+

delbackup

+

删除dump目录下除正在使用(全同步中)的db快照外的其他快照

+

compact

+

立即触发引擎层(rocksdb)所有数据结构执行全量compact操作, 全量compact能够通过sst文件的合并消除已删除或过期但未即时清理的数据, 能够在一定程度上降低数据体积, 需要注意的是, 全量compact会消耗一定io资源

+

compact [string | hash | set | zset | list ]

+

立即触发引擎层(rocksdb)对指定数据结构执行全量compact操作, 指定数据结构的全量compact能够通过sst文件的合并消除已删除或过期但未即时清理的数据, 能够在一定程度上降低该结构数据的数据体积, 需要注意的是, 全量compact会消耗一定io资源

+

compact $db [string | hash | set | zset | list ]

+

对指定的db进行全量compact。例如 compact db0 all会对db0上所有数据结构进行全量compact。

+

flushdb [string | hash | set | zset | list ]

+

flushdb命令允许只清除指定数据结构的所有数据, 如需删除所有数据请使用flushall

+

keys pattern [string | hash | set | zset | list ]

+

keys命令允许只输出指定数据结构的所有key, 如需输出所有结构的key请不要使用参数

+

slaveof ip port [write2file-name] [write2file-pos] [force]

+

force参数用于触发强行全量同步(适用于主库write2file被清理无法为从库提供增量同步的场景), 全量同步后pika会自动切换至增量同步

+

sort

+

pika 不支持 sort 命令

+

dbslaveof db[0 ~ 7] filenum offset

+

需要与slaveof配合使用。dbslaveof命令允许通过指定write2file(binlog)的文件名称及同步位置来实现增量同步。这种操作分两步:第一步正常slaveof ip port 会与master匹配meta是否一致(db数目及编号是否一致)。此时slave节点binlog同步可能还是异常状态。第二步执行dbslaveof 设置对应db的同步点位。

+

pkscanrange type key_start key_end [MATCH pattern] [LIMIT limit]

+

对指定数据结构进行正向scan, 列出处于区间 [key_start, key_end] 的Key列表(如果type为string_with_value,则列出的是key-value列表) ("", ""] 表示整个区间。

+
    +
  • type: 指定需要scan数据结构的类型,{ string_with_value | string | hash| list | zset | set }
  • +
  • key_start: 返回的起始Key, 空字符串表示 -inf(无限小)
  • +
  • key_end:返回的结束Key, 空字符串表示 +inf(无限大)
  • +
+

pkrscanrange type key_start key_end [MATCH pattern] [LIMIT limit]

+

类似于pkscanrange, 逆序

+

pkhscanrange key field_start field_end [MATCH pattern] [LIMIT limit]

+

列出指定hash table中处于区间 [field_start, field_end] 的 field-value 列表.

+
    +
  • key:hash table对应的key
  • +
  • field_start: 返回的起始Field, 空字符串表示 -inf(无限小)
  • +
  • field_end:返回的结束Field, 空字符串表示 +inf(无限大)
  • +
+

pkhrscanrange key field_start field_end [MATCH pattern] [LIMIT limit]

+

类似于pkhscanrange, 逆序

+

diskrecovery

+

Pika 原创命令,功能为当磁盘意外写满后,RocksDB 会进入写保护状态,当我们将空间调整为充足空间时,这个命令可以将 RocksDB 的写保护状态解除,变为可以继续写的状态, 避免了 Pika 因为磁盘写满后需要重启才能恢复写的情况,执行成功时返回 OK,如果当前磁盘空间依然不足,执行这个命令返回"The available disk capacity is insufficient,该命令执行时不需要额外参数,只需要执行 diskrecovery 即可。

+
> diskrecovery 
> OK
+

clearreplicationid

+

Pika 原创命令,功能是清空 Pika 实例的 replicationid 的值并持久化到配置文件中

+
> clearreplicationid
> OK
+

DisableWal

+

我们可以根据 disablewal (true/false) 接受两个参数来决定 WAL 选项的开关,true 表示写 WAL 功能关闭,false 表示写 WAL 功能开启,需要注意的是写 WAL 默认是开启的

+
> disablewal true  // 写 WAL 关闭
> OK
> disablewal false // 写 WAL 开启
> OK
> disablewal asdfs // 识别到异常参数
> (error) ERR Invalid parameter
> disable false dasfasd // 参数数目异常
> (error) ERR wrong number of arguments for 'disablewal' command
+ + \ No newline at end of file diff --git "a/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\346\225\260\346\215\256\347\233\256\345\275\225/index.html" "b/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\346\225\260\346\215\256\347\233\256\345\275\225/index.html" new file mode 100644 index 0000000..3beaa79 --- /dev/null +++ "b/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\346\225\260\346\215\256\347\233\256\345\275\225/index.html" @@ -0,0 +1,27 @@ + + + + + +数据目录 | PikiwiDB(Pika) + + + + + + + + + +

数据目录

db目录

+

用于存放pika的所有数据文件,包含5个子目录(5大数据类型)它们是:kv,set,zset,hash,list,从pika3.0.0开始,这些数据结构目录为:hashes,lists,sets,strings,zsets

+

log目录

+

用于存放所有日志文件,包含:一般日志、警告日志、错误日志、同步日志(binlog)、同步日志节点信息文件(mainfest)

+

dump目录

+

用于存放快照式备份产生的文件

+

pid目录

+

用于存放pika的pid文件

+

dbsync目录

+

用于主从全量同步时存放全量同步所需的文件

+ + \ No newline at end of file diff --git "a/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\346\234\215\345\212\241\345\231\250\347\212\266\346\200\201\347\233\221\346\216\247/index.html" "b/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\346\234\215\345\212\241\345\231\250\347\212\266\346\200\201\347\233\221\346\216\247/index.html" new file mode 100644 index 0000000..e81ff9a --- /dev/null +++ "b/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\346\234\215\345\212\241\345\231\250\347\212\266\346\200\201\347\233\221\346\216\247/index.html" @@ -0,0 +1,32 @@ + + + + + +服务器状态监控 | PikiwiDB(Pika) + + + + + + + + + +

服务器状态监控

在pika的使用中,也为用户提供了丰富的info展示,用于监控服务器的运行状态。

+
    +
  1. 主从状态;
  2. +
  3. BinLog状态及配置;
  4. +
  5. 统计信息包括:
  6. +
  7. clients状态; +
      +
    1. QPS
    2. +
    3. 当前引擎内存使用;
    4. +
    +
  8. +
  9. db size、keyspace及状态;
  10. +
+

info具体清单如下:

+
# Server
pika_version:1.0.5 ----------------------------------------------------------------- pika 版本信息
os:Linux 2.6.32-2.0.0.8-6 x86_64 --------------------------------------------------- 操作系统信息
arch_bits:64 ----------------------------------------------------------------------- 操作系统位数
process_id:12969 ------------------------------------------------------------------- pika pid信息
tcp_port:9001 ---------------------------------------------------------------------- pika 端口信息
thread_num:12 ---------------------------------------------------------------------- pika 线程数量
uptime_in_seconds:3074 ------------------------------------------------------------- pika 运行时间(秒)
uptime_in_days:0 ------------------------------------------------------------------- pika 运行时间(天)
config_file:/data1/pika9001/pika9001.conf ------------------------------------------ pika conf文件位置
is_bgsaving:No, , 0 ---------------------------------------------------------------- pika 备份信息:是否在备份,备份名称,备份执行时间
is_scaning_keyspace:No ------------------------------------------------------------- pika key space统计状态,是否在进行统计
is_compact:No ---------------------------------------------------------------------- 全量空洞回收(数据整理)是否正在进行
db_size:296M ----------------------------------------------------------------------- pika 当前db体积
log_size:22357M -------------------------------------------------------------------- pika 当前log总体积
compression:snappy ----------------------------------------------------------------- pika 当前压缩方案
safety_purge:write2file99546 ------------------------------------------------------- pika 当前能够安全清理的最新日志
expire_logs_days:7 ----------------------------------------------------------------- pika 日志过期时间
expire_logs_nums:200 --------------------------------------------------------------- pika 日志保留最大数量

# Clients
connected_clients:2 ---------------------------------------------------------------- 当前连接数

# Stats
total_connections_received:18 ------------------------------------------------------ 总连接次数统计
instantaneous_ops_per_sec:1 -------------------------------------------------------- 当前qps
accumulative_query_nums:633 -------------------------------------------------------- 请求总计

# Replication(MASTER)
role:master ------------------------------------------------------------------------ 本实例角色
connected_slaves:1 ----------------------------------------------------------------- 当前从库数量
slave0: host_port=192.168.1.1:57765 state=online ----------------------------------- 当前从库连接信息,如果有多个从库则依次展示

#从库(区别仅在于同步信息的展示):
# Replication(SLAVE)
role:slave ------------------------------------------------------------------------- 本实例角色
master_host:192.168.1.2 ------------------------------------------------------------ 主库IP
master_port:9001 ------------------------------------------------------------------- 主库端口
master_link_status:up -------------------------------------------------------------- 当前同步状态
slave_read_only:1 ------------------------------------------------------------------ 从库是否readonly

Keyspace(key数量展示,按照数据类型分类展示,默认不更新,仅在执行info keyspace 1的时候刷新该信息)
Time:2016-04-22 17:08:33 --------------------------------------------------------- 上一次统计的时间
kv keys:43
hash keys:503
list keys:0
zset keys:0
set keys:0
+ + \ No newline at end of file diff --git "a/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\347\256\241\347\220\206\346\214\207\344\273\244/index.html" "b/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\347\256\241\347\220\206\346\214\207\344\273\244/index.html" new file mode 100644 index 0000000..4a029ac --- /dev/null +++ "b/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\347\256\241\347\220\206\346\214\207\344\273\244/index.html" @@ -0,0 +1,54 @@ + + + + + +管理指令 | PikiwiDB(Pika) + + + + + + + + + +

管理指令

client kill all

+

删除全部的客户端

+
xxx.qihoo.net:8221> client kill all
OK
xxx.qihoo.net:8221>
+

bgsave

+

执行方式和redis一样。但是异步dump完后,数据库保存在dump_path目录下,dump出来的数据库包含dump_prefix和dump时间等信息;

+
xxx.qihoo.net:8221> BGSAVE
20160422134755 : 2213: 32582292
+

返回的信息包括dump的时间(20160422134755)和当前的binlog位置,即文件号:偏移量(2213: 32582292)

+
xxx.qihoo.net # ll /data3/pika_test/dump/
总用量 0
drwxr-xr-x 1 root root 42 4月 22 13:47 pika8221-20160422
+

"/data3/pika_test/dump/"是dump的路径,"pika9221-"为dump_prefix,20160422是dump的日期

+

delbackup

+

删除dump目录下除正在使用(全同步中)的db快照外的其他快照

+
xxx.qihoo.net:8221> DELBACKUP
OK
+

info keyspace

+

执行方式是“info keyspace 1”,“info keyspace 0”和”info keyspace“, “info keyspace”和“info keyspace 0”等价;
+info keyspace 1: 异步开始一次keyspace的扫描,并返回已完成的上一次keyspace扫描的结果
+info keyspace 0: 返回已完成的上一次keyspace扫描的结果

+
xxx.qihoo.net:8221> info keyspace 1
# Keyspace
# Time:1970-01-01 08:00:00
kv keys:0
hash keys:0
list keys:0
zset keys:0
set keys:0
xxx.qihoo.net:8221> info keyspace
# Keyspace
# Time:2016-04-22 13:45:54
kv keys:13
hash keys:0
list keys:0
zset keys:0
set keys:0
+

config get/set *

+

config get和config set的用法和redis是一样的,但是选项可能会有所不同,所以配了两个命令

+
    +
  1. config get *
  2. +
  3. config set * +用于分别列出config get和config set所能操作的选项
  4. +
+
xxx.qihoo.net:8221> config get *
1) "port"
2) "thread_num"
3) "log_path"
4) "log_level"
5) "db_path"
6) "maxmemory"
7) "write_buffer_size"
8) "timeout"
9) "requirepass"
10) "userpass"
11) "userblacklist"
12) "daemonize"
13) "dump_path"
14) "dump_prefix"
15) "pidfile"
16) "maxconnection"
17) "target_file_size_base"
18) "expire_logs_days"
19) "expire_logs_nums"
20) "root_connection_num"
21) "slowlog_log_slower_than"
22) "slave-read-only"
23) "binlog_file_size"
24) "compression"
25) "db_sync_path"
26) "db_sync_speed"
xxx.qihoo.net:8221> config set *
1) "log_level"
2) "timeout"
3) "requirepass"
4) "userpass"
5) "userblacklist"
6) "dump_prefix"
7) "maxconnection"
8) "expire_logs_days"
9) "expire_logs_nums"
10) "root_connection_num"
11) "slowlog_log_slower_than"
12) "slave-read-only"
13) "db_sync_speed"
bada06.add.zwt.qihoo.net:8221>
+

compact

+

因为pika底层存储引擎是基于rocksdb改造来的,会存在读写和空间放大的问题,除了rocksdb的自动compaction,pika也设置了一个手动compaction的命令,以强制compact整个kespace内的内容,支持对单个数据结构进行compact,语法为:compact [string/hash/set/zset/list/all]

+
xxx.qihoo.net:8221> compact
OK
+

一般keyspace比较大时,执行完compact命令后,占用空间会显著减小,但是耗时比较长,对读写性能也有影响,所以建议在流量不大的情况下执行

+

readonly (3.1之后版本废除)

+

该命令用户设置服务器的写权限;执行方式为: +1)“readonly on”
+2)“readonly off”
+3)“readonly 1”
+4)“readonly 0” +其中1)和3)等价,2)和4)等价

+
xxx.qihoo.net:8221> set a b
OK
xxx.qihoo.net:8221> get a
"b"
xxx.qihoo.net:8221> readonly 1
OK
xxx.qihoo.net:8221> set a c
(error) ERR Server in read-only
xxx.qihoo.net:8221> get a
"b"
xxx.qihoo.net:8221> readonly 0
OK
xxx.qihoo.net:8221> set a c
OK
xxx.qihoo.net:8221> get a
"c"
xxx.qihoo.net:8221>
+ + \ No newline at end of file diff --git "a/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\350\207\252\345\212\250\345\256\271\347\201\276/index.html" "b/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\350\207\252\345\212\250\345\256\271\347\201\276/index.html" new file mode 100644 index 0000000..501089e --- /dev/null +++ "b/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\350\207\252\345\212\250\345\256\271\347\201\276/index.html" @@ -0,0 +1,19 @@ + + + + + +自动容灾 | PikiwiDB(Pika) + + + + + + + + + + + + \ No newline at end of file diff --git "a/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\350\256\242\351\230\205/index.html" "b/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\350\256\242\351\230\205/index.html" new file mode 100644 index 0000000..3003fe9 --- /dev/null +++ "b/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\350\256\242\351\230\205/index.html" @@ -0,0 +1,31 @@ + + + + + +订阅 | PikiwiDB(Pika) + + + + + + + + + +

Pika Pub/Sub文档

+

可用版本: >= 2.3.0

+

注意: 暂不支持键空间通知功能

+

Pika 发布订阅命令

+
以下为Pub/Sub发布订阅命令, 与Redis完全兼容
+
    +
  • PUBSUB subcommand [argument [argument ...]]
  • +
  • PUBLISH channel message
  • +
  • SUBSCRIBE channel [channel ...]
  • +
  • PSUBSCRIBE pattern [pattern ...]
  • +
  • UNSUBSCRIBE [channel [channel ...]]
  • +
  • PUNSUBSCRIBE [pattern [pattern ...]]
  • +
+

具体使用方法参考Redis的Pub/Sub文档

+ + \ No newline at end of file diff --git "a/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\351\205\215\347\275\256\346\226\207\344\273\266\350\257\264\346\230\216/index.html" "b/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\351\205\215\347\275\256\346\226\207\344\273\266\350\257\264\346\230\216/index.html" new file mode 100644 index 0000000..0740afa --- /dev/null +++ "b/build/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\351\205\215\347\275\256\346\226\207\344\273\266\350\257\264\346\230\216/index.html" @@ -0,0 +1,18 @@ + + + + + +配置文件说明 | PikiwiDB(Pika) + + + + + + + + + +

配置文件说明

# pika 端口
port : 9221

# pika是多线程的, 该参数能够配置pika的线程数量, 不建议配置值超过部署服务器的CPU核心数量
thread-num : 1

# 处理命令用户请求命令线程池的大小
thread-pool-size : 8

# sync 主从同步时候从库执行主库传递过来命令的线程数量
sync-thread-num : 6

# sync 处理线程的任务队列大小, 不建议修改
sync-buffer-size : 10

# Pika日志目录, 用于存放INFO, WARNING, ERROR日志以及用于同步的binlog(write2fine)文件
log-path : ./log/

# Pika数据目录
db-path : ./db/

# Pika 底层单个rocksdb单个memtable的大小, 设置越大写入性能越好但会在buffer刷盘时带来更大的IO负载, 请依据使用场景合理配置
[RocksDb-Tuning-Guide](https://github.com/facebook/rocksdb/wiki/RocksDB-Tuning-Guide)
write-buffer-size : 268435456

# 在内存中为 db 中的一个列族建立的写入缓冲区 memtables 的最大数量,默认和最小数量为 2
# 如果这个配置超过3,写入的性能会变慢
max-write-buffer-num: 2

# Pika 的连接超时时间配置, 单位为秒, 当连接无请求时(进入sleep状态)开始从配置时间倒计时, 当倒计时为0时pika将强行
# 断开该连接, 可以通过合理配置该参数避免可能出现的pika连接数用尽问题, 该参数默认值为60
timeout : 60

# 密码管理员密码, 默认为空, 如果该参数与下方的userpass参数相同(包括同时为空), 则userpass参数将自动失效, 所有用户均为
# 管理员身份不受userblacklist参数的限制
requirepass : password

# 同步验证密码, 用于slave(从库)连接master(主库)请求同步时进行验证, 该参数需要与master(主库)的requirepass一致
masterauth :

# 用户密码, 默认为空, 如果该参数与上方的userpass参数相同(包括同时为空), 则本参数将自动失效, 所有用户均为管理员身份不
# 受userblacklist参数的限制
userpass : userpass

# 指令黑名单, 能够限制通过userpass登录的用户, 这些用户将不能使用黑名单中的指令, 指令之间使用","隔开, 默认为空
# 建议将高风险命令配置在该参数中
userblacklist : FLUSHALL, SHUTDOWN, KEYS, CONFIG

# 分为经典模式和分片模式,[classic | sharding],经典模式中支持多db的配置
instance-mode : classic

# 经典模式下下指定db的数量,使用方式和redis一致
databases : 1

# 分片模式下每一个table中默认的slot数量
default-slot-num:16

# 定义一个副本组又多少个从副本,目前支持的配置选项范围[0, 1, 2, 3, 4], 0代表不开启此功能
replication-num : 0

# 定义在返回客户端之前主副本收到多少个从副本的ACK反馈信息。目前可以配置的选项范围[0, ...replicaiton-num],0代表不开启此功能。
consensus-level : 0

# Pika的dump文件名称前缀, bgsave后生成的文件将以该前缀命名
dump-prefix : backup-

# 守护进程模式 [yes | no]
daemonize : yes

# slotmigrate [yes | no], pika3.0.0暂不支持该参数
#slotmigrate : no

# Pika dump目录设置, bgsave后生成的文件将存放在该目录中
dump-path : /data1/pika9001/dump/

# dump目录过期时间, 单位为天, 默认为0即永不过期
dump-expire: 0

# pidfile Path pid文件目录
pidfile : /data1/pika9001/pid/9001.pid

# pika最大连接数配置参数
maxclients : 20000

# rocks-db的sst文件体积, sst文件是层级的, 文件越小, 速度越快, 合并代价越低, 但文件数量就会超多, 而文件越大, 速度相对变慢, 合并代价大, 但文件数量会很少, 默认是 20M
target-file-size-base : 20971520

# binlog(write2file)文件保留时间, 7天, 最小为1, 超过7天的文件会被自动清理
expire-logs-days : 7

# binlog(write2file)文件最大数量, 200个, 最小为10, 超过200个就开始自动清理, 始终保留200个
expire-logs-nums : 200

# root用户连接保证数量:2个, 即时Max Connection用完, 该参数也能确保本地(127.0.0.1)有2个连接可以同来登陆pika
root-connection-num : 2

# 慢日志记录时间, 单位为微秒, pika的慢日志记录在pika-ERROR.log中, pika没有类似redis slow log的慢日志提取api
slowlog-log-slower-than : 10000

# slave是否是只读状态(yes/no, 1/0)
# slave-read-only : 0

# Pika db 同步路径配置参数
db-sync-path : ./dbsync/

# 该参数能够控制全量同步时的传输速度, 合理配置该参数能够避免网卡被用尽, 该参数范围为1~1024, 意为:1MB/s~1024MB/s,当该参数
# 被配置为小于0或大于1024时, 该参数会被自动配置为1024
db-sync-speed : -1 (1024MB/s)

# 指定网卡
# network-interface : eth1

# 同步参数配置, 适用于从库节点(slave), 该参数格式为ip:port, 例如192.168.1.2:6666, 启动后该示例会自动向192.168.1.2的
# 6666端口发送同步请求
# slaveof : master-ip:master-port

# 配置双主或Hub需要的server id, 不使用双主或Hub请忽略该参数
server-id : 1

# 双主配置, 不使用双主请忽略以下配置
double-master-ip : 双主对端Ip
double-master-port : 双主对端Port
double-master-server-id : 双主对端server id

# 自动全量compact, 通过配置的参数每天定时触发一次自动全量compact, 特别适合存在多数据结构大量过期、删除、key名称复用的场景
# 参数格式为:"启动时间(小时)-结束时间(小时)/磁盘空余空间百分比", 例如你需要配置一个每天在凌晨3点~4点之间自动compact的任务
# 同时该任务仅仅在磁盘空余空间不低于30%的时候执行, 那么应配置为:03-04/30, 该参数默认为空
compact-cron :

# 自动全量compact, 该参与与compact-cron的区别为, compact-cron每天仅在指定时间段执行, 而compact-interval则以配置时间为周期
# 循环执行, 例如你需要配置一个每4小时执行一次的自动compact任务, 同时该任务仅仅在磁盘空余空间不低于30%的时候执行, 那么该参
# 数应配置为:4/30, 该参数默认为空
compact-interval :

# 从库实例权重设置, 仅配合哨兵使用,无其它功能, 权重低的slave会优先选举为主库, 该参数默认为0(不参与选举)
slave-priority :

# 该参数仅适用于pika跨版本同步时不同版本的binlog能够兼容并成功解析, 该参数可配置为[new | old]
# 当该参数被配置为new时, 该实例仅能作为3.0.0及以上版本pika的从库, 与pika2.3.3~2.3.5不兼容
# 当该参数被配置为old时, 该时候仅能作为2.3.3~2.3.5版本pika的从库, 与pika3.0.0及以上版本不兼容
# 该参数默认值为new, 该参数可在没有配置同步关系的时候通过config set动态调整, 一旦配置了同步关系则不可动态修改
# 需要先执行slaveof no one关闭同步配置, 之后即可通过config set动态修改
identify-binlog-type : new

# 主从同步流量控制的的窗口,主从高延迟情形下可以通过提高该参数提高同步性能。默认值9000最大值90000。
sync-window-size : 9000

# 处理客户端连接请求的最大缓存大小,可配置的数值为67108864(64MB) 或 268435456(256MB) 或 536870912(512MB)
# 默认是268435456(256MB),需要注意的是主从的配置需要一致。
# 单条命令超过此buffer大小,服务端会自动关闭与客户端的连接。
max-conn-rbuf-size : 268435456

###################
#Critical Settings#
# 危险参数 #
###################
# write2file文件体积, 默认为100MB, 一旦启动不可修改, limited in [1K, 2G]
binlog-file-size : 104857600

# 压缩方式[snappy, zlib, lz4, zstd]默认为snappy, 一旦启动不可修改
# 官方发布的二进制提供默认的snaapy的静态连接。如果需要其他压缩方式请自行下载相应静态库并进行编译。
compression : snappy

# 指定后台flush线程数量, 默认为1, 范围为[1, 4]
max-background-flushes : 1

# 指定后台压缩线程数量, 默认为1, 范围为[1, 4]
max-background-compactions : 1

# DB可以使用的打开文件的数量, 默认为5000
max-cache-files : 5000

# pika实例所拥有的rocksdb实例使用的memtable大小上限,如果rocksdb实际使用超过这个数值,下一次写入会造成刷盘
[Rocksdb-Basic-Tuning](https://github.com/facebook/rocksdb/wiki/Setup-Options-and-Basic-Tuning)
max-write-buffer-size : 10737418240

# 限制命令返回数据的大小,应对类似于keys *等命令,返回值过大将内存耗尽。
max-client-response-size : 1073741824

# pika引擎中层级因子, 用于控制每个层级与上一层级总容量的倍数关系, 默认为10(倍), 允许调整为5(倍)
max-bytes-for-level-multiplier : 10

# 统计对于key的操作次数,对于操作频繁的一部分key做小规模compaction
# max-cache-statistic-keys 为受监控key的数量,配置为0代表关闭此功能
max-cache-statistic-keys : 0

# 如果开启小规模compaction,如果对于key操作次数超过small-compaction-threshold上限,那么对该key进行compaction
small-compaction-threshold : 5000

# LRU 缓存,多个 RocksDB 可以共享,也可以单独拥有。这个由 share-block-cache 参数决定
# 参考文档:http://alexstocks.github.io/html/rocksdb.html
block-cache: 8388608

# 块缓存是否在 RocksDB 实例之间共享,默认是每个独享
share-block-cache: no

# arena内存分配中一个内存块的大小;如果为0则自动计算出合适的值
arena-block-size: 33554432
+ + \ No newline at end of file diff --git "a/build/docs/\345\272\217\350\250\200/FAQ/index.html" "b/build/docs/\345\272\217\350\250\200/FAQ/index.html" new file mode 100644 index 0000000..6d123a5 --- /dev/null +++ "b/build/docs/\345\272\217\350\250\200/FAQ/index.html" @@ -0,0 +1,76 @@ + + + + + +FAQ | PikiwiDB(Pika) + + + + + + + + + +

FAQ

1 编译安装

+

Q1: 支持的系统?

+

A1: 目前支持 Linux 和 MacOS 系统,不支持 Windows

+

Q2: 怎么编译安装?

+

A2: 参考编译安装 wiki

+

Q3: Ubuntu 编译偶尔报错 isnan isinf was not declared?

+

A3: 一些旧版本的 pika 对 Ubuntu 环境兼容不好,某些情况下会出现;可以先修改代码,用 std::isnan 和 std::isinf 替代 isnan,isinf, 并包含头文件 #include <cmath>。 我们会在新版兼容这个。

+

2 设计与实现

+

Q1: 为什么要开那么多线程?比如 purge,搞个定时任务不就好了。难道编程框架不支持定时器?

+

A1: pika 有一些比较耗时的任务,如删 binlog,扫描 key,备份,同步数据文件等等,为了不影响正常的用户请求,这些任务都是放到后台执行的,并且将能并行的都放到不同线程里来最大程度上提升后台任务的执行速度;你说的变成框架是 pink 吗?pink 是支持定时器的,每一个 workerthread 只要用户定义了 cronhandle 和频率,就会定时执行要执行的内容,不过这时候 worker 是被独占的,响应不了用户请求,所以占时的任务最好还是单独开线程去做,redis 的 bio 也是这个原因

+

Q2: heartbeat 让 sender 做不就好了?或者说 sender 有必要那么多线程吗?

+

A2: 这主要有两个原因,第一为了提高同步速度,sender 只发不收,receiver 只收不发,心跳是又单独的线程去做,如果心跳又 sender 来做,那么为了一秒仅有一次的心跳还要去复杂化 sender 和 receiver 的逻辑;第二其实前期尝试过合并在一起来进行连接级别的存活检测,当写入压力过大的时候会心跳包的收发会延后,导致存活检测被影响,slave 误判 master 超时而进行不必要的重连

+

Q3: nemo 存储 hash 的实际 key,第一个字节是?header?一个类型标记?是说他是个 hash 类型?

+

A3: 的确是一个 header,不过不是为了标记它是 hash,因为 nemo 底下已经将 string,hash,list,zset,set 这五个数据结构分成的 5 个库,互不影响,之所以有 header 是因为一个 hash 有一个 meta key 和一堆 field key,meta key 对应的 value 记录的是这个 hash 的基础信息,如 hash 的 size 等等,这个 header 也是区分 meta key 和 field key 用的

+

Q4: list 数据结构里面的 curr_seq 是个什么东西?

+

A4: list 的实现是完全基于 kv 实现的 list,通过 seq 来实现 list 类似 prev 和 next 指针,cur_seq 是在 meta 信息里的,也就是当前已经用到那个 seq 了,新来的节点从这个 seq 开始递增接着用

+

Q5: binlog 里面存储的是转化后的 put,delete?还是存储的原生 redis 命令?

+

A5: 存的是 redis 的命令

+

Q6: rsync 的 deamon 模式,这个 rsync 是 linux 上的 rsync 命令?

+

A6: 是的,pika 前期为了更快的实现全同步的功能,此处是直接调用 rsync 命令来完成数据文件的收发,也是由它来进行文件的续传校验等

+

Q7: dump db 文件是 rocksdb 本身就带的功能?具体怎么搞的?

+

A7: rocksdb 提供对当前 db 快照备份的功能,我们基于此,在 dump 时先对 pika 阻住用户的写,然后记录当前的 binlog 偏移量并且调用 rocksdb 的接口来拿到当前 db 的元信息,这个时候就可以放开用户写,然后基于这个元信息来进行快照数据的后台拷贝,阻写的时间很短

+

Q8: 先写 binlog 再执行,如果这时候挂了,命令还没执行,但是写入到 binlog 里面了怎么办?

+

A8: master 是先写 db 再写 binlog,之前 slave 只用一个 worker 来同步会在 master 写入压力很大的情况下由于 slave 一个 worker 写入太慢而造成同步差距过大,后来我们调整结构,让 slave 通过多个 worker 来写提高写入速度,不过这时候有一个问题,为了保证主从 binlog 顺序一致,写 binlog 的操作还是只能又一个线程来做,也就是 receiver,所以 slave 这边是先写 binlog 再写 db,所以 slave 存在写完 binlog 挂掉导致丢失数据的问题,不过 redis 在 master 写完 db 后挂掉同样会丢失数据,所以 redis 采用全同步的办法来解决这一问题,pika 同样,默认使用部分同步来继续,如果业务对数据十分敏感,此处可以强制 slave 重启后进行全同步即可

+

Q9: BinlogBGWorker 线程之间还是要按照 binlog 顺序执行,这块并发能提高多少性能?

+

A9: 之前主从同步的差异是由主的多个 worker 写入而从只有一个 worker 写入带来的,现在的做法提高了从写 db 的速度,不过协议解析还是有一个线程来做,还是有瓶颈,不过这样的优化主从同步的性能提高了 3~5 倍左右,如果 key 很少的话,优化不明显,因为 slave 这面是通过 key 的 hash 值来 sharding 到其中一个 worker 上的

+

Q10: 秒删,每次 put 都要去查询 key 的最新版本?也就是说每次写避免伴随一次读?

+

A10: pika 多数据结构的实现主要是 “meta key + 普通 key” 来实现的,所以对于多数据结构的读写,肯定都是对 rocksdb 进行 2 次及以上的读写次数,你说的版本信息我们是存在 meta_key 中的,和其他 meta 信息一起被读出来,其实并没有因为版本号而额外增加读写次数

+

Q11: 为什么 Pika 使用多线程而不是像 Redis 单线程的结构?

+

A11: 因为 Redis 所有的操作都是对于内存的操作,因此理论上 Redis 的每次操作很短的。

+

Q12: 数据分片是在代理层做的?集合操作落在不同的槽,比如 mget,是在代理层聚合的?

+

A12: 目前没有对数据进行分片,你可以理解成和单机 Redis 类似,支持 master-slave 的架构,因此单个 pika 实例存储的大小的限制是磁盘大小的限制。

+

Q13: pika 支持的客户端有哪些,是否支持 pipelining?

+

A13: pika 支持所有的 Redis 客户端,因为 pika 设计之初就考虑到了用户的迁移成本,因此各种语言的客户端都支持。pipelining 是客户端来做的,因此我们是支持 pipelining 的。

+

Q14: 为什么不考虑 Redis cluster shard 呢?

+

A14: 我们开始做 pika 的时候,Redis cluster shard 还不完善,而且 Redis cluster 定位的场景和 pika 还是有区别。目前我们内部还没大范围使用 Redis cluster。

+

Q15: 不理解前面为什么加 LVS?Redis 类服务都是带状态,负载反而用吧?

+

A15: 我们暴露给用户的 ip 是我们 LVS 的 ip。在 Redis 前面 LVS 是为了方便主从切换,这样可以做到用户完全不感知。这里 LVS 下面挂的多个 Redis 实例,都是 master-slave 结构的。

+

Q16: 有没有对比过 ssdb,LevelDB?优势是什么?

+

A16: 我们公司内部有业务部门用 ssdb,目前除了游戏大部分的 ssdb 已经迁移到 pika 上来。我觉得 pika 的优势在于我们代码实现的比较细,性能会比较好。

+

Q17: 存储引擎为什么没有选择 LevelDB 呢,另外市面上有类似的方案如 ssdb,有什么不同之处吗?

+

A17: 存储引擎上我们在 LevelDB,RocksDB 上面做过对比。LevelDB,RocksDB 在数据量比较小的时候性能差异不大,但是在数据量比较大的情况下,比如 200G 的时候,RocksDB 的性能会比 LevelDB 要来得好。但是 RocksDB 也有他的缺点,就是代码没有 LevelDB 来的那么优雅,我一直觉得一个好的 c++ 程序员看 LevelDB 代码和 effective c++ 就好了。

+

Q18: 若类似于单机 Redis,那么单机性能是个瓶颈吧?大量的客户端连接,命令处理,以及网卡流量等

+

A18: 是的。所以目前内部的 pika 的架构是支持一主多从、多机房自洽的方案。目前线上最多一个主 14 个从这样的结构。DBA 可以很容易的 slaveof 给一个主挂上 slave,然后进行数据的全同步过程。

+

Q19: pika 的多线程比 Redis 的全内存,在 get 上竟然快两倍?set 也快,不存在多线程的锁消耗吗?

+

A19: 这里大家可以看到,这个测试结果是 pika work thread 开了 18 个。

+

在多数据结构的接口里面 kv 的结构的性能是最好的,而多数据结构的接口比如 hash、zset 等等就算开了 18 个线程,性能依然不如 Redis 要来得好。因为 hash、zset 等数据结构需要有抢占多数据结构元数据锁的开销,因此性能很容易下来。但是 kv 接口基本没有锁的开销。唯一的锁开销就是 RocksDB 为了实现线程安全增加的锁,因此这个结果也是可以理解了。

+

Q20: 完全是因为分布式切片不均的缘故,而放弃分布式集群吗?m-s 架构每个节点不都是全量数据,占用更多资源吗?

+

A20: 其实我们在 bada 里面增加了多数据结构的接口,并且兼容了 Redis 的协议,但是后来用户的使用中,发现其实使用多数据结构接口的用户数据量其实不是特别大。单机 1T 的盘基本都能够承受下来。但是还是因为 Hash 分布式切片不均衡,导致我们的维护成本增加,因此我们去实现了 m-s 架构方案。

+

目前 bada 的方案也是和 pika 并存的方案,我们会根据用户具体的使用场景推荐使用的存储方案。我一直觉得肯定不是一套存储方案解决公司内部的所有需求,一定是某一个方案更适用于某一种存储方案。

+

Q21: 除了类比为单机 Redis 外,有没有考虑分布式支持?比如 Redis 的 sentinel 或者支持 Codis 这样可能其它 Redis 集群可以无缝迁移。

+

A21: Pika 目前并没有使用类似 Redis 的 sentinel,pika 前面是挂 LVS 来负责主从切换。目前也没有使用 Codis 这样的 proxy 方案。

+

Q22: 一主 14 个从?主从同步岂不是很慢?另外,从是只读的吧,读从的话,从的数据可能是过期的,数据一致性怎么解决?

+

A22: 一主 14 从的场景是用户的写入都是晚上定期的灌数据,读取的话从各个从库进行读取。因此这个数据一致性是用户可以接受的场景。

+

Q23: 设置了 expire-logs-nums (至少为 10) 和 binlog 过期时间,为何 master 中仍然有大量的 write2file 文件?

+

A23: pika 会定期检查 binlog 文件,如果 binlog 数目超过了 expire-logs-nums 或者过期时间,并且所有的从节点都已经对该 binlog 文件进行过同步,那么 binlog 文件就会被删除。确认过 expire-logs-nums 和过期时间设置正确,可以通过 info 命令查看是否有从节点同步延迟比较大,导致 binlog 无法被删除。

+

Q24:Pika 3.0 进行读写时,blackwidow 只对写加锁,对读不加锁,是否会发生脏读?

+

A24: 不会有脏读问题, Pika Blackwidow (最新代码在 src/storage) 进行 Get 操作使用的是 default_read_options_, snapshot 是 nullptr, 所以是调用时刻的隐式快照。更详细解释详见 issue 185

+

如果您有其他问题,请联系直接在 github issue 上描述您的问题,我们第一时间回复。

+ + \ No newline at end of file diff --git "a/build/docs/\345\272\217\350\250\200/index.html" "b/build/docs/\345\272\217\350\250\200/index.html" new file mode 100644 index 0000000..10c7e38 --- /dev/null +++ "b/build/docs/\345\272\217\350\250\200/index.html" @@ -0,0 +1,25 @@ + + + + + +序言 | PikiwiDB(Pika) + + + + + + + + + +

序言

欢迎来到 PikiwiDB(Pika) 的世界。接下来的篇章旨在于帮助你建立对 PikiwiDB 数据库的基本了解,你将会阅读到:

+
    +
  • PikiwiDB(Pika) 数据库的简介
  • +
  • PikiwiDB(Pika) 数据库的发展历程
  • +
  • PikiwiDB(Pika) 数据库的使用方式
  • +
  • PikiwiDB(Pika) 社区的运作模式
  • +
+

在阅读完成这一部分之后,你可以根据自己的想法与需求,选择性地阅读后面的内容,它们在不同的方面阐述了 PikiwiDB 的应用场景。

+ + \ No newline at end of file diff --git "a/build/docs/\345\272\217\350\250\200/\346\224\257\346\214\201\347\232\204 Redis \346\216\245\345\217\243\344\270\216\345\205\274\345\256\271\346\203\205\345\206\265/index.html" "b/build/docs/\345\272\217\350\250\200/\346\224\257\346\214\201\347\232\204 Redis \346\216\245\345\217\243\344\270\216\345\205\274\345\256\271\346\203\205\345\206\265/index.html" new file mode 100644 index 0000000..c477474 --- /dev/null +++ "b/build/docs/\345\272\217\350\250\200/\346\224\257\346\214\201\347\232\204 Redis \346\216\245\345\217\243\344\270\216\345\205\274\345\256\271\346\203\205\345\206\265/index.html" @@ -0,0 +1,125 @@ + + + + + +支持的 Redis 接口与兼容情况 | PikiwiDB(Pika) + + + + + + + + + +

支持的 Redis 接口与兼容情况

pika支持redis五种类型(分别为string、hash、list、set、zset)的接口,先列出其对redis的五种数据结构兼容统计。

+

统计所用的标记含义如下:

+
图标含义
o该接口完全支持,使用方式与redis没有任何区别
功能支持,但使用或输出与redis有部分差异,需注意
×当前还未支持
+
+

Keys

+
接口DELDUMPEXISTSEXPIREEXPIREATKEYSMIGRATEMOVEOBJECT
状态oxooooxxx
接口PERSISTPEXPIREPEXPIREATPTTLRANDOMKEYRENAMERENAMENXRESTORESORT
状态o!!oxxxxx
接口TOUCHTTLTYPEUNLINKWAITSCAN
状态xo!ox!
+

备注:

+
    +
  • +

    PEXPIRE:无法精确到毫秒,底层会自动截断按秒级别进行处理;

    +
  • +
  • +

    PEXPIREAT:无法精确到毫秒,底层会自动截断按秒级别进行处理;

    +
  • +
  • +

    SCAN:会顺序迭代当前db的快照,由于pika允许重名五次,所以scan有优先输出顺序,依次为:string -> hash -> list -> zset -> set;

    +
  • +
  • +

    TYPE:另外由于pika允许重名五次,所以type有优先输出顺序,依次为:string -> hash -> list -> zset -> set,如果这个key在string中存在,那么只输出sting,如果不存在,那么则输出hash的,依次类推。

    +
  • +
  • +

    KEYS: KEYS命令支持参数支持扫描指定类型的数据,用法如 "keys * [string, hash, list, zset, set]"

    +
  • +
+

Strings

+
接口APPENDBITCOUNTBITFIELDBITOPBITPOSDECRDECRBYGETGETBIT
状态oox!oooo!
接口GETRANGEGETSETINCRINCRBYINCRBYFLOATMGETMSETMSETNXSTRLEN
状态ooooooooo
接口PSETEXSETSETBITSETEXSETNXSETRANGE
状态oo!ooo
+

备注:

+
    +
  • BIT操作:与Redis不同,Pika的bit操作范围为2^21, bitmap的最大值为256Kb。redis setbit 只是对key的value值更新。但是pika使用rocksdb作为存储引擎,rocksdb只会新写入数据并且只在compact的时候才从硬盘删除旧数据。如果pika的bit操作范围和redis一致都是2^32的话,那么有可能每次对同一个key setbit时,rocksdb都会存储一个512M大小的value。这会产生 严重的性能隐患。因此我们对pika的bit操作范围作了取舍。
  • +
+

Hashes

+
接口HDELHEXISTSHGETHGETALLHINCRBYHINCRBYFLOATHKEYSHLENHMGETHMSET
状态oooooooooo
接口HSETHSETNXHVALSHSCANHSTRLEN
状态!oooo
+

备注:

+
    +
  • HSET操作:暂不支持单条命令设置多个field value,如有需求请用HMSET
  • +
+

Lists

+
接口LINDEXLINSERTLLENLPOPLPUSHLPUSHXLRANGELREMLSETLTRIM
状态oooooooooo
接口RPOPRPOPLPUSHRPUSHRPUSHXBLPOPBRPOPBRPOPLPUSH
状态oooooox
+

Sets

+
接口SADDSCARDSDIFFSDIFFSTORESINTERSINTERSTORESISMEMBERSMEMBERSSMOVESPOP
状态oooooooooo
接口SRANDMEMBERSREMSUNIONSUNIONSTORESSCAN
状态!oooo
+

备注:

+
    +
  • SRANDMEMBER:时间复杂度O( n ),耗时较多
  • +
+

Sorted Sets

+
接口ZADDZCARDZCOUNTZINCRBYZRANGEZRANGEBYSCOREZRANKZREMZREMRANGEBYRANKZREMRANGEBYSCORE
状态oooooooooo
接口ZREVRANGEZREVRANGEBYSCOREZREVRANKZSCOREZUNIONSTOREZINTERSTOREZSCANZRANGEBYLEXZLEXCOUNTZREMRANGEBYLEX
状态oooooooooo
接口ZPOPMAXZPOPMINZREVERANGEBYLEX
状态ooo
+
    +
  • ZADD 的选项 [NX|XX] [CH] [INCR] 暂不支持
  • +
+

HyperLogLog

+
接口PFADDPFCOUNTPFMERGE
状态ooo
+

备注:

+
    +
  • 50w以内误差均小于1%, 100w以内误差小于3%, 但付出了时间代价.
  • +
+

GEO

+
接口GEOADDGEODISTGEOHASHGEOPOSGEORADIUSGEORADIUSBYMEMBER
状态oooooo
+

BitMap

+
接口SETBITGETBITBITPOSBITOPBITCOUNT
状态ooooo
+

Pub/Sub

+
接口PSUBSCRIBEPUBSUBPUBLISHPUNSUBSCRIBESUBSCRIBEUNSUBSCRIBE
状态oooooo
+

ACL

+
接口ACL CATACL DELUSERACL DRYRUNACL GENPASSACL GETUSERACL LISTACL LOADACL LOGACL SAVEACL SETUSERACL USERSACL HELPACL WHOAMI
状态ooooooooo!ooo
+

备注: +redis中部分命令是有子命令的, 这些命令在pika中是一个命令, 在ACL划分权限时, 可能无法做到完全兼容redis.

+

Stream

+
接口XADDXDELXRANGEXREVRANGEXREADXLENXINFOXTRIMXACKXGROUP DESTROYXGROUP HELPXCLAIMXAUTOCLAIMXREADGROUP
状态oooooooooxxxxx
+

备注:

+
    +
  • xread :暂不支持阻塞等待的方式(类似于blpop)
  • +
+

管理命令(这里仅列出pika兼容的)

+
接口INFOCONFIGCLIENTPINGBGSAVESHUTDOWNSELECTTYPEHELLO
状态!o!ooo!!o
+

备注:

+
    +
  • +

    暂不支持keyspace notifications

    +
  • +
  • +

    info:info支持全部输出,也支持匹配形式的输出,例如可以通过info stats查看状态信息,需要注意的是key space与redis不同,pika对于key space的展示选择了分类型展示而非redis的分库展示(因为pika没有库),pika对于key space的统计是被动的,需要手动触发,然后pika会在后台进行统计,pika的key space统计是精确的。触发方式为执行:keyspace命令即可,然后pika会在后台统计,此时可以使用:keyspace readonly命令来进行查看,readonly参数可以避免反复进行统计,如果当前数据为0,则证明还在统计中; +info commandstats可以查询到各个命令的调用次数和统计用时以及平均用时,和redis不同的是我们统计耗时的时间单位是毫秒

    +
  • +
  • +

    client:当前client命令支持client list及client kill还有client setname,client list显示的内容少于redis;

    +
  • +
  • +

    select:该命令在3.1.0版前无任何效果,自3.1.0版开始与Redis一致;

    +
  • +
  • +

    ping:该命令仅支持无参数使用,即使用PING,客户端返回PONG.

    +
  • +
  • +

    type:pika不同类型的key name 是允许重复的,例如:string 类型里有 key1hash list set zset类型可以同时存在 key1,在使用 type命令查询时,只能得到一个,如果要查询同一个 name 所有的类型,需要使用 ptype 命令查询

    +
  • +
+
+

重要说明

+
    +
  • +

    重名问题:由于pika每个类型独立运作, 所以允许重名。例如在key abc在string中存在的时候也同样允许在hash中存在,一个key最多重名5次(5大类型),但在同一接口中是无法重名的。所以建议在使用的时候对于不同类型不要使用完全相同的key;

    +
  • +
  • +

    分库问题:pika自3.1.0版起支持多库,相关命令、参数的变化请参考Pika3.1.0多库版命令、参数变化参考文档

    +
  • +
  • +

    数据展示:pika对于keyspace的展示选择了分类型展示而非redis的分库展示(因为pika没有分库概念),pika对于keyspace的统计是被动的,需要手动触发并不会立即输出,命令为:info keyspace [ 0|1 ],默认为0不触发,pika的keyspace统计是精确的。

    +
  • +
+ + \ No newline at end of file diff --git "a/build/docs/\345\272\217\350\250\200/\347\256\200\344\273\213/index.html" "b/build/docs/\345\272\217\350\250\200/\347\256\200\344\273\213/index.html" new file mode 100644 index 0000000..4074d6e --- /dev/null +++ "b/build/docs/\345\272\217\350\250\200/\347\256\200\344\273\213/index.html" @@ -0,0 +1,37 @@ + + + + + +PikiwiDB(Pika) 简介 | PikiwiDB(Pika) + + + + + + + + + +

PikiwiDB(Pika) 简介

PikiwiDB(Pika)-Logo +PikiwiDB(Pika) 是一款由 360 基础架构小组研发设计的键值数据库,解决了传统键值数据库在大规模数据场景下恢复时间较长、性能表现不佳的问题,最早被命名为 Pika,用于替换 360 内部系统所使用的 Redis,支撑 360 自身业务所需要的缓存需求,后面向行业开放源代码,并交付开放原子基金会托管运营,为业内海量数据场景的高可用存储需求提供支持。

+

PikiwiDB(Pika) 数据库的特点

+

所有的软件都有自身所对接的需求与特点,把握住这些特点有助于增进你对于行业需求的理解,并增进你对于软件的应用能力。

+

PikiwiDB(Pika) 的特点可以概括如下。

+

对 Redis 的良好兼容性

+

PikiwiDB(Pika) 最早被用于替换 360 内部的 Redis 服务,而数据应用程序的数据独立性需求使得我们在迁移 Redis 数据至 PikiwiDB(Pika) 时,必须尽可能少地干扰到数据应用本身。

+

因此 PikiwiDB(Pika) 自设计伊始,便在对既有的 Redis 应用兼容性上下了功夫,采用了兼容 Redis 的数据传输协议,进而使得绝大多数数据应用程序,可以顺利在不加修改的情况下,由 Redis 迁移到 PikiwiDB(Pika) 上面来。

+

海量数据存储友好

+

传统的键值数据库在小规模数据应用上表现良好,可以顺利地满足高性能数据存储的需求,但是我们在实践中发现,伴随着业务量的不断扩张,支撑这些传统键值数据库所需要的硬件成本正在不断上升,给企业带来了昂贵的负担,因此 PikiwiDB(Pika) 在设计时在海量数据存储优化上做了文章,使得在同样的数据规模条件下,PikiwiDB(Pika) 相较于传统的键值数据库能够占用更少的服务器资源,并提供性能相当的数据存储服务。

+

快速故障恢复

+

除了硬件成本的高昂外,传统的键值数据库因为并非面向于海量数据规模而设计,同时因为其数据存储于内存之中,因此在出现故障的场景下,数据往往会全部丢失,数据应用程序整体性能将会在对应时间点极速下滑,PikiwiDB(Pika) 弥补了传统键值数据库在这一方面的不足,其思路在于将存储于内存中的数据同步于磁盘,并以日志方式进行存储。这样在出现故障的时候,依托磁盘上的数据与日志中的记录,即可实现快速的故障恢复,而对于数据应用程序而言,因为大部分的存储数据依旧顺利保存着,故性能方面并不会下降很多。

+

社区驱动发展

+

目前 PikiwiDB(Pika) 已经逐渐由 360 的内部项目,过渡为由开放原子基金会托管运营的社区开源项目,我们将进一步优化项目文档水平,降低外部参与 PikiwiDB(Pika) 项目的门槛,尽力而为地做好海量数据规模下的高可用键值数据库

+

发展历程

+
    +
  • 2016年 Pika 项目发布于 360 Github 仓库
  • +
  • 2021年 接受开放原子基金会指导孵化
  • +
  • 2023年 Pika 项目更名为 PikiwiDB(Pika)
  • +
+ + \ No newline at end of file diff --git "a/build/docs/\345\274\200\345\217\221\346\226\207\346\241\243/coding-style/index.html" "b/build/docs/\345\274\200\345\217\221\346\226\207\346\241\243/coding-style/index.html" new file mode 100644 index 0000000..7c0fea7 --- /dev/null +++ "b/build/docs/\345\274\200\345\217\221\346\226\207\346\241\243/coding-style/index.html" @@ -0,0 +1,104 @@ + + + + + +c++ coding style | PikiwiDB(Pika) + + + + + + + + + +

c++ coding style

header file

+

Name and order of includes

+

顺序是

+

Related header, C library, C++ library, other libraries'.h, your project's .h`.

+

不要使用 . 以及 .. 这样的符号

+

比如一个项目的include 头文件应该是这样

+
#include "foo/server/fooserver.h"

#include <sys/types.h>
#include <unistd.h>

#include <hash_map>
#include <vector>

#include "base/basictypes.h"
#include "base/commandlineflags.h"
#include "foo/server/bar.h"

+

class

+

Doing work in constructors

+

constructor 不能调用虚函数, 因为在构造的时候, 这个对象还没有完全生成, 因此调用虚函数肯定是不对的

+

Inheritance

+

使用 override 来表示某一个函数是virtual 函数的重新实现, 这样就不需要在看代码的时候确认这个函数是否是重载, 如果在子类里面对一个父类没有的函数进行override也是会直接报错的

+

在使用struct的时候 只用在只定义数据,不包含任何方法的结构体里面,出了简单的构造函数或者init函数.

+

通过使用继承可以有效的减少代码量 并且因为继承是编译时期的 因此在编译器能够识别这些错误 接口继承(也就是定义纯虚函数) 更是能够在编译期就识别一个继承的类是否实现了全部的接口

+

但是由于继承把一个类的代码分散在各个文件里面了 因此增加了看代码的难度 并且父类定义自己的成员变量 因此访问的时候不是很方便

+

所以一定要账号 is-a 和 has-a的关系 一定确定是 a是b的一种的时候才可以使用 继承 否则尽可能的使用组合 也就是b里面有一个a的成员变量

+

Function

+

parameter Ordering

+

函数的变量的顺序: input, 然后是output

+

尽量把一个函数控制在40行以内

+

reference Arguments

+

所有通过引用传参的变量都需要加上const, 也就是 const type &in

+

尽可能的input argument 用value 或者 const reference(当然如果这个变量就是指针, 那么传进来的时候就用指针), 然后output argument 用指针

+

还有就是如果变量需要传进来NULL的时候, 可能会用const T*

+

function overloading

+

尽可能的不要使用 function overloading, 因为function overloading 增加了c++ 的复杂性. 特别是当继承的时候, 子类只实现了父类的某一个function 的时候, 这样代码的复杂度就更麻烦了. 因为不知道重载的是哪一个函数, 因此

+

尽可能的不要使用function overloading, 当遇到函数需要不用的变量类型的时候, 可以写成这种AppendString(), AppendInt() 这种

+

default value

+

允许在非non-virtual 函数里面使用 default value

+

scoping

+

Nonmember, static member, global function

+

如果有一个函数和一个类的对象里面的内容并不相关

+

那么这个时候有两个选择, 可以定义成class static member function, nonmember function. 那么这个时候如何选择?

+

如果这个函数和这个对象强相关, 比如是建立一个这个对象, 或者操作这个类的静态成员函数的时候, 将这个函数声明成class static member function

+

否则将这个函数声明成nonmember function, 然后用namespace 隔离开来

+

如果有一个函数只在某一个.cc 文件里面使用, 那么可以将这个函数放在unnamed namespace 或者用static 声明 static int foo() 这种

+

other

+

关于exception 的使用

+
    +
  • pros: +
      +
    • exception 可以发现更深层次的错误, 比如a()->b()->c()->d() 那么在d里面抛出的exception 在a里面是可以直接捕获的
    • +
    • 比如在c++ 的construction 里面, 我们是无法知道这个construction 是否构造成功,
    • +
    +
  • +
  • cons +
      +
    • +
    +
  • +
+

关于返回值

+
    +
  1. 在一个函数内部调用
  2. +
+

brace initializer List

+

在c++11 里面可以直接通过 来初始化一个list, 这个是在c++ 11 之前都不可以的, 比如:

+
int main()
{
std::vector<int> v{1, 2, 3};
std::map<int, int> mp{{1, 2}, {1, 3}, {1, 4}};
return 0;
}
+

sizeof

+

在使用sizeof 的时候尽可能的去sizeof(varname), 而不是去sizeof(type). 因此这个varname 随时会更新, 如果varname 这个变量被赋值给其他对象的时候

+

注意sizeof 的时候考虑对齐的问题

+

Run-Time Type Information(RTTI)

+

c++ 允许在运行的过程中使用typeid, dynamic_cast 来检查一个变量的类型, 通过dynamic_cast 在类型转换的时候进行检查, 只允许父类的指针指向子类, 而不允许子类的指针指向父类

+

但是其实用RTTI 的代码都可以用其他的方式来写, 而RTTI 不是很高效, 因此尽可能用 virtual method, 或者 Visitor pattern 模式来实现比较好

+

cast

+

尽可能的使用 c++ 的static_cast, const_cast, reinterpret_cast 而不是用c 里面的cast

+

stream

+

如果你为了debug想要打印一个对象内部的细节, 那么经常会提供一个DebugString() 是最经常的

+

不要使用stream 作为外部用户的IO, stream 性能还是不行的

+

Friend

+

允许使用 Friend class, function

+

Friend class 虽然会破坏了类封装, 允许外部类直接访问当前这个类里面的私有成员, 常见的用法就是FooBuilder 应该能够访问Foo 里面的私有成员. 如果没有Friend class, 要么把Foo 的成员都设置成public, 要么给所有的成员变量都添加get, set 函数. 还是很不方便的.

+

Friend class 只是让某一个类可以访问这个类, 还是比让所有的成员变量都public 来说, 封装更好一些

+

因此Friend class 需要看到Foo 的私有变量, 因此经常将Friend class 放在同一个头文件里面

+

use of const

+

能用const 的地方尽可能的使用const

+

Integer type

+

<stdint.h> 里面定义的int32_t, int64_t 等等, 而不适用short, long, long long 这种类型, 因为short, long 等是根据编译器和平台是不一样的

+

0 and nullptr/NULL

+

Use 0 for integers, 0.0 for reals, nullptr (or NULL) for pointers, and '\0' for chars.

+

在支持c++11 的项目里面尽可能使用nullptr

+

Comments

+

TODO comment

+

写TODO comment 的时候记得写上谁写的这个TODO

+

// TODO(kl@gmail.com): Use a "*" here for concatenation operator.

+

总结

+

最后可以用 cpplint.py 跑一下, 尽可能把错误是4, 以及4以上的给排除掉

+ + \ No newline at end of file diff --git "a/build/docs/\345\274\200\345\217\221\346\226\207\346\241\243/index.html" "b/build/docs/\345\274\200\345\217\221\346\226\207\346\241\243/index.html" new file mode 100644 index 0000000..1c3121e --- /dev/null +++ "b/build/docs/\345\274\200\345\217\221\346\226\207\346\241\243/index.html" @@ -0,0 +1,18 @@ + + + + + +编码规范 | PikiwiDB(Pika) + + + + + + + + + + + + \ No newline at end of file diff --git "a/build/docs/\345\274\200\345\217\221\346\226\207\346\241\243/\347\274\226\347\240\201\350\247\204\350\214\203/index.html" "b/build/docs/\345\274\200\345\217\221\346\226\207\346\241\243/\347\274\226\347\240\201\350\247\204\350\214\203/index.html" new file mode 100644 index 0000000..3aae0b8 --- /dev/null +++ "b/build/docs/\345\274\200\345\217\221\346\226\207\346\241\243/\347\274\226\347\240\201\350\247\204\350\214\203/index.html" @@ -0,0 +1,110 @@ + + + + + +编码规范 | PikiwiDB(Pika) + + + + + + + + + +

编码规范

c++ coding style

+

我们基本遵循google c++ coding style

+

header file

+

The define guard

+

<PROJECT>_<PATH>_<FILE>_H_

+

比如目录是foo/src/bar/baz.h 写成

+

#ifndef FOO_SRC_BAR_H_

+

Name and order of includes

+

顺序是

+

Related header, C library, C++ library, other libraries'.h, your project's .h`.

+

不要使用 . 以及 .. 这样的符号

+

比如一个项目的include 头文件应该是这样

+
#include "foo/server/fooserver.h"

#include <sys/types.h>
#include <unistd.h>

#include <hash_map>
#include <vector>

#include "base/basictypes.h"
#include "base/commandlineflags.h"
#include "foo/server/bar.h"

+

scoping

+

namespace

+

class

+

Doing work in constructors

+

constructor 不能调用虚函数, 因为在构造的时候, 这个对象还没有完全生成, 因此调用虚函数肯定是不对的

+

Inheritance

+

使用 override 来表示某一个函数是virtual 函数的重新实现, 这样就不需要在看代码的时候确认这个函数是否是重载, 如果在子类里面对一个父类没有的函数进行override也是会直接报错的

+

在使用struct的时候 只用在只定义数据,不包含任何方法的结构体里面,出了简单的构造函数或者init函数.

+

通过使用继承可以有效的减少代码量 并且因为继承是编译时期的 因此在编译器能够识别这些错误 接口继承(也就是定义纯虚函数) 更是能够在编译期就识别一个继承的类是否实现了全部的接口

+

但是由于继承把一个类的代码分散在各个文件里面了 因此增加了看代码的难度 并且父类定义自己的成员变量 因此访问的时候不是很方便

+

所以一定要账号 is-a 和 has-a的关系 一定确定是 a是b的一种的时候才可以使用 继承 否则尽可能的使用组合 也就是b里面有一个a的成员变量

+

Function

+

parameter Ordering

+

函数的变量的顺序: input, 然后是output

+

尽量把一个函数控制在40行以内

+

reference Arguments

+

所有通过引用传参的变量都需要加上const, 也就是 const type &in

+

尽可能的input argument 用value 或者 const reference(当然如果这个变量就是指针, 那么传进来的时候就用指针), 然后output argument 用指针

+

还有就是如果变量需要传进来NULL的时候, 可能会用const T*

+

function overloading

+

尽可能的不要使用 function overloading, 因为function overloading 增加了c++ 的复杂性. 特别是当继承的时候, 子类只实现了父类的某一个function 的时候, 这样代码的复杂度就更麻烦了. 因为不知道重载的是哪一个函数, 因此

+

尽可能的不要使用function overloading, 当遇到函数需要不用的变量类型的时候, 可以写成这种AppendString(), AppendInt() 这种

+

default value

+

允许在非non-virtual 函数里面使用 default value

+

scoping

+

Nonmember, static member, global function

+

如果有一个函数和一个类的对象里面的内容并不相关

+

那么这个时候有两个选择, 可以定义成class static member function, nonmember function. 那么这个时候如何选择?

+

如果这个函数和这个对象强相关, 比如是建立一个这个对象, 或者操作这个类的静态成员函数的时候, 将这个函数声明成class static member function

+

否则将这个函数声明成nonmember function, 然后用namespace 隔离开来

+

如果有一个函数只在某一个.cc 文件里面使用, 那么可以将这个函数放在unnamed namespace 或者用static 声明 static int foo() 这种

+

other

+

关于exception 的使用

+
    +
  • pros: +
      +
    • exception 可以发现更深层次的错误, 比如a()->b()->c()->d() 那么在d里面抛出的exception 在a里面是可以直接捕获的
    • +
    • 比如在c++ 的construction 里面, 我们是无法知道这个construction 是否构造成功,
    • +
    +
  • +
  • cons +
      +
    • +
    +
  • +
+

关于返回值

+
    +
  1. 在一个函数内部调用
  2. +
+

brace initializer List

+

在c++11 里面可以直接通过 来初始化一个list, 这个是在c++ 11 之前都不可以的, 比如:

+
int main()
{
std::vector<int> v{1, 2, 3};
std::map<int, int> mp{{1, 2}, {1, 3}, {1, 4}};
return 0;
}
+

sizeof

+

在使用sizeof 的时候尽可能的去sizeof(varname), 而不是去sizeof(type). 因此这个varname 随时会更新, 如果varname 这个变量被赋值给其他对象的时候

+

注意sizeof 的时候考虑对齐的问题

+

Run-Time Type Information(RTTI)

+

c++ 允许在运行的过程中使用typeid, dynamic_cast 来检查一个变量的类型, 通过dynamic_cast 在类型转换的时候进行检查, 只允许父类的指针指向子类, 而不允许子类的指针指向父类

+

但是其实用RTTI 的代码都可以用其他的方式来写, 而RTTI 不是很高效, 因此尽可能用 virtual method, 或者 Visitor pattern 模式来实现比较好

+

cast

+

尽可能的使用 c++ 的static_cast, const_cast, reinterpret_cast 而不是用c 里面的cast

+

stream

+

如果你为了debug想要打印一个对象内部的细节, 那么经常会提供一个DebugString() 是最经常的

+

不要使用stream 作为外部用户的IO, stream 性能还是不行的

+

Friend

+

允许使用 Friend class, function

+

Friend class 虽然会破坏了类封装, 允许外部类直接访问当前这个类里面的私有成员, 常见的用法就是FooBuilder 应该能够访问Foo 里面的私有成员. 如果没有Friend class, 要么把Foo 的成员都设置成public, 要么给所有的成员变量都添加get, set 函数. 还是很不方便的.

+

Friend class 只是让某一个类可以访问这个类, 还是比让所有的成员变量都public 来说, 封装更好一些

+

因此Friend class 需要看到Foo 的私有变量, 因此经常将Friend class 放在同一个头文件里面

+

use of const

+

能用const 的地方尽可能的使用const

+

Integer type

+

<stdint.h> 里面定义的int32_t, int64_t 等等, 而不适用short, long, long long 这种类型, 因为short, long 等是根据编译器和平台是不一样的

+

0 and nullptr/NULL

+

Use 0 for integers, 0.0 for reals, nullptr (or NULL) for pointers, and '\0' for chars.

+

在支持c++11 的项目里面尽可能使用nullptr

+

Comments

+

TODO comment

+

写TODO comment 的时候记得写上谁写的这个TODO

+

// TODO(kl@gmail.com): Use a "*" here for concatenation operator.

+ + \ No newline at end of file diff --git "a/build/docs/\346\200\247\350\203\275\344\270\216\344\274\230\345\214\226/3.2.x \346\200\247\350\203\275/index.html" "b/build/docs/\346\200\247\350\203\275\344\270\216\344\274\230\345\214\226/3.2.x \346\200\247\350\203\275/index.html" new file mode 100644 index 0000000..2d4b568 --- /dev/null +++ "b/build/docs/\346\200\247\350\203\275\344\270\216\344\274\230\345\214\226/3.2.x \346\200\247\350\203\275/index.html" @@ -0,0 +1,56 @@ + + + + + +3.2.x 性能 | PikiwiDB(Pika) + + + + + + + + + +

3.2.x 性能

Performance:

+

0. Env

+

Disk: 2T NVME

+

CPU: Intel(R) Xeon(R) CPU E5-2630 v4 @ 2.20GHz * 40

+

Memory: 256G

+

Network Card: 10-Gigabit

+

OS: CentOS Linux release 7.4

+

1. Single Db

+

1.1 Write binlog with one slave

+

data size: 64bytes

+

key num: 1,000,000

+
TESTQPS
set124347
get283849
+

1.2 No binlog No slave

+

singleDb

+

1.3 Benchmark Result

+
WithBinlog&Slave QPSNoBinlog&Slave QPS
PING_INLINE262329272479
PING_BULK262467270562
SET124953211327
GET284900292568
INCR120004213766
MSET (10 keys)64863111578
MGET (10 keys)224416223513
MGET (100 keys)2993529550
MGET (200 keys)1512814912
LPUSH117799205380
RPUSH117481205212
LPOP112120200320
RPOP119932207986
LRANGE_10 (first 10 elements)277932284414
LRANGE_100 (first 100 elements)165118164355
LRANGE_300 (first 300 elements)5490755096
LRANGE_450 (first 450 elements)3665636630
LRANGE_600 (first 600 elements)2754027510
SADD126230208768
SPOP103135166555
HSET122443214362
HINCRBY114757208942
HINCRBYFLOAT114377208550
HGET284900290951
HMSET (10 fields)58937111445
HMGET (10 fields)203624205592
HGETALL166861160797
ZADD106780189178
ZREM112866201938
PFADD47084692
PFCOUNT2741227345
PFMERGE478494
+

1.4 Compare Wiht Redis

+

With Redis AOF configuration appendfsync everysec, redis basically write data into memeory. However, pika uses rocksdb, which writes WAL on ssd druing every write batch. That comparation becomes multiple threads sequential write into ssd and one thread write into memory.

+

Put the fairness or unfairness aside. Here is the performance.

+

+

2. Cluster (Codis)

+

2.1 Topology:

+

WithBInlog&Slave

+

4 machine * 2 pika instance (Master)

+

4 machine * 2 pika instance (Slave)

+

NoBinlog&Slave

+

4 machine * 2 pika instance (Master)

+

Slots Distribution:

+

+

2.2 WithBinlog&Slave

+

Set

+
CommandQPS
Set1,400,000+
+

2.3 NoBinlog&Slave

+

+
CommandQPS
Set1,600,000+
+

2.4 Get Command

+

+
CommandQPS
Get2,300,000+
+

With or without binlog, for Get command, QPS is approximately the same.

+ + \ No newline at end of file diff --git "a/build/docs/\346\200\247\350\203\275\344\270\216\344\274\230\345\214\226/Pika 3.5 \345\217\202\346\225\260\344\274\230\345\214\226\346\211\213\345\206\214/index.html" "b/build/docs/\346\200\247\350\203\275\344\270\216\344\274\230\345\214\226/Pika 3.5 \345\217\202\346\225\260\344\274\230\345\214\226\346\211\213\345\206\214/index.html" new file mode 100644 index 0000000..a966b6f --- /dev/null +++ "b/build/docs/\346\200\247\350\203\275\344\270\216\344\274\230\345\214\226/Pika 3.5 \345\217\202\346\225\260\344\274\230\345\214\226\346\211\213\345\206\214/index.html" @@ -0,0 +1,52 @@ + + + + + +Pika 3.5 参数优化手册 | PikiwiDB(Pika) + + + + + + + + + +

Pika 3.5 参数优化手册 #1970

+

AlexStocks started this conversation in General

+

Pika 3.5 参数优化手册 #1970

+

@AlexStocks AlexStocks

+

Sep 11, 2023 · 1 comment

+

Return to top

+

Discussion options

+

Quote reply

+

edited

+

+

[

+

AlexStocks

+

](https://github.com/AlexStocks)[Sep 11, 2023](https://github.com/OpenAtomFoundation/pika/discussions/1970#discussion-5614484)

+

Maintainer

+

-

+ +

Beta Was this translation helpful? Give feedback.

+

1 You must be logged in to vote

+

All reactions

+

Replies: 1 comment

+ +

Comment options

+

Quote reply

+

edited by Mixficsol

+

+

[

+

AlexStocks

+

](https://github.com/AlexStocks)[Oct 23, 2023](https://github.com/OpenAtomFoundation/pika/discussions/1970#discussioncomment-7357996)

+

Maintainer Author

+

-

+
+ + \ No newline at end of file diff --git "a/build/docs/\346\200\247\350\203\275\344\270\216\344\274\230\345\214\226/Pika \344\274\230\345\214\226\346\241\210\344\276\213/index.html" "b/build/docs/\346\200\247\350\203\275\344\270\216\344\274\230\345\214\226/Pika \344\274\230\345\214\226\346\241\210\344\276\213/index.html" new file mode 100644 index 0000000..29a15db --- /dev/null +++ "b/build/docs/\346\200\247\350\203\275\344\270\216\344\274\230\345\214\226/Pika \344\274\230\345\214\226\346\241\210\344\276\213/index.html" @@ -0,0 +1,18 @@ + + + + + +Pika 优化案例 | PikiwiDB(Pika) + + + + + + + + + + + + \ No newline at end of file diff --git "a/build/docs/\346\200\247\350\203\275\344\270\216\344\274\230\345\214\226/Pika \344\274\230\345\214\226\346\241\210\344\276\213/\345\226\234\351\251\254\346\213\211\351\233\205 Redis \344\270\216 Pika \347\274\223\345\255\230\344\275\277\347\224\250\345\206\233\350\247\204/index.html" "b/build/docs/\346\200\247\350\203\275\344\270\216\344\274\230\345\214\226/Pika \344\274\230\345\214\226\346\241\210\344\276\213/\345\226\234\351\251\254\346\213\211\351\233\205 Redis \344\270\216 Pika \347\274\223\345\255\230\344\275\277\347\224\250\345\206\233\350\247\204/index.html" new file mode 100644 index 0000000..60954f8 --- /dev/null +++ "b/build/docs/\346\200\247\350\203\275\344\270\216\344\274\230\345\214\226/Pika \344\274\230\345\214\226\346\241\210\344\276\213/\345\226\234\351\251\254\346\213\211\351\233\205 Redis \344\270\216 Pika \347\274\223\345\255\230\344\275\277\347\224\250\345\206\233\350\247\204/index.html" @@ -0,0 +1,88 @@ + + + + + +喜马拉雅 Redis 与 Pika 缓存使用军规 | PikiwiDB(Pika) + + + + + + + + + +

宣言:缓存不是万金油,更不是垃圾桶!!!

+

缓存作为喜马拉雅至关重要的基础组件之一,每天承载着巨大的业务请求量。一旦缓存出现故障,对业务的影响将非常严重。因此,确保缓存服务的稳定和高效运行始终是我们的重要目标。

+

下面是我们对喜马缓存历史故障复盘后总结的一套缓存使用规范,在此分享给大家,希望小伙伴们能在缓存选型和使用的过程中少踩坑。

+

1. 缓存选型

+

1.1 缓存类型介绍

+

喜马线上缓存类型主要有 4 种:

+

1. redis 主从模式:官方原版

+

2.codis-redis:豌豆荚开源,redis 集群解决方案

+

3. 云数据库 redis:redis-cluster 容器化部署

+

4.xcache:基于 codis、pika、redis 自研的一套海量 KV 存储解决方案

+

1.2 缓存使用模式介绍

+

使用模式主要分为 2 种:

+

1.cache 模式:数据不需要持久化,实例恢复不需要加载数据,扩缩容不需要迁移数据

+

2.store 模式:数据需要持久化,实例恢复需要加载数据,扩缩容需要迁移数据

+

下面是对各种类型缓存做了简单对比:

+

+

2. 缓存使用军规

+

2.1 缓存类型使用规范

+

1)redis 集群模式首选云数据库 redis,海量 KV 存储首选 xcache

+

云数据库 redis 采用官方 redis cluster 模式,容器化部署,支持故障自动恢复和弹性伸缩,是当前 redis 集群的主推方案,但不支持数据持久化,如果必须要做数据持久化,并且对延时要求非常高,可以使用 codis redis。数据量非常大,并且对延时要求不是特别高,可以选择 xcache。

+

2)redis 不要当 db 使用,如果数据一定要做持久化,可以选择 xcache

+

redis 当 db 使用,故障恢复数据很慢,严重影响 SLA。并且如果主从全部挂掉,slave 机器无法恢复时,数据就会完全丢失。xcache 天然支持数据持久化

+

**3)**不要使用客户端分片模式

+

客户端分片模式不具备高可用和弹性伸缩能力,建议使用真正的集群模式,如 codis-redis、云数据库 redis、xcache

+

4)集群模式不支持 lua、redisson 客户端,如果业务必须使用,只能选择 redis 主从模式

+

5)redis 单节点容量不要超过 10GB,xcache 单节点容量不要超过 200GB

+

redis 单节点容量太大时,实例重启会比较慢,影响恢复时长

+

2.2 键值设计规范

+

1)key 尽量保持简洁性、可读性、可管理性

+

在保证语义的前提下,控制 key 的长度;以业务名 (或数据库名) 为前缀 (防止 key 冲突),用冒号分隔,比如业务名:表名:id;不要包含特殊字符

+

2)拒绝 bigkey,防止网卡流量过高、慢查询

+

string 类型控制在 10KB 以内,hash、list、set、zset 元素个数不要超过 5000

+

3)避免热点 key

+

热 key 会导致数据倾斜,以及单节点压力过大。建议业务侧将热 key 打散

+

4)控制 key 生命周期

+

缓存不是垃圾桶,最好对 key 都设置 ttl,并且将 key 的 ttl 打散,避免 key 集中过期

+

2.3 命令使用规范

+

1)慎用全量操作命令

+

禁用 `keys *` 命令,尽量不使用 hgetall、smembers 等命令。在获取 key 下的多个元素时,使用相应的 scan 命令,一次获取少量元素,分多次获取,建议一次 scan 不要超过 200 个

+

2)控制 mset、mget、hmset、hmget、*scan、*range 等命令单次操作元素数量,建议****不要超过 200

+

3)控制 pipeline 中命令的数量,建议****不要超过 100

+

4)redis 删除 key 时,不要用 del 命令,使用 unlink 命令

+

del 一个大 key 会直接导致 redis 卡住。使用 unlink 命令可以异步删除 key,不会对 redis 主线程产生影响,因此也不会影响业务流量

+

5)set 和 expire 命令合并成 setex 命令,减少服务端写压力

+

6)evalsha 代替 eval

+

redis-cluster 集群中使用 evalsha 代替 eval,减少网络 IO,同时也减小 redis 网络 IO 压力提高性能

+

2.4 业务缓存架构规范

+

1)redis 不要使用逻辑 db,只使用默认 db 0

+

可以通过实例隔离,不同业务的数据保存到不同的实例中。(只有 redis 主从可以选择逻辑 db,集群模式默认都使用 db0)

+

2)避免多业务复用同一缓存资源

+

不同业务的数据使用不同的集群,S 级应用不要和 B 级应用混用,过多业务复用同一资源要做拆分。业务尽量提供 rpc 接口给其它业务调用,而不是直接让其它业务访问数据源(如一个业务写,一个业务读)

+

3)xcache 尽量使用 string 类型

+

xcache 支持 string,hash,ehash,list,set,zset 六种数据类型,ehash 数据类型是对 hash 数据类型的扩展,支持对 field 设置过期时间。xcache 中 string 类型是速度最快的,其他数据类型都是由 string 进行组合变换而实现,六种数据的性能如下:

+

string > hash > set > ehash > list > zset

+

建议:尽量使用 string 类型

+

4)减少 lua 脚本使用

+

集群模式对 lua 支持有限制,必须保证 lua 中操作的 key 被 sharding 到同一个节点。所以尽量减少对 lua 的使用

+

5)lua 脚本中不跑复杂逻辑

+

复杂逻辑放在业务代码中,而不是 lua 脚本中

+

6)采用高效序列化方法和压缩方法

+

为了节省内存,如果 value 较大时,可以使用压缩工具(如 snappy 或 gzip),把数据压缩后再写入 redis

+

7)避免批量任务、定时任务、周期任务流量太大影响在线业务

+

批量任务、定时任务、周期任务业务上要做限速

+

8)业务变更,存储流量模型变化要先评估

+

业务模型变化,QPS、容量增加,O (N) 命令增多等都要先评估当前缓存是否抗的住,做到灰度上线,持续观察(尤其是流量高峰期)

+

9)不用的资源尽早申请回收

+

休眠资源回收不仅可以降低业务的存储成本,还可以把资源分配给真正需要的业务,可谓是双赢

+

补充:OpenAtom 开源大赛 Pika 赛题放出,奖金 50 万,请扫描如下二维码进行 报名

+

+

大家也可以添加 Pika 助手,加入 Pika 微信群,了解更多动态消息:

+

+ + \ No newline at end of file diff --git "a/build/docs/\346\200\247\350\203\275\344\270\216\344\274\230\345\214\226/Pika \344\274\230\345\214\226\346\241\210\344\276\213/\350\260\203\346\225\264 max-write-buffer-size \344\274\230\345\214\226 pika \346\200\247\350\203\27510\345\200\215\347\232\204\346\241\210\344\276\213/index.html" "b/build/docs/\346\200\247\350\203\275\344\270\216\344\274\230\345\214\226/Pika \344\274\230\345\214\226\346\241\210\344\276\213/\350\260\203\346\225\264 max-write-buffer-size \344\274\230\345\214\226 pika \346\200\247\350\203\27510\345\200\215\347\232\204\346\241\210\344\276\213/index.html" new file mode 100644 index 0000000..0614af1 --- /dev/null +++ "b/build/docs/\346\200\247\350\203\275\344\270\216\344\274\230\345\214\226/Pika \344\274\230\345\214\226\346\241\210\344\276\213/\350\260\203\346\225\264 max-write-buffer-size \344\274\230\345\214\226 pika \346\200\247\350\203\27510\345\200\215\347\232\204\346\241\210\344\276\213/index.html" @@ -0,0 +1,109 @@ + + + + + +调整 max-write-buffer-size 优化 pika 性能10倍的案例 | PikiwiDB(Pika) + + + + + + + + + +

调整 max-write-buffer-size 优化 pika 性能10倍的案例

现居珠海,先后担任专职 Oracle 和 MySQL DBA,现在主要负责 MySQL、mongoDB 和 Redis 维护工作。

+

本文来源:原创投稿

+

*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

+
+

1、背景

+

某业务写多读少,上线前预估TPS最高可达4w且可能会随时增长,去年上线时采用了mongo 4分片集群架构。

+

现在业务趋于稳定,日常TPS只有最高值的1/10不到,项目组出于成本考虑想要将其迁移到内存KV数据库,但是 redis纯内存模式机器成本有点高,经过调研后决定尝试360开源的pika。

+

我们采用的是3.3.6版本,机器A配置为8c8G200G,压测出现大量超时ERROR: redis: connection pool timeout,qps只有3k左右,且磁盘的%util 一直接近100,处于“饱和”状态。

+

同样版本的pika,在机器B上测试,qps能达到40K且没有1个超时错误,这台机器配置24c48G1.5T。 从多家云厂商那里获悉相同型号的云主机,硬盘容量越大IO吞吐会越高,因此一开始怀疑是硬件问题。

+

针对两台云主机进行FIO测试,配置更高的机器读写吞吐是会高一些(大概提升20%左右),但并没有pika qps指标相 差10倍这么夸张。

+

将机器B的pika配置文件复制到机器A上,重启pika再测进行压测,这次机器A的qps也能达到40K,说明pika配置 参数导致的性能差异。

+

2、诊断

+

两个配置文件参数相差的有点多,只能逐个修改并压测。

+

测试过程略过,最后确认是max-write-buffer-size设置不合理导致的,该参数默认值14045392(13M),调大为 4294967296(4G)后pika qps就从3k提升到了40K。

+

+

以下是对应测试案例的iostat截图

+

— max-write-buffer-size 14045392(13M)

+

+

— max-write-buffer-size 4294967296

+

+

两者最大的差异是w/s和avgrq-sz,其中avgrq-sz描述的是IO请求的平均大小,以扇区(512字节)为单位。

+

图1每秒磁盘写请求4700,每个请求平均大小为55 * 0.5 ~= 27.5K,出现了大量的小块写。

+

图2每秒磁盘写请求200左右,每个请求平均大小为800 * 0.5 ~= 400K,明显采用了批量落盘的策略。

+

再看%util 指标,这个不是我们通常理解的磁盘饱和度,而是磁盘使用率,其计算时只关注io请求数量,不理会每 个io请求的大小,即便达到了100,并不意味着磁盘吞吐已达上限。

+

假设某路段有1w辆私家车(每车只有1个人,avgrq-sz=1)同时通行,即便平均每秒放行10辆车(w/s=10),总体运 力也只有10人/s,若是改成50座大巴车(avgrq-sz=50),即便每秒只放行1辆车(w/s=1),总体运力也会提高到50 人/s。

+

在这个案例中,%util 记录的只是平均每秒通行的机动车数量,不关心每辆车坐了多少人,如果私家车的%util 是 100,那大巴车的%util只有10并且吞吐更高,跟上述截图描述的场景十分吻合。

+

关于max-write-buffer-size参数,pika官档原文如下:https://github.com/OpenAtomFoundation/pika/wiki/pika- %E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E8%AF%B4%E6%98%8E

+

# Pika 底层单个rocksdb单个memtable的大小, 设置越大写入性能越好但会在buffer刷盘时带来更大的IO负载, 请 依据使用场景合理配置 +[RocksDb‐Tuning‐Guide](https://github.com/facebook/rocksdb/wiki/RocksDB‐Tuning‐Guide) +write‐buffer‐size : 268435456

+

pika实例所拥有的rocksdb实例使用的memtable大小上限,如果rocksdb实际使用超过这个数值,下一次写入会造成 刷盘

+

[Rocksdb‐Basic‐Tuning](https://github.com/facebook/rocksdb/wiki/Setup‐Options‐and‐Basic‐Tuning) +max‐write‐buffer‐size : 10737418240

+
    +
  1. +

    # Pika 底层单个rocksdb单个memtable的大小, 设置越大写入性能越好但会在buffer刷盘时带来更大的IO负载, 请 依据使用场景合理配置

    +
  2. +
  3. +

    [RocksDb‐Tuning‐Guide](https://github.com/facebook/rocksdb/wiki/RocksDB‐Tuning‐Guide)

    +
  4. +
  5. +

    write‐buffer‐size : 268435456

    +
  6. +
  7. +

    # pika实例所拥有的rocksdb实例使用的memtable大小上限,如果rocksdb实际使用超过这个数值,下一次写入会造成 刷盘

    +
  8. +
  9. +

    [Rocksdb‐Basic‐Tuning](https://github.com/facebook/rocksdb/wiki/Setup‐Options‐and‐Basic‐Tuning)

    +
  10. +
  11. +

    max‐write‐buffer‐size : 10737418240

    +
  12. +
+

# Pika 底层单个rocksdb单个memtable的大小, 设置越大写入性能越好但会在buffer刷盘时带来更大的IO负载, 请 依据使用场景合理配置 +[RocksDb‐Tuning‐Guide](https://github.com/facebook/rocksdb/wiki/RocksDB‐Tuning‐Guide) +write‐buffer‐size : 268435456

+

pika实例所拥有的rocksdb实例使用的memtable大小上限,如果rocksdb实际使用超过这个数值,下一次写入会造成 刷盘

+

[Rocksdb‐Basic‐Tuning](https://github.com/facebook/rocksdb/wiki/Setup‐Options‐and‐Basic‐Tuning) +max‐write‐buffer‐size : 10737418240

+

RocksDB采用WAL + LSM架构,memtable可以看作是用户数据落盘的基本单位,memtable越大则落盘时越倾 向于批量写,更能有效利用磁盘IO吞吐。

+

+

最初的参数文件没有设置max-write-buffer-size,只有write-buffer-size,奇怪的是调大write-buffer-size并不会 将前者自动增大,两者不具备联动关系。

+

+

我在压测时尝试调大write-buffer-size到1G(max-write-buffer-size保持默认值),性能依然上不去,看来是max- write-buffer-size起到了决定性作用。

+

经过多次压测,最终我们的主要参数设置如下:

+

thread‐num : 8 #和cpu核数相同 +thread‐pool‐size : 8 +write‐buffer‐size : 268435456 +max‐write‐buffer‐size : 4294967296 +compression : snappy +max‐background‐flushes : 2 +max‐background‐compactions : 2

+
    +
  1. thread‐num : 8 #和cpu核数相同
  2. +
  3. thread‐pool‐size : 8
  4. +
  5. write‐buffer‐size : 268435456
  6. +
  7. max‐write‐buffer‐size : 4294967296
  8. +
  9. compression : snappy
  10. +
  11. max‐background‐flushes : 2
  12. +
  13. max‐background‐compactions : 2
  14. +
+

thread‐num : 8 #和cpu核数相同 +thread‐pool‐size : 8 +write‐buffer‐size : 268435456 +max‐write‐buffer‐size : 4294967296 +compression : snappy +max‐background‐flushes : 2 +max‐background‐compactions : 2

+

3、结论

+

通过这个案例对iostat的输出指标有了更深一步的了解,以后再遇到%util达到100时先不要轻易作出磁盘IO已饱和 的结论,很可能是大量小IO请求导致的,可通过w/s和avgrq-sz进行辨别比较。

+

使用pika时,一定要设置max-write-buffer-size值,虽然和write-buffer-size参数名字很像,但两者没有联动关系 且max-write-buffer-size起到了决定性作用。

+

最后,我们的应用成功迁移到pika,相比之前的mongo集群节省了不少的机器资源开销,可见没有最好的DB,只有最适合的。

+ + \ No newline at end of file diff --git "a/build/docs/\346\200\247\350\203\275\344\270\216\344\274\230\345\214\226/Pika \345\206\205\345\255\230\344\275\277\347\224\250/index.html" "b/build/docs/\346\200\247\350\203\275\344\270\216\344\274\230\345\214\226/Pika \345\206\205\345\255\230\344\275\277\347\224\250/index.html" new file mode 100644 index 0000000..ddfe915 --- /dev/null +++ "b/build/docs/\346\200\247\350\203\275\344\270\216\344\274\230\345\214\226/Pika \345\206\205\345\255\230\344\275\277\347\224\250/index.html" @@ -0,0 +1,36 @@ + + + + + +Pika 内存使用 | PikiwiDB(Pika) + + + + + + + + + +

Pika 内存使用

Pika内存占用

+
    +
  1. rocksdb 内存占用
  2. +
  3. pika 内存占用(tcmalloc 占用)
  4. +
+

1. rocksdb 内存占用

+

命令行命令 info data

+

used_memory_human = db_memtable_usage + db_tablereader_usage

+

相应配置及对应影响参数

+

write-buffer-size => db_memtable_usage

+

max-write-buffer-size => db_memtable_usage

+

max-cache-files => db_tablereader_usage

+

对应rocksdb配置解释

+

https://github.com/facebook/rocksdb/wiki/Setup-Options-and-Basic-Tuning

+

https://github.com/facebook/rocksdb/wiki/Memory-usage-in-RocksDB

+

2. pika 内存占用

+

如果使用tcmalloc,绝大多数情况下是tcmalloc暂时占用内存。

+

命令行命令:tcmalloc stats

+

命令行命令:tcmalloc free 释放tcmalloc 占用内存

+ + \ No newline at end of file diff --git "a/build/docs/\346\200\247\350\203\275\344\270\216\344\274\230\345\214\226/Redis \344\270\216 Pika scan \346\200\247\350\203\275\345\257\271\346\257\224/index.html" "b/build/docs/\346\200\247\350\203\275\344\270\216\344\274\230\345\214\226/Redis \344\270\216 Pika scan \346\200\247\350\203\275\345\257\271\346\257\224/index.html" new file mode 100644 index 0000000..83a1519 --- /dev/null +++ "b/build/docs/\346\200\247\350\203\275\344\270\216\344\274\230\345\214\226/Redis \344\270\216 Pika scan \346\200\247\350\203\275\345\257\271\346\257\224/index.html" @@ -0,0 +1,27 @@ + + + + + +Redis 与 Pika scan 性能对比 | PikiwiDB(Pika) + + + + + + + + + +

Redis 与 Pika scan 性能对比

Redis 是后端常用的键值数据库。Pika 是 360 出品的一款与 Redis 协议几乎兼容的数据库。与 Redis 不同的是,Pika 基于硬盘,使用 RocksDB 作为引擎,从容量上来说,比基于内存的 Redis 大了不少,而且在性能上也能满足一般需求。

+

我们知道,在 Redis 中,keys * 这个操作仅限于在本地调试使用,千万不能用于线上,因为这会 遍历整个数据库,可能引起数据库长时间无响应,甚至崩溃。在线上服务器,如果想要查找某个模式 的键,可以使用 scan 命令。比如说要查找 user: 前缀的所有键,可以使用 scan 0 user:* 命令。然而如果服务器上的键非常多的话,虽然不会卡死服务器了,但是这个过程依然会很漫长。

+

Redis 是使用 hash table 实现的,所以 scan 命令其实也是遍历所有键,拿到每个键再做过滤,而 不能直接读取符合对应 pattern 的键。我们使用下面的代码来验证一下 redis scan 的性能。

+
from redis import Redis
from uuid import uuid4
import time

def gen(r):
for i in range(10000000):
r.set(str(uuid4()), 1)
r.set("user:1", "bar")

def scan(r):
start = time.time()
for key in r.scan_iter("user:*"):
print("user=%s" % r.get(key).decode())
duration = time.time() - start
print("duration for finding user is %.3f" % duration)
duration = time.time() - start
print("duration for full scan is %.3f" % duration)

if __name__ == "__main__":
import sys
port = int(sys.argv[1])
r = Redis(port=port)
gen(r)
scan(r)
+

首先插入一千万个随机数据,然后从中查找我们的目标数据。结果如下:

+
-> % python3 rb.py 6379
user=bar
duration for finding user is 80.145
duration for full scan is 180.936
+

和我们的预期基本是相符的,也就是说 Redis 是首先遍历然后再做过滤的。

+

接下来我们对 Pika 做相同的实验,Pika 默认使用 9221 端口,我们只需要把端口换一下就好了:

+
-> % python3 rb.py 9221
user=bar
duration for finding user is 0.002
duration for full scan is 0.003
+

结果是令人震惊的!Pika 几乎在瞬间就完成了遍历。原因在于 Pika 使用了 RocksDB,而 RocksDB 支持 Range 操作。RocksDB 中的数据都是有序的,所以查找起来就不需要 O(n) 了,只需要二分查找, 也就是 O(logN) 即可。

+ + \ No newline at end of file diff --git "a/build/docs/\346\200\247\350\203\275\344\270\216\344\274\230\345\214\226/index.html" "b/build/docs/\346\200\247\350\203\275\344\270\216\344\274\230\345\214\226/index.html" new file mode 100644 index 0000000..2f4da53 --- /dev/null +++ "b/build/docs/\346\200\247\350\203\275\344\270\216\344\274\230\345\214\226/index.html" @@ -0,0 +1,18 @@ + + + + + +性能与优化 | PikiwiDB(Pika) + + + + + + + + + + + + \ No newline at end of file diff --git "a/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/NoSQL \345\216\237\347\220\206\346\246\202\350\277\260/index.html" "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/NoSQL \345\216\237\347\220\206\346\246\202\350\277\260/index.html" new file mode 100644 index 0000000..a870133 --- /dev/null +++ "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/NoSQL \345\216\237\347\220\206\346\246\202\350\277\260/index.html" @@ -0,0 +1,53 @@ + + + + + +NoSQL 原理概述 | PikiwiDB(Pika) + + + + + + + + + +

NoSQL 原理概述

pika 设计

+

pika 在设计的时候支持了两种运行模式,即经典模式和分布式模式。

+
模式原理
经典模式即一主多从模式,安装 pika 实例维度,即 1 个 pika 实例的数据可以被多个从实例数据同步。
分布式模式即用户的数据集合称为 table,将 table 切分成多个分片,每个分片称为 slot,对于某个 key 的数据是由哈希算法计算来决定属于哪个 slot,将所有 slots 及其副本按照一定策略分散到所有的 pika 实例中,每个 pika 实例有一部分的主 slot 和一部分从 slot,主从的维度为 slot。
+

官网原理图如下

+

经典模式 +alt text

+

分布式模式
+alt text

+

从原理图中,也可以清晰的看出经典模式以实例为维度,分布式模式以 slot 为维度。

+

pika 启动流程

+

基于 pika-3.4.0 版本的代码结构,其中 pika 引用了四个第三方的库,分别如下:

+
    +
  1. Blackwidow,由 piak 自行维护的基于 rocksdb 的存储管理,所有 pika 的数据操作都会通过 blackwidow 的封装最终落入 rocksdb。
  2. +
  3. Glog,日志库,用于 pika 项目输入不同等级的日志。
  4. +
  5. Pink,由 pika 自行维护的事件驱动框架,封装了 redis 协议的解析分发功能,并提供回调函数进行处理。
  6. +
  7. Slash,一些处理工具函数,例如同步的或者数据类型的工具函数。
  8. +
+

启动流程中最主要的几个函数如下:

+
int main(int argc, char *argv[]) {
...
LOG(INFO) << "Server at: " << path;
g_pika_cmd_table_manager = new PikaCmdTableManager();
g_pika_server = new PikaServer();
g_pika_rm = new PikaReplicaManager();
g_pika_proxy = new PikaProxy();

if (g_pika_conf->daemonize()) {
close_std();
}

g_pika_proxy->Start();
g_pika_rm->Start();
g_pika_server->Start();
...
}

+

分为四步,即首先初始化 cmd 的命令,然后初始化 PikaServer,接着初始化 PikaReplicaManager,最后初始化 PikaProxy,主要的启动函数就是如上几步,接着就继续分析一下。

+

PikaServer 功能

+
PikaServer::PikaServer() :
exit_(false),
slot_state_(INFREE),
have_scheduled_crontask_(false),
last_check_compact_time_({0, 0}),
master_ip_(""),
master_port_(0),
repl_state_(PIKA_REPL_NO_CONNECT),
role_(PIKA_ROLE_SINGLE),
last_meta_sync_timestamp_(0),
first_meta_sync_(false),
loop_partition_state_machine_(false),
force_full_sync_(false),
slowlog_entry_id_(0) {

//Init server ip host
if (!ServerInit()) { // 初始化监听的端口和IP
LOG(FATAL) << "ServerInit iotcl error";
}

...
InitBlackwidowOptions(); // 初始化Blackwidow的参数项,主要配置rocksdb的相关参数
...

// Create thread 根据配置来查看有多少的工作线程数
worker_num_ = std::min(g_pika_conf->thread_num(),
PIKA_MAX_WORKER_THREAD_NUM);

std::set<std::string> ips;
if (g_pika_conf->network_interface().empty()) {
ips.insert("0.0.0.0");
} else {
ips.insert("127.0.0.1");
ips.insert(host_);
}
// We estimate the queue size 获取处理的队列的大小
int worker_queue_limit = g_pika_conf->maxclients() / worker_num_ + 100;
LOG(INFO) << "Worker queue limit is " << worker_queue_limit;
pika_dispatch_thread_ = new PikaDispatchThread(ips, port_, worker_num_, 3000,
worker_queue_limit, g_pika_conf->max_conn_rbuf_size()); // 设置处理响应请求的线程池
pika_monitor_thread_ = new PikaMonitorThread(); // 监控的线程池
pika_rsync_service_ = new PikaRsyncService(g_pika_conf->db_sync_path(),
g_pika_conf->port() + kPortShiftRSync); // 同步的线程池
pika_pubsub_thread_ = new pink::PubSubThread(); // 订阅发布处理线程
pika_auxiliary_thread_ = new PikaAuxiliaryThread(); // 心跳辅助的状态改变处理线程

pika_client_processor_ = new PikaClientProcessor(g_pika_conf->thread_pool_size(), 100000); // 处理异步的task

pthread_rwlock_init(&state_protector_, NULL);
pthread_rwlock_init(&slowlog_protector_, NULL);
}
+

这其中初始化了大量的工作线程,来启动协同处理分别启动了 6 个不同的线程池或者线程来进行不同的处理工作。

+

PikaDispatchThread

+
PikaDispatchThread::PikaDispatchThread(std::set<std::string> &ips, int port, int work_num,
int cron_interval, int queue_limit, int max_conn_rbuf_size)
: conn_factory_(max_conn_rbuf_size),
handles_(this) {
thread_rep_ = pink::NewDispatchThread(ips, port, work_num, &conn_factory_,
cron_interval, queue_limit, &handles_);
thread_rep_->set_thread_name("Dispatcher");
}

...
private:
class ClientConnFactory : public pink::ConnFactory {
public:
explicit ClientConnFactory(int max_conn_rbuf_size)
: max_conn_rbuf_size_(max_conn_rbuf_size) {
}
virtual std::shared_ptr<pink::PinkConn> NewPinkConn(
int connfd,
const std::string &ip_port,
pink::Thread* server_thread,
void* worker_specific_data,
pink::PinkEpoll* pink_epoll) const {
return std::static_pointer_cast<pink::PinkConn>
(std::make_shared<PikaClientConn>(connfd, ip_port, server_thread, pink_epoll, pink::HandleType::kAsynchronous, max_conn_rbuf_size_));
}
private:
int max_conn_rbuf_size_;
...

...
extern ServerThread *NewDispatchThread(
const std::set<std::string>& ips, int port,
int work_num, ConnFactory* conn_factory,
int cron_interval, int queue_limit,
const ServerHandle* handle) {
return new DispatchThread(ips, port, work_num, conn_factory,
cron_interval, queue_limit, handle);
...

...
DispatchThread::DispatchThread(const std::set<std::string>& ips, int port,
int work_num, ConnFactory* conn_factory,
int cron_interval, int queue_limit,
const ServerHandle* handle)
: ServerThread::ServerThread(ips, port, cron_interval, handle),
last_thread_(0),
work_num_(work_num),
queue_limit_(queue_limit) {
worker_thread_ = new WorkerThread*[work_num_];
for (int i = 0; i < work_num_; i++) {
worker_thread_[i] = new WorkerThread(conn_factory, this, queue_limit, cron_interval); // 生成多个工作线程,工作线程进来的请求通过conn_factory来进行处理
}
}

DispatchThread::~DispatchThread() {
for (int i = 0; i < work_num_; i++) {
delete worker_thread_[i];
}
delete[] worker_thread_;
}

int DispatchThread::StartThread() {
for (int i = 0; i < work_num_; i++) { // 根据设置的工作线程的数量来进行处理
int ret = handle_->CreateWorkerSpecificData(
&(worker_thread_[i]->private_data_));
if (ret != 0) {
return ret;
}

if (!thread_name().empty()) {
worker_thread_[i]->set_thread_name("WorkerThread");
}
ret = worker_thread_[i]->StartThread(); // 开启每一个工作线程
if (ret != 0) {
return ret;
}
}
return ServerThread::StartThread();
}
...
+

此时会使用 PikaDispatchThread 的工厂方法来处理新接入的连接,并且每一个新进来的请求通过 NewPinkConn 来进行初始化,并接入处理。其中 DispatchThread 就是位于 pink 的库中实现的方法其中 ServerThread 机会在初始化的过程中进行端口 IP 的监听,在事件响应之后就会调用 HandleNewConn 方法来处理新加入的连接信息,会在处理的过程中进行一个轮训的操作来分配到工作线程,在加入事件之后就会通过新生成一个 PikaClientConn 来进行事件处理,当 pink 中的 redisconn 解析到了完整的命令的时候就会调用 PikaClientConn 的 ProcessRedisCmds 方法来处理(中间的逻辑有点复杂大家有兴趣可以自行查找源码阅读一下)。

+
void PikaClientConn::ProcessRedisCmds(const std::vector<pink::RedisCmdArgsType>& argvs, bool async, std::string* response) {
if (async) { // 是否是后台任务
BgTaskArg* arg = new BgTaskArg(); // 新建一个后台任务
arg->redis_cmds = argvs;
arg->conn_ptr = std::dynamic_pointer_cast<PikaClientConn>(shared_from_this());
g_pika_server->ScheduleClientPool(&DoBackgroundTask, arg); // 放入PikaClientProcessor的线程池来进行处理
return;
}
BatchExecRedisCmd(argvs); // 如果不是则调用响应的线程池直接处理
}

...
void PikaClientConn::BatchExecRedisCmd(const std::vector<pink::RedisCmdArgsType>& argvs) {
resp_num.store(argvs.size());
for (size_t i = 0; i < argvs.size(); ++i) { // 根据解析的输入参数大小来处理
std::shared_ptr<std::string> resp_ptr = std::make_shared<std::string>();
resp_array.push_back(resp_ptr);
ExecRedisCmd(argvs[i], resp_ptr); // 处理对应的命令
}
TryWriteResp();
}
...
void PikaClientConn::ExecRedisCmd(const PikaCmdArgsType& argv, std::shared_ptr<std::string> resp_ptr) {
// get opt
std::string opt = argv[0];
slash::StringToLower(opt);
if (opt == kClusterPrefix) { // 检查是否是集群名称开头
if (argv.size() >= 2 ) {
opt += argv[1];
slash::StringToLower(opt);
}
}

std::shared_ptr<Cmd> cmd_ptr = DoCmd(argv, opt, resp_ptr); // 执行命令
// level == 0 or (cmd error) or (is_read)
if (g_pika_conf->consensus_level() == 0 || !cmd_ptr->res().ok() || !cmd_ptr->is_write()) {
*resp_ptr = std::move(cmd_ptr->res().message());
resp_num--;
}
}
...

std::shared_ptr<Cmd> PikaClientConn::DoCmd(
const PikaCmdArgsType& argv,
const std::string& opt,
std::shared_ptr<std::string> resp_ptr) {
// Get command info
std::shared_ptr<Cmd> c_ptr = g_pika_cmd_table_manager->GetCmd(opt); // 从命令列表中查找命令
if (!c_ptr) {
std::shared_ptr<Cmd> tmp_ptr = std::make_shared<DummyCmd>(DummyCmd());
tmp_ptr->res().SetRes(CmdRes::kErrOther,
"unknown or unsupported command \'" + opt + "\"");
return tmp_ptr;
}
c_ptr->SetConn(std::dynamic_pointer_cast<PikaClientConn>(shared_from_this()));
c_ptr->SetResp(resp_ptr);

// Check authed
// AuthCmd will set stat_
if (!auth_stat_.IsAuthed(c_ptr)) { // 检查是否认证
c_ptr->res().SetRes(CmdRes::kErrOther, "NOAUTH Authentication required.");
return c_ptr;
}

uint64_t start_us = 0;
if (g_pika_conf->slowlog_slower_than() >= 0) {
start_us = slash::NowMicros();
}

bool is_monitoring = g_pika_server->HasMonitorClients(); // 是否是监控的客户端
if (is_monitoring) {
ProcessMonitor(argv);
}

// Initial
c_ptr->Initial(argv, current_table_); // 初始化命令信息
if (!c_ptr->res().ok()) {
return c_ptr;
}

g_pika_server->UpdateQueryNumAndExecCountTable(current_table_, opt, c_ptr->is_write());

// PubSub connection
// (P)SubscribeCmd will set is_pubsub_
if (this->IsPubSub()) {
if (opt != kCmdNameSubscribe &&
opt != kCmdNameUnSubscribe &&
opt != kCmdNamePing &&
opt != kCmdNamePSubscribe &&
opt != kCmdNamePUnSubscribe) {
c_ptr->res().SetRes(CmdRes::kErrOther,
"only (P)SUBSCRIBE / (P)UNSUBSCRIBE / PING / QUIT allowed in this context");
return c_ptr;
}
}

if (g_pika_conf->consensus_level() != 0 && c_ptr->is_write()) {
c_ptr->SetStage(Cmd::kBinlogStage);
}
if (!g_pika_server->IsCommandSupport(opt)) {
c_ptr->res().SetRes(CmdRes::kErrOther,
"This command is not supported in current configuration");
return c_ptr;
}

if (!g_pika_server->IsTableExist(current_table_)) {
c_ptr->res().SetRes(CmdRes::kErrOther, "Table not found");
return c_ptr;
}

// TODO: Consider special commands, like flushall, flushdb?
if (c_ptr->is_write()) {
if (g_pika_server->IsTableBinlogIoError(current_table_)) {
c_ptr->res().SetRes(CmdRes::kErrOther, "Writing binlog failed, maybe no space left on device");
return c_ptr;
}
std::vector<std::string> cur_key = c_ptr->current_key();
if (cur_key.empty()) {
c_ptr->res().SetRes(CmdRes::kErrOther, "Internal ERROR");
return c_ptr;
}
if (g_pika_server->readonly(current_table_, cur_key.front())) {
c_ptr->res().SetRes(CmdRes::kErrOther, "Server in read-only");
return c_ptr;
}
if (!g_pika_server->ConsensusCheck(current_table_, cur_key.front())) {
c_ptr->res().SetRes(CmdRes::kErrOther, "Consensus level not match");
}
}

// Process Command 执行命令
c_ptr->Execute();

if (g_pika_conf->slowlog_slower_than() >= 0) {
ProcessSlowlog(argv, start_us);
}
if (g_pika_conf->consensus_level() != 0 && c_ptr->is_write()) {
c_ptr->SetStage(Cmd::kExecuteStage);
}

return c_ptr;
}
...
+

通过层层的调用关系最终调用到了 Cmd 类的 Do 方法,例如 SetCmd 的执行流程如下:

+
void SetCmd::Do(std::shared_ptr<Partition> partition) {
rocksdb::Status s;
int32_t res = 1;
switch (condition_) {
case SetCmd::kXX:
s = partition->db()->Setxx(key_, value_, &res, sec_); // 通过db来设置key相关的信息
break;
case SetCmd::kNX:
s = partition->db()->Setnx(key_, value_, &res, sec_);
break;
case SetCmd::kVX:
s = partition->db()->Setvx(key_, target_, value_, &success_, sec_);
break;
case SetCmd::kEXORPX:
s = partition->db()->Setex(key_, value_, sec_);
break;
default:
s = partition->db()->Set(key_, value_);
break;
}

if (s.ok() || s.IsNotFound()) {
if (condition_ == SetCmd::kVX) {
res_.AppendInteger(success_);
} else {
if (res == 1) {
res_.SetRes(CmdRes::kOk);
} else {
res_.AppendArrayLen(-1);;
}
}
} else {
res_.SetRes(CmdRes::kErrOther, s.ToString());
}
}
+

至此就是通过一个简单的 set 命令来进行的流程,当然中间省略了很多复杂的交互细节,并且跳过了 pink 库的一个处理流程,最终会回调在 pika 中的 ProcessRedisCmds 处理。

+

PikaClientProcessor

+
PikaClientProcessor::PikaClientProcessor(
size_t worker_num, size_t max_queue_size, const std::string& name_prefix) {
pool_ = new pink::ThreadPool(
worker_num, max_queue_size, name_prefix + "Pool"); // 生成一个线程池
for (size_t i = 0; i < worker_num; ++i) { // 根据设置的线程池数量来初始化
pink::BGThread* bg_thread = new pink::BGThread(max_queue_size); // 初始化bg工作线程
bg_threads_.push_back(bg_thread); // 保存每个线程
bg_thread->set_thread_name(name_prefix + "BgThread");
}
}
+

主要是生成线程池来进行后台运行。在上一节中分析的 task 就是交给了 pool_线程池来进行数据的处理。一些协调数据同步的工作就交给了 bg_threads 线程池处理。

+

alt text

+

总结

+

本文主要简单的描述了有关 piak 的总体设计框架(参考官网架构),简单的通过 PikaServer 的启动过程来描述了一下基础的处理逻辑,因为这其中涉及到大量的细节故并没有详尽的去分析,并且也没有涉及到其他的功能比如 slot 的数据一致性保证等等细节,后续有继续再继续查阅相关内容。由于本人才疏学浅,如有错误请批评指正。

+ + \ No newline at end of file diff --git "a/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/Pika \344\270\216 Codis/index.html" "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/Pika \344\270\216 Codis/index.html" new file mode 100644 index 0000000..b095af9 --- /dev/null +++ "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/Pika \344\270\216 Codis/index.html" @@ -0,0 +1,92 @@ + + + + + +Pika 与 Codis | PikiwiDB(Pika) + + + + + + + + + +

Pika 与 Codis

背景
+

面对kv类型数据在公司的存储量越来越大,以及在性能响应不敏感的情况下,利用原生的codis方案来存储数据的方案,成本也越来越高,在这种场景下,急需一种替代方案能够有效兼顾成本与性能。故引入了pika来作为codis的底层存储,来替换成本较高的codis-server,并围绕pika的方案进行了一系列的设计改造。

+
codis的原理设计
+

codis项目主要分为codis-fe、codis-dashboard、codis-proxy和codis-server这四个组件。

+

codis-fe主要是方便统一管理多套的codis-dasbhoard,并提供运维友好的管理界面,在运维性与管理性上面都比较友好。

+

codis-dashboard主要就是完成有关slot、codis-proxy和zk(或者etcd)等组件的数据一致性,整个集群的运维的状态,数据的扩容缩容和组件高可用的管理,类似于k8s的api-server的功能。

+

codis-proxy主要就是提供给业务层面使用的访问代理,解析请求路由并将key的路由信息路由到对应的后端group上面,而且还有一个很重要的功能就是当通过codis-fe来进行集群的扩缩容的时候,codis-proxy会根据group的迁移状态,来触发key的检查或者迁移的功能从而完成在不中断业务服务的情况下热迁移数据,从而保证业务的可用性。

+
codis的运行原理
+

codis在运行的过程中与官网给定的原理图是一致的。

+

在这里插入图片描述

+

通过zk的路径暴露,来进行codis-proxy的负载均衡和服务发现,可使用官方提供的jodis或者自己实现的redis-client来进行封装。

+

codis-dashboard通过接受codis-fe的扩缩容、上下线,集群主从状态等管理指令。在接受到指令之后,通过将状态的存储并将状态推送到codis-proxy,从而使在codis-fe上线的管理能够动态的在codis-proxy的数据能够动态路由,所有的集群状态的管理都会通过codis-dashboard来保持一致。

+
codis的扩缩容原理
+

通过对codis整个的运行图的简单的概述,我们来进一步探讨一下有关codis是如何进行一个动态的扩缩容的。

+

以扩展group为例,整个的集群流程如下。

+

原始集群如下,此时需要将group4加入集群,并将group3的901-1023的slot迁移到group4。

+

在这里插入图片描述

+

迁移完成之后的状态如下。

+

在这里插入图片描述

+

此时group4就新加入到codis集群中,并运行的数据slot为原group3的901-1023的slot。

+

详细的迁移步骤可以分为如下几步。

+
codis-fe将状态发往codis-dashboard
+

在codis-fe上面,在Migrate Range上面将slot填写为901-1023,迁移至group4。

+

此时codis-fe就会往codis-dashboard发送一个包含/api/topom/slots/action/create-range/…/901/1023/1的uri,此时codis-dashboard就会执行如下的操作。

+
func (s *Topom) SlotCreateActionSome(groupFrom, groupTo int, numSlots int) error {
s.mu.Lock()
defer s.mu.Unlock()
ctx, err := s.newContext()
if err != nil {
return err
}

g, err := ctx.getGroup(groupTo)
if err != nil {
return err
}
if len(g.Servers) == 0 {
return errors.Errorf("group-[%d] is empty", g.Id)
}

var pending []int
for _, m := range ctx.slots { // 验证slot的状态
if len(pending) >= numSlots {
break
}
if m.Action.State != models.ActionNothing {
continue
}
if m.GroupId != groupFrom {
continue
}
if m.GroupId == g.Id {
continue
}
pending = append(pending, m.Id)
}

for _, sid := range pending {
m, err := ctx.getSlotMapping(sid)
if err != nil {
return err
}
defer s.dirtySlotsCache(m.Id) // 将该slot标记为需要重新写入zk或者etcd来维持状态

m.Action.State = models.ActionPending
m.Action.Index = ctx.maxSlotActionIndex() + 1
m.Action.TargetId = g.Id
if err := s.storeUpdateSlotMapping(m); err != nil { // 更新该slot的状态,该结构维护了group到slot的对应的关系,用于在codis-proxy中就行每个slot的路由代理
return err
}
}
return nil
}
+

从流程可知,创建迁移过程之后,其实就是将迁移的信息写入zk或者etcd中来保存迁移的状态,并且通过codis-dashboard自己启动的状态机来进行每一步的状态迁移。

+
codis-dashboard接受状态并开始启动迁移
+

在codis-fe成功写入迁移信息到zk或者etcd之后,此时就通过codis-dashboard自身监控服务迁移的状态来启动数据迁移。

+
//处理slot操作
go func() {
for !s.IsClosed() {
if s.IsOnline() {
if err := s.ProcessSlotAction(); err != nil {
log.WarnErrorf(err, "process slot action failed")
time.Sleep(time.Second * 5)
}
}
time.Sleep(time.Second)
}
}()
+

该协程就会一直刷新查看是否有迁移的状态,如果有迁移的状态就会进行处理。有关对该状态处理的核心函数如下。

+
func (s *Topom) SlotActionPrepareFilter(accept, update func(m *models.SlotMapping) bool) (int, bool, error) {
s.mu.Lock()
defer s.mu.Unlock()

// 上下文
ctx, err := s.newContext()
if err != nil {
return 0, false, err
}

// 取最小的action index
var minActionIndex = func(filter func(m *models.SlotMapping) bool) (picked *models.SlotMapping) {
for _, m := range ctx.slots {
// 遍历所有的slotMapping, 如果 m.Action.State == "", 跳出本次循环, 执行下次循环
if m.Action.State == models.ActionNothing {
continue
}

// 将slotMapping传入filter函数中, 如果m.Action.State != models.ActionPending, 才执行if里面的语句
if filter(m) {
if picked != nil && picked.Action.Index < m.Action.Index {
continue
}

//只有一个slot没有执行过update方法,accept才会返回true;也就是说,一个slot只会被处理一次
// marks里面保存的是:已经分配了group,或者即将分配group,这2种group id
// 如果m的即将分配group id在marks里面, accept(m)就返回false, 这样就保证了同时只有一个slot迁入到同一个group下, 在一个redis下面,同时只有一个slot被迁移出去
if accept == nil || accept(m) {
picked = m
}
}
}
return picked
}

// 第一种情况是: 取正在做slot迁移的slot里面action.id最小的那个slot
// 第二中情况是: 上面的没有取到的前提下,才做第二种操作,取出pending状态的slot里面action.id最小的那个slot
var m = func() *models.SlotMapping {
// 取出 m.Action.State != "" and m.Action.State != pending 的slot里面action.id最小的那个slot
// 即: 取出正在做slot迁移的slot里面action.id最小的那个slot
// 赋值给picked
// 然后返回
var picked = minActionIndex(func(m *models.SlotMapping) bool {
return m.Action.State != models.ActionPending
})
if picked != nil {
return picked
}

// 如果上面没有取到,执行下面的语句

if s.action.disabled.IsTrue() {
return nil
}

// 取出 m.Action.State != "" and m.Action.State == models.ActionPending的slot里面action.id最小的那个slot
// 即: 取出pending状态的slot里面action.id最小的那个slot
// 赋值给picked
// 然后返回
return minActionIndex(func(m *models.SlotMapping) bool {
return m.Action.State == models.ActionPending
})
}()

// 上面2种情况都没有取到值的话,说明不需要做slot迁移, 因为没有取到正在做slot迁移的最小的action.id, 也没有取到准备做slot迁移的最小的action.id
if m == nil {
return 0, false, nil
}


if update != nil && !update(m) {
return 0, false, nil
}

log.Warnf("slot-[%d] action prepare:\n%s", m.Id, m.Encode())


//变更每个SlotMapping的action.state,并与zk交互
//另外,Action.state符合preparing或者prepared的时候,要将SlotMapping同步到proxy
switch m.Action.State {

case models.ActionPending:

defer s.dirtySlotsCache(m.Id)

// 将action state状态改成 preparing
m.Action.State = models.ActionPreparing

// 写入zk中
if err := s.storeUpdateSlotMapping(m); err != nil {
return 0, false, err
}

// 无条件继续执行下面case中语句
fallthrough

case models.ActionPreparing:

defer s.dirtySlotsCache(m.Id)

log.Warnf("slot-[%d] resync to prepared", m.Id)

// 将action state状态改成 ActionPrepared
m.Action.State = models.ActionPrepared

// 将slotMapping信息刷新到proxy中, 如果刷失败了, 将m.Action.State改回ActionPreparing, 返回
if err := s.resyncSlotMappings(ctx, m); err != nil {
log.Warnf("slot-[%d] resync-rollback to preparing", m.Id)

// slotMapping信息刷新到proxy失败, m.Action.State改回ActionPreparing
m.Action.State = models.ActionPreparing
s.resyncSlotMappings(ctx, m)
log.Warnf("slot-[%d] resync-rollback to preparing, done", m.Id)
return 0, false, err
}

// 刷新proxy信息成功后, 将m.Action.State = models.ActionPrepared写入到zk中
if err := s.storeUpdateSlotMapping(m); err != nil {
return 0, false, err
}

// 无条件继续执行下面case中语句
fallthrough

case models.ActionPrepared:

defer s.dirtySlotsCache(m.Id)

log.Warnf("slot-[%d] resync to migrating", m.Id)

// 将action state状态改成 ActionMigrating
m.Action.State = models.ActionMigrating

// 将slotMapping信息刷新到proxy中, 如果刷失败了, 返回
if err := s.resyncSlotMappings(ctx, m); err != nil {
log.Warnf("slot-[%d] resync to migrating failed", m.Id)
return 0, false, err
}

// 刷成功后, 将m.Action.State = models.ActionMigrating 写入zk
if err := s.storeUpdateSlotMapping(m); err != nil {
return 0, false, err
}

// 无条件继续执行下面case中语句
fallthrough

case models.ActionMigrating:

return m.Id, true, nil

case models.ActionFinished:

return m.Id, true, nil

default:

return 0, false, errors.Errorf("slot-[%d] action state is invalid", m.Id)

}
}
+

在ActionPreparing的状态的时候,就会将数据写入zk或者etcd从而通知到了codis-proxy状态更新。

+

在codis-dashboard中就会通过processSlotAction函数来进行后端数据的迁移,其中最核心的函数为newSlotActionExecutor。

+
// 调用redis的SLOTSMGRTTAGSLOT命令, 进行redis slot 迁移
func (s *Topom) newSlotActionExecutor(sid int) (func(db int) (remains int, nextdb int, err error), error) {
s.mu.Lock()
defer s.mu.Unlock()

// 上下文
ctx, err := s.newContext()
if err != nil {
return nil, err
}

//根据slot的id获取SlotMapping,主要方法就是return ctx.slots[sid], nil
m, err := ctx.getSlotMapping(sid)
if err != nil {
return nil, err
}

switch m.Action.State {

//最初slot还处在迁移过程中,即migrating
case models.ActionMigrating:

if s.action.disabled.IsTrue() {
return nil, nil
}
// m.groupId 主从在切换时, 不做slot迁移操作
if ctx.isGroupPromoting(m.GroupId) {
return nil, nil
}
// m.action.targetId 主从在切换时, 不做slot迁移操作
if ctx.isGroupPromoting(m.Action.TargetId) {
return nil, nil
}

//迁移过程中,一个slot本身所在的group以及目标group的Promoting.State都必须为空才可以做迁移
from := ctx.getGroupMaster(m.GroupId)
//取出group 2的第一个server,也是master
dest := ctx.getGroupMaster(m.Action.TargetId)

//Topom的action中的计数器加一
s.action.executor.Incr()

return func(db int) (int, int, error) {
//每执行一个槽的迁移操作,Topom的action中的计数器就减1
defer s.action.executor.Decr()

if from == "" {
return 0, -1, nil
}

//从cache中得到group 1的redisClient,这个client由addr, auth, timeout,Database,redigo.Conn组成: 如果cache没有, 就新建
c, err := s.action.redisp.GetClient(from)
if err != nil {
return 0, -1, err
}
//将刚才新建的或者从cache中取出的redis client再put到Topom.action.redisp中
defer s.action.redisp.PutClient(c)

//这里db是0,相当于redis从16个库中选择0号
if err := c.Select(db); err != nil {
return 0, -1, err
}

var do func() (int, error)

method, _ := models.ParseForwardMethod(s.config.MigrationMethod)
switch method {
case models.ForwardSync:
do = func() (int, error) {
//调用redis的SLOTSMGRTTAGSLOT命令,随机选择当前slot的一个key,并将与这个key的tag相同的k-v全部迁移到目标机
return c.MigrateSlot(sid, dest)
}
case models.ForwardSemiAsync:
var option = &redis.MigrateSlotAsyncOption{
MaxBulks: s.config.MigrationAsyncMaxBulks,
MaxBytes: s.config.MigrationAsyncMaxBytes.AsInt(),
NumKeys: s.config.MigrationAsyncNumKeys,
Timeout: math2.MinDuration(time.Second*5,
s.config.MigrationTimeout.Duration()),
}
//调用redis的SLOTSMGRTTAGSLOT-ASYNC命令,参数是target redis的ip和port
do = func() (int, error) {
return c.MigrateSlotAsync(sid, dest, option)
}
default:
log.Panicf("unknown forward method %d", int(method))
}

n, err := do()
if err != nil {
return 0, -1, err
} else if n != 0 {
return n, db, nil
}

nextdb := -1
//通过info命令查keyspace信息并做处理,这里取出的m为空
m, err := c.InfoKeySpace()
if err != nil {
return 0, -1, err
}
for i := range m {
if (nextdb == -1 || i < nextdb) && db < i {
nextdb = i
}
}
return 0, nextdb, nil

}, nil

case models.ActionFinished:

return func(int) (int, int, error) {
return 0, -1, nil
}, nil

default:

return nil, errors.Errorf("slot-[%d] action state is invalid", m.Id)

}
}
+

通过调用需要迁移数据的codis-server来主动进行数据的同步信息。

+

如果在数据同步中,通过codis-proxy来访问数据,codis-proxy则根据配置文件要么去查找一下新节点数据是否存在,如果不存在则将数据迁移至新节点上面来从而保持数据的一致性。

+
codis-dashboard完成
+

当所有的slot迁移完成之后,就会在zk或者etcd中更新当前的slot状态,从而完成整个迁移过程。

+

整个迁移流程可简单如下所示。

+
pika简介
+

pika是360团队开源而来的一个兼容redis协议底层选用rocksdb的一个kv存储,该项目加入了开放原子开源基金会,并且在主流版本上面提供codis的接入能力。故考虑通过引入pika来替换codis中的codis-server组件。

+

pika既支持单节点模式也支持分布式模式,即每个slot都可以通过单独的管理迁移。在业务实践中考虑到数据量相对较大,故在最开始的时候就是使用的分布式模式,在后续的设计改造中也是依据该模式进行。

+
pika接入codis的挑战
+
pika官方支持的codis-server的命令
+

通过查阅pika的源码(3.4.0版本),在位于pika_command.h头文件中找到如下。

+
//Codis Slots
const std::string kCmdNameSlotsInfo = "slotsinfo";
const std::string kCmdNameSlotsHashKey = "slotshashkey";
const std::string kCmdNameSlotsMgrtTagSlotAsync = "slotsmgrttagslot-async";
const std::string kCmdNameSlotsMgrtSlotAsync = "slotsmgrtslot-async";
const std::string kCmdNameSlotsDel = "slotsdel";
const std::string kCmdNameSlotsScan = "slotsscan";
const std::string kCmdNameSlotsMgrtExecWrapper = "slotsmgrt-exec-wrapper";
const std::string kCmdNameSlotsMgrtAsyncStatus = "slotsmgrt-async-status";
const std::string kCmdNameSlotsMgrtAsyncCancel = "slotsmgrt-async-cancel";
const std::string kCmdNameSlotsMgrtSlot = "slotsmgrtslot";
const std::string kCmdNameSlotsMgrtTagSlot = "slotsmgrttagslot";
const std::string kCmdNameSlotsMgrtOne = "slotsmgrtone";
const std::string kCmdNameSlotsMgrtTagOne = "slotsmgrttagone";
+

对比查看一下codis-server支持的命令如下。

+
    {"slotsinfo",slotsinfoCommand,-1,"rF",0,NULL,0,0,0,0,0},
{"slotsscan",slotsscanCommand,-3,"rR",0,NULL,0,0,0,0,0},
{"slotsdel",slotsdelCommand,-2,"w",0,NULL,1,-1,1,0,0},
{"slotsmgrtslot",slotsmgrtslotCommand,5,"w",0,NULL,0,0,0,0,0},
{"slotsmgrttagslot",slotsmgrttagslotCommand,5,"w",0,NULL,0,0,0,0,0},
{"slotsmgrtone",slotsmgrtoneCommand,5,"w",0,NULL,0,0,0,0,0},
{"slotsmgrttagone",slotsmgrttagoneCommand,5,"w",0,NULL,0,0,0,0,0},
{"slotshashkey",slotshashkeyCommand,-1,"rF",0,NULL,0,0,0,0,0},
{"slotscheck",slotscheckCommand,0,"r",0,NULL,0,0,0,0,0},
{"slotsrestore",slotsrestoreCommand,-4,"wm",0,NULL,0,0,0,0,0},
{"slotsmgrtslot-async",slotsmgrtSlotAsyncCommand,8,"ws",0,NULL,0,0,0,0,0},
{"slotsmgrttagslot-async",slotsmgrtTagSlotAsyncCommand,8,"ws",0,NULL,0,0,0,0,0},
{"slotsmgrtone-async",slotsmgrtOneAsyncCommand,-7,"ws",0,NULL,0,0,0,0,0},
{"slotsmgrttagone-async",slotsmgrtTagOneAsyncCommand,-7,"ws",0,NULL,0,0,0,0,0},
{"slotsmgrtone-async-dump",slotsmgrtOneAsyncDumpCommand,-4,"rm",0,NULL,0,0,0,0,0},
{"slotsmgrttagone-async-dump",slotsmgrtTagOneAsyncDumpCommand,-4,"rm",0,NULL,0,0,0,0,0},
{"slotsmgrt-async-fence",slotsmgrtAsyncFenceCommand,0,"rs",0,NULL,0,0,0,0,0},
{"slotsmgrt-async-cancel",slotsmgrtAsyncCancelCommand,0,"F",0,NULL,0,0,0,0,0},
{"slotsmgrt-async-status",slotsmgrtAsyncStatusCommand,0,"F",0,NULL,0,0,0,0,0},
{"slotsmgrt-exec-wrapper",slotsmgrtExecWrapperCommand,-3,"wm",0,NULL,0,0,0,0,0},
{"slotsrestore-async",slotsrestoreAsyncCommand,-2,"wm",0,NULL,0,0,0,0,0},
{"slotsrestore-async-auth",slotsrestoreAsyncAuthCommand,2,"sltF",0,NULL,0,0,0,0,0},
{"slotsrestore-async-select",slotsrestoreAsyncSelectCommand,2,"lF",0,NULL,0,0,0,0,0},
{"slotsrestore-async-ack",slotsrestoreAsyncAckCommand,3,"w",0,NULL,0,0,0,0,0},
+

对比而言发现pika实现的命令相对较少,那具体接入codis中能否正常使用还有待观察,并且在codis-server和pika支持的语法上面来讲当前就已经有所不同。

+

在pika的集群模式下面需要输入如下指令。

+
redis-cli -p 9221 pkcluster slot info 1
+

这也意味着,在命令调度与管理层也必须加上对于pika的语法格式的支持。

+

在前期的调研阶段得益于研发同学的大力支持,在codis-dashboard层中,通过修改部分源码逻辑来支持有关pika的主从同步、主从提升等命令,从而完成了在codis-fe层面的操作。

+

在完成了如上的操作之后,继续进行数据迁移的时候,发现在codis-fe界面上面都显示迁移完成,但是数据却并没有迁移,导致新迁移的数据其实并没有迁移对对应的集群上面去。具体为什么会出现如下的问题呢?在codis-fe界面上面也没有明显的报错信息,问题出在了哪里呢?

+

此时继续查看一下pika的有关slot的源码。

+
void SlotsMgrtSlotAsyncCmd::Do(std::shared_ptr<Partition> partition) {
int64_t moved = 0;
int64_t remained = 0;
res_.AppendArrayLen(2);
res_.AppendInteger(moved);
res_.AppendInteger(remained);
}
+

从源码查看发现,我们日常运行的情况下,通过codis-dashboard发送给pika的指令直接就是成功返回,从而使codis-dashboard在迁移的时候就立马就收到了成功的信号,从而直接就修改了迁移的状态到成功,但是其实数据迁移并没有执行。

+

针对这种情况,我们查阅了有关pika的官方文档 Pika配合Codis扩容案例

+

从官方的文档来看,这种迁移的方案是一种有损可能会丢数据的方案,在这种情况下需要依靠自己来调整迁移的方案。

+
pika迁移工具的设计
+

迁移工具的整体流程如下:

+

原始集群信息如下

+

在这里插入图片描述

+

此时需要迁移901-1023个slot信息迁移到新组件上面即group4作为新实例提供服务。

+

首先开发一个pika的迁移工具,该工具可以转发代理codis的请求。先将801-1023的信息迁移到pika的迁移工具。

+

在这里插入图片描述

+

此时pika迁移工具就将801-900的写信息写入group3,将901-1023的写信息写入group4,然后如果查数据先查group4,如果没有则查group3。

+

此时pika迁移工具接入完成之后,转发代理到后端服务。接入完成之后再进行主从同步信息,将group3同步到group4。

+

在这里插入图片描述

+

将slot901-1023的数据从group3迁移到group4上面之后,因为没有新的group3的901-1023的数据写入,故可以放心的等待数据迁移完成。

+

迁移完成之后就断开主从,再将pika的迁移工具的slot信息,即801-900迁移回group3,将901-1023迁移回group4,此时数据迁移完成。

+

在这里插入图片描述

+

至此,pika通过迁移工具完成对集群的扩容,该工具大部分工具跟codis-proxy的大部分功能相似,只不过需要将对应的路由规则进行转换并添加上对于pika的语法指令就可以了。

+
总结
+

本文仅仅是针对pika在codis场景下的一些思考和探索。由于本人才疏学浅,如有错误请批评指正。

+ + \ No newline at end of file diff --git "a/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/Pika \344\274\240\347\201\253\350\256\241\345\210\222/index.html" "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/Pika \344\274\240\347\201\253\350\256\241\345\210\222/index.html" new file mode 100644 index 0000000..f90b0d7 --- /dev/null +++ "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/Pika \344\274\240\347\201\253\350\256\241\345\210\222/index.html" @@ -0,0 +1,18 @@ + + + + + +Pika 传火计划 | PikiwiDB(Pika) + + + + + + + + + + + + \ No newline at end of file diff --git "a/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/Pika \344\274\240\347\201\253\350\256\241\345\210\222/\344\270\273\344\273\216\345\220\214\346\255\245/index.html" "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/Pika \344\274\240\347\201\253\350\256\241\345\210\222/\344\270\273\344\273\216\345\220\214\346\255\245/index.html" new file mode 100644 index 0000000..6e6072f --- /dev/null +++ "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/Pika \344\274\240\347\201\253\350\256\241\345\210\222/\344\270\273\344\273\216\345\220\214\346\255\245/index.html" @@ -0,0 +1,131 @@ + + + + + +Pika 主从同比 | PikiwiDB(Pika) + + + + + + + + + +

Pika 主从同比

alt text

+

Introduction

+

Pika的主从同步的概念在经典模式下和集群模式下会有差异,但是其最基本的同步单元都是内部结构Partition的同步。Partition是Pika代码层面的最小同步单元,经典模式下多DB结构,每一个DB对应一个Partition,集群模式下每一个分片对应一个Partition,所以不管是什么模式,只是跳出Pika代码之外的概念有区别,在Pika代码内部统称为Partition的同步。下边主要关注经典模式下多DB的同步流程,集群模式下的同步感兴趣的同学可以自行整理。

+

Pika 的同步主要分为两个部分,首先是进程级别的同步,确认主从db个数是相同的。这一过程称之为MetaSync。之后每一个Partition单独同步,通过从给主发送的TrySync 信息,查看主从同步点位,从判断需要发起全量同步还是增量同步。全量同步由DbSync 消息来发起,增量同步由BinlogSync 消息来发起。需要注意的是全同步做完,从会再发送一次TrySync消息尝试BinlogSync来同步全同步期间的增量数据。

+

同步线程模型

+

alt text

+

Pika的同步模型中,所有同步流程的发起者都是从节点(这一点很重要),MetaSync,TrySync,DbSync,BinlogSync都是从发起到主。在MetaSync,TrySync,DbSync,BinlogSync流程中,主的回复用的连接是从发起请求时建立的连接。即上图中主PikaReplServerThread 到 PikaReplClientThread 的连接。

+
class PikaAuxiliaryThread : public pink::Thread {
virtual void* ThreadMain();
while (!should_stop()) {
if (g_pika_server->ShouldMetaSync()) {
g_pika_rm->SendMetaSyncRequest();
} else if (g_pika_server->MetaSyncDone()) {
g_pika_rm->RunSyncSlavePartitionStateMachine();
}
Status s = g_pika_rm->CheckSyncTimeout(slash::NowMicros());
s = g_pika_server->TriggerSendBinlogSync();
int res = g_pika_server->SendToPeer();
if (!res) {
// sleep 100 ms
mu_.Lock();
cv_.TimedWait(100);
mu_.Unlock();
}
}
}
+

辅助线程的工作主要包括1)Pika同步MetaSync消息发送,2)TrySync消息发送,3)驱动BinlogSync流程启动,4)Partition级别的keepalive和超时检测。

+

其中,SendToPeer函数负责尝试向从发送消息,返回值代表发送了多少条Binlog,如果没有任何可以发送的Binlog,为了让出CPU资源,辅助线程会sleep 100ms。

+
class PikaReplClient {
PikaReplClientThread* client_thread_;
std::vector<PikaReplBgWorker*> bg_workers_;
Status SendMetaSync();
Status SendPartitionDBSync(...);
Status SendPartitionTrySync((...);
Status SendPartitionBinlogSync(...);
};

class PikaReplClientThread : public pink::ClientThread {
class ReplClientConnFactory : public pink::ConnFactory {
virtual std::shared_ptr<pink::PinkConn> NewPinkConn(...) {
return std::make_shared<PikaReplClientConn>(...);
}
}
class ReplClientHandle : public pink::ClientHandle {
void FdTimeoutHandle(int fd, const std::string& ip_port) const override;
void FdClosedHandle(int fd, const std::string& ip_port) const override;
}
}

class PikaReplClientConn: public pink::PbConn {
int DealMessage() override;
static void HandleMetaSyncResponse(void* arg);
static void HandleDBSyncResponse(void* arg);
static void HandleTrySyncResponse(void* arg);
void DispatchBinlogRes(
const std::shared_ptr<InnerMessage::InnerResponse> response);
}

class PikaReplBgWorker {
pink::BGThread bg_thread_;
static void HandleBGWorkerWriteBinlog(void* arg);
static void HandleBGWorkerWriteDB(void* arg);
}
+

class PikaReplClient 中包含了PikaReplClientThread 异步客户端,和一组PikaReplBgWorker异步处理binlog的读写。并且PikaReplClient中封装了各个协议的Send函数。

+

1,PikaReplClientThread继承自ClientThread,其本质是一个异步的客户端 ,定义了ReplClientConnFactory和ReplClientHandle。ConnFactory 和ClientHandle 的含义详见Pika传火计划之线程模型。

+

2,PikaReplClientConn继承自PbConn,其通信协议为Protobuf协议,其中包含了PikaReplClientThread接收到相应协议的处理函数。

+

3,PikaReplBgWorker是高效处理同步过来Binlog的一组工作线程。PikaReplClientThread接收到相应协议报文后,对于一些阻塞的操作,例如本地Binlog写入和Db的写入等操作会直接安排给PikaReplBgWorker 操作。避免阻塞PikaReplClientThread后续报文的处理。

+
class PikaReplServer {
// thread pool size PIKA_REPL_SERVER_TP_SIZE 3
pink::ThreadPool* server_tp_;
PikaReplServerThread* pika_repl_server_thread_;
slash::Status SendSlaveBinlogChips(
const std::string& ip,
int port, const std::vector<WriteTask>& tasks);
void Schedule(pink::TaskFunc func, void* arg);
}

class PikaReplServerThread : public pink::HolyThread {
class ReplServerConnFactory : public pink::ConnFactory {
virtual std::shared_ptr<pink::PinkConn> NewPinkConn(...) {
return std::make_shared<PikaReplServerConn>(...);
}
}
class ReplServerHandle : public pink::ServerHandle {
virtual void FdClosedHandle(
int fd, const std::string& ip_port) const override;
}
}

class PikaReplServerConn: public pink::PbConn {
int DealMessage();
static void HandleMetaSyncRequest(void* arg);
static void HandleTrySyncRequest(void* arg);
static void HandleDBSyncRequest(void* arg);
static void HandleBinlogSyncRequest(void* arg);
}
+

class PikaReplServer 包含了一个小型线程池ThreadPool,和PikaReplServerThread。并且包含了发送Binlog的接口SendSlaveBinlogChips。

+

1,PikaReplServerThread继承自HolyThread,HolyThread继承自ServerThread,实现了HandleConnEvent和HandleNewConn,是一个单线程的轻量级server。同时也实现了ReplServerConnFactory 和ReplServerHandle。

+

2,PikaReplServerConn 继承自PbConn,其通信协议也是Protobuf协议。其中还包含了PikaReplServerThread接收到相应协议的处理函数。

+

3,由于PikaReplServerThread 由于收到Binlog的ack之后会从磁盘中加载下次同步到从的binlog到内存中,所以为了避免阻塞PikaReplServerThread后续报文处理,会阻塞的操作被安排到了ThreadPool 当中。

+

主从协商建立同步

+

主从建立同步的过程分为MetaSync=>TrySync=>BinlogSync,或者MetaSync=>TrySync=>DbSync=>BinlogSync两种模式。MetaSync 是进程之间的主从同步db个数是否一样。TrySync是每一个从Partition主动发起,将自己Binlog的位置发送给主,接收到主的返回TrySyncResp之后,进一步判断是全量同步做DbSync 还是直接可以增量同步做BinlogSync。

+

MetaSync

+

在正式建立同步之前需要对于主从进程的的db个数进行确认,这一过程称之为MetaSync。

+

其交互过程如下。

+

alt text

+


void PikaReplServerConn::HandleMetaSyncRequest(void* arg) {
// build server table meta info
...;
// use same conn write back
conn->WriteResp(reply_str);
conn->NotifyWrite();
}

void PikaReplClientConn::HandleMetaSyncResponse(void* arg) {
// check if table is the same as master's
if (!PikaReplClientConn::IsTableStructConsistent(...))) {
g_pika_server->SyncError();
conn->NotifyClose();
}
g_pika_server->FinishMetaSync();
}
+

TrySync

+

MetaSync之后,每一个Partition单独做TrySync,从的Partition 带着自己当前的同步点位向主做请求。主根据从的TrySync消息,如果本地有从发送过来的点位,则回复建议进行增量同步走BinlogSync流程,如果没有,则回复建议进行全量同步走DbSync流程。

+

alt text

+
void PikaReplServerConn::HandleTrySyncRequest(void* arg) {
// master check if slave offset is valid
...;
// master check if this slave is already exist
if (!partition->CheckSlaveNodeExist(node.ip(), node.port())) {
int32_t session_id = partition->GenSessionId();
try_sync_response->set_session_id(session_id);
Status s = partition->AddSlaveNode(node.ip(), node.port(), session_id);
} else {
Status s = partition->GetSlaveNodeSession(
node.ip(), node.port(), &session_id);
try_sync_response->set_session_id(session_id);
}
onn->WriteResp(reply_str);
conn->NotifyWrite();
}

void PikaReplClientConn::HandleTrySyncResponse(void* arg) {
if (try_sync_response.reply_code()
== InnerMessage::InnerResponse::TrySync::kOk) {
slave_partition->SetMasterSessionId(session_id);
g_pika_rm->SendPartitionBinlogSyncAckRequest(
table_name, partition_id, offset, offset, true);
slave_partition->SetReplState(ReplState::kConnected);
} else if (try_sync_response.reply_code() == kSyncPointBePurged) {
// Need To Try DBSync
slave_partition->SetReplState(ReplState::kTryDBSync);
} else if (try_sync_response.reply_code() == kSyncPointLarger) {
// rySync Error, Because the invalid filenum and offset
slave_partition->SetReplState(ReplState::kError);
} else if (try_sync_response.reply_code() == kError) {
slave_partition->SetReplState(ReplState::kError);
}
}
+

从节点接收到TrySyncResponse之后

+

1,(kOk) 如果从返回没有问题,则进行增量同步,发送BinlogSync消息。

+

2,(kSyncPointBePurged)如果自己的同步点位,在主节点已经被清除。则进行全量同步,发送DbSync 消息。

+

3,(kSyncPointLarger)如果从点位比主超前,说明从上的数据有一部分是脏数据,将同步终止(kError),需要管理员介入。

+

4,(kError)如果主返回的TrySyncResponse 有异常,那么将同步终止(kError),需要管理员介入。

+

DbSync

+

alt text

+

Pika全量同步,主要依赖于RSYNC工具,通过system调用起RSYNC进程,将主上数据推到从上。目前从上一直起一个RSYNC常驻进程,专门负责接收主同步过来的全同步数据。

+

Master DbSync Behavior

+
void PikaReplServerConn::HandleDBSyncRequest(void* arg) {
// sanity check
...;
g_pika_server->TryDBSync(node.ip(), node.port() + kPortShiftRSync,
table_name, partition_id);
conn->WriteResp(reply_str);
conn->NotifyWrite();
}

void PikaServer::TryDBSync(const std::string& ip, int port,
const std::string& table_name,
uint32_t partition_id) {
partition->BgSavePartition();
DBSync(ip, port, table_name, partition_id);
}
+

主收到HandleDBSyncRequest

+

1,调用TryDBSync的BgSavePartition,异步将对应的partition打快照。

+

2,调用DBSync 异步发送。

+

为保证打快照和发送的文件的先后循序,这两个任务由同一个线程完成。这个线程会根据放入其消费队列的顺序依次执行任务。这里一定是先执行打快照任务,再执行发送文件任务。

+
void Partition::BgSavePartition() {
slash::MutexLock l(&bgsave_protector_);
if (bgsave_info_.bgsaving) {
return;
}
bgsave_info_.bgsaving = true;
BgTaskArg* bg_task_arg = new BgTaskArg();
bg_task_arg->partition = shared_from_this();
g_pika_server->BGSaveTaskSchedule(
&DoBgSave, static_cast<void*>(bg_task_arg));
}

void PikaServer::BGSaveTaskSchedule(pink::TaskFunc func, void* arg) {
bgsave_thread_.StartThread();
bgsave_thread_.Schedule(func, arg);
}

void Partition::DoBgSave(void* arg) {
// do bgsave https://github.com/Qihoo360/pika/wiki/pika-快照式备份方案
// generate a info file indicate this snapshot's binlog filenum and offset
}
+

1,调用BGSaveTaskSchedule将打快照任务放入bgsave_thread的消费队列中。

+

2,bgsave_thread调用DoBgSave 对当前的DB状态打快照并且生成info文件,info文件是代表这个快照对应的binlog filenum和offset 的位置。

+
void PikaServer::DBSync(const std::string& ip, int port,
const std::string& table_name,
uint32_t partition_id) {
// check if this partition_is is processing dbsync
...;
// Reuse the bgsave_thread_
// Since we expect BgSave and DBSync execute serially
bgsave_thread_.Schedule(&DoDBSync, reinterpret_cast<void*>(arg));
}

// DoDBSync
void PikaServer::DbSyncSendFile(const std::string& ip, int port,
const std::string& table_name,
uint32_t partition_id) {
// sending files
...;
// Send info file at last
...;
}
+

TrySync

+

MetaSync之后,每一个Partition单独做TrySync,从的Partition 带着自己当前的同步点位向主做请求。主根据从的TrySync消息,如果本地有从发送过来的点位,则回复建议进行增量同步走BinlogSync流程,如果没有,则回复建议进行全量同步走DbSync流程。

+

alt text

+
void PikaReplServerConn::HandleTrySyncRequest(void* arg) {
// master check if slave offset is valid
...;
// master check if this slave is already exist
if (!partition->CheckSlaveNodeExist(node.ip(), node.port())) {
int32_t session_id = partition->GenSessionId();
try_sync_response->set_session_id(session_id);
Status s = partition->AddSlaveNode(node.ip(), node.port(), session_id);
} else {
Status s = partition->GetSlaveNodeSession(
node.ip(), node.port(), &session_id);
try_sync_response->set_session_id(session_id);
}
onn->WriteResp(reply_str);
conn->NotifyWrite();
}

void PikaReplClientConn::HandleTrySyncResponse(void* arg) {
if (try_sync_response.reply_code()
== InnerMessage::InnerResponse::TrySync::kOk) {
slave_partition->SetMasterSessionId(session_id);
g_pika_rm->SendPartitionBinlogSyncAckRequest(
table_name, partition_id, offset, offset, true);
slave_partition->SetReplState(ReplState::kConnected);
} else if (try_sync_response.reply_code() == kSyncPointBePurged) {
// Need To Try DBSync
slave_partition->SetReplState(ReplState::kTryDBSync);
} else if (try_sync_response.reply_code() == kSyncPointLarger) {
// rySync Error, Because the invalid filenum and offset
slave_partition->SetReplState(ReplState::kError);
} else if (try_sync_response.reply_code() == kError) {
slave_partition->SetReplState(ReplState::kError);
}
}
+

从节点接收到TrySyncResponse之后

+

1,(kOk) 如果从返回没有问题,则进行增量同步,发送BinlogSync消息。

+

2,(kSyncPointBePurged)如果自己的同步点位,在主节点已经被清除。则进行全量同步,发送DbSync 消息。

+

3,(kSyncPointLarger)如果从点位比主超前,说明从上的数据有一部分是脏数据,将同步终止(kError),需要管理员介入。

+

4,(kError)如果主返回的TrySyncResponse 有异常,那么将同步终止(kError),需要管理员介入。

+

DbSync

+

alt text

+

Pika全量同步,主要依赖于RSYNC工具,通过system调用起RSYNC进程,将主上数据推到从上。目前从上一直起一个RSYNC常驻进程,专门负责接收主同步过来的全同步数据。

+

Master DbSync Behavior

+
void PikaReplServerConn::HandleDBSyncRequest(void* arg) {
// sanity check
// ...;
g_pika_server->TryDBSync(node.ip(), node.port() + kPortShiftRSync,
table_name, partition_id);
conn->WriteResp(reply_str);
conn->NotifyWrite();
}

void PikaServer::TryDBSync(const std::string& ip, int port,
const std::string& table_name,
uint32_t partition_id) {
partition->BgSavePartition();
DBSync(ip, port, table_name, partition_id);
}
+

主收到HandleDBSyncRequest

+

1,调用TryDBSync的BgSavePartition,异步将对应的partition打快照。

+

2,调用DBSync 异步发送。

+

为保证打快照和发送的文件的先后循序,这两个任务由同一个线程完成。这个线程会根据放入其消费队列的顺序依次执行任务。这里一定是先执行打快照任务,再执行发送文件任务。

+
void Partition::BgSavePartition() {
slash::MutexLock l(&bgsave_protector_);
if (bgsave_info_.bgsaving) {
return;
}
bgsave_info_.bgsaving = true;
BgTaskArg* bg_task_arg = new BgTaskArg();
bg_task_arg->partition = shared_from_this();
g_pika_server->BGSaveTaskSchedule(
&DoBgSave, static_cast<void*>(bg_task_arg));
}

void PikaServer::BGSaveTaskSchedule(pink::TaskFunc func, void* arg) {
bgsave_thread_.StartThread();
bgsave_thread_.Schedule(func, arg);
}

void Partition::DoBgSave(void* arg) {
// do bgsave https://github.com/Qihoo360/pika/wiki/pika-快照式备份方案
// generate a info file indicate this snapshot's binlog filenum and offset
}
+

1,调用BGSaveTaskSchedule将打快照任务放入bgsave_thread的消费队列中。

+

2,bgsave_thread调用DoBgSave 对当前的DB状态打快照并且生成info文件,info文件是代表这个快照对应的binlog filenum和offset 的位置。

+
void PikaServer::DBSync(const std::string& ip, int port,
const std::string& table_name,
uint32_t partition_id) {
// check if this partition_is is processing dbsync
...;
// Reuse the bgsave_thread_
// Since we expect BgSave and DBSync execute serially
bgsave_thread_.Schedule(&DoDBSync, reinterpret_cast<void*>(arg));
}

// DoDBSync
void PikaServer::DbSyncSendFile(const std::string& ip, int port,
const std::string& table_name,
uint32_t partition_id) {
// sending files
...;
// Send info file at last
...;
}
+

1, 调用DBSync 将发送文件的任务放入bgsave_thread的消费队列中。

+

2,bgsave_thread调用DbSyncSendFile,依次发送快照的文件。最后发送info文件。

+

Slave DbSync Behavior

+
void PikaReplClientConn::HandleDBSyncResponse(void* arg) {
slave_partition->SetReplState(ReplState::kWaitDBSync);
}

// PikaAuxiliaryThread invoke this periodically
Status PikaReplicaManager::RunSyncSlavePartitionStateMachine() {
if (s_partition->State() == ReplState::kWaitDBSync) {
rtition->TryUpdateMasterOffset();
}
}

bool Partition::TryUpdateMasterOffset() {
// 1, Check dbsync finished, got the new binlog offset from info file
// 2, Replace the old db
// 3, Update master offset, and TrySync again
}
+

1,从收到DBSyncResponse 将partition置为kWaitDBSync。

+

2,辅助线程PikaAuxiliaryThread 周期性检查DbSync 有没有结束,结束的标志为在本地检测到Info文件的存在。

+

3,如果DbSync 检测完,解析info文件的filenum offset,替换本地的Db,本地替换成新的filenum和offset,并且重走TrySync流程,同步DbSync期间产生的增量。

+

BinlogSync

+

alt text

+

BinlogSync的同步逻辑,也是从发起的。

+

1,从先发送一个BinlogSyncRequest,其中有一个first_send标志,第一次发送设置first_send为True。

+

2,主上收到BinlogSyncRequest看到first_send为true,则会相应做一些初始化工作,之后将待发送数据写入RM::write_queues中。然后由辅助线程用之前从创建的连接发送write_queues中的Binlog数据。

+

3,从接到Binlog数据后,返回相应的BinlogSyncAck消息(复用BinlogSyncRequest结构)。

+

4,主收到BinlogSyncAck会,继续将后续带发送数据再写入write_queues 由辅助线程发送到从。

+

需要注意的是以下两种场景:

+

1,当主从数据完全一致,并且过了很久没有同步数据的时候,辅助线程会为了保持连接的keepalive,会每隔kSendKeepAliveTimeout 向这条连接发送keealive消息。并且检查主的last_recv_time,如果超过kRecvKeepAliveTimeout没有收到任何消息,则主动将连接断开。

+

2,由于从是BinlogSync的发起者,但是一段时间没有数据同步之后,从感知不到主上新的数据写入,从而不能再主动再次发起BinlogSync 流程,这时候需要辅助线程来调用TriggerSendBinlogSync,驱动BinlogSync流程。TriggerSendBinlogSync的主要逻辑就是将新写入的增量放入write_queues,再发送给从。

+
void PikaReplServerConn::HandleBinlogSyncRequest(void* arg) {
if (is_first_send) {
master_partition->ActivateSlaveBinlogSync(
node.ip(), node.port(), range_start);
return;
}
// read next sync binlog to write_queues
s = g_pika_rm->UpdateSyncBinlogStatus(slave_node, range_start, range_end);
}
+

1,主收到从的BinlogSyncRequest后,如果是第一次发送,则初始化本地的一些参数。

+

2,主把下一次同步的消息放入write_queues 中。具体主将哪些的Binlog 放入write_queues,参考增量同步滑动窗口设计。

+
void PikaReplClientConn::DispatchBinlogRes(
const std::shared_ptr<InnerMessage::InnerResponse> res) {
g_pika_rm->ScheduleWriteBinlogTask(
table_name_ + partition_id_, res, PikaReplClientConn));
}

void PikaReplBgWorker::HandleBGWorkerWriteBinlog(void* arg) {
for (InnerResponse binlogs) {
redis_parser_.ProcessInputBuffer(
redis_parser_start, redis_parser_len, &processed_len);
}
g_pika_rm->SendPartitionBinlogSyncAckRequest(
table_name, partition_id, ack_start, ack_end);
}

int PikaReplBgWorker::HandleWriteBinlog(
pink::RedisParser* parser, const pink::RedisCmdArgsType& argv) {
c_ptr->Initial(argv, worker->table_name_);
partition->ConsensusProcessLeaderLog(c_ptr, worker->binlog_item_);
}

Status ConsensusCoordinator::ProcessLeaderLog(
std::shared_ptr<Cmd> cmd_ptr, const BinlogItem& attribute) {
Status s = InternalAppendLog(attribute, cmd_ptr, nullptr, nullptr);
// do g_pika_rm->ScheduleWriteDBTask(); in InternalApplyFollower
InternalApplyFollower(
MemLog::LogItem(LogOffset(), cmd_ptr, nullptr, nullptr));
}

void PikaReplBgWorker::HandleBGWorkerWriteDB(void* arg) {
c_ptr->Do(partition);
}
+

从收到主发送的Binlog信息之后

+

1,调用DispatchBinlogRes,为保证相同partition的binlog 写入顺序,将同talbe_name同partition_id的binlog处理流程安排给同一个线程。

+

2,PikaReplBgWorker线程调用HandleBGWorkerWriteBinlog,将binlog放入redis_parser中,redis_parser解析出完整的命令后调用HandleWriteBinlog。

+

3,调用ConsensusProcessLeaderLog=>ProcessLeaderLog,通过InternalAppendLog 写入Binlog,通过InternalApplyFollower调用,ScheduleWriteDBTask。

+

4,返回步骤2,在写完Binlog之后发送BinlogSyncAckRequest进行下一次BinlogSync。

+

5,在步骤3中,ScheduleWriteDBTask 之后,PikaReplBgWorker线程调用HandleBGWorkerWriteDB 将数据落盘。

+

一致性同步

+

通过之前的介绍,主从之间的同步使用了Protobuf协议,在使用一致性版本的pika的时候,在Pb协议中添加了ConsensusMeta。通过解析Pb填充的ConsensusMeta的数据,进行一致性下的主从通信。其Pb协议中定义如下。在TrySync和BinlogSync的逻辑中通过判断Pb报文中是否携带ConsensusMeta 来判断对端是否开启一致性功能。

+
message ConsensusMeta {
optional uint32 term = 1;
// Leader -> Follower prev_log_offset
// Follower -> Leader last_log_offset
optional BinlogOffset log_offset = 2;
optional BinlogOffset commit = 3;
optional bool reject = 4;
repeated BinlogOffset hint = 5;
}
+

其主要设计见副本一致性设计文档。

+

从在一致性场景下的数据写入

+
void PikaReplBgWorker::HandleBGWorkerWriteBinlog(void* arg) {
for (InnerResponse binlogs) {
HandleWriteBinlog();
}
if (res->has_consensus_meta()) {
partition->ConsensusProcessLocalUpdate(leader_commit);
}
...;
}

PikaReplBgWorker::HandleWriteBinlog(
pink::RedisParser* parser, const pink::RedisCmdArgsType& argv) {
c_ptr->Initial(argv, worker->table_name_);
partition->ConsensusProcessLeaderLog(c_ptr, worker->binlog_item_);
}
+

1, 一致性场景下,在PikaReplBgWorker处理主同步过来的Binlog 同样调用了ConsensusProcessLeaderLog接口,写入Binlog。

+

2,在HandleBGWorkerWriteBinlog函数调用的最后,调用ConsensusProcessLocalUpdate 接口,更新从的commit信息,调用ScheduleApplyFollowerLog 将从可以写入DB的请求异步写入DB。

+

主在一致性场景下的数据写入

+


void PikaReplServerConn::HandleBinlogSyncRequest(void* arg) {
s = g_pika_rm->UpdateSyncBinlogStatus(slave_node, range_start, range_end);
}

Status ConsensusCoordinator::UpdateSlave(const std::string& ip, int port,
const LogOffset& start, const LogOffset& end) {
LogOffset committed_index;
// invoke InternalCalCommittedIndex to calculate committed_index
Status s = sync_pros_.Update(ip, port, start, end, &committed_index);
if (!s.ok()) {
return s;
}
LogOffset updated_committed_index;
bool need_update = false;
{
slash::MutexLock l(&index_mu_);
need_update = InternalUpdateCommittedIndex(
committed_index, &updated_committed_index);
}
if (need_update) {
// sheduel DoExecTask
s = ScheduleApplyLog(updated_committed_index);
if (!s.ok() && !s.IsNotFound()) {
return s;
}
}
return Status::OK();
}
+

1,HandleBinlogSyncRequest => UpdateSyncBinlogStatus => ConsensusUpdateSlave => UpdateSlave

+

2,UpdateSlave函数中调用sync_pros.Update更新对应的从节点的acked_offset,同时更新这个从的match_index,代表已经同步到该从的最高的LogOffset。然后依据match_index数组计算主上的committed_index。

+

3,更新主的committed_index。

+

4,如果成功更新committed_index,进而schedule应用log,每一条可以应用的log调用回调DoExecTask完成对DB的写入。

+

Reference

+

https://github.com/Qihoo360/pika/tree/v3.3.4

+ + \ No newline at end of file diff --git "a/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/Pika \344\274\240\347\201\253\350\256\241\345\210\222/\347\272\277\347\250\213\346\250\241\345\236\213/index.html" "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/Pika \344\274\240\347\201\253\350\256\241\345\210\222/\347\272\277\347\250\213\346\250\241\345\236\213/index.html" new file mode 100644 index 0000000..bc12cf0 --- /dev/null +++ "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/Pika \344\274\240\347\201\253\350\256\241\345\210\222/\347\272\277\347\250\213\346\250\241\345\236\213/index.html" @@ -0,0 +1,64 @@ + + + + + +Pika 线程模型简介 | PikiwiDB(Pika) + + + + + + + + + +

Pika 线程模型简介

alt text

+

Introduction

+

Pika是Qihoo360 开源的一款兼容redis协议的高性能kv存储服务,其与redis最大的不用点是其数据是基于磁盘而不是基于内存。同时使用了多线程的方式提高了读写效率。更多的整体设计和实践细节参见Wiki的设计实现板块。这里是更多做代码层面分析,适合想要从事Pika开发的同学。

+

Pika使用了同样是Qihoo360 开源的Pink 网络库,如果要了解pika的代码,首先要了解其网络库的网络模型,和调用关系,下面我们来看一下Pink的网络模型。

+

线程模型

+

一切从Thread 开始

+
class Thread {
int Thread::StartThread() {
return pthread_create(&thread_id_, nullptr, RunThread, (void *)this);
}
void* Thread::RunThread(void *arg) {
// thread 的执行函数
thread->ThreadMain()
}
virtual void *ThreadMain() = 0;
}
+

Tread 类只是对pthread 调用进行了一层封装,值得注意的是ThreadMain 是各线程的入口函数。

+

ServerThread

+
class ServerThread : public Thread {
const ServerHandle *handle_;

void ServerThread::DoCronTask();
void ServerThread::ProcessNotifyEvents(const PinkFiredEvent* pfe);
virtual void HandleConnEvent(PinkFiredEvent *pfe) = 0;
virtual void HandleNewConn(int connfd, const std::string& ip_port) = 0;

void *ServerThread::ThreadMain() {
while (!should_stop()) {
DoCronTask();
// epoll_wait
nfds = pink_epoll_->PinkPoll(timeout);
for (int i = 0; i < nfds; i++) {
if (pfe->fd == pink_epoll_->notify_receive_fd()) {
ProcessNotifyEvents(pfe);
continue;
}
if (/*is listening fd*/) {
connfd = accept(fd, (struct sockaddr *) &cliaddr, &clilen);
handle_->AccessHandle(ip_port);
/*
* Handle new connection,
* implemented in derived class
*/
HandleNewConn(connfd, ip_port);
} else {
/*
* Handle connection's event
* implemented in derived class
*/
HandleConnEvent(pfe);
}
}
}
}
}
+

ServerThread类主要提供一个server的框架,也是一个虚类,衍生类需要实现HandleConnEvent HandleNewConn 等函数。

+

1,其中ServerHandle 是各种事件发生之后的回调函数,这个类由使用者实现并传入serverthread,各类事件(例如链接关闭)发生时,serverthread 会调用相应的回调函数通知serverthread 的使用者。ServerHandle包含的函数有处理连接超时的FdTimeoutHandle,处理连接被关闭的FdClosedHandle 等等。

+
class ServerHandle {
virtual void FdTimeoutHandle(int fd, const std::string& ip_port) const {
UNUSED(fd);
UNUSED(ip_port);
}
virtual void FdClosedHandle(int fd, const std::string& ip_port) const {
UNUSED(fd);
UNUSED(ip_port);
}
...
}
+

2,ProcessNotifyEvents 函数主要是serverthread处理异步通信用的,其他线程可以通过写入PinkEpoll 的notify_send_fd(具体的消息内容存到了notify_queue里面),在下一次serverthread epoll 循环的时候就可以通过notify_receive_fd读到有消息要处理,从notify_queue读出消息,处理其他线程的事件。

+
class PinkEpoll {
// fds is pipe
notify_receive_fd_ = fds[0];
notify_send_fd_ = fds[1];
std::queue<PinkItem> notify_queue_;
}
+

DispatchThread

+

DispatchThread维护一组worker thread,worker thread 用来处理客户端连接的读写,DispatchThread主要负责accept 客户端socket连接,然后通过worker线程的pink_epoll 通知worker线程。DispatchThread继承于ServerThread只是实现了HandleNewConn 用于处理新连接。

+

alt text

+
class DispatchThread : public ServerThread {
void DispatchThread::HandleNewConn() {
// schedule this conn to one of worker
PinkItem ti(connfd, ip_port, kNotiConnect);
std::queue<PinkItem> *q
= &(worker_thread_[next_thread]->pink_epoll()->notify_queue_);
q->push(ti);
}
}

// 其本质是一个 server 线程的缩写版本 只处理conn 的读写
class WorkerThread : public Thread {
// pink_epoll 为了Dispatch 线程accept 之后可以通知给worker线程
PinkEpoll *pink_epoll_;
void *WorkerThread::ThreadMain() {
while(!should_stop) {
nfds = pink_epoll_->PinkPoll(timeout);
for (int i = 0; i < nfds; i++) {
if (pfe->fd == pink_epoll_->notify_receive_fd()) {
if (ti.notify_type() == kNotiConnect) {
// 将accept 的fd 收入到自己的conn结构里面,之后负责这个conn的读写
std::shared_ptr<PinkConn> tc = conn_factory_->NewPinkConn(
ti.fd(), ti.ip_port(),
server_thread_, private_data_, pink_epoll_);
} else if (ti.notify_type() == kNotiEpollout) {
pink_epoll_->PinkModEvent(ti.fd(), 0, EPOLLOUT);
} else if (....) {
....
}
} else {
if ((pfe->mask & EPOLLOUT) && in_conn->is_reply()) {
WriteStatus write_status = in_conn->SendReply();
...
}
if (!should_close && (pfe->mask & EPOLLIN)) {
ReadStatus read_status = in_conn->GetRequest();
...
}
}
}
}
}
}
+

1,新建客户端连接时候Dispatch Thread调用HandleNewConn 向worker thread 传入fd消息,worker thread 负责调用conn_factory 中的NewPinkConn方法,按照使用者的实现方式新建一个connection负责后续的数据读写。

+

ConnFactory 是一个工厂类,用于创建连接,DispatchThread 的使用者必须自己实现其ConnFactory::NewPinkConn 函数。

+


/*
* for every conn, we need create a corresponding ConnFactory
*/
class ConnFactory {
public:
virtual ~ConnFactory() {}
virtual std::shared_ptr<PinkConn> NewPinkConn(
int connfd,
const std::string &ip_port,
Thread *thread,
void* worker_private_data, /* Has set in ThreadEnvHandle */
PinkEpoll* pink_epoll = nullptr) const = 0;
};
+

2,后续通过调用不同connection实现的SendReply 和GetRequest 进行读写操作。

+

Connection

+

PinkConn类是对客户端连接的抽象,控制客户端数据的读取,解析,以及结果的缓存,写回。不同协议的connection回有相应的自己实现,这里以RedisConn为例。

+
class PinkConn : public std::enable_shared_from_this<PinkConn> {
virtual ReadStatus GetRequest() = 0;
virtual WriteStatus SendReply() = 0;
int fd_;
std::string ip_port_;
bool is_reply_;
struct timeval last_interaction_;
int flags_;
}
+

PinkConn 当中包含了GetRequest SendReply两个纯虚函数,控制数据如何读取和写回。

+
class RedisConn: public PinkConn {
RedisConn(const int fd,
const std::string& ip_port,
...
const HandleType& handle_type = kSynchronous,
const int rbuf_max_len = REDIS_MAX_MESSAGE);
// serverthread 或者 worker thread 调用
virtual ReadStatus GetRequest() {
// read from socket
// forward to redis_parser_, redis_parser will invoke callback
// when one command is completely parsed
redis_parser_.ProcessInputBuffer();
}
virtual WriteStatus SendReply() {
// write response back
while() {
nwritten = write(fd(), response_.data() + wbuf_pos_,
wbuf_len - wbuf_pos_);
}
}

// RedisConn 使用者调用
int RedisConn::WriteResp(const std::string& resp) {
response_.append(resp);
set_is_reply(true);
return 0;
}
// kAsynchronous 调用接口
virtual void AsynProcessRedisCmds(
const std::vector<RedisCmdArgsType>& argvs, std::string* response);
void NotifyEpoll(bool success) {
// write to server thread or worker thread(conn holder) notify_send_fd
// if success true tell conn holder set fd kEpolloutAndEpollin
// if success false close conn holder this conn
}
//kSynchronous 调用接口
virtual int DealMessage(
const RedisCmdArgsType& argv, std::string* response) = 0;

RedisParser redis_parser_;
std::string response_;
}

RedisConn::RedisConn() {
// 初始化 将redis conn的ParserDealMessageCb ParserCompleteCb挂载到
// redis parser中,redis parser 解析出完整的一条redis 命令会调用相
// 应的ParserDealMessageCb 或者ParserCompleteCb 函数
RedisParserSettings settings;
settings.DealMessage = ParserDealMessageCb;
settings.Complete = ParserCompleteCb;
}

// 根据具体的RedisConn 的配置是否为异步模式 调用RedisConn的DealMessage
// 函数或者AsynProcessRedisCmds
int RedisConn::ParserDealMessageCb(
RedisParser* parser, const RedisCmdArgsType& argv) {
RedisConn* conn = reinterpret_cast<RedisConn*>(parser->data);
if (conn->GetHandleType() == HandleType::kSynchronous) {
return conn->DealMessage(argv, &(conn->response_));
} else {
return 0;
}
}
int RedisConn::ParserCompleteCb(
RedisParser* parser, const std::vector<RedisCmdArgsType>& argvs) {
RedisConn* conn = reinterpret_cast<RedisConn*>(parser->data);
if (conn->GetHandleType() == HandleType::kAsynchronous) {
conn->AsynProcessRedisCmds(argvs, &(conn->response_));
}
return 0;
}
+

RedisConn 中的redis_parser 结构用于解析redis 命令,每当解析完一条完整的redis 命令后回调相应的回调函数。

+

1,GetRequest 函数会不停的从socket读数据,放入redis_parser解析。redis_parser根据解析情况在合适的时候调用其DealMessage Complete回调。

+

2,SendReply 函数,会在合适的时机调用write 将response 缓存的返回数据写向客户端。

+

使用者需要继承RedisConn 实现类似MyRedisConn 的类,并且在其内部实现 DealMessage 函数或者AsynProcessRedisCmds。取决于当前使用的Conn的模式。

+

kAsynchronous模式下AsynProcessRedisCmds 的实现通常把解析好的Cmd 交付给另外的线程处理,例如T1,T1在处理完命令之后,调用WriteResp接口将结果写入RedisConn,再调用NotifyEpoll 将这个RedisConn 的EPOLLOUT监听打开,serverthread 或者worker thread的下一个epoll 循环 可以将结果写回。

+

kSynchronous 模式下DealMessage 的实现通常会直接处理命令调用WriteResp,返回worker thread 的ThreadMain 函数之后,在下一个epoll循环将结果写回。

+

Pika 线程模型以及Cmd处理顺序

+

Pika 的PikaDispatchThread 是DispatchThread 的定制实现,PikaClientConn是RedisConn 的定制实现。

+

alt text

+
class PikaDispatchThread {
class ClientConnFactory : public pink::ConnFactory {
virtual std::shared_ptr<pink::PinkConn> NewPinkConn() {
return std::static_pointer_cast<pink::PinkConn>
(std::make_shared<PikaClientConn>())
}
}
class Handles : public pink::ServerHandle {}
}

class PikaClientConn: public pink::RedisConn {
void AsynProcessRedisCmds(
const std::vector<pink::RedisCmdArgsType>& argvs,
std::string* response) override;
};
void PikaClientConn::AsynProcessRedisCmds() {
// schedule to thread pool
g_pika_server->ScheduleClientPool(&DoBackgroundTask, arg);
}
// thread pool thead start processing cmd
void PikaClientConn::DoBackgroundTask(void* arg) {
if (error) {
// close conn
conn_ptr->NotifyEpoll(false);
}
conn_ptr->BatchExecRedisCmd(bg_arg->redis_cmds);
}
void PikaClientConn::BatchExecRedisCmd(
const std::vector<pink::RedisCmdArgsType>& argvs) {
// process cmd...
TryWriteResp();
}
void PikaClientConn::TryWriteResp() {
// write response to local resp
...
// notify worker thread open fd EPOLLOUT and ready to write back
NotifyEpoll(true);
}
+

alt text

+

1,新的客户端连接接入到DispatchThread,DispatchThread accept 并生成fd,传递到worker thread。

+

2,worker thread 调用ClientConnFactory 的NewPinkConn 生成PikaClientConn,从此维护此PikaClientConn的读写行为。

+

3,worker thread调用GetRequest读取客户端请求放入redis_parser 进行解析,redis_parser 调用PikaClientConn::AsynProcessRedisCmds实现。将此cmd 放入thread pool queue。

+

4,thread pool thread 处理cmd,调用PikaClientConn::WriteResp将处理结果写入PikaClientConn的resp 结构,调用PikaClientConn::NotifyEpoll 通知worker thread 可以返回客户端。

+

5,worker thread 接收kNotiEpollout事件,打开这个conn fd 的EPOLLOUT ,下一个epoll_wait 周期检测到这个conn可写,调用WriteResp将resp的内容返回给客户端。

+

Reference

+

https://github.com/Qihoo360/pika/tree/v3.3.4 +https://github.com/Qihoo360/pink

+ + \ No newline at end of file diff --git "a/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/Pika \344\274\240\347\201\253\350\256\241\345\210\222/\350\257\273\345\206\231\346\265\201\347\250\213/index.html" "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/Pika \344\274\240\347\201\253\350\256\241\345\210\222/\350\257\273\345\206\231\346\265\201\347\250\213/index.html" new file mode 100644 index 0000000..9fabbe7 --- /dev/null +++ "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/Pika \344\274\240\347\201\253\350\256\241\345\210\222/\350\257\273\345\206\231\346\265\201\347\250\213/index.html" @@ -0,0 +1,80 @@ + + + + + +Pika 读写流程简介 | PikiwiDB(Pika) + + + + + + + + + +

Pika 读写流程简介

alt text

+

Introduction

+

通过上次Pika线程模型的分享,得知主要的命令处理是由线程池的线程负责的。而命令的通用处理流程主要是由PikaClientConn决定的,在其处理过程当中对于不同的命令,通过多态的方式调class Cmd处理接口,动态选择不同命令的处理函数。这里主要梳理pika的主要读写流程。

+

PikaClientConn和Cmd通用处理流程

+

WorkerThread 处理流程

+
class PikaClientConn: public pink::RedisConn {
void AsynProcessRedisCmds(const std::vector<pink::RedisCmdArgsType>& argvs,
std::string* response) override;
std::atomic<int> resp_num;
std::vector<std::shared_ptr<std::string>> resp_array;
std::shared_ptr<Cmd> DoCmd(const PikaCmdArgsType& argv,
const std::string& opt,
std::shared_ptr<std::string> resp_ptr);
}
+

Pink层通过AsynProcessRedisCmds的调用,Pika上层可以自己定义对于接受命令后的后续处理流程。

+
void PikaClientConn::AsynProcessRedisCmds(
const std::vector<pink::RedisCmdArgsType>& argvs, std::string* response){
BgTaskArg* arg = new BgTaskArg();
arg->redis_cmds = argvs;
arg->conn_ptr =
std::dynamic_pointer_cast<PikaClientConn>(shared_from_this());
g_pika_server->ScheduleClientPool(&DoBackgroundTask, arg);
}
+

1,worker thread 调用AsynProcessRedisCmds,将待处理Cmd封装成BgTaskArg。

+

2,BgTaskArg任务放入线程池中,后续由线程池中的一个线程继续处理这个请求。

+

3,worker thread 的调用返回,worker thread 继续运行自己流程。

+

ThreadPoolThread 处理流程

+
void PikaClientConn::DoBackgroundTask(void* arg) {
// sanity check
// ...
BgTaskArg* bg_arg = reinterpret_cast<BgTaskArg*>(arg);
std::shared_ptr<PikaClientConn> conn_ptr = bg_arg->conn_ptr;
conn_ptr->BatchExecRedisCmd(bg_arg->redis_cmds);
delete bg_arg;
}

void PikaClientConn::BatchExecRedisCmd(
const std::vector<pink::RedisCmdArgsType>& argvs) {
resp_num.store(argvs.size());
for (size_t i = 0; i < argvs.size(); ++i) {
std::shared_ptr<std::string> resp_ptr = std::make_shared<std::string>();
resp_array.push_back(resp_ptr);
ExecRedisCmd(argvs[i], resp_ptr);
}
TryWriteResp();
}

void PikaClientConn::ExecRedisCmd(
const PikaCmdArgsType& argv, std::shared_ptr<std::string> resp_ptr) {
std::string opt = argv[0];
slash::StringToLower(opt);
std::shared_ptr<Cmd> cmd_ptr = DoCmd(argv, opt, resp_ptr);
}
+

1,ThreadPoolThread调用DoBackgroundTask,检查BgTaskArg 的合法性。

+

2,调用BatchExecRedisCmd,在此线程中对所有命令进行逐一处理。

+

3,调用DoCmd 进行命令的具体处理。

+

4,调用TryWriteResp 对于返回的所有结果整合,之后通知WorkerThread 该PikaClientConn内的结果可以写回客户端。

+

DoCmd的处理流程如下。

+
std::shared_ptr<Cmd> PikaClientConn::DoCmd(
const PikaCmdArgsType& argv,
const std::string& opt,
std::shared_ptr<std::string> resp_ptr) {
std::shared_ptr<Cmd> c_ptr = g_pika_cmd_table_manager->GetCmd(opt);

if (!auth_stat_.IsAuthed(c_ptr)) {
c_ptr->res().SetRes(CmdRes::kErrOther,"NOAUTH Authentication required.");
return c_ptr;
}
// lock free
// slowlog_slower_thann is atomic int
if (g_pika_conf->slowlog_slower_than() >= 0) {
start_us = slash::NowMicros();
}
// lock free
// HasMonitorClients return atomic bool
bool is_monitoring = g_pika_server->HasMonitorClients();
if (is_monitoring) {
ProcessMonitor(argv);
}

// Initial
c_ptr->Initial(argv, current_table_);
if (!c_ptr->res().ok()) {
return c_ptr;
}
// partial lock free
// update server statistic lock free
// pdateTableQps NOT lock free
g_pika_server->UpdateQueryNumAndExecCountTable(
current_table_, opt, c_ptr->is_write());
// sanity check
...
// Process Command
c_ptr->Execute();

if (g_pika_conf->slowlog_slower_than() >= 0) {
ProcessSlowlog(argv, start_us);
}
}
+

1,根据具体命令生成其基类的std::shared_ptr<Cmd> 方便多态实现。

+

2,对于连接进行权限认证,对应命令可以查看Redis Auth命令,和Pika配置文件Pika配置文件说明 中对于密码的相关配置。

+

3,将命令放入monitor线程,对应命令可以查看Redis Monitor 命令。

+

4,调用Cmd::Initial。

+

5,调用Cmd::Execute。

+

6,如果开启Slowlog,则记录Slowlog,对应命令可以查看Slowlog命令。

+

Cmd 通用处理流程

+

在PikaClientConn的通用处理流程中,对于不同Cmd的操作都是调用其基类处理函数Initial和Execute,Initial和Execute函数内部会调用纯虚函数DoInitial和Do,通过多态查找派生类的真正实现。

+
class Cmd: public std::enable_shared_from_this<Cmd> {
virtual void DoInitial() = 0;
virtual void Do(std::shared_ptr<Partition> partition = nullptr) = 0;
void Cmd::Initial(const PikaCmdArgsType& argv,
const std::string& table_name) {
argv_ = argv;
table_name_ = table_name;
res_.clear(); // Clear res content
Clear(); // Clear cmd, Derived class can has own implement
DoInitial();
};
void Cmd::Execute() {
...
if (g_pika_conf->classic_mode()...) {
// invoke InternalProcessCommand and Cmd::Do
ProcessSinglePartitionCmd();
} else {
...
}
};
void Cmd::InternalProcessCommand(std::shared_ptr<Partition> partition,
std::shared_ptr<SyncMasterPartition> sync_partition) {
slash::lock::MultiRecordLock record_lock(partition->LockMgr());
if (is_write()) {
record_lock.Lock(current_key());
}
// invoke Cmd::Do
DoCommand(partition, hint_keys);
DoBinlog(sync_partition);
if (is_write()) {
record_lock.Unlock(current_key());
}
}
}
+

任何具体的命令继承Cmd之后,需要实现DoInitial和Do 两个纯虚函数。在之后的通用处理流程中Cmd会做相应的调用。Cmd对外主要暴露Initial 和Execute 两个接口。

+

1,Initial清除前一次调用的残留数据,同时调用DoInitial虚函数。

+

2,Execute判断pika运行模式,主要调用InternalProcessCommand。

+

2.1,对于操作DB 和Binlog 这两个动作加锁,确保DB 和Binlog 是一致的。

+

2.2,调用DoCommand,其内部主要调用Do 虚函数。

+

2.3,调用DoBinlog,将命令处理后写入Binlog。

+

DoCommand

+

DoCommand的作用主要是将命令写入DB。

+
void Cmd::DoCommand(
std::shared_ptr<Partition> partition, const HintKeys& hint_keys) {
if (!is_suspend()) {
partition->DbRWLockReader();
}
Do(partition);
if (!is_suspend()) {
partition->DbRWUnLock();
}
}
+

BGSAVE,FLUSHALL,FLUSHDB除了之外,其余所有命令在执行Do函数之前都需要加读锁。对于这几个特殊的命令而言,它们的共同点是都需要清除数据,为保证清除过程没有其它操作同时进行,需要对相应的分片或者db加上写锁阻塞其他操作。具体来说,它们Do的函数实现内部会直接调DbRWLockWriter,阻塞其它操作。

+

DoBinlog

+

DoBinlog的作用主要是将命令写入Binlog。

+
void Cmd::DoBinlog(std::shared_ptr<SyncMasterPartition> partition) {
Status s = partition->ConsensusProposeLog(shared_from_this(),
std::dynamic_pointer_cast<PikaClientConn>(conn_ptr), resp_ptr);
}
+

通过 ConsensusProposeLog => InternalAppendBinlog => (std::shared_ptr<Binlog>)Logger()->Put(binlog) 一系列的函数调用,最终调用class Binlog的Put接口将,binlog 字符串写入Binlog 文件当中。

+

alt text

+

Binlog文件是由一个一个Blocks组成的,这样组织主要防止binlog文件的某一个点损坏造成整个文件不可读。每一个binlog 字符串先序列化成BinlogItem 结构,如黄色板块所示,组成BinlogItem之后,再加上8个bytes(Length,Time,Type)组成完整的可以落盘的数据。

+

命令执行过程的差异化处理

+

以上讨论了Pika的通用处理流程,所有命令的处理都要经过以上的处理流程,对于每一条命令的具体处理细节,由具体的命令实现决定。下面以SetCmd为例。

+
class SetCmd : public Cmd {
virtual void DoInitial() override;
virtual void Do(std::shared_ptr<Partition> partition = nullptr);
void GetCmd::DoInitial() {
if (!CheckArg(argv_.size())) {
res_.SetRes(CmdRes::kWrongNum, kCmdNameGet);
return;
}
key_ = argv_[1];
return;
}
void SetCmd::Do(std::shared_ptr<Partition> partition) {
switch (condition_) {
...
case SetCmd::kNX:
s = partition->db()->Setnx(key_, value_, &res, sec_);
break;
default:
s = partition->db()->Set(key_, value_);
break;
}
...
}
}
+

SetCmd的DoInitial实现主要初始化未继承自Cmd的数据。

+

SetCmd的Do实现主要是根据Set命令的几种变形进行不同的Blackwidow接口调用。

+

以上我们介绍了Pika主要的读写流程,但是在一致性场景下我们不能够完全按照以上的读写路径进行处理,下面我们来看一下一致性场景下数据的读写流程。

+

一致性实现中的数据写入

+

一致性场景下,并不是像上面所说DoCommand 和DoBinlog 在一起执行的。一致性场景下,需要在Leader的Execute中做DoBinlog,然后对于这条Binlog在得到一定数目的Follower确认之后,利用存下来的MemLog::LogItem中的PikaClientConn 和Cmd指针,调用DoExecTask,其中再次调用Execute,进行DoCommand 的操作。

+

由于性能考虑,DoCommand的操作需要多线程并发执行,这样一条Conn的命令就有可能被几个线程同时执行,那么如何保证运行结果的正确性呢。

+

在PikaClientConn 中记录了当前Conn需要执行的子命令的个数和所有子命令的response指针数组。一致性场景中会将该子命令对应的resp_ptr指针与PikaClientConn 和Cmd 存成MemLog::LogItem存下来,当这条子命令在得到一定数目的Follower确认之后,将当前LogItem执行的结果写入LogItem 中的resp_ptr 中并且resp_num 自减,执行最后一个命令的线程负责将其他所有线程的执行结果组合,返回客户端。

+
void PikaClientConn::BatchExecRedisCmd(
const std::vector<pink::RedisCmdArgsType>& argvs) {
resp_num.store(argvs.size());
for (size_t i = 0; i < argvs.size(); ++i) {
std::shared_ptr<std::string> resp_ptr = std::make_shared<std::string>();
resp_array.push_back(resp_ptr);
ExecRedisCmd(argvs[i], resp_ptr);
}
TryWriteResp();
}

void PikaClientConn::ExecRedisCmd(
const PikaCmdArgsType& argv, std::shared_ptr<std::string> resp_ptr) {
std::shared_ptr<Cmd> cmd_ptr = DoCmd(argv, opt, resp_ptr);
// level == 0 or (cmd error) or (is_read)
if (g_pika_conf->consensus_level() == 0
|| !cmd_ptr->res().ok() || !cmd_ptr->is_write()) {
*resp_ptr = std::move(cmd_ptr->res().message());
resp_num--;
}
}
+

1,调用BatchExecRedisCmd,初始化resp_num,为此次请求子命令的个数。

+

2,初始化resp_ptr,存入PikaClientConn指针数组,传入ExecRedisCmd。

+

3,在ExecRedisCmd中,调用DoCmd,如果返回正常,则等待Follower确认,再执行DoCommand。如果返回异常,直接标记当前子命令异常,并且resp_num 自减,如果是PikaClientConn 是单条命令的情况,这时候调用BatchExecRedisCmd中的TryWriteResp 就可以直接返回客户端了,没有必要同步到从。

+
void PikaClientConn::DoExecTask(void* arg) {
cmd_ptr->Execute();
*resp_ptr = std::move(cmd_ptr->res().message());
conn_ptr->resp_num--;
conn_ptr->TryWriteResp();
}

void PikaClientConn::TryWriteResp() {
int expected = 0;
if (resp_num.compare_exchange_strong(expected, -1)) {
for (auto& resp : resp_array) {
WriteResp(std::move(*resp));
}
resp_array.clear();
NotifyEpoll(true);
}
}
+

1,如果DoCmd返回正常,一致性模块会最终对于每一条子命令调用一次DoExecTask。

+

2,每次处理子命令都尝试TryWriteResp,只有当前resp_num 是0 才可以整合PikaClientConn中所有子命令执行结果,通知WorkerThread写回客户端。

+

Reference

+

https://github.com/Qihoo360/pika/tree/v3.3.4

+ + \ No newline at end of file diff --git "a/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/Pika \346\272\220\347\240\201\345\255\246\344\271\240\347\254\224\350\256\260/Pika \345\222\214 RockSDB \347\232\204\345\257\271\346\216\245/index.html" "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/Pika \346\272\220\347\240\201\345\255\246\344\271\240\347\254\224\350\256\260/Pika \345\222\214 RockSDB \347\232\204\345\257\271\346\216\245/index.html" new file mode 100644 index 0000000..6ef08ca --- /dev/null +++ "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/Pika \346\272\220\347\240\201\345\255\246\344\271\240\347\254\224\350\256\260/Pika \345\222\214 RockSDB \347\232\204\345\257\271\346\216\245/index.html" @@ -0,0 +1,27 @@ + + + + + +Pika 和 RockSDB 的对接 | PikiwiDB(Pika) + + + + + + + + + +

Pika 和 RockSDB 的对接

在《Pika源码学习--pika的命令执行框架》中我们了解了一个命令的执行流程,也知道了pika使用的是Blackwidow引擎,现在我们来看看pika是怎么和rocksdb对接的,Blackwidow具体怎么处理命令。

+

1.Pika和rocksdb对接 +在Partition构造的时候,创建了一个BlackWidow,当前BlackWidow支持5种redis的数据结构,分别是String结构, Hash结构,List结构,Set结构和ZSet结构。一个BlackWidow分别为这5种数据结构打开了一个rocksdb,分别是 strings_db_,hashes_db_,sets_db_,zsets_db_,lists_db_,在BlackWidow::Open的时候打开了这个5个rocksdb:

+

alt text

+

在上面命令下来的时候,BlackWidow就会根据命令使用具体类型的db来操作

+

alt text

+

2.Redis命令与rocksdb kv的转换 +因为rocksdb只支持kv的操作,那么redis的几种数据结构是怎么转换成rocksdb的kv的呢?官方有资料详细介绍了这个,我们根据官方资料学习即可(pika blackwidow引擎数据存储格式)https://github.com/Qihoo360/pika/wiki/pika-blackwidow引擎数据存储格式 +这里引用官方的一个图,pika的每个分区是打开了5个rocksdb,一些数据结构的对接需要分开保存元数据和数据,元数据和数据分开存储是用了rocksdb的Column Family

+

alt text

+ + \ No newline at end of file diff --git "a/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/Pika \346\272\220\347\240\201\345\255\246\344\271\240\347\254\224\350\256\260/Pika \347\232\204\345\221\275\344\273\244\346\211\247\350\241\214\346\241\206\346\236\266/index.html" "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/Pika \346\272\220\347\240\201\345\255\246\344\271\240\347\254\224\350\256\260/Pika \347\232\204\345\221\275\344\273\244\346\211\247\350\241\214\346\241\206\346\236\266/index.html" new file mode 100644 index 0000000..f02c162 --- /dev/null +++ "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/Pika \346\272\220\347\240\201\345\255\246\344\271\240\347\254\224\350\256\260/Pika \347\232\204\345\221\275\344\273\244\346\211\247\350\241\214\346\241\206\346\236\266/index.html" @@ -0,0 +1,51 @@ + + + + + +Pika 的命令执行框架 | PikiwiDB(Pika) + + + + + + + + + +

Pika 的命令执行框架

今天我们一起来看下pika收到一个命令后,是怎么处理这个命令的。 +Pika现在支持了两种模式:一种是classic,一种是sharding。如果是使用classic模式,则pika支持多db,可以使用databases来配置db的个数;如果是使用sharding模式,则使用default-slot-num来配置该shard负责处理的slot的数量。

+

alt text

+

1.db,table,partition的关系

+

PikaServer启动的时候,会先初始化表结构,初始的表结构是由配置文件决定的

+

alt text

+

加载配置文件的入口是PikaConf::Load,根据配置文件,如果配置的是classic模式,则用databases来初始化table_struct,有多少个db,则有初始化多少个table;如果配置的是sharding模式,则获取solt的数量,初始化db0。可以看到,如果是classic模式,则一个db对应一个table,并且这个table只有一个分区partition,如果是sharding模式,则默认只有一个db,即db0,一个slot对应一个partition。

+

alt text

+

默认使用的表是第一个表,可以使用select dbid来选择是哪个表,SelectCmd会修改使用的表。

+

alt text

+

PikaServer::InitTableStruct中,会根据生成表结构信息来生成table,并且给这个table创建分区。

+

alt text

+

在Table::AddPartitions中,为每个分区创建了一个Partition,一个Partition对应着一个Blackwidow,Blackwidow一个基于rocksdb的封装的存储引擎,我们先直接认为他就是rocksdb,创建Partition会打开rocksdb,给后续的操作使用。

+

alt text

+

2.命令的执行流程 +在了解命令的执行流程之前还需要了解下命令表CmdTable的初始化。Main函数里面启动pikaServer之前会先进行CmdTable的初始化

+

alt text

+

入口是InitCmdTable,我们可以看一下这个函数:

+

alt text

+

这个函数创建了各种命令对象,然后往CmdTable里面insert,CmdTable是一个map,key是命令的字符串,value就是具体的Cmd对象。所有的Cmd对象都继承了基类Cmd,真正执行命令的是各个Cmd的do方法。下面我们以set命令为例来说明这些命令是怎么执行的,在《Pika源码学习--pika的通信和线程模型》中我们已经知道了请求是怎么走的,并且知道最后是用了PikaClientConn::DoCmd这个函数来执行命令,今天我们具体看看这个DoCmd里面做了啥。

+

alt text

+

前面解析请求的时候已经知道了需要执行的是哪个命令,这里先根据命令的名称在CmdTable里面找到具体处理命令的对象,比如Set命令,就会找到SetCmd对象。找到命令后,会先执行cmd的初始化,做一些校验等工作,这里current_table_默认是使用默认表

+

alt text

+

然后调用Cmd::Execute,这里根据不同的命令会走不同的分支,是和命令的类型或者属性有关的,命令属性在初始化CmdTable的时候会初始化

+

alt text

+

我们以ProcessSinglePartitionCmd为例,处理命令的时候需要先找到Partition,如果是classic模式,一个table只有一个分区,如果是sharding模式,则根据命令的key来决定

+

alt text

+

需要具体的命令实现自己的current_key方法

+

alt text

+

Get partiton会根据key或者table_name,使用具体的数据分布算法得到处理的分区

+

alt text

+

找到分区后,就会调用具体命令对象的do方法来处理。partiton里面的db,就是前面说到的Blackwidow(rocksdb)存储引擎。

+

alt text

+

简单总结一下,执行一个命令的时候,先需要知道是哪个table的,然后根据命令名称在CmdTable里面获取处理命令的对象,然后找到处理具体这个命令的partiton,然后使用Blackwidow引擎来处理命令。

+ + \ No newline at end of file diff --git "a/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/Pika \346\272\220\347\240\201\345\255\246\344\271\240\347\254\224\350\256\260/PubSub \346\234\272\345\210\266/index.html" "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/Pika \346\272\220\347\240\201\345\255\246\344\271\240\347\254\224\350\256\260/PubSub \346\234\272\345\210\266/index.html" new file mode 100644 index 0000000..66d715f --- /dev/null +++ "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/Pika \346\272\220\347\240\201\345\255\246\344\271\240\347\254\224\350\256\260/PubSub \346\234\272\345\210\266/index.html" @@ -0,0 +1,53 @@ + + + + + +Pubsub 机制 | PikiwiDB(Pika) + + + + + + + + + +

Pubsub 机制

前一篇《Pika源码学习--pika的通信和线程模型》里说到WorkerThread里面有两种处理命令的方式,一种是同步,一种是异步。那什么时候是同步处理,什么时候是异步处理呢?其实 +ClientConnFactory返回的PikaClientConn默认都是异步的。

+

alt text

+

同步是在订阅推送里面用到,我们来了解一下pika的PubSub机制,这里以Subscribe/UnSubscribe命令为例。

+

1、PubSub线程

+

PikaServer里面单独起了一个线程用来处理订阅推送的消息

+

alt text

+

PubSubThread构造函数里面创建了两个管道,和前面介绍的一样,这里的管道是用来线程间通信用的,其中msg_pfd_是有推送消息到来时通知进行推送,notify_pfd_是用于连接的加入。

+

alt text

+

PubSubThread继承Thread,主逻辑入口是PubSubThread::ThreadMain,在ThreadMain里面主要处理新连接加入,推送,以及连接的消息,这几部分需要分别结合下面的介绍来说明。

+

2、Subscribe

+

Subscribe命令的入口是SubscribeCmd::Do,这里除了执行Subscribe主逻辑外,还做了下图框起来的两个关键的动作

+

alt text

+

把连接的fd从WorkerThread线程的epoll中删除WorkerThread::MoveConnOut,设置PubSub标记并且把连接的HandleType改为同步模式。我们再看下Subscribe里面做了啥。订阅本身的逻辑比较简单,就是构造了一个channel和conn数组的Map pubsub_channel_,然后把channel和conn往这个map上加。

+

alt text

+

我们看下最下面的红框,前面把连接的fd从WorkerThread里面删除,这里把这个fd放到fd_queue,然后写了一个管道消息通知PubSub线程处理,我们看下PubSubThread::ThreadMain,如果是notify_pfd_来的消息,会把fd加到PubSubThread自己的epoll,所以如果有subscribe命令过来的时候,会把这个连接的fd从WorkerThread转移到PubSubThread这个单独的线程来处理。

+

alt text

+

3、UnSubscribe +UnSubscribe命令的入口是SubscribeCmd::Do,理解了Subscribe的逻辑后,UnSubscribe的逻辑就比较好理解了,因为他做了和Subscribe相反的操作:PubSubThread::UnSubscribe里面会RemoveConn,把连接fd从PubSubThread的epoll删除;然后把连接加回WorkerThread的epoll,PubSub标记置为false

+

alt text

+

4、Publish +Publish命令的入口是PublishCmd::Do,主要逻辑是发管道消息通知PubSubThread主线程来处理推送

+

alt text

+

PubSubThread::ThreadMain如果收到推送的通知,则根据订阅关系进行推送

+

alt text

+

5、已订阅连接命令的处理 +为啥需要把订阅的fd移到单独的PubSubThread线程,并且用同步处理呢?把订阅连接fd移到PubSubThread线程后,处理已有连接的消息的逻辑其实和在WorkerThread类似,也是用RedisConn::GetRequest来处理请求,只不过处理类型变成了同步。

+

alt text

+

从前一篇文章我们可以知道,同步的处理是在ParserDealMessageCb函数

+

alt text

+

理论上讲这个PikaClientConn::DealMessage应该是要实现的才对,但是我下的最新的代码发现这个函数被改没了(commitid: c9f2a66b1741a9148402b42128f46c36d3d83444)

+

alt text

+

在commit记录里面找到了之前的实现,暂时没有研究这个为啥这样改,先按以前的代码看,不影响对整个逻辑的理解。可以看到DealMessage实际上也是调用了PikaClientConn::DoCmd。

+

alt text

+

因为redis的PubSub实现是这样的,如果一个客户端正在订阅,那么这个客户端只能执行Subscribe/UnSubscribe/PSubscribe/UnSubscribe/Ping这几个命令,订阅和取消订阅是有时序关系的,而ping命令是可以直接处理的,所以这里应该是为了避免订阅和取消订阅发生时序错误,所以把订阅的连接移到单独的线程PubSubThread来处理,并且使用同步的处理方式。

+

alt text

+ + \ No newline at end of file diff --git "a/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/Pika \346\272\220\347\240\201\345\255\246\344\271\240\347\254\224\350\256\260/index.html" "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/Pika \346\272\220\347\240\201\345\255\246\344\271\240\347\254\224\350\256\260/index.html" new file mode 100644 index 0000000..5191dd4 --- /dev/null +++ "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/Pika \346\272\220\347\240\201\345\255\246\344\271\240\347\254\224\350\256\260/index.html" @@ -0,0 +1,18 @@ + + + + + +Pika 源码学习笔记 | PikiwiDB(Pika) + + + + + + + + + + + + \ No newline at end of file diff --git "a/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/Pika \346\272\220\347\240\201\345\255\246\344\271\240\347\254\224\350\256\260/\351\200\232\344\277\241\345\222\214\347\272\277\347\250\213\346\250\241\345\236\213/index.html" "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/Pika \346\272\220\347\240\201\345\255\246\344\271\240\347\254\224\350\256\260/\351\200\232\344\277\241\345\222\214\347\272\277\347\250\213\346\250\241\345\236\213/index.html" new file mode 100644 index 0000000..79b9d15 --- /dev/null +++ "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/Pika \346\272\220\347\240\201\345\255\246\344\271\240\347\254\224\350\256\260/\351\200\232\344\277\241\345\222\214\347\272\277\347\250\213\346\250\241\345\236\213/index.html" @@ -0,0 +1,65 @@ + + + + + +通信和线程模型 | PikiwiDB(Pika) + + + + + + + + + +

通信和线程模型

pika的线程模型有官方的wiki介绍,这里主要介绍了pika都有哪些线程,这些线程用来干嘛。本篇文章主要涉及监听线程DispatchThread、IO工作线程WorkerThread和工作线程池ThreadPool,结合代码介绍里面实现的一些细节。

+

1.监听线程DispatchThread

+

在创建PikaServer的时候,会构造一个PikaDispatchThread,这个PikaDispatchThread,实际上是用了pink网络库的DispatchThread::DispatchThread

+

alt text

+

DispatchThread构造函数里面会初始化好若干个WorkerThread

+

alt text

+

DispatchThread继承自ServerThread,ServerThread继承了Thread,线程启动时实际上运行的是子类的ThreadMain方法,继承了Thread类的子类需要有自己的ThreadMain,监听线程start的时候,入口是ServerThread::ThreadMain()。线程启动会先ServerThread::InitHandle(),绑定和监听端口,下面看看ServerThread::ThreadMain()里面做了啥。

+

ServerThread::ThreadMain()主要逻辑是一个epoll,当有新的连接事件来的时候,accept,然后调用DispatchThread::HandleNewConn来处理这个新的连接

+

alt text

+

DispatchThread::HandleNewConn如何处理连接呢?实际上监听线程会把连接分发给IO工作线程WorkerThread来处理。每个WorkerThread都有一个PinkEpoll,PinkEpoll有一个notify_queue_,新的连接会以PinkItem的形式push到这个队列里面,然后通知WorkerThread来处理。分发的方式类似轮训,会按顺序分发给notify_queue_没有满的WorkerThread。

+

alt text

+

那么监听线程如何通知WorkerThread来处理新的连接呢?使用的是管道的方式,PinkEpoll会创建一个管道用来通知,并且把这个管道加到Epoll里面。在确定好要分发的WorkerThread后,往这个WorkerThread的管道写进去一个1字节的内容,来触发这个管道的读事件。

+

alt text

+

2.IO工作线程WorkerThread

+

DispatchThread::StartThread的时候会起WorkerThread线程,WorkerThread也是继承了Thread,因此工作线程的入口是WorkerThread::ThreadMain。上文说到监听线程把新的连接放到WorkerThread的队列里面后,通知了WorkerThread进行处理。下面我们看看WorkerThread怎么处理的。 +WorkerThread同样是一个Epoll,这里会处理新连接请求事件和已连接请求的事件,如果Epoll返回的fd是notify_receive_fd,即管道的接收fd,说明是内部的通知事件,一次性读取多个字节的内容,因为前面已知每个通知是1个字节,因此这里读到了多少个字节就说明有多少个通知,然后在一个循环里面处理这些请求。类型为kNotiConnect则是新的连接,这里会把监听线程push的PinkItem取出来,然后创建一个NewPinkConn,加到conns_里面,并且把这个fd加到WorkerThread的epoll,后续的消息事件就可以在这个epoll被处理。这里conn_factory用的是ClientConnFactory,返回的是PikaClientConn,继承了pink::RedisConn。

+

alt text

+

连接绑定到WorkerThread后,已建立连接的客户端发送请求过来,则是走的下面的分支,根据fd在conns_里面找到PinkConn,我们先只看读请求部分,回响应部分后面再看。

+

alt text

+

在conns_里面找到的是对应fd的PikaClientConn,使用RedisConn::GetRequest来读取客户端的的请求,此处有一个细节,如果read_status为kReadAll,则一次完整的请求被读取,会先把这个请求fd的读写事件给删除。这是为啥呢?删除了不是后续就处理不了这个请求的读写吗,这个我们后面讲到了再说明。 +RedisConn::GetRequest里面,使用RedisParser::ProcessRequestBuffer来解析读取到的内容,然后有2种处理方式,DealMessage和Complete

+

alt text

+

先看下这两个函数的初始化,DealMessage对应着ParserDealMessageCb,Complete对应着ParserCompleteCb

+

alt text

+

我们看这两个方法,原来一个是同步处理,一个是异步,同步的话就是一个个命令调用DealMessage来处理,异步的话是解析完合成一组命令统一调Complete处理。异步的处理方式是将请求的命令提交给线程池来处理PikaClientConn::AsynProcessRedisCmds,怎么提交的我们在工作线程池里面介绍。

+

alt text

+

3.工作线程池ThreadPool

+

PikaServer构造的时候会创建一个PikaClientProcessor,PikaClientProcessor里面有一个ThreadPool,ThreadPool启动时会创建Worker线程,Worker线程实际的处理函数是ThreadPool::runInThread()

+

alt text

+

前面讲到WorkerThread解析完redis命令后会把命令提交给ThreadPool来处理,实际上是调用了线程池的ThreadPool::Schedule方法,Schedule需要一个TaskFunc来真正处理命令,这里使用的是DoBackgroundTask

+

alt text

+

ThreadPool::Schedule里面,把参数封装成Task,然后push到线程池的任务队列,接着通知线程池处理,这里WorkerThread是生产者,线程池是消费者。

+

alt text

+

而线程池的工作线程,则是不断地在队列里面取出Task进行处理。

+

alt text

+

4.命令处理和响应流程

+

线程池里面实际处理命令的是DoBackgroundTask,我们先来看看命令是怎么被处理的。DoBackgroundTask里面调用的是PikaClientConn::BatchExecRedisCmd

+

alt text

+

BatchExecRedisCmd里面是命令一个一个取出来ExecRedisCmd,然后PikaClientConn::DoCmd,响应消息先塞到resp_array,在TryWriteResp里面又把响应一个个取出来塞到response_里,并且把is_reply_置为true,然后做了一个NotifyEpoll的操作。

+

alt text

+

可以看到,这里把处理结果又封装成一个PinkItem,然后和前面介绍的监听线程把连接请求分发给WorkerThread一样,把PinkItem放到PinkEpoll的队列里面,然后通过在管道里面写了一个字节的字符触发epoll的读事件。所以我们回过头来看看WorkerThread的处理WorkerThread::ThreadMain

+

alt text

+

这里的流程和前面介绍的差不多,可以看到这里把这个连接的fd的读写事件重新加到epoll里面,前面我们留了一个疑问,在一次命令读取结束后,把连接fd的读写事件从epoll里面删除了,这是为啥呢?这里我们看到命令处理结束后又把读写事件加回来了。应该是因为pika用的是异步处理,一个连接的命令是异步地交给线程池处理,如果同个连接发了2个命令,因为是异步处理,没有办法保证2个命令满足FIFO,即先来的命令需要先回复,后来的命令后回复,redis是单线程模型,因此天然满足,pika是多线程异步处理,所以这里在读取了第一个命令后,把连接的读写事件删除了,等前一个命令处理完了才加回来,读取第二个命令来处理。

+

连接的fd加进epoll后,fd可写了,那么epoll会返回可写事件,用RedisConn::SendReply来发送响应给客户端,如果写完了会把fd的写事件给删掉,如果没写完,则等fd可写了会继续触发写事件来写回复。

+

alt text

+

5.总结

+

通过上面的分析可以知道,监听线程是用来监听新的连接,连接来了会交由WorkerThread处理,已建立连接的请求会由WorkerThread封装成Task交给线程池ThreadPool处理,ThreadPool处理完了后,还是由WorkerThread来回复。WorkerThread就是做接收消息,回复消息的,而ThreadPool只是处理消息,不涉及接收和回复的IO操作。这3者的关系大概如下图所示:

+

alt text

+ + \ No newline at end of file diff --git "a/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/index.html" "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/index.html" new file mode 100644 index 0000000..8837ed4 --- /dev/null +++ "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/index.html" @@ -0,0 +1,18 @@ + + + + + +设计与实现 | PikiwiDB(Pika) + + + + + + + + + + + + \ No newline at end of file diff --git "a/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/\344\270\273\344\273\216\345\220\214\346\255\245/index.html" "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/\344\270\273\344\273\216\345\220\214\346\255\245/index.html" new file mode 100644 index 0000000..ce21e21 --- /dev/null +++ "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/\344\270\273\344\273\216\345\220\214\346\255\245/index.html" @@ -0,0 +1,85 @@ + + + + + +主从同步 | PikiwiDB(Pika) + + + + + + + + + +

主从同步

pika主从同步

+

主要为了分析探索一下pika是如何实现主从同步的,pika的主从同步的原理与redis的同步方案还不相同,本文主要是为了分析其主从同步的相关流程(pika基于3.4版本)。

+

pika主从同步原理

+

主从同步的原理,主要是通过在启动的时候启动了两部分的线程来进行的。

+
    +
  • auxiliary_thread线程
  • +
  • pika_rm中的pika_repl_client线程池和pika_repl_server线程池
  • +
+

先逐个分析一下两个部分线程的工作的流程。

+

auxiliary_thread线程

+

在pika的pika_server的Start函数中启动了auxiliary_thread线程。

+
  ret = pika_auxiliary_thread_->StartThread();
if (ret != pink::kSuccess) {
tables_.clear();
LOG(FATAL) << "Start Auxiliary Thread Error: " << ret << (ret == pink::kCreateThreadError ? ": create thread error " : ": other error");
}
+

此时启动的线程就是位于pika_auxiliary_thread.cc中的线程函数。

+
void* PikaAuxiliaryThread::ThreadMain() {
while (!should_stop()) { // 是否停止线程
if (g_pika_conf->classic_mode()) { // 判断当前运行的模式是分布式模式还是经典模式
if (g_pika_server->ShouldMetaSync()) {
g_pika_rm->SendMetaSyncRequest();
} else if (g_pika_server->MetaSyncDone()) {
g_pika_rm->RunSyncSlavePartitionStateMachine();
}
} else {
g_pika_rm->RunSyncSlavePartitionStateMachine(); // 分布式模式则直接启动状态机的同步
}

Status s = g_pika_rm->CheckSyncTimeout(slash::NowMicros()); // 检查超时的节点
if (!s.ok()) {
LOG(WARNING) << s.ToString();
}

// TODO(whoiami) timeout
s = g_pika_server->TriggerSendBinlogSync(); // 触发binlog的主从同步
if (!s.ok()) {
LOG(WARNING) << s.ToString();
}
// send to peer
int res = g_pika_server->SendToPeer(); // 将待发送的任务加入到工作线程队列中
if (!res) {
// sleep 100 ms
mu_.Lock();
cv_.TimedWait(100);
mu_.Unlock();
} else {
//LOG_EVERY_N(INFO, 1000) << "Consume binlog number " << res;
}
}
return NULL;
}
+

RunSyncSlavePartitionStateMachine-

+

该函数就是处理主从同步过程中的状态机,根据不同的状态去进行不同的操作。

+
Status PikaReplicaManager::RunSyncSlavePartitionStateMachine() {
slash::RWLock l(&partitions_rw_, false);
for (const auto& item : sync_slave_partitions_) { // 获取所有的从节点同步信息
PartitionInfo p_info = item.first;
std::shared_ptr<SyncSlavePartition> s_partition = item.second;
if (s_partition->State() == ReplState::kTryConnect) { // 如果同步的信息是kTryConnect则发送TrySync的同步请求
LOG(WARNING) << "Partition start, Table Name: "
<< p_info.table_name_ << " Partition Id: " << p_info.partition_id_;
SendPartitionTrySyncRequest(p_info.table_name_, p_info.partition_id_);
} else if (s_partition->State() == ReplState::kTryDBSync) { // 如果是kTryDB的状态则发送DB同步的请求
SendPartitionDBSyncRequest(p_info.table_name_, p_info.partition_id_);
} else if (s_partition->State() == ReplState::kWaitReply) { // 如果是wait状态则什么都不做
continue;
} else if (s_partition->State() == ReplState::kWaitDBSync) { // 如果是waitdb状态则等待
std::shared_ptr<Partition> partition =
g_pika_server->GetTablePartitionById(
p_info.table_name_, p_info.partition_id_);
if (partition) {
partition->TryUpdateMasterOffset(); // 更新和主之间的offset
} else {
LOG(WARNING) << "Partition not found, Table Name: "
<< p_info.table_name_ << " Partition Id: " << p_info.partition_id_;
}
} else if (s_partition->State() == ReplState::kConnected
|| s_partition->State() == ReplState::kNoConnect
|| s_partition->State() == ReplState::kDBNoConnect) { // 如果是已连接或者失联则什么都不处理
continue;
}
}
return Status::OK();
}
+

从状态机的运行来看,所有的步骤都是依赖于该函数通过状态来驱动进行不同的操作。

+

CheckSyncTimeout-检查连接的超时时间

+
Status PikaReplicaManager::CheckSyncTimeout(uint64_t now) {
slash::RWLock l(&partitions_rw_, false);

for (auto& iter : sync_master_partitions_) {
std::shared_ptr<SyncMasterPartition> partition = iter.second;
Status s = partition->CheckSyncTimeout(now); // 获取所有的master的同步节点检查是否超时
if (!s.ok()) {
LOG(WARNING) << "CheckSyncTimeout Failed " << s.ToString();
}
}
for (auto& iter : sync_slave_partitions_) {
std::shared_ptr<SyncSlavePartition> partition = iter.second;
Status s = partition->CheckSyncTimeout(now); // 获取所有slave的同步节点信息检查是否超时
if (!s.ok()) {
LOG(WARNING) << "CheckSyncTimeout Failed " << s.ToString();
}
}
return Status::OK();
}
+

主要是检查master和slave的同步连接信息是否超时。

+
Status SyncMasterPartition::CheckSyncTimeout(uint64_t now) {
std::unordered_map<std::string, std::shared_ptr<SlaveNode>> slaves = GetAllSlaveNodes();

std::vector<Node> to_del;
for (auto& slave_iter : slaves) {
std::shared_ptr<SlaveNode> slave_ptr = slave_iter.second; // 获取所有slave的连接信息
slash::MutexLock l(&slave_ptr->slave_mu);
if (slave_ptr->LastRecvTime() + kRecvKeepAliveTimeout < now) { // 如果最后的时间超时则删除该连接
to_del.push_back(Node(slave_ptr->Ip(), slave_ptr->Port()));
} else if (slave_ptr->LastSendTime() + kSendKeepAliveTimeout < now && slave_ptr->sent_offset == slave_ptr->acked_offset) { // 如果最后的发送时间未超时 并且主从同步的偏移量发送的与回复的相同则发送binlogchips请求并且更新当前的最后发送时间
std::vector<WriteTask> task;
RmNode rm_node(slave_ptr->Ip(), slave_ptr->Port(), slave_ptr->TableName(), slave_ptr->PartitionId(), slave_ptr->SessionId());
WriteTask empty_task(rm_node, BinlogChip(LogOffset(), ""), LogOffset());
task.push_back(empty_task);
Status s = g_pika_rm->SendSlaveBinlogChipsRequest(slave_ptr->Ip(), slave_ptr->Port(), task); // 同步当前的主从同步的信息
slave_ptr->SetLastSendTime(now);
if (!s.ok()) {
LOG(INFO)<< "Send ping failed: " << s.ToString();
return Status::Corruption("Send ping failed: " + slave_ptr->Ip() + ":" + std::to_string(slave_ptr->Port()));
}
}
}

for (auto& node : to_del) { // 将超时的连接信息都删除掉
coordinator_.SyncPros().RemoveSlaveNode(node.Ip(), node.Port());
g_pika_rm->DropItemInWriteQueue(node.Ip(), node.Port());
LOG(WARNING) << SyncPartitionInfo().ToString() << " Master del Recv Timeout slave success " << node.ToString();
}
return Status::OK();
}
+

主节点主要维护了当前的一些主从连接的信息维护。

+
Status SyncSlavePartition::CheckSyncTimeout(uint64_t now) {
slash::MutexLock l(&partition_mu_);
// no need to do session keepalive return ok
if (repl_state_ != ReplState::kWaitDBSync && repl_state_ != ReplState::kConnected) {
return Status::OK(); // 如果从节点的信息不是waitdb或者连接状态则返回ok
}
if (m_info_.LastRecvTime() + kRecvKeepAliveTimeout < now) {
// update slave state to kTryConnect, and try reconnect to master node
repl_state_ = ReplState::kTryConnect;
g_pika_server->SetLoopPartitionStateMachine(true); // 否则就设置成tryconnect状态去尝试连接主节点
}
return Status::OK();
}
+

TriggerSendBinlogSync-生成每个节点待发送的数据任务

+
Status PikaServer::TriggerSendBinlogSync() {
return g_pika_rm->WakeUpBinlogSync();
}

...

Status PikaReplicaManager::WakeUpBinlogSync() {
slash::RWLock l(&partitions_rw_, false);
for (auto& iter : sync_master_partitions_) {
std::shared_ptr<SyncMasterPartition> partition = iter.second;
Status s = partition->WakeUpSlaveBinlogSync(); // 检查每个节点是否需要生成binlog同步任务
if (!s.ok()) {
return s;
}
}
return Status::OK();
}
+

主要是检查每个连接的从节点信息是否需要生成同步binlog任务。

+
Status SyncMasterPartition::WakeUpSlaveBinlogSync() {
std::unordered_map<std::string, std::shared_ptr<SlaveNode>> slaves = GetAllSlaveNodes();
std::vector<std::shared_ptr<SlaveNode>> to_del;
for (auto& slave_iter : slaves) {
std::shared_ptr<SlaveNode> slave_ptr = slave_iter.second;
slash::MutexLock l(&slave_ptr->slave_mu);
if (slave_ptr->sent_offset == slave_ptr->acked_offset) { // 检查当前同步的数据信息是否跟回复的数据偏移相同
Status s = ReadBinlogFileToWq(slave_ptr); // 写binlog任务到该从节点连接上面
if (!s.ok()) {
to_del.push_back(slave_ptr);
LOG(WARNING) << "WakeUpSlaveBinlogSync falied, Delete from RM, slave: " <<
slave_ptr->ToStringStatus() << " " << s.ToString();
}
}
}
for (auto& to_del_slave : to_del) { // 如果同步失败则删除该node
RemoveSlaveNode(to_del_slave->Ip(), to_del_slave->Port());
}
return Status::OK();
}
+

其中ReadBinlogFileToWq就是根据当前的连接来生成binlog同步任务。

+
Status SyncMasterPartition::ReadBinlogFileToWq(const std::shared_ptr<SlaveNode>& slave_ptr) {
int cnt = slave_ptr->sync_win.Remaining();
std::shared_ptr<PikaBinlogReader> reader = slave_ptr->binlog_reader; //获取当前binlogreader
if (reader == nullptr) {
return Status::OK();
}
std::vector<WriteTask> tasks;
for (int i = 0; i < cnt; ++i) {
std::string msg;
uint32_t filenum;
uint64_t offset;
if (slave_ptr->sync_win.GetTotalBinlogSize() > PIKA_MAX_CONN_RBUF_HB * 2) {
LOG(INFO) << slave_ptr->ToString() << " total binlog size in sync window is :"
<< slave_ptr->sync_win.GetTotalBinlogSize();
break; //检查当前同步窗口的大小
}
Status s = reader->Get(&msg, &filenum, &offset); //获取对应的偏移数据
if (s.IsEndFile()) {
break;
} else if (s.IsCorruption() || s.IsIOError()) {
LOG(WARNING) << SyncPartitionInfo().ToString()
<< " Read Binlog error : " << s.ToString();
return s;
}
BinlogItem item;
if (!PikaBinlogTransverter::BinlogItemWithoutContentDecode(
TypeFirst, msg, &item)) {
LOG(WARNING) << "Binlog item decode failed";
return Status::Corruption("Binlog item decode failed");
}
BinlogOffset sent_b_offset = BinlogOffset(filenum, offset); // 生成发送的偏移量
LogicOffset sent_l_offset = LogicOffset(item.term_id(), item.logic_id());
LogOffset sent_offset(sent_b_offset, sent_l_offset);

slave_ptr->sync_win.Push(SyncWinItem(sent_offset, msg.size())); //设置同步窗口的大小
slave_ptr->SetLastSendTime(slash::NowMicros()); //设置最后的发送时间
RmNode rm_node(slave_ptr->Ip(), slave_ptr->Port(), slave_ptr->TableName(), slave_ptr->PartitionId(), slave_ptr->SessionId());
WriteTask task(rm_node, BinlogChip(sent_offset, msg), slave_ptr->sent_offset);
tasks.push_back(task); // 包装成任务
slave_ptr->sent_offset = sent_offset; // 设置当前的发送偏移量
}

if (!tasks.empty()) {
g_pika_rm->ProduceWriteQueue(slave_ptr->Ip(), slave_ptr->Port(), partition_info_.partition_id_, tasks); // 将任务放入队列中等待处理
}
return Status::OK();
}
+

主要就是通过获取偏移量,然后生成任务并放入发送队列中等待处理。

+

SendToPeer-将待发送的binlog同步任务发送给从节点

+
int PikaServer::SendToPeer() {
return g_pika_rm->ConsumeWriteQueue();
}

...

int PikaReplicaManager::ConsumeWriteQueue() {
std::unordered_map<std::string, std::vector<std::vector<WriteTask>>> to_send_map;
int counter = 0;
{
slash::MutexLock l(&write_queue_mu_);
for (auto& iter : write_queues_) {
const std::string& ip_port = iter.first;
std::unordered_map<uint32_t, std::queue<WriteTask>>& p_map = iter.second; //获取队列
for (auto& partition_queue : p_map) {
std::queue<WriteTask>& queue = partition_queue.second;
for (int i = 0; i < kBinlogSendPacketNum; ++i) {
if (queue.empty()) {
break;
}
size_t batch_index = queue.size() > kBinlogSendBatchNum ? kBinlogSendBatchNum : queue.size(); // 检查当前可发送的大小
std::vector<WriteTask> to_send;
int batch_size = 0;
for (size_t i = 0; i < batch_index; ++i) {
WriteTask& task = queue.front();
batch_size += task.binlog_chip_.binlog_.size();
// make sure SerializeToString will not over 2G
if (batch_size > PIKA_MAX_CONN_RBUF_HB) {
break;
}
to_send.push_back(task); // 放入可发送的队列中
queue.pop();
counter++;
}
if (!to_send.empty()) {
to_send_map[ip_port].push_back(std::move(to_send));
}
}
}
}
}

std::vector<std::string> to_delete;
for (auto& iter : to_send_map) {
std::string ip;
int port = 0;
if (!slash::ParseIpPortString(iter.first, ip, port)) {
LOG(WARNING) << "Parse ip_port error " << iter.first;
continue;
}
for (auto& to_send : iter.second) {
Status s = pika_repl_server_->SendSlaveBinlogChips(ip, port, to_send); // 发送Binglog任务
if (!s.ok()) {
LOG(WARNING) << "send binlog to " << ip << ":" << port << " failed, " << s.ToString();
to_delete.push_back(iter.first); // 如果发送失败则放入失败队列中
continue;
}
}
}

if (!to_delete.empty()) {
{
slash::MutexLock l(&write_queue_mu_);
for (auto& del_queue : to_delete) {
write_queues_.erase(del_queue); //删除发送失败的任务
}
}
}
return counter;
}
+

最终通过pika_repl_server_的SendSlaveBinlogChips函数将当前待发送的任务发送出去。

+

pika_repl_client和pika_repl_server_线程

+

这两个线程就是维护了主从连接的client和server端的交互功能,auxiliary_thread中状态机触发的连接状态就是依赖于这两个线程来完成交互。

+

pika_repl_client客户端连接管理线程

+

pika_reple_client的最核心的原理就是通过一个基于epoll(linux平台)的事件驱动,去完成多个连接的事件驱动,并通过加入线程池来提供epoll的处理性能。接下来就大致了解一下pika_repl_client完成的交互的相关功能。

+

在主从同步过程中,无论是pika_repl_client还是pika_repl_server_底层都利用了pink库的PbConn模式来进行的数据交互。

+

通过client_thread的逻辑流程来简单分析一下PbConn的执行流程。

+

在PikaReplClient的Start流程中,启动了如下线程。

+
int PikaReplClient::Start() {
int res = client_thread_->StartThread(); // 启动一个epoll的事件驱动
if (res != pink::kSuccess) {
LOG(FATAL) << "Start ReplClient ClientThread Error: " << res << (res == pink::kCreateThreadError ? ": create thread error " : ": other error");
}
for (size_t i = 0; i < bg_workers_.size(); ++i) { // 通过将epoll事件驱动的执行分发到线程池中执行
res = bg_workers_[i]->StartThread();
if (res != pink::kSuccess) {
LOG(FATAL) << "Start Pika Repl Worker Thread Error: " << res
<< (res == pink::kCreateThreadError ? ": create thread error " : ": other error");
}
}
return res;
}
+

此时client_thread启动的就是位于pink的client_thread.c中的ClientThread线程。

+
void *ClientThread::ThreadMain() {
int nfds = 0;
PinkFiredEvent *pfe = NULL;

struct timeval when;
gettimeofday(&when, NULL);
struct timeval now = when;

when.tv_sec += (cron_interval_ / 1000);
when.tv_usec += ((cron_interval_ % 1000) * 1000);
int timeout = cron_interval_;
if (timeout <= 0) {
timeout = PINK_CRON_INTERVAL;
}

std::string ip_port;

while (!should_stop()) {
if (cron_interval_ > 0) {
gettimeofday(&now, nullptr);
if (when.tv_sec > now.tv_sec ||
(when.tv_sec == now.tv_sec && when.tv_usec > now.tv_usec)) {
timeout = (when.tv_sec - now.tv_sec) * 1000 +
(when.tv_usec - now.tv_usec) / 1000;
} else {
// do user defined cron
handle_->CronHandle(); // 执行定时任务

DoCronTask();
when.tv_sec = now.tv_sec + (cron_interval_ / 1000);
when.tv_usec = now.tv_usec + ((cron_interval_ % 1000) * 1000);
timeout = cron_interval_;
}
}
//{
//InternalDebugPrint();
//}
nfds = pink_epoll_->PinkPoll(timeout); //事件驱动
for (int i = 0; i < nfds; i++) {
pfe = (pink_epoll_->firedevent()) + i;
if (pfe == NULL) {
continue;
}

if (pfe->fd == pink_epoll_->notify_receive_fd()) { // 处理驱动
ProcessNotifyEvents(pfe);
continue;
}

int should_close = 0;
std::map<int, std::shared_ptr<PinkConn>>::iterator iter = fd_conns_.find(pfe->fd);
if (iter == fd_conns_.end()) {
log_info("fd %d not found in fd_conns\n", pfe->fd);
pink_epoll_->PinkDelEvent(pfe->fd);
continue;
}

std::shared_ptr<PinkConn> conn = iter->second;

if (connecting_fds_.count(pfe->fd)) {
Status s = ProcessConnectStatus(pfe, &should_close);
if (!s.ok()) {
handle_->DestConnectFailedHandle(conn->ip_port(), s.ToString());
}
connecting_fds_.erase(pfe->fd);
}

if (!should_close && (pfe->mask & EPOLLOUT) && conn->is_reply()) {
WriteStatus write_status = conn->SendReply(); // 如果当前是可以写数据则调用SendReply
conn->set_last_interaction(now);
if (write_status == kWriteAll) {
pink_epoll_->PinkModEvent(pfe->fd, 0, EPOLLIN);
conn->set_is_reply(false);
} else if (write_status == kWriteHalf) {
continue;
} else {
log_info("send reply error %d\n", write_status);
should_close = 1;
}
}

if (!should_close && (pfe->mask & EPOLLIN)) {
ReadStatus read_status = conn->GetRequest(); // 如果是接受数据则调用GetRequest来解析
conn->set_last_interaction(now);
if (read_status == kReadAll) {
// pink_epoll_->PinkModEvent(pfe->fd, 0, EPOLLOUT);
} else if (read_status == kReadHalf) {
continue;
} else {
log_info("Get request error %d\n", read_status);
should_close = 1;
}
}

if ((pfe->mask & EPOLLERR) || (pfe->mask & EPOLLHUP) || should_close) {
{
log_info("close connection %d reason %d %d\n", pfe->fd, pfe->mask, should_close);
pink_epoll_->PinkDelEvent(pfe->fd); // 如果关闭则删除该事件
CloseFd(conn);
fd_conns_.erase(pfe->fd);
if (ipport_conns_.count(conn->ip_port())) {
ipport_conns_.erase(conn->ip_port());
}
if (connecting_fds_.count(conn->fd())) {
connecting_fds_.erase(conn->fd());
}
}
}
}
}
return nullptr;
}
+

通过client_thread的执行函数可知,这是一个标准的事件驱动模型。如果可写入则调用conn的SendReply函数,如果是接受事情则调用conn的GetRequest函数。此时的conn就是PbConn。

+
// Msg is [ length(COMMAND_HEADER_LENGTH) | body(length bytes) ]
// step 1. kHeader, we read COMMAND_HEADER_LENGTH bytes;
// step 2. kPacket, we read header_len bytes;
ReadStatus PbConn::GetRequest() {
while (true) {
switch (connStatus_) {
case kHeader: {
ssize_t nread = read(
fd(), rbuf_ + cur_pos_, COMMAND_HEADER_LENGTH - cur_pos_); // 解析头部信息
if (nread == -1) {
if (errno == EAGAIN) {
return kReadHalf;
} else {
return kReadError;
}
} else if (nread == 0) {
return kReadClose;
} else {
cur_pos_ += nread;
if (cur_pos_ == COMMAND_HEADER_LENGTH) {
uint32_t integer = 0;
memcpy(reinterpret_cast<char*>(&integer),
rbuf_, sizeof(uint32_t));
header_len_ = ntohl(integer);
remain_packet_len_ = header_len_;
connStatus_ = kPacket;
continue;
}
return kReadHalf;
}
}
case kPacket: {
if (header_len_ > rbuf_len_ - COMMAND_HEADER_LENGTH) { //解析packet
uint32_t new_size = header_len_ + COMMAND_HEADER_LENGTH;
if (new_size < kProtoMaxMessage) {
rbuf_ = reinterpret_cast<char *>(realloc(rbuf_, sizeof(char) * new_size));
if (rbuf_ == NULL) {
return kFullError;
}
rbuf_len_ = new_size;
log_info("Thread_id %ld Expand rbuf to %u, cur_pos_ %u\n", pthread_self(), new_size, cur_pos_);
} else {
return kFullError;
}
}
// read msg body
ssize_t nread = read(fd(), rbuf_ + cur_pos_, remain_packet_len_);
if (nread == -1) {
if (errno == EAGAIN) {
return kReadHalf;
} else {
return kReadError;
}
} else if (nread == 0) {
return kReadClose;
}
cur_pos_ += nread;
remain_packet_len_ -= nread;
if (remain_packet_len_ == 0) {
connStatus_ = kComplete;
continue;
}
return kReadHalf;
}
case kComplete: { //解析完成之后调用DealMessage函数来处理
if (DealMessage() != 0) {
return kDealError;
}
connStatus_ = kHeader;
cur_pos_ = 0;
return kReadAll;
}
// Add this switch case just for delete compile warning
case kBuildObuf:
break;

case kWriteObuf:
break;
}
}

return kReadHalf;
}

WriteStatus PbConn::SendReply() {
ssize_t nwritten = 0;
size_t item_len;
slash::MutexLock l(&resp_mu_);
while (!write_buf_.queue_.empty()) { //写入的队列是否为空
std::string item = write_buf_.queue_.front();
item_len = item.size();
while (item_len - write_buf_.item_pos_ > 0) {
nwritten = write(fd(), item.data() + write_buf_.item_pos_, item_len - write_buf_.item_pos_); // 将数据写入对应的文件描述符
if (nwritten <= 0) {
break;
}
write_buf_.item_pos_ += nwritten;
if (write_buf_.item_pos_ == item_len) {
write_buf_.queue_.pop();
write_buf_.item_pos_ = 0;
item_len = 0;
}
}
if (nwritten == -1) {
if (errno == EAGAIN) {
return kWriteHalf;
} else {
// Here we should close the connection
return kWriteError;
}
}
if (item_len - write_buf_.item_pos_ != 0) {
return kWriteHalf;
}
}
return kWriteAll;
}
+

从client的事件驱动可知,处理的主要的逻辑函数就是自定义的DealMessage()函数。

+

我们继续分析PikaReplClientConn类。

+

在pika_repl_client_thread.h的定义中。

+
class PikaReplClientThread : public pink::ClientThread {
public:
PikaReplClientThread(int cron_interval, int keepalive_timeout);
virtual ~PikaReplClientThread() = default;
int Start();

private:
class ReplClientConnFactory : public pink::ConnFactory {
public:
virtual std::shared_ptr<pink::PinkConn> NewPinkConn(
int connfd,
const std::string &ip_port,
pink::Thread *thread,
void* worker_specific_data,
pink::PinkEpoll* pink_epoll) const override {
return std::static_pointer_cast<pink::PinkConn>
(std::make_shared<PikaReplClientConn>(connfd, ip_port, thread, worker_specific_data, pink_epoll)); // 新连接进来的时候通过初始化成PikaReplClientConn
}
};
class ReplClientHandle : public pink::ClientHandle {
public:
void CronHandle() const override {
}
void FdTimeoutHandle(int fd, const std::string& ip_port) const override;
void FdClosedHandle(int fd, const std::string& ip_port) const override;
bool AccessHandle(std::string& ip) const override {
// ban 127.0.0.1 if you want to test this routine
// if (ip.find("127.0.0.2") != std::string::npos) {
// std::cout << "AccessHandle " << ip << std::endl;
// return false;
// }
return true;
}
int CreateWorkerSpecificData(void** data) const override {
return 0;
}
int DeleteWorkerSpecificData(void* data) const override {
return 0;
}
void DestConnectFailedHandle(std::string ip_port, std::string reason) const override {
}
};

ReplClientConnFactory conn_factory_;
ReplClientHandle handle_;
};
+

由于每次client_thread都会将新连接通过PikaReplClientConn来初始化,故每次有事件驱动的时候就调用该PikaReplClientConn的Dealmessage函数,来处理解析的数据。

+
int PikaReplClientConn::DealMessage() {
std::shared_ptr<InnerMessage::InnerResponse> response = std::make_shared<InnerMessage::InnerResponse>();
::google::protobuf::io::ArrayInputStream input(rbuf_ + cur_pos_ - header_len_, header_len_);
::google::protobuf::io::CodedInputStream decoder(&input);
decoder.SetTotalBytesLimit(g_pika_conf->max_conn_rbuf_size(), g_pika_conf->max_conn_rbuf_size());
bool success = response->ParseFromCodedStream(&decoder) && decoder.ConsumedEntireMessage();
if (!success) {
LOG(WARNING) << "ParseFromArray FAILED! " << " msg_len: " << header_len_;
g_pika_server->SyncError();
return -1;
}
switch (response->type()) { // 根据协议解析的类型来判断执行什么操作
case InnerMessage::kMetaSync:
{
ReplClientTaskArg* task_arg = new ReplClientTaskArg(response, std::dynamic_pointer_cast<PikaReplClientConn>(shared_from_this()));
g_pika_rm->ScheduleReplClientBGTask(&PikaReplClientConn::HandleMetaSyncResponse, static_cast<void*>(task_arg)); // 如果是元数据同步,将该事件放入到处理线程池中执行
break;
}
case InnerMessage::kDBSync:
{
ReplClientTaskArg* task_arg = new ReplClientTaskArg(response, std::dynamic_pointer_cast<PikaReplClientConn>(shared_from_this()));
g_pika_rm->ScheduleReplClientBGTask(&PikaReplClientConn::HandleDBSyncResponse, static_cast<void*>(task_arg));
break;
}
case InnerMessage::kTrySync:
{
ReplClientTaskArg* task_arg = new ReplClientTaskArg(response, std::dynamic_pointer_cast<PikaReplClientConn>(shared_from_this()));
g_pika_rm->ScheduleReplClientBGTask(&PikaReplClientConn::HandleTrySyncResponse, static_cast<void*>(task_arg)); // 如果是同步则放入线程池中去执行HandleTrySyncResponse函数
break;
}
case InnerMessage::kBinlogSync:
{
DispatchBinlogRes(response); // binlog同步处理
break;
}
case InnerMessage::kRemoveSlaveNode:
{
ReplClientTaskArg* task_arg = new ReplClientTaskArg(response, std::dynamic_pointer_cast<PikaReplClientConn>(shared_from_this()));
g_pika_rm->ScheduleReplClientBGTask(&PikaReplClientConn::HandleRemoveSlaveNodeResponse, static_cast<void*>(task_arg));
break;
}
default:
break;
}
return 0;
}
+

至此,一个pika_repl_client的整个的处理流程就清晰,即每次都会根据协议调用PikaReplClientConn的DealMessage函数,将每个执行任务放入线程池中去处理。

+

pika_repl_server线程

+

该线程的核心思想与pika_repl_client的处理流程差不多,只不过在pink中对应的是HolyThread,处理流程大同小异,最终调用的就是PikaReplServerConn的DealMessage方法。

+
int PikaReplServerConn::DealMessage() {
std::shared_ptr<InnerMessage::InnerRequest> req = std::make_shared<InnerMessage::InnerRequest>();
bool parse_res = req->ParseFromArray(rbuf_ + cur_pos_ - header_len_, header_len_);
if (!parse_res) {
LOG(WARNING) << "Pika repl server connection pb parse error.";
return -1;
}
switch (req->type()) {
case InnerMessage::kMetaSync:
{
ReplServerTaskArg* task_arg = new ReplServerTaskArg(req, std::dynamic_pointer_cast<PikaReplServerConn>(shared_from_this()));
g_pika_rm->ScheduleReplServerBGTask(&PikaReplServerConn::HandleMetaSyncRequest, task_arg);
break;
}
case InnerMessage::kTrySync:
{
ReplServerTaskArg* task_arg = new ReplServerTaskArg(req, std::dynamic_pointer_cast<PikaReplServerConn>(shared_from_this()));
g_pika_rm->ScheduleReplServerBGTask(&PikaReplServerConn::HandleTrySyncRequest, task_arg);
break;
}
case InnerMessage::kDBSync:
{
ReplServerTaskArg* task_arg = new ReplServerTaskArg(req, std::dynamic_pointer_cast<PikaReplServerConn>(shared_from_this()));
g_pika_rm->ScheduleReplServerBGTask(&PikaReplServerConn::HandleDBSyncRequest, task_arg);
break;
}
case InnerMessage::kBinlogSync:
{
ReplServerTaskArg* task_arg = new ReplServerTaskArg(req, std::dynamic_pointer_cast<PikaReplServerConn>(shared_from_this()));
g_pika_rm->ScheduleReplServerBGTask(&PikaReplServerConn::HandleBinlogSyncRequest, task_arg);
break;
}
case InnerMessage::kRemoveSlaveNode:
{
ReplServerTaskArg* task_arg = new ReplServerTaskArg(req, std::dynamic_pointer_cast<PikaReplServerConn>(shared_from_this()));
g_pika_rm->ScheduleReplServerBGTask(&PikaReplServerConn::HandleRemoveSlaveNodeRequest, task_arg);
break;
}
default:
break;
}
return 0;
}

+

主从同步的流程

+

pika_repl_server的流程可用如图描述。

+

在这里插入图片描述

+

pika_repl_client的流程可用如图描述。

+

在这里插入图片描述

+

主从的状态机流程如下。

+

在这里插入图片描述

+

通过如上三个图就可以能够明白pika官网描述的主从同步的流程图。

+

pika-增量同步

+

pika-全同步

+

总结

+

本文根据pika官网的流程,分析了一下pika主从的一个大致流程,其中还包含了很多的技术细节限于本文篇幅并没有详尽分析,主要通过原理流程的一个分析来查看了主从同步的状态机线程,和主从同步的线程模型的基本原理。由于本人才疏学浅,如有错误请批评指正。

+ + \ No newline at end of file diff --git "a/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/\345\205\250\345\220\214\346\255\245/index.html" "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/\345\205\250\345\220\214\346\255\245/index.html" new file mode 100644 index 0000000..cf9b10e --- /dev/null +++ "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/\345\205\250\345\220\214\346\255\245/index.html" @@ -0,0 +1,60 @@ + + + + + +全同步 | PikiwiDB(Pika) + + + + + + + + + +

全同步

背景

+

1.Pika Replicate

+
    +
  • pika支持master/slave的复制方式,通过slave端的slaveof命令激发
  • +
  • salve端处理slaveof命令,将当前状态变为slave,改变连接状态
  • +
  • slave的向master发送MetaSync请求,在同步之前确保自身db的拓扑结构和master一致
  • +
  • slave下的每个partition单独的向master端对应的partition发起trysync请求,建立同步关系
  • +
+

2.Binlog

+
    +
  • pika同步依赖binlog
  • +
  • binlog文件会自动或手动删除
  • +
  • 当同步点对应的binlog文件不存在时,需要通过全同步进行数据同步
  • +
+

全同步

+

1. 简介

+
    +
  • 需要进行全同步时,master会将db文件dump后发送给slave
  • +
  • 通过rsync的deamon模式实现db文件的传输
  • +
  • 默认使用pika port+1000作为rysnc传输端口
  • +
+

2. 实现逻辑

+
    +
  1. 在pika实例启动的同时会启动Rsync服务
  2. +
  3. master发现某一个partition需要全同步时,判断是否有备份文件可用,如果没有先dump一份
  4. +
  5. master通过rsync向slave发送对应partition的dump的文件
  6. +
  7. slave的对应partition用收到的文件替换自己的db
  8. +
  9. slave的对应partition用最新的偏移量再次发起trysnc
  10. +
  11. 完成同步
  12. +
+

Slave中某一个Partition建立同步: +slave的partition

+

Master处理同步请求: +master执行过程

+

3. Slave连接状态

+
    +
  • No Connect:不尝试成为任何其他节点的slave
  • +
  • ShouldMetaSync:向master请求db的拓扑信息,确保与自身一致
  • +
  • TryConnect:为每个partition重置状态机,让其处于准备同步的状态
  • +
  • Connecting:在所有partition没有建立同步关系之前一直是处于connecting的状态
  • +
  • EstablishSucces: 所有partition建立同步关系成功
  • +
  • Error:出现了异常
  • +
+ + \ No newline at end of file diff --git "a/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/\345\211\257\346\234\254\344\270\200\350\207\264\346\200\247/index.html" "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/\345\211\257\346\234\254\344\270\200\350\207\264\346\200\247/index.html" new file mode 100644 index 0000000..75db1bd --- /dev/null +++ "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/\345\211\257\346\234\254\344\270\200\350\207\264\346\200\247/index.html" @@ -0,0 +1,79 @@ + + + + + +副本一致性 | PikiwiDB(Pika) + + + + + + + + + +

副本一致性

目前线程模型

+

非一致性场景

+

1,客户端请求加锁写入 db 和 binlog 文件

+

2,将结果返回客户端

+

3,通过发送 BinlogSync 请求向从库同步

+

4,从库返回 BinlogSyncAck 报告同步状况

+

+

一致性场景

+

1,客户端请求先写入 binlog 文件

+

2,通过发送 BinlogSync 请求向从库同步

+

3,从库返回 BinlogSyncAck 报告同步状况

+

4,将相应的请求写入 db

+

5,将结果返回客户端

+

+

Binlog Header 变动

+
/*
* *****************Type First Binlog Item Format******************
* |<Type>|<CreateTime>|<Term Id>|<Logic Id>|<File Num>|<Offset>|<Content Length>|<Content>|
* | 2 | 4 | 4 | 8 | 4 | 8 | 4 | ... |
* |----------------------------------------- 34 Bytes ------------------------------------|
*/
+

其中 TermId, 和 Logic id 是沿用Raft论文中 term 和 log index 的概念。具体的详见论文。

+

其中 File Num 和 offset 是本条 binlog 在文件中的偏移量。

+

Pika 的 Binlog 存在的意义是为了保证主从能够增量同步,而 Raft Log 存在的意义是为了保证 Leader 和 Follower 的数据够一致。某种意义上说这两个"Log"的概念是一样的,所以在实现上,将 binlog 和 Raft Log 复用成一条 log,目前的 binlog header 中 Term Id 和 Logic Id 属于 Raft Log(简称日志)的信息,而 File Num 和 Offset 属于 Binlog 的信息。

+

一致性协议的三阶段

+

日志恢复和复制基本按照 Raft 论文当中所做操作,这里不做过多解释。实现上,这里分为三个阶段。分别是日志的复制,日志的恢复,日志的协商。

+

熟悉 Raft 协议的读者可能会发现,这里的三个阶段跟 Raft 日志复制不是完全一样。在 Pika 的实现当中,基于 pika 现有的代码结构,我们把 Leader 和 Follower 同步点位回退的逻辑单独提取出来,形成了 Pika Trsysync 的状态。任何日志的复制出错,pika 会终止当前的日志复制(BinlogSync)状态,转而将状态机转化成 Trysync 的状态,进而 Leader 和 Follower 会进入日志的协商逻辑。协商成功之后会转入日志复制的逻辑。

+

+

日志复制

+

日志的逻辑结构如下,上面部分是 Leader 可能的 log 点位,下部分是 Follower 可能的 log 点位。

+

+

1,日志的复制的逻辑可以参考 Raft 协议的逻辑,这里举例说说明客户端从请求到返回,日志经过了怎样的流程。

+

Leader Status:

+

Committed Index : 10

+

Applied Index:8

+

Last Index: 15

+

Follower Status:

+

Committed Index : 7

+

Applied Index:5

+

LastIndex: 12

+

2,当 Leader 发送 13-15 的日志到 Follower 的时候,Follower 的状态会做如下更新:

+

Follower Status:

+

Committed Index : 10

+

Applied Index:5

+

LastIndex: 15

+

这时候日志 6-10 都是可以被应用到状态机的。但是对于日志 11-15 来说只能等到下一次收到 Leader Committed Index 大于 15 的时候这些日志才能够被更新,这时候如果客户端没有继续写入,Follower 的 Committed index 可以依靠 ping 消息(携带了 Leader 的 committed index)进行更新。

+

3,当 Leader 接收到 Follower 的 ack 信息的时候,Leader 状态会做如下更新:

+

Leader Status:

+

Committed Index : 15

+

Applied Index: 8

+

Last Index: 15

+

此时日志 9-15 都是可以被应用到状态机,这里是写 db,当日志 9 写入 db 之后,就会返回客户端,相应的 Applied Index 更新为 9。这时候日志 9 就可以返回客户端。

+

对于从来说,整体的日志复制的逻辑还是按照 Raft 论文当中进行的。唯一不同的是论文中日志回退的一部分逻辑放到了日志协商阶段进行。

+

日志恢复:

+

重启 pika 的时候,根据持久话的一致性信息(applied index 等)回复出之前的一致性状态。

+

日志协商:

+

这个阶段 Follower 节点主动发起 Trysync 流程,携带 Last Index,向 Leader 发送协商同步点位请求。协商过程如下:

+

Follower 携带 last_index 发动到 Leader, Leader 通过 Follower 的 last_index 位置判断是否自己能够找到 last_index 对应的自己的相应的 log,如果找到 log 并且两个 log 一致,Leader 返回 okay 协商结束。如果没有找到,或者 log 不一致,Leader 向 Follower 发送 hints,hints 是 Leader 本地的最新的日志。Follower 通过 hints,回退本地日志,更新自己的 last_index,重新向主协商。最终 Leader Follower 达成一致,结束 TrySync 流程,进行日志复制流程。

+

+

Leader 日志协商的伪代码如下:

+
Status LeaderNegotiate() {
reject = true
if (follower.last_index > last_index) {
send[last_index - 100, last_index]
} else if (follower.last_index < first_index) {
need dbsync
}
if (follower.last_index not found) {
need dbsync
}
if (follower.last_index found but term not equal) {
send[found_index - 100, found_index]
}
reject = false
return ok;
}
+

Follower 日志协商的伪代码日下:

+
Status FollowerNegotiate() {
if last_index > hints[hints.size() - 1] {
TruncateTo(hints[hints.size() - 1]);
}
for (reverse loop hints) {
if (hint.index exist && hint.term == term) {
TruncateTo(hint.index)
send trysync with log_index = hint.index
return ok;
}
}
// cant find any match
TruncateTo(hints[0])
send trysync with log_index = last_index
}
+

以上介绍了关于日志的具体三个阶段。整体的逻辑遵从与 Raft 论文的设计,在实现细节上根据 Pika 目前的代码结构进行了一些列的调整。

+

关于选主和成员变换

+

目前选主需要管理员手动介入,详见副本一致性使用文档

+

成员变换的功能目前暂不支持。

+ + \ No newline at end of file diff --git "a/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/\345\242\236\351\207\217\345\220\214\346\255\245/index.html" "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/\345\242\236\351\207\217\345\220\214\346\255\245/index.html" new file mode 100644 index 0000000..33c7ebb --- /dev/null +++ "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/\345\242\236\351\207\217\345\220\214\346\255\245/index.html" @@ -0,0 +1,53 @@ + + + + + +增量同步 | PikiwiDB(Pika) + + + + + + + + + +

增量同步

背景

+
+

从库Pika得到主库的全部DB结构,接下来以partition维度做Trysync,如果从库确认可以增量同步,从库将以partition为维度进行增量同步。默认使用pika port+2000的端口进行增量同步。

+

Binlog 结构:

+
+

Pika的主从同步是使用Binlog来完成的,一主多从的结构master节点也可以给多个slave复用一个Binlog,只不过不同的slave在binglog中有自己的偏移量而已,master执行完一条写命令就将命令追加到Binlog中,pika的同步模块会读出对应的binlog发送到slave,而slave收到binlog后会执行并追加到自己的Binlog中,由于主从偏移量一样,所以一旦发生网络或节点故障需要重连主从时,slave仅需要将自己当前的Binlog偏移量发送给master,master找到后从该偏移量开始同步后续命令,理论上将命令不做处理一条一条追加到文件中,但是这样的记录格式容错很差,如果读文件中写错一个字节则导致整个文件不可用,所以pika采用了类似leveldb log的格式来进行存储,具体如下:

+

image

+

交互过程:

+
+

1,从库发送BinlogSyncRequest 报文,报文中需说明自己已经收到的BinlogOffset。

+

2,主库收到BinlogSyncRequest之后会从同步点开始发出一批BinlogSyncResponse。

+

3,从库在收到BinlogSyncResponse之后,会在写入本地binlog之后再进行1流程。

+

image

+

同步模块:

+
+

image

+

Pika的同步由ReplicaManager(RM)模块负责。RM中有两层结构,逻辑层负责同步逻辑,传输层负责链接的管理数据的解析和传输。

+

数据的同步的最小单位是Partition,每一个Pika实例会维护自己作为主的partition(MasterPartition)和自己是从的partition(SlavePartition)。对于MasterPartition,需要记录跟随自己的slave同步信息,逻辑层会根据该信息向slave同步信息。对于SlavePartition,则是需要需要记录master的信息,逻辑层会按照该信息按需向master发送同步请求。

+

逻辑层维护两个数据结构,一个是MasterPartitions,记录跟随自己的SlaveNode信息,主要包括slave的同步状态和当前的sessionId。另一个是SlavePartitions,记录主的信息。

+

传输层分为两个子模块,ReplicationClient负责发起链接的建立,ReplicationServer负责响应报文。每两个实例之间的所有partition复用一条链接。

+

同步过程:

+
+

image

+

MasterPartition 同步事件

+

逻辑层处理MasterPartition的同步事件,向其对应的从同步数据。

+

1,读取MasterPartition Binlog信息后,将BinlogOffsetInfo记录到SlaveNode自己的window中。

+

2,将Binlog暂存到临时的待发送队列中。

+

3,辅助线程(Auxiliary thread) 定时将临时待发送队列的数据通过RM的传输层发送给对应的slave节点。

+

4,收到slave的BinlogSyncResponse之后,得知slave收到的BinlogOffset信息,更新SlaveNode window,重复1流程继续同步

+

为了控制每个SlaveNode同步的速度,避免某几个SlaveNode占用过多资源,为每一个SlaveNode设置了window。如下图所示,Pika收到了BinlogOffset为100到200的ack response,从window中移除BinlogOffset位于100到200的元素,之后继续发送BinlogOffset为1100和1200的binlog,对应的BinlogOffset添加至window中。

+

image

+

SlavePartition 同步事件

+

逻辑层处理SlavePartition的同步事件,收到master发送的同步数据,向master发相应的response信息。

+

1,按照解析出的Partition信息,被分配到对应的线程处理binlog写入任务。

+

2,线程写入binlog之后,调用传输层发送BinlogSyncResponse信息。

+

3,根据binlog的key分配给对应的线程处理写入db任务。

+ + \ No newline at end of file diff --git "a/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/\345\277\253\347\205\247\345\274\217\345\244\207\344\273\275/index.html" "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/\345\277\253\347\205\247\345\274\217\345\244\207\344\273\275/index.html" new file mode 100644 index 0000000..e7193d2 --- /dev/null +++ "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/\345\277\253\347\205\247\345\274\217\345\244\207\344\273\275/index.html" @@ -0,0 +1,37 @@ + + + + + +快照式备份 | PikiwiDB(Pika) + + + + + + + + + +

快照式备份

原理

+

不同于 Redis,Pika 的数据主要存储在磁盘中,这就使得其在做数据备份时有天然的优势,可以直接通过文件拷贝实现 实现

+

+

流程

+
    +
  • 打快照:阻写(阻止客户端进行写 db 操作),并在这个过程中获取快照内容
  • +
  • 异步线程拷贝文件:通过修改 Rocksdb 提供的 BackupEngine 拷贝快照中文件,这个过程中会阻止文件的删除
  • +
+

快照内容

+
    +
  • 当前 db 的所有文件名
  • +
  • manifest 文件大小
  • +
  • sequence_number
  • +
  • 同步点 +
      +
    • binlog filenum
    • +
    • offset
    • +
    +
  • +
+ + \ No newline at end of file diff --git "a/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/\346\225\264\344\275\223\346\212\200\346\234\257\346\236\266\346\236\204/index.html" "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/\346\225\264\344\275\223\346\212\200\346\234\257\346\236\266\346\236\204/index.html" new file mode 100644 index 0000000..34371f9 --- /dev/null +++ "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/\346\225\264\344\275\223\346\212\200\346\234\257\346\236\266\346\236\204/index.html" @@ -0,0 +1,28 @@ + + + + + +整体技术架构 | PikiwiDB(Pika) + + + + + + + + + +

整体技术架构

概述

+

Pika 一款开源的高性能持久化的NoSQL产品,兼容Redis协议,数据持久化存储到RocksDB存储引擎,具有两种运行模式: 经典模式(Classic) & 分布式模式(Sharding)。

+
    +
  • 经典模式(Classic): 即1主N从同步模式,1个主实例存储所有的数据,N个从实例完全镜像同步主实例的数据,每个实例支持多个DBs。DB默认从0开始,Pika的配置项databases可以设置最大DB数量。DB在Pika上的物理存在形式是一个文件目录。
  • +
  • 分布式模式(Sharding): Sharding模式下,将用户存储的数据集合称为Table,每个Table切分成多个分片,每个分片称为Slot,对于某一个KEY的数据由哈希算法计算决定属于哪个Slot。将所有Slots及其副本按照一定策略分散到所有的Pika实例中,每个Pika实例有一部分主Slot和一部分从Slot。在Sharding模式下,分主从的是Slot而不再是Pika实例。Slot在Pika上的物理存在形式是一个文件目录。
  • +
+

Pika可以通过配置文件中的instance-mode配置项,设置为classic和sharding,来选择运行经典模式(Classic)还是分布式模式(Sharding)的Pika。

+

1. 经典(主从)模式

+

+

2. 分布式模式

+

+ + \ No newline at end of file diff --git "a/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/\346\226\260\345\255\230\345\202\250\346\226\271\346\241\210\357\274\232\350\257\246\347\273\206\350\247\243\346\236\220/index.html" "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/\346\226\260\345\255\230\345\202\250\346\226\271\346\241\210\357\274\232\350\257\246\347\273\206\350\247\243\346\236\220/index.html" new file mode 100644 index 0000000..d75e3e8 --- /dev/null +++ "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/\346\226\260\345\255\230\345\202\250\346\226\271\346\241\210\357\274\232\350\257\246\347\273\206\350\247\243\346\236\220/index.html" @@ -0,0 +1,65 @@ + + + + + +新存储结构:详细解析 | PikiwiDB(Pika) + + + + + + + + + +

新存储结构:详细解析

整体架构

+

新的存储架构中,pika实例存储引擎包括内存缓存redis和硬盘持久存储RocksDB。每个pika实例由一个redis和多个RocksDB实例构成。

+

pika当前是将不同的数据类型放在不同的RocksDB实例中,线上使用过程中发现,同一个业务服务使用的数据类型一般集中在一两个数据类型中,无法发挥多RocksDB实例的优势。因此,pika新版本中计划不再按照数据类型区分RocksDB实例,而是通过column-family区分。单个pika节点的RocksDB实例个数根据物理机硬件配置决定,每个RocksDB实例使用独立的compaction线程池和flush线程池,初次之外每个RocksDB实例使用一个后台线程,该后台线程用来发起manual compaction以及对RocksDB中存储的数据进行定期的统计和巡检。

+

每个节点在启动时获取到当前节点持有的分片(目前不支持,需要进行代码开发),将分片排序并等分为RocksDB实例个数,保证每个分片持有的RocksDB实例个数近似相同。

+

数据格式

+

为了兼容redis协议,即为同一个数据类型的数据设置统一的过期时间值,复合数据类型中的meta信息还是需要保留,否则ttl/expire接口操作性能耗时增加。增加meta信息导致的数据写入过程中产生的查询开销,计划通过增加内存cache的方式进行缓解,即读meta时也是优先读内存缓存cache,读不到再查硬盘。不同的数据类型混合使用RocksDB实例,通过column family中进行区分。

+

数据存储格式与之前的blackwidow基本相同,只是key,value增加一些字段。

+

对于key来讲,前缀增加8字节的reserve保留字段以及4字节的slotID,后缀增加16字节的保留字段。

+

对于value来讲,在value最后统一增加:16字节的保留字段,8字节的数据的写入时间cdate,8字节的数据过期时间。

+

string结构

+
key格式
| reserve1 | db_id | slot_id | key | reserve2 |
| 8B | 2B | 2B | | 16B |

value格式
| value | reserve | cdate | timestamp |
| | 16B | 8B | 8B |

+

hash结构

+

meta数据格式

+
key格式
| reserve1 | db_id | slot_id | key | reserve2 |
| 8B | 2B | 2B | | 16B |

value格式
| hash_size | version | reserve | cdate | timestamp |
| 4B | 8B | 16B | 8B | 8B |

+

data数据格式

+
key格式
| reserve1 | db_id | slot_id | key size | key | version | field | reserve2 |
| 8B | 2B | 2B | 4B | | 8B | | 16B |

value格式
| hash value | reserved | cdate |
| | 16B | 8B |
+

List结构

+

meta数据格式

+
key格式
| reserve1 | db_id | slot_id | key | reserve2 |
| 8B | 2B | 2B | | 16B |

value格式
| list_size | version | left index | right index | reserve | cdate | timestamp |
| 4B | 8B | 8B | 8B | 16B | 8B | 8B |
+

data数据格式

+
key格式
| reserve1 | db_id | slot_id | key size | key | version | index | reserve2 |
| 8B | 2B | 2B | 4B | | 8B | 8B | 16B |

value格式
| value | reserve | cdate |
| | 16B | 8B |
+

set结构

+

meta数据格式

+
key格式
| reserve1 | db_id | slot_id | key | Reserved2 |
| 8B | 2B | 2B | | 16B |

value格式
| set_size | version | reserve | cdate | timestamp |
| 4B | 8B | 16B | 8B | 8B |

+

data数据格式

+
key格式
| reserve1 | db_id | slot_id | key size | key | Version | member | reserve2 |
| 8B | 2B | 2B | 4B | | 8B | | 16B |

value格式
| reserve | cdate |
| 16B | 8B |
+

zset结构

+

meta数据格式

+
key格式
| reserve1 | db_id | slot_id | key | reserve2 |
| 8B | 2B | 2B | | 16B |

value格式
| zset_size | version | reserved | cdate | timestamp |
| 4B | 8B | 16B | 8B | 8B |

+

member to score数据格式

+
key格式
| reserve1 | db_id | slot_id | key size | key | version | Field | reserve2 |
| 8B | 2B | 2B | 4B | | 8B | | 16B |

value格式
| score value | reserve | cdate |
| 8B | 16B | 8B |
+

score to member数据格式

+
key格式
| reserve1 | db_id | slot_id | key size | key | version | score | member | reserve2 |
| 8B | 2B | 2B | 4B | | 8B | 8B | | 16B |

value格式
| reserve | cdate |
| 16B | 8B |
+

无效数据清理

+

无效数据包括: 1. 设置了过期时间且已经过期的数据. 2. 业务重复写导致的相同key的老版本数据。3. 已经迁出的分片的旧数据。由于全量数据保存在RocksDB中,因此无效数据的清理主要是通过自定义的compactionFIlter实现。

+

对于string类型数据,compactionFIlter只需要比对value中的ttl值即可决定。对于复杂数据类型,由于data数据是按照field单独存储而且没有设置过期时间,因此在compaction复杂数据类型的data数据时,需要获取meta信息,包括key的ttl以及version。为减少compaction中读RocksDB导致的额外磁盘IO开销,将复杂数据类型的元信息缓存在内存存储引擎中。

+

对于已经迁出的分片的旧数据,需要考虑存量的已经迁出的无效数据的清理,同时还要保证如果路由表再一次变更,迁出的分片重新迁回到当前节点之后,之前的无效数据不要被读到。因此,在分片迁移完成路由表发生变更之后,迁出点节点在本地磁盘文件中记录一个迁出的slot_id,当前的sequence_number,以及最新的RocksDB filenumber。在自定义的compactionFilter执行时,会去检测当前key是否属于该slot_id,以及sequence_number是否小于记录的sequence_number,只有两个条件都满足,才认为这是数据是无效数据,才可以将数据清除掉。对于客户端的读请求和遍历请求,在读出数据之后也要比对是否属于无效数据。判断方式同理,也是比对记录的slot_id, sequence_number,以及RocksDB filenumber。

+

无效数据清理的触发规则分为两个,一个是RocksDB的auto compaction。另一个是pika发起的manual compaction。

+

为减少manual compaction对在线服务的影响,manual compaction的执行需要满足两个条件:1. 自定义触发时间段和触发间隔,如每隔两天执行一次,执行时间指定在凌晨低峰期。2. 限制每次执行compaction的数据量,防止manual compaction执行时间过长阻塞auto compaction。

+

RocksDB使用优化

+

blobdb使用优化

+

RocksDB支持了key-value分离的实现,即通过将大value存储到blob文件中,在sst文件中存储大value在blob文件的索引信息,从而减少写写放大,有效提升大value场景下的写入性能。pika依赖自定义的compactionFilter实现过期数据的处理,ttl存储在value中,因此在compaction过程中不可避免导致额外的blob文件IO。一种方法是修改sst文件中存储的blobindex,在blobindex的相同offset位置存储value的ttl值,这样compaction过程中对过期数据的清理的逻辑,就不需要查询blob文件,减少额外的磁盘IO。

+

dealslowkey

+

参考新浪微博的经验,当pika上层代码发现一个慢查询key时,发起一次manual compaction,compaction的范围即对应的key前缀对应的数据范围。性能待验证。

+

compact老的sst文件

+

参考新浪微博的经验,定期对最老的sst文件进行compaction可明显提升集群性能。看官方文档,貌似类似的功能RocksDB已经支持,链接如下:https://github.com/facebook/rocksdb/wiki/Leveled-Compaction#ttl。计划使用RocksDB官方的实现。

+

新技术探索

+

主要是包括了RocksDB的异步IO,协程,remote compaction等新技术的测试和落地。

+ + \ No newline at end of file diff --git "a/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/\346\226\260\345\255\230\345\202\250\347\273\223\346\236\204/index.html" "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/\346\226\260\345\255\230\345\202\250\347\273\223\346\236\204/index.html" new file mode 100644 index 0000000..e3458ad --- /dev/null +++ "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/\346\226\260\345\255\230\345\202\250\347\273\223\346\236\204/index.html" @@ -0,0 +1,65 @@ + + + + + +新存储结构 | PikiwiDB(Pika) + + + + + + + + + +

新存储结构

整体架构

+

新的存储架构中,pika实例存储引擎包括内存缓存redis和硬盘持久存储RocksDB。每个pika实例由一个redis和多个RocksDB实例构成。

+

pika当前是将不同的数据类型放在不同的RocksDB实例中,线上使用过程中发现,同一个业务服务使用的数据类型一般集中在一两个数据类型中,无法发挥多RocksDB实例的优势。因此,pika新版本中计划不再按照数据类型区分RocksDB实例,而是通过column-family区分。单个pika节点的RocksDB实例个数根据物理机硬件配置决定,每个RocksDB实例使用独立的compaction线程池和flush线程池,初次之外每个RocksDB实例使用一个后台线程,该后台线程用来发起manual compaction以及对RocksDB中存储的数据进行定期的统计和巡检。

+

每个节点在启动时获取到当前节点持有的分片(目前不支持,需要进行代码开发),将分片排序并等分为RocksDB实例个数,保证每个分片持有的RocksDB实例个数近似相同。

+

数据格式

+

为了兼容redis协议,即为同一个数据类型的数据设置统一的过期时间值,复合数据类型中的meta信息还是需要保留,否则ttl/expire接口操作性能耗时增加。增加meta信息导致的数据写入过程中产生的查询开销,计划通过增加内存cache的方式进行缓解,即读meta时也是优先读内存缓存cache,读不到再查硬盘。不同的数据类型混合使用RocksDB实例,通过column family中进行区分。

+

数据存储格式与之前的blackwidow基本相同,只是key,value增加一些字段。

+

对于key来讲,前缀增加8字节的reserve保留字段以及4字节的slotID,后缀增加16字节的保留字段。

+

对于value来讲,在value最后统一增加:16字节的保留字段,8字节的数据的写入时间cdate,8字节的数据过期时间。

+

string结构

+
key格式
| reserve1 | db_id | slot_id | key | reserve2 |
| 8B | 2B | 2B | | 16B |

value格式
| value | reserve | cdate | timestamp |
| | 16B | 8B | 8B |

+

hash结构

+

meta数据格式

+
key格式
| reserve1 | db_id | slot_id | key | reserve2 |
| 8B | 2B | 2B | | 16B |

value格式
| hash_size | version | reserve | cdate | timestamp |
| 4B | 8B | 16B | 8B | 8B |

+

data数据格式

+
key格式
| reserve1 | db_id | slot_id | key size | key | version | field | reserve2 |
| 8B | 2B | 2B | 4B | | 8B | | 16B |

value格式
| hash value | reserved | cdate |
| | 16B | 8B |
+

List结构

+

meta数据格式

+
key格式
| reserve1 | db_id | slot_id | key | reserve2 |
| 8B | 2B | 2B | | 16B |

value格式
| list_size | version | left index | right index | reserve | cdate | timestamp |
| 4B | 8B | 8B | 8B | 16B | 8B | 8B |
+

data数据格式

+
key格式
| reserve1 | db_id | slot_id | key size | key | version | index | reserve2 |
| 8B | 2B | 2B | 4B | | 8B | 8B | 16B |

value格式
| value | reserve | cdate |
| | 16B | 8B |
+

set结构

+

meta数据格式

+
key格式
| reserve1 | db_id | slot_id | key | Reserved2 |
| 8B | 2B | 2B | | 16B |

value格式
| set_size | version | reserve | cdate | timestamp |
| 4B | 8B | 16B | 8B | 8B |

+

data数据格式

+
key格式
| reserve1 | db_id | slot_id | key size | key | Version | member | reserve2 |
| 8B | 2B | 2B | 4B | | 8B | | 16B |

value格式
| reserve | cdate |
| 16B | 8B |
+

zset结构

+

meta数据格式

+
key格式
| reserve1 | db_id | slot_id | key | reserve2 |
| 8B | 2B | 2B | | 16B |

value格式
| zset_size | version | reserved | cdate | timestamp |
| 4B | 8B | 16B | 8B | 8B |

+

member to score数据格式

+
key格式
| reserve1 | db_id | slot_id | key size | key | version | Field | reserve2 |
| 8B | 2B | 2B | 4B | | 8B | | 16B |

value格式
| score value | reserve | cdate |
| 8B | 16B | 8B |
+

score to member数据格式

+
key格式
| reserve1 | db_id | slot_id | key size | key | version | score | member | reserve2 |
| 8B | 2B | 2B | 4B | | 8B | 8B | | 16B |

value格式
| reserve | cdate |
| 16B | 8B |
+

无效数据清理

+

无效数据包括: 1. 设置了过期时间且已经过期的数据. 2. 业务重复写导致的相同key的老版本数据。3. 已经迁出的分片的旧数据。由于全量数据保存在RocksDB中,因此无效数据的清理主要是通过自定义的compactionFIlter实现。

+

对于string类型数据,compactionFIlter只需要比对value中的ttl值即可决定。对于复杂数据类型,由于data数据是按照field单独存储而且没有设置过期时间,因此在compaction复杂数据类型的data数据时,需要获取meta信息,包括key的ttl以及version。为减少compaction中读RocksDB导致的额外磁盘IO开销,将复杂数据类型的元信息缓存在内存存储引擎中。

+

对于已经迁出的分片的旧数据,需要考虑存量的已经迁出的无效数据的清理,同时还要保证如果路由表再一次变更,迁出的分片重新迁回到当前节点之后,之前的无效数据不要被读到。因此,在分片迁移完成路由表发生变更之后,迁出点节点在本地磁盘文件中记录一个迁出的slot_id,当前的sequence_number,以及最新的RocksDB filenumber。在自定义的compactionFilter执行时,会去检测当前key是否属于该slot_id,以及sequence_number是否小于记录的sequence_number,只有两个条件都满足,才认为这是数据是无效数据,才可以将数据清除掉。对于客户端的读请求和遍历请求,在读出数据之后也要比对是否属于无效数据。判断方式同理,也是比对记录的slot_id, sequence_number,以及RocksDB filenumber。

+

无效数据清理的触发规则分为两个,一个是RocksDB的auto compaction。另一个是pika发起的manual compaction。

+

为减少manual compaction对在线服务的影响,manual compaction的执行需要满足两个条件:1. 自定义触发时间段和触发间隔,如每隔两天执行一次,执行时间指定在凌晨低峰期。2. 限制每次执行compaction的数据量,防止manual compaction执行时间过长阻塞auto compaction。

+

RocksDB使用优化

+

blobdb使用优化

+

RocksDB支持了key-value分离的实现,即通过将大value存储到blob文件中,在sst文件中存储大value在blob文件的索引信息,从而减少写写放大,有效提升大value场景下的写入性能。pika依赖自定义的compactionFilter实现过期数据的处理,ttl存储在value中,因此在compaction过程中不可避免导致额外的blob文件IO。一种方法是修改sst文件中存储的blobindex,在blobindex的相同offset位置存储value的ttl值,这样compaction过程中对过期数据的清理的逻辑,就不需要查询blob文件,减少额外的磁盘IO。

+

dealslowkey

+

参考新浪微博的经验,当pika上层代码发现一个慢查询key时,发起一次manual compaction,compaction的范围即对应的key前缀对应的数据范围。性能待验证。

+

compact老的sst文件

+

参考新浪微博的经验,定期对最老的sst文件进行compaction可明显提升集群性能。看官方文档,貌似类似的功能RocksDB已经支持,链接如下:https://github.com/facebook/rocksdb/wiki/Leveled-Compaction#ttl。计划使用RocksDB官方的实现。

+

新技术探索

+

主要是包括了RocksDB的异步IO,协程,remote compaction等新技术的测试和落地。

+ + \ No newline at end of file diff --git "a/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/\346\227\247\345\255\230\345\202\250\347\273\223\346\236\204/index.html" "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/\346\227\247\345\255\230\345\202\250\347\273\223\346\236\204/index.html" new file mode 100644 index 0000000..083305f --- /dev/null +++ "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/\346\227\247\345\255\230\345\202\250\347\273\223\346\236\204/index.html" @@ -0,0 +1,78 @@ + + + + + +旧存储结构 | PikiwiDB(Pika) + + + + + + + + + +

旧存储结构

Blackwidow 本质上是基于 rocksdb 的封装,使本身只支持 kv 存储的 rocksdb 能够支持多种数据结构, 目前 Blackwidow 支持五种数据结构的存储:String 结构(实际上就是存储 key, value), Hash 结构,List 结构,Set 结构和 ZSet 结构, 因为 Rocksdb 的存储方式只有 kv 一种, 所以上述五种数据结构最终都要落盘到 Rocksdb 的 kv 存储方式上,下面我们展示 Blackwidow 和 rocksdb 的关系并且说明我们是如何用 kv 来模拟多数据结构的。

+

1. String 结构的存储

+

String 本质上就是 Key, Value, 我们知道 Rocksdb 本身就是支持 kv 存储的, 我们为了实现 Redis 中的 expire 功能,所以在 value 后面添加了 4 Bytes 用于存储 timestamp, 作为最后 Rocksdb 落盘的 kv 格式,下面是具体的实现方式:

+

+

如果我们没有对该 String 对象设置超时时间,则 timestamp 存储的值就是默认值 0, 否则就是该对象过期时间的时间戳, 每次我们获取一个 String 对象的时候, 首先会解析 Value 部分的后四字节, 获取到 timestamp 做出判断之后再返回结果。

+

2. Hash 结构的存储

+

blackwidow 中的 hash 表由两部分构成,元数据(meta_key, meta_value), 和普通数据(data_key, data_value), 元数据中存储的主要是 hash 表的一些信息, 比如说当前 hash 表的域的数量以及当前 hash 表的版本号和过期时间(用做秒删功能), 而普通数据主要就是指的同一个 hash 表中一一对应的 field 和 value,作为具体最后 Rocksdb 落盘的 kv 格式,下面是具体的实现方式:

+
    +
  1. 每个 hash 表的 meta_key 和 meta_value 的落盘方式:
  2. +
+

meta_key 实际上就是 hash 表的 key, 而 meta_value 由三个部分构成: 4Bytes 的 Hash size(用于存储当前 hash 表的大小) + 4Bytes 的 Version(用于秒删功能) + 4Bytes 的 Timestamp(用于记录我们给这个 Hash 表设置的超时时间的时间戳, 默认为 0)

+
    +
  1. hash 表中 data_key 和 data_value 的落盘方式:
  2. +
+

data_key 由四个部分构成: 4Bytes 的 Key size(用于记录后面追加的 key 的长度,便与解析) + key 的内容 + 4Bytes 的 Version + Field 的内容, 而 data_value 就是 hash 表某个 field 对应的 value。

+
    +
  1. 如果我们需要查找一个 hash 表中的某一个 field 对应的 value, 我们首先会获取到 meta_value 解析出其中的 timestamp 判断这个 hash 表是否过期, 如果没有过期, 我们可以拿到其中的 version, 然后我们使用 key, version,和 field 拼出 data_key, 进而找到对应的 data_value(如果存在的话)
  2. +
+

3. List 结构的存储

+

blackwidow 中的 list 由两部分构成,元数据(meta_key, meta_value), 和普通数据(data_key, data_value), 元数据中存储的主要是 list 链表的一些信息, 比如说当前 list 链表结点的的数量以及当前 list 链表的版本号和过期时间(用做秒删功能), 还有当前 list 链表的左右边界(由于 nemo 实现的链表结构被吐槽 lrange 效率低下,所以这次 blackwidow 我们底层用数组来模拟链表,这样 lrange 速度会大大提升,因为结点存储都是有序的), 普通数据实际上就是指的 list 中每一个结点中的数据,作为具体最后 Rocksdb 落盘的 kv 格式,下面是具体的实现方式

+
    +
  1. 每个 list 链表的 meta_key 和 meta_value 的落盘方式:
  2. +
+

meta_key 实际上就是 list 链表的 key, 而 meta_value 由五个部分构成: 8Bytes 的 List size(用于存储当前链表中总共有多少个结点) + 4Bytes 的 Version(用于秒删功能) + 4Bytes 的 Timestamp(用于记录我们给这个 List 链表设置的超时时间的时间戳, 默认为 0) + 8Bytes 的 Left Index(数组的左边界) + 8Bytes 的 Right Index(数组的右边界)

+
    +
  1. list 链表中 data_key 和 data_value 的落盘方式:
  2. +
+

data_key 由四个部分构成: 4Bytes 的 Key size(用于记录后面追加的 key 的长度,便与解析) + key 的内容 + 4Bytes 的 Version + 8Bytes 的 Index(这个记录的就是当前结点的在这个 list 链表中的索引), 而 data_value 就是 list 链表该 node 中存储的值

+

4. Set 结构的存储

+

blackwidow 中的 set 由两部分构成,元数据(meta_key, meta_value), 和普通数据(data_key, data_value), 元数据中存储的主要是 set 集合的一些信息, 比如说当前 set 集合 member 的数量以及当前 set 集合的版本号和过期时间(用做秒删功能), 普通数据实际上就是指的 set 集合中的 member,作为具体最后 Rocksdb 落盘的 kv 格式,下面是具体的实现方式:

+
    +
  1. 每个 set 集合的 meta_key 和 meta_value 的落盘方式:
  2. +
+

meta_key 实际上就是 set 集合的 key, 而 meta_value 由三个部分构成: 4Bytes 的 Set size(用于存储当前 Set 集合的大小) + 4Bytes 的 Version(用于秒删功能) + 4Bytes 的 Timestamp(用于记录我们给这个 set 集合设置的超时时间的时间戳, 默认为 0)

+
    +
  1. set 集合中 data_key 和 data_value 的落盘方式:
  2. +
+

data_key 由四个部分构成: 4Bytes 的 Key size(用于记录后面追加的 key 的长度,便与解析) + key 的内容 + 4Bytes 的 Version + member 的内容, 由于 set 集合只需要存储 member, 所以 data_value 实际上就是空串

+

5. ZSet 结构的存储

+

blackwidow 中的 zset 由两部部分构成,元数据(meta_key, meta_value), 和普通数据(data_key, data_value), 元数据中存储的主要是 zset 集合的一些信息, 比如说当前 zset 集合 member 的数量以及当前 zset 集合的版本号和过期时间(用做秒删功能), 而普通数据就是指的 zset 中每个 member 以及对应的 score, 由于 zset 这种数据结构比较特殊,需要按照 memer 进行排序,也需要按照 score 进行排序, 所以我们对于每一个 zset 我们会按照不同的格式存储两份普通数据, 在这里我们称为 member to score 和 score to member,作为具体最后 Rocksdb 落盘的 kv 格式,下面是具体的实现方式:

+
    +
  1. 每个 zset 集合的 meta_key 和 meta_value 的落盘方式:
  2. +
+

meta_key 实际上就是 zset 集合的 key, 而 meta_value 由三个部分构成: 4Bytes 的 ZSet size(用于存储当前 zSet 集合的大小) + 4Bytes 的 Version(用于秒删功能) + 4Bytes 的 Timestamp(用于记录我们给这个 Zset 集合设置的超时时间的时间戳, 默认为 0)

+
    +
  1. 每个 zset 集合的 data_key 和 data_value 的落盘方式(member to score):
  2. +
+

member to socre 的 data_key 由四个部分构成:4Bytes 的 Key size(用于记录后面追加的 key 的长度,便与解析) + key 的内容 + 4Bytes 的 Version + member 的内容, data_value 中存储的其 member 对应的 score 的值,大小为 8 个字节,由于 rocksdb 默认是按照字典序进行排列的,所以同一个 zset 中不同的 member 就是按照 member 的字典序来排列的(同一个 zset 的 key size, key, 以及 version,也就是前缀都是一致的,不同的只有末端的 member).

+
    +
  1. 每个 zset 集合的 data_key 和 data_value 的落盘方式(score to member):
  2. +
+

score to member 的 data_key 由五个部分构成:4Bytes 的 Key size(用于记录后面追加的 key 的长度,便与解析) + key 的内容 + 4Bytes 的 Version + 8Bytes 的 Score + member 的内容, 由于 score 和 member 都已经放在 data_key 中进行存储了所以 data_value 就是一个空串,无需存储其他内容了,对于 score to member 中的 data_key 我们自己实现了 rocksdb 的 comparator,同一个 zset 中 score to member 的 data_key 会首先按照 score 来排序, 在 score 相同的情况下再按照 member 来排序

+

Blackwidow 相对于 Nemo 有哪些优势

+
    +
  1. Blackwidow 采用了 rocksdb 的 column families 的新特性,将元数据和实际数据分开存放(对应于上面的 meta 数据和 data 数据), 这种存储方式相对于 Nemo 将 meta, data 混在一起存放更加合理, 并且可以提升查找效率(比如 info keyspace 的效率会大大提升)
  2. +
  3. Blackwidow 中参数传递大量采用 Slice 而 Nemo 中采用的是 std::string, 所以 Nemo 会有很多没有必要的 string 对象的构造函数以及析构函数的调用,造成额外的资源消耗,而 Blackwidow 则不会有这个问题
  4. +
  5. Blackwidow 对 kv 模拟多数据结构的存储格式上做了重新设计(具体可以参考 Nemo 引擎数据存储格式和本篇文章),使之前在 Nemo 上出现的一些无法解决的性能问题得以解决,所以 Blackwidow 的多数据结构在某些场景下性能远远优于 Nemo
  6. +
  7. 原来 Nemo 对多数据结构的 Key 的长度最大只能支持到 256 Bytes,而 Blackwidow 经过重新设计,放开了多数据结构 Key 长度的这个限制
  8. +
  9. Blackwidow 相对于 Nemo 更加节省空间,Nemo 由于需要 nemo-rocksdb 的支持,所以不管在 meta 还是 data 数据部分都追加了 version 和 timestamp 这些信息,并且为了区分 meta_key 和 data_key, 在最前面加入 s 和 S(拿 Set 数据结构打比方),Blackwidow 在这方面做了优化,使同样的数据量下 Blackwidow 所占用的空间比 Nemo 要小(举个例子,Blackwidow 中 List 结构中的一个 Node 就比 Nemo 中的一个 Node 节省了 16 Bytes 的空间)
  10. +
  11. Blackwidow 在锁的实现上参照了 RocksDB 事务里锁的实现方法,而弃用了之前 Nemo 的行锁,所以在多线程对同一把锁有抢占的情况下性能会有所提升
  12. +
+ + \ No newline at end of file diff --git "a/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/\347\272\277\347\250\213\346\250\241\345\236\213/index.html" "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/\347\272\277\347\250\213\346\250\241\345\236\213/index.html" new file mode 100644 index 0000000..07ea8b9 --- /dev/null +++ "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/\347\272\277\347\250\213\346\250\241\345\236\213/index.html" @@ -0,0 +1,31 @@ + + + + + +线程模型 | PikiwiDB(Pika) + + + + + + + + + +

线程模型

pika使用的是多线程模型,使用多个工作线程来进行读写操作,由底层blackwidow引擎来保证线程安全,线程分为12种:

+
    +
  • PikaServer:主线程
  • +
  • DispatchThread:监听1个端口,接收用户连接请求
  • +
  • WorkerThread:存在多个(用户配置),每个线程里有若干个用户客户端的连接,负责接收用户命令,然后将命令封装成一个Task扔到ThreadPool执行,任务执行完毕之后由该线程将reply返回给用户
  • +
  • ThreadPool:线程池中的线程数量由用户配置,执行WorkerThread调度过来的Task, Task的内容主要是写DB和写Binlog
  • +
  • PikaAuxiliaryThread:辅助线程,处理同步过程中状态机状态的切换,主从之间心跳的发送以及超时检查
  • +
  • PikaReplClient:本质上是一个Epoll线程(与其他Pika实例的PikaReplServer进行通信)加上一个由若干线程组成的线程数组(异步的处理写Binlog以及写DB的任务)
  • +
  • PikaReplServer:本质上是一个Epoll线程(与其他Pika实例的PikaReplClient进行通信)加上一个由若干线程组成的线程池(处理同步的请求以及根据从库返回的Ack更新Binlog滑窗)
  • +
  • KeyScanThread:在这个线程中执行info keyspace 1触发的统计Key数量的任务
  • +
  • BgSaveThread:对指定的DB进行Dump操作,以及全同步的时候发送Dump数据到从库(对一个DB执行全同步是先后向Thread中扔了BgSave以及DBSync两个任务从而保证顺序)
  • +
  • PurgeThread:用于清理过期的Binlog文件
  • +
  • PubSubThread:用于支持PubSub相关功能
  • +
+ + \ No newline at end of file diff --git "a/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/\351\224\201\347\232\204\345\272\224\347\224\250/index.html" "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/\351\224\201\347\232\204\345\272\224\347\224\250/index.html" new file mode 100644 index 0000000..8382ba8 --- /dev/null +++ "b/build/docs/\350\256\276\350\256\241\344\270\216\345\256\236\347\216\260/\351\224\201\347\232\204\345\272\224\347\224\250/index.html" @@ -0,0 +1,54 @@ + + + + + +锁的应用 | PikiwiDB(Pika) + + + + + + + + + +

锁的应用

pika作为类redis的存储系统,为了弥补在性能上的不足,在整个系统中大量使用多线程的结构,涉及到多线程编程,势必需要为线程加锁来保证数据访问的一致性和有效性。其中主要用到了三种锁

+
    +
  1. 互斥锁
  2. +
  3. 读写锁
  4. +
  5. 行锁
  6. +
+

读写锁

+

应用场景

+

应用挂起指令,在挂起指令的执行中,会添加写锁,以确保,此时没有其他指令执行。其他的普通指令在会添加读锁,可以并行访问。 +其中挂起指令有:

+
    +
  1. trysync
  2. +
  3. bgsave
  4. +
  5. flushall
  6. +
  7. readonly
  8. +
+

作用和意义

+

保证当前服务器在执行挂起指令时,起到阻写作用。

+

行锁

+

行锁,用于对一个key加锁,保证同一时间只有一个线程对一个key进行操作。

+

作用和意义:

+

pika中存取的数据都是类key,value数据,不同key所对应的数据完全独立,所以只需要对key加锁可以保证数据在并发访问时的一致性,行锁相对来说,锁定粒度小,也可以保证数据访问的高效性。

+

应用场景

+

在pika系统中,对于数据库的操作都需要添加行锁,主要在应用于两个地方,在系统上层指令过程中和在数据引擎层面。在pika系统中,对于写指令(会改变数据状态,如SET,HSET)需要除了更新数据库状态,还涉及到pika的增量同步,需要在binlog中添加所执行的写指令,用于保证master和slave的数据库状态一致。故一条写指令的执行,主要有两个部分:

+
    +
  1. 更改数据库状态
  2. +
  3. 将指令添加到binlog中
  4. +
+

其加锁情况,如下图: +

+

设计的平衡

+

在图中可以看到,对同一个key,加了两次行锁,在实际应用中,pika上所加的锁就已经能够保证数据访问的正确性。如果只是为了pika所需要的业务,blackwidow层面使用行锁是多余的,但是blackwidow的设计初衷就是通过对rocksdb的改造和封装提供一套完整的类redis数据访问的解决方案,而不仅仅是为pika提供数据库引擎。这种设计思路也是秉承了Unix中的设计原则:Write programs that do one thing and do it well。

+

这样设计大大降低了pika与blackwidow之间的耦合,也使得blackwidow可以被单独拿出来测试和使用,在pika中的数据迁移工具就是完全使用blackwidow来完成,不必依赖任何pika相关的东西。另外对于blackwidow感兴趣或者有需求的团队也可以直接将blackwidow作为数据库引擎而不需要修改任何代码就能使用完整的数据访问功能。

+

具体实现

+

在pika系统中,一把行锁就可以维护所有key。在行锁的实现上是将一个key与一把互斥锁相绑定,并将其放入哈希表中维护,来保证每次访问key的线程只有一个,但是不可能也不需要为每一个key保留一把互斥锁,只需要当有多条线程访问同一个key时才需要锁,在所有线程都访问结束之后,就可以销毁这个绑定key的互斥锁,释放资源。具体实现如下:

+
class RecordLock {
public:
RecordLock(port::RecordMutex *mu, const std::string &key)
: mu_(mu), key_(key) {
mu_->Lock(key_);
}
~RecordLock() { mu_->Unlock(key_); }

private:
port::RecordMutex *const mu_;
std::string key_;

// No copying allowed
RecordLock(const RecordLock&);
void operator=(const RecordLock&);
};

void RecordMutex::Lock(const std::string &key) {
mutex_.Lock();
std::unordered_map<std::string, RefMutex *>::const_iterator it = records_.find(key);

if (it != records_.end()) {
//log_info ("tid=(%u) >Lock key=(%s) exist, map_size=%u", pthread_self(), key.c_str(), records_.size());
RefMutex *ref_mutex = it->second;
ref_mutex->Ref();
mutex_.Unlock();

ref_mutex->Lock();
//log_info ("tid=(%u) <Lock key=(%s) exist", pthread_self(), key.c_str());
} else {
//log_info ("tid=(%u) >Lock key=(%s) new, map_size=%u ++", pthread_self(), key.c_str(), records_.size());
RefMutex *ref_mutex = new RefMutex();

records_.insert(std::make_pair(key, ref_mutex));
ref_mutex->Ref();
mutex_.Unlock();

ref_mutex->Lock();
//log_info ("tid=(%u) <Lock key=(%s) new", pthread_self(), key.c_str());
}
}

+

完整代码可参考:slash_mutex.cc slash_mutex.h

+ + \ No newline at end of file diff --git a/build/img/PikiwiDB-Logo.png b/build/img/PikiwiDB-Logo.png new file mode 100644 index 0000000..611dd1f Binary files /dev/null and b/build/img/PikiwiDB-Logo.png differ diff --git a/build/img/logo.ico b/build/img/logo.ico new file mode 100644 index 0000000..0329a96 Binary files /dev/null and b/build/img/logo.ico differ diff --git a/build/index.html b/build/index.html new file mode 100644 index 0000000..a1c4d66 --- /dev/null +++ b/build/index.html @@ -0,0 +1,18 @@ + + + + + +PikiwiDB(Pika) | PikiwiDB(Pika) + + + + + + + + + +

为海量数据存储设计的高可用键值数据库

分布式架构

为大规模数据存储而规划,支持结合 Proxy 映射软件构建分布式数据集群

大规模数据存储

支持TB级别的高性能数据存储

快速故障转移

在单点故障产生之时可以快速恢复服务,最大程度减少对业务的冲击

兼容 Redis

缘起于对接 360 内部的数据存储需求,并被应用于替换 360 内部的 Redis 服务,顺利实现迁移

社区驱动发展

在开放原子基金会指导下由开源社区驱动项目改进,吸收外部反馈,满足行业需求

协议友好

采行 BSD 协议开放源代码,欢迎根据自身需要定制 PikiwiDB

+ + \ No newline at end of file diff --git a/build/sitemap.xml b/build/sitemap.xml new file mode 100644 index 0000000..910e8cc --- /dev/null +++ b/build/sitemap.xml @@ -0,0 +1 @@ +https://www.pikiwidb.com/blogweekly0.5https://www.pikiwidb.com/blog/archiveweekly0.5https://www.pikiwidb.com/blog/Pika-3.5.0weekly0.5https://www.pikiwidb.com/blog/Pika-3.5.0weekly0.5https://www.pikiwidb.com/blog/Pika-3.5.1weekly0.5https://www.pikiwidb.com/blog/Pika-3.5.3weekly0.5https://www.pikiwidb.com/blog/Pika-3.5.4weekly0.5https://www.pikiwidb.com/blog/pika-blackwidowweekly0.5https://www.pikiwidb.com/blog/Pika-Tools-Port-Binweekly0.5https://www.pikiwidb.com/blog/PikiwiDB-Pika--4.0.0weekly0.5https://www.pikiwidb.com/docs/%E4%BD%BF%E7%94%A8%E4%B8%8E%E8%BF%90%E7%BB%B4/weekly0.5https://www.pikiwidb.com/docs/%E4%BD%BF%E7%94%A8%E4%B8%8E%E8%BF%90%E7%BB%B4/page%20info%20%E4%BF%A1%E6%81%AF%E8%AF%B4%E6%98%8E/weekly0.5https://www.pikiwidb.com/docs/%E4%BD%BF%E7%94%A8%E4%B8%8E%E8%BF%90%E7%BB%B4/Pika%20%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5/weekly0.5https://www.pikiwidb.com/docs/%E4%BD%BF%E7%94%A8%E4%B8%8E%E8%BF%90%E7%BB%B4/%E5%88%86%E5%B8%83%E5%BC%8F%E6%A8%A1%E5%BC%8F%E7%AE%80%E5%8D%95%E6%95%99%E7%A8%8B/weekly0.5https://www.pikiwidb.com/docs/%E4%BD%BF%E7%94%A8%E4%B8%8E%E8%BF%90%E7%BB%B4/%E5%88%86%E7%89%87%E6%95%99%E7%A8%8B/weekly0.5https://www.pikiwidb.com/docs/%E4%BD%BF%E7%94%A8%E4%B8%8E%E8%BF%90%E7%BB%B4/%E5%89%AF%E6%9C%AC%E4%B8%80%E8%87%B4%E6%80%A7%EF%BC%88%E4%BD%BF%E7%94%A8%E6%96%87%E6%A1%A3%EF%BC%89/weekly0.5https://www.pikiwidb.com/docs/%E4%BD%BF%E7%94%A8%E4%B8%8E%E8%BF%90%E7%BB%B4/%E5%89%AF%E6%9C%AC%E4%B8%80%E8%87%B4%E6%80%A7%EF%BC%88%E8%AE%BE%E8%AE%A1%E6%96%87%E6%A1%A3%EF%BC%89/weekly0.5https://www.pikiwidb.com/docs/%E4%BD%BF%E7%94%A8%E4%B8%8E%E8%BF%90%E7%BB%B4/%E5%A4%9A%E5%BA%93%E7%89%88%E5%91%BD%E4%BB%A4/weekly0.5https://www.pikiwidb.com/docs/%E4%BD%BF%E7%94%A8%E4%B8%8E%E8%BF%90%E7%BB%B4/%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/weekly0.5https://www.pikiwidb.com/docs/%E4%BD%BF%E7%94%A8%E4%B8%8E%E8%BF%90%E7%BB%B4/%E5%B7%AE%E5%BC%82%E5%8C%96%E5%91%BD%E4%BB%A4/weekly0.5https://www.pikiwidb.com/docs/%E4%BD%BF%E7%94%A8%E4%B8%8E%E8%BF%90%E7%BB%B4/%E6%95%B0%E6%8D%AE%E7%9B%AE%E5%BD%95/weekly0.5https://www.pikiwidb.com/docs/%E4%BD%BF%E7%94%A8%E4%B8%8E%E8%BF%90%E7%BB%B4/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%8A%B6%E6%80%81%E7%9B%91%E6%8E%A7/weekly0.5https://www.pikiwidb.com/docs/%E4%BD%BF%E7%94%A8%E4%B8%8E%E8%BF%90%E7%BB%B4/%E7%AE%A1%E7%90%86%E6%8C%87%E4%BB%A4/weekly0.5https://www.pikiwidb.com/docs/%E4%BD%BF%E7%94%A8%E4%B8%8E%E8%BF%90%E7%BB%B4/%E8%87%AA%E5%8A%A8%E5%AE%B9%E7%81%BE/weekly0.5https://www.pikiwidb.com/docs/%E4%BD%BF%E7%94%A8%E4%B8%8E%E8%BF%90%E7%BB%B4/%E8%AE%A2%E9%98%85/weekly0.5https://www.pikiwidb.com/docs/%E4%BD%BF%E7%94%A8%E4%B8%8E%E8%BF%90%E7%BB%B4/%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E8%AF%B4%E6%98%8E/weekly0.5https://www.pikiwidb.com/docs/%E5%BA%8F%E8%A8%80/weekly0.5https://www.pikiwidb.com/docs/%E5%BA%8F%E8%A8%80/FAQ/weekly0.5https://www.pikiwidb.com/docs/%E5%BA%8F%E8%A8%80/%E6%94%AF%E6%8C%81%E7%9A%84%20Redis%20%E6%8E%A5%E5%8F%A3%E4%B8%8E%E5%85%BC%E5%AE%B9%E6%83%85%E5%86%B5/weekly0.5https://www.pikiwidb.com/docs/%E5%BA%8F%E8%A8%80/%E7%AE%80%E4%BB%8B/weekly0.5https://www.pikiwidb.com/docs/%E5%BC%80%E5%8F%91%E6%96%87%E6%A1%A3/weekly0.5https://www.pikiwidb.com/docs/%E5%BC%80%E5%8F%91%E6%96%87%E6%A1%A3/coding-style/weekly0.5https://www.pikiwidb.com/docs/%E5%BC%80%E5%8F%91%E6%96%87%E6%A1%A3/%E7%BC%96%E7%A0%81%E8%A7%84%E8%8C%83/weekly0.5https://www.pikiwidb.com/docs/%E6%80%A7%E8%83%BD%E4%B8%8E%E4%BC%98%E5%8C%96/weekly0.5https://www.pikiwidb.com/docs/%E6%80%A7%E8%83%BD%E4%B8%8E%E4%BC%98%E5%8C%96/3.2.x%20%E6%80%A7%E8%83%BD/weekly0.5https://www.pikiwidb.com/docs/%E6%80%A7%E8%83%BD%E4%B8%8E%E4%BC%98%E5%8C%96/Pika%203.5%20%E5%8F%82%E6%95%B0%E4%BC%98%E5%8C%96%E6%89%8B%E5%86%8C/weekly0.5https://www.pikiwidb.com/docs/%E6%80%A7%E8%83%BD%E4%B8%8E%E4%BC%98%E5%8C%96/Pika%20%E4%BC%98%E5%8C%96%E6%A1%88%E4%BE%8B/weekly0.5https://www.pikiwidb.com/docs/%E6%80%A7%E8%83%BD%E4%B8%8E%E4%BC%98%E5%8C%96/Pika%20%E4%BC%98%E5%8C%96%E6%A1%88%E4%BE%8B/%E5%96%9C%E9%A9%AC%E6%8B%89%E9%9B%85%20Redis%20%E4%B8%8E%20Pika%20%E7%BC%93%E5%AD%98%E4%BD%BF%E7%94%A8%E5%86%9B%E8%A7%84/weekly0.5https://www.pikiwidb.com/docs/%E6%80%A7%E8%83%BD%E4%B8%8E%E4%BC%98%E5%8C%96/Pika%20%E4%BC%98%E5%8C%96%E6%A1%88%E4%BE%8B/%E8%B0%83%E6%95%B4%20max-write-buffer-size%20%E4%BC%98%E5%8C%96%20pika%20%E6%80%A7%E8%83%BD10%E5%80%8D%E7%9A%84%E6%A1%88%E4%BE%8B/weekly0.5https://www.pikiwidb.com/docs/%E6%80%A7%E8%83%BD%E4%B8%8E%E4%BC%98%E5%8C%96/Pika%20%E5%86%85%E5%AD%98%E4%BD%BF%E7%94%A8/weekly0.5https://www.pikiwidb.com/docs/%E6%80%A7%E8%83%BD%E4%B8%8E%E4%BC%98%E5%8C%96/Redis%20%E4%B8%8E%20Pika%20scan%20%E6%80%A7%E8%83%BD%E5%AF%B9%E6%AF%94/weekly0.5https://www.pikiwidb.com/docs/%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0/weekly0.5https://www.pikiwidb.com/docs/%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0/NoSQL%20%E5%8E%9F%E7%90%86%E6%A6%82%E8%BF%B0/weekly0.5https://www.pikiwidb.com/docs/%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0/Pika%20%E4%B8%8E%20Codis/weekly0.5https://www.pikiwidb.com/docs/%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0/Pika%20%E4%BC%A0%E7%81%AB%E8%AE%A1%E5%88%92/weekly0.5https://www.pikiwidb.com/docs/%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0/Pika%20%E4%BC%A0%E7%81%AB%E8%AE%A1%E5%88%92/%E4%B8%BB%E4%BB%8E%E5%90%8C%E6%AD%A5/weekly0.5https://www.pikiwidb.com/docs/%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0/Pika%20%E4%BC%A0%E7%81%AB%E8%AE%A1%E5%88%92/%E7%BA%BF%E7%A8%8B%E6%A8%A1%E5%9E%8B/weekly0.5https://www.pikiwidb.com/docs/%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0/Pika%20%E4%BC%A0%E7%81%AB%E8%AE%A1%E5%88%92/%E8%AF%BB%E5%86%99%E6%B5%81%E7%A8%8B/weekly0.5https://www.pikiwidb.com/docs/%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0/Pika%20%E6%BA%90%E7%A0%81%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/weekly0.5https://www.pikiwidb.com/docs/%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0/Pika%20%E6%BA%90%E7%A0%81%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/Pika%20%E5%92%8C%20RockSDB%20%E7%9A%84%E5%AF%B9%E6%8E%A5/weekly0.5https://www.pikiwidb.com/docs/%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0/Pika%20%E6%BA%90%E7%A0%81%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/Pika%20%E7%9A%84%E5%91%BD%E4%BB%A4%E6%89%A7%E8%A1%8C%E6%A1%86%E6%9E%B6/weekly0.5https://www.pikiwidb.com/docs/%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0/Pika%20%E6%BA%90%E7%A0%81%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/PubSub%20%E6%9C%BA%E5%88%B6/weekly0.5https://www.pikiwidb.com/docs/%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0/Pika%20%E6%BA%90%E7%A0%81%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E9%80%9A%E4%BF%A1%E5%92%8C%E7%BA%BF%E7%A8%8B%E6%A8%A1%E5%9E%8B/weekly0.5https://www.pikiwidb.com/docs/%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0/%E4%B8%BB%E4%BB%8E%E5%90%8C%E6%AD%A5/weekly0.5https://www.pikiwidb.com/docs/%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0/%E5%85%A8%E5%90%8C%E6%AD%A5/weekly0.5https://www.pikiwidb.com/docs/%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0/%E5%89%AF%E6%9C%AC%E4%B8%80%E8%87%B4%E6%80%A7/weekly0.5https://www.pikiwidb.com/docs/%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0/%E5%A2%9E%E9%87%8F%E5%90%8C%E6%AD%A5/weekly0.5https://www.pikiwidb.com/docs/%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0/%E5%BF%AB%E7%85%A7%E5%BC%8F%E5%A4%87%E4%BB%BD/weekly0.5https://www.pikiwidb.com/docs/%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0/%E6%95%B4%E4%BD%93%E6%8A%80%E6%9C%AF%E6%9E%B6%E6%9E%84/weekly0.5https://www.pikiwidb.com/docs/%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0/%E6%96%B0%E5%AD%98%E5%82%A8%E6%96%B9%E6%A1%88%EF%BC%9A%E8%AF%A6%E7%BB%86%E8%A7%A3%E6%9E%90/weekly0.5https://www.pikiwidb.com/docs/%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0/%E6%96%B0%E5%AD%98%E5%82%A8%E7%BB%93%E6%9E%84/weekly0.5https://www.pikiwidb.com/docs/%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0/%E6%97%A7%E5%AD%98%E5%82%A8%E7%BB%93%E6%9E%84/weekly0.5https://www.pikiwidb.com/docs/%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0/%E7%BA%BF%E7%A8%8B%E6%A8%A1%E5%9E%8B/weekly0.5https://www.pikiwidb.com/docs/%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0/%E9%94%81%E7%9A%84%E5%BA%94%E7%94%A8/weekly0.5https://www.pikiwidb.com/weekly0.5 \ No newline at end of file diff --git "a/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\345\215\207\347\272\247\346\214\207\345\215\227/index.md" "b/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\345\215\207\347\272\247\346\214\207\345\215\227/index.md" deleted file mode 100644 index 92a2fca..0000000 --- "a/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\345\215\207\347\272\247\346\214\207\345\215\227/index.md" +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "升级指南" -sidebar_position: 140 ---- \ No newline at end of file diff --git "a/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\345\215\207\347\272\247\346\214\207\345\215\227/\345\246\202\344\275\225\345\215\207\347\272\247\345\210\260 Pika 3.0/index.md" "b/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\345\215\207\347\272\247\346\214\207\345\215\227/\345\246\202\344\275\225\345\215\207\347\272\247\345\210\260 Pika 3.0/index.md" deleted file mode 100644 index c17770a..0000000 --- "a/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\345\215\207\347\272\247\346\214\207\345\215\227/\345\246\202\344\275\225\345\215\207\347\272\247\345\210\260 Pika 3.0/index.md" +++ /dev/null @@ -1,53 +0,0 @@ ---- -title: "如何升级到 Pika 3.0" -sidebar_position: 0 ---- - -## 升级准备工作: -pika在2.3.3版本时为了确保同步的可靠性,增加了server-id验证功能,因此pika2.3.3~pika2.3.6与pika2.3.3之前的版本无法互相同步 -* 如果你的pika版本小于2.3.3, 你需要准备pika2.3.6及pika3.0.16的bin文件,这里需要注意的是3.0.x需要准备3.0.16以后的版本(或者3.0.6版本),其他版本pika不再能与低版本(2.3.X)进行同步,因此在升级时建议使用最新的3.0.x版本pika来完成整个操作。下文以3.0.16为例。 -* 如果你的pika版本>=2.3.3, 你需要准备pika3.0.16的bin文件 -* 如果你的pika版本>=2.3.3那么请从下列步骤5开始, 否则请从步骤1开始 -* 如果你的pika非集群模式(单点), 且无法停机升级, 请在操作前为该pika补充一个从库 - -## 升级步骤: -1. 为pika 从库的配置文件增加masterauth参数, 注意, 该参数的值需要与主库的requirepass参数配置相同, 否则会造成验证失败 -2. 使用新的(建议使用2.3.6)pika bin目录覆盖低版本目录 -3. 分别关闭pika主,从库并使用新的pika bin文件启动 -4. 登录从库恢复主从关系(若你的从库配置文件中已经配置了slaveof参数, 那么可忽略该步骤), 并观察同步状态是否为up -5. 将3.0.16版本的pika部署到本服务器 -6. 登录从库执行bgsave, 此时你可以在从库的dump目录中获取一份全新的备份, 确保其中的info文件在之后的步骤中不丢失, 例如你可以将其中的信息复制一份 -7. 使用pika3.0.16 tools目录中的nemo_to_blackwidow工具将读取该备份中的数据并生成与pika3.0.16新引擎匹配的数据文件, 该工具的使用方法为: -``` -./nemo_to_blackwidow nemo_db_path(需要读取的备份文件目录配置) blackwidow_db_path(需要生成的新数据文件目录配置) -n(线程数量, 请根据服务器性能酌情配置, 避免消耗过多硬件资源) - -例子: 低版本pika目录为pika-demo, 版本为3.0.16的pika目录为pika-new30: -./nemo_to_blackwidow /data/pika-demo/dump/backup-20180730 /data/pika-new30/new_db -n 6 -``` -8. 更新配置文件, 将转换好的目录(/data/pika-new30/new_db)配置为新pika的启动目录(配置文件中的db-path参数), 同时将identify-binlog-type参数配置为old, 确保3.0.16能够解析低版本pika的同步数据, 如果配置文件中存在slaveof信息请注释, 其余配置不变 -9. 关闭本机从库(/data/pika-demo), 使用pika3.0.16的bin文件启动新的pika(/data/pika-new30/new_db) -10. 登录pika3.0.16, 并与主库建立同步关系, 此时请打开之前保存的备份目录中的info文件, 该文件的第4,5行分别为pika备份时同步的位置信息, 需要将该信息加入slaveof命令进行增量同步(在执行命令之前要确保主库对应的binlog文件还存在) -``` -例子: info文件中的信息如下并假设主库ip为192.168.1.1端口为6666: -3s -192.168.1.2 -6666 -300 -17055479 -那么slaveof命令应为: -slaveof 192.168.1.1 6666 300 17055479 -``` -11. 观察同步状态是否为up, 确认同步正常后等待从库同步无延迟时该从库彻底升级完成, 此时可开始切主操作: -``` -a.关闭从库的salve-read-only参数确保从库可写 -b.程序端修改连接ip为从库地址, 将程序请求全部转向从库 -c.在从库断开(slaveof no one)与主库的同步, 完成整个切主操作 -``` -12. 通过config set将identify-binlog-type配置为new并修改配置文件中该参数的值为new, 如果config set报错那么意味着你忽略了上个步骤中的c步骤 -13. 此时整个升级已完成, 你获得了一个单点的pika3.0.16实例, 若需补充从库, 你可新建一个新的空的pika3.0.16或更新版本的pika实例并通同slaveof ip:port force命令来非常简单的实现主从集群的创建, 该命令能够完整同步数据后自动转换为增量同步 - -## 注意事项: -* 由于Pika3.0的引擎在数据存储格式上做了重新的设计,新引擎比老引擎更加节省空间,所以升级完毕后,发现Pika3.0的db要比原来小这是正常的现象 -* 在数据量比较大的情况下,使用nemo_to_blackwidow工具将Nemo格式的db转换成blackwidow格式的db可能花费的时间比较久,在转换的过程中可能主库当时dump时对应的位置的binlog会被清除掉,导致最后无法进行增量同步,所以在升级之前要将原先的主库的binlog生命周期设置得长一些(修改expire-logs-days和expire-logs-nums配置项) -* 由于我们在pika3.0的版本对binlog格式做了修改,为了兼容老的版本,我们提供了identify-binlog-type选项,这个选项只有pika身份为从库的时候生效,当identify-binlog-type选项值为new的时候,表示将主库发送过来的binlog按照新版本格式进行解析(pika3.0+), 当identify-binlog-type选项值为old的时候, 表示将主库发送过来的binlog按照老版本格式进行解析(pika2.3.3 ~ pika2.3.6) -* Pika3.0对Binlog格式进行了更改,新版本的Binlog在记录更多数据的同时更加节省磁盘空间,所以在将pika2.3.6数据迁移到pika3.0过程当中判断主从同步是否无延迟时不要去对比主从各自的binlog_offset,而是看master上的Replication项slave对应的lag是否接近于0 diff --git "a/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\345\215\207\347\272\247\346\214\207\345\215\227/\345\246\202\344\275\225\345\215\207\347\272\247\345\210\260 Pika 3.1 \346\210\226 3.2/index.md" "b/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\345\215\207\347\272\247\346\214\207\345\215\227/\345\246\202\344\275\225\345\215\207\347\272\247\345\210\260 Pika 3.1 \346\210\226 3.2/index.md" deleted file mode 100644 index 41477ac..0000000 --- "a/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\345\215\207\347\272\247\346\214\207\345\215\227/\345\246\202\344\275\225\345\215\207\347\272\247\345\210\260 Pika 3.1 \346\210\226 3.2/index.md" +++ /dev/null @@ -1,60 +0,0 @@ ---- -title: "如何升级到 Pika 3.1 或 3.2" -sidebar_position: 1 ---- - -# 迁移工具介绍 - -## manifest生成工具 -* 工具路径`./tools/manifest_generator` -* 工具作用:用来进行manifest的生成 -## 增量同步工具 -* 工具路径`./tools/pika_port` -* 工具作用:用来进行pika3.0与新pika3.1或pika3.2之间的数据同步 - -# 说明 -1. 为了提高pika的单机性能,自Pika3.1开始,我们在Pika中实现了redis的多库模式,正是因为如此底层存储db以及log的目录发生了一些变化,如果老版本pika的db路径是`/data/pika9221/db`,那么单db数据都会存在这个目录下面,但是由于我们目前支持了多db,目录层级比原先多了一层,所以迁移的时候我们需要手动将原先单db的数据挪到`/data/pika9221/db/db0`当中 -2. 为了提高多DB的同步效率,在新版本Pika中我们使用PB协议进行实例间通信,这意味着新版本的Pika不能直接与老版本的Pika直接建立主从,所以我们需要[pika_port](https%3a%2f%2fgithub.com%2fQihoo360%2fpika%2fwiki%2fpika%e5%88%b0pika%e3%80%81redis%e8%bf%81%e7%a7%bb%e5%b7%a5%e5%85%b7)将老版本Pika的数据增量同步到新版本Pika上 - -# 升级步骤 -1. 根据自己的场景配置新版本Pika的配置文件(databases项用于指定开启几个db) -2. 登录主库执行bgsave操作,然后将dump下来的数据拷贝到新版本pika配置文件中db-path目录的下一级目录db0中 -``` -例子: - 旧版本Pika dump的路径为:/data/pika_old/dump/20190517/ - 新版本Pika db-path的路径为:/data/pika_new/db/ - 那么我们执行: cp -r /data/pika_old/dump/20190517/ /data/pika_new/db/db0/ -``` -3. 使用manifest_generator工具,在新版本pika配置log目录的下一级目录log_db0中生成manifest文件,这样可以让新的pika产生和老的pika一样的binlog偏移量,需要指定db-path/db0目录和$log-path/log_db0目录(相当于把老版的db和log合并到了新版的db0里面) -``` -例子: - 新版本Pika db-path的路径为: /data/pika_new/db/ - 新版本Pika log-path的路径为:/data/pika_new/log/ - 那么我们执行: ./manifest_generator -d /data/pika_new/db/db0 -l /data/pika_new/log/log_db0 -``` -4. 用v3.1.0版本的的二进制和对应的配置文件启动Pika,使用info log查看db0的binlog偏移量(filenum和offset) -5. 使用Pika-port工具将旧版Pika的数据增量同步到新版本Pika上面来 -``` -例子: - 旧版本Pika的ip为:192.168.1.1,端口为:9221 - 新版本Pika的ip为:192.168.1.2,端口为:9222 - 执行pika_port工具机器的本地ip为:192.168.1.3, 打算使用的端口为:9223 - 获取的filenum为:100,获取的offset为:999 - - 那么我们执行:./pika_port -t 192.168.1.3 -p 9223 -i 192.168.1.1 -o 9221 -m 192.168.1.2 -n 9222 -f 100 -s 999 -e -``` -6. 在使用pika-port进行同步的过程中我们可以登录主库执行`info replication`打印出的数据里会发现新增了一条从库信息,他是pika_port工具模仿slave行为与源库进行交互,同时可以通过lag查看他的延迟 - -7. 当我们与pika3.1或pika3.2进行增量同步的时候,可以对pika3.1或pika3.2进行从库添加操作,这样的话在从库都同步完成之后,我们在源库上查看lag如果为0 或者是很小的时候我们可以将整个集群进行替换,把原来的集群替换掉,把新集群上线 - - -# 注意事项 -1. 当我们在拷贝dump目录的时候,最好先mv改名字,然后在进行远程同步,这可以防止dump目录在拷贝的时候覆盖而造成数据不一致的结果 -2. 在我们使用manifest_generator工具的时候,他需要dump时候生成的info文件,所以在拷贝dump目录的时候,要保证info文件也移动到指定的目录底下 -3. 使用manifest_generator的时候 $log-path/db0 目录如果存在是会报错的,所以不要新建db0目录,脚本会自动创建 -4. pika_port增量同步工具需要依赖info文件里的ip port 和file offset进行同步。 -5. pika_port会模仿slave与源库交互,所以他会进行trysync,当他请求的点位在源库过期的时候,就会触发全同步,会自动的使用-r 这个参数记录的目录来存放rsync全量同步的数据,如果不想让他自动的进行全同步,可以使用-e参数,当进行全同步的时候会返回-1,但是这时候rsync还是再继续,需要kill 本地的rsync进程,源库才会终止全量同步 -6. pika_port进行增量同步是持续性的,不会断的,这个时候可以在源库上使用 info replication 查看slave的lag来确定延迟 -7. pika_port工具支持多线程应用,根据key hash,如果是同一个key会hash到一个线程上去回放,可以保证同一个key的顺序 -8. 在数据量比较大的情况下,使用拷贝dump目录可能花费的时间比较久,导致主库当时dump时对应的位置的binlog会被清除掉(或者pika3.1(pika3.2)新增从库的时候也需要注意),导致最后无法进行增量同步,所以在升级之前要将原先的主库的binlog生命周期设置得长一些(修改expire-logs-days和expire-logs-nums配置项) -9. 如果我们不用manifest_generator 生成manifest文件也是可以的,但是这个时候启动的pika3.1或pika3.2实例的点位是 0 0 ,如果后续在pika3.1或pika3.2后挂载从库的话,需要在从库上执行`slaveof IP PORT force`命令,否则的话从库可能会出现少数据的情况 diff --git "a/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\345\215\207\347\272\247\346\214\207\345\215\227/\345\246\202\344\275\225\345\260\206 Pika 3.3.6 \345\215\207\347\272\247\345\210\260 Pika 3.5/index.md" "b/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\345\215\207\347\272\247\346\214\207\345\215\227/\345\246\202\344\275\225\345\260\206 Pika 3.3.6 \345\215\207\347\272\247\345\210\260 Pika 3.5/index.md" deleted file mode 100644 index 1b528b5..0000000 --- "a/docs/\344\275\277\347\224\250\344\270\216\350\277\220\347\273\264/\345\215\207\347\272\247\346\214\207\345\215\227/\345\246\202\344\275\225\345\260\206 Pika 3.3.6 \345\215\207\347\272\247\345\210\260 Pika 3.5/index.md" +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: "如何将 Pika 3.3.6 升级到 Pika 3.5" -sidebar_position: 2 ---- - -## Q:如何从 3.3.6 迁移数据到 3.5? - -A:假设有 3.3.6 实例 A,可进行如下操作: - -1. 在任意环境再启动一个新的 3.3.6 实例 B,通过运维操作让 B 变成 A 的 slave; -2. 等 B 数据全量同步完毕,通过运维手段封禁 A 的写请求; -3. 杀掉 B 进程; -4. 在 B 进程环境把 3.3.6 Pika 二进制文件升级到 3.5 Pika,同时把 配置文件也升级到 3.5 版本的配置文件,启动该 3.5 版本的 Pika; -5. 把上次的读写请求 redirect 引导到 3.5 版本的 B,对写请求解封。 - -原因:主从3.3.6 通过rsync 实现全量同步,通过推模式实现增量同步。3.5.1 不使用 rsync 了,我们自己实现了全新的全量同步机制。增量同步从 master 到 slave 的推模式改为了 slave 到 master 的拉模式。 \ No newline at end of file