改变出路:乐观锁与悲观锁在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中应用乐观锁和悲观锁的方法有明显的不同,悲观锁在操作数据之前必须要先获取一个能够关联到该数据的锁,以保证操作的安全,这种情况下的缺点很明显,一旦存在更新数据的被锁住的情况,性能将会受到极大的影响;而乐观锁则从一开始就不对操作的数据做任何的锁定,采
成都网站设计制作选创新互联,专业网站建设公司。
成都创新互联10余年专注成都高端网站建设定制开发服务,为客户提供专业的成都网站制作,成都网页设计,成都网站设计服务;成都创新互联服务内容包含成都网站建设,小程序开发,营销网站建设,网站改版,服务器托管租用等互联网服务。
网站名称:改变出路乐观锁与悲观锁在Redis中的应用(乐观锁和悲观锁redis)
分享地址:http://www.shufengxianlan.com/qtweb/news47/378747.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联