Maison > Article > base de données > Parlons de la problématique de la réalisation de ventes flash avec Redis
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. .
Apprentissage recommandé : Tutoriel vidéo Redis
Spike kill : résoudre les opérations de transaction des compteurs et des dossiers personnels
Après avoir utilisé le verrouillage optimiste pour résoudre le problème 2, le problème 3 apparaît
Si 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.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();
<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;
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>
3.3. . Problèmes hérités de l'inventaire causés par le verrouillage optimiste
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)
// 定义两段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>
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!