自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Mengxiang's Blog

Live and let live

  • 博客(59)
  • 收藏
  • 关注

原创 一个轻量级、高性能、支持延时任务的任务管理器

源代码地址 breeze特性支持即时任务和延时任务可以单例部署或集群部署每个任务都有绑定的执行器,指向真正执行任务的代理方轻量极少的中间件依赖在单例模式下,只依赖mysql/pgsql在集群模式下,增加了对redis的依赖资源消耗低,内存占用通常低于 300MB安全性每一个改动都有审计日志使用token进行认证运行已测试的依赖版本Java 8MySQL 8.0, PostgreSQL 12Redis 6.0创建数据表见 db/job-mysql.SQL

2021-09-21 21:29:30 269

原创 一次排查PHP内存溢出的心路:PHP Fatal Error Allowed memory size

一个项目的服务器报错Fatal error: Allowed memory size of 2097152 bytes exhausted (tried to allocate 4096 bytes)从报错容易看出,PHP进程的内存不够用了,超过了 2097152 字节的限制。将 byte 换算成 M,也就是2M。大家应该知道,PHP通过ini文件控制单个进程分配的内存大小。查看php.ini路径# php -i | grep php.iniConfiguration File (php.in

2021-03-18 10:10:44 3561

原创 我是如何提高代码的可扩展性的

最近写了一个逻辑表达式引擎(everlogic),对于如何提高代码的可扩展性做了一些思考,在这里做个总结,希望对大家有所启发。该引擎想要达到的目标是传入一组参数,判断参数是否满足一定的逻辑条件。如传入参数 A 和 B,判断A、B是否都大于100,且 A 大于 B,逻辑表达式如下A > 100 and B > 100 and A > B除支持简单的逻辑表达式,还支持多个表达式的聚合,如(A > 100 and B > 100 and A > B) and (C &g

2021-01-21 11:28:22 1227

原创 EverLogic:轻量级的逻辑表达式引擎

everlogic特性支持逻辑表达式,如 a>b and b==2 and c!=d,a>b or b==2 or c!=d聚合逻辑表达式,如 (a>b and b==2 and c!=d) and (a1>b1 or b1==2 or c1!=d1) and (a2>b2 xor b2==2 xor c2!=d2)易于扩展自定义类型转换自定义比较运算自定义逻辑运算支持的数据类型字符串数字日期布尔JSON字符串数组数字数组数组类型支

2021-01-05 10:26:47 649

原创 TMQ:定时消息队列原理与实现

TMQTMQ: Timing Message Queue,定时消息队列。概念什么是定时消息队列?存储在队列中的消息,可以按投递时间顺序获取。用(t,m)表示一个消息,其中t是投递时间,m是消息体,则对于先后推送至队列中的消息(t1,m1),(t1,m2),当按投递时间t1获取时,将先后获取到m1、m2。应用场景新用户注册,第二天上午9点发放优惠券,则可以在新用户注册时推送一条定时消息,消息投递时间为第二天午9点,消息体可以是用户ID用户下单,半小时后提醒用户付款,消息投递时间为半小时后,消

2020-05-13 11:30:42 2172

原创 PHP开发者快速入门Java

PHPer learn Java概述本文面向需要学习Java的PHP开发者。本文从一个helloworld程序开始,紧接着一个数据库操作demo(这有别于从易到难的风格),然后回归基础,难度逐步加大。把数据库操作demo放在前面,是希望大家快速对一个Java项目形成感性的认识,请不要深究技术细节。难度最大的部分在于多线程和线程安全,这对很多PHP开发者来说是全新的领域。最后部分讲解如何用...

2020-04-15 19:32:38 533

原创 每天一块钱,拥有自己的云服务器

在云服务已经普及的今天,购买云服务器的成本越来越低了。拥有一台云服务器有哪些好处呢?永远在线,无需运维,云服务商帮我们打理好一切只要能连接网络,随时可以访问、控制服务器在云端搭建自己的博客、网站… …作者近期购买了一台云服务器,平均下来一天不到一块钱,性价比颇高,在此介绍一下配置方式,供大家参考。首先需要选择服务器的基础配置。如下图主要关注以下几个项目计费方式选择包年包月...

2019-12-09 15:47:35 324

原创 生活中的程序员思维(二)

生活中的程序员思维(二)在生活中的程序员思维(一)中,讲到了并行、并发、防御式编程等思维,下面继续讲另外三种思维。同步/异步公司楼下开了一个饮品店,颇受欢迎。有些公司会大批量购买,作为员工的下午茶。一开始,顾客需要亲自到店、点单、等待饮品做好,最后取走饮品。时间长了,无论是店家还是顾客,都觉得很不方便。对店家来说,突然来了大批订单,然而店里人手有限,此时别的顾客就只能长时间等待了,这导致了...

2019-11-06 20:24:47 355

原创 一种低冗余、客户端按需获取的API开发方法:map式API开发

map式API开发方法简介为什么叫 map 式?默认情况下API只返回极简的数据结构,最极端的情况,API默认只返回数据ID。客户端通过传参,向API索取自身所需的其它数据,传参越多,返回数据越多。随着业务需求的不断变化,API返回的数据越来越丰富,此时API只需要增加支持的传参,每一种参数都代表API能够提供的一类数据。例如参数 name 对应** ID 和名称**的 map参数 ca...

2019-10-24 17:09:30 192

原创 ignition: 从1开始搭建golang web应用

github地址帮助一些从PHP、Python等语言转Golang的web开发者,快速熟悉Go的一些特性,快速搭建自己的web应用。特性数据库连接池:支持MySQL、PsSQL、Redis等将请求参数和校验规则封装成实体(entity)引入getter,使客户端可以按需获取数据封装好的、易于使用的参数校验支持YAML配置文件环境要求go1.11或更高版本示例示例灵感来源...

2019-10-19 19:00:04 700

原创 唯快不破:如何快速处理大量数据

背景将数百张数据结构相同的表(用Tn代表),合并至一张表(用C代表)T表数据量分布很不均衡,少至一位数,多至几十万T表间没有业务关联C表结构在T表结构的基础上增加了几个字段,无法使用INSERT INTO (SELECT * FROM)数据总量约300万,经单进程测试,处理速度约500/s,预估耗时约100min目标最大化提升数据处理速度,将耗时降至10min左右,此时C表的写入...

2019-10-10 13:53:30 965

原创 生活中的程序员思维(一)

前言回顾大约7年的程序员生涯,从一开始的小白,到现在成长为一个可以去帮助他人的程序员,虽然离大牛还差得远,但还是有些东西想写一写,就当思绪的偶尔停留。如果能对他人有所启发,就是意外的收获了。这里不写具体的编程语言、技术内幕,而是写一些普遍适用的,甚至不止适用于编程领域的内容。这些所谓“进阶思维”,有些是我在成为程序员之前就具备的,有些是我后来慢慢学会的。按照惯例,先总体罗列出来:并行思维...

2019-09-29 15:37:01 683

原创 golang buffered channel demo

package mainimport ( "sync" "fmt" "time")type numPipe struct { Mu sync.Mutex Nums chan int}// 向管道写入数据func push(np numPipe, num int, sleep int) { np.Mu.Lock() for i := 0; i < sleep; ...

2019-01-26 17:34:50 298

原创 redigo源码解析

前言redigo是用Go语言开发的Redis客户端,受到Redis官方的推荐。redigo的源码量比较少,也比较清晰易读。redigo主要做了以下事项与Redis server建立连接按照RESP协议组装指令向Redis server发用指令接收Redis server返回的数据将返回数据解析成Go的数据类型连接池(Pool),支持设置最大的活动连接数,最大的空闲连接数源码概...

2018-12-09 13:24:02 507

原创 队列、堆栈和优先队列介绍及Redis实现

Redis丰富的数据类型,如list和zset,可以用来实现队列。已实现了以下几种队列。普通队列队列:FIFO双向队列:两个方向均可以PUSH、POP堆栈:LIFO优先队列:POP按优先级从高到低先后弹出元素其中,队列、双向队列和堆栈用list存储,优先队列用zset存储。增强特性支持容量固定,向一个满的队列PUSH会失败,向一个容量不足的队列PUSH也会失败支持可溢出(堆...

2018-11-25 21:21:49 4110

原创 Redis Lua编程与调试工具使用

前言Redis自2.6.0版本开始内置Lua解释器。Lua,轻量级脚本语言,号称最快的脚本语言。两者结合将爆发出巨大的威力。简介Redis Lua脚本可以调用原生的Redis命令,也可以包含自定义的控制流、逻辑运算、数学运算等,将复杂的业务逻辑封装起来,形成一个原子事务。这些特性使我们可以自由地扩展Redis,封装“自定义命令”。与MULTI+EXEC对比使用MULTI+EXEC及...

2018-09-30 16:29:56 3871 1

原创 mongodb字段验证规则(schema validation)

在我们通常的印象中,mongodb是模式自由的(schemaless),可以往一个集合里插入任意类型的数据,这会带来一些问题,例如对于PHP这种弱类型的语言,一个本应该是int型的字段,可能会同时存在string和int类型的数据。例如一个集合members,存储会员信息,包含的文档如下> db.members.find();{ "_id" : ObjectId("5b62a5c7...

2018-08-02 15:10:39 4116

原创 让redis操作更简单:为不同数据类型封装统一的命令

Redis内置了Lua解释器,可以运行一段lua脚本,完成相对复杂的操作。实现一个简单的操作:创建一个hash类型的key,并设置过期时间,lua代码如下local values = {}; for i,v in ipairs(KEYS) do values[#values+1] = redis.pcall('hmset', v, ARGV[2], ARGV[3], ARGV[...

2018-06-15 17:15:10 275

原创 jobs:一个帮助你更好地组织任务的PHP库

在你的项目中,可能会遇到使用异步任务的场景,异步任务需要满足以下需求任务执行时间可自主设定(延时任务)任务失败可重试,并有最大重试次数限制任务失败后,下次重试的时间可自主设定,如固定间隔时间,随着失败次数增加逐渐增大间隔时间对于有依赖关系的任务,需要按顺序执行有些任务的执行结果依赖外部回调,需要有一个中间状态php-jobs 是一个不错的实现。这是一个抽象的库,具体的mod...

2018-03-29 16:39:59 244

原创 在业务代码中植入异步通知功能

对异步通知的定位,是作为核心业务的一种补充,应该尽量与核心业务解耦。采用的解耦方式为“事件+监听器”。一些主流的php web框架,如laravel、yii2对“事件+监听器”的支持是“开箱即用”的,只需写少量的代码(通常是增加一些配置项)即可。这里描述的设计思想是“解耦”,是和语言无关的,属于“设计模式”的范畴。概念事件业务系统在某个时机触发事件,例如订单发货了,这时...

2018-02-24 11:33:34 257

原创 认识redis:redis计数器与数量控制

这篇文章是我个人对redis的一些理解,可以帮助大家系统的认识redis。本文的目标读者是使用过redis,但对redis了解不深的朋友。文章内容以redis为主,也会少量提到memcached。文章从redis的设计目的、工作模式、应用场景等方面阐述,最后会讲解一些具体的应用场景,还会夹带一些代码作为“干货”。鉴于本人水平有限,文中如有不准确的内容,敬请斧正。redis是什么redis是一种内存型

2017-12-04 08:27:51 6071

原创 mysql如何对待非法的enum值

mysql enum

2017-11-13 17:00:01 630

原创 将10进制整数转为64进制形式的PHP实现

/** * @param int $integer 10进制正整数 * @return string 64进制形式 */function decimal_to_base64($integer){ $chars_map = [ 0 => '0', 1 => '1', 2 => '2', 3 => '3',

2017-11-13 14:44:20 2246

原创 像查询MySql一样查询Redis

关系型数据库如MySql有丰富的SQL语句供我们使用,如wherewhere ininsertupdatedeleteorder bycount, sum, max, min等等。有些人曾经期待过,能否像查询MySql一样查询Redis?我就是其中的一员。现在有一个php库可以帮助你达成这个期待:redmodel安装推荐通过composer安装composer require "li

2017-03-30 13:18:31 6388

原创 PHP empty函数测试对象使用魔术方法获取的属性

php empty

2017-03-17 10:05:07 1379 3

原创 一个抢红包的PHP库:redenvelope

抢红包红包php

2017-03-06 18:00:56 1058

原创 将Redis操作封装成Model

Redis经常作为一种内存化的数据库使用,将Redis封装成Model,同一业务类型数据的操作都放在一个Model里,这样可以提高代码的可维护性。为此,我写了一个开源的库redmodel,将Redis常用的操作封装成了类似数据库查询语句的方法。例如一个key模式为user:{id}:profile的Hash类型的Model,更新操作$model->where('id', 1)->update([

2016-12-08 15:01:36 1888

原创 Fileflake:为Laravel定制的分布式文件存储服务

Fileflake为Laravel定制的分布式文件存储服务,使用mongodb作为后端存储引擎。特性支持的操作:上传,下载,删除分布式的文件存储节点存储节点负载均衡易于横向扩展(添加存储节点)文件流存储于mongodb文件流分块存储,块大小可配置拥有同样签名的文件只存储一个拷贝上手安装推荐使用composer安装. 参考 php composer.composer require "

2016-11-22 15:03:54 1079

原创 抢红包背后的技术点

最近做了一个抢红包的项目,这个项目涉及到了后端开发的多个技术点应用层悲观锁数据库锁机制数据库事务数据库索引以上这些技术点都是为高并发场景服务的。应用层悲观锁为了使抢红包的请求能够依次处理,使用悲观锁将红包预先锁定。需要为该悲观锁设定一个最大生存时间,以确保发生不可预知的错误时,不会影响后续的用户抢红包。其余并发进入的请求将等待并争抢红包锁。一个请求处理完成,将红包解锁,下一个成功获取锁的请

2016-11-16 17:45:14 2897 4

原创 快速排序算法的实现及相关测试算法的原理与实现

快速排序算法的python实现测试算法原理测试算法的python实现

2016-09-27 17:59:59 855

原创 数据库设计的重要性与几个原则

数据库设计分离主体与附属冗余应对新需求冷热分离

2016-09-15 21:20:04 15924 3

原创 代码重构之解耦合

重构松耦合设计模式面向接口编程

2016-08-22 14:51:42 4614

原创 正则表达式之非空白字符串

正则表达式非空白字符串

2016-08-12 16:57:01 18157

原创 常用的正则表达式

正则表达式 非空字符串

2016-08-12 16:52:10 353

原创 践行微服务理念

最近看到了一些介绍微服务理念的文章,恰巧在工作中遇到了需要搭建微服务的场景。情形是这样的:业务方通过token验证用户权限,用户token存储在单台redis服务器上。DBA为了保证token服务的高可用,打算采用redis cluster来避免单点失败,这需要业务方修改代码。因为用到用户token的业务方不只一个,采用的编程语言也不同,有PHP、nodejs,这样牵扯到的人力资源就比较多,后续的维

2016-08-10 18:34:42 619

原创 数据库缓存策略

用数学论证了缓存对数据读取性能的提升探讨了对数据一致性要求较高的场景下缓存的更新策略给出了采用redis作为mysql缓存时缓存key的命名规则及更新策略

2016-07-29 11:58:27 1025

翻译 怎样获取表单中multiple select的输入数据

表单获取multiple select输入数组multiple select values in array

2016-07-02 15:42:01 7974 1

原创 网站状态异常时自动重启php-fpm的shell脚本

php fpm重启网站状态 502shell脚本

2016-06-23 18:58:56 896

原创 Lumen 5创建Facade类

Laravel的Facade,实际上是对service container中的service provider的一层包装,使用魔术方法__callStatic调用service provider类的方法。

2016-05-05 17:12:56 4378

原创 Lumen log daily 每天创建一份日志文件

lumen log daily每天创建一份日志文件

2016-05-05 16:36:01 5793 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除