{"id":339934,"date":"2022-10-19T09:00:07","date_gmt":"2022-10-19T09:00:07","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=339934"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=339934","title":{"rendered":"<span>\u0428\u0430\u0440\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u044d\u0448 \u043d\u0430 \u0431\u0430\u0437\u0435 Memcached<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a6e\/863\/d0d\/a6e863d0d4ed1f1cb987de495219f67f.png\" width=\"3140\" height=\"580\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a6e\/863\/d0d\/a6e863d0d4ed1f1cb987de495219f67f.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0410\u043d\u0434\u0440\u0435\u0439 \u0411\u0430\u0440\u0431\u043e\u043b\u0438\u043d, \u044f Senior Software Engineer \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 Order Management System. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0432\u0430\u043c, \u043a\u0430\u043a \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0448\u0430\u0440\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u044d\u0448 \u0438 \u043f\u043e\u0434 \u0441\u0442\u0440\u0435\u0441\u0441-\u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u0434\u043e\u0431\u0438\u043b\u0438\u0441\u044c 30 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e \u043f\u0435\u0440\u0432\u0443\u044e open source \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u043e\u0442 AliExpress \u0420\u043e\u0441\u0441\u0438\u044f.<\/p>\n<h2>\u0412\u0432\u043e\u0434\u043d\u044b\u0435<\/h2>\n<ul>\n<li>\n<p>\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432 \u043a\u044d\u0448\u0435 200-300GB \u0434\u0430\u043d\u043d\u044b\u0445;<\/p>\n<\/li>\n<li>\n<p>\u0426\u0435\u043b\u0435\u0432\u0430\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043d\u0430 \u0441\u0435\u0440\u0432\u0438\u0441 30 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 key values \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443.<\/p>\n<\/li>\n<\/ul>\n<p>\u0418 \u044d\u0442\u043e \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u0422\u0430\u043a\u0436\u0435 \u0431\u044b\u0432\u0430\u044e\u0442 \u043f\u0435\u0440\u0438\u043e\u0434\u044b \u0440\u0430\u0441\u043f\u0440\u043e\u0434\u0430\u0436, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0443\u043c\u0435\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u044b \u043a\u044d\u0448\u0435\u0439.<\/p>\n<p>\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u2014 \u0448\u0430\u0440\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0435. \u0427\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u043e\u044f\u0442\u044c \u0432 \u043f\u043b\u0430\u043d\u0435 \u043a\u044d\u0448\u0430 \u043d\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435, \u0443\u0436\u0435 \u043d\u0435 \u0442\u0430\u043a \u0432\u0430\u0436\u043d\u043e. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c Redis, Memcached \u0438\u043b\u0438 \u043b\u044e\u0431\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435.<\/p>\n<h3>\u041f\u043e\u0434\u0431\u043e\u0440 \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/h3>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e, \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0438 \u043e\u0431\u044a\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442 \u0442\u044b\u0441\u044f\u0447 RPS, \u0430 \u043e\u0431\u044a\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439, \u0441\u0442\u043e\u0438\u0442 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0437\u0440\u0435\u043b\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043c\u044c\u044e\u043d\u0438\u0442\u0438 \u0438 \u043d\u0438\u0437\u043a\u0438\u043c \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u0432\u0445\u043e\u0434\u0430. \u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u044d\u0442\u043e Redis. \u0422\u0435\u043c \u0431\u043e\u043b\u0435\u0435, \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u044d\u0442\u0430\u043a\u0438\u0439 \u0448\u0432\u0435\u0439\u0446\u0430\u0440\u0441\u043a\u0438\u0439 \u043d\u043e\u0436, \u0432\u0435\u0434\u044c \u044d\u0442\u043e \u0443\u0436\u0435 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u044d\u0448. \u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u0435\u0433\u043e \u0431\u043e\u0433\u0430\u0442\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441, \u043e\u043d \u0434\u0430\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443. \u041d\u0430\u043c \u0432 AliExpress \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432 \u043a\u044d\u0448\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c CPU \u043f\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u0443. Redis \u043e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0439 \u2014 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043a\u0443 \u0437\u0430\u0432\u0435\u0437\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 6-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0432 \u043c\u0430\u0435 2020, \u0434\u0430 \u0438 \u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 I\/O, \u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435 \u0438\u0437 \u0441\u043e\u043a\u0435\u0442\u043e\u0432 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u043d\u0438\u0445. \u0421\u0442\u043e\u0438\u0442 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0434\u0440\u0443\u0433\u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439. \u042d\u043d\u0442\u0443\u0437\u0438\u0430\u0441\u0442\u044b \u0444\u043e\u0440\u043a\u043d\u0443\u043b\u0438 Redis, \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0435\u0433\u043e \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u043c, \u0438 \u0442\u0430\u043a \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f <a href=\"https:\/\/medium.com\/@john_63123\/redis-should-be-multi-threaded-e28319cab744\">KeyDb<\/a>. \u0415\u0449\u0435 \u0435\u0441\u0442\u044c Dragonfly, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438 \u0440\u0443\u0433\u0430\u0435\u0442 Redis <a href=\"https:\/\/dragonflydb.io\/blog\/2022\/01\/30\/simple_is_beatiful\/\">\u0432 \u0441\u0432\u043e\u0435\u043c \u0431\u043b\u043e\u0433\u0435<\/a> \u0437\u0430 \u0441\u043b\u0430\u0431\u044b\u0439 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442 \u043d\u0430 \u0432\u044b\u0441\u043e\u043a\u0438\u0445 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430\u0445. \u0422\u0443\u0442 \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u043d\u0435\u0435 \u0437\u0440\u0435\u043b\u044b\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435: \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0440\u0443\u043a\u0443 \u043d\u0430 \u043f\u0443\u043b\u044c\u0441\u0435 \u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u0444\u0438\u043a\u0441\u0438\u043b\u0438 \u0438 \u0437\u0430\u0432\u0435\u0437\u043b\u0438 \u0432 \u043d\u043e\u0432\u044b\u0445 \u0440\u0435\u043b\u0438\u0437\u0430\u0445.<\/p>\n<p>\u041c\u044b \u0432\u044b\u0431\u0440\u0430\u043b\u0438 Memcached, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d \u0433\u043e\u0434\u0430\u043c\u0438, \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c \u0438 \u043d\u0430\u0434\u0435\u0436\u0435\u043d. \u042d\u0442\u043e \u0442\u043e\u043f\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u044d\u0448, \u0438 \u0432\u0441\u0451. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435, \u0434\u0430\u0436\u0435 \u043d\u043e\u0432\u043e\u043c\u043e\u0434\u043d\u044b\u0439 Dragonfly \u043f\u043e \u0438\u0445 \u0436\u0435 <a href=\"https:\/\/github.com\/dragonflydb\/dragonfly\">\u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430\u043c<\/a> \u043d\u0435 \u0441\u043c\u043e\u0433 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0431\u043e\u0439\u0442\u0438 Memcached:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/184\/116\/cdb\/184116cdbe7e107cef3775ba5ae1a17f.png\" width=\"559\" height=\"350\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/184\/116\/cdb\/184116cdbe7e107cef3775ba5ae1a17f.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0418\u0437-\u0437\u0430 \u0441\u0432\u043e\u0435\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b Memcached:<\/p>\n<ul>\n<li>\n<p>\u041b\u0443\u0447\u0448\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c;<\/p>\n<\/li>\n<li>\n<p>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u0436\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0438\u0437 \u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b.<\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u043e \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 Memcached:<\/p>\n<ul>\n<li>\n<p>250 bytes \u043d\u0430 \u043a\u043b\u044e\u0447. \u042d\u0442\u043e \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043f\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445. \u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c, \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c Memcached;<\/p>\n<\/li>\n<li>\n<p>1MB \u043d\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u042d\u0442\u0430 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0430 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f;<\/p>\n<\/li>\n<li>\n<p>Eviction policy \u0442\u043e\u043b\u044c\u043a\u043e LRU (Last recently used).<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043e\u0431\u043e\u0441\u043d\u043e\u0432\u0430\u043d\u044b \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043e\u0439 Memcached \u0441 slub-\u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438 \u0438 LRU. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 \u0438\u0445 <a href=\"https:\/\/github.com\/memcached\/memcached\/wiki\/UserInternals\">Wiki<\/a>.<\/p>\n<h3>\u0428\u0430\u0440\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0435<\/h3>\n<p>\u0418\u0442\u0430\u043a, \u043c\u044b \u0432\u0437\u044f\u043b\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u043a\u044d\u0448\u0430. \u041f\u043e\u0440\u0430 \u043d\u0430\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0435\u0433\u043e \u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0438 \u0448\u0430\u0440\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u0437\u044f\u0442\u044c \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0442 Facebook, \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 Memcached. \u041e\u043d\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u043a \u043d\u0435\u043c\u0443 <a href=\"https:\/\/github.com\/facebook\/mcrouter\">mc router<\/a>, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0448\u0438\u0440\u043e\u043a\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u2014 \u043d\u0430 \u043d\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u043e\u043e\u0431\u0449\u0435 \u043b\u044e\u0431\u043e\u0439 \u0440\u043e\u0443\u0442\u0438\u043d\u0433, \u043a\u0430\u043a\u043e\u0439 \u043f\u043e\u0436\u0435\u043b\u0430\u0435\u0448\u044c. \u041d\u043e \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u044d\u0442\u043e \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0447\u0435\u0440\u043d\u044b\u0439 \u044f\u0449\u0438\u043a \u043d\u0430 \u043f\u0443\u0442\u0438 \u043a \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u043c\u0443 \u043a\u044d\u0448\u0443. \u0410 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0439 \u0438 \u0442\u043e\u043d\u043a\u0438\u0439 \u043a\u043b\u0438\u0435\u043d\u0442.<\/p>\n<p>\u041d\u0430 \u0432\u0445\u043e\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c consistent hashing aka HashRing. \u042d\u0442\u043e \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0438 \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u044b Memcached \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0431\u0435\u0437 \u0440\u0435\u0434\u0435\u043f\u043b\u043e\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442.<\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e A, B, C \u2014 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u044b Memcached. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0438\u0445 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u043a\u0440\u0443\u0433\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435\u043c hash \u043f\u043e IP-\u0430\u0434\u0440\u0435\u0441\u0430\u043c \u043f\u043e\u0434\u043e\u0432. \u0414\u0430\u043b\u044c\u0448\u0435 \u043c\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c hash \u043f\u043e \u043a\u043b\u044e\u0447\u0443, \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0439 \u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u043f\u043e \u0447\u0430\u0441\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u0435\u043b\u043a\u0435 (\u0438\u043b\u0438 \u043f\u0440\u043e\u0442\u0438\u0432) \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043d\u0435\u0433\u043e:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/aee\/41f\/972\/aee41f97214361eb76e0f689811f7e2d.png\" width=\"834\" height=\"564\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/aee\/41f\/972\/aee41f97214361eb76e0f689811f7e2d.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0415\u0441\u043b\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u043f\u043e\u0434\u043e\u0432 \u043e\u0442\u043a\u0430\u0436\u0435\u0442, \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u0431\u0440\u0430\u0442\u044c \u0435\u0433\u043e \u0438\u0437 HashRing. \u041d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u043a\u043e\u0441 \u043f\u043e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u2014 \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u043b\u0438 \u0438\u0434\u0442\u0438 \u043d\u0430 \u0438\u043d\u0441\u0442\u0430\u043d\u0441 B, \u0442\u0435\u043f\u0435\u0440\u044c \u0443\u0445\u043e\u0434\u044f\u0442 \u043d\u0430 \u0438\u043d\u0441\u0442\u0430\u043d\u0441 C:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6b2\/d78\/e69\/6b2d78e69bc8f2bc732d3200ee3166b4.png\" width=\"834\" height=\"596\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6b2\/d78\/e69\/6b2d78e69bc8f2bc732d3200ee3166b4.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0430\u0441\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e \u043c\u0435\u0436\u0434\u0443 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430\u043c\u0438 A \u0438 C. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0430 \u043a\u0440\u0443\u0433 \u00ab\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435\u00bb \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0441 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0435\u0441\u043b\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432 \u043e\u0442\u043a\u0430\u0436\u0435\u0442, \u0432\u0441\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430\u043c\u0438:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/0b4\/614\/bb7\/0b4614bb7f7f8a9081d75120d5877952.jpeg\" width=\"696\" height=\"511\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0b4\/614\/bb7\/0b4614bb7f7f8a9081d75120d5877952.jpeg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u0447\u0442\u043e <a href=\"https:\/\/redis.io\/docs\/manual\/scaling\/\">Redis \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u043d\u0435 \u0443\u043c\u0435\u0435\u0442<\/a>:<\/p>\n<blockquote>\n<p>Redis Cluster supports multiple key operations as long as all of the keys involved in a single command execution (or whole transaction, or Lua script execution) belong to the same hash slot. The user can force multiple keys to be part of the same hash slot by using a feature called\u00a0<em>hash tags.<\/em><\/p>\n<\/blockquote>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u043e\u0443\u043f\u0440\u0430\u0436\u043d\u044f\u0442\u044c\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u044e\u0447\u0435\u0439 \u0438 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c:<\/p>\n<pre><code class=\"xml\">(error) ERR CROSSSLOT Keys in request don't hash to the same slot<\/code><\/pre>\n<p>Hash tags \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0435\u0439 \u043f\u043e \u043d\u0435\u043a\u043e\u0435\u043c\u0443 \u0442\u044d\u0433\u0443, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u0442 \u0441\u0447\u0438\u0442\u0430\u0442\u044c\u0441\u044f hash, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043a\u043b\u044e\u0447\u0438 \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 hash slot (<a href=\"https:\/\/redis.io\/docs\/reference\/cluster-spec\/\">\u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>):<\/p>\n<pre><code class=\"yaml\">MSET {user:1000}.name Angela {user:1000}.surname White<\/code><\/pre>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0438\u043d\u0433 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 get\/set, \u043d\u043e \u044f \u0441\u0445\u043e\u0434\u0443 \u043d\u0435 \u043d\u0430\u0448\u0435\u043b \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0431\u0435\u0437 hash tag\u2019\u043e\u0432. <a href=\"https:\/\/redis.com\/blog\/redis-clustering-best-practices-with-keys\/\">\u0417\u0434\u0435\u0441\u044c<\/a> \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0441\u044f, \u0447\u0442\u043e:<\/p>\n<blockquote>\n<p>Redis Enterprise has a few workarounds for simple commands, notably MGET and MSET.<\/p>\n<\/blockquote>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438\u043b\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u044f \u043d\u0430\u0439\u0442\u0438 \u043d\u0435 \u0441\u043c\u043e\u0433. \u041d\u043e \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u044d\u0442\u0438 \u043e\u0431\u0445\u043e\u0434\u043d\u044b\u0435 \u043f\u0443\u0442\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442, <a href=\"https:\/\/redis.com\/redis-enterprise\/advantages\/\">Redis Enterprise<\/a> \u0432\u0441\u0435 \u0435\u0449\u0435 <a href=\"https:\/\/redis.com\/redis-enterprise-cloud\/pricing\/\">\u0441\u0442\u043e\u0438\u0442 \u0434\u0435\u043d\u044e\u0436\u043a\u0443<\/a>.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0435\u0442\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u044e\u0447\u0435\u0439 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432 Redis, \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438.<\/p>\n<h3>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043f\u043e HashRing<\/h3>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u0434\u043e\u0431\u0438\u0432\u0430\u0435\u043c\u0441\u044f O(log(n)):<\/p>\n<pre><code class=\"cs\">private TNode GetNodeInternal(string key) {     var keyHash = GetHash(key);      var index = Array.BinarySearch(_sortedNodeHashKeys, keyHash);     if (index &lt; 0) \/\/ no exact match     {         \/\/ If the Array does not contain the specified value, the method returns a negative integer.         \/\/ You can apply the bitwise complement operator to the negative result to produce an index.         \/\/ If this index is one greater than the upper bound of the array, there are no elements larger than value in the array.         \/\/ Otherwise, it is the index of the first element that is larger than value.         index = ~index;          if (index >= _sortedNodeHashKeys.Length)         {             index = 0;         }     }      var hashNodeKey = _sortedNodeHashKeys[index];      return _hashToNodeMap[hashNodeKey]; }<\/code><\/pre>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043f\u043e\u0438\u0441\u043a \u043d\u043e\u0434 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e:<\/p>\n<pre><code class=\"cs\">public IDictionary&lt;TNode, ConcurrentBag&lt;string>> GetNodes(IEnumerable&lt;string> keys) {     var result = new ConcurrentDictionary&lt;TNode, ConcurrentBag&lt;string>>(Comparer);      try     {         _locker.EnterReadLock();                  if (_sortedNodeHashKeys == null || _sortedNodeHashKeys.Length == 0)         {             return result;         }          Parallel.ForEach(keys, new ParallelOptions { MaxDegreeOfParallelism = 16 },key =>         {             var node = GetNodeInternal(key);              var bag = result.GetOrAdd(node, (Func&lt;TNode, ConcurrentBag&lt;string>>) ValueFactory);             bag.Add(key);         });     }     finally     {         _locker.ExitReadLock();     }      return result; }<\/code><\/pre>\n<p>\u0411\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438 \u043f\u0440\u0438 256 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u043e\u0434\u0430\u0445 \u043d\u0430 \u043e\u0434\u043d\u0443 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0443\u044e:<\/p>\n<pre><code class=\"coffeescript\">BenchmarkDotNet=v0.13.1, OS=macOS Monterey 12.3.1 (21E258)  [Darwin 21.4.0] Apple M1, 1 CPU, 8 logical and 8 physical cores .NET SDK=6.0.400  [Host] : .NET 6.0.8 (6.0.822.36306), Arm64 RyuJIT DefaultJob : .NET 6.0.8 (6.0.822.36306), Arm64 RyuJIT<\/code><\/pre>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p>Method<\/p>\n<\/th>\n<th>\n<p>KeysNumber<\/p>\n<\/th>\n<th>\n<p>NodesNumber<\/p>\n<\/th>\n<th>\n<p>Mean<\/p>\n<\/th>\n<th>\n<p>Error<\/p>\n<\/th>\n<th>\n<p>StdDev<\/p>\n<\/th>\n<th>\n<p>Median<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">5.683 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.5613 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.655 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">4.692 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">16<\/p>\n<\/td>\n<td>\n<p align=\"left\">5.485 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.5255 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.549 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">4.639 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">32<\/p>\n<\/td>\n<td>\n<p align=\"left\">6.239 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.7027 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">2.072 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">5.060 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">128<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">33.824 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">2.7571 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">8.086 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">29.377 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">128<\/p>\n<\/td>\n<td>\n<p align=\"left\">16<\/p>\n<\/td>\n<td>\n<p align=\"left\">118.482 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">7.0747 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">20.860 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">114.546 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">128<\/p>\n<\/td>\n<td>\n<p align=\"left\">32<\/p>\n<\/td>\n<td>\n<p align=\"left\">188.920 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">12.1676 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">35.877 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">181.387 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">512<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">73.147 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">4.7427 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">13.984 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">66.924 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">512<\/p>\n<\/td>\n<td>\n<p align=\"left\">16<\/p>\n<\/td>\n<td>\n<p align=\"left\">175.545 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">10.4275 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">30.746 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">168.805 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">512<\/p>\n<\/td>\n<td>\n<p align=\"left\">32<\/p>\n<\/td>\n<td>\n<p align=\"left\">293.666 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">13.3944 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">39.494 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">277.418 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">2048<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">193.951 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">8.5778 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">24.749 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">189.355 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">2048<\/p>\n<\/td>\n<td>\n<p align=\"left\">16<\/p>\n<\/td>\n<td>\n<p align=\"left\">326.530 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">15.2840 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">44.825 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">309.335 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">2048<\/p>\n<\/td>\n<td>\n<p align=\"left\">32<\/p>\n<\/td>\n<td>\n<p align=\"left\">466.940 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">18.1174 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">52.849 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">456.591 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">5000<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">427.750 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">16.5527 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">48.806 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">420.915 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">5000<\/p>\n<\/td>\n<td>\n<p align=\"left\">16<\/p>\n<\/td>\n<td>\n<p align=\"left\">574.372 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">25.4257 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">74.569 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">564.302 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">5000<\/p>\n<\/td>\n<td>\n<p align=\"left\">32<\/p>\n<\/td>\n<td>\n<p align=\"left\">688.616 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">26.3884 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">76.558 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">663.938 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">10000<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">814.684 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">27.5884 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">80.039 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">807.244 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">10000<\/p>\n<\/td>\n<td>\n<p align=\"left\">16<\/p>\n<\/td>\n<td>\n<p align=\"left\">1,020.214 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">36.8499 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">108.074 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">1,021.344 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">10000<\/p>\n<\/td>\n<td>\n<p align=\"left\">32<\/p>\n<\/td>\n<td>\n<p align=\"left\">1,269.259 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">35.2069 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">103.256 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">1,288.021 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">20000<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">1,617.165 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">44.5917 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">131.480 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">1,629.595 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">20000<\/p>\n<\/td>\n<td>\n<p align=\"left\">16<\/p>\n<\/td>\n<td>\n<p align=\"left\">1,899.443 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">63.8206 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">188.176 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">1,828.317 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">20000<\/p>\n<\/td>\n<td>\n<p align=\"left\">32<\/p>\n<\/td>\n<td>\n<p align=\"left\">2,059.760 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">60.0584 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">174.240 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">2,015.047 us<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><code>1 us        : 1 Microsecond (0.000001 sec)<\/code><\/p>\n<p>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 hash-\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f MurMurHash3. \u0417\u0430\u0442\u0435\u043c \u043c\u044b \u043f\u0435\u0440\u0435\u0448\u043b\u0438 \u043d\u0430 xxHash, \u0447\u0442\u043e \u0434\u0430\u043b\u043e \u0447\u0435\u0442\u044b\u0440\u0435\u0445\u043a\u0440\u0430\u0442\u043d\u044b\u0439 \u0432\u044b\u0438\u0433\u0440\u044b\u0448 \u0432 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438. \u0423 xxHash \u0435\u0441\u0442\u044c <a href=\"https:\/\/github.com\/uranium62\/xxHash\">\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/a> \u043d\u0430 C# \u0431\u0435\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0439. \u0412 \u0441\u0432\u043e\u0435\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u043c\u044b \u0442\u043e\u0436\u0435 \u0432\u0441\u0442\u0430\u043b\u0438 \u043d\u0430 \u043f\u0443\u0442\u044c zero allocation \u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c ArrayPool \u0438 Span&#8217;\u044b. \u041d\u043e \u043d\u0430\u043c \u0435\u0449\u0435 \u0435\u0441\u0442\u044c \u043d\u0430\u0434 \u0447\u0435\u043c \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<p>\u041f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0440\u043e <a href=\"https:\/\/adamsitnik.com\/Array-Pool\/\">Array Pool<\/a>.<\/p>\n<p><a href=\"https:\/\/docs.microsoft.com\/en-us\/archive\/msdn-magazine\/2018\/january\/csharp-all-about-span-exploring-a-new-net-mainstay\">\u041f\u043e\u0447\u0438\u0442\u0430\u0442\u044c<\/a> \u0438 <a href=\"https:\/\/docs.microsoft.com\/en-us\/events\/connect-2017\/t125\">\u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c<\/a> \u043f\u0440\u043e Span&#8217;\u044b.<\/p>\n<h3>\u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0434 \u043d\u0430 HashRing<\/h3>\n<p>\u0414\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0434 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432 \u0441\u0438\u043b\u0443 \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u043e\u0434, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u0430\u0441\u044c \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 1\u20132% \u043f\u043e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435.<\/p>\n<p>\u041d\u0430\u0433\u0440\u0443\u0437\u043e\u0447\u043d\u043e\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438 64 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u043e\u0434\u0430\u0445 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e \u0434\u043e 5% \u0440\u0430\u0437\u043d\u0438\u0446\u044b \u0432 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435. \u041f\u0440\u043e\u0432\u043e\u0434\u0438\u043c \u0442\u0435\u0441\u0442\u044b \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u0438 256 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u043e\u0434\u0430\u0445 \u0441\u043e \u0441\u0440\u0435\u0434\u043d\u0438\u043c \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435\u043c \u0432 1\u20132% \u043c\u0435\u0436\u0434\u0443 \u0441\u0430\u043c\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0439 \u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0439 \u043d\u043e\u0434\u0430\u043c\u0438:<\/p>\n<pre><code class=\"cs\">var keysNumber = 2000000; var nodesNumber = new[] {1, 2, 4, 8, 16, 32}; var virtualNodesNumber = new[] {16, 32, 64, 128, 256, 512};  foreach (var nodeNumber in nodesNumber) {     foreach (var virtualNodeNumber in virtualNodesNumber)     {         var hashRing = new HashRing&lt;Pod>(new HashCalculator(), virtualNodeNumber);                  var pods = Enumerable.Range(0, nodeNumber).Select(n => new Pod         {             IpAddress = Guid.NewGuid().ToString()         });                  hashRing.AddNodes(pods);         var keys = Enumerable.Range(0, keysNumber).Select(n => Guid.NewGuid().ToString()).ToArray();                  var nodes = hashRing.GetNodes(keys);                  Console.WriteLine($\"Nodes number: {nodeNumber}, Virtual nodes number: {virtualNodeNumber}\");         var percentages = new List&lt;decimal>();         foreach (var node in nodes)         {             percentages.Add((decimal) node.Value.Count \/ keysNumber);         }          var max = percentages.Max();         var min = percentages.Min();         var diff = max - min;                  Console.WriteLine($\"Max: {max}, Min: {min}, Diff: {diff}\");     } }<\/code><\/pre>\n<h3>Headless service<\/h3>\n<p>\u0412\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441, \u043a\u0430\u043a \u043d\u0430\u043c \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0432\u0441\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u044b Memcached. \u041c\u044b \u0434\u0435\u043f\u043b\u043e\u0438\u043c\u0441\u044f \u0432 Kubernetes \u0438 \u043c\u043e\u0436\u0435\u043c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u0435\u043c\u0438 \u0431\u0430\u0437\u043e\u0432\u044b\u043c\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043d \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/kubernetes.io\/docs\/concepts\/services-networking\/service\/\">\u0442\u0443\u0442<\/a>.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d97\/9b8\/1e4\/d979b81e48742630106bd3c2c00d70fe.png\" width=\"auto\" height=\"auto\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d97\/9b8\/1e4\/d979b81e48742630106bd3c2c00d70fe.png\"\/><figcaption><\/figcaption><\/figure>\n<p>IP-\u0430\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043d\u0435 \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u0443\u0435\u0442\u0441\u044f. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u044b, \u0441\u0435\u0440\u0432\u0438\u0441 \u0437\u043d\u0430\u0435\u0442 \u043f\u0440\u043e \u0432\u0441\u0435 \u043f\u043e\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0435\u043d\u044b \u043f\u043e\u0434 \u043d\u0438\u043c. \u0421\u0434\u0435\u043b\u0430\u0432 DNS lookup \u043d\u0430 \u0441\u0435\u0440\u0432\u0438\u0441, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u0437\u043d\u0430\u0442\u044c \u0430\u0434\u0440\u0435\u0441\u0430 \u0432\u0441\u0435\u0445 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432 Memcached:<\/p>\n<pre><code class=\"cs\">\/\/ HeadlessServiceAddress: my-memcached-headless.&lt;namespace>.svc.cluster.local  IPAddress[] ipAddresses = Dns.GetHostAddresses(_config.HeadlessServiceAddress); return ipAddresses.Select(i => new Pod {     IpAddress = i.ToString() });<\/code><\/pre>\n<h3>Socket pool<\/h3>\n<p>\u041d\u0438 \u043e\u0434\u0438\u043d \u043f\u043e\u0445\u043e\u0436\u0438\u0439 \u043a\u043b\u0438\u0435\u043d\u0442 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0431\u0435\u0437 \u043f\u0443\u043b\u0438\u043d\u0433\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439. \u041a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u0442\u043e\u0436\u0435 \u0431\u0430\u0437\u043e\u0432\u0430\u044f \u2014 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c n \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/922\/7e2\/05c\/9227e205c008c847122f18577b389422.png\" width=\"auto\" height=\"auto\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/922\/7e2\/05c\/9227e205c008c847122f18577b389422.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0414\u0435\u043b\u0430\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Semaphore_(programming)\">\u0441\u0435\u043c\u0430\u0444\u043e\u0440<\/a> \u0438 <a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/api\/system.collections.concurrent.concurrentstack-1?view=net-6.0\">ConcurrentStack<\/a>:<\/p>\n<pre><code class=\"cs\">private readonly ConcurrentStack&lt;PooledSocket> _availableSockets; ...    public SocketPool(MemcachedConfiguration.SocketPoolConfiguration config, ILogger logger) {   ...   _semaphore = new SemaphoreSlim(_config.MaxPoolSize, _config.MaxPoolSize);   _availableSockets = new ConcurrentStack&lt;PooledSocket>(); } ...    if (!await _semaphore.WaitAsync(_config.SocketPoolingTimeout, token)) {   _logger.LogWarning(\"Pool is run out of sockets\");   return result; }  \/\/ Get available socket _availableSockets.TryPop(out var pooledSocket)    \/\/ or create one ...<\/code><\/pre>\n<h3>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f<\/h3>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0444\u043e\u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435\u043c HashRing \u0438 Socket Pool. \u0420\u0430\u0437 \u0432 n \u0441\u0435\u043a\u0443\u043d\u0434 \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u044b \u0447\u0435\u0440\u0435\u0437 headless service, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u043e\u0432\u044b\u0435 \u043d\u043e\u0434\u044b \u0432 HashRing \u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0442\u0435, \u0447\u0442\u043e \u043f\u0440\u043e\u043f\u0430\u043b\u0438.<\/p>\n<p>\u0414\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043e\u043f\u0440\u043e\u0441 \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432 \u043d\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0442\u043e\u0433\u043e, \u0436\u0438\u0432\u044b \u043b\u0438 \u043e\u043d\u0438, \u0438 \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c, \u043f\u043e\u043c\u0435\u0447\u0430\u0435\u0442 \u0435\u0433\u043e \u043a\u0430\u043a \u0443\u043c\u0435\u0440\u0448\u0438\u0439. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0437 HashRing \u0434\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d \u0441\u043d\u043e\u0432\u0430 \u043e\u0436\u0438\u0432\u0435\u0442.<\/p>\n<p>\u0415\u0449\u0435 \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u0435\u0442 \u043f\u043e n \u0441\u043e\u043a\u0435\u0442\u043e\u0432 \u0438\u0437 socket pool\u2019a, \u0447\u0442\u043e\u0431\u044b \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u0441\u043f\u0430\u0434\u0430 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0443\u0431\u0440\u0430\u0442\u044c \u043b\u0438\u0448\u043d\u0438\u0435.<\/p>\n<h3>\u0418\u0442\u043e\u0433\u043e\u0432\u0430\u044f \u0441\u0445\u0435\u043c\u0430<\/h3>\n<ol>\n<li>\n<p>\u041f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u0441 n key values. \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043f\u043e \u0432\u0441\u0435\u043c \u043a\u043b\u044e\u0447\u0430\u043c hash \u0438 \u043f\u043e \u043d\u0438\u043c \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043d\u043e\u0434\u044b \u0438\u0437 HashRing<\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043d\u043e\u0434\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u0432\u043e\u0439 Socket Pool, \u0435\u0441\u043b\u0438 \u043e\u043d \u0435\u0449\u0435 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u043d. \u0415\u0441\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d, \u0431\u0435\u0440\u0435\u043c \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439<\/p>\n<\/li>\n<li>\n<p>\u0412 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0443\u043b\u0435 \u0431\u0435\u0440\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u0441\u043e\u043a\u0435\u0442 \u0438\u0437 \u0443\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0445 \u043b\u0438\u0431\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439, \u0435\u0441\u043b\u0438 \u043f\u0443\u043b \u043d\u0435 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d<\/p>\n<\/li>\n<li>\n<p>\u0412 \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u043e\u043a\u0435\u0442 \u043f\u0438\u0448\u0435\u043c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u043e\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u0430\u043d\u0434 get \u0438\u043b\u0438 set \u0434\u043b\u044f Memcached. \u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b Memcached \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0437\u0430 \u0440\u0430\u0437 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u0437 \u0441\u043e\u043a\u0435\u0442\u0430 \u043e\u0442\u0432\u0435\u0442 \u043e\u0442 Memcached \u0438 \u043e\u0442\u0434\u0430\u0435\u043c \u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442<\/p>\n<\/li>\n<\/ol>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/6b0\/09b\/4a9\/6b009b4a9fcf8796f62b436b88da6474.jpg\" width=\"1603\" height=\"819\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6b0\/09b\/4a9\/6b009b4a9fcf8796f62b436b88da6474.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<h3>\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 Memcached \u0438 \u043d\u0430\u0448\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043f\u043e\u0434 .NET Core, \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0433\u0440\u0443\u0441\u0442\u043d\u043e. \u0415\u0441\u0442\u044c \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0441 .NET Framework \u043d\u0430 .NET Core <a href=\"https:\/\/github.com\/cnblogs\/EnyimMemcachedCore\">\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430<\/a> \u0441 \u043e\u0447\u0435\u043d\u044c \u0441\u0442\u0430\u0440\u044b\u043c \u0441\u0442\u0438\u043b\u0435\u043c \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043a\u0443\u0447\u0435\u0439 \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0445 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439. \u041d\u043e \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u043d\u0430\u0447\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Memcached, \u0432\u043f\u043e\u043b\u043d\u0435 \u043c\u043e\u0436\u043d\u043e \u0435\u044e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p>\u041c\u044b \u0436\u0435 \u0432\u0437\u044f\u043b\u0438 \u0435\u0435 \u0437\u0430 \u043e\u0441\u043d\u043e\u0432\u0443, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 \u043d\u0443\u043b\u044f. \u0417\u0430\u0442\u044e\u043d\u0438\u043b\u0438 \u0435\u0435 \u043f\u043e\u0434 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432 Memcached, \u0447\u0442\u043e-\u0442\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u043b\u0438 \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438. \u0415\u0441\u043b\u0438 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u043d\u0443\u043b\u044f, \u0442\u043e \u0432\u0430\u043c \u0441\u044e\u0434\u0430: <a href=\"https:\/\/github.com\/memcached\/memcached\/wiki\/BinaryProtocolRevamped\">Memcached binary protocol<\/a>.<\/p>\n<p>\u041c\u044b \u0432\u044b\u043a\u0430\u0442\u0438\u043b\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0432 <a href=\"https:\/\/github.com\/aliexpressru\/memcached\">open source<\/a>. \u0415\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0447\u0435\u0440\u0435\u0437 headless service, \u0442\u0430\u043a \u0438 \u0443\u043a\u0430\u0437\u0430\u0432 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e IP-\u0430\u0434\u0440\u0435\u0441\u0430 Memcached. \u0422\u043e \u0435\u0441\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0443\u043c\u0435\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043b\u044e\u0431\u044b\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432.<\/p>\n<h3>\u041f\u0440\u043e\u0444\u0438\u043b\u0438 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438<\/h3>\n<p>\u0421\u0442\u0430\u0432\u0438\u043c \u043e\u0434\u0438\u043d \u0438\u043d\u0441\u0442\u0430\u043d\u0441 Memcached \u0438 \u043d\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0435\u0433\u043e \u043d\u0430 SET. \u041a\u043b\u044e\u0447 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u2014 \u0433\u0443\u0438\u0434\u044b, \u0442\u043e \u0435\u0441\u0442\u044c \u043e\u0431\u044a\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u0430\u0439\u0442. \u041f\u0440\u043e\u0433\u043e\u043d \u0432 21.5k RPS \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 (\u0443 \u043d\u0430\u0441 \u0438\u0445 \u0442\u0440\u0438), \u043e\u0431\u0449\u0430\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 65k RPS, 1 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441.<\/p>\n<p>\u041d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 Memcached \u0432\u0438\u0434\u0438\u043c \u0440\u043e\u0432\u043d\u044b\u0435 \u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u043f\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c \u2014 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 1 CPU. \u0421\u043c\u043e\u0442\u0440\u0438\u043c \u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/3a6\/a68\/2ad\/3a6a682ad51641b6c76f62a566635f24.jpeg\" width=\"1271\" height=\"492\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3a6\/a68\/2ad\/3a6a682ad51641b6c76f62a566635f24.jpeg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/cc0\/9cd\/1fd\/cc09cd1fdc98ee0f1d5d4279b0653bf9.jpeg\" width=\"958\" height=\"566\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cc0\/9cd\/1fd\/cc09cd1fdc98ee0f1d5d4279b0653bf9.jpeg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0411\u0435\u0440\u0435\u043c 20 \u043a\u043b\u044e\u0447\u0435\u0439 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441, \u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043d\u0430 Memcached \u0432\u044b\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u0432 20 \u0440\u0430\u0437. \u041d\u0430 \u0438\u043d\u0441\u0442\u0430\u043d\u0441 Memcached \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u043a\u043e\u043b\u043e 18k RPS * 20 key values = 360k \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 SET \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u0434\u043e \u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430, \u043a\u0430\u043a \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0440\u0430\u0441\u0442\u0438 RT. \u041d\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u0430\u0445 \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0440\u0430\u0437\u044b \u0431\u043e\u043b\u044c\u0448\u0435 CPU:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/b51\/e01\/9fd\/b51e019fde9df970fef9b25037625409.jpeg\" width=\"1301\" height=\"755\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b51\/e01\/9fd\/b51e019fde9df970fef9b25037625409.jpeg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/fb8\/5b4\/bd1\/fb85b4bd1fba37364ea8a7ad57e6842d.jpeg\" width=\"625\" height=\"568\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fb8\/5b4\/bd1\/fb85b4bd1fba37364ea8a7ad57e6842d.jpeg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043b\u044e\u0447\u0435\u0439 \u0434\u043e 50. \u041d\u0430 \u0438\u043d\u0441\u0442\u0430\u043d\u0441 Memcached \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u043a\u043e\u043b\u043e 10k RPS * 50 key values = 500k \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 SET \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u0434\u043e \u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430, \u043a\u0430\u043a \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0440\u0430\u0441\u0442\u0438 RT. \u041f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 CPU \u0440\u0430\u0441\u0442\u0435\u0442 \u043d\u0435\u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u043e \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u044c, \u0447\u0442\u043e RT \u0432\u044b\u0440\u043e\u0441\u043b\u043e \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0441\u0438\u043b\u044c\u043d\u0435\u0435 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441\u043e \u0441\u043b\u0443\u0447\u0430\u0435\u043c \u0432 20 key values:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/76b\/508\/744\/76b5087445a91810c44077badad09f53.jpeg\" width=\"1455\" height=\"759\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/76b\/508\/744\/76b5087445a91810c44077badad09f53.jpeg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/258\/555\/fa0\/258555fa0e3f55a3efbbbf0c61fa9df7.jpeg\" width=\"595\" height=\"596\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/258\/555\/fa0\/258555fa0e3f55a3efbbbf0c61fa9df7.jpeg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u0438\u0445\u043e\u0434\u0438\u043c \u043a \u0432\u044b\u0432\u043e\u0434\u0443, \u0447\u0442\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u0432\u043b\u0438\u044f\u0435\u0442 \u0438 \u043d\u0430 CPU, \u0438 \u043d\u0430 RT. \u041b\u0443\u0447\u0448\u0435 \u043f\u0440\u0438\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0430\u0434\u0435\u043a\u0432\u0430\u0442\u043d\u044b\u0445 \u0446\u0438\u0444\u0440 \u0438 \u0432 \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u043f\u043e\u0441\u044b\u043b\u0430\u0442\u044c ~10 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043d\u0430 Memcached. \u0418\u043d\u0430\u0447\u0435 \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043a\u043b\u0438\u043a\u0430 \u043d\u0430\u0447\u043d\u0435\u0442 \u0440\u0430\u0441\u0442\u0438 \u0432 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0438\u0438 \u0438\u0437-\u0437\u0430 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f Memcached \u0434\u043b\u044f \u0441\u0431\u0440\u043e\u0441\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0441\u043e\u043a\u0435\u0442.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u043c \u0432 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 slab-\u043a\u043b\u0430\u0441\u0441, \u0442\u0430\u043a \u043a\u0430\u043a \u0440\u0430\u0437\u043c\u0435\u0440 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432\u0441\u0435\u0433\u0434\u0430 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439. \u0412\u043d\u0443\u0442\u0440\u0438 Memcached \u043a\u0430\u0436\u0434\u044b\u0439 slab-\u043a\u043b\u0430\u0441\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u043f\u043e\u0442\u043e\u043a, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u043f\u0435\u0440\u0435\u0442\u044c\u0441\u044f \u0432 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435. \u0422\u0430\u043a \u0447\u0442\u043e ~10 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043d\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u2014 \u044d\u0442\u043e \u0431\u0430\u0437\u043e\u0432\u0430\u044f \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u0432\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0444\u0438\u043b\u0435 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438.<\/p>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0431\u0435\u0440\u0435\u043c 8 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432 Memcached \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435, 100 key values \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c, \u0447\u0442\u043e \u043b\u0435\u0433\u043a\u043e \u0434\u0435\u0440\u0436\u0438\u043c \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430\u043c\u0438. \u041d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043f\u043e 12\u201313 key values \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/2fc\/f69\/5dc\/2fcf695dc1c9c7aafced67a6ab5fcdbe.jpeg\" width=\"1506\" height=\"564\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2fc\/f69\/5dc\/2fcf695dc1c9c7aafced67a6ab5fcdbe.jpeg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041f\u043e\u043c\u0435\u0449\u0430\u0435\u043c\u0441\u044f \u0432 1\u20132 CPU \u043d\u0430 \u0438\u043d\u0441\u0442\u0430\u043d\u0441 Memcached:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/dd8\/5e5\/076\/dd85e50769b95332165c54fd45e00b99.jpeg\" width=\"479\" height=\"224\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/dd8\/5e5\/076\/dd85e50769b95332165c54fd45e00b99.jpeg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c \u0431\u0440\u0430\u0442\u044c \u043f\u043e 10\u201320 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 SET \u043d\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0438 2 CPU \u043d\u0430 \u0438\u043d\u0441\u0442\u0430\u043d\u0441 Memcached. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u0430\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 GET \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 \u0434\u0432\u0430 \u0440\u0430\u0437\u0430 \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0443 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 SET, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0438 \u043b\u0435\u0433\u0447\u0435. \u041d\u043e \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043b\u0443\u0447\u0448\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0435, \u0447\u0442\u043e\u0431\u044b \u043c\u0435\u043d\u044c\u0448\u0435 \u0433\u0440\u0443\u0437\u0438\u0442\u044c Memcached \u0438 \u043d\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043a\u043b\u0438\u043a\u0430. \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432 \u043d\u0435 \u0432\u044b\u0432\u043e\u0437\u0438\u0442 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0449\u0435 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432.<\/p>\n<p><strong>\u041f\u0440\u043e\u0444\u0438\u043b\u044c \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432<\/strong>. 6 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432 Memcached, \u043e\u0436\u0438\u0434\u0430\u0435\u043c \u043f\u0440\u0438\u0440\u043e\u0441\u0442 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438. \u0421\u0435\u0439\u0447\u0430\u0441 \u0438\u043c\u0435\u0435\u043c \u043e\u043a\u043e\u043b\u043e 2k RPS \u0432 \u0441\u0440\u0435\u0434\u043d\u0435\u043c \u043f\u043e 15\u201320 key values \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8f9\/0a4\/ba2\/8f90a4ba2a1a08360fb1aef917db2182.png\" width=\"1248\" height=\"293\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8f9\/0a4\/ba2\/8f90a4ba2a1a08360fb1aef917db2182.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 Memcached \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c 40k RPS:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/45e\/3f9\/20b\/45e3f920b0b72c0d0478e232c89c1a49.png\" width=\"1657\" height=\"531\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/45e\/3f9\/20b\/45e3f920b0b72c0d0478e232c89c1a49.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u043c\u0430\u043d\u0434 = RPS \u0441\u0435\u0440\u0432\u0438\u0441\u0430 * \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432 Memcached. RT \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 0,5ms:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8d8\/18f\/744\/8d818f74409885fa6c696875b4e194b0.png\" width=\"2489\" height=\"655\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8d8\/18f\/744\/8d818f74409885fa6c696875b4e194b0.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0411\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043c\u0435\u0442\u0440\u0438\u043a \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438\u0437 Memcached \u0432 \u041f\u0440\u043e\u043c\u0435\u0442\u0435\u0439. \u0414\u0430\u043d\u043d\u044b\u0435 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u043f\u0438\u0448\u0435\u0442 \u043d\u0430\u0448\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430.<\/p>\n<p><strong>\u0421\u0430\u043c\u044b\u0439 \u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442<\/strong>. \u041c\u044b \u0432\u0437\u044f\u043b\u0438 40 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432 Memcached \u0441 1 CPU \u0438 \u0434\u043e\u0431\u0438\u043b\u0438 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0434\u043e 30 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 key values \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443. 2,5KB \u043a\u0430\u0436\u0434\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, 3 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f ~24GB\/s \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u043d\u0430 \u043e\u0434\u0438\u043d \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0438 72GB\/s \u0432\u0441\u0435\u0433\u043e:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5f5\/376\/79b\/5f537679b492565ddacdf71a5b2106e6.png\" width=\"1657\" height=\"536\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5f5\/376\/79b\/5f537679b492565ddacdf71a5b2106e6.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u0438 \u0441\u0430\u043c\u043e\u0439 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0434\u0435\u0440\u0436\u0438\u043c\u0441\u044f \u0432 \u0440\u0430\u0439\u043e\u043d\u0435 1ms \u043d\u0430 \u043e\u0434\u043d\u0443 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0432 Memcached:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0ad\/c05\/74e\/0adc0574e3642055ec88a9f44f3c564d.png\" width=\"1249\" height=\"315\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0ad\/c05\/74e\/0adc0574e3642055ec88a9f44f3c564d.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0422\u0443\u0442 \u043c\u044b \u0440\u0430\u0437\u0431\u0438\u043b\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043f\u0430\u0447\u043a\u0438. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u0430 \u043e\u0434\u0438\u043d \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e 3000 key values. \u041c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u043f\u0438\u0445\u043d\u0443\u0442\u044c \u0432\u0441\u0451 \u0441\u0440\u0430\u0437\u0443 \u0432 \u043e\u0434\u0438\u043d \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u2014 \u043d\u0443\u0436\u043d\u043e \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 10\u201320 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043d\u0430 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d. \u0411\u0435\u0437 \u0440\u0430\u0437\u0431\u0438\u0442\u0438\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u043d\u043e\u0434\u0443 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0431\u044b 3000 \/ 40 = 75 key values. \u0420\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u043c \u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043d\u0430 4 \u0440\u0430\u0437\u043d\u044b\u0435 \u0447\u0430\u0441\u0442\u0438 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0440\u043e\u0441\u0442\u0430 RT.<\/p>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Memcached<\/h3>\n<p>\u041f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 <a href=\"https:\/\/docs.oracle.com\/cd\/E17952_01\/mysql-5.6-en\/ha-memcached-cmdline-options.html\">\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b<\/a>. \u041f\u043e\u043b\u0435\u0437\u043d\u043e \u043f\u043e \u043d\u0438\u043c \u043f\u0440\u043e\u0439\u0442\u0438\u0441\u044c \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0442\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0432\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043f\u043e\u0434\u0442\u044e\u043d\u0438\u0442\u044c. \u041a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c, \u043f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:<\/p>\n<pre><code class=\"bash\"># MaxMemoryLimit, this should be less than the resources.limits.memory, or memcached will crash.  Default is 64MB - -m 8192  # Specify the maximum number of simultaneous connections to the memcached service. The default is 1024.  - -c 20000<\/code><\/pre>\n<p>\u041f\u0430\u043c\u044f\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u2014 \u0440\u0435\u0434\u043a\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u043b\u0435\u0437\u0442\u044c \u0432 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0410 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u043d\u0430\u0434\u043e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0445\u0432\u0430\u0442\u0438\u043b\u043e \u043d\u0430 \u0440\u0435\u0434\u0435\u043f\u043b\u043e\u0439 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 Memcached. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0440\u0435\u0434\u0435\u043f\u043b\u043e\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0441\u043a\u043e\u0447\u0438\u0442.<\/p>\n<p>\u0418\u0437 \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0433\u043e \u0435\u0441\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0430\u043a\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440:<\/p>\n<pre><code class=\"bash\">- -R 40 # The command-line parameter -R is in charge of the maximum number of requests per  # network IO event (default value is 20). The application should adopt its batch  # size according to this parameter. Please note that the requests limit does not  # affect multi-key reads, or the number of keys per get request.<\/code><\/pre>\n<p>\u0418 \u0435\u0441\u043b\u0438 \u043d\u0435\u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0438\u043d\u0433\u043e\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0440\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0442\u0430\u043a\u0443\u044e \u0432\u043e\u0442 \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u0443\u044e \u0441\u0442\u0430\u0442\u0443:<\/p>\n<pre><code>STAT conn_yields 126672162 Number of times any connection yielded to another due to hitting the -R limit<\/code><\/pre>\n<h3>\u0418\u0442\u043e\u0433<\/h3>\n<ul>\n<li>\n<p>\u0418\u043c\u0435\u0435\u043c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u043a\u044d\u0448, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u043c \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430<\/p>\n<\/li>\n<li>\n<p>\u0423\u043c\u0435\u0435\u043c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0438 \u0443\u0431\u0438\u0440\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u044b Memcached<\/p>\n<\/li>\n<li>\n<p>\u041f\u0443\u0442\u0435\u043c \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u0447\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 \u0432\u044b\u0432\u0435\u0434\u0435\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043d\u0430 \u043e\u0434\u0438\u043d \u0438\u043d\u0441\u0442\u0430\u043d\u0441: 2.5 CPU \u0438 8GB RAM. \u0411\u043e\u043b\u044c\u0448\u0435 CPU \u0431\u0440\u0430\u0442\u044c \u043d\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430 \u0438\u0437-\u0437\u0430 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u044b LRU \u2014 \u043b\u0443\u0447\u0448\u0435 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0430\u043d\u0441. \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0435\u0442 \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0441 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439, \u043d\u0430\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u043c \u0435\u0449\u0435. \u0412\u044b\u0431\u043e\u0440 8GB RAM \u043f\u0440\u043e\u0434\u0438\u043a\u0442\u043e\u0432\u0430\u043d \u0442\u0435\u043c, \u0447\u0442\u043e \u0447\u0430\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435 \u0436\u0430\u043b\u043a\u043e \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c<\/p>\n<\/li>\n<li>\n<p>0.5 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u044b RT \u0438\u0437 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0432 Memcached \u043f\u0440\u0438 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0441 \u0443\u043c\u0435\u0440\u0435\u043d\u043d\u044b\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043a\u043b\u044e\u0447\u0435\u0439 \u043d\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0443;<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u043a\u0430\u0442\u0438\u043b\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0432 <a href=\"https:\/\/github.com\/aliexpressru\/memcached\">open source<\/a>.<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/aliexpress_russia\/blog\/694226\/\"> https:\/\/habr.com\/ru\/company\/aliexpress_russia\/blog\/694226\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0410\u043d\u0434\u0440\u0435\u0439 \u0411\u0430\u0440\u0431\u043e\u043b\u0438\u043d, \u044f Senior Software Engineer \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 Order Management System. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0432\u0430\u043c, \u043a\u0430\u043a \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0448\u0430\u0440\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u044d\u0448 \u0438 \u043f\u043e\u0434 \u0441\u0442\u0440\u0435\u0441\u0441-\u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u0434\u043e\u0431\u0438\u043b\u0438\u0441\u044c 30 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e \u043f\u0435\u0440\u0432\u0443\u044e open source \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u043e\u0442 AliExpress \u0420\u043e\u0441\u0441\u0438\u044f.<\/p>\n<h2>\u0412\u0432\u043e\u0434\u043d\u044b\u0435<\/h2>\n<ul>\n<li>\n<p>\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432 \u043a\u044d\u0448\u0435 200-300GB \u0434\u0430\u043d\u043d\u044b\u0445;<\/p>\n<\/li>\n<li>\n<p>\u0426\u0435\u043b\u0435\u0432\u0430\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043d\u0430 \u0441\u0435\u0440\u0432\u0438\u0441 30 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 key values \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443.<\/p>\n<\/li>\n<\/ul>\n<p>\u0418 \u044d\u0442\u043e \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u0422\u0430\u043a\u0436\u0435 \u0431\u044b\u0432\u0430\u044e\u0442 \u043f\u0435\u0440\u0438\u043e\u0434\u044b \u0440\u0430\u0441\u043f\u0440\u043e\u0434\u0430\u0436, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0443\u043c\u0435\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u044b \u043a\u044d\u0448\u0435\u0439.<\/p>\n<p>\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u2014 \u0448\u0430\u0440\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0435. \u0427\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u043e\u044f\u0442\u044c \u0432 \u043f\u043b\u0430\u043d\u0435 \u043a\u044d\u0448\u0430 \u043d\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435, \u0443\u0436\u0435 \u043d\u0435 \u0442\u0430\u043a \u0432\u0430\u0436\u043d\u043e. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c Redis, Memcached \u0438\u043b\u0438 \u043b\u044e\u0431\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435.<\/p>\n<h3>\u041f\u043e\u0434\u0431\u043e\u0440 \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/h3>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e, \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0438 \u043e\u0431\u044a\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442 \u0442\u044b\u0441\u044f\u0447 RPS, \u0430 \u043e\u0431\u044a\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439, \u0441\u0442\u043e\u0438\u0442 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0437\u0440\u0435\u043b\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043c\u044c\u044e\u043d\u0438\u0442\u0438 \u0438 \u043d\u0438\u0437\u043a\u0438\u043c \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u0432\u0445\u043e\u0434\u0430. \u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u044d\u0442\u043e Redis. \u0422\u0435\u043c \u0431\u043e\u043b\u0435\u0435, \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u044d\u0442\u0430\u043a\u0438\u0439 \u0448\u0432\u0435\u0439\u0446\u0430\u0440\u0441\u043a\u0438\u0439 \u043d\u043e\u0436, \u0432\u0435\u0434\u044c \u044d\u0442\u043e \u0443\u0436\u0435 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u044d\u0448. \u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u0435\u0433\u043e \u0431\u043e\u0433\u0430\u0442\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441, \u043e\u043d \u0434\u0430\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443. \u041d\u0430\u043c \u0432 AliExpress \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432 \u043a\u044d\u0448\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c CPU \u043f\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u0443. Redis \u043e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0439 \u2014 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043a\u0443 \u0437\u0430\u0432\u0435\u0437\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 6-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0432 \u043c\u0430\u0435 2020, \u0434\u0430 \u0438 \u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 I\/O, \u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435 \u0438\u0437 \u0441\u043e\u043a\u0435\u0442\u043e\u0432 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u043d\u0438\u0445. \u0421\u0442\u043e\u0438\u0442 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0434\u0440\u0443\u0433\u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439. \u042d\u043d\u0442\u0443\u0437\u0438\u0430\u0441\u0442\u044b \u0444\u043e\u0440\u043a\u043d\u0443\u043b\u0438 Redis, \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0435\u0433\u043e \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u043c, \u0438 \u0442\u0430\u043a \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f <a href=\"https:\/\/medium.com\/@john_63123\/redis-should-be-multi-threaded-e28319cab744\">KeyDb<\/a>. \u0415\u0449\u0435 \u0435\u0441\u0442\u044c Dragonfly, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438 \u0440\u0443\u0433\u0430\u0435\u0442 Redis <a href=\"https:\/\/dragonflydb.io\/blog\/2022\/01\/30\/simple_is_beatiful\/\">\u0432 \u0441\u0432\u043e\u0435\u043c \u0431\u043b\u043e\u0433\u0435<\/a> \u0437\u0430 \u0441\u043b\u0430\u0431\u044b\u0439 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442 \u043d\u0430 \u0432\u044b\u0441\u043e\u043a\u0438\u0445 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430\u0445. \u0422\u0443\u0442 \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u043d\u0435\u0435 \u0437\u0440\u0435\u043b\u044b\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435: \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0440\u0443\u043a\u0443 \u043d\u0430 \u043f\u0443\u043b\u044c\u0441\u0435 \u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u0444\u0438\u043a\u0441\u0438\u043b\u0438 \u0438 \u0437\u0430\u0432\u0435\u0437\u043b\u0438 \u0432 \u043d\u043e\u0432\u044b\u0445 \u0440\u0435\u043b\u0438\u0437\u0430\u0445.<\/p>\n<p>\u041c\u044b \u0432\u044b\u0431\u0440\u0430\u043b\u0438 Memcached, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d \u0433\u043e\u0434\u0430\u043c\u0438, \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c \u0438 \u043d\u0430\u0434\u0435\u0436\u0435\u043d. \u042d\u0442\u043e \u0442\u043e\u043f\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u044d\u0448, \u0438 \u0432\u0441\u0451. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435, \u0434\u0430\u0436\u0435 \u043d\u043e\u0432\u043e\u043c\u043e\u0434\u043d\u044b\u0439 Dragonfly \u043f\u043e \u0438\u0445 \u0436\u0435 <a href=\"https:\/\/github.com\/dragonflydb\/dragonfly\">\u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430\u043c<\/a> \u043d\u0435 \u0441\u043c\u043e\u0433 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0431\u043e\u0439\u0442\u0438 Memcached:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0418\u0437-\u0437\u0430 \u0441\u0432\u043e\u0435\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b Memcached:<\/p>\n<ul>\n<li>\n<p>\u041b\u0443\u0447\u0448\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c;<\/p>\n<\/li>\n<li>\n<p>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u0436\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0438\u0437 \u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b.<\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u043e \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 Memcached:<\/p>\n<ul>\n<li>\n<p>250 bytes \u043d\u0430 \u043a\u043b\u044e\u0447. \u042d\u0442\u043e \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043f\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445. \u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c, \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c Memcached;<\/p>\n<\/li>\n<li>\n<p>1MB \u043d\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u042d\u0442\u0430 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0430 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f;<\/p>\n<\/li>\n<li>\n<p>Eviction policy \u0442\u043e\u043b\u044c\u043a\u043e LRU (Last recently used).<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043e\u0431\u043e\u0441\u043d\u043e\u0432\u0430\u043d\u044b \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043e\u0439 Memcached \u0441 slub-\u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438 \u0438 LRU. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 \u0438\u0445 <a href=\"https:\/\/github.com\/memcached\/memcached\/wiki\/UserInternals\">Wiki<\/a>.<\/p>\n<h3>\u0428\u0430\u0440\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0435<\/h3>\n<p>\u0418\u0442\u0430\u043a, \u043c\u044b \u0432\u0437\u044f\u043b\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u043a\u044d\u0448\u0430. \u041f\u043e\u0440\u0430 \u043d\u0430\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0435\u0433\u043e \u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0438 \u0448\u0430\u0440\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u0437\u044f\u0442\u044c \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0442 Facebook, \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 Memcached. \u041e\u043d\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u043a \u043d\u0435\u043c\u0443 <a href=\"https:\/\/github.com\/facebook\/mcrouter\">mc router<\/a>, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0448\u0438\u0440\u043e\u043a\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u2014 \u043d\u0430 \u043d\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u043e\u043e\u0431\u0449\u0435 \u043b\u044e\u0431\u043e\u0439 \u0440\u043e\u0443\u0442\u0438\u043d\u0433, \u043a\u0430\u043a\u043e\u0439 \u043f\u043e\u0436\u0435\u043b\u0430\u0435\u0448\u044c. \u041d\u043e \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u044d\u0442\u043e \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0447\u0435\u0440\u043d\u044b\u0439 \u044f\u0449\u0438\u043a \u043d\u0430 \u043f\u0443\u0442\u0438 \u043a \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u043c\u0443 \u043a\u044d\u0448\u0443. \u0410 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0439 \u0438 \u0442\u043e\u043d\u043a\u0438\u0439 \u043a\u043b\u0438\u0435\u043d\u0442.<\/p>\n<p>\u041d\u0430 \u0432\u0445\u043e\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c consistent hashing aka HashRing. \u042d\u0442\u043e \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0438 \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u044b Memcached \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0431\u0435\u0437 \u0440\u0435\u0434\u0435\u043f\u043b\u043e\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442.<\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e A, B, C \u2014 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u044b Memcached. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0438\u0445 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u043a\u0440\u0443\u0433\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435\u043c hash \u043f\u043e IP-\u0430\u0434\u0440\u0435\u0441\u0430\u043c \u043f\u043e\u0434\u043e\u0432. \u0414\u0430\u043b\u044c\u0448\u0435 \u043c\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c hash \u043f\u043e \u043a\u043b\u044e\u0447\u0443, \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0439 \u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u043f\u043e \u0447\u0430\u0441\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u0435\u043b\u043a\u0435 (\u0438\u043b\u0438 \u043f\u0440\u043e\u0442\u0438\u0432) \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043d\u0435\u0433\u043e:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0415\u0441\u043b\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u043f\u043e\u0434\u043e\u0432 \u043e\u0442\u043a\u0430\u0436\u0435\u0442, \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u0431\u0440\u0430\u0442\u044c \u0435\u0433\u043e \u0438\u0437 HashRing. \u041d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u043a\u043e\u0441 \u043f\u043e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u2014 \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u043b\u0438 \u0438\u0434\u0442\u0438 \u043d\u0430 \u0438\u043d\u0441\u0442\u0430\u043d\u0441 B, \u0442\u0435\u043f\u0435\u0440\u044c \u0443\u0445\u043e\u0434\u044f\u0442 \u043d\u0430 \u0438\u043d\u0441\u0442\u0430\u043d\u0441 C:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0430\u0441\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e \u043c\u0435\u0436\u0434\u0443 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430\u043c\u0438 A \u0438 C. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0430 \u043a\u0440\u0443\u0433 \u00ab\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435\u00bb \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0441 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0435\u0441\u043b\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432 \u043e\u0442\u043a\u0430\u0436\u0435\u0442, \u0432\u0441\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430\u043c\u0438:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u0447\u0442\u043e <a href=\"https:\/\/redis.io\/docs\/manual\/scaling\/\">Redis \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u043d\u0435 \u0443\u043c\u0435\u0435\u0442<\/a>:<\/p>\n<blockquote>\n<p>Redis Cluster supports multiple key operations as long as all of the keys involved in a single command execution (or whole transaction, or Lua script execution) belong to the same hash slot. The user can force multiple keys to be part of the same hash slot by using a feature called\u00a0<em>hash tags.<\/em><\/p>\n<\/blockquote>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u043e\u0443\u043f\u0440\u0430\u0436\u043d\u044f\u0442\u044c\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u044e\u0447\u0435\u0439 \u0438 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c:<\/p>\n<pre><code class=\"xml\">(error) ERR CROSSSLOT Keys in request don't hash to the same slot<\/code><\/pre>\n<p>Hash tags \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0435\u0439 \u043f\u043e \u043d\u0435\u043a\u043e\u0435\u043c\u0443 \u0442\u044d\u0433\u0443, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u0442 \u0441\u0447\u0438\u0442\u0430\u0442\u044c\u0441\u044f hash, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043a\u043b\u044e\u0447\u0438 \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 hash slot (<a href=\"https:\/\/redis.io\/docs\/reference\/cluster-spec\/\">\u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>):<\/p>\n<pre><code class=\"yaml\">MSET {user:1000}.name Angela {user:1000}.surname White<\/code><\/pre>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0438\u043d\u0433 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 get\/set, \u043d\u043e \u044f \u0441\u0445\u043e\u0434\u0443 \u043d\u0435 \u043d\u0430\u0448\u0435\u043b \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0431\u0435\u0437 hash tag\u2019\u043e\u0432. <a href=\"https:\/\/redis.com\/blog\/redis-clustering-best-practices-with-keys\/\">\u0417\u0434\u0435\u0441\u044c<\/a> \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0441\u044f, \u0447\u0442\u043e:<\/p>\n<blockquote>\n<p>Redis Enterprise has a few workarounds for simple commands, notably MGET and MSET.<\/p>\n<\/blockquote>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438\u043b\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u044f \u043d\u0430\u0439\u0442\u0438 \u043d\u0435 \u0441\u043c\u043e\u0433. \u041d\u043e \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u044d\u0442\u0438 \u043e\u0431\u0445\u043e\u0434\u043d\u044b\u0435 \u043f\u0443\u0442\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442, <a href=\"https:\/\/redis.com\/redis-enterprise\/advantages\/\">Redis Enterprise<\/a> \u0432\u0441\u0435 \u0435\u0449\u0435 <a href=\"https:\/\/redis.com\/redis-enterprise-cloud\/pricing\/\">\u0441\u0442\u043e\u0438\u0442 \u0434\u0435\u043d\u044e\u0436\u043a\u0443<\/a>.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0435\u0442\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u044e\u0447\u0435\u0439 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432 Redis, \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438.<\/p>\n<h3>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043f\u043e HashRing<\/h3>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u0434\u043e\u0431\u0438\u0432\u0430\u0435\u043c\u0441\u044f O(log(n)):<\/p>\n<pre><code class=\"cs\">private TNode GetNodeInternal(string key) {     var keyHash = GetHash(key);      var index = Array.BinarySearch(_sortedNodeHashKeys, keyHash);     if (index &lt; 0) \/\/ no exact match     {         \/\/ If the Array does not contain the specified value, the method returns a negative integer.         \/\/ You can apply the bitwise complement operator to the negative result to produce an index.         \/\/ If this index is one greater than the upper bound of the array, there are no elements larger than value in the array.         \/\/ Otherwise, it is the index of the first element that is larger than value.         index = ~index;          if (index >= _sortedNodeHashKeys.Length)         {             index = 0;         }     }      var hashNodeKey = _sortedNodeHashKeys[index];      return _hashToNodeMap[hashNodeKey]; }<\/code><\/pre>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043f\u043e\u0438\u0441\u043a \u043d\u043e\u0434 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e:<\/p>\n<pre><code class=\"cs\">public IDictionary&lt;TNode, ConcurrentBag&lt;string>> GetNodes(IEnumerable&lt;string> keys) {     var result = new ConcurrentDictionary&lt;TNode, ConcurrentBag&lt;string>>(Comparer);      try     {         _locker.EnterReadLock();                  if (_sortedNodeHashKeys == null || _sortedNodeHashKeys.Length == 0)         {             return result;         }          Parallel.ForEach(keys, new ParallelOptions { MaxDegreeOfParallelism = 16 },key =>         {             var node = GetNodeInternal(key);              var bag = result.GetOrAdd(node, (Func&lt;TNode, ConcurrentBag&lt;string>>) ValueFactory);             bag.Add(key);         });     }     finally     {         _locker.ExitReadLock();     }      return result; }<\/code><\/pre>\n<p>\u0411\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438 \u043f\u0440\u0438 256 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u043e\u0434\u0430\u0445 \u043d\u0430 \u043e\u0434\u043d\u0443 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0443\u044e:<\/p>\n<pre><code class=\"coffeescript\">BenchmarkDotNet=v0.13.1, OS=macOS Monterey 12.3.1 (21E258)  [Darwin 21.4.0] Apple M1, 1 CPU, 8 logical and 8 physical cores .NET SDK=6.0.400  [Host] : .NET 6.0.8 (6.0.822.36306), Arm64 RyuJIT DefaultJob : .NET 6.0.8 (6.0.822.36306), Arm64 RyuJIT<\/code><\/pre>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p>Method<\/p>\n<\/th>\n<th>\n<p>KeysNumber<\/p>\n<\/th>\n<th>\n<p>NodesNumber<\/p>\n<\/th>\n<th>\n<p>Mean<\/p>\n<\/th>\n<th>\n<p>Error<\/p>\n<\/th>\n<th>\n<p>StdDev<\/p>\n<\/th>\n<th>\n<p>Median<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">5.683 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.5613 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.655 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">4.692 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">16<\/p>\n<\/td>\n<td>\n<p align=\"left\">5.485 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.5255 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.549 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">4.639 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">32<\/p>\n<\/td>\n<td>\n<p align=\"left\">6.239 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.7027 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">2.072 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">5.060 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">128<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">33.824 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">2.7571 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">8.086 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">29.377 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">128<\/p>\n<\/td>\n<td>\n<p align=\"left\">16<\/p>\n<\/td>\n<td>\n<p align=\"left\">118.482 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">7.0747 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">20.860 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">114.546 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">128<\/p>\n<\/td>\n<td>\n<p align=\"left\">32<\/p>\n<\/td>\n<td>\n<p align=\"left\">188.920 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">12.1676 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">35.877 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">181.387 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">512<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">73.147 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">4.7427 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">13.984 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">66.924 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">512<\/p>\n<\/td>\n<td>\n<p align=\"left\">16<\/p>\n<\/td>\n<td>\n<p align=\"left\">175.545 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">10.4275 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">30.746 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">168.805 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">512<\/p>\n<\/td>\n<td>\n<p align=\"left\">32<\/p>\n<\/td>\n<td>\n<p align=\"left\">293.666 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">13.3944 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">39.494 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">277.418 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">2048<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">193.951 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">8.5778 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">24.749 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">189.355 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">2048<\/p>\n<\/td>\n<td>\n<p align=\"left\">16<\/p>\n<\/td>\n<td>\n<p align=\"left\">326.530 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">15.2840 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">44.825 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">309.335 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">2048<\/p>\n<\/td>\n<td>\n<p align=\"left\">32<\/p>\n<\/td>\n<td>\n<p align=\"left\">466.940 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">18.1174 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">52.849 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">456.591 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">5000<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">427.750 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">16.5527 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">48.806 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">420.915 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">5000<\/p>\n<\/td>\n<td>\n<p align=\"left\">16<\/p>\n<\/td>\n<td>\n<p align=\"left\">574.372 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">25.4257 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">74.569 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">564.302 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">5000<\/p>\n<\/td>\n<td>\n<p align=\"left\">32<\/p>\n<\/td>\n<td>\n<p align=\"left\">688.616 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">26.3884 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">76.558 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">663.938 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">10000<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">814.684 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">27.5884 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">80.039 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">807.244 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">10000<\/p>\n<\/td>\n<td>\n<p align=\"left\">16<\/p>\n<\/td>\n<td>\n<p align=\"left\">1,020.214 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">36.8499 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">108.074 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">1,021.344 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">10000<\/p>\n<\/td>\n<td>\n<p align=\"left\">32<\/p>\n<\/td>\n<td>\n<p align=\"left\">1,269.259 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">35.2069 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">103.256 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">1,288.021 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">20000<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">1,617.165 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">44.5917 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">131.480 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">1,629.595 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">20000<\/p>\n<\/td>\n<td>\n<p align=\"left\">16<\/p>\n<\/td>\n<td>\n<p align=\"left\">1,899.443 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">63.8206 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">188.176 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">1,828.317 us<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GetNodes<\/p>\n<\/td>\n<td>\n<p align=\"left\">20000<\/p>\n<\/td>\n<td>\n<p align=\"left\">32<\/p>\n<\/td>\n<td>\n<p align=\"left\">2,059.760 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">60.0584 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">174.240 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">2,015.047 us<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><code>1 us        : 1 Microsecond (0.000001 sec)<\/code><\/p>\n<p>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 hash-\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f MurMurHash3. \u0417\u0430\u0442\u0435\u043c \u043c\u044b \u043f\u0435\u0440\u0435\u0448\u043b\u0438 \u043d\u0430 xxHash, \u0447\u0442\u043e \u0434\u0430\u043b\u043e \u0447\u0435\u0442\u044b\u0440\u0435\u0445\u043a\u0440\u0430\u0442\u043d\u044b\u0439 \u0432\u044b\u0438\u0433\u0440\u044b\u0448 \u0432 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438. \u0423 xxHash \u0435\u0441\u0442\u044c <a href=\"https:\/\/github.com\/uranium62\/xxHash\">\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/a> \u043d\u0430 C# \u0431\u0435\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0439. \u0412 \u0441\u0432\u043e\u0435\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u043c\u044b \u0442\u043e\u0436\u0435 \u0432\u0441\u0442\u0430\u043b\u0438 \u043d\u0430 \u043f\u0443\u0442\u044c zero allocation \u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c ArrayPool \u0438 Span&#8217;\u044b. \u041d\u043e \u043d\u0430\u043c \u0435\u0449\u0435 \u0435\u0441\u0442\u044c \u043d\u0430\u0434 \u0447\u0435\u043c \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<p>\u041f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0440\u043e <a href=\"https:\/\/adamsitnik.com\/Array-Pool\/\">Array Pool<\/a>.<\/p>\n<p><a href=\"https:\/\/docs.microsoft.com\/en-us\/archive\/msdn-magazine\/2018\/january\/csharp-all-about-span-exploring-a-new-net-mainstay\">\u041f\u043e\u0447\u0438\u0442\u0430\u0442\u044c<\/a> \u0438 <a href=\"https:\/\/docs.microsoft.com\/en-us\/events\/connect-2017\/t125\">\u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c<\/a> \u043f\u0440\u043e Span&#8217;\u044b.<\/p>\n<h3>\u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0434 \u043d\u0430 HashRing<\/h3>\n<p>\u0414\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0434 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432 \u0441\u0438\u043b\u0443 \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u043e\u0434, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u0430\u0441\u044c \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 1\u20132% \u043f\u043e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435.<\/p>\n<p>\u041d\u0430\u0433\u0440\u0443\u0437\u043e\u0447\u043d\u043e\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438 64 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u043e\u0434\u0430\u0445 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e \u0434\u043e 5% \u0440\u0430\u0437\u043d\u0438\u0446\u044b \u0432 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435. \u041f\u0440\u043e\u0432\u043e\u0434\u0438\u043c \u0442\u0435\u0441\u0442\u044b \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u0438 256 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u043e\u0434\u0430\u0445 \u0441\u043e \u0441\u0440\u0435\u0434\u043d\u0438\u043c \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435\u043c \u0432 1\u20132% \u043c\u0435\u0436\u0434\u0443 \u0441\u0430\u043c\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0439 \u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0439 \u043d\u043e\u0434\u0430\u043c\u0438:<\/p>\n<pre><code class=\"cs\">var keysNumber = 2000000; var nodesNumber = new[] {1, 2, 4, 8, 16, 32}; var virtualNodesNumber = new[] {16, 32, 64, 128, 256, 512};  foreach (var nodeNumber in nodesNumber) {     foreach (var virtualNodeNumber in virtualNodesNumber)     {         var hashRing = new HashRing&lt;Pod>(new HashCalculator(), virtualNodeNumber);                  var pods = Enumerable.Range(0, nodeNumber).Select(n => new Pod         {             IpAddress = Guid.NewGuid().ToString()         });                  hashRing.AddNodes(pods);         var keys = Enumerable.Range(0, keysNumber).Select(n =><\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-339934","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/339934","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=339934"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/339934\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=339934"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=339934"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=339934"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}