改变出路乐观锁与悲观锁在Redis中的应用(乐观锁和悲观锁redis)

改变出路:乐观锁与悲观锁在Redis中的应用

Redis是一种高性能的分布式内存数据库,具有快速读写、高并发、高可用性等特点,也逐渐得到各大公司的重视和采用,尤其在并发读写的场景中能够发挥其优势。之前的单线程或多线程锁技术,往往因为锁竞争的影响,性能低下,而不再受到许多公司重视,对这一问题,乐观锁和悲观锁技术则相对简单实用,并且能够满足大部分应用场景,例如:在商城系统中购物车结算、订单支付等场景,这里我们来看看乐观锁和悲观锁在Redis中的应用。

让我们来看一下什么是乐观锁和悲观锁,它们的主要目的是在多线程或者多进程中友好的实现对数据的读写,乐观锁是一种把握并发的思想,它是基于一种“万无一失”的信念,假设其他线程不会修改你正在操作的数据,使用一系列的算法保证在多线程或多进程环境下,对资源的操作能够完美的实现;而悲观锁则不同,它是基于一种“乐观得不到想要的”的信念,总是认为其他进程一定会修改你正在操作的数据,为了避免这种情况出现,它使用了一些特殊技术,例如加锁、等待锁释放等,来确保线程或者进程是对该资源的唯一拥有者,在资源使用完成之前,其他线程或者进程将不能访问该资源。

那么乐观锁和悲观锁在Redis中的应用究竟是怎样的呢?下面代码展示了从Redis中余额的读写的操作过程:

“`C++

//账户余额当前值

int account_balance=0;

//账户余额更新操作代码

//1.乐观锁:

int32_t cur_balance=stringToNum(redisGet(“acct_tot”));

//如果当前余额比账户原来余额少,则说明被其他线程(或进程)修改了,这里算作失败,直接退出本次操作

if (cur_balance

return ;

}

//如果当前余额与账户原来的余额一致,那么将其+1操作

redisSet(“acct_tot”, numToString(cur_balance+1));

account_balance = cur_balance;

//2.悲观锁

//1先获取数据对应的redis锁

redisLock(“acct_lock”);

//2读取数据

int32_t cur_balance=stringToNum(redisGet(“acct_tot”))

//如果当前余额比账户原来余额少,则说明被其他线程(或进程)修改了,这里算作失败,直接退出本次操作

if (cur_balance

return ;

}

//3.操作数据

redisSet(“acct_tot”, numToString(cur_balance+1))

//4.操作完,释放锁

redisUnLock(“acct_lock”)

account_balance = cur_balance;


通过以上代码可以看出,在Redis中应用乐观锁和悲观锁的方法有明显的不同,悲观锁在操作数据之前必须要先获取一个能够关联到该数据的锁,以保证操作的安全,这种情况下的缺点很明显,一旦存在更新数据的被锁住的情况,性能将会受到极大的影响;而乐观锁则从一开始就不对操作的数据做任何的锁定,采

数据运维技术 » 改变出路乐观锁与悲观锁在Redis中的应用(乐观锁和悲观锁redis)