- 博客(47)
- 资源 (11)
- 收藏
- 关注
原创 程序实现黎曼和(定积分)
想象一下,如果你手里有一块形状不规则的土地(实际上我没有,穷…),要测量它的面积,怎么办呢?拿尺子量,不知如何下手,突然感觉高中几何解决不了,得祭出本科的高等数学才行。所以,惯例我们应该发扬拿来主义,比如 “国际上,如何如何…”:一个叫黎曼的德国数学家(Bernhard Riemann, 1826-1866),他想了个办法:将这不规则图形切成一条条的小长条儿,然后将这个长条近似的看成一个矩形,...
2019-11-02 15:27:56
5549
2
原创 使用golang实现令牌桶限流和时间窗口控制
这篇文章不是讲令牌桶算法原理,关于原理,请参考 https://blog.csdn.net/lzw_2006/article/details/51768935我这里只是使用golang语言来实现令牌桶算法,以及时间窗口限流。#### 针对接口进行并发控制如果担心接口某个时刻并发量过大了,可以细粒度地限制每个接口的 总并发/请求数以下代码golang实现```gopackage...
2019-05-23 15:54:55
2227
原创 consul 配置/KV/ACL
[TOCM]Consul版本 v0.9.31. 配置1.1 CLI配置Consul Agent有各种各样的配置项可以在命令行或者配置文件进行定义,所有的配置项都是可选择的,当加载配置文件的时候,Consul从配置文件或者配置目录加载配置。后面定义的配置会合并前面定义的配置,但是大多数情况下,合并的意思是后面定义的配置会覆盖前面定义的配置,但是有些情况,例如event句柄,合并仅仅是添加到前面定义的句
2017-11-01 11:43:34
6202
原创 使用nutch搭建类似百度/谷歌的搜索引擎
Nutch是基于Lucene实现的搜索引擎。包括全文搜索和Web爬虫。Lucene为Nutch提供了文本索引和搜索的API。1.有数据源,需要为这些数据提供一个搜索页面。最好的方式是直接从数据库中取出数据并用Lucene API 建立索引,因为你不需要从别的网站抓取数据。 2.没有本地数据源,或者数据源非常分散的情况下,就是需要抓别人的网站,则使用Nutch。1.安装1.安装tomcat[root
2017-10-21 11:09:57
2291
原创 微服务注册发现集群搭建——Registrator + Consul + Consul-template + nginx
在互联网应用领域,服务的动态性需求十分常见,这就对服务的自动发现和可动态扩展提出了很高的要求。微服务系统动辄上万个服务,而且还要动态伸缩。以人工写好的IP、Port 硬编码脚本的方式无法做到大规模自动化,稍微多点服务运维就傻了。微服务必然要做到ip和port自动分配,减少人工干预。我们需要让每个服务能动态的创建地址,同时调用方要能感知地址变化。这就需要有一个服务注册与发现的机制,这篇文件就是讨论如何
2017-07-26 18:54:34
5447
1
原创 面试圣经(一)
小桔科技 四面面试官是个部门经理,比较和蔼,说话爱笑,比别的公司的总监层面的人严肃的面孔好多了,也让面试者轻松很多。总结下他问的诸多问题以及我的解法,先上几个问题 1有数字1、2、3….直到n+2的递增数列,每个数都是唯一不重复的,以1的步长增长的。去掉其中两个数,然后打乱次序,找出被去掉的数到底是哪两个?(n假设是10w,空间复杂度要求O(1))答:方法1: 这是我的回答 设这些数保存在数组A
2017-05-20 15:40:24
1006
原创 nginx启用HSTS以支持从http到https不通过服务端而自动跳转
最近对我的个人网站启用了Https,所以想设置http默认自动转https访问的功能,但又不想总让服务端做转发操作,那样浪费资源。那么有什么好的办法呢?302跳转通常将 HTTP 请求 302 跳转到 HTTPS,但有问题:1.不安全,302 跳转会暴露用户访问站点,易被劫持。2.多增加一次访问,使得客户端响应速度慢。302 跳转需要一个 RTT(The role of packet loss an
2017-05-18 00:39:04
19797
原创 开发过程中遇到的各种问题汇总
TLS/SSL/HTTPS1.我的个人网站https改造过程中,遇到问题 Mixed Content: The page at ‘https://www.liberalman.cn/login’ was loaded over HTTPS, but requested an insecure stylesheet ‘http://o9gqjr7iy.bkt.clouddn.com/libertyb
2017-05-13 20:53:26
7101
转载 对象池
一个广为人知但鲜有人用的技巧:对象池对象池是一种设计模式,它会预先初始化一组可重用的实体,而不是按需销毁然后重建。在使用套接字描述符时,人们通常会将其池化。实际上,套接字描述符的数量通常比较少(最多上千个),之所以要采用池的方式,是因为它们的初始化成本非常高。而在最近发表的一篇博文中,ClojureWerkz核心成员Alex Petrov探讨了另一种对象池应用场景,即将大量的存活期短且初始化成本低的
2017-05-13 20:48:51
890
原创 基于AWS S3协议搭建个人云存储服务
相信风靡全球的亚马逊 AWS S3 的存储云服务大家已经耳熟能详了,如何自己搭建一个私有的S3存储云服务呢?Minio 实现了 AWS S3 存储协议,开源并且用Go语言开发,有web操作界面,我们可以用它来搭建兼容S3协议的存储云服务。官网 https://minio.io/详情见如下操作[root@localhost ~]# mkdir /data/aws_s3[root@localhost
2017-03-29 23:25:06
20369
6
原创 levelDB
levelDB是Google做的内存数据库的开发库,而号称要取代rediss的SSDB就是基于levelDB开发的。1,下载levelDB源码git clone https://github.com/google/leveldb.git我是下载了这个地址的zip包leveldb-master.zip,解压安装的。2,编译LevelDB[root@localhost ~]# unzip leveldb
2017-03-16 01:13:39
916
原创 OpenResty入门
操作系统:Centos 7OpenResty是整合nginx模块,用作web开发工具之用,具体可以百度!配置安装源[root@localhost ~]# vim /etc/yum.repos.d/OpenResty.repo内容如下:[openresty]name=Official OpenResty Repositorybaseurl=https://openresty.org/yum/ope
2017-03-15 01:20:41
1324
原创 通过UDF使mysql主动刷新redis缓存
UDF是mysql的一个拓展接口,UDF(Userdefined function)用户自定义函数。在什么地方使用这个功能呢,试想有如下场景:你的网站使用mysql作为最终数据落地的存储引擎,而redis作为缓存以减小查询请求穿透到mysql的数量,可以极大的降低数据库性能瓶颈带来的整个网站对外服务的卡顿、不可用等情况。这种方式的架构,当有查询请求的时候,我们可以在业务逻辑层控制,先从缓存中查询,无
2016-08-23 16:25:38
10424
3
原创 抛弃mysql模糊查询,使用sphinx做专业索引
Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,提供比数据库本身更专业的搜索功能特别为MySQL也设计了一个存储引擎插件,从此抛弃模糊查询吧。Sphinx 单一索引最大可包含1亿条记录,在1千万条记录情况下的查询速度为0.x秒(毫秒级)。Sphinx创建100万条记录的索引只要 3、4分钟,创建1000万条记录的索引可以在50分钟内完成,而重建一次只包
2016-08-19 15:16:26
7853
原创 epoll边沿触发漏报消息包问题
开发一个即时通讯后台,底层的网络收发使用 epoll + main loop实现网络事件(conn、read、send)的异步触发读写,以达到能最大限度减少线程的IO等待,提高cup利用率的目的。实际使用中,会发现有少量并没有 因为访问后端阻塞 但是依然反馈慢到超时的情况,我们定义从客户端发消息到收到反馈,3s超时,而我们发现延迟可能好几分钟,这让我觉得肯定不是后端一些复杂逻辑导致的,逻辑层再复杂,
2016-08-05 11:47:33
2759
2
原创 Haproxy+etcd+confd+Docker搭建节点自动发现的高可用负载均衡框架
记得先要安装docker,具体这里不赘述了,百度或者看我的文章http://www.jianshu.com/p/3ffa4e5cbb86先扔出一张图来解释这四个组件之间的关系下面细说1.HaproxyHaproxy不用多说,负载均衡软件,安装Haproxyyum -y install haproxy版本是haproxy-1.5.4-3.el6.x86_64.rpm2.etcdetcd,是一个高可用的
2016-07-25 20:29:49
9870
3
原创 docker容器扫盲
Centos 6.5 安装和使用docker基于本人一贯的习惯,关于“某某某是什么”这样的问题,请百度吧,会有更专业的人士,会比我说的更详细更深,这里我只给出本人亲历的安装和使用过程。1.安装先检查服务器环境,docker要求操作系统CentOS6以上,kernel 版本必须2.6.32-431或更高,即>=CentOS 6.5,运行docker时实际提示3.8.0及以上,必须64bit,32bit
2016-07-22 21:55:21
13783
1
原创 从零实现高并发Web服务器-哈希表
哈希表自定义实现哈希表/** 键值对 */typedef struct { lbt_str_t key; /**< 键 */ lbt_uint_t key_hash; /**< 通过哈希运算,将key投影到整型的哈希值 */ void *value; /** 值 */} lbt_hash_key_t;/** 桶元素 */typedef struct
2016-07-17 16:37:19
850
原创 基于mysql的分布式数据库中间件-Mycat
一、Mycat根据官网的定义:Mycat是一个可以用于MySQL读写分离和高可用的中间件,一个模拟为MySQL Server的超级数据库,一个能平滑扩展支持1000亿大表的分布式数据库系统,一个可管控多种关系数据库的数据库路由器,一个平滑从关系数据升级到大数据的应用中间件。其前身是阿里的Cobar项目。 介绍就不多说了,可以看官网http://www.mycat.org.cn/ 接下来我们实践吧
2016-07-09 23:08:57
4330
1
原创 环形队列
环形队列,也可以叫环形缓冲区。我们用数组来举例,通常对于一个放到数组中的队列,生产者将数据写入队尾,消费者从队头取走,两个指针朝着同一个方向运动,消费者追生产者。而“环”在这里的体现,就是不管生产者还是消费者,当指针跑到队尾的时候,掉头到该数组头去,形成一个没有终点的环。 这要做的好处是,当生产者和消费者都是单线程,也就是只有一个生产者和一个消费者的时候,不用加锁。如果生产者或者消费者都是多个,就
2016-07-08 12:09:45
842
原创 修改FILE缓冲区大小,改进写日志性能
由于线上服务端程序,需要大量写入日志,将来入数据库库,以便做数据分析或者对账之用,可是发现日志打开后服务器变慢了,对外并发响应数量也减少了。于是分析了下日志写入函数fprintf。其写日志文件的顺序是:程序写入用户地址空间内核从用户地址空间缓冲区复制到内核文件缓冲区内核文件缓冲区满的情况下再放入内核io队列,等待写入到硬盘上。写文件其实不是直接写到硬盘,那样的话一堆程序都同时并发往硬盘上写,硬盘
2016-07-06 22:42:14
10146
1
翻译 Chapter 2. Game Engine Anatomy游戏引擎剖析(揭秘)
iPhone Game Development Developing 2D & 3D games in Objective-CTo solve the large problem of how to create a game on the iPhone, we first need to solvea series of smaller problems such as how to displ
2016-07-02 00:17:51
911
原创 KeepAlived+MySQL互为主从
解决Master单点问题,两台mysql互为主备,双向replication。当一master挂了,则将slave切换为master,继续工作。好,给定两台机器 主机A:192.168.1.201 主机B:192.168.1.202一、互为主从1.配置 主机A上,vim /etc/my.cnf,添加: [mysqld] log-bin=mysql-bin server-id=1 #服务i
2016-07-01 23:16:00
13254
原创 欢迎使用CSDN-markdown编辑器
欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学公式UML序列图和流程图离线写博客导入导出Markdown文件丰富的快捷键快捷键加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl
2016-07-01 23:03:44
373
原创 从零开发MQTT服务(二)
二、配置文件 也不是核心模块,不用太多篇幅写了,看我github代码吧static int load_conf_from_file(libertymqtt_config *config, bool reset, const char *filename, int level, int *line){ int ret = 0; const int MAX_LINE = 1024;
2016-06-22 22:53:51
423
原创 从零开发MQTT服务(一)
开发语言:Linux下C语言,gcc 版本 4.4.7 20120313 (Red Hat 4.4.7-17) (GCC) 操作系统:Centos 6.5 64bit 源码地址:https://github.com/liberalman/mqtt/tree/master/libertymqtt一.日志模块文件路径:src/log.c 这里贴出核心代码void print(const char
2016-06-22 11:25:00
524
原创 二分查找、折半查找
#include <stdio.h>#define N 10void printA(int A[], char n){ int i = 0; for (i = 0; i < n; i++) { printf("%d ", A[i]); } printf("\n");}void printSearch(int A[], char n, i
2016-06-15 18:28:31
745
原创 用Golang实现基于时间轮算法的定时器
package timingwheelimport ( //"container/list" //"fmt" "sync" "time" "timer_server/util")const wheel_cnt uint8 = 5
2016-06-12 17:13:57
4876
原创 C调用graphviz绘制堆
之前的博客http://blog.csdn.net/socho/article/details/51565498《对”堆”的理解》中打印堆是在终端中,不是很直观,发现一个可以生成图片的利器graphviz,于是用c语言调用下,程序运行中生成图片,特别直观了。 以上是用终端打印出来的,发现了一个绘图利器graphviz,可以把堆画出来。安装这个软件什么的就不讲了,自己百度,这里默认已经安装好了。所以
2016-06-08 20:31:53
2281
2
原创 快速排序
C语言实现#include <stdio.h>#define N 9int A[N] = { 10, -3 , 28, 76, 37, 55, -1, 99, 11};void printArr(int arr[], int length){ int i; for (i = 0; i < N; i++) { printf("%d ", A[i]);
2016-06-05 20:43:18
489
原创 排列组合 C语言实现
#include <stdio.h>#include <stdlib.h>int array[] = {1,2,3,4};#define N 4#define M 3int queue[N] = {0}; //保存已经找到的结果,前缀int top = 0; //队列顶部下标int flag[N] = {0}; //是否已经排列过了的标志/** * 排列 * @param s 递归
2016-06-04 23:15:11
9706
原创 linux下如何让程序无法重复启动
通常情况下一个程序可以被多次执行,也就存在多个相同的进程。有时候我们有些全局资源只允许单进程访问,为了不让进程多起,要实现进程在一台机器上只能有一个实例的方法。 经查找,可以使用flock的方式,建一个lock file,让程序执行前先检查是否有执行中的实例,即对文件加锁。single_program.c#include <stdio.h>#include <stdlib.h>#include
2016-06-04 22:24:38
2962
原创 索引查找
索引查找是在索引表和主表上进行的查找,主表是线性表。先按照给定的哈希算法(比如value%100)对每一个value做哈希运算,将value映射到不同的数据段中(以模100为单位),这样每隔100个数段的区间就被一个哈希值做的索引映射到,以这种方式创建主表,同时创建一个索引表,记录每个100个数区间的索引编号、起始位置、有效数据长度。在查找数据的时候,只要以同样的哈希算法先计算哈希值,直接按该值跳到
2016-06-04 18:23:36
2175
原创 冒泡排序
冒泡排序(Bubble Sort)。 [1] C语言实现#include <stdio.h>#define SIZE 9void printArr(int arr[], int n){ int i; for (i = 0; i < n; i++) { printf("%d ", arr[i]); }}/* * 交换 */void swa
2016-06-04 14:19:49
585
原创 c语言实现回调函数
callback.c/* * @file c语言实现回调函数 * @detial 在java等更高级的语言中往往已经给我们封装好了回调函数的调用方式,直接用就可以了。而C语言中并没有这种直接可以操作的回调方式,我们用函数指针来实现回调原理。 */#include<stdio.h>// 方法指针的格式为:int (*ptr)(char *p) 即:返回值(指针名)(参数列表)typedef
2016-06-04 10:13:16
7176
原创 正态分布,Python实现
# coding=utf-8 import numpy as npfrom scipy import statsimport matplotlib.pyplot as plt n = 10p = 0.3k = np.arange(0,21)binomial = stats.binom.pmf(k, n, p)
2016-02-23 13:01:25
1705
1
原创 geohash实现(c语言)
GeoHash算法首先,你要Baidu下,找到该算法核心原理,这里摘自网络文档,简单介绍下。GeoHash算法是通过二分法,经过一定次数的无限逼近,将经纬度的二维坐标浮点值变成一个可排序、可比较的的字符串编码。在编码中的每个字符代表一个区域,并且前面的字符是后面字符的父区域,即父子字符串有相同的前缀。其算法的过程如下:地球纬度区间是[-90,90], 如某纬度是39.92324,可
2015-10-27 00:32:30
1354
原创 读写分离实践:mysql-proxy
apt-get install libevent-devftp://mirror.switch.ch/mirror/mysql/Downloads/MySQL-Proxy/mysql-proxy-0.8.4.tar.gzapt-get install lua5.1-dev
2014-11-18 19:52:20
773
原创 exif_imagetype() 函数在linux下的php中不存在
exif_imagetype() 函数在linux下的php中不存在,自己xie
2014-11-07 10:10:27
2989
Mycat-server-1.5.1-RELEASE-20160509173344-linux.tar.gz
2016-07-08
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人