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







Redis事务三特性
单独的隔离操作
事务中的所有命令都会序列化、按顺序地执行。
事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
没有隔离级别的概念
队列中的命令没有提交之前都不会实际被执行,因为事务提交前任何指令都
不会被实际执行
不保证原子性
事务中如果有条命令执行失败,其后的命令仍然会被执行,没有回滚·





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();
库存问题


嵌入
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;