自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(37)
  • 问答 (1)
  • 收藏
  • 关注

原创 手把手教你用go语言实现跳跃表

前言有序集合在生活中较常见,如根据成绩对学生进行排名、根据得分对游戏玩家进行排名等。对于有序集合的底层实现,我们可以使用数组、链表、平衡树等结构。数组不便于元素的插入和删除;链表的查询效率低,需要遍历所有元素;平衡树或者红黑树等结构虽然效率高但实现复杂。Redis采用了一种新型的数据结构——跳跃表。跳跃表的效率堪比红黑树,然而其实现却远比红黑树简单。1、redis有序集合介绍skiplist 编码的有序集合对象使用 zet 结构作为底层实现,一个 zset 结构同时包含一个字典和一个跳跃表:type

2021-04-09 17:54:36 1814 4

原创 财富自由之python爬取天天基金排行数据,保存xls文件,慢慢分析

1、前言闲来无聊,最近迷恋上玩基金,真的是又菜瘾有大,刚好有朋友是做数据分析相关的,他想用excel分析基金历史数据,于是乎,让我去爬取天天基金上的排行数据。2、xls文件结果展示爬取了全部、股票型、混合型、债券型、指数型,5种类型排行,excel保存结果如下:3、源码话不多说,源码如下:from selenium.webdriver.chrome.options import Optionsfrom selenium import webdriverfrom selenium.webdr

2020-12-28 12:51:41 2389 20

原创 redis6.0 多线程简介

1、简单介绍redis 的瓶颈并不在 CPU,而在内存和网络。Redis 6 中的多线程 主要在处理 网络 I/O 方面,对网络事件进行监听,分发给 work thread 进行处理,处理完以后将主动权交还给 主线程,进行 执行操作,当然后续还会有,执行后依然交由 work thread 进行响应数据的 socket write 操作。2、单线程网络处理模型当监听到某一时刻,端口接收到数据时,根据事件模型,进行不同的处理。对于所有的客户端的请求,根据就绪队列的顺序,进行串行化处理,处理完fd1,再处

2020-11-21 17:52:51 517

原创 redis中epoll模型-IO多路复用详情解析

阅读完redis中的网络模型源码,该文章会基于源码是如何去实现的角度,去介绍epoll模型、事件处理。以及基于此,自己实现的多人聊天终端系统,并附带源码。1、epoll模型介绍epoll 是Linux内核为处理大量并发网络连接而提出的解决方案,能显著提升系统CPU利用率。epoll使用非常简单,总共只有3个API :epoll_create函数创建一个epoll专用的文件描述符,用于后续epoll相关API调用;epoll_ctl函数向epoll注册、修改或删除需要监控的事件;epoll_wai

2020-11-15 21:49:31 432

原创 redis源码阅读笔记-集群

1、clusterProcessPacket函数解析(先对MEET、PING、PONG这几个回复处理做分析)

2020-09-24 23:18:01 196

原创 MIT 6.824 lab2笔记

分布式系统构建

2022-08-03 08:14:28 867 1

原创 浅谈一下raft一致性协议

raft一致性协议介绍

2022-06-18 16:08:04 336

原创 C++提高编程

C++提高编程本阶段主要针对C++泛型编程和STL技术做详细讲解,探讨C++更深层的使用1 模板1.1 模板的概念模板就是建立通用的模具,大大提高复用性例如生活中的模板一寸照片模板:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WXKCCg00-1646030437967)(assets/1547105026929.png)]PPT模板:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S37n8LUn-16460304379

2022-02-28 14:41:00 185

原创 C++核心编程手册

C++核心编程本阶段主要针对C++面向对象编程技术做详细讲解,探讨C++中的核心和精髓。1 内存分区模型C++程序在执行时,将内存大方向划分为4个区域代码区:存放函数体的二进制代码,由操作系统进行管理的全局区:存放全局变量和静态变量以及常量栈区:由编译器自动分配释放, 存放函数的参数值,局部变量等堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收内存四区意义:不同区域存放的数据,赋予不同的生命周期, 给我们更大的灵活编程1.1 程序运行前​ 在程序编译后,生成了ex

2022-02-28 08:21:14 1133

原创 观察者模式实现简单事件总线

使用 Golang 实现 EventBus支持以下功能的事件总线异步不阻塞支持任意参数值package mainimport ( "fmt" "reflect" "sync" "time")// Bus Bustype Bus interface { Subscribe(topic string, handler interface{}) error Publish(topic string, args ...interface{})}// AsyncEventBu

2021-04-06 15:36:59 218 1

原创 一个工作两年正准备离职人的心声 - (一、实习篇)

  我是2019届6月份毕业的,在这之前,秋招的时候,拿到了成都**公司的offer,原本电话沟通的是2019年3月份去实习的,原以为可以享受剩余两个月的校园欢乐时光,突然收到了项目组leader的微信通知,告知我最好早点去实习,于是约定了时间12月17日,前往公司实习,这个时间点正是六级考试的下个周一。  大概是12月初的样子吧,还有另外2个伙伴是一起实习的,于是我们仨约定成都公司附件碰面,把租房的事情落实下来,那是一家很小的房间,厕所浴室共用,大概就20平米的样子,里面有2张床,每张床都是上下铺的那种

2021-03-30 16:00:04 216

原创 用最简单的linux命令学习测试redis请求协议

redis请求协议,支持两种类型:PROTO_REQ_INLINE(内联型)、PROTO_REQ_MULTIBULK(批量回复协议型)。redis服务器通信中,用的都是协议型请求类型,同时也支持内联型请求类型(没有严格的协议封装,支持简单的请求方式接入)。1、批量回复协议型(支持批量命令)请求格式:*<参数数量> \r\n$<参数 1 的字节数量> \r\n<参数 1 的数据> \r\n...$<参数 N 的字节数量> \r\n<参数 N

2021-02-28 20:22:14 219

转载 DNS介绍

在前文了解了IP是用于识别某个网络区域的主机,那么平时我们在访问网站的时候一般都不会输入IP进行访问。例如,你访问百度,一般都输入:www.baidu.com ,那么你总不会输入类似 124.23.1.12 这样的IP进行访问吧 设身处地想一下,若你想让用户记住你的网站,你总不能让他记一大串数字吧,更何况,以后用到IPv6,需要记忆的数字更多,所以最好的做法就是给这些IP一个名称,我们称之为域名,而当我们访问这些域名的时候,具体访问哪个IP这件事就要交给DNS去做了,本文也将详细介绍一下DNS的具体作用.

2021-01-05 11:34:18 134

原创 数组/链表排序

1、堆排序#include <stdio.h>void swap(int *p,int *q){ int temp; temp = *p; *p = *q; *q = temp;}void sort(int a[],int index ,int end){ int dad = index; int son = dad*2+1; while(son<=end){ if(son+1<=end an

2020-12-18 16:36:13 174 2

原创 多线程打印出ABCABCABC...

1、编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。/* mutex.c */#include <stdlib.h>#include <stdio.h>#include <pthread.h>#include <errno.h>/* 全局变量 */int gnum = 0;/* 互斥量 */pthread_mutex_t

2020-12-15 09:06:39 351 1

原创 go语言context机制总结

1、实现context接口的几大对象emptyCtx是实现了Context接口所有方法(方法返回值都为空)的一个对象,创建方法为Background(),通常用来作为根节点,其他ctx对象直接继承它继承emptyCtx的valueCtx对象,可以使用的接口方法为Value(),返回key对应的value值,其他方法返回为空,没意义继承emptyCtx的cancelCtx对象,可以使用的接口方法为Done()、Error(),该对象还实现了canceler接口,可以主动取消继承cancelCtx的t

2020-12-06 17:18:39 202

原创 超级实用的go语言学习教程

哈哈哈,转发于此

2020-11-27 12:48:28 145

原创 libevent使用教程

本文转载于此1、简介基本的socket变成是阻塞/同步的,每个操作除非已经完成,出错,或者超时才会返回,这样对于每一个请求,要使用一个线程或者单独的进程去处理,系统资源没有办法支撑大量的请求。posix定义了可以使用异步的select系统调用,但是因为它采用了轮询的方式来判断某个fd是否变成active,效率不高。于是各系统就分别提出了基于异步的系统调用,例如Linux的epoll,由于在内核层面做了支持,所以可以用O(1)的效率查找到active的fd。基本上,libevent就是对这些高效IO的封装

2020-11-19 20:12:44 4780 1

原创 redis数据结构-动态字符串

1、内存对齐1.1 对齐原因CPU和总线是64位的,所以CPU每次可以从内存里面拿出8个字节,而这8个字节是对齐的,也就是说只能是0-7,8-15, 16-23这样的,不能从中间拿。这个时候你要读一个double,如果double的地址可以被8整除,那你就只需要跟内存要一次数据。如果不能整除,那你就得跟内存要2次数据。1.2 对齐规则结构体变量的起始地址能够被其最宽的成员大小整除结构体每个成员相对于起始地址的偏移能够被其自身大小整除,如果不能则在前一个成员后面补充字节结构体总体大小能够被最宽的

2020-11-07 11:26:51 90

原创 redis数据结构-字典

1、字典数据结构1.1 哈希表数据结构typedef struct dictht { //哈希表 dictEntry **table; //存放一个数组的地址,数组存放着哈希表节点dictEntry的地址。 unsigned long size; //哈希表table的大小 unsigned long sizemask; //用于将哈希值映射到table的位置索引。它的值总是等于(size-1)。 unsigned long used; //记录哈希表已有的节点(键值对

2020-11-05 21:19:43 178

原创 innodb存储引擎常见参数总结

1、参数可以以show variables like形式去查看一、innodb_version innodb 版本号innodb_read_io_threads/innodb_write_io_threads 读写IO线程数innodb_purge_threads purge线程数innodb_buffer_pool_size 缓冲池内存大小innodb_buffer_pool_instances 缓冲池实例个数innodb_old_blocks_pct LRU的midpoint位置,ol

2020-10-31 10:27:16 335

原创 innodb存储引擎体系架构

1、innodb体系架构innodb存储引擎有很多个内存块,可以认为这些内存块组成一个大的内存池包含很多个后台线程,主要为Master Thread、IO Thread、Purge Thread、Page Cleaner Thread1.1 后台线程主要工作内容:刷新内存池中的数据,保证缓冲池中缓存的数据最新将已修改数据文件刷新到磁盘文件保证数据库异常时InnoDB能恢复到正常运行状态Master Thread: 主要负责合并插入缓冲、将日志缓冲刷新到磁盘、UNDO页的回收I

2020-10-28 20:46:49 202

原创 带你玩转pandas和numpy

1. 初始化import pandas as pddata = pd.DataFrame({"name":["lx","cl","zgq"],"age":[18,20,21],"id":[2122,2133,2144]})data2. 基本属性data.columns #查看列名data.index #查看行索引data.dtypes #查看各列数据类型data.shape #查看维度data[data.columns[1:]] #获取第1~n列数据data.i

2020-10-26 21:15:11 124

转载 mysql索引

Mysql索引 索引介绍 索引是什么 官方介绍索引是帮助MySQL高效获取数据的数据结构。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。 一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往是存储在磁盘上的文件中的(可能存储在单独的索引文件中...

2020-10-26 09:15:51 69

原创 innodb锁问题

1、锁类型innodb存储引擎实现了如下两种标准的行级锁:共享锁(S LocK):允许事务读一行数据排他锁(X Lock) : 允许事务删除或更新一行数据如果一个事务T1获得了行r的共享锁,那么另外的事务T2可以立即获得行r的共享锁,因为锁读取并没有改变行r的数据。但如果T3想获取r的排他锁,则必须等待事务T1、T2释放行r上的共享锁2、加锁语句select … for update,对读取的行记录加一个X锁select … lock in share mode,对读取的行记录加一个

2020-10-18 10:48:29 78

原创 gevent、asyncio协程操作

网络单请求处理:coConsume = coroutine.create( function (filter, producer) while true do local stutas, msg = coroutine.resume(filter, producer) print('receive msg : ', msg) end end)coFilter = coroutine.create( function (producer) while true do

2020-09-28 10:45:06 168

转载 redis集群搭建介绍

本文转载自:https://blog.csdn.net/men_wen/article/details/72853078 1. Redis Cluster介绍Redis Cluster是Redis的分布式解决方案,在Redis 3.0版本正式推出的,有效解决了Redis分布式方面的需求。当遇到单机内存、并发、流量等瓶颈时,可以采用Cluster架构达到负载均衡的目的。1.1.

2020-09-17 22:49:20 88

原创 redis集群中的纪元(epoch)

该文章转载来源: https://zhuanlan.zhihu.com/p/44658603纪元(epoch)Redis Cluster 使用了类似于 Raft 算法 term(任期)的概念称为 epoch(纪元),用来给事件增加版本号。Redis 集群中的纪元主要是两种:currentEpoch 和 configEpoch。1、currentEpoch这是一个集群状态相关的概念,可以当做记录集群状态变更的递增版本号。每个集群节点,都会通过 server.cluster->currentE.

2020-09-13 10:54:27 627

原创 mysql安装、启动、卸载

1、安装mysqlsudo apt-get install mysql-server //服务端sudo apt-get install mysql-client //客户端sudo apt-get install libmysqlclient-dev //程序编译时链接的库检查安装是否成功,mysql启动端口3306处于监听状态sudo netstat -tap | grep mysql登录mysql -u root -p #或者mysql

2020-09-07 12:48:05 233

原创 财富自由之大乐透/双色球彩票随机生成

import sysimport random# argv[1]: 1:double 2:big# argv[2]: how muchdef main(argv): ttype = int(argv[1]) - 1 nums = int(argv[2]) listlucky = [[6,1,33,16],[5,2,35,12]] for i in range(nums): numlist = [[],[]] for j in range(2):

2020-09-03 20:32:45 387

原创 CRC16算法构建

1、redis字节表生成 #include <stdio.h>#include <stdint.h> int main() { uint32_t num = 1L << 16 | 1L << 12 | 1L << 5 | 1; // 生成式h(x) printf("%x\n", num); uint8_t c = 0; // 一个字节值得所有情况 uint8_t tc = 0; // c得副本 ui

2020-08-19 18:23:21 166

原创 tcp/ip协议与socket介绍

1、tcp/ip四层协议模型2、curl 命令当用户执行curl命令时,执行了建立连接->发送数据->关闭连接这几个过程。2.1 应用层用户运行执行curl命令2.2 传输控制层,建立连接主要有TCP和UDP协议TCP协议:面向连接的可靠传输协议。利用TCP进行通信时,首先要通过三步握手,以建立通信双方的连接。TCP提供了数据的确认和数据重传的机制,保证发送的数据一定能到达通信的对方。UDP协议:是无连接的,不可靠的传输协议。采用UDP进行通信时不用建立连接,可以直接向一个I

2020-07-29 22:21:13 2553

原创 redis源码阅读笔记-哨兵原理

哨兵小知识Sentinel哨兵是redis官方提供的高可用方案,可以用它来监控多个Redis服务实例的运行情况。Redis Sentinel是一个运行在特殊模式下的Redis服务器。Redis Sentinel是在多个Sentinel进程环境下互相协作工作的。Sentinel系统有三个主要任务:监控:Sentinel不断的检查主服务和从服务器是否按照预期正常工作。提醒:被监控的Redis出现问题时,Sentinel会通知管理员或其他应用程序。自动故障转移:监控的主Redis不能正常工作,S

2020-07-23 21:52:08 125

转载 哨兵机制-配置文件sentinel.conf详细说明

# Example sentinel.conf # 哨兵sentinel实例运行的端口 默认26379port 26379 # 哨兵sentinel的工作目录dir /tmp # 哨兵sentinel监控的redis主节点的 ip port # master-name 可以自己命名的主节点名字 只能由字母A-z、数字0-9 、这三个字符".-_"组成。# quorum 当这些quorum个数sentinel哨兵认为master主节点失联 那么这时 客观上认为主节点失联了# senti

2020-07-20 08:41:14 1061 1

原创 redis源码阅读笔记-主从复制

1、从节点B-client 终端发起slaveof 192.168.1.1 6379命令2、节点B-server对slaveof命令响应操作,对节点B进行初始化设置,清空所有之前可能已主从复制占用的空间。slaveofCommand。节点B的状态就以下三种情况讨论:状态1:B节点是个单机节点,未与其他节点建立主从关系状态2:B节点已建立/正在建立主从关系,B是主节点状态3:B节点已建立/正在建立主从关系,B是从节点replicationSetMaster,初始化B-server节点。设置

2020-07-08 19:30:19 294

原创 set命令之redis内部存储方式

1、set key value xx/px time/time_ms (生存时间) t_string中: 上述参数都是robj对象,在这层之上把数据存在内存上 执行上述命令,无非是将这key_obj、value_obj、expire_obj三个对象信息存储在内存当中 (value_obj存储在哈希节点v->val中,指向值对象,expire_obj存储在v->u64,指向整型值) (1)对value_obj进行最优的编码(tryObjectEncoding)...

2020-05-19 22:21:57 305

原创 基于django实现微信发、收信息

网页版微信,无非是扫取微信二维码,授权登录后,可以从服务端获取到个人微信相关的所有信息,包含好友列表,公众号等等,根据这些即可实现好友一对一的数据发送。微信的登录、个人信息的获取、消息的发、收都是基于http请求实现的。一、获取微信扫描二维码 网页上的二维码,无疑就是一个<img>标签,只要获取到属性“src”地址即可。 一般的二维码请求地址为ht...

2019-07-08 13:12:46 845

空空如也

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

TA关注的人

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