{"id":201805,"date":"2025-05-10T08:39:31","date_gmt":"2025-05-10T00:39:31","guid":{"rendered":"https:\/\/server.hk\/cnblog\/201805\/"},"modified":"2025-05-10T08:39:31","modified_gmt":"2025-05-10T00:39:31","slug":"redis%e4%bd%bf%e7%94%a8lua%e8%84%9a%e6%9c%ac%e8%a7%a3%e5%86%b3%e5%a4%9a%e7%ba%bf%e7%a8%8b%e4%b8%8b%e7%9a%84%e8%b6%85%e5%8d%96%e9%97%ae%e9%a2%98%e5%8f%8a%e5%8e%9f%e5%9b%a0%e8%a7%a3%e6%9e%90","status":"publish","type":"post","link":"https:\/\/server.hk\/cnblog\/201805\/","title":{"rendered":"redis\u4f7f\u7528Lua\u811a\u672c\u89e3\u51b3\u591a\u7ebf\u7a0b\u4e0b\u7684\u8d85\u5356\u95ee\u9898\u53ca\u539f\u56e0\u89e3\u6790"},"content":{"rendered":"<p><b><\/b> <\/p>\n<h1>redis\u4f7f\u7528Lua\u811a\u672c\u89e3\u51b3\u591a\u7ebf\u7a0b\u4e0b\u7684\u8d85\u5356\u95ee\u9898\u53ca\u539f\u56e0\u89e3\u6790<\/h1>\n<p><span style=\"cursor: pointer\"><i><\/i>\u6536\u85cf<\/span> <\/p>\n<p>\u5c0f\u4f19\u4f34\u4eec\u6709\u6ca1\u6709\u89c9\u5f97\u5b66\u4e60<span style=\"color: #FF6600;, Helvetica, Arial, sans-serif;font-size: 14px;background-color: #FFFFFF\">\u6570\u636e\u5e93<\/span>\u5f88\u6709\u610f\u601d\uff1f\u6709\u610f\u601d\u5c31\u5bf9\u4e86\uff01\u4eca\u5929\u5c31\u7ed9\u5927\u5bb6\u5e26\u6765<span style=\"color: #FF6600;, Helvetica, Arial, sans-serif;font-size: 14px;background-color: #FFFFFF\">\u300aredis\u4f7f\u7528Lua\u811a\u672c\u89e3\u51b3\u591a\u7ebf\u7a0b\u4e0b\u7684\u8d85\u5356\u95ee\u9898\u53ca\u539f\u56e0\u89e3\u6790\u300b<\/span>\uff0c\u4ee5\u4e0b\u5185\u5bb9\u5c06\u4f1a\u6d89\u53ca\u5230<span style=\"color: #FF6600;, Helvetica, Arial, sans-serif;font-size: 14px;background-color: #FFFFFF\">\u591a\u7ebf\u7a0b\u3001redislua\u3001\u8d85\u5356<\/span>\uff0c\u82e5\u662f\u5728\u5b66\u4e60\u4e2d\u5bf9\u5176\u4e2d\u90e8\u5206\u77e5\u8bc6\u70b9\u6709\u7591\u95ee\uff0c\u6216\u8bb8\u770b\u4e86\u672c\u6587\u5c31\u80fd\u5e2e\u5230\u4f60\uff01<\/p>\n<h2>\u4e00.\u591a\u7ebf\u7a0b\u4e0b\u5f15\u8d77\u7684\u8d85\u5356\u95ee\u9898\u5448\u73b0<\/h2>\n<p>1.1.\u6211\u5148\u521d\u59cb\u5316\u5e93\u5b58\u6570\u91cf\u4e3a1\u3001\u8ba2\u5355\u6570\u91cf\u4e3a0<\/p>\n<p style=\"text-align:center\"><img decoding=\"async\" src=\"https:\/\/www.17golang.com\/uploads\/20230512\/1683886509645e11ad7ccdf.jpg1683886509645e11ad7ccf3.png\" class=\"aligncenter\"><\/p>\n<p style=\"text-align:center\"><img decoding=\"async\" src=\"https:\/\/www.17golang.com\/uploads\/20230512\/1683886509645e11adec671.jpg1683886509645e11adec683.png\" class=\"aligncenter\"><\/p>\n<p>1.2.\u5f00\u542f3\u4e2a\u7ebf\u7a0b\u53bb\u6267\u884c\u4e1a\u52a1<\/p>\n<p>\u4e1a\u52a1\u4e3a\uff1a\u5224\u65ad\u5982\u679c\u8bf4\u5e93\u5b58\u6570\u91cf\u5927\u4e8e0\uff0c\u5219\u5e93\u5b58\u51cf1\uff0c\u8ba2\u5355\u6570\u91cf\u52a01<\/p>\n<p>\u7ed3\u679c\u4e3a\uff1a\u5e93\u5b58\u4e3a-2\uff0c\u8ba2\u5355\u6570\u91cf\u4e3a3<\/p>\n<p>\u539f\u56e0\uff1a\u5982\u4e0b\u56fe\u6240\u793a\uff0c\u8fd9\u662f\u56e0\u4e3a\u5206\u522b\u67096\u4e2a\u6307\u4ee4\uff083\u4e2a\u5e93\u5b58\u51cf1\u6307\u4ee4\uff0c3\u4e2a\u8ba2\u5355\u6570\u91cf\u52a01\u6307\u4ee4\uff09\u5728redis\u670d\u52a1\u7aef\u6267\u884c\u5bfc\u81f4\u7684\u3002<\/p>\n<pre>namespace MengLin.Shopping.Redis.LuaScript\n{\n    public class SecKillOriginal\n    {\n        static SecKillOriginal()\n        {\n            using (RedisClient client = new RedisClient(\"127.0.0.1\", 6379))\n            {\n                \/\/\u5220\u9664\u5f53\u524d\u6570\u636e\u5e93\u4e2d\u7684\u6240\u6709Key, \u9ed8\u8ba4\u5220\u9664\u7684\u662fdb0\n                client.FlushDb();\n                \/\/\u5220\u9664\u6240\u6709\u6570\u636e\u5e93\u4e2d\u7684key \n                client.FlushAll();\n                \/\/\u521d\u59cb\u5316\u5e93\u5b58\u6570\u91cf\u4e3a1\u548c\u8ba2\u5355\u6570\u91cf\u4e3a0\n                client.Set(\"inventoryNum\", 1);\n                client.Set(\"orderNum\", 0);\n            }\n        }\n        public static void Show()\n        {\n            for (int i = 0; i \n                {\n                    using (RedisClient client = new RedisClient(\"127.0.0.1\", 6379))\n                    {\n                        int inventoryNum = client.Get\n   \n    (\"inventoryNum\");\n                        \/\/\u5982\u679c\u5e93\u5b58\u6570\u91cf\u5927\u4e8e0\n                        if (inventoryNum &gt; 0)\n                        {\n                            \/\/\u7ed9\u5e93\u5b58\u6570\u91cf-1\n                            var inventoryNum2 = client.Decr(\"inventoryNum\");\n                            Console.WriteLine($\"\u7ed9\u5e93\u5b58\u6570\u91cf-1\u540e\u7684\u6570\u91cf-inventoryNum: {inventoryNum2}\");\n                            \/\/\u7ed9\u8ba2\u5355\u6570\u91cf+1\n                            var orderNum = client.Incr(\"orderNum\");\n                            Console.WriteLine($\"\u7ed9\u8ba2\u5355\u6570\u91cf+1\u540e\u7684\u6570\u91cf-orderNum: {orderNum}\");\n                        }\n                        else\n                        {\n                            Console.WriteLine($\"\u62a2\u8d2d\u5931\u8d25: \u539f\u56e0\u662f\u56e0\u4e3a\u6ca1\u6709\u5e93\u5b58\");\n                        }\n                    }\n                });\n            }\n        }\n    }\n}\n   <\/pre>\n<p style=\"text-align:center\"><img decoding=\"async\" src=\"https:\/\/www.17golang.com\/uploads\/20230512\/1683886510645e11ae881c5.jpg1683886510645e11ae881d3.png\" class=\"aligncenter\"><\/p>\n<p style=\"text-align:center\"><img decoding=\"async\" src=\"https:\/\/www.17golang.com\/uploads\/20230512\/1683886511645e11af11817.jpg1683886511645e11af11829.png\" class=\"aligncenter\"><\/p>\n<h2>\u4e8c.\u4f7f\u7528Lua\u811a\u672c\u89e3\u51b3\u591a\u7ebf\u7a0b\u4e0b\u8d85\u5356\u7684\u95ee\u9898\u4ee5\u53ca\u4e3a\u4ec0\u4e48<\/h2>\n<p>2.1.\u4fee\u6539\u540e\u7684\u4ee3\u7801\u5982\u4e0b<\/p>\n<p>\u7ed3\u679c\u4e3a\uff1a\u5982\u4e0b\u56fe\u6240\u793a\uff0c\u5e93\u5b58\u4e3a0\u3001\u8ba2\u5355\u6570\u91cf\u4e3a1\uff0c\u5e76\u6ca1\u6709\u51fa\u73b0\u8d85\u5356\u7684\u95ee\u9898\u4e14\u67092\u4e2a\u7ebf\u7a0b\u62a2\u4e0d\u5230\u3002<\/p>\n<pre>namespace MengLin.Shopping.Redis.LuaScript\n{\n    public class SecKillLua\n    {\n        \/\/\/ \n        \/\/\/ \u4f7f\u7528Lua\u811a\u672c\u89e3\u51b3\u591a\u7ebf\u7a0b\u4e0b\u53d8\u5356\u7684\u95ee\u9898\n        \/\/\/ \n        static SecKillLua()\n        {\n            using (RedisClient client = new RedisClient(\"127.0.0.1\", 6379))\n            {\n                \/\/\u5220\u9664\u5f53\u524d\u6570\u636e\u5e93\u4e2d\u7684\u6240\u6709Key, \u9ed8\u8ba4\u5220\u9664\u7684\u662fdb0\n                client.FlushDb();\n                \/\/\u5220\u9664\u6240\u6709\u6570\u636e\u5e93\u4e2d\u7684key \n                client.FlushAll();\n                \/\/\u521d\u59cb\u5316\u5e93\u5b58\u6570\u91cf\u4e3a1\u548c\u8ba2\u5355\u6570\u91cf\u4e3a0\n                client.Set(\"inventoryNum\", 1);\n                client.Set(\"orderNum\", 0);\n            }\n        }\n        public static void Show()\n        {\n            for (int i = 0; i \n                {\n                    using (RedisClient client = new RedisClient(\"127.0.0.1\", 6379))\n                    {\n                        \/\/\u5982\u679c\u5e93\u5b58\u6570\u91cf\u5927\u4e8e0\uff0c\u5219\u7ed9\u5e93\u5b58\u6570\u91cf-1\uff0c\u7ed9\u8ba2\u5355\u6570\u91cf+1\n                        var lua = @\"local count = redis.call('get',KEYS[1])\n                                        if(tonumber(count)&gt;0)\n                                        then\n                                            --return count\n                                            redis.call('INCR',ARGV[1])\n                                            return redis.call('DECR',KEYS[1])\n                                        else\n                                            return -99\n                                        end\";\n                        Console.WriteLine(client.ExecLuaAsString(lua, keys: new[] { \"inventoryNum\" }, args: new[] { \"orderNum\" }));\n                    }\n                });\n            }\n        }\n    }\n}<\/pre>\n<p style=\"text-align:center\"><img decoding=\"async\" src=\"https:\/\/www.17golang.com\/uploads\/20230512\/1683886511645e11af7f85b.jpg1683886511645e11af7f86e.png\" class=\"aligncenter\"><\/p>\n<p style=\"text-align:center\"><img decoding=\"async\" src=\"https:\/\/www.17golang.com\/uploads\/20230512\/1683886512645e11b03c982.jpg1683886512645e11b03c995.png\" class=\"aligncenter\"><\/p>\n<p style=\"text-align:center\"><img decoding=\"async\" src=\"https:\/\/www.17golang.com\/uploads\/20230512\/1683886512645e11b0ad8a8.jpg1683886512645e11b0ad8b9.png\" class=\"aligncenter\"><\/p>\n<h2>\u4e09.\u4e3a\u4ec0\u4e48\u4f7f\u7528Lua\u811a\u672c\u5c31\u80fd\u89e3\u51b3\u591a\u7ebf\u7a0b\u4e0b\u7684\u8d85\u5356\u95ee\u9898\u5462\uff1f<\/h2>\n<p>\u662f\u56e0\u4e3aLua\u811a\u672c\u628a3\u4e2a\u6307\u4ee4\uff0c\u5206\u522b\u662f\uff1a\u5224\u65ad\u5e93\u5b58\u6570\u91cf\u662f\u5426\u5927\u4e8e0\u3001\u5e93\u5b58\u51cf1\u3001\u8ba2\u5355\u6570\u91cf\u52a01\uff0c\u8fd93\u4e2a\u6307\u4ee4\u6253\u5305\u653e\u5728\u4e00\u8d77\u6267\u884c\u4e86\u4e14\u4e0d\u80fd\u5206\u5272\uff0c\u76f8\u5f53\u4e8e\u7ec4\u88c5\u6210\u4e86\u539f\u5b50\u6307\u4ee4\uff0c\u6240\u4ee5\u907f\u514d\u4e86\u8d85\u5356\u95ee\u9898\u3002<\/p>\n<p>\u5728redis\u4e2d\u6211\u4eec\u5c3d\u91cf\u4f7f\u7528\u539f\u5b50\u6307\u4ee4\u4ece\u800c\u907f\u514d\u4e00\u4e9b\u5e76\u53d1\u7684\u95ee\u9898\u3002<\/p>\n<p style=\"text-align:center\"><img decoding=\"async\" src=\"https:\/\/www.17golang.com\/uploads\/20230512\/1683886513645e11b118c0d.jpg1683886513645e11b118c18.png\" class=\"aligncenter\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>redis\u4f7f\u7528Lua\u811a\u672c\u89e3\u51b3\u591a\u7ebf&#46;&#46;&#46;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[101],"tags":[],"class_list":["post-201805","post","type-post","status-publish","format-standard","hentry","category-database"],"_links":{"self":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/posts\/201805","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/comments?post=201805"}],"version-history":[{"count":0,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/posts\/201805\/revisions"}],"wp:attachment":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/media?parent=201805"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/categories?post=201805"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/tags?post=201805"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}