update blog

This commit is contained in:
lemonchann
2020-01-30 14:20:11 +08:00
parent eb7e82cc60
commit f19285a92d

View File

@@ -1,13 +1,13 @@
---
layout: post
title: "后台服务高并发编程-抢红包"
date: 2020-1-28
date: 2020-1-27
tags: [后台开发]
comments: true
author: lemonchann
---
今年春节响应国家号召在家宅着抵抗疫情,今年拜年也改用微信红包,春节发了很多也抢了很多微信红包,如今微信抢红包已经是非常平常的事情。
今年春节响应国家号召在家宅着抵抗疫情,拜年也改用微信红包,春节发了很多也抢了很多微信红包,也算支持了公司业务想到WXG的小伙伴丰厚的年终奖我柠檬了微信支付融入生活抢红包已经是非常平常的事情。
抢红包这一简单的动作,每一次都是对红包服务后台的一次请求,在春节期间海量的服务请求下,其实是一个很典型的高并发编程模型。后台开发程序员都有一个共识:**实现一个功能很容易,难的是大量请求下提高服务性能**。
@@ -52,9 +52,11 @@ author: lemonchann
> `隔离性Isolation`:对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务
> `永久性Durability`:事务完成后,它对数据库的修改被永久保持,事务日志能够保持事务的永久性
假设你每次去抢红包必然有其他人也在跟你同时在抢,所以你这条线程在抢的时候要独占资源,其他线程需要阻塞挂起等待你抢完才能进来,挂起的线程就干不了其他事了,何其浪费!
悲观的认为你每次去抢红包必然有其他人也同时在抢,所以你这条线程在抢的时候要独占资源,其他线程需要阻塞挂起等待你抢完才能进来,挂起的线程就干不了其他事了
而一旦你抢完红包释放了锁,其他在等待中的线程又要抢占资源、抢到了又要恢复线程上下文。
> 鲁迅先生说过浪费CPU资源就是浪费生命
而一旦你抢完红包释放了锁,其他在等待中的线程又要抢占资源、抢到了还要恢复线程上下文。
CPU不断的切换线程上下文非常浪费服务器资源严重的会导致不能及时处理后续抢红包请求需要想办法提高效率于是有了**乐观锁**
@@ -78,11 +80,13 @@ CPU不断的切换线程上下文非常浪费服务器资源严重的会导
上面两种锁的形式都是基于对数据库的更新来做的,在大请求高并发的时候,频繁的存取数据库,尤其是乐观锁重试会对数据库产生很大的冲击,在实际生产环境要尽量减少对数据库的访问。
Redis 是一个开源BSD许可内存中的数据结构存储系统它可以用作数据库、缓存和消息中间件。也可以用redis实现**分布式锁**只在第一次获取红包余额抢完更新红包状态,与数据库交互两次,抢锁和更新操作都在内存中进行,这可比数据库操作快了几个数量级,显著改善服务并发性能。
Redis 是一个开源BSD许可内存中的数据结构存储系统它可以用作数据库、缓存和消息中间件。也可以用redis实现**分布式锁**与数据库交互两次:第一次获取红包余额,第二次抢完更新红包状态。抢红包和中间过程更新操作都在内存中进行,这可比数据库操作快了几个数量级,显著改善服务并发性能。
redis分布式锁
> 利用Redis的SET操作在内存中保存key-value键值对加锁就是获取这个键值对的值解锁就是删除这个键值对。
分布式锁也不阻塞线程,关于这种分布式锁的实现不在这里展开说明,参考我公众号文章,[文章链接](1)
分布式锁也不阻塞线程,关于这种分布式锁的实现不在这里展开说明,参考我另一篇公众号文章,[redis分布式锁3种实现方式分析](1)
#### 更多原创技术干货分享在我的公众号:柠檬橙学编程 欢迎关注。