この記事では、Redis に関する関連知識を提供します。主にフラッシュ セールのロジック、既存のリンク タイムアウト、過剰販売、在庫のレガシーなど、フラッシュ セールの実現に関する関連コンテンツを紹介します。以下の問題を見てみましょう。 . 皆様のお役に立てれば幸いです。
# 推奨学習: #1. フラッシュ セール ロジック二次販売 : カウンタと人事レコードのトランザクション操作を解決
##1. uid と proid が空ではないと判断は、同時に発生する状況、つまり、出力が在庫切れになった場合 (フラッシュセール)、終了後もまだ商品が販売されている場合、その結果、マイナスの在庫数量が発生します。
2.3. 在庫のレガシー
オプティミスティック ロックを使用して問題 2 を解決した後、問題 3 が発生します
3. 解決策
3.1. 接続タイムアウト
public class JedisPoolUtil { private static volatile JedisPool jedisPool = null; private JedisPoolUtil() { } public static JedisPool getJedisPoolInstance() { if (null == jedisPool) { synchronized (JedisPoolUtil.class) { if (null == jedisPool) { JedisPoolConfig poolConfig = new JedisPoolConfig(); poolConfig.setMaxTotal(200); poolConfig.setMaxIdle(32); poolConfig.setMaxWaitMillis(100 * 1000); poolConfig.setBlockWhenExhausted(true); poolConfig.setTestOnBorrow(true); jedisPool = new JedisPool(poolConfig, "127.0.0.1", 6379, 60000); } } } return jedisPool; }}//使用JedisPool jedisPoolInstance = JedisPoolUtil.getJedisPoolInstance();Jedis jedis = jedisPoolInstance.getResource();
<dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-data-redis</artifactid></dependency><dependency> <groupid>redis.clients</groupid> <artifactid>jedis</artifactid> <version>3.2.0</version></dependency>
spring: redis: host: 127.0.0.1 port: 6379 database: 0 timeout: 1800000 lettuce: pool: max-active: 20 max-wait: -1 max-idle: 5 min-idle: 0
@Autowired private RedisTemplate redisTemplate;
3.2. 売られすぎの問題
Redis トランザクションの使用、オプティミスティック ロックの監視
//监视库存 jedis.watch(kcKey);//中间代码忽略 //7 秒杀过程 //使用事务 Transaction multi = jedis.multi();//组队操作 multi.decr(kcKey);multi.sadd(userKey,uid);//执行 List<object> results = multi.exec();if(results == null || results.size()==0) { System.out.println("秒杀失败了...."); jedis.close(); return false;}</object>
Lua 埋め込みスクリプト言語を使用します。
複雑なまたは複数ステップの Redis 操作をスクリプトとして記述し、一度に実行するために Redis に送信して、操作の数を減らします。 redis への繰り返し接続。性能を上げる。 LUA スクリプトは redis トランザクションに似ています。ある程度の原子性があり、他のコマンドによってキューに入れられることはありません。redis トランザクション操作を完了できます。local userid=KEYS[1]; //1、2行定义两个变量, local prodid=KEYS[2]; local qtkey="sk:"..prodid..":qt"; //3,4行定义拼接key local usersKey="sk:"..prodid..":usr"; local userExists=redis.call("sismember",usersKey,userid); //5-8,判断用户是否存在,不存在return 2 if tonumber(userExists)==1 then return2; end local num=redis.call("get",qtkey); //9-11,判断商品是否存在 if tonumber(num)<strong>完全なコードは次のとおりです: </strong><pre class="brush:php;toolbar:false">// 定义两段Lua脚本(使用Lua脚本可以解决乐观锁带来的库存遗留问题) static String secKillScript = "local userid=KEYS[1];\r\n" + "local prodid=KEYS[2];\r\n" + "local qtkey='sk:'..prodid..\":qt\";\r\n" + "local usersKey='sk:'..prodid..\":usr\";\r\n" + "local userExists=redis.call(\"sismember\",usersKey,userid);\r\n" + "if tonumber(userExists)==1 then \r\n" + " return 2;\r\n" + "end\r\n" + "local num= redis.call(\"get\" ,qtkey);\r\n" + "if tonumber(num)
以上がRedisでフラッシュセールを実現する課題について話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。