Dieser Artikel vermittelt Ihnen relevantes Wissen über Redis. Er stellt hauptsächlich die relevanten Inhalte zur Realisierung von Flash-Sales vor, einschließlich Flash-Sale-Logik, bestehender Link-Timeouts, Überverkauf und Inventarproblemen. Ich hoffe, es hilft allen .
Empfohlenes Lernen: Redis-Video-Tutorial
1. Uid- und Proid-Nicht-Leer-Beurteilung
2. Mit Redis verbindenpublic 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;
//监视库存 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>
schreibt komplexe oder mehrstufige Redis-Vorgänge als Skript und sendet sie zur sofortigen Ausführung an Redis, wodurch die Anzahl wiederholter Verbindungen zu Redis reduziert wird. Verbessern Sie die Leistung.
LUA-Skript ähnelt einer Redis-Transaktion und wird nicht von anderen Befehlen in die Warteschlange gestellt.
Redis Version 2.6 und höher löst das Konfliktproblem durch
Lua-Skripte. Tatsächlich verwendetRedis seine Single-Threaded-Funktion, um Multitasking-Parallelitätsprobleme mithilfe von Aufgabenwarteschlangen zu lösen.
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)<h2>Der vollständige Code lautet wie folgt: </h2><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)<p>Empfohlenes Lernen: </p>Redis-Video-Tutorial<p></p>
Das obige ist der detaillierte Inhalt vonLassen Sie uns über die Frage der Realisierung von Flash-Verkäufen mit Redis sprechen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!