自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(79)
  • 收藏
  • 关注

原创 Redis源码剖析 有序集合对象t_zset实现

有序集合对象其实跟集合对象类似,只不过它多了一个score的参数,集合中的每个元素都有一个分值,在集合中元素是按照score排序的。有序集合的底层编码也是有两种实现,压缩列表REDIS_ENCODING_ZIPLIST以及跳跃表REDIS_ENCODING_SKIPLIST。和集合的一样,有序集合的编码方式是通过检查第一个被加入的元素来决定的。ZSET结构/* RedisObject结构...

2019-03-28 16:02:39 550

原创 Redis源码剖析 集合对象t_set实现

从之前的章节“Redis源码剖析–对象Object” 可以知道,redis中的SET(集合)有两种可能的数据存储方式。分别是整数集合REDIS_ENCODING_INTSET和哈希表REDIS_ENCODING_HT。robj *setTypeCreate(sds value) { if (isSdsRepresentableAsLongLong(value,NULL) == C_O...

2019-03-27 16:58:54 494

原创 跟Gin一块搭建自己的web框架(七)

本篇介绍HTTP Basic Auth的实现以及Recovery机制。HTTP Basic AuthBasic Auth是一种开放平台认证方式,简单的说就是需要你输入用户名和密码才能继续访问。对于Basic Auth的概念不过多的进行介绍,直接进入如何实现的过程。Basic Auth说白了就是账号和密码的组合,所以定义用来存储账号和密码的结构体。type ( // BasicAuthP...

2019-03-25 16:13:55 615

原创 跟Gin一块搭建自己的web框架(六)

这一篇介绍gin中的绑定和数据验证。不管是在query中,还是在body中,如果要一个一个的去获取参数并放入对应的变量中,是一个比较繁琐的过程,gin里边提供了一个自动绑定的方法,能够将query或者body中的参数方便的放入到我们定义的struct中。同时在绑定参数的时候,我们也能够指定参数的范围或者特性,对参数进行验证。所以将绑定和参数验证放在一块讲,接下去实现一个比较简单的绑定功能...

2019-03-25 11:39:30 401

原创 跟Gin一块搭建自己的web框架(五)

继续扩展web框架的功能。context作为某个请求的上下文,必然就需要承担它最基本的功能:在各个中间件和函数之间传递变量。所以我们在context的结构体定义中加入一个Keys的字段,用来放置上下文的变量。// Context . Context struct { Req *http.Request Writer http.ResponseWriter Keys...

2019-03-22 16:20:09 284

原创 ES搜索性能优化

在项目中有用到Elastic Search来进行数据的索引和搜索工作。在一开始接手的时候,搜索接口的耗时在六七百毫秒,相对一般的接口来说是一个比较耗时的操作了。在后期的优化和学习过程中,对ES的特性和原理进行初步的了解,并对ES的搜索性能进行了优化,将搜索接口的耗时降低到了平均150ms左右,性能提高了将近5倍。虽然是个很小的改动,但效果确实显著,记录一下中间具体的过程。初始ES搜索的概...

2019-03-02 16:16:14 5021

原创 跟Gin一块搭建自己的web框架(四)

这一篇介绍Web框架中的中间件技术。先来设想一个简单的场景,在处理每一个url的时候需要打印一条日志,说明收到了来自外界的请求。 考虑上一篇的情况,需要在两个handler里边都加上一个print的代码。对于少数的几个url的处理情况还可以介绍,但是一旦url非常多的时候,这个就变成了一个非常繁重并且容易出错的工作。如果了解python,可能很容易的就想到在python中的处理方式:装饰器。...

2019-02-11 16:53:55 370 1

原创 跟Gin一块搭建自己的web框架(三)

在上一篇的基础之上继续实现前缀路由的功能。首先说明一下这边说的前缀路由的概念。在上一篇的Web服务的基础上,我们对于路由可以有两种处理方式:一种是所有的路由都挂载到根路径 ‘/’ 上边,举例说明,如果有一个登录和登出功能,我们可以这么来写router.GET("/user/login", loginHandler)router.GET("/user/logout", logoutH...

2019-02-11 14:56:03 608

原创 跟Gin一块搭建自己的web框架(二)

本文介绍Gin的路由控制。上一篇文章中直接用Golang自带的net/http实现了一个Web服务,并且具备了路由功能。但是,net/http在功能和性能上都有所欠缺。 比如从功能上来说, 现在的很多RESTful接口的定义方式中,习惯使用不同的请求方法来实现不同的语义:GET、POST、HEAD、DELETE、OPTION等等。 如何用net/http单独的对请求方法注册特定的处理函数也变成...

2019-01-29 10:13:04 788

原创 跟Gin一块搭建自己的web框架(一)

Golang提供了非常完善的net/http标准库,基于这个标准库能够很容易的就构建一个能用的web框架。现在的开源社区上有很多的go web框架,提供了丰富的选择性,从大而全的beego,到轻便的gin、echo等等。其中的gin具有和maritini类似的API,但它拥有了更好的性能,因为它采用了httprouter,使得性能提升了将近40倍。同时,在代码风格上也比较清晰简洁。我们通过分...

2019-01-17 18:20:25 3276

原创 如何处理redis集群中的hot Key

一般对于单实例的redis或者一主一备的redis来说,不需要考虑hot key的问题。但是随着业务量的上升,redis集群也自然而然的会成为一个选择。hot key的概念当使用redis集群来作为缓存的时候,如果在业务上碰到大促,或者正好有一个非常热的帖子的时候,对应的缓存会被频繁访问。而这个缓存会落在redis集群的同一台集群上,导致数据频繁的访问同一台机器,造成集群性能的不均衡。这个...

2019-01-10 18:27:17 5426 2

原创 从头实现LRU

本文设计和实现一个LRU(最近最少使用)缓存数据结构。按照LRU的概念,我们需要做到:PUT数据的时候,如果数据不存在,加入到cache中PUT数据的时候,如果超过cache大小,删除最常不用的keyGET数据的时候,如果数据存在,当前key被激活为最近刚使用的为了实现上边的操作,我们可以使用一个有序列表用来存储key和value对,刚加入或者刚刚被读取过的放在列表的头上; 当空...

2019-01-10 09:09:08 545

翻译 使用Redis的分布式锁

译自: https://redis.io/topics/distlock#the-redlock-algorithm在许多环境中,分布式锁是一种非常有用的原语,其中不同的进程必须以互斥的方式与共享资源一起运行。有许多库和博客文章描述了如何使用Redis实现DLM(分布式锁管理器),但是每个库都使用不同的方法。并且其中的许多库使用比较简单的方法,与稍微复杂的方法相比,在安全保证性上稍差一点。...

2019-01-08 09:08:58 516

原创 HBase Rowkey 设计

HBase中的rowkey唯一的决定了一行数据,使用HBase的场景多种多样, rowkey设计的好坏很大程度上决定了应用场景中的执行效率。通过具体的一个场景样例,简单的研究一下在Hbase的rowkey设计上的一些原则。样例场景假设当前有一个网上商城系统, 需要实现用户拉取历史订单的需求。当然, 在历史订单量比较少的时候,简单的使用mysql就能很好的支持需求,但是当数据量到一定量级,...

2019-01-05 16:17:40 354

原创 使用Redis SETNX 命令实现分布式锁”

title: “使用Redis SETNX 命令实现分布式锁”date: 2019-01-01T16:46:31+08:00使用Redis的 SETNX 命令可以实现分布式锁,本文介绍其实现方法。直接进入正题,现在分布式的应用场景很多,为了保持数据的一致性,经常碰到需要对资源加锁的情形。 利用redis来实现分布式锁就是其中的一种实现方案。SETNX命令简介命令格式SETNX ...

2019-01-05 16:09:42 14512 7

原创 Shell下做简单的文本去重、交集、并集

工作中经常会碰到要拉取数据情况,有了数据之后做一个简单的处理。记录一下最常用到的做去重的操作假设有文件list11122334只用一条命令就能做去重的操作cat list1 | uniq -u结果会显示一个 4当然,如果要筛选出有过重复的数字,只要修改一个参数cat list1 | uniq -d结果就是 1 2 3那么,如果想针对多个文件...

2018-11-17 15:57:22 1278

原创 Elastic Search 不停服重建索引

问题:在使用Elastic Search 过程中,可能经常会碰到需要修改 mapping的情况,如果是新增字段,还算比较简单,只需要在原来的mapping基础之上再新增字段即可。 但是如果碰到要修改原来字段的属性,就会比较棘手了, 因为ES并不支持在原来的mapping基础上修改字段的属性。 这种情况能做的选择就是重新建一份索引。那么如何重建索引呢。 最直观的就是直接从数据源从新导一份数据...

2018-11-17 15:24:42 1500 1

翻译 Kibana和Marval中的Search Rate表示什么

问题Elasticsearch提供了一个名为Marvel的便捷监控工具。 它很容易设置。 但是,当涉及到真正的监控时,您会发现仪表板中的那些指标非常混乱。 它们与发你送到群集的实际QPS不一致。 你真的不知道他们所指的是什么。解决我用Google搜索了一下。 但不幸的是没有找到答案。 我唯一得到的是Marvel论坛上的帖子,其中有人和我一样困惑。然后我试着找到Marvel的源代码。...

2018-11-15 18:50:47 6310 1

转载 Golang神奇的2006-01-02 15:04:05

原文地址: https://www.jianshu.com/p/c7f7fbb16932 热身在讲这个问题之前,先来看一道代码题:package mainimport ( "fmt" "time")func main() { timeString := time.Now().Format("2006-01-02 15:04:05") fm...

2018-09-29 17:10:24 9753

转载 Go语言 —— Go Context

原文地址: http://www.flysnow.org/2017/05/12/go-in-action-go-context.html控制并发有两种经典的方式,一种是WaitGroup,另外一种就是Context,今天我就谈谈Context。什么是WaitGroupWaitGroup以前我们在并发的时候介绍过,它是一种控制并发的方式,它的这种方式是控制多个goroutine同时完成。...

2018-09-13 18:57:23 230

转载 InnoDB: Error: Table "mysql"."innodb_table_stats" not found.

原文地址: https://blog.csdn.net/mchdba/article/details/25109427 1,Mysqldump的时候报错如下:2014-05-05 14:12:37 7f004a9a2700 InnoDB: Error: Table "mysql"."innodb_table_stats" not found.但是show tables我看这个表示存...

2018-07-27 09:46:18 1312

原创 Mysql迁移数据目录后无法启动

有时候我们需要迁移Mysql的数据存储目录, 网上有很多类似的教程,具体的不赘述。 但是我们在迁移的时候,经常会碰到迁移之后,mysql无法正常启动, 查看启动日志发现报了 “errno:13  ”的错误, 对照错误表,我们能够知道这个其实是一个权限的问题。但是就像很多教程中所写的那样,我们在迁移mysql的数据目录之后,已经执行了操作  chrown -R mysql.myql , 那么为...

2018-07-26 16:42:59 7112

转载 为什么说Redis是单线程的以及Redis为什么这么快!

一、前言近乎所有与Java相关的面试都会问到缓存的问题,基础一点的会问到什么是“二八定律”、什么是“热数据和冷数据”,复杂一点的会问到缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题,这些看似不常见的概念,都与我们的缓存服务器相关,一般常用的缓存服务器有Redis、Memcached等,而笔者目前最常用的也只有Redis这一种。如果你在以前面试的时候还没有遇到过面试官问你《为什么说R...

2018-07-18 10:20:55 148

原创 Tornado启动流程分析

我们先来看一下所有地方都会出现的Hello World的例子:import tornado.ioloopimport tornado.webclass MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world")def make_app(): retur...

2018-07-12 10:07:43 1204

原创 Python偏函数Partial function

Python的functools模块提供了很多有用的功能,其中一个就是偏函数(Partial function)先看一下偏函数的文档说明:functools.partial(func, *args, **keywords)Return a new partial object which when called will behave like func called with the posit...

2018-07-12 09:37:47 238

转载 C++中的STL中map用法详解

原文地址: https://www.cnblogs.com/fnlingnzb-learner/p/5833051.htmlMap是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红...

2018-07-09 09:49:51 112

转载 解决hash冲突的三个方法

原文地址:https://www.cnblogs.com/wuchaodzxx/p/7396599.html目录开放定址法线性探测再散列二次探测再散列伪随机探测再散列再哈希法链地址法建立公共溢出区优缺点开放散列(open hashing)/ 拉链法(针对桶链结构)封闭散列(closed hashing)/ 开放定址法通过构造性能良好的哈希函数,可以减少冲突,但一般不可能完全避免冲突,因此解决冲突是...

2018-07-06 17:15:21 1206

转载 程序的编译链接过程

原文链接: https://www.cnblogs.com/kekec/p/3238741.html还是从HelloWorld开始说吧...#include <stdio.h>int main(int argc, char* argv[]){ printf("Hello World!\n"); return 0;}从源文件Hello.cpp编译链接成Hello....

2018-06-24 15:47:23 325

原创 Python的ORM框架sqlalchemy的查询多条数据只显示一条

这个情况可能很少碰到, 但确实花了我不少时间去找这个错误,这边记录一下。在使用sqlalchemy作为ORM来拉取mysql的数据的时候,如果想要拉取所有的数据, 显而易见应该用类似下边的语句:#获取所有数据session.query(Person).all()如果要加删选条件的话,采用下边的语句:#获取所有数据session.query(Person).filter(Person.sns_i...

2018-06-19 16:59:52 5441

原创 Redis源码剖析--哈希对象t_hash实现

hash对象概述哈希对象的实现有点类似于版本3.2之前的列表对象实现,它的底层编码也有两种格式:ziplist 和 hashtable。当哈希对象可以同时满足以下两个条件时, 哈希对象使用 ziplist 编码:哈希对象保存的所有键值对的键和值的字符串长度都小于 64 字节; 哈希对象保存的键值对数量小于 512 个; 不能满足这两个条件的哈希对象需要使用 hashtable 编码...

2018-06-07 17:30:08 1714

原创 Redis源码剖析--quicklist

quicklist概述上一节中,我们有说到Redis中的列表对象在版本3.2之前,列表底层的编码是 ziplist 和 linkedlist 实现的, 但是在版本3.2之后,重新引入了一个 quicklist 的数据结构,列表的底层都由quicklist实现。在早期的设计中, 当列表对象中元素的长度比较小或者数量比较少的时候,采用ziplist来存储,当列表对象中元素的长度比较大或者数量比...

2018-06-01 10:16:47 3936 1

转载 Nginx网站使用CDN之后禁止用户真实IP访问的方法

原文地址: https://zhangge.net/5096.html做过面向公网 WEB 运维的苦逼们肯定见识过各种恶意扫描、拉取、注入等图谋不轨行为吧?对于直接对外的 WEB 服务器,我们可以直接通过 iptables 、 Nginx 的 deny 指令或者是程序来 ban 掉这些恶意请求。而对于套了一层 CDN 或代理的网站,这些方法可能就失效了。尤其是个人网站,可能就一台 VPS,然后套一...

2018-05-29 17:29:55 1677 1

原创 Redis源码剖析--列表t_list实现

Redis中的列表对象比较特殊,在版本3.2之前,列表底层的编码是 ziplist 和 linkedlist 实现的, 但是在版本3.2之后,重新引入了一个 quicklist 的数据结构,列表的底层都由quicklist实现。这边是在看源码和实际验证的时候发现的区别,然后上网查证。由于目前使用的redis基本都在3.2了, 而且老版本肯定会被取代, 所以我们只分析3.2版本之后的实现。对于老...

2018-05-29 10:17:14 1969

原创 分布式系统的CAP理论和BASE理论

现在分布式系统的应用越来越广, 这是一个很容易理解的趋势, 因为毕竟单机的性能是有限的, 在量级还不大的时候, 我们能够通过升级机器的性能来支撑服务。但是当量级到达一定的瓶颈, 单机的性能总会有撑不住的时候, 这个时候就需要使用分布式系统了。但是当引入分布式系统之后, 就必然面临一个问题, 分布式必然是一个集群,集群中的节点就需要交互, 但是网络是一个不稳定的因素, 这个时候就需要在一致性和可用性...

2018-05-25 17:01:19 2123

转载 python黑魔法---上下文管理器(contextor)

原文地址: https://www.jianshu.com/p/d53449f9e7e0所谓上下文计算机上下文(Context)对于我而言,一直是一个很抽象的名词。就像形而上一样,经常听见有人说,但是无法和现实认知世界相结合。最直观的上下文,莫过于小学的语文课,经常会问联系上下文,推测...,回答...,表明作者...。文章里的上下文比较好懂,无非就是前与后。直到了解了计算机的执行状态,程式的运行...

2018-05-25 16:32:13 294

转载 详解Python中的__init__和__new__

原文地址: https://my.oschina.net/liuyuantao/blog/747164一、__init__ 方法是什么?使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__ 方法通常用在初始化一个类实例的时候。例如:# -*- coding: utf-8 -*-class Person(object):    """Sill...

2018-05-23 10:13:03 190

原创 python分析微信好友签名分析

上一篇中我们已经得到了所有微信好友,并且分析了微信好友的地域分布。 我们同时也能得到微信好友的所有签名,对于签名我们能够通过分词,分析出使用频率比较高的词,为了直观的展现,也能够生成对应的词云; 甚至我们能够分析一下所有微信好友签名的情绪分布。当前其实有不少工具能够实现我们的目的, 在例子中, 我采用了jieba来进行分词, 用wordcloud来生成对应的词云,用snownlp来分析对应的情绪。...

2018-05-22 10:05:45 664

原创 python分析微信好友分布

既然wxpy能够获得所有微信好友的信息列表,我们可以用来分析微信好友的男女比例分布以及地区分布获得微信好友列表关于怎么登录微信 ,可以参考之前的文章, 这里之列出获取好友的代码# 获取所有好友my_friends = bot.friends()print(type(my_friends))可以看到my_friends的类型为<class 'wxpy.api.chats.chats.Cha...

2018-05-13 19:16:36 1347

原创 python实现微信机器人: AI智能回复

上一篇介绍了微信自动回复的方法, 不过只能回复预先设定的语句。 目前市面上有不少智能聊天的系统,接入这些系统就能实现一个简易的智能聊天机器人。前期准备:在网站http://www.tuling123.com/注册账号,我们能获得一个token,一个免费的token每天的调用上限大概是100次,如果仅仅是自己测试使用的话,应该是够用了。实现:在上一篇的代码基础之上, 我们修改如下:def reply...

2018-05-13 16:43:54 15053

原创 python实现微信机器人: 登录微信、消息接收、自动回复

安装wxpypip install -U wxpy登录微信# 导入模块from wxpy import *# 初始化机器人,扫码登陆bot = Bot()运行以上代码,会生成一个二维码,通过图片扫描二维码即可登录微信。如果是在服务器上运行代码,无法显示图片的时候, 可以选择通过终端显示二维码图片, 只需要将代码改成:from wxpy import *bot = Bot(console_q...

2018-05-11 12:02:51 20176 4

空空如也

空空如也

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

TA关注的人

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