{"id":201325,"date":"2025-05-10T10:59:02","date_gmt":"2025-05-10T02:59:02","guid":{"rendered":"https:\/\/server.hk\/cnblog\/201325\/"},"modified":"2025-05-10T10:59:02","modified_gmt":"2025-05-10T02:59:02","slug":"%e5%9f%ba%e4%ba%8eredis-zset%e5%ae%9e%e7%8e%b0%e6%bb%91%e5%8a%a8%e7%aa%97%e5%8f%a3%e5%af%b9%e7%9f%ad%e4%bf%a1%e8%bf%9b%e8%a1%8c%e9%98%b2%e5%88%b7%e9%99%90%e6%b5%81%e7%9a%84%e9%97%ae%e9%a2%98","status":"publish","type":"post","link":"https:\/\/server.hk\/cnblog\/201325\/","title":{"rendered":"\u57fa\u4e8eRedis\u00a0zSet\u5b9e\u73b0\u6ed1\u52a8\u7a97\u53e3\u5bf9\u77ed\u4fe1\u8fdb\u884c\u9632\u5237\u9650\u6d41\u7684\u95ee\u9898"},"content":{"rendered":"<p><b><\/b> <\/p>\n<h1>\u57fa\u4e8eRedis&nbsp;zSet\u5b9e\u73b0\u6ed1\u52a8\u7a97\u53e3\u5bf9\u77ed\u4fe1\u8fdb\u884c\u9632\u5237\u9650\u6d41\u7684\u95ee\u9898<\/h1>\n<p><span style=\"cursor: pointer\"><i><\/i>\u6536\u85cf<\/span> <\/p>\n<p>\u672c\u7bc7\u6587\u7ae0\u5411\u5927\u5bb6\u4ecb\u7ecd\u300a\u57fa\u4e8eRedis&nbsp;zSet\u5b9e\u73b0\u6ed1\u52a8\u7a97\u53e3\u5bf9\u77ed\u4fe1\u8fdb\u884c\u9632\u5237\u9650\u6d41\u7684\u95ee\u9898\u300b\uff0c\u4e3b\u8981\u5305\u62ec\u9650\u6d41\u3001\u7a97\u53e3\u3001rediszset\u3001\u6ed1\u52a8\uff0c\u5177\u6709\u4e00\u5b9a\u7684\u53c2\u8003\u4ef7\u503c\uff0c\u9700\u8981\u7684\u670b\u53cb\u53ef\u4ee5\u53c2\u8003\u4e00\u4e0b\u3002<\/p>\n<pre>public void checkCurrentWindowValue(String telNum) {\n        \n        String windowKey = CommonConstant.getNnSmsWindowKey(telNum);\n        \/\/\u83b7\u53d6\u5f53\u524d\u65f6\u95f4\u6233\n        long currentTime = System.currentTimeMillis();\n        \/\/1\u5c0f\u65f6\uff0c\u9ed8\u8ba4\u53ea\u80fd\u53d15\u6b21\uff0c\u53c2\u6570smsWindowMax\u505a\u6210\u53ef\u914d\u7f6e\u9879\uff0c\u914d\u7f6e\u5230Nacos\u914d\u7f6e\u4e2d\u5fc3\uff0c\u53ef\u4ee5\u52a8\u6001\u8c03\u6574\n        if (RedisUtil.hasKey(windowKey)) {\n            \/\/\u53c2\u6570smsWindowTime\u8868\u793a\u9650\u5236\u7684\u7a97\u53e3\u65f6\u95f4\n            \/\/\u8fd9\u91cc\u83b7\u53d6\u5f53\u524d\u65f6\u95f4\u4e0e\u9650\u5236\u7a97\u53e3\u65f6\u95f4\u4e4b\u95f4\u7684\u77ed\u4fe1\u53d1\u9001\u6b21\u6570\n            Optional\n   \n     optional = Optional.ofNullable(RedisUtil.zCount(windowKey, currentTime - smsWindowTime, currentTime));\n            if (optional.isPresent()) {\n                long count = optional.get();\n                if (count &gt;= smsWindowMax) {\n                    log.error(\"==========&gt;\u5f53\u524d\u53f7\u7801\uff1a{} \u77ed\u4fe1\u53d1\u9001\u592a\u9891\u7e41\uff0c{}\", telNum, count);\n                    throw new ServiceException(MidRetCode.umid_10060);\n                }\n            }\n        }\n        StringBuilder sb =new StringBuilder();\n        String windowEle = sb.append(telNum).append(\":\").append(currentTime).toString();\n        \/\/\u6dfb\u52a0\u5f53\u524d\u53d1\u9001\u5143\u7d20\u5230zSet\u4e2d(\u7531\u4e8e\u4fdd\u8bc1\u5143\u7d20\u552f\u4e00\uff0c\u8fd9\u91cc\u5c06\u5143\u7d20\u52a0\u4e0a\u4e86\u5f53\u524d\u65f6\u95f4\u6233)\n        RedisUtil.zAdd(windowKey, windowEle, currentTime);\n        \/\/\u8bbe\u7f6e2\u500d\u7a97\u53e3Key\uff1awindowKey \u7684\u8fc7\u671f\u65f6\u95f4\n        RedisUtil.expire(windowKey, smsWindowTime*2, TimeUnit.MILLISECONDS);\n    }\n   <\/pre>\n<p><strong><span style=\"color:#e74c3c\">\u8865\u5145\uff1a\u4e0b\u9762\u770b\u4e0b\u4ee5php\u8bed\u8a00\u4e3a\u4f8b\u57fa\u4e8eredis\u5b9e\u73b0\u6ed1\u52a8\u7a97\u53e3\u5f0f\u7684\u77ed\u4fe1\u53d1\u9001\u63a5\u53e3\u9650\u6d41<\/span><\/strong><\/p>\n<p>\u6ed1\u52a8\u7a97\u53e3\u77ed\u4fe1\u53d1\u9001\u9650\u6d41\u7b97\u6cd5<\/p>\n<p>1.\u6709\u4e24\u6761\u89c4\u5219<\/p>\n<p>\u57fa\u4e8eIP\u7684\u9650\u5236\u548c\u57fa\u4e8e\u624b\u673a\u53f7\u7684\u9650\u5236<\/p>\n<p>IP\u89c4\u5219:<\/p>\n<p>1\u5206\u949f\u9650\u52365<\/p>\n<p>10\u5206\u949f\u9650\u523630<\/p>\n<p>1\u5c0f\u65f6\u9650\u523650<\/p>\n<p>\u624b\u673a\u53f7\u89c4\u5219:<\/p>\n<p>1\u5206\u949f\u9650\u52361<\/p>\n<p>10\u5206\u949f\u9650\u52365<\/p>\n<p>1\u5c0f\u65f6\u9650\u523610<\/p>\n<p>2.\u6ed1\u52a8\u7a97\u53e3\u5c31\u662f\u968f\u7740\u65f6\u95f4\u7684\u6d41\u52a8 , \u8fdb\u884c\u52a8\u6001\u7684\u5220\u51cf\u533a\u95f4\u5185\u7684\u6570\u636e , \u9650\u5236\u65f6\u83b7\u53d6\u533a\u95f4\u5185\u7684\u6570\u636e<\/p>\n<p>\u6700\u4e3b\u8981\u7684\u662f\u7528\u5230\u4e86redis\u7684zRemRangeByScore\u6765\u8fdb\u884c\u5220\u9664\u533a\u95f4\u5916\u7684\u6570\u636e<\/p>\n<pre>\n   5,\n    600=&gt;30,\n    3600=&gt;50\n);\n\/\/\u624b\u673a\u53f7\u89c4\u5219\n$phoneRules=array(\n    60=&gt;1,\n    600=&gt;5,\n    3600=&gt;10\n);\n\n$r = checkLimits($ipRules,$_SERVER[\"REMOTE_ADDR\"],$_GET['tel']);\nvar_dump($r);\n\n$r = checkLimits($phoneRules,$_GET['tel'],$_GET['tel']);\nvar_dump($r);\n\nfunction checkLimits($rules,$key,$tel){\n    $redis = new Redis();\n    $redis-&gt;connect('115.159.28.111', 1991);\n    foreach($rules as $ruleTime=&gt;$rule) {\n        $redisKey=$key.\"_\".$ruleTime;\n        $score=time();\n        $member=$tel.'_'.$score;\n        $redis-&gt;multi();\n        $redis-&gt;zRemRangeByScore($redisKey, 0, $score - $ruleTime);\/\/\u79fb\u9664\u7a97\u53e3\u4ee5\u5916\u7684\u6570\u636e\n        $redis-&gt;zAdd($redisKey, $score, $member);\n        $redis-&gt;expire($redisKey, $ruleTime);\n        $redis-&gt;zRange($redisKey, 0, -1, true);\n        $members = $redis-&gt;exec();\n        if (empty($members[3])) {\n            break;\n        }\n        $nums=count($members[3]);\n        var_dump($nums);\n\n        if($nums&gt;$rule){\n            return false;\n        }\n    }\n    return true;\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u57fa\u4e8eRedis&nbsp;zSe&#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-201325","post","type-post","status-publish","format-standard","hentry","category-database"],"_links":{"self":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/posts\/201325","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=201325"}],"version-history":[{"count":0,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/posts\/201325\/revisions"}],"wp:attachment":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/media?parent=201325"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/categories?post=201325"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/tags?post=201325"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}