Heim  >  Artikel  >  Datenbank  >  Lassen Sie uns über die Frage der Realisierung von Flash-Verkäufen mit Redis sprechen

Lassen Sie uns über die Frage der Realisierung von Flash-Verkäufen mit Redis sprechen

WBOY
WBOYnach vorne
2022-05-27 11:40:343151Durchsuche

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 .

Lassen Sie uns über die Frage der Realisierung von Flash-Verkäufen mit Redis sprechen

Empfohlenes Lernen: Redis-Video-Tutorial

1. Flash-Kill-Logik: Lösen Sie Transaktionsoperationen von Zählern und Personaldatensätzen

1. Uid- und Proid-Nicht-Leer-Beurteilung

2. Mit Redis verbinden
  1. Inventarschlüssel
  2. Erfolgreicher Flash-Sale-Benutzerschlüssel
    • 4. Wenn das Inventar null ist, hat der Flash-Sale noch nicht begonnen. Stellen Sie fest, ob der Benutzer den Flash-Sale-Vorgang wiederholt hat Die erfolgreichen Flash-Sale-Benutzer werden zur Liste hinzugefügt nicht rechtzeitig erhalten und die Verbindung läuft ab.
    • 2.2, Überverkauft
    tritt bei Parallelität auf, das heißt, es werden immer noch Produkte verkauft, nachdem die Ausgabe nicht mehr vorrätig ist (der Flash-Sale endet).
  3. 2.3. Bestandsvermächtnis
  4. Nachdem die optimistische Sperre zur Lösung von Problem 2 verwendet wurde, tritt Problem 3 auf.
  5. Wenn die Bestandsmenge aufgrund der Verwendung der optimistischen Sperre relativ gleichzeitig ist, ändert der erste Benutzer die Versionsnummer von Nach einem erfolgreichen Flash-Verkauf können andere Benutzer, die ihn erworben haben, den Inventarschlüssel aufgrund unterschiedlicher Versionsnummern nicht mehr kaufen und es kommt zu Inventarproblemen
    • 3.1, Verbindungs-Timeout
    • Verbindungspool verwenden, Die Tool-Klasse lautet wie folgt:
    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();
    springBoot-Version (pom .xml-Einführung, application.yml-Konfiguration und dann das Objekt einfügen)
  6. <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. Überverkauftes Problem

Verwenden Sie Redis-Transaktion, optimistische Sperre + Überwachung

//监视库存
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>

3.3 . Inventar-Altprobleme, die durch optimistische Sperren verursacht werden.

Verwenden Sie die Lua-Einbettung. Die Skriptsprache

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.
Lassen Sie uns über die Frage der Realisierung von Flash-Verkäufen mit Redis sprechenLUA-Skript ähnelt einer Redis-Transaktion und wird nicht von anderen Befehlen in die Warteschlange gestellt.

LUA-Skriptfunktion kann nur in Redis 2.6 oder höher verwendet werden Skript zur Eliminierung des Benutzers, Lösung des Überverkaufsproblems.

Redis Version 2.6 und höher löst das Konfliktproblem durch

Lua-Skripte. Tatsächlich verwendet

Redis 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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen