首页
关于叶子
Search
1
Win10突然出现不能连接共享打印机一例
310,113 阅读
2
[经验存档] 微星(MSI)B150M-Pro-VD Plus安装系统蓝屏一例
181,667 阅读
3
Laravel“高并发”导致数据“统计”异常一例
71,227 阅读
4
[iOS|Xcode]iOS-App自定义启动页制作(uniapp适用)
52,064 阅读
5
[Windows]查看连接过的WIFI密码
47,950 阅读
代码
分享
琐事
MySQL
数码
前端
MacOS
软件
Windows
PHP
GoLang学习
登录
Search
标签搜索
Laravel
PHP
Windows
Laravel-Admin
Vue
uniapp
CSS
前端
chartjs
HTML
微信
小程序
web
MacOS
App
iOS
工具
Golang
微服务
高并发
Yesr00
累计撰写
64
篇文章
累计收到
7
条评论
首页
栏目
代码
分享
琐事
MySQL
数码
前端
MacOS
软件
Windows
PHP
GoLang学习
页面
关于叶子
搜索到
14
篇与
的结果
2024-09-10
Laravel 9高并发API数据操作的最佳实践
### 在Laravel 9中处理高并发API的数据操作随着互联网应用的不断发展,API服务面临着越来越多的高并发请求挑战。在Laravel框架下开发API时,如何确保在高并发场景下的数据一致性成为了一个重要的问题。本文将探讨在Laravel 9中使用Eloquent ORM处理API高并发请求时的一些稳妥操作方法。#### 1. 并发问题概述在高并发场景下,多个用户几乎同时访问同一资源时,可能会导致数据一致性问题。例如,当多个请求尝试同时修改某个用户的请求次数时,如果不采取任何措施,最终的结果可能是数据被重复计算或遗漏计算。#### 2. 使用事务Laravel提供了一种简单的方式来处理数据库事务,它可以确保一组操作要么全部成功,要么全部失败。在处理高并发请求时,使用事务可以提高数据的一致性。```php DB::beginTransaction(); try { // 执行一系列操作 DB::commit(); } catch (\Exception $e) { DB::rollBack(); } ```#### 3. 乐观锁乐观锁是一种在不锁定数据的情况下处理并发的方法。它通过比较数据版本或时间戳来决定是否接受更改。在Laravel中,可以利用Eloquent模型的属性来实现这一点。```php $user = App\Models\User::find($userId); if ($user->version === $oldVersion) { $user->version++; $user->save(); } ```#### 4. 悲观锁悲观锁假设最坏的情况,即认为数据很可能被修改,因此在开始操作前会锁定数据。在Laravel中,可以通过`lockForUpdate()`方法来实现。```php $user = App\Models\User::find($userId)->lockForUpdate(); // 执行操作 $user->save(); ```#### 5. 原子操作Laravel的Eloquent ORM提供了`increment()`和`decrement()`方法来执行原子操作,这对于高并发场景下的计数器非常有用。```php $user = App\Models\User::find($userId); $user->decrement('remaining_times'); $user->increment('total_times'); ```#### 6. 分布式锁对于极端高并发的情况,可以考虑使用Redis或其他分布式锁服务来确保在分布式环境中的一致性。```php $lock = new RedisLock($redis, 'unique_lock_key'); if ($lock->acquire()) { try { // 执行关键操作 } finally { $lock->release(); } } ```#### 结论在Laravel 9中处理API高并发请求时,选择合适的数据操作策略至关重要。使用事务、乐观锁、悲观锁、原子操作以及分布式锁等技术可以有效地解决并发带来的数据一致性问题。开发者应根据具体的业务场景和技术需求来选择最合适的方法。---以上方法可以帮助你在Laravel 9中构建更加稳健和高效的API服务,确保即使在高并发条件下也能保持良好的用户体验和数据完整性。
2024年09月10日
37,520 阅读
0 评论
0 点赞
2024-09-10
Laravel“高并发”导致数据“统计”异常一例
最近在用Laravel写一个接口,大致逻辑如下:用户请求接口,校验用户传参,取数据库数据,数据处理,用户请求数据次数+1,用户剩余请求次数数据-1,返回数据。最近呢,有用户并发比较高,我在校验完数据后拉取数据库用户数据:$check = User::query()->where('id',$id)->first();......中间省略数据处理$remaining_times = $check->remaining_times-1; $total_times = $check->total_times+1; $check->update(['remaining_times'=>$remaining_times,'total_times'=>$total_times]); return response()->json([......]);根据Log获知,有好几条查询 $remaining_times 和 $total_times 在进行加减以后依然维持原数据。 初步判定为并发导致。当时考虑过用事务处理,悲观锁,乐观锁。 但是出于更方便的处理,最后使用 increment() 和 decrement() 进行处理。事情暂定为这样再观察。谨以此做记录,如果有更好的方法后续再更新或者欢迎大佬们评论讨论。
2024年09月10日
71,227 阅读
0 评论
0 点赞
2021-03-23
Laravel-Admin列表筛选后BootStrap-PopOver插件失效
最早的时候用的是 title 进行的气泡提示。发现响应速度慢,样式也不是很好看。于是想起了popover气泡插件。 近日,在优化列表气泡问题的时候,叶子遇到了这样一个问题。首次进入界面。popover正常。 但是在筛选后重载列表的时候。popover就失效了。 检查相关元素,代码未丢失。 于是就只能判断是初始化失效了。 一通搜索的结果,发现有不少append之后popover失效的问题。综合以上判断, 在bootstrap.php中添加如下代码: Admin::script(' (function(){ $("[data-toggle=\'popover\']").popover(); })() ');
2021年03月23日
7,644 阅读
0 评论
0 点赞
2021-02-07
Laravel-Admin下使用chartjs模板渲染问题一例
叶子最近在做图表的时候遇到一个问题。挣扎了很久。。。最后的最后才破案。。。 下面直接上代码:后端代码: //>计算起止时间相差月份 $month = $this->count_month($start_time,$end_time); $pay_date = []; for($i=0;$i结尾月份固定为$end_time $pay_date[] = (string)date('Y-m',strtotime($end_time)); 这样返回到前端后格式如下: 这样看来。后端返回数据就正常了。我们来看前端。。。下面第一个版本: <canvas id="linePay" style="width:200px;height:50px;"></canvas> $(function () { var ctx = document.getElementById("linePay").getContext('2d'); var smmyChart = new Chart(ctx, { type: 'line', data: { labels:[ @foreach($pay_dates as $v) {{$v}}, @endforeach ], datasets: [{ label: "收费金额", data: [ @foreach($sum_pay as $v) {{$v}}, @endforeach ], backgroundColor: 'rgba(255, 99, 132, 0.2)', borderColor: 'rgba(255,99,132,1)', borderWidth: 1 }, ] }, options: { barPercentage: 1.0, categoryPercentage: 1.0, legend:false, title: { display: false, text: '月收费金额' }, tooltips: { mode: 'index', intersect: false }, responsive: true, scales: { xAxes: [{ beginAtZero: true, }], yAxes: [{ ticks:{ min:0, beginAtZero: true }, }] } } }); }); 这样运行下来。chartjs直接把labels里的年-月当成了减法运算。。。导致了: 接下来一番折腾。是第二版本: <canvas id="linePay" style="width:200px;height:50px;"></canvas> $(function () { var ctx = document.getElementById("linePay").getContext('2d'); var smmyChart = new Chart(ctx, { type: 'line', data: { labels:[ @foreach($pay_dates as $v) {{(string)$v}}, @endforeach ], datasets: [{ label: "收费金额", data: [ @foreach($sum_pay as $v) {{$v}}, @endforeach ], backgroundColor: 'rgba(255, 99, 132, 0.2)', borderColor: 'rgba(255,99,132,1)', borderWidth: 1 }, ] }, options: { barPercentage: 1.0, categoryPercentage: 1.0, legend:false, title: { display: false, text: '月收费金额' }, tooltips: { mode: 'index', intersect: false }, responsive: true, scales: { xAxes: [{ beginAtZero: true, }], yAxes: [{ ticks:{ min:0, beginAtZero: true }, }] } } }); }); 以为强制string后可以达到效果。。。结果真的是然并卵。。。最后的最后。。。才突然想起是不是混编不识别这个东西。。。所以有了第三个版本: <canvas id="linePay" style="width:200px;height:50px;"></canvas> $(function () { var ctx = document.getElementById("linePay").getContext('2d'); var smmyChart = new Chart(ctx, { type: 'line', data: { labels:[ @foreach($pay_dates as $v) "{{$v}}", @endforeach ], datasets: [{ label: "收费金额", data: [ @foreach($sum_pay as $v) {{$v}}, @endforeach ], backgroundColor: 'rgba(255, 99, 132, 0.2)', borderColor: 'rgba(255,99,132,1)', borderWidth: 1 }, ] }, options: { barPercentage: 1.0, categoryPercentage: 1.0, legend:false, title: { display: false, text: '月收费金额' }, tooltips: { mode: 'index', intersect: false }, responsive: true, scales: { xAxes: [{ beginAtZero: true, }], yAxes: [{ ticks:{ min:0, beginAtZero: true }, }] } } }); }); 运行后: 至此排除问题→_→真真是轮引号的重要性。。。
2021年02月07日
7,972 阅读
0 评论
0 点赞
2021-01-20
Laravel-Admin使用Vue给ChartJS动态增加数据
首先需要引入几个JS:<script src="https://cdn.jsdelivr.net/npm/vue"></script> <script src="/path/to/js/axios.min.js"></script> <script src="/vendor/laravel-admin-ext/chartjs/Chart.bundle.min.js"></script>然后body部分:<div id="app"> <canvas id="myChart" style="width:200px;hegiht:200px;"></canvas> </div>接下来在JS部分:var app = new Vue({ el: '#app', data: { //>定义数据 labels: [], datas: [], }, methods: { draw() { var self = this; axios.get('/admin/test?axios').then(function (res) { //>遍历处理数据 for (var key in res.data.labs) { self.labels.push(res.data.labs[key]); } for (var key in res.data.data) { self.datas.push(res.data.data[key]); } //>开始图表绘制 var ctx = document.getElementById("myChart").getContext('2d'); var myChart = new Chart(ctx, { type: 'bar', //>bar为柱状图,line为折线图,还有其他的图表方式,可以按照自己需求,从官方文档中获取更多类型 data: { labels: self.labels, //>x轴标签 datasets: [{ label: "", //>第一个标签 data: self.datas, //>展示数据 backgroundColor: [ //>柱状图背景色,折线图的话就是填充背景色,如果存在多个数据则用数组,单条数据则不需使用数组。 'rgba(255, 99, 132, 0.2)', 'rgba(26,66,230,0.2)', 'rgba(54, 162, 235, 0.2)', 'rgba(255, 206, 86, 0.2)', 'rgba(75, 192, 192, 0.2)', 'rgba(153, 102, 255, 0.2)', ], borderColor: [ //>边框颜色 'rgba(255,99,132,1)', 'rgba(26,66,230,1)', 'rgba(54, 162, 235, 1)', 'rgba(255, 206, 86, 1)', 'rgba(75, 192, 192, 1)', 'rgba(153, 102, 255, 1)', ], borderWidth: 1 //>边框宽度 }] }, options: { categoryPercentage: 1.0, legend: false, //>是否显示图标顶部图示 title: { //>图标顶部标题显示,可以用来显示一些统计信息之类的 display: true, text: 'this is title' }, tooltips: { mode: 'index', intersect: false }, responsive: true, scales: { xAxes: [{ beginAtZero: true, }], yAxes: [{ ticks: { barPercentage: 1.0, beginAtZero: true }, }] } } }); }, function (err) { }) } }, mounted() { }, created() { this.draw(); } })
2021年01月20日
7,216 阅读
0 评论
0 点赞
1
2
3