LOADING

加载过慢请开启缓存 浏览器默认开启

redis事务

2023/8/14 Redis

redis事务

Redis事务是一个单独的隔离操作;事务中的所有命令都会序列化、按顺序地执行。事
务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
Redis事务的主要作用就是串联多个命令防止别的命令插队。

'image-20220731150122337'

'image-20220731151111248'

'image-20220731151719808'

'image-20220731152919931'

'image-20220731153220932'

'image-20220731153302392'

'image-20220731153423639'

Redis事务三特性

  • 单独的隔离操作

    事务中的所有命令都会序列化、按顺序地执行。

    事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

  • 没有隔离级别的概念

    队列中的命令没有提交之前都不会实际被执行,因为事务提交前任何指令都

    不会被实际执行

  • 不保证原子性

    事务中如果有条命令执行失败,其后的命令仍然会被执行,没有回滚·

'image-20220731164357437'

'image-20220731180123110'

'image-20220731180332828'

'image-20220731164321183'

'image-20220731181524361'

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);/ping PONG
                JjedisPool new JedisPool (poolConfig,host:"192.168.44.168",port:6379,timeout:60000 )
                }
            }
    }
return jedisPool;
}
    
 public static void release(JedisPool jedisPool,Jedis jedis){
  if(null!=jedis)){
      jedisPool.returnResouree(jedis);
     }
 }
}
//通过连接池得到jedis.对象
JedisPool jedisPoolInstance JedisPoolUtil.getJedisPoolInstance();
Jedis jedis jedisPoolInstance.getResource();

超卖解决

监视库存
jedis.watch (kcKey);

使用事务
Transaction multi jedis.multi();
组队操作
multi.decr (kcKey);
multi.sadd(userKey,uid);
/执行
List<Object>results multi.exec();

库存问题

'image-20220731182517589'

'image-20220731182552342'

嵌入

local userid=KEYS[1];
local prodid=KEYS[2];
local qtkey="sk:"..prodid.."qt"
local usersKey="sk:"..prodid.":usr';
local userExists=redis.call("sismember",usersKey,userid);
if tonumber(userExists)==1 then
return 2;
end.
local num=redis.call("get",qtkey);
if tonumber(num)<=0 then
return 0;
else
redis.call("decr",qtkey);
redis.call("sadd",usersKey,userid);
end
return 1;