﻿<br />
<b>Deprecated</b>:  WPMailSMTP\Providers\Sendlayer\QuickConnectUsage::maybe_flag_limit_reached(): Implicitly marking parameter $connection as nullable is deprecated, the explicit nullable type must be used instead in <b>D:\wwwroot\sway\wwwroot\blog\wp-content\plugins\wp-mail-smtp\src\Providers\Sendlayer\QuickConnectUsage.php</b> on line <b>393</b><br />
{"id":797,"date":"2022-08-09T16:03:35","date_gmt":"2022-08-09T08:03:35","guid":{"rendered":"http:\/\/blog.sway.com.cn\/?p=797"},"modified":"2022-09-13T10:49:10","modified_gmt":"2022-09-13T02:49:10","slug":"java%e4%bd%bf%e7%94%a8jedis%e6%89%a7%e8%a1%8clua%e8%84%9a%e6%9c%ac","status":"publish","type":"post","link":"http:\/\/blog.sway.com.cn\/?p=797","title":{"rendered":"java\u4f7f\u7528jedis\u6267\u884clua\u811a\u672c"},"content":{"rendered":"<p>1\u3001\u5f15\u5165\u4f9d\u8d56<\/p>\n<pre class=\"lang:default decode:true \">\t\t&lt;!-- Jedis --&gt;\r\n\t\t&lt;dependency&gt;\r\n\t\t\t&lt;groupId&gt;redis.clients&lt;\/groupId&gt;\r\n\t\t\t&lt;artifactId&gt;jedis&lt;\/artifactId&gt;\r\n\t\t&lt;\/dependency&gt;<\/pre>\n<p>2\u3001\u7f16\u5199\u914d\u7f6e\u6587\u4ef6<\/p>\n<pre class=\"lang:default decode:true \">#Redis\r\nspring.redis.host=127.0.0.1\r\nspring.redis.port=6379\r\nspring.redis.database=3\r\n\r\nspring.redis.password=\r\nspring.redis.timeout=2000\r\n\r\n#Jedis\r\n#\u6700\u5927\u7a7a\u95f2\u6570\r\nspring.redis.jedis.pool.max-idle=6\r\n#\u6700\u5927\u8fde\u63a5\u6570\r\nspring.redis.jedis.pool.max-active=10\r\n#\u6700\u5c0f\u7a7a\u95f2\u6570\r\nspring.redis.jedis.pool.min-idle=2\r\n#\u8fde\u63a5\u8d85\u65f6\r\nspring.redis.jedis.pool.timeout=2000<\/pre>\n<p>3\u3001\u7f16\u5199\u914d\u7f6e\u7c7b<\/p>\n<pre class=\"lang:default decode:true \">package com.zero4j.config;\r\n\r\n\r\nimport org.slf4j.Logger;\r\nimport org.slf4j.LoggerFactory;\r\nimport org.springframework.beans.factory.annotation.Value;\r\nimport org.springframework.context.annotation.Bean;\r\nimport org.springframework.context.annotation.Configuration;\r\nimport redis.clients.jedis.JedisPool;\r\nimport redis.clients.jedis.JedisPoolConfig;\r\n\r\n@Configuration\r\npublic class JedisConfig {\r\n\r\n    private Logger logger = LoggerFactory.getLogger(JedisConfig.class);\r\n\r\n    @Value(\"${spring.redis.host}\")\r\n    private String host;\r\n\r\n    @Value(\"${spring.redis.port}\")\r\n    private int port;\r\n\r\n    @Value(\"${spring.redis.password}\")\r\n    private String password;\r\n    @Value(\"${spring.redis.timeout}\")\r\n    private int timeout;\r\n\r\n    @Value(\"${spring.redis.jedis.pool.max-active}\")\r\n    private int maxActive;\r\n\r\n    @Value(\"${spring.redis.jedis.pool.max-idle}\")\r\n    private int maxIdle;\r\n\r\n    @Value(\"${spring.redis.jedis.pool.min-idle}\")\r\n    private int minIdle;\r\n\r\n    @Bean\r\n    public JedisPool jedisPool(){\r\n\r\n        JedisPoolConfig jedisPoolConfig=new JedisPoolConfig();\r\n        jedisPoolConfig.setMaxIdle(maxIdle);\r\n        jedisPoolConfig.setMinIdle(minIdle);\r\n        jedisPoolConfig.setMaxTotal(maxActive);\r\n\r\n        JedisPool jedisPool = new JedisPool(jedisPoolConfig,host,port,timeout,password);\r\n\r\n        logger.info(\"JedisPool\u8fde\u63a5\u6210\u529f:\"+host+\"\\t\"+port);\r\n\r\n        return jedisPool;\r\n    }\r\n\r\n}<\/pre>\n<p>4\u3001\u5b9e\u73b0\u4e1a\u52a1\u903b\u8f91<\/p>\n<pre class=\"lang:default decode:true \">\t@Autowired\r\n\tprivate JedisPool jedisPool;<\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"lang:default decode:true\">\t\tJedis jedis = null;\r\n\r\n\t\ttry {\r\n\t\t\tjedis = jedisPool.getResource();\r\n\t\t\tString poolId = \"pool1\";\r\n\t\t\tString poolLuaRedisKey = \"cardLottery.\" + poolId + \"-lua-shaKey\";\r\n\t\t\tString poolLuaRedisValue = jedis.get(poolLuaRedisKey);\r\n\t\t\tbyte[] shaKey = null;\r\n\t\t\tif(poolLuaRedisValue!=null){\r\n\t\t\t\tshaKey = poolLuaRedisValue.getBytes();\r\n\t\t\t}\r\n\t\t\tif (shaKey == null) {\r\n\t\t\t\tClassPathResource cps = new ClassPathResource(\"lua\/test.lua\");\r\n\t\t\t\tInputStream in = cps.getInputStream();\r\n\t\t\t\tbyte[] data = new byte[in.available()];\r\n\t\t\t\tin.read(data);\r\n\t\t\t\tshaKey = jedis.scriptLoad(data);\r\n\t\t\t\tjedis.set(\"cardLottery.\" + poolId + \"-lua-shaKey\", new String(shaKey));\r\n\t\t\t}\r\n\r\n\t\t\tSystem.out.println(\"\u672c\u6b21\u6267\u884c\u7684lua\u811a\u672c\u7684sha\u4e3a\uff1a\" + new String(shaKey));\r\n\r\n\t\t\tList&lt;String&gt; keys = new ArrayList&lt;&gt;();\r\n\t\t\tkeys.add(poolId);\r\n\t\t\tkeys.add(\"100\");\r\n\t\t\tkeys.add(\"0.5\");\r\n\t\t\tList&lt;String&gt; vals = new ArrayList&lt;&gt;();\r\n\t\t\tfor (int i = 0; i &lt; 10; i++) {\r\n\t\t\t\tDate _startTime = new Date();\r\n\t\t\t\tObject result = jedis.evalsha(new String(shaKey), keys, vals);\r\n\t\t\t\tDate _endTime = new Date();\r\n\t\t\t\tlong _timeCross = _endTime.getTime() - _startTime.getTime();\r\n\t\t\t\tSystem.out.println(\"lua\u7684\u7b2c\" + (i + 1) + \"\u6b21\u6267\u884c\u82b1\u4e86\" + _timeCross + \"\u6beb\u79d2\uff0c\u6267\u884c\u7ed3\u679c\uff1a\" + result);\r\n\t\t\t}\r\n\t\t}catch(Exception e){\r\n\t\t\te.printStackTrace();\r\n\t\t}finally {\r\n\t\t\tif(jedis!=null){\r\n\t\t\t\tjedis.close();\r\n\t\t\t}\r\n\t\t}\r\n<\/pre>\n<p>5\u3001Lua\u811a\u672c<\/p>\n<pre class=\"lang:default decode:true \">local key = 'cardPool.'..KEYS[1]..'-bucket' -- redis\u4e2d\u4ee4\u724c\u6876\u5bf9\u8c61\u7684key\r\nlocal initTokens = tonumber(KEYS[2]) -- {\u521d\u59cb\u5316\u65f6\u7684\u4ee4\u724c\u6570}\r\nlocal probability = tonumber(KEYS[3]) -- {\u4e2d\u5956\u6982\u7387\uff1a\u5c0f\u4e8e0\u7684\u6570\u5b57\uff08\u767e\u5206\u6bd4\u6982\u5ff5\uff09}\r\n\r\nprint(probability)\r\n\r\nlocal bucket = redis.call('hgetall', key) -- \u5f53\u524d key \u7684\u4ee4\u724c\u6876\u5bf9\u8c61\r\nlocal currentTokens -- \u5f53\u524dtoken\u6570\u91cf\r\nlocal runCount -- \u7d2f\u8ba1\u6267\u884c\u6b21\u6570\u7edf\u8ba1\r\n\r\n-- \u82e5\u5f53\u524d\u6876\u672a\u521d\u59cb\u5316,\u5148\u521d\u59cb\u5316\u4ee4\u724c\u6876\r\nif table.maxn(bucket) == 0 then\r\n    -- \u521d\u59cb\u6876\u5185\u4ee4\u724c\r\n    currentTokens = initTokens\r\n    runCount = 0\r\n    redis.call('hset', key, 'stock', currentTokens)\r\n    redis.call('hset', key, 'probability', probability)\r\n    redis.call('hset', key, 'runCount', 0)\r\nelseif table.maxn(bucket) == 6 then\r\n    currentTokens = tonumber(bucket[2])\r\n    probability = tonumber(bucket[4])\r\n    runCount = tonumber(bucket[6])\r\nend\r\n\r\n-- \u5982\u679c\u5f53\u524d\u6876\u5185\u4ee4\u724c\u5c0f\u4e8e 0,\u629b\u51fa\u5f02\u5e38\r\nassert(currentTokens &gt;= 0)\r\n\r\nredis.call('hset', key, 'runCount', runCount + 1)\r\n\r\nif currentTokens == 0 then  -- \u5982\u679c\u5f53\u524d\u4ee4\u724c == 0, \u8fd4\u56defalse\r\n    return -1\r\nelse    -- \u5982\u679c\u5f53\u524d\u4ee4\u724c \u5927\u4e8e 0, \u5219\u6267\u884c\u62bd\u5956\u903b\u8f91\r\n    if probability&lt;&gt; nil or probability &gt;= 1 or math.random() &lt;= probability then -- \u5982\u679c\u4e2d\u5956\u6982\u7387\u5927\u4e8e\u6216\u7b49\u4e8e1\uff0c\u751f\u6210\u968f\u673a\u7684\u5c0f\u6570\u5982\u679c\u5728probability\u5185\uff0c\u5219\u4e2d\u5956\r\n        -- \u66f4\u65b0\u5f53\u524d\u6876\u5185\u7684\u4ee4\u724c -1, \u8fd4\u56detrue\r\n        redis.call('hset', key, 'stock', currentTokens - 1)\r\n        return 1\r\n    else\r\n        return 0\r\n    end\r\nend<\/pre>\n<p>\u6ce8\u610f\uff1a\u5982\u679cLua\u811a\u672c\u8fd4\u56de\u662ftrue\u548cfalse\u7684\u7c7b\u578b\uff0c\u5219jedis\u5b9e\u9645\u83b7\u5f97\u7684\u503c\u4e3a1\u548cnull\u3002<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>1\u3001\u5f15\u5165\u4f9d\u8d56 &lt;!&#8211; Jedis &#8211;&gt; &lt;dependen &hellip; <a href=\"http:\/\/blog.sway.com.cn\/?p=797\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[232],"class_list":["post-797","post","type-post","status-publish","format-standard","hentry","category-uncategorized","tag-jedis"],"_links":{"self":[{"href":"http:\/\/blog.sway.com.cn\/index.php?rest_route=\/wp\/v2\/posts\/797","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.sway.com.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.sway.com.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.sway.com.cn\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.sway.com.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=797"}],"version-history":[{"count":3,"href":"http:\/\/blog.sway.com.cn\/index.php?rest_route=\/wp\/v2\/posts\/797\/revisions"}],"predecessor-version":[{"id":833,"href":"http:\/\/blog.sway.com.cn\/index.php?rest_route=\/wp\/v2\/posts\/797\/revisions\/833"}],"wp:attachment":[{"href":"http:\/\/blog.sway.com.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=797"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.sway.com.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=797"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.sway.com.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=797"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}