自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

【码农在新加坡】的专栏

同名wx公众号:【码农在新加坡】,欢迎关注。

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

原创 Redis为什么这么快 - 秒杀面试官系列

Redis作为非关系型内存数据库,只要是一个互联网公司都会使用到。Redis相关的问题可以说是面试必问的。而作为一个程序员,尤其是一个后端程序员,如果你会Redis,毫不夸张地说,面试通过率可以增加50%。

2023-01-04 22:04:13 245

原创 后端面试之系统设计 - 用户密码如何储存在DB里

现在很多网站都因为爆库导致密码泄漏,要设计怎么样的密码储存机制,才能保证最大限度的不被盗取,即使数据泄漏,黑客也无法在短时间内获取对应的密码来登录用户的账号,而造成损失。这篇博客就来讲解密码储存的过程。

2022-12-25 22:17:18 677

原创 使用go语言开发自动化脚本 - 一键定场、抢购、预约、捡漏

不知道大家有没有这种经历,想要抢课,定场,发现抢不到,想要捡漏,又要随时刷,今天我就来讲一下我是怎么使用Go语言开发自动化脚本来解决定场,抢购,预约的难题。

2022-12-20 02:08:44 3355 1

原创 后端面试之系统设计-短网址(Short URL)服务怎么设计?

短网址生成算法数据库怎么设计怎么重定向高并发情况下的高可用数据量过大怎么处理【码农在新加坡】,有更多好的技术分享。【码农在新加坡】,欢迎关注。后端面试之系统设计-短网址(ShortURL)服务怎么设计?httpshttpshttpshttpshttps。.........

2022-07-18 23:35:02 2283

原创 一文看懂Redis 6.0多线程IO

使用I/O线程实现网络I/O多线程化,I/O线程只负责网络I/O和命令解析,不执行具体的命令。Redis的多线程网络模型实际上并不是一个标准的模型,Redis的多线程方案中,I/O线程任务仅仅是通过socket读取客户端请求命令并解析,却没有真正去执行命令。所有客户端命令最后还需要回到主线程去执行,因此对多核的利用率并不算高,而且每次主线程都必须在分配完任务之后忙轮询等待所有I/O线程完成任务之后才能继续执行其他逻辑。Redis目前的多线程方案更像是一个折中的选择。...

2022-07-16 22:31:49 1416

原创 一文看懂Go语言协程的设计与原理

本文只是从历史和宏观角度解释了Goroutine的设计原理,当然具体的代码实现远比这个复杂。后续会继续更新Go语言协程的源码到底是怎么实现的。

2022-07-16 03:12:56 1202

原创 Golang append是并发安全的吗

Golangappend并不是并发安全的,我相信使用过Golang的同学大部分都是知道的,但是他有概率会导致服务crash,这才是更大的风险。【码农在新加坡】,有更多好的技术分享。Golangappend是并发安全的吗httpshttps。...

2022-07-14 22:59:03 1275

原创 5分钟搞懂布隆过滤器,掌握亿级数据过滤算法

原文地址:码农在新加坡的个人博客本质上(Bloom Filter)是一种数据结构,比较巧妙的(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你 。相比于传统的 List、Set、Map 等数据结构,它更高效、占用空间更少,但是缺点是其返回的结果是概率性的,而不是确切的。可以一句话总结:然后你可能要问了,他都不一定存在了,那它有什么用。它虽然不保证100%存在,但是这个却是可以控制的,一般根据场景你可以设置一个可以接受的错误率,比如 0.0001(万分之一)

2022-07-13 20:46:17 2020

原创 后端面试之Linux-cp和mv命令的区别

首发于微信公众号:【码农在新加坡】,欢迎关注。背景如果你突然被面试官问:cp和mv这两个linux的命令有什么区别?你会不会一脸懵逼,cp不就是复制,mv不就是移动吗,还能有什么区别?如果你也是这么想,那么这篇文章适合你。inode了解文件操作命令例如cp、mv、rm的底层原理时,需要先了解 linux 中文件系统的基本原理。在linux系统中,文件系统对文件的存储和访问是通过一种被称为inode即i节点的机制来实现的。为什么需要inode呢?文件数据存储在硬盘上,硬盘的最小存储单位叫做"

2022-01-09 21:17:16 2336 2

原创 后端面试之MySQL-InnoDB一颗B+树可以存放多少行数据?

首发于微信公众号:【码农在新加坡】,欢迎关注。背景MySQL的InnoDB引擎一棵B+树可以存放多少行数据?这是一个很有趣的面试题。也许你会猜1千万,2千万,或者上亿条数据?当你看完这篇文章,你就心中有数了。最重要的是,这篇文章能让你更深入的理解InnoDB的B+树索引的方方面面。看完这篇文章,你可以同时回答以下几个关于InnoDB B+树的面试题:MySQL InnoDB一颗B+树能存多少数据?MySQL InnoDB的B+树每个非叶子结点能有多少分支?MySQL InnoDB为什么使

2022-01-08 14:54:20 2310 1

原创 游戏服务器和普通服务器的区别

背景我做过六年游戏服务端开发,后来想换个方向,转做电商后端开发,做了两年之后感悟很多,也体会到了游戏服务器和普通的服务器的区别。我所说的游戏是大众的游戏,它要有常见游戏的一些元素,比如交互,比如场景,比如对战。举几个例子:魔兽世界,梦幻西游,王者荣耀。当然也有很多游戏是弱交互的游戏,其实这类游戏跟普通的服务器的区别会小一点。其实游戏说到底,最重要的几点就是保持状态、低延迟、交互。这几点就让游戏服务器和普通的服务器(比如电商后端)区分开来了。互联网和游戏后端开发的区别游戏特有的保持连接游戏一般

2021-12-30 15:37:14 2788

原创 分布式ID生成方案-snowflake算法

背景在互联网的业务系统中,涉及到各种各样的ID,这些ID需要保证全局唯一。我们称之为分布式ID,分布式ID需要满足 唯一性、趋势递增性、高可用性、高性能等特点。snowflake算法,也叫雪花算法,是其中的一种分布式ID生成方案。是twitter公司内部分布式项目采用的ID生成算法,开源后广受国内大厂的好评,在该算法影响下各大公司相继开发出各具特色的分布式生成器。讲解雪花算法前,我们先概述一下分布式ID有哪些生成方案。分布式ID生成方案分布式ID有以下几种生成方式:UUID算法的核心思想是结合

2021-12-30 15:26:35 3356

原创 LRU缓存机制,你想知道的这里都有

概述LRU是Least Recently Used的缩写,译为最近最少使用。它的理论基础为 “最近使用的数据会在未来一段时期内仍然被使用,已经很久没有使用的数据大概率在未来很长一段时间仍然不会被使用” 由于该思想非常契合业务场景 ,并且可以解决很多实际开发中的问题,所以我们经常通过LRU的思想来作缓存,一般也将其称为LRU缓存机制。原理实现LRU时,我们需要关注它的读性能和写性能,理想的LRU应该可以在O(1)的时间内读取一条数据或更新一条数据,也就是说读写的时间复杂度都是O(1)。此时很容易想到使

2021-12-27 12:55:59 1312 1

原创 Golang函数式选项(Functional Options)模式

概览最近阅读源码的时候看到一段不错的代码,但是当时却不是非常理解为什么这么写。我们先来看一下源代码:type User struct { ID string Name string Age int Email string Phone string Gender string}type Option func(*User)func WithAge(age int) Option { return func(u *User) { u.Age = age

2021-12-23 18:33:01 859

原创 TiDB write conflict问题排查

背景我们线上使用TiDB来储存数据,最近DBA报告TiDB发生了write conflict.[2020/08/25 06:01:44.781 +08:00] [WARN] [session.go:623] [retrying] [conn=26799778] [schemaVersion=194] [retryCnt=0] [queryNum=0] [sql="UPDATE user_tab SET `region` = ?, `status` = ?, `update_time` = ? WHERE

2020-09-09 20:53:05 2615

原创 Linux后台开发应该具备技能(二)

上一篇由于篇幅太大,编辑不方便。现补充一篇。后续会统一整理。上一篇地址:https://blog.csdn.net/majianfei1023/article/details/45337085一、Linux系统1、slab算法底层实现原理理解:Linux的伙伴算法把所有的空闲页框分组为11个块链表,每个块链表分别包含大小为1,2,4,8,16,32,64,128,256,51...

2019-06-21 16:39:35 1001 2

原创 查找c++进程cpu占满的原因

最近运行服务器程序,在特定触发条件下,发现某个进程CPU占用率超过100%,心里一惊,因为服务器用c++写的,就决定调试下。 先按网上说的使用pstack指令打印cpu占满的进程的堆栈信息. 其中 pstack是基于gdb封装的shell脚本,有兴趣的可以去看一下。pstack pid 发现正常的进程的堆栈显示比较正常,异常的进程的堆栈闲显示就全是??。 这个方法行不通,就换gdb...

2018-03-23 09:57:39 6696

原创 from module import 和 import module 的区别

python有两种导入模块的方法。1.import a2.from a import b两者用处基本一致,但是有些细微但重要的区别.从最外层分析import aa必须是模块(.py文件级别及以上)可以使用多层. 比如 import a.b.c.d 但是d必须是模块,前面是路径结构的模块(带__init__.py才算是模块)from a i

2017-06-07 17:17:15 1142

原创 使用python通过protobuf实现rpc

网上有很多教程,基本都是c++的,很多还解释的不够清楚,新手没办法通过文章自己实现一个完整的rpc,而且很少有python的完整教程,所以我从头用一个完整的echo server demo来讲解protobuf rpc的基本原理。protobuf rpc echo demo 源码:github:不了解protobuf怎么安装及protobuf的基础语法,可以网上查看教程。我

2017-05-11 15:50:28 6887

原创 服务器定时器的管理优化

作为一个游戏服务器,必然有很多定时器的使用,算是游戏服务器开发的基础模块,我们经常需要在我们预期的某个时间点执行某项特定的操作。比如每天M点开启某个活动,N小时后之后刷新排行榜等等。这些功能通常需要定时器控制,之前我们的服务器代码中(我们使用的是MobileServer引擎)每加一个延迟执行的功能就启动一个定时器,这样到最后往往代码特别臃肿,而且定时器时稀缺资源,过多的定时器必然导致效率问题,于是

2016-10-09 17:55:06 2341

原创 C++ placement new操作符

在处理内存分配的时候,C++程序员会用new操作符(operator new)来分配内存,并用delete操作符(operator delete)来释放内存。虽然这种写法在大多数时候都工作得很好,但还是有些情况下使用new是很烦人的,比如当你想在预分配的内存上构造一个对象的时候。如果你想在预分配的内存上创建对象,用缺省的new操作符是行不通的。要解决这个问题,你可以用placeme

2016-06-02 21:57:12 1324

原创 TCP_NODELAY和Nagle算法

一、概述在网络拥塞控制领域,有一个非常有名的算法叫做Nagle算法(Nagle algorithm),这是使用它的发明人John Nagle的名字来命名的,John Nagle在1984年首次用这个算法来尝试解决福特汽车公司的网络拥塞问题(RFC 896)。该问题的具体描述是:如果我们的应用程序一次产生1个字节的数据,而这个1个字节数据又以网络数据包的形式发送到远端服务器,那么就很容易导致

2016-06-01 21:08:46 2888

原创 进程间通信 和 线程间同步

以前经常搞混,所以记录下来。进程间通信主要是指多个进程间的数据交互。而线程间同步主要指维护多个线程之间数据准确、一致性。一、进程间通信主要有以下几种方式:管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。有名管道(named pipe):有名管道也是半双工的通信方式,但是...

2016-05-31 23:47:05 2966 1

原创 进程间传递文件描述符--sendmsg,recvmsg

UNIX域套接字可以在同一台主机上各进程之间传递文件描述符。下面先来看两个函数:#include #include ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags); ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);

2016-05-19 16:31:37 7331 6

原创 Python:告别if...else...做真正面向对象的编程

最近在给服务器做一套指令系统,大家都知道一个服务器的指令有很多,像(加金币,加道具,加经验...)代码就像这样:cmd = REQUEST.get("cmd", "")if cmd == "add_gold": passelif cmd == "add_item": passelif cmd == "add_exp": pass ... ...else: s

2016-05-15 16:18:55 8425 1

原创 linux网络编程--eventfd

eventfd 在内核版本,2.6.22以后有效。查看内核版本可以用命令 uname -r。eventfd类似于管道的概念,可以实现线程间的事件通知,类似于pipe。而eventfd 是一个比 pipe 更高效的线程间事件通知机制,一方面它比 pipe 少用一个 file descriper,节省了资源;另一方面,eventfd 的缓冲区管理也简单得多,全部“buffer”一共只有8字

2016-04-20 14:22:08 3928

原创 linux网络编程--keepalive

我们说到keepalive的时候,需要先明确一点,这个keepalive说的是tcp的还是http的。一、tcp keepalivetcp的keepalive是侧重在保持客户端和服务端的连接,一方会不定期发送心跳包给另一方,当一方断掉的时候,没有断掉的定时发送几次心跳包,如果间隔发送几次,对方都返回的是RST,而不是ACK,那么就释放当前链接。设想一下,如果tcp层没有

2016-04-05 19:47:42 1606

原创 Python 换行符转换

因为工作需求,需要把目录下的所有换行符转换为windows换行符'\r\n',文件太多,只好写一个简单的python脚本转换。import osimport os.pathrootdir = r'D:/src'def replace(filename): try: oldfile = open(rootdir+'/'+filename, 'rb+') newfile = op

2015-12-25 11:26:55 6591

原创 C++ for_each学习笔记

一、学习完iterator之后,遍历容器我们会写出这样的代码:#include #include using namespace std;int main() { int ia[] = {1, 2, 3}; vector ivec(ia, ia + sizeof(ia) / sizeof(int)); for(vector::const_iterator iter = ive

2015-11-23 21:42:54 1669

原创 Python读取配置文件

一、argparseargparse,是Python标准库中推荐使用的编写命令行程序的工具。也可以用于读取配置文件。1.conf配置文件:{ "game0": { "ip":"127.0.0.1", "port":27182, "type":1 }, "game1": { "ip":"127.0.0.1", "port":27183, "type

2015-11-20 23:58:13 18315

原创 Python模拟登陆(使用requests库)

之前使用 Python自带urllib2库做了一个简单的模拟登陆 人人网 的功能。发现很多网站都比人人网的登陆流程复杂的多,需要好好抓包研究每一步请求过程及需要的Cookie,urllib2的cookie处理器就有点相形见绌了。很多都需要自己实现。而由于urllib2本身的使用起来不方便,所以改用第三方库requests库,这个库也是使用很广泛的一个Python库。当然了,每个

2015-11-19 15:14:48 15218

原创 Python模拟登陆(urllib2)

最近需要做个自动化工具,需要自动登录某个网站然后自动进行某些操作,免除人工一个一个操作的烦恼。第一步就是要登录网站,而目前主流网站的登陆过程大同小异。于是乎,我就拿了人人网(www.renren.com)来试手。至于为什么用它,因为很多网站的登陆过程太复杂了,它稍微简单点。主要用python实现了对网站的模拟登录。需要自己构造数据接口,这就需要抓包看登陆的时候到底发了什么数据。fi

2015-11-17 16:19:34 6124

原创 linux(Centos)下编译安装gcc4.8.2

最近要用到c++ 11,所以没办法只得把那台centos6.6的gcc4.4.7升级一下。gcc编译器已经出到5.1了,但是我对最新的版本并没有特别大的兴趣,更喜欢稳定性的版本。gcc4.8.1 是第一个完全支持C++11 的编译器,我这边装的是4.8.2.一、获取gcc4.8.2包并解压缩:下载链接:http://gcc.skazkaforyou.com/releas

2015-07-09 12:58:48 16021

原创 boost.python编译及示例

linux编译boost的链接:http://blog.csdn.net/majianfei1023/article/details/46761029昨天编译安装好boost,今天准备使用boost.python写个python调用c++代码的例子,结果踩了很多坑。首先贴上代码:1.student.cpp,一个普通的c++类#include #include using

2015-07-07 00:45:40 16876 1

原创 boost.asio学习笔记一、linux下boost库的安装

学习开源库第一步就是编译安装好库,然后运行成功一个demo,然后才能进行之后的工作。下面就来讲讲boost库在linux下的安装。[mjf@localhost ~]$ tar -zxvf boost_1_55_0.tar.gz[mjf@localhost boost_1_55_0]$ ./bootstrap.sh --prefix=/home/mjf/lib[mjf@loc

2015-07-05 06:11:43 16685 1

翻译 boost::asio中文文档

Christopher KohlhoffCopyright © 2003-2012 Christopher M. Kohlhoff以Boost1.0的软件授权进行发布(见附带的LICENSE_1_0.txt文件或从http://www.boost.org/LICENSE_1_0.txt)Boost.Asio是用于网络和低层IO编程的跨平台C++库,为开发者提供了C++环境下

2015-07-04 12:16:42 14378

原创 手游服务器开发技术详解

从事游戏服务器开发差不多两年时间,两年间参与了不少项目,学到了很多游戏服务器开发技术,参与过几个不同架构的服务器开发,就随便聊聊游戏服务器开发需要的技术。(以下所指游戏服务器更偏向于手游,因为我对端游和页游开发接触并不多)一.聊聊服务器开发有哪些东西要考虑。1.开发语言的选择:工欲善其事,必先利其器,选择一门适合的开发语法对后期开发有着事半功倍的作用。业界主要的是c/c......

2015-07-01 22:42:37 36353 11

原创 二级指针的作用详解

一、概念在如下的A指向B、B指向C的指向关系中:首先C是"一段内容",比如你用malloc或者new分配了一块内存,然后塞进去"一段内容",那就是C了。C的起始地址是0x00000008。B是一个指针变量,其中存放着C的地址,但是B也要占空间的啊,所以B也有地址,B的起始地址是0x00000004,但是B内存中存放的是C的地址,所以B里面的内容就是0x00000008。那么到此.....................

2015-06-25 00:37:47 109894 45

原创 libevent学习笔记 一、基础知识

1.   Libevent是什么?Libevent是一个轻量级的开源的高性能的网络库,被众多的开源项目使用,例如大名鼎鼎的memcached等。具有如下的显著的特点:事件驱动,轻量级(和ACE相比的话),跨平台,支持多路的IO复用技术,支持定时器、信号等事件。2.   Libevent功能Libevent提供了事件通知,io缓存事件,定时器,超时,异步解析dns,事件驱动的ht

2015-06-14 16:27:11 48968 1

原创 网络编程学习笔记--1.socket可读可写条件

欢迎转载,转载请注明原文地址:http://blog.csdn.net/majianfei1023/article/details/45788591socket可读可写条件,经常做为面试题被问,因为它考察被面试者对网络编程的基础了解的是不是够深入。要了解socket可读可写条件,我们先了解几个概念:1.接收缓存区低水位标记(用于读)和发送缓存区低水位标记(用于写):...

2015-06-12 20:51:34 10092 4

空空如也

空空如也

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

TA关注的人

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