mirror of
https://github.com/kaka111222333/kaka111222333.github.io.git
synced 2025-12-19 00:04:46 +08:00
update blog
This commit is contained in:
@@ -11,7 +11,35 @@ author: lemonchann
|
||||
|
||||
<!-- more -->
|
||||
|
||||
抛砖引玉,今天就来说说其中一个技术细节,也是在我另一篇文章[Linux后台开发C++学习路线技能加点](https://zhuanlan.zhihu.com/p/102048769)中提到但没展开讲的,高并发服务编程中的**redis分布式锁**。
|
||||
## 什么是锁
|
||||
|
||||
后台开发中锁的概念是「实现多个进程或线程互斥的访问共享资源的一种机制」,这里的计算机术语我举个栗子你就能理解:
|
||||
|
||||
> 小王家只有卧室一台电视机。小王他爸喜欢看篮球NBA,小王他妈喜欢追综艺,如果小王他爸妈一起抢着看就会打架谁都看不好,这就是「死锁」。
|
||||
>
|
||||
> 怎么办?小王他爸每次进入房间看电视第一件事就是把房门锁上,同样的小王他妈每次进房间看综艺第一件事也是把房门锁上,这就是「加锁」。
|
||||
|
||||
|
||||
|
||||
在计算机中公共资源可以是一块公共的内存,或者是一个公共的文件,对于这类共享资源的访问都是需要「加锁」保证各个进程或线程的资源访问互相不干扰。
|
||||
|
||||
|
||||
|
||||
## 什么是分布式锁
|
||||
|
||||
分布式锁是在分布式系统中提出的概念,所谓分布式是指由很多功能对等的节点,提供相同的服务,各个节点如果需要访问「共享资源」,为了保证数据一致性也需要「加锁」,这个锁可以放在「公共存储数据库」,访问共享资源之前先去公共存储数据库拿锁,拿到锁才能访问共享资源。
|
||||
|
||||
还是拿上面的小王来举例子:
|
||||
|
||||
> 现在小王的村里只有一个电视(小王村真穷),现在这个电视不是属于小王家,整个村的人都看这一个电视,并且要求一家在看的时候其他家不能看(这是看的啥电视),以前小王家的锁不能锁村里的电视,那怎么办呢?
|
||||
>
|
||||
> 村里每个家庭就是一个「分布式节点」,一个解决方案是把电视放在村长家「公共存储数据库」,各家轮流去村长家看电视,并且在进去看的时候让村长关门「加锁」,这就是分布式锁。
|
||||
|
||||
|
||||
|
||||
## 分布式锁实现
|
||||
|
||||
今天就来说说其中一个技术细节,也是在我另一篇文章[Linux后台开发C++学习路线技能加点](https://zhuanlan.zhihu.com/p/102048769)中提到但没展开讲的,高并发服务编程中的**redis分布式锁**。
|
||||
|
||||
这里罗列出**3种redis实现的分布式锁**,并分别对比说明各自特点。
|
||||
|
||||
|
||||
@@ -256,7 +256,5 @@ author: lemonchann
|
||||
|
||||
一口气写下来肯定还不够完善,文章会保持更新和修改,想到了再补充吧。感兴趣可以关注我的微信公众号 **柠檬橙学编程** 更多干货和有趣的技术分享。
|
||||
|
||||
**我整理了文中提到和推荐的电子书与视频教材**,都是好几年学习过程中收集的,关注微信公众号 **柠檬橙学编程** 回复 **1024** 免费分享给大家。
|
||||
|
||||

|
||||
**我整理了文中提到和推荐的电子书与视频教材**,都是好几年学习过程中收集的,关注微信公众号 **柠檬橙学编程** 回复 【**1024**】 免费分享给大家。
|
||||
|
||||
|
||||
210
_posts/2020-2-12-linux_date.md
Normal file
210
_posts/2020-2-12-linux_date.md
Normal file
@@ -0,0 +1,210 @@
|
||||
---
|
||||
layout: post
|
||||
title: "多面手linux date命令"
|
||||
date: 2020-1-27
|
||||
tags: [后台开发]
|
||||
comments: true
|
||||
author: lemonchann
|
||||
---
|
||||
|
||||
今天给项目写了个脚本需要获取前一天的时间,本来先获取今天的然后减一下,如果是1号的话还要考虑大小月份挺复杂的,于是去查了一下手册`date`命令原生支持,喜出望外,今天就详细说说这个看起来不起眼的`date`命令。
|
||||
|
||||
使用Linux的同学应该对linux的`date`命令不会陌生,经常需要在命令行敲一下这个命令获取当前时间。然而这只是他的能力冰山一角。
|
||||
|
||||
```bash
|
||||
[llchan@localhost ~]$ date
|
||||
2020年 02月 12日 星期三 19:51:46 CST
|
||||
```
|
||||
|
||||
|
||||
|
||||
## 常规操作
|
||||
|
||||
#### 获取时间戳,1970年1月1日0点0分0秒到现在历经的秒数
|
||||
|
||||
```bash
|
||||
[llchan@localhost ~]$ date +%s
|
||||
1581508426
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 时间戳还原,把刚才的秒数还原成时间字符串
|
||||
|
||||
```bash
|
||||
[llchan@localhost ~]$ date -d "@1581508426"
|
||||
2020年 02月 12日 星期三 19:53:46 CST
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 指定的时间字符串转换成时间戳
|
||||
|
||||
```bash
|
||||
[llchan@localhost ~]$ date -d '02/22/2222 07:21:22' +%s
|
||||
7956832882
|
||||
#或者
|
||||
[llchan@localhost ~]$ date -d '2222-02-22 07:21:22' +"%s"
|
||||
7956832882
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 格式化输出时间格式
|
||||
|
||||
```bash
|
||||
[llchan@localhost ~]$ date "+%Y-%m-%d"
|
||||
2020-02-12
|
||||
[llchan@localhost ~]$ date "+%H:%M:%S"
|
||||
20:01:53
|
||||
[llchan@localhost ~]$ date "+%Y-%m-%d %H:%M:%S"
|
||||
2020-02-12 20:02:06
|
||||
```
|
||||
|
||||
具体的格式参考man手册:
|
||||
|
||||
```bash
|
||||
格式 FORMAT 控制着输出格式. 仅当选项指定为全球时间时本格式才有效。 分别解释如下:
|
||||
|
||||
%% 文本的 %
|
||||
|
||||
%a 当前区域的星期几的简写 (Sun..Sat)
|
||||
|
||||
%A 当前区域的星期几的全称 (不同长度) (Sunday..Saturday)
|
||||
|
||||
%b 当前区域的月份的简写 (Jan..Dec)
|
||||
|
||||
%B 当前区域的月份的全称(变长) (January..December)
|
||||
|
||||
%c 当前区域的日期和时间 (Sat Nov 04 12:02:33 EST 1989)
|
||||
|
||||
%d (月份中的)几号(用两位表示) (01..31)
|
||||
|
||||
%D 日期(按照 月/日期/年 格式显示) (mm/dd/yy)
|
||||
|
||||
%e (月份中的)几号(去零表示) ( 1..31)
|
||||
|
||||
%h 同 %b
|
||||
|
||||
%H 小时(按 24 小时制显示,用两位表示) (00..23)
|
||||
|
||||
%I 小时(按 12 小时制显示,用两位表示) (01..12)
|
||||
|
||||
%j (一年中的)第几天(用三位表示) (001..366)
|
||||
|
||||
%k 小时(按 24 小时制显示,去零显示) ( 0..23)
|
||||
|
||||
%l 小时(按 12 小时制显示,去零表示) ( 1..12)
|
||||
|
||||
%m 月份(用两位表示) (01..12)
|
||||
|
||||
%M 分钟数(用两位表示) (00..59)
|
||||
|
||||
%n 换行
|
||||
|
||||
%p 当前时间是上午 AM 还是下午 PM
|
||||
|
||||
%r 时间,按 12 小时制显示 (hh:mm:ss [A/P]M)
|
||||
|
||||
%s 从 1970年1月1日0点0分0秒到现在历经的秒数 (GNU扩充)
|
||||
|
||||
%S 秒数(用两位表示)(00..60)
|
||||
|
||||
%t 水平方向的 tab 制表符
|
||||
|
||||
%T 时间,按 24 小时制显示(hh:mm:ss)
|
||||
|
||||
%U (一年中的)第几个星期,以星期天作为一周的开始(用两位表示) (00..53)
|
||||
|
||||
%V (一年中的)第几个星期,以星期一作为一周的开始(用两位表示) (01..52)
|
||||
|
||||
%w 用数字表示星期几 (0..6); 0 代表星期天
|
||||
|
||||
%W (一年中的)第几个星期,以星期一作为一周的开始(用两位表示) (00..53)
|
||||
|
||||
%x 按照 (mm/dd/yy) 格式显示当前日期
|
||||
|
||||
%X 按照 (%H:%M:%S) 格式显示当前时间
|
||||
|
||||
%y 年的后两位数字 (00..99)
|
||||
|
||||
%Y 年(用 4 位表示) (1970...)
|
||||
|
||||
%z 按照 RFC-822 中指定的数字时区显示(如, -0500) (为非标准扩充)
|
||||
|
||||
%Z 时区(例如, EDT (美国东部时区)), 如果不能决定是哪个时区则为空
|
||||
```
|
||||
|
||||
|
||||
|
||||
## 下面就是比较骚的操作,我今天用到了。
|
||||
|
||||
|
||||
|
||||
#### 获取相对当前时间的明天的时间
|
||||
|
||||
```bash
|
||||
[llchan@localhost ~]$ date -d next-day
|
||||
2020年 02月 13日 星期四 20:08:35 CST
|
||||
|
||||
#你可以指定输出格式,比如
|
||||
[llchan@localhost ~]$ date -d next-day +%Y%m%d
|
||||
20200213
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 获取相对于当前时间的昨天的时间
|
||||
|
||||
```bash
|
||||
[llchan@localhost ~]$ date -d last-day
|
||||
2020年 02月 11日 星期二 20:11:35 CST
|
||||
|
||||
#你也可以指定输出格式,比如
|
||||
[llchan@localhost ~]$ date -d last-day +%Y%m%d
|
||||
20200211
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 获取相对当前时间的上个月的时间
|
||||
|
||||
```bash
|
||||
[llchan@localhost ~]$ date -d last-month
|
||||
2020年 01月 12日 星期日 20:13:20 CST
|
||||
|
||||
#同样的你也可以指定输出格式,比如
|
||||
[llchan@localhost ~]$ date -d last-month +%Y-%m-%d
|
||||
2020-01-12
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 获取相对当前时间的下个月的时间
|
||||
|
||||
```bash
|
||||
[llchan@localhost ~]$ date -d next-month
|
||||
2020年 03月 12日 星期四 20:15:44 CST
|
||||
|
||||
[llchan@localhost ~]$ date -d next-month "+%Y-%m-%d %H:%M:%S"
|
||||
2020-03-12 20:15:38
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 获取相对当前时间的明年的时间
|
||||
|
||||
```bash
|
||||
[llchan@localhost ~]$ date -d next-year
|
||||
2021年 02月 12日 星期五 20:17:21 CST
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 获取相对当前时间的上一年的时间
|
||||
|
||||
```bash
|
||||
[llchan@localhost ~]$ date -d last-year
|
||||
2019年 02月 12日 星期二 20:17:29 CST
|
||||
```
|
||||
|
||||
68
_posts/2020-2-21-sourcegraph.md
Normal file
68
_posts/2020-2-21-sourcegraph.md
Normal file
@@ -0,0 +1,68 @@
|
||||
---
|
||||
layout: post
|
||||
title: "推荐一款github代码在线浏览神器sourcegraph"
|
||||
date: 2020-1-27
|
||||
tags: [后台开发]
|
||||
comments: true
|
||||
author: lemonchann
|
||||
---
|
||||
|
||||
程序员逛github已经是每日必须项目,看到感兴趣的项目都会点进去看一下,github全球最大的同性交友平台,这里有海量的开源代码库,作为开源代码管理平台github是非常专业的。
|
||||
|
||||
但是,你要在上面看代码就不是那么舒服了,特别是点进去每个文件夹浏览文件非常的不方便,大工程文件之间的切换有时候网页加载特别慢非常不方便。
|
||||
|
||||
推荐这款我用的这款Google浏览器插件,安装之后让在线浏览github项目源码,查找引用和定义如同在IDE看代码一样,体验如丝滑般舒爽。
|
||||
|
||||
## 安装
|
||||
|
||||
进入[Google应用商店](https://chrome.google.com/webstore/category/extensions?utm_source=chrome-ntp-icon) 搜索sourcegraph下载安装插件,如下图:
|
||||
|
||||

|
||||
|
||||
点击,**添加至Chrome**,即可在项目中使用。
|
||||
|
||||
|
||||
|
||||
## 使用
|
||||
|
||||
打开github上任意一个项目,点击项目上方的Sourcegraph图标,即可进入代码浏览界面。
|
||||
|
||||

|
||||
|
||||
代码浏览界面的左侧是代码目录结构,就跟一般的IDE工程视图一样,你可以很轻松的在各个文件夹中查看文件,不用像在github那样来回前进后退,望着网页加载进度发呆。
|
||||
|
||||

|
||||
|
||||
鼠标单击相应的函数,出现的选项框可以选择跳转到定义
|
||||
|
||||

|
||||
|
||||
也可选择查找所有引用
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
## 离线安装
|
||||
|
||||
鉴于有些同学由于众所周知的原因,不方便去Google应用商店下载,这里再说说离线安装的方法
|
||||
|
||||
- 进入Chrome插件中心,浏览器输入 [chrome://extensions/](chrome://extensions/)
|
||||
- 打开开发者模式开关
|
||||
|
||||

|
||||
|
||||
- 下载我提供的插件安装包 `20.2.5.1810_0.rar` ,安装包在公众号【柠檬的编程学堂】回复【插件】获取,解压放到插件文件夹路径,比如我的路径:
|
||||
|
||||
`C:\Users\替换成你的电脑用户名\AppData\Local\Google\Chrome\User Data\Default\Extensions`
|
||||
|
||||
- 打开浏览器插件中心,打开 **开发者模式**,选择 **加载已解压的扩展程序**,即可完成安装。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
以上,这款好用的插件分享给大家,愉快的在github玩耍吧!
|
||||
|
||||
|
||||
|
||||
160
_posts/2020-3-3-job_analyzes.md
Normal file
160
_posts/2020-3-3-job_analyzes.md
Normal file
@@ -0,0 +1,160 @@
|
||||
---
|
||||
layout: post
|
||||
title: "我分析几个一线城市的近千份岗位招聘需求,得出应该这么准备找工作"
|
||||
date: 2020-1-27
|
||||
tags: [后台开发]
|
||||
comments: true
|
||||
author: lemonchann
|
||||
---
|
||||
|
||||
每年的三四月份是招聘高峰,也常被大家称为金三银四黄金求职期,这时候上一年的总结做完了,奖金拿到了,职场人开始谋划着年初的找工作大戏。
|
||||
|
||||
作为IT人要发挥自己的专业特长,如何让伯乐和千里马更快相遇?我利用大数据分析了北京、广州、深圳三个一线城市的C++招聘岗位信息,篇幅限制文中只拿出北京和深圳的数据展示,让我们来看看岗位的招聘现状,以及如何科学提高应聘成功率。
|
||||
|
||||
文末可以获取本次分析的高清图表,需要的同学自取。同时分享完整源码用于学习交流,若对其他岗位感兴趣也可以自行运行源码分析。
|
||||
|
||||
### 需求分析
|
||||
|
||||
通过大数据分析招聘网站发布的招聘数据,得出岗位分布区域、薪资水平、岗位关键技能需求、匹配的人才具有哪些特点、学历要求。从而帮助应聘者提高自身能力,补齐短板,有的放矢的应对校招社招,达成终极目标获得心仪的offer。
|
||||
|
||||
### 软件设计
|
||||
|
||||
数据分析是Python的强项,项目用Python实现。软件分为两大模块:数据获取 和 数据分析
|
||||
|
||||

|
||||
|
||||
### 详细实现
|
||||
|
||||
#### 数据获取
|
||||
|
||||
request库构造请求获取数据
|
||||
|
||||
```py
|
||||
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格式存储
|
||||
|
||||
```py
|
||||
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)
|
||||
```
|
||||
|
||||
#### 数据分析
|
||||
|
||||
字段预处理
|
||||
|
||||
```py
|
||||
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])
|
||||
```
|
||||
|
||||
数据图表展示
|
||||
|
||||
```py
|
||||
from pyecharts.charts import Bar
|
||||
regBar = Bar(init_opts=opts.InitOpts(width='1350px', height='750px'))
|
||||
regBar.add_xaxis(region.index.tolist())
|
||||
regBar.add_yaxis("区域", region.values.tolist())
|
||||
regBar.set_global_opts(title_opts=opts.TitleOpts(title="工作区域分布"),
|
||||
toolbox_opts=opts.ToolboxOpts(),
|
||||
visualmap_opts=opts.VisualMapOpts())
|
||||
|
||||
from pyecharts.commons.utils import JsCode
|
||||
shBar = Bar(init_opts=opts.InitOpts(width='1350px', height='750px'))
|
||||
shBar.add_xaxis(sala_high.index.tolist())
|
||||
shBar.add_yaxis("区域", sala_high.values.tolist())
|
||||
shBar.set_series_opts(itemstyle_opts={
|
||||
"normal": {
|
||||
"color": JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
|
||||
offset: 0,
|
||||
color: 'rgba(0, 244, 255, 1)'
|
||||
}, {
|
||||
offset: 1,
|
||||
color: 'rgba(0, 77, 167, 1)'
|
||||
}], false)"""),
|
||||
"barBorderRadius": [30, 30, 30, 30],
|
||||
"shadowColor": 'rgb(0, 160, 221)',
|
||||
}})
|
||||
shBar.set_global_opts(title_opts=opts.TitleOpts(title="最高薪资范围分布"), toolbox_opts=opts.ToolboxOpts())
|
||||
|
||||
word.add("", [*zip(key_words.words, key_words.num)],
|
||||
word_size_range=[20, 200], shape='diamond')
|
||||
word.set_global_opts(title_opts=opts.TitleOpts(title="岗位技能关键词云图"),
|
||||
toolbox_opts=opts.ToolboxOpts())
|
||||
```
|
||||
|
||||
|
||||
|
||||
### 数据分析
|
||||
|
||||
#### 区域分布
|
||||
|
||||
C++岗位区域分布,北京 VS 深圳
|
||||

|
||||
|
||||
北京的C++岗位数量比深圳更多,首都buff加持,并且集中分布在海淀区和朝阳区这两个区域,中关村位于海淀区,还有位于海淀区西北旺镇的后厂村,腾讯、滴滴、百度、新浪、网易这些互联网巨头扎堆,自然能提供更多的岗位。
|
||||
|
||||
深圳的岗位则集中在南山区,猜测鹅厂C++大厂在南山区贡献了重大份额,第二竟然在宝安区。
|
||||
|
||||
#### 学历分布
|
||||
|
||||
C++岗位学历分布,北京 VS 深圳
|
||||

|
||||
|
||||
学历上两个城市的本科学历占比都是85%以上,北京岗位需求研究生占比和大专相当。可见大部分岗位本科学历即可胜任,或许能给即将毕业纠结考不考研的你一些参考。
|
||||
|
||||
如果你的学历是专科,那么需要加倍的努力,因为留给你的职位并不是很多。同时,从图表数据来看,深圳的岗位对大专生需求10%而对硕士仅占2%,或许专科生去深圳比去北京更加友好,emmm...仅供参考。
|
||||
|
||||
#### 薪资分布
|
||||
|
||||
C++岗位薪资分布,薪资单位K。
|
||||
|
||||
北京最高薪资 VS 最低薪资
|
||||

|
||||
|
||||
深圳最高薪资 VS 最低薪资
|
||||

|
||||
|
||||
薪资对比没啥好说的,大家看图说话,只想说帝都果然财大气粗。
|
||||
|
||||
#### 技能储备
|
||||
|
||||
C++岗位关键技能词云,北京 VS 深圳
|
||||

|
||||
|
||||
|
||||
首先在脱离开发走上管理岗位之前,编程解决问题能力是最重要,可以看到「编程」能力在技能词云中占比最大。
|
||||
|
||||
大部分岗位要求较高的「算法、数据结构、Linux、数据库(存储)、多线程(操作系统)」这些计算机基础素养,所以不管你是在校学生准备校招或者职场老人准备跳槽,都需要储备好这些计算机基础能力,无论哪种个方向,硬实力的储备都很重要。
|
||||
|
||||
值得一提的是除去硬核技术要求外,岗位对候选人的软实力也有要求,比如更加偏爱具备「团队、协作、学习、沟通」这些能力的候选人,大家在提高技术能力的同时,也要注重这些软实力的培养。
|
||||
|
||||
一个彩蛋。Linux和window下都有C++开发岗位需求,相对而言Linux下C++开发占比更多,词云更大,如果你对这两个平台没有特殊偏爱,那么学Linux下开发大概能加大应聘成功率,毕竟岗位需求更大。
|
||||
|
||||
关注公众号「柠檬的编程学堂」回复 「分析」获取本文程序完整源码以及高清分析图表。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,2 +1,6 @@
|
||||
进程 线程 协程的对比python vs go
|
||||
github c++项目推荐
|
||||
|
||||
谈谈序列化protobuf
|
||||
|
||||
说说RPC
|
||||
Reference in New Issue
Block a user