Maison > base de données > Redis > Parlons de la problématique de la réalisation de ventes flash avec Redis

Parlons de la problématique de la réalisation de ventes flash avec Redis

WBOY
Libérer: 2022-05-27 21:00:06
avant
3296 Les gens l'ont consulté

Cet article vous apporte des connaissances pertinentes sur Redis. Il présente principalement le contenu pertinent sur la réalisation de ventes flash, y compris la logique des ventes flash, les délais d'attente des liens existants, les problèmes de survente et d'inventaire. Examinons-les ensemble. J'espère que cela aidera tout le monde. .

Parlons de la problématique de la réalisation de ventes flash avec Redis

Apprentissage recommandé : Tutoriel vidéo Redis

1. Logique de destruction Flash

Spike kill : résoudre les opérations de transaction des compteurs et des dossiers personnels

  1. 1.
  2. 2. Connectez-vous à redis
  3. 3. Clé d'épissure
    • Clé d'inventaire
    • Clé utilisateur de vente flash réussie
    4 Si l'inventaire est nul, la vente flash n'a pas encore commencé
  4. 5. Déterminez si l'utilisateur a répété l'opération de vente flash
  5. 6. Déterminez la quantité du produit, la quantité en stock est inférieure à 1 et la vente flash est terminée
  6. 7. les utilisateurs de la vente flash réussie à la liste
    • 2. Il y a un problème
    • 2.1. Délai d'expiration de la connexion
  7. Cause : En raison du grand nombre de connexions créées, cela consomme beaucoup de performances, et parfois la connexion est interrompue. non obtenu à temps et la connexion expire.

2.2, la survente

se produit en simultanéité, c'est-à-dire qu'il reste des produits après la sortie en rupture de stock (la vente flash se termine) Vendus entraînant une quantité de stock négative.

2.3. Héritage de l'inventaire

Après avoir utilisé le verrouillage optimiste pour résoudre le problème 2, le problème 3 apparaît
Parlons de la problématique de la réalisation de ventes flash avec RedisSi la quantité d'inventaire est relativement plus simultanée, en raison de l'utilisation du verrouillage optimiste, le premier utilisateur modifiera le numéro de version de la clé d'inventaire après une vente flash réussie , les autres utilisateurs qui l'ont récupérée ne pourront pas continuer à acheter en raison de numéros de version différents, et il y aura des problèmes d'inventaire

3 Résoudre

3.1, délai d'expiration de connexion

Utiliser le pool de connexion, la classe d'outils est la suivante :

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();
Copier après la connexion

version springBoot (introduction pom .xml, configuration application.yml, puis injecter l'objet)

<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>
Copier après la connexion
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
Copier après la connexion
    @Autowired
    private RedisTemplate redisTemplate;
Copier après la connexion

3.2 Problème de survente

Utiliser la transaction Redis, verrouillage optimiste + montre

//监视库存
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>
Copier après la connexion

3.3. . Problèmes hérités de l'inventaire causés par le verrouillage optimiste

Utiliser l'intégration Lua Le langage de script

écrit des opérations Redis complexes ou en plusieurs étapes sous forme de script et les soumet à Redis pour une exécution unique, réduisant ainsi le nombre de connexions répétées à Redis. Améliorer les performances.

Le script LUA est similaire aux transactions Redis. Il a une certaine atomicité et ne sera pas mis en file d'attente par d'autres commandes.

La fonction de script LUA ne peut être utilisée que dans la version Redis 2.6 ou supérieure. script pour éliminer l'utilisateur, résoudre le problème de survente.
  1. Redis version 2.6 et versions ultérieures résout le problème de contention grâce à des
  2. scripts lua. En fait,
  3. redis utilise sa fonctionnalité monothread pour résoudre les problèmes de concurrence multitâches à l'aide de files d'attente de tâches
  4. .
  5. 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)
    Copier après la connexion
  6. Le code complet est le suivant :
  7. // 定义两段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)<span style="color:red">Apprentissage recommandé : <strong>Tutoriel vidéo Redis</strong></span>
    Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:csdn.net
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal