【Redis系列】事务命令

220 阅读1分钟

一、背景 在高并发的秒杀系统,对于库存的扣减,如果放在DB,频繁的查询库存和扣减,会导致DB上的表进行加锁而影响DB的整体性能,所以一般是在前一天就做热点数据的更新,将库存信息放在Redis,在Redis实现扣减库存,并且将扣减库存成功的用户利用Kafka获取其他MQ实现异步下单,等活动结束了,就同步Redis和DB的库存

二、Redis的CAS实现 在Redis的事务中,WATCH命令可用于提供CAS(check-and-set)功能。假设我们通过WATCH命令在事务执行之前监控库存的Key,倘若在WATCH之后Key的值发生了变化,EXEC命令执行的事务都将被放弃,同时返回nil multi-bulk应答以通知调用者事务执行失败。所以基于这样的原理,我们就可以用乐观锁方式实现对库存扣减

1.基于Spring-Data-Redis的实现

查看RedisTemplete的源码查询multi、delete等源代码,发现会执行RedisTemplate类中execute()方法进行跟踪发现 RedisCallback中doInRedis获取的RedisConnection每次都是新的,所以没有事务上下文,所以才导致事务没有生效,所以我们只能实现RedisCallBack底层,采用RedisTemplate的SesionCallback来完成在同一个Connection中,下图是官方说明

github.com/devpg/sprin…