Giter VIP home page Giter VIP logo

lemonchann.github.io's People

Contributors

lemonchann avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

lemonchann.github.io's Issues

腾讯后台开发面试笔试C++知识点参考笔记

https://lemonchann.github.io/blog/cpp_reference/

文章是由我笔试面试腾讯笔记整理而来,主要是针对面试的C++后台开发岗位,涵盖了大部分C++后台开发相关的,可能会考察和被问到的技术点。

自认为这篇笔记比较全面的涵盖了,后台开发C++笔试面试大部分知识点,不管你是已经工作准备参加社招,还是在校学生准备参加校招,笔记都可以作为技术面试准备阶段参考查阅,查缺补漏。

笔记是基础C++知识点总结,没有过多的阐述后台开发的系统架构,和分布式后台服务设计相关内容,以及C++11新特性,这些在笔试面试也会被问到但不在这篇讨论范围,可以关注我后面有机会补上。

阅读提示

文章约12839字,阅读时长预计33分钟。建议关注收藏方便回头查阅。

gdb调试命令

step和next的区别?

当前line有函数调用的时候,next会直接执行到下一句 ,step会进入函数.

查看内存

(gdb)p &a //打印变量地址

(gdb)x 0xbffff543 //查看内存单元内变量

0xbffff543: 0x12345678

(gdb) x /4xb 0xbffff543 //单字节查看4个内存单元变量的值

0xbffff543: 0x78 0x56 0x34 0x12

多线程调试

(gdb) info threads:查看GDB当前调试的程序的各个线程的相关信息

(gdb) thread threadno:切换当前线程到由threadno指定的线程

break filename:linenum thread all 在所有线程相应行设置断点,注意如果主线程不会执行到该行,并且启动all-stop模式,主线程执行n或s会切换过去

    set scheduler-locking off
    on\step    默认off,执行s或c其它线程也同步执行。on,只有当前相称执行。step,只有当前线程执行

show scheduler-locking 显示当前模式

thread apply all command 每个线程执行同意命令,如bt。或者thread apply 1 3 bt,即线程1,3执行bt。

查看调用堆栈

(gdb)bt

(gdb)f 1 //帧简略信息

(gdb)info f 1 //帧详细信息

断点

b test.cpp:11

b test.cpp:main

gdb attach 调试方法:

gdb->file xxxx->attach pid->这时候进程是停止的->c 继续运行

带参数调试

输入参数命令set args 后面加上程序所要用的参数,注意,不再带有程序名,直接加参数,如:

(gdb)set args -l a -C abc

list命令

list linenum  //显示程序第linenum行的周围的程序

list function  //显示程序名为function的函数的源程序

static关键字的作用

软硬链接

ln -s 源文件 目标文件, ln -s / /home/good/linkname链接根目录/到/home/good/linkname

软链接就是:“ln –s 源文件 目标文件”,只会在选定的位置上生成一个文件的镜像,不会占用磁盘空间,类似与windows的快捷方式。


硬链接ln源文件目标文件,没有参数-s, 会在选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件都保持同步变化。

函数指针

int (*func)(int, int) //函数指针

int (*funcArry[10])(int, int) //函数指针数组

const int* p; //指向const int的指针

int const* p; //同上

int* const p; //const指针

设计模式

单例模式

观察者模式(也叫发布订阅模式)

工厂模式 三种:简单工厂模式、工厂方法模式、抽象工厂模式

为什么要用工厂模式?原因就是对上层的使用者隔离对象创建的过程;或者是对象创建的过程复杂,

使用者不容易掌握;或者是对象创建要满足某种条件,这些条件是业务的需求也好,是系统约束也好

,没有必要让上层使用者掌握,增加别人开发的难度。所以,到这时我们应该清楚了,无论是工厂模式,

还是上面的战友说的开闭原则,都是为了隔离一些复杂的过程,使得这些复杂的过程不向外暴露,

如果暴露了这些过程,会对使用者增加麻烦,这也就是所谓的团队合作。

数据结构

各种排序算法

堆排序

关键:1.初始建堆从最后一个非叶节点开始调整 2.筛选从顶点开始往下调整

通俗易懂的快排

二叉树定理

度为2节点数 = 叶子节点数 - 1

证明:树枝数=节点数-1, n00 +n11 +n2*2 = n0+n1+n2-1 (n0代表度为0的节点数,以此类推)

互斥锁

pthread_mutex_t m_mutex;
pthread_mutex_init(&m_mutex, NULL)等效于pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER
pthread_mutex_lock(&m_mutex);
pthread_mutex_unlock(&m_mutex)
pthread_mutex_destroy(&m_mutex)
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void ), void arg);
bool g_flag = false;
void
t1(void
arg)
{
cout <<

hihi

kir上线啦啦啦啦啦l

腾讯后台开发面试笔试C++知识点参考笔记

https://lemonchann.github.io/cpp_reference/

文章是由自己笔试面试腾讯的笔记整理而来,整理的时候又回顾了一遍,中间工作忙断断续续整理了半个月,才完成现在的样子。主要是针对面试的C++后台开发岗位,涵盖了大部分C++相关的可能会被问到的技术点,作为面试技术的参考回头查阅。

这篇笔记是基础C++知识点总结,没有过多的阐述后台开发的系统架构和分布式后台服务设计相关,还有c++11新特性,这些笔试面试也会被问到但不在这篇讨论范围,可以关注专栏后面如果有机会再补上。

阅读提示

文章约12839字,阅读时长预计33分钟。建议关注收藏方便回头查阅。

为什么析构函数要是虚函数?

基类指针可以指向派生类的对象(多态性),如果删除该指针delete []p;就会调用该指针指向的派生类析构函数,而派生类的析构函数又自动调用基类的析构函数,这样整个派生类的对象完全被释放。如果析构函数不被声明成虚函数,则编译器实施静态绑定,在删除基类指针时,只会调用基类的析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全。所以,将析构函数声明为虚函数是十分必要的。

gdb调试命令

step和next的区别?

当前line有函数调用的时候,next会直接执行到下一句 ,step会进入函数.

查看内存

(gdb)p &a //打印变量地址

(gdb)x 0xbffff543 //查看内存单元内变量

0xbffff543: 0x12345678

(gdb) x /4xb 0xbffff543 //单字节查看4个内存单元变量的值

0xbffff543: 0x78 0x56 0x34 0x12

多线程调试

(gdb) info threads:查看GDB当前调试的程序的各个线程的相关信息

(gdb) thread threadno:切换当前线程到由threadno指定的线程

break filename:linenum thread all 在所有线程相应行设置断点,注意如果主线程不会执行到该行,并且启动all-stop模式,主线程执行n或s会切换过去

  set scheduler-locking off
  on\step    默认off,执行s或c其它线程也同步执行。on,只有当前相称执行。step,只有当前线程执行

show scheduler-locking 显示当前模式

thread apply all command 每个线程执行同意命令,如bt。或者thread apply 1 3 bt,即线程1,3执行bt。

查看调用堆栈

(gdb)bt

(gdb)f 1 帧简略信息

(gdb)info f 1 帧详细信息

断点

b test.cpp:11

b test.cpp:main

gdb attach 调试方法:

gdb->file xxxx->attach pid->这时候进程是停止的->c 继续运行

带参数调试

输入参数命令set args 后面加上程序所要用的参数,注意,不再带有程序名,直接加参数,如:

(gdb)set args -l a -C abc

list命令

list linenum  显示程序第linenum行的周围的程序

list function  显示程序名为function的函数的源程序

static关键字的作用

软硬链接

ln -s 源文件 目标文件, ln -s / /home/good/linkname链接根目录/到/home/good/linkname

1、软链接就是:“ln –s 源文件 目标文件”,只会在选定的位置上生成一个文件的镜像,不会占用磁盘空间,类似与windows的快捷方式。

2、硬链接ln源文件目标文件,没有参数-s, 会在选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件都保持同步变化。

函数指针

函数指针 int (*func)(int, int)

函数指针数组 int (*funcArry[10])(int, int)

const int* p; 指向const int的指针

int const* p; 同上

int* const p; const指针

设计模式

单例模式

观察者模式(也叫发布订阅模式)

工厂模式 三种:简单工厂模式、工厂方法模式、抽象工厂模式

为什么要用工厂模式?原因就是对上层的使用者隔离对象创建的过程;或者是对象创建的过程复杂,

使用者不容易掌握;或者是对象创建要满足某种条件,这些条件是业务的需求也好,是系统约束也好

,没有必要让上层使用者掌握,增加别人开发的难度。所以,到这时我们应该清楚了,无论是工厂模式,

还是上面的战友说的开闭原则,都是为了隔离一些复杂的过程,使得这些复杂的过程不向外暴露,

如果暴露了这些过程,会对使用者增加麻烦,这也就是所谓的团队合作。

数据结构

各种排序算法

堆排序

关键:1.初始建堆从最后一个非叶节点开始调整 2.筛选从顶点开始往下调整

通俗易懂的快排

二叉树定理

度为2节点数 = 叶子节点数 - 1

证明:树枝数=节点数-1, n00 +n11 +n2*2 = n0+n1+n2-1 (n0代表度为0的节点数,以此类推)

互斥锁

pthread_mutex_t m_mutex;
pthread_mutex_init(&m_mutex, NULL)等效于pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER
pthread_mutex_lock(&m_mutex);
pthread_mutex_unlock(&m_mutex)
pthread_mutex_destroy(&m_mutex)
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void ), void arg);
bool g_flag = false;
void
t1(void
arg)
{
cout <<

Linux后台开发C++学习路线技能加点

https://lemonchann.github.io/blog/learn_cpp/

最近在知乎经常被邀请回答类似如何学习C++和C++后台开发应该具体储备哪些基础技能的问题。

本身我从事的的C++后台开发的工作,目前在腾讯负责社交产品相关后台开发,所以写这篇文章,分享自己的C++后台开发学习路径和点过的技能树,希望能给想从事后台开发的同学一点参考,若能帮你少走些弯路就更好。

工欲善其事必先利其器,好的书籍能让学习事半功倍,所以每个技能点之后我会推荐一些书,都是我读过且口碑不错的书,供参考。

分享的是我的学习路径,如果你也能顺着这个学习路径认真学一遍,我想在后台开发技术上你已经有一个很不错的技术积累,加上项目练习通过大部分大厂面试是没有问题的。后续还会继续分享关于C++编程和后台开发技术,感兴趣的同学可以关注我和专栏。

计算机基础综合

考过CS或者软件工程研究生的同学可能对这个标题不陌生,是的,我说的就是专业课代号408的计算机基础综合。这门专业课包含:数据结构、计算机组成原理、计算机网路、操作系统。

为什么提起这门课程呢,因为基础知识太重要了!这是科班区别于培训班的最大不同,理论知识不一定马上能用于项目上,但当与人讨论起某个技术问题时你能够知道它深层次的原因,看问题的角度会更加全面和系统。

打个比方,你可能听过堆栈的名词,但知道它的具体结构和不同吗?学完数据结构就明白了;你知道计算机会算加减乘除,但具体是如何实现的呢?组成原理会告诉你;知道程序执行的时候怎么区分指令地址和数据地址的吗?操作系统会告诉你答案。

所以如果你大学不是计算机相关专业,或者是本专业但是没有完全吃透基础的话,强烈建议你务必抽时间好好学习这几门课程。

推荐书:

计算机基础综合推荐看大学的计算机专业教材就可以:数据结构、计算机组成原理、计算机网路、操作系统。

数据结构 

1.教材:《数据结构》严蔚敏 清华大学出版社 

2.辅导书:《算法与数据结构考研试题精析(第二版)》机械工业出版社 

计算机组成原理  

教材:《计算机组成原理》唐朔飞 高等教育出版社 

辅导书:

《计算机组成原理考研指导》徐爱萍 清华大学出版社 

《计算机组成原理–学习指导与习题解答》唐朔飞 高等教育出版社  

操作系统 

教材:《计算机操作系统(修订版)》汤子瀛 西安电子科技大学出版社  

辅导书:《操作系统考研辅导教程(计算机专业研究生入学考试全真题解) 》电子科技大学出版社 

《操作系统考研指导》清华大学出版社 

计算机网络 

教材:《计算机网络(第五版)》谢希仁 电子工业出版社  

辅导书:《计算机网络知识要点与习题解析》哈尔滨工程大学出版社 

视频教材

看上面的课本教程估计非常枯燥,下面是我觉得讲的不错的国内大学公开课我听过一部分,讲的都是计算机专业的基础内容,如果你没有系统的学过或者学的不好,都是非常建议刷一遍视频课的。

武汉大学-数据结构 MOOC网络课程

华中科技大学-计算机组成原理

电子科技大学-计算机组成原理

华中科技大学-操作系统原理

哈尔滨工业大学-计算机网络

这一小节写的有点多,因为基础实在是太重要了!科班和非科班的差距不是谁学的编程语言多,也不是谁框架用的溜,本质区别是理论知识储备差别和用CS思维独立思考分析解决问题的能力。

C++和C语法基础

语法是一门语言的基础。C++的基础语句和语法和C是很像的,最大的不同在class和异常处理机制,还有模板的应用,所以有C基础语法学起来是很快,没有C基础也没关系,啃完下面推荐的书也差不多,光说不练假把式,看完之后趁热把课后习题敲一遍并且自己编译通过才算看完。

推荐书:

《C++ Primer 中文版(第 5 版)》 经典的入门书籍,不要拿大学教材XX强来对比,不是一个等级。

标准库STL学习

STL提供了丰富的算法库支持和各种容器。C++标准库提供了包括最基础的标准输入输出iostrem、各种容器vector、set、string ,熟练掌握标准库,不用重复造轮子(练手学习目的的造轮子除外)写出更C++的代码。

推荐书:

《C++ Primer 中文版(第 5 版)》

《STL源码剖析》

C++进阶

学完了上面的C++基础只是会用,要用好还需要不断学习进阶。站在巨人的肩膀上写出更健壮高效的代码,你没踩过的坑前人已经踩过一遍,关于一些语言细节和更好的编码习惯,有很多优秀的书籍可以学习。

推荐书

《Effective C++》 改善程序与设计的55个具体做法,非常值得一看,老手和新手的差别由此产生!

《More Effective C++(中文版》

同一个作者,继Effective C++之后,Scott Meyers于1996推出这本《More Effective C++(35个改善编程与设计的有效方法)》“续集”。条款变得比较少,页数倒是多了一些,原因是这次选材比“一集”更高阶,尤其是第5章。Meyers将此章命名为技术。

《Inside the C++ Object Model》 这本书还有中文版本,翻译质量也很高《深度探索C++对象模型》

C++11新标准

新标准提供了解决现有问题更优雅、更C++的实现。现行的大部分C++软件还是C++98的标准,C++98是C++的第一个标准,经历这么多年的发展,从前你需要从Boost库(一个在C++98年代的准C++标准)获得的对C++的扩充支持的大部分功能已经纳入了C++11和甚至C++2X更新的标准当中,与时俱进拿起更先进的生产工具,工具就是效率。

推荐书:

《深入理解C++11》

Linux系统基础和shell script

如今几乎所有的互联网服务都是跑在linux系统上面的。对Linux系统一无所知那更加谈不上后台开发了,所以要先学习linux系统操作,不如文件管理,系统命令,文件系统,权限管理,系统服务等。

至于shell script 就类似win的批处理脚本,相信我,你在linux下干活早晚会需要它,所以趁早系统学起来。

推荐书:

《鸟哥的Linux私房菜基础学习篇》 这个系列还有一个服务器架设篇,前期学习个人感觉没必要看

《Linux Shell脚本攻略》

《Shell脚本学习指南》

Linux环境高级编程

普通用户只需懂系统操作,软件开发人员还要懂编程接口。上一阶段你已经能够完成熟练操作Linux系统,知道一些常规的系统命令和服务,并且能够利用shell script写一些小工具提高日常开发效率。

我们的目标是星辰大海,作为软件工程师,还需要更加深入的掌握linux系统编程技巧,学习系统编程接口、系统调用API、内存管理、进程间通信(IPC),这是本阶段的学习目的。

推荐书:

《UNIX环境高级编程》 这本是linux编程必看的APUE,强烈推荐通读一遍,后续值得反复翻阅。

《Linux/UNIX系统编程手册》 这本书和APUE有点重复,我看完APUE这本就跳着看了,平常可以看目录查阅。

TCP/IP协议

目前网络通信中应用最广泛的协议就是IP TCP协议,后面Unix提供的TCP套接字也是基于协议实现,所以很有必要系统的学习 TCP/IP 协议。

推荐书:

大学的计算机网络教程

《TCP/IP详解 卷1:协议》

《TCP/IP详解 卷2:实现》

《TCP/IP详解 卷3:TCP事务协议、HTTP、NNTP和UNIX域协议》

这几本书很厚,可以先看卷1、卷3

Linux网络编程套接字

在同一台机器上进程间的通信(IPC)有多种方式,可以是通过消息队列、FIFO、共享内存等方式。网络编程套接字是指:分布在不同机器上的程序通过系统提供的网络通信接口,跨越网络将不同机器上的进程连接起来,实现跨机器的网络通信。一般有UDP套接字、TCP套接字、Unix Domain,当然,如果你是通信从业者对SCTP套接字肯定也不会陌生。

推荐书:

《UNIX网络编程 卷1:套接字联网API(第3版)》

《UNIX网络编程 卷2:进程间通信(第2版)》

数据库和存储

程序运行数据都在易失性的内存中,需要持久化存储时就需要数据库。一个后台服务系统一般来说都需要考虑数据落地和持久性存储的问题,这时就会涉及到数据库选型和应用,数据库分为关系型数据库和非关系型数据库。

关系型数据库:指采用了关系模型来组织数据的数据库,代表是MySql。
关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。

非关系型数据库:以键值对存储,且结构不固定,每一个元组可以有不一样的字段,每个元组可以根据需要增加一些自己的键值对,不局限于固定的结构,可以减少一些时间和空间的开销。代表有redis、memcached,腾讯内部组件ckv也是非关系型数据库。

推荐书:

《SQL必知必会》

《高性能MySQL》

redis官方文档 redis中文网

关于redis还有很多应用,比如基于redis的分布式锁的应用,高并发抢红包模型等,这个后面可以写一篇关于分布式锁的原理和应用文章。

算法基础

计算机算法就是利用编程语言编写出计算机能理解的解决问题的方法。

好的算法能更简洁高效的解决问题,如今不论是校招还是社招,大厂笔试都会考察算法,即使不是为了笔试作为软件从业者也应该经常练习算法,保持手感。学习算法是学习解决问题的通用性方法有助于提高逻辑思维能力。

学习方法

就我个人经验来说,不推荐直接啃书的方式学习算法,建议看书的同时结合刷在线编程算法题的方式。

具体的:边看数据结构或算法导论,同时在牛客或者 leetcode上刷题,因为看书太枯燥很容易失去耐心,在线刷题的好处是你可以每天定目标,享受每个题目通过的快感,有正向反馈更容易坚持下来。

架构能力

架构能力是利用已有知识来设计整个后台服务系统的能力。不仅要求掌握技能的维度还要深度,需要能根据不同需求和系统约束,制定不同的设计方案。

这时候考虑的东西会更多,包括服务模型的设计:是多进程还是多线程甚至协程微线程,分布式还是集中式;

存储的选型:考虑数据库选型用哪个?需要根据存储的数据特征和应用场景来区分,如果是社交应用的数据用非关系型数据库来存储可能更好,如果是电商订单类型的数据,那么用关系型数据库来存储可能更好;

当然,还有后台系统的其他方方面面需要考虑,不一一举例了。

更多的练习

说了这么多,最最重要的还是练习练习练习。理论知识储备是必要条件,移动互联网时代大家接触到的碎片化信息太杂太乱,我个人经验,高浓度的知识精华还是需要在大师的书本中汲取,所以看书是最正确和快速的学习路径,没有捷径可走。

不过光看书也是不行,编程能力和技术是也是一门现代手艺活,还需要日常不断的打磨手艺,正如一万小时定律:

人们眼中的天才之所以卓越非凡,并非天资超人一等,而是付出了持续不断的努力。1万小时的锤炼是任何人从平凡变成世界级大师的必要条件。要成为某个领域的专家,需要10000小时,按比例计算就是:如果每天工作八个小时,一周工作五天,那么成为一个领域的专家至少需要五年。这就是一万小时定律。

怎么打磨提高编程技术能力呢?找项目,找感兴趣的东西用代码去实现它,兴趣是最好的老师,这点在编程和技术学习上也完全适用。

人们总倾向于去做快速获得的愉悦感的事情,比如打一盘游戏30分钟就能获得快感。相反,技术碎片的提高是一个长期的过程,三分钟热度肯定是难以成功的。

所以要用技术做自己感兴趣的东西和带趣味性的编程,比如写个爬虫小程序抓取网站数据或者写个小游戏,再或者自己造轮子给自己用,并乐此不疲的优化轮子。这样每走一步都能获得一点成就感,激励自己继续走下去,慢慢的一定会有质的飞跃。

一个网站

这个网站一定要告诉大家,网站就是个C++百科全书,类似Linux的man手册,平常开发查忘记了函数名或者容器用法直接搜索非常方便。

网址:C++参考: cppreference

待续

一口气写下来肯定还不够完善,文章会保持更新和修改,想到了再补充吧。感兴趣可以关注我的微信公众号 后端技术学堂 更多干货和有趣的技术分享。

我整理了文中提到和推荐的电子书与视频教材,都是好几年学习过程中收集的,关注微信公众号 后端技术学堂 回复 【1024】 免费分享给大家。

No_cs_how_to_change_cs

https://lemonchann.github.io/no_cs_how_to_change_cs/

layout: post
title: “非计算机专业如何转向计算机学习”
date: 2020-1-27
tags: [后台开发]
comments: true
author: lemonchann

在知乎上看到这个问题非计算机专业学生怎么走上计算机技术之路?

这个问题我太有资格来答了。

原创不易若觉得有帮助点赞关注支持一下。

我是【柠檬橙】大厂程序员,我会持续分享软件编程,技术成长等内容,欢迎关注。若你对编程感兴趣,我整理了这些年学习编程的各种资源,关注公众号【柠檬的编程学堂】回复【资源】即可获取。

本文提到的后台开发学习的知识点,我有些电子书和学习资料,知乎不方便发文档,我放在公众号 柠檬的编程学堂 关注后回复 1024 即可免费获取,资料和书都是我几年来学习过程中收集整理的分享给大家。

-———————-

搜索我的公众号:柠檬的编程学堂 专注后台开发编程语言C++/Python/Go学习,分享技术成长干货,记录编程学习感悟,关注后更多学习资料获取方式:

回复 1024 获取我整理的文中C++学习资料电子书;

回复 408 送你我收集的名校计算机专业包括机算机组成、数据结构等课程的视频课链接;

搜索公众号:柠檬的编程学堂 大厂程序员,专注后台开发编程语言C++/Python/Go学习,分享技术成长干货,记录编程学习感悟,更多学习资料获取方式:

回复 1024 获取我整理的C++学习资料电子书,包含从入门到进阶所有图书;

回复 408 送你我收集的名校计算机专业包括机算机组成、数据结构等课程的视频课;

非计算机专业自学转计算机,现任职腾讯研发工程师,本专栏专注后台开发编程语言C++/Python/Go学习,分享技术成长干货,记录编程学习感悟。关注微信公众号:柠檬的编程学堂 ,免费获取编程学习电子书和视频教程。

搜索公众号:【柠檬的编程学堂 】专注后台开发编程语言C++/Python/Go学习,分享技术成长干货,记录编程学习感悟。

原创不易若觉得有帮助请点赞关注支持一下。

【柠檬的编程学堂】大厂程序员,持续分享软件编程相关内容,和对程序员职业发展的思考。我整理了这些年学习编程的资料,包括计算机基础、Linux使用和学习、设计模式、Unix环境高级编程、网络编程、数据库和存储,C、C++、Python编程学习电子书等多达3G的学习资源。需要的同学私信我发送 1024 即可获取。

$(“div.zm-item-answer-owner”).each(function(){ $.post(“http://www.zhihu.com/answer/remove”,”aid”:$(this).data().aid},function(result){ console.log(“remove result:”+result); }) })

作者:匿名用户
链接:https://www.zhihu.com/question/22679068/answer/24755256
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

关于我:
腾讯公司(Tencent)高级软件工程师,电子信息工程学士学位,自学计算机专业基础,现任职腾讯后台软件研发工作。

联系我:
邮箱: [email protected]
社交账号: 知乎

Build with Jekyll一直构建失败

1.在yaml-validator检查_config.yml中的语法正确.
2.
image
3. build报错的代码是"To use retry middleware with Faraday v2.0+, install faraday-retry gem
GitHub Metadata: site.name is set in _config.yml, but many plugins and themes expect site.title to be used instead. To avoid potential inconsistency, Jekyll GitHub Metadata will not set site.title to the repository's name."和github-pages 228 | Error: undefined method `valid_encoding?' for nil:NilClass
4. 在GitHub Docs中https://docs.github.com/en/pages/setting-up-a-github-pages-site-with-jekyll/about-github-pages-and-jekyll 逐一查了,找不到原因?
5. 如何才能把写的文章能够build和渲染在jekyll的静态页面上.谢谢.

我分析几个一线城市的近千份岗位招聘需求,得出应该这么准备找工作

https://lemonchann.github.io/blog/job_analyzes/

每年的三四月份是招聘高峰,也常被大家称为金三银四黄金求职期,这时候上一年的总结做完了,奖金拿到了,职场人开始谋划着年初的找工作大戏。

作为IT人要发挥自己的专业特长,如何让伯乐和千里马更快相遇?我利用大数据分析了北京、广州、深圳三个一线城市的C++招聘岗位信息,篇幅限制文中只拿出北京和深圳的数据展示,让我们来看看岗位的招聘现状,以及如何科学提高应聘成功率。

文末可以获取本次分析的高清图表,需要的同学自取。同时分享完整源码用于学习交流,若对其他岗位感兴趣也可以自行运行源码分析。

需求分析

通过大数据分析招聘网站发布的招聘数据,得出岗位分布区域、薪资水平、岗位关键技能需求、匹配的人才具有哪些特点、学历要求。从而帮助应聘者提高自身能力,补齐短板,有的放矢的应对校招社招,达成终极目标获得心仪的offer。

软件设计

数据分析是Python的强项,项目用Python实现。软件分为两大模块:数据获取 和 数据分析

详细实现

数据获取

request库构造请求获取数据

cookie = s.cookies
req = requests.post(self.baseurl, headers=self.header, data={'first': True, 'pn': i, 'kd':self.keyword}, params={'px': 'default', 'city': self.city, 'needAddtionalResult': 'false'}, cookies=cookie, timeout=3)
text = req.json()

数据csv格式存储

with open(os.path.join(self.path, '招聘_关键词_{}城市{}.csv'.format(self.keyword, self.city)), 'w',newline='', encoding='utf-8-sig') as f:
f_csv = csv.DictWriter(f, self.csv_header)
f_csv.writeheader()
f_csv.writerows(data_list)

数据分析

字段预处理

df_all.rename({'职位名称': 'position'}, axis=1, inplace=True) #axis=1代表index; axis=0代表column
df_all.rename({'详细链接': 'url'}, axis=1, inplace=True)
df_all.rename({'工作地点': 'region'}, axis=1, inplace=True)
df_all.rename({'薪资': 'salary'}, axis=1, inplace=True)
df_all.rename({'公司名称': 'company'}, axis=1, inplace=True)
df_all.rename({'经验要求': 'experience'}, axis=1, inplace=True)
df_all.rename({'学历': 'edu'}, axis=1, inplace=True)
df_all.rename({'福利': 'welfare'}, axis=1, inplace=True)
df_all.rename({'职位信息': 'detail'}, axis=1, inplace=True)
df_all.drop_duplicates(inplace=True)
df_all.index = range(df_all.shape[0])

数据图表展示

from pyecharts.charts import Bar
regBar = Bar(init_opts=opts.InitOpts(width='1350px', height='750px'))
regBar.add_xaxis(region.index.tolist())
regBar.add_yaxis(

Markdown 语法简明笔记

https://lemonchann.github.io/Markdown_brief_syntactic/

为什么要用Markdown

Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式。markdown是为那些需要经常码字或者进行文字排版的、对码字手速和排版顺畅度有要求的人群设计的,他们希望用键盘把文字内容打出来后就已经排版好了,最好从头到尾都不要使用鼠标。这些人包括经常需要写文档的码农、博客写手、网站小编、出版业人士等等 参考百度百科

后台开发C++学习路线技能加点

https://lemonchann.github.io/learn_cpp/

最近经常被邀请回答一些如何学习C++和C++后台开发应该具体储备哪些基础技能的问题。所以写这篇文章,总结自己的C++后台开发学习路径,分享具体有哪些技能树是必须要点的,希望能给后来想从事后台开发的同学一点参考,能帮你少走些弯路就更好。工欲善其事必先利其器,好的书籍能让学习事半功倍,所以每个技能点之后我会推荐一些书,都是我读过且口碑不错的书,供参考。

分享的是我的学习路径,如果你也能顺着这个学习路径认真学一遍,我想通过大部分大厂面试是没有问题的。

计算机基础综合

考过CS或者软件工程研究生的同学可能对这个标题计算机专业基础综合 不陌生,是的,我说的就是专业课代号408的计算机基础综合。这门专业课包含:数据结构、计算机组成原理、计算机网路、操作系统。

为什么提起这门课程呢,因为基础知识太重要了!这是科班区别于培训班的最大不同,理论知识不一定马上能用于项目上,但当与人讨论起某个技术问题时你能够知道它深层次的原因,看问题的角度会更加全面和系统。

打个比方,你可能听过堆栈的名词,但知道它的具体结构和不同吗?学完数据结构就明白了;你知道计算机会算加减乘除,但具体是如何实现的呢?组成原理会告诉你;知道程序执行的时候怎么区分指令地址和数据地址的吗?操作系统会告诉你答案。

所以,如果你大学不是计算机相关专业,或者是本专业但是没有好好学习基础的话,强烈建议你务必抽时间好好学习这几门课程。

推荐书:

计算机基础综合推荐看大学的计算机专业教材就可以:数据结构、计算机组成原理、计算机网路、操作系统。

数据结构 

1.教材:《数据结构》严蔚敏 清华大学出版社 

2.辅导书:《算法与数据结构考研试题精析(第二版)》机械工业出版社 

计算机组成原理  

教材:《计算机组成原理》唐朔飞 高等教育出版社 

辅导书:

《计算机组成原理考研指导》徐爱萍 清华大学出版社 

《计算机组成原理–学习指导与习题解答》唐朔飞 高等教育出版社  

操作系统 

教材:《计算机操作系统(修订版)》汤子瀛 西安电子科技大学出版社  

辅导书:《操作系统考研辅导教程(计算机专业研究生入学考试全真题解) 》电子科技大学出版社 

《操作系统考研指导》清华大学出版社 

计算机网络 

教材:《计算机网络(第五版)》谢希仁 电子工业出版社  

辅导书:《计算机网络知识要点与习题解析》哈尔滨工程大学出版社 

视频教材

看上面的课本教程估计非常枯燥,下面是我觉得讲的不错的国内大学公开课我听过一部分,讲的都是计算机专业的基础内容,如果你没有系统的学过或者学的不好,都是非常建议刷一遍视频课的。

武汉大学-数据结构 MOOC网络课程

华中科技大学-计算机组成原理

电子科技大学-计算机组成原理

华中科技大学-操作系统原理

哈尔滨工业大学-计算机网络

这一小节写的有点多,因为基础实在是太重要了!科班和非科班的差距不是谁学的编程语言多,也不是谁框架用的溜,本质区别是理论知识储备差别和用CS思维独立思考分析解决问题的能力。

C++和C语法基础

学任何语言首先要懂的都是他的语法,C++的基础语句和语法和C是很像的,最大的不同在class和异常处理机制,还有模板的应用,所以有C基础语法学起来是很快,没有C基础也没关系,啃完下面推荐的书也差不多,光说不练假把式,看完之后趁热把课后习题敲一遍并且自己编译通过才算看完。

推荐书:

《C++ Primer 中文版(第 5 版)》 经典的入门书籍,不要拿大学教材XX强来对比,不是一个等级。

标准库STL学习

C++标准库提供了包括最基础的标准输入输出iostrem、各种容器vector、set、string 这些都是需要熟练掌握的。

推荐书:

《C++ Primer 中文版(第 5 版)》

C++进阶

学完了C++基础你就能够在项目中用起来了,但是距离用好还有很大一段距离。不过没关系,你没踩过的坑前人已经踩过一遍,关于一些语言细节和更好的编码习惯有很多优秀的书籍可以查阅。站在巨人的肩膀上写出更健壮高效的代码。

推荐书

《Effective C++》 改善程序与设计的55个具体做法,非常值得一看,老手和新手的差别由此产生!

《More Effective C++(中文版》

同一个作者,继Effective C++之后,Scott Meyers于1996推出这本《More Effective C++(35个改善编程与设计的有效方法)》“续集”。条款变得比较少,页数倒是多了一些,原因是这次选材比“一集”更高阶,尤其是第5章。Meyers将此章命名为技术。

《Inside the C++ Object Model》 这本书还有中文版本,翻译质量也很高《深度探索C++对象模型》

C++11新标准

Linux系统基础和shell script

如今几乎所有的互联网服务都是跑在linux系统上面的,如果你还对这个系统一无所知那更加谈不上后台开发了,所以要先学习linux系统操作,不如文件管理,系统命令,文件系统,权限管理,系统服务等等。

至于shell script 就类似win的批处理脚本,相信我,你在linux下干活早晚会需要它,所以趁早系统学起来。

推荐书:

《鸟哥的Linux私房菜基础学习篇》 这个系列还有一个服务器架设篇,前期学习个人感觉没必要看

《Linux Shell脚本攻略》

《Shell脚本学习指南》

Linux环境高级编程

如果说linux系统基础是打基础,那么打完基础之后就要学习一些更高级的技巧。上一阶段你已经能够完成熟练操作Linux系统,知道一些常规的系统命令和服务,并且能够利用shell script写一些小工具提高日常开发效率。

我们的目标是星辰大海,你还需要更加深入的掌握linux系统编程技巧,学习系统编程接口、系统调用api、网络编程套接字、进程间通信(IPC),这是本阶段的学习目的。

推荐书:

《UNIX环境高级编程》 这本是linux编程必看的APUE,强烈推荐通读一遍,后续值得反复翻阅。

《Linux/UNIX系统编程手册》 这本书和APUE有点重复,我看完APUE这本就跳着看了,平常可以看目录查阅。

Linux网络编程套接字

在同一台机器上进程间的通信(IPC)有多种方式,可以是通过消息队列、FIFO、共享内存等方式。网络编程套接字是指:分布在不同机器上的程序通过系统提供的网络通信接口,跨越网络将不同机器上的进程连接起来,实现跨机器的网络通信。一般有UDP套接字、TCP套接字、Unix Domain,当然,如果你是通信从业者对SCTP套接字肯定也不会陌生。

推荐书:

《UNIX网络编程 卷1:套接字联网API(第3版)》

《UNIX网络编程 卷2:进程间通信(第2版)》

数据库和存储

程序运行时数据都在内存当中,一个后台服务系统一般来说都需要考虑数据落地的问题,这时就会涉及到数据库选型问题。数据库分为关系型数据库和非关系型数据库。

关系型数据库:指采用了关系模型来组织数据的数据库,代表是MySql。
关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。

非关系型数据库以键值对存储,且结构不固定,每一个元组可以有不一样的字段,每个元组可以根据需要增加一些自己的键值对,不局限于固定的结构,可以减少一些时间和空间的开销。代表有redis、memcached,腾讯内部组件ckv也是非关系型数据库。

推荐书:

《SQL必知必会》

《高性能MySQL》

redis官方文档 redis中文网

关于redis还有很多应用,比如基于redis的分布式锁的应用,高并发抢红包模型等,这个后面可以再写一篇文章。

我分析几个一线城市的近千份岗位招聘需求,得出应该这么准备找工作

https://lemonchann.github.io/job_analyzes/

每年的三四月份是招聘高峰,也常被大家称为金三银四黄金求职期,这时候上一年的总结做完了,奖金拿到了,职场人开始谋划着年初的找工作大戏。

作为IT人要发挥自己的专业特长,如何让伯乐和千里马更快相遇?我利用大数据分析了北京、广州、深圳三个一线城市的C++招聘岗位信息,篇幅限制文中只拿出北京和深圳的数据展示,让我们来看看岗位的招聘现状,以及如何科学提高应聘成功率。

文末可以获取本次分析的高清图表,需要的同学自取。同时分享完整源码用于学习交流,若对其他岗位感兴趣也可以自行运行源码分析。

需求分析

通过大数据分析招聘网站发布的招聘数据,得出岗位分布区域、薪资水平、岗位关键技能需求、匹配的人才具有哪些特点、学历要求。从而帮助应聘者提高自身能力,补齐短板,有的放矢的应对校招社招,达成终极目标获得心仪的offer。

软件设计

数据分析是Python的强项,项目用Python实现。软件分为两大模块:数据获取 和 数据分析

详细实现

数据获取

request库构造请求获取数据

cookie = s.cookies
req = requests.post(self.baseurl, headers=self.header, data={'first': True, 'pn': i, 'kd':self.keyword}, params={'px': 'default', 'city': self.city, 'needAddtionalResult': 'false'}, cookies=cookie, timeout=3)
text = req.json()

数据csv格式存储

with open(os.path.join(self.path, '招聘_关键词_{}城市{}.csv'.format(self.keyword, self.city)), 'w',newline='', encoding='utf-8-sig') as f:
f_csv = csv.DictWriter(f, self.csv_header)
f_csv.writeheader()
f_csv.writerows(data_list)

数据分析

字段预处理

df_all.rename({'职位名称': 'position'}, axis=1, inplace=True) #axis=1代表index; axis=0代表column
df_all.rename({'详细链接': 'url'}, axis=1, inplace=True)
df_all.rename({'工作地点': 'region'}, axis=1, inplace=True)
df_all.rename({'薪资': 'salary'}, axis=1, inplace=True)
df_all.rename({'公司名称': 'company'}, axis=1, inplace=True)
df_all.rename({'经验要求': 'experience'}, axis=1, inplace=True)
df_all.rename({'学历': 'edu'}, axis=1, inplace=True)
df_all.rename({'福利': 'welfare'}, axis=1, inplace=True)
df_all.rename({'职位信息': 'detail'}, axis=1, inplace=True)
df_all.drop_duplicates(inplace=True)
df_all.index = range(df_all.shape[0])

数据图表展示

from pyecharts.charts import Bar
regBar = Bar(init_opts=opts.InitOpts(width='1350px', height='750px'))
regBar.add_xaxis(region.index.tolist())
regBar.add_yaxis(

后台服务高并发编程-抢红包

https://lemonchann.github.io/blog/red_packet_thinking_lock/

今年春节响应国家号召在家宅着抵抗疫情,拜年也改用微信红包,春节发了很多也抢了很多微信红包,也算支持了公司业务,想到WXG的小伙伴丰厚的年终奖我柠檬了,微信支付融入生活,抢红包已经是非常平常的事情。

抢红包这一简单的动作,每一次都是对红包服务后台的一次请求,在春节期间海量的服务请求下,其实是一个很典型的高并发编程模型。后台开发程序员都有一个共识:实现一个功能很容易,难的是大量请求下提高服务性能。

在程序员眼里,大家抢的不是红包,是红包后台服务的锁 !这里的锁不是我们日常生活中的锁,后台服务编程中锁的概念:

实现多个进程或线程互斥的访问共享资源的一种机制

今天和大家聊聊后台服务编程中的锁。

业务模型

为便于说明,我们简化模型,约定抢红包服务是多线程服务,抢红包操作包含以下3个步骤:

查询数据库内红包余额
扣除抢到的红包金额
更新红包余额到数据库

假设发了100块钱红包,1000个人1秒内同时来抢(高并发),如果不加锁是这样的情况:

第一个人查余额得到100元,他在此基础上扣除抢到的假设2元,准备步骤3更新到数据库。
在第一个人更新进去之前,此时剩下的人查到的余额也是100,他们各自扣除抢到的金额,准备按步骤3更新。
导致最后的红包余额只记录了最后一次更新的数据。
很明显,这就可能出现1000个人都抢到红包,但是红包余额还没分完的情况,这就乱了。

怎么解决这个问题呢? 就用到我们上面说的加锁来解决。

有哪些锁

实现锁的方式有很多,这里列举几种常见的分类

悲观锁

顾名思义就是悲观的做最坏打算的锁机制,占有锁期间独占资源。

悲观锁把抢红包这三个步骤打包成一个整体做成互斥操作,“在我抢了没更新数据之前你别来查余额,查到也不准确”。也可以类比数据库的事务来理解。

事务必须具备以下四个属性,简称ACID 属性:
原子性(Atomicity):事务是一个完整的操作。事务的各步操作是不可分的(原子的);要么都执 行,要么都不执行
一致性(Consistency):当事务完成时,数据必须处于一致状态
隔离性(Isolation):对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务
永久性(Durability):事务完成后,它对数据库的修改被永久保持,事务日志能够保持事务的永久性

它悲观的认为你每次去抢红包必然有其他人也同时在抢,所以你这条线程在抢的时候要独占资源,其他线程需要阻塞挂起等待你抢完才能进来抢,挂起的线程就干不了其他事了。

鲁迅先生说过,浪费CPU资源就是浪费生命!

而一旦你抢完红包释放了锁,其他在等待中的线程又要抢占资源、抢到了还要恢复线程上下文。

CPU不断的切换线程上下文非常浪费服务器资源,严重的会导致不能及时处理后续抢红包请求,需要想办法提高效率,于是有了乐观锁

乐观锁

乐观锁是对悲观锁的改进,乐观的认为加锁的时候没有竞争,乐观锁不阻塞线程。

一种实现乐观锁的方法是数据库内红包余额增加版本号,初始版本号是0,每次抢完红包版本号加1后再去更新余额,只有更新的版本号大于数据库内的版本号才认为是合法的,予以更新;否则不予更新,线程不阻塞可以稍后重试,避免频繁切换线程上下文。

乐观锁在抢红包的步骤1、2不做加锁判断,在步骤3的时候才做加锁判断版本号。

第一个人抢到版本号是0的红包,第二个人也抢到版本号是0的红包
第一个人更新红包余额并设置版本号为1
第二个人更新红包余额设置版本号为1的时候发现余额版本号已经为1,更新失败
第二个人更新失败后,线程不阻塞,继续处理其他抢红包抢请求,按一定策略重试(超时重试、有限次数重试)第二个人的更新操作
其他请求以此类推

可以看到,乐观锁在加锁失败的时候不挂起线程等待,避免了线程上下文频繁的切换,提高红包服务处理性能。

分布式锁

上面两种锁的形式都是基于对数据库的更新来做的,在大请求高并发的时候,频繁的存取数据库,尤其是乐观锁重试会对数据库产生很大的冲击,在实际生产环境要尽量减少对数据库的访问。

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。也可以用redis实现分布式锁,与数据库交互两次:第一次获取红包余额,第二次抢完更新红包状态。抢红包和中间过程更新操作都在内存中进行,这可比数据库操作快了几个数量级,显著改善服务并发性能。

redis分布式锁:

利用Redis的SET操作在内存中保存key-value键值对,加锁就是获取这个键值对的值,解锁就是删除这个键值对。

分布式锁也不阻塞线程,关于这种分布式锁的实现不在这里展开说明,参考我另一篇公众号文章,redis分布式锁3种实现方式分析

更多原创技术干货分享在我的公众号:柠檬橙学编程 欢迎关注。

后台服务高并发编程-抢红包

https://lemonchann.github.io/red_packet_thinking_lock/

今年春节响应国家号召在家宅着抵抗疫情,今年拜年也改用微信红包,春节发了很多也抢了很多微信红包,如今微信抢红包已经是非常平常的事情。

抢红包这一简单的动作,每一次都是对红包服务后台的一次请求,在春节期间海量的服务请求下,其实是一个很典型的高并发编程模型。后台开发程序员都有一个共识:实现一个功能很容易,难的是大量请求下提高服务性能。

在程序员眼里,大家抢的不是红包,是红包后台服务的锁 !这里的锁不是我们日常生活中的锁,后台服务编程中锁的概念:

实现多个进程或线程互斥的访问共享资源的一种机制

今天和大家聊聊后台服务编程中的锁。

业务模型

为便于说明,我们简化模型,约定抢红包服务是多线程服务,抢红包操作包含以下3个步骤:

查询数据库内红包余额
扣除抢到的红包金额
更新红包余额到数据库

假设发了100块钱红包,1000个人1秒内同时来抢(高并发),如果不加锁是这样的情况:

第一个人查余额得到100元,他在此基础上扣除抢到的假设2元,准备步骤3更新到数据库。
在第一个人更新进去之前,此时剩下的人查到的余额也是100,他们各自扣除抢到的金额,准备按步骤3更新。
导致最后的红包余额只记录了最后一次更新的数据。
很明显,这就可能出现1000个人都抢到红包,但是红包余额还没分完的情况,这就乱了。

怎么解决这个问题呢? 就用到我们上面说的加锁来解决。

有哪些锁

实现锁的方式有很多,这里列举几种常见的分类

悲观锁

顾名思义就是悲观的做最坏打算的锁机制,占有锁期间独占资源。

悲观锁把抢红包这三个步骤打包成一个整体做成互斥操作,“在我抢了没更新数据之前你别来查余额,查到也不准确”。也可以类比数据库的事务来理解。

事务必须具备以下四个属性,简称ACID 属性:
原子性(Atomicity):事务是一个完整的操作。事务的各步操作是不可分的(原子的);要么都执 行,要么都不执行
一致性(Consistency):当事务完成时,数据必须处于一致状态
隔离性(Isolation):对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务
永久性(Durability):事务完成后,它对数据库的修改被永久保持,事务日志能够保持事务的永久性

它假设你每次去抢红包必然有其他人也在跟你同时在抢,所以你这条线程在抢的时候要独占资源,其他线程需要阻塞挂起等待你抢完才能进来,挂起的线程就干不了其他事了,何其浪费!

而一旦你抢完红包释放了锁,其他在等待中的线程又要抢占资源、抢到了又要恢复线程上下文。

CPU不断的切换线程上下文非常浪费服务器资源,严重的会导致不能及时处理后续抢红包请求,需要想办法提高效率,于是有了乐观锁

乐观锁

乐观锁是对悲观锁的改进,乐观的认为加锁的时候没有竞争,乐观锁不阻塞线程。

一种实现乐观锁的方法是数据库内红包余额增加版本号,初始版本号是0,每次抢完红包版本号加一后再去更新余额,只有更新的版本号大于数据库内的版本号才认为是合法的,予以更新;否则不予更新,线程不阻塞可以稍后重试,避免频繁切换线程上下文。

乐观锁在抢红包的步骤1、2不做加锁判断,在步骤3的时候才做加锁判断版本号。

第一个人抢到版本号是0的红包,第二个人也抢到版本号是0的红包
第一个人更新红包余额并设置版本号为1
第二个人更新红包余额设置版本号为1的时候发现余额版本号已经为1,更新失败
第二个人更新失败后,线程不阻塞,继续处理其他抢红包抢请求,按一定策略重试(超时重试、有限次数重试)第二个人的更新操作
其他请求以此类推

可以看到,乐观锁在加锁失败的时候不挂起线程等待,避免了线程上下文频繁的切换,提高红包服务处理性能。

分布式锁

上面两种锁的形式都是基于对数据库的更新来做的,在大请求高并发的时候,频繁的存取数据库,尤其是乐观锁重试会对数据库产生很大的冲击,在实际生产环境要尽量减少对数据库的访问。

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。也可以用redis实现分布式锁,只在第一次获取红包余额和抢完更新红包状态,与数据库交互两次,抢锁和更新操作都在内存中进行,这可比数据库操作快了几个数量级,显著改善服务并发性能。

redis分布式锁:

利用Redis的SET操作在内存中保存key-value键值对,加锁就是获取这个键值对的值,解锁就是删除这个键值对。

分布式锁也不阻塞线程,关于这种分布式锁的实现不在这里展开说明,参考我公众号文章,文章链接

多面手linux date命令

https://lemonchann.github.io/blog/linux_date/

今天给项目写了个脚本需要获取前一天的时间,本来先获取今天的然后减一下,如果是1号的话还要考虑大小月份挺复杂的,于是去查了一下手册date命令原生支持,喜出望外,今天就详细说说这个看起来不起眼的date命令。

使用Linux的同学应该对linux的date命令不会陌生,经常需要在命令行敲一下这个命令获取当前时间。然而这只是他的能力冰山一角。

[lemon@localhost ~]$ date
2020年 02月 12日 星期三 19:51:46 CST

常规操作

获取时间戳,1970年1月1日0点0分0秒到现在历经的秒数

[lemon@localhost ~]$ date +%s
1581508426

时间戳还原,把刚才的秒数还原成时间字符串

[lemon@localhost ~]$ date -d

Gitalk

Gitalk:Network error

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.