令牌桶限流算法

 下面我们通过使用redis实现一个简单通用的令牌桶限流算法解决问题 令牌桶算法主要是以桶的容量为基准,以固定的时间来生产令牌,有效的解决了漏桶效率不高的问题具体实现创建redis对象并定义缓存键$redis = $this->connect(); $key = "aaaaa";开启 watch 并定义定义每分钟最大请求数量$current_time = time(); $max_count = 320; $total_s = 60; $redis->watch($key);计算平均值用于限制每秒请求数量$rate = (int)(($max_count / $total_s) * ($current_time - ¥result_array["time"]));取出最大容量与桶内容量最小值$num = min($max_count, ($result_array["num"] + $rate));判断令牌数/* 令牌小于0 */ if ($num <= 0) { return false; }重新保存令牌$result = json_encode(["num" =>...

PHP,Golang,.Net,解决方案,其他 2023-03-21 AM 336次 0条

实现滑动窗口限流算法

 下面我们通过php使用redis实现一个简单通用的滑动窗口限流算法解决问题 滑动窗口算法主要解决了传统计数限流算法的阶段突发性流量问题。具体实现创建redis对象并定义缓存键$redis = new \Redis(); $redis->connect("127.0.0.1"); $key = "aaaaa";定义每分钟最大请求数量$max_count = 320; $total_s = 60; $current_time = time();计算平均值用于限制每秒请求数量$avg_count = ceil($max_count / $total_s);限制每秒请求数量$range_count = $redis->zRangeByScore($key, $current_time, $current_time); if (count($range_count) > $avg_count) { exit('请求太过频繁,请稍后 -1'); }限制每分钟请求数量$redis->zRemRangeByScore($key, 0, $current_time - 59); $c...

PHP,Golang,前端,.Net,解决方案,其他 2023-03-17 PM 363次 0条

mysql 报错 this is incompatible with sql_mode=only_full_group_by

 解决在 mysql 中使用 group by 无效报错 SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'xxxx' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by 问题分析 出现这个问题一般一下问题导致的mysql 8.0 及以上版本sql_mode 启用了 only_full_group_by查询字段中或者排序字段中出现了不存在 group by 的字段解决方案在 select 中使用 ANY_VALUE 聚合函数SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name...

数据库,解决方案 2023-03-01 AM 302次 0条

解决tp5,tp6,fastadmin框架api或者其他模块获取不到语言包问题

 分享下解决了在 api 模块或者其他任意自定义模块 模型获取不到语言包无法转换或者多模块公用一个语言包问题示例 主要默认加载了admin模块下的语言包 在基类或者当前类里面加入即可public function __construct($data = []) { parent::__construct($data); $this->loadlang(mb_strtolower(class_basename(static::class))); } /** * 加载语言文件 * @param string $name */ protected function loadlang($name) { $name = Loader::parseName($name); $name = preg_match("/^([a-zA-Z0-9_\.\/]+)\$/i", $name) ? $name : 'index'; $lang = request()->langset(); $lang = preg_match("/^([a-zA-...

PHP,解决方案 2022-11-09 PM 337次 0条

redis管理key任意分割符层次算法

 简单研究了下市面上Redis管理器key分隔符算法的时间下面分享下.效果 下面展示了其他redis管理器的效果和我们要实现的目标效果常见效果目标实现效果实现算法可以看到上面通过冒号分割符将 key 分割成层级目录方便管理查看.实现步骤scan获取redis指定数量key循环遍历所有key指定转换分割符号 : 或者其他符号为数组判断数组是否有多个只存在一个则直接赋值键存在多个则赋值引用类型到临时变量然后循环赋值键到临时变量 难点在于 & 引用类型的理解实现算法$iterator = null; $all_keys = $redis->scan($iterator, $search, 1000); $keys = []; foreach ($all_keys as $datum) { $key_array = explode(':', $datum); if (count($key_array) > 1) { $keys_temp = &$keys; foreach ($key_array ...

PHP,解决方案 2022-10-28 PM 315次 0条

缓存三贱客

无处不在的缓存缓存在计算机系统是无处不在,在CPU层面有L1-L3的Cache,在Linux中有TLB加速虚拟地址和物理地址的转换,在浏览器有本地缓存、手机有本地缓存等。可见,缓存在计算机系统中有非常重要的地位,其主要作用是提高响应速度、减少磁盘访问等。高并发系统中的缓存一句话概括缓存系统在高并发系统中的地位的话就是如果高并发系统是烤羊肉串,那么缓存系统就是那一撮孜然。缓存系统的作用缓存系统在高并发系统的作用很大,在某种程度上可以说没有缓存系统很难支撑高并发场景。基于机械磁盘或SSD的数据库系统,一般来说读写的速度远慢于内存,因此单纯磁盘介质的数据库无法支撑很高的并发,可以简单认为缓存是保护磁盘数据库的重要屏障。对于一些基于LSM的存储引擎数据库来说,随机写改为顺序写速度提升很大,但是随机读仍然是个问题,所以缓存系统是很有必要的如:NessDBleveldbhbase其核心思想的核心就是放弃部分读能力,换取写入的最大化能力。缓存系统访问流程实际场景也是读多写少,看看请求是如何得到响应的,简单看下交互流程:请求到达之后,业务线程首先访问缓存,如果缓存命中则返回如果未命中则继续请求磁...

PHP,解决方案,其他 2022-06-01 PM 591次 0条

使用composer更新引用包404问题2022年3月29号

 就在 2022年3月29号 我们使用 composer 来 require 使用第三方包或更新 composer包 会出现大面积404问题。异常信息 [Composer\Downloader\TransportException] The "https://mirrors.aliyun.com/composer/p/provider-2017%2477f874a1ea778d1061dc0376ee5bb78089142e6d0933b308200c290eb53e7af4.json" f ile could not be downloaded (HTTP/1.1 404 Not Found) 解决composer包404问题 原因是因为composer已经逐渐废弃v1版本,我们只需要将composer升级到v2版本即可解决。composer升级到2.x版本和降级

PHP,解决方案 2022-03-30 AM 975次 0条

最新jetbrains全家桶及phpstorm激活方法支持全系列全版本支持更新永久有效

  继 IDE Eval Reset 失效后,今天我们分享一个最新的jetbrains全家桶及phpstorm激活方法,并且支持全系列,全版本可更新使用并且有效。 我们知道 jetbrains 家的产品用过的都知道非常好用,其中包括 phpstorm , goland , pycharm , webstorm , intellij idea 等等这些都是非常强大及好用的开发工具,但是奈何 jetbrains 系列的工具都是要收费激活的虽然淘宝上有便宜的 学生邮箱 和 破解版 但是这些非常 容易被封 ,博主已经入了两次淘宝的坑了。 博主之前分享的 phpstorm及jetbrains永久免费激活工具插件无限试用使用 奈何对2021年6月份之后的版本已经无效了,插件的开发者已经停止对激活插件的更新了所以说2021年6月份之后的版本就不能再使用了。最新jetbrains全家桶激活方法 原理是我们主要通过代码搜索其他授权服务器进行永久激活激活。方式一 通过censyshttps://search.censys.io/主要用到的代码services.http.response.head...

PHP,软件工具,Golang,前端,解决方案 2022-03-23 AM 15407次 0条

swoole 处理 has already been bound to another coroutine xxx异常

 分享下之前在使用swoole开发项目时遇到的swoole协程问题。swoole 异常信息 P Fatal error: Uncaught Swoole\Error: Socket#37 has already been bound xxxPHP Fatal error: Uncaught Swoole\Error: Socket#37 has already been bound to another coroutine#19895, reading of the same socket in coroutine#19896 at the same time is not allowed in /www/wwwroot/default/vendor/xxx.php:34 Stack trace: xxxxxxxxxx问题分析 从日志看像是同一个Socket链接不能同时存在于不同的协程里面,也就是不能夸协程使用mysql,redis同一条连接对象。问题处理 知道问题就好处理了可以使用swoole channel 实现一个连接池如下:Channelprivate static ...

PHP,解决方案 2022-02-22 PM 1267次 0条

解决使用idea,phpstorm等开发工具git自动变为修改状态

 本文记录解决使用idea,phpstorm等开发工具在windows下提交代码后在linux下同样使用相同工具代码全部变为git修改状态如图。 通过上面的图片我们可以看到标记为修改状态的代码文件什么都没有修改但是因为跨平台出现了git修改状态,经过排查发现是 windows 和 linux 下换行转换的问题。windows下默认idea换行符 windows下默认换行符为 CRLF 格式linux下默认默认idea换行符 windows下换行符为 LF 格式解决跨平台默认idea换行符问题 既然我们找到了问题那么就好解决了我们只需要配置下git拉去或者提交代码时候保持原样或者指定格式即可。提交时转换为 LF 检出时转换为 CRLF (推荐windows)git config --global core.autocrlf true提交时转换为 LF 检出时不转换(推荐unix/mac)git config --global core.autocrlf input提交检出均不转换换行符git config --global core.autocrlf false拒绝提交包含混合换行...

PHP,Linux,解决方案 2022-01-22 AM 1063次 0条