- 博客(77)
- 资源 (2)
- 收藏
- 关注
原创 golang并发安全-sync.Once
sync.Once 是 Go 语言中的一种同步原语,用于确保某个操作或函数在并发环境下只被执行一次。它只有一个导出的方法,即 Do,该方法接收一个函数参数。在 Do 方法被调用后,该函数将被执行,而且只会执行一次,即使在多个协程同时调用的情况下也是如此。
2024-02-04 14:10:15
716
原创 简单说说redis分布式锁
分布式锁(多服务共享锁)在分布式的部署环境下,通过锁机制来让多客户端互斥的对共享资源进行访问/操作。分布式锁不是百分百安全,我们要根据实际使用情况来考虑锁的使用(解决效率问题还是正确行问题),在使用分布式锁的时候我们需要考虑锁的续期,锁归属,集群数据一致性,操作院子行,GC,时钟飘逸,网络延迟等等的问题。在cap 理论里, redis保证了ap, zk和etcd保证cp ,所以实际使用中根据业务的情况,选择redis/zk/etcd之一来实现分布式锁。
2024-02-02 14:01:59
1176
原创 简单说说-docker网络类型
容器网络是指容器之间或非 Docker 工作负载之间连接和通信的能力。容器默认启用网络,并且可以建立传出连接。容器不知道它所连接的网络类型,容器只能看到带有 IP 地址、网关、路由表、DNS 服务和其他网络详细信息的网络接口。也就是说,除非容器使用none网络驱动程序。
2024-02-01 14:24:41
1020
原创 简单说说mysql的日志
今天我们通过mysql日志了解mysqld的错误日志、慢查询日志、binlog,redolog, undolog等。揭示它们的作用和用途,让我们工作中更能驾驭mysql。
2024-02-01 14:19:39
1285
原创 golang并发安全-select
简单总结下select对case处理逻辑:1- 空的case 会被golang监听到无法唤醒的协程,会panic2- 如果只有一个case, 根据操作类型转换成
2024-01-10 14:09:17
1449
原创 docker-简单说说cgroup
cgroup(control groups)是Linux下的一种将进程按组进行管理的机制,在用户层看来,cgroup技术就是把系统中的所有进程组织成一颗一颗独立的树,每棵树都包含系统的所有进程,树的每个节点是一个进程组,而每颗树又和一个或者多个subsystem关联,树的作用是将进程分组,而subsystem的作用就是对这些组进行操作。
2024-01-04 16:04:48
1628
原创 docker-简单说说namespace
Linux Namespace 是一种 Linux Kernel 提供的资源隔离方案。使得处于不同namespace的进程拥有独立的全局系统资源,改变一个namespace中的系统资源只会影响当前namespace里的进程,对其他namespace中的进程没有影响。我们可以通过 ls -l /proc/$$/ns 查看服务器有哪些 namespace。
2024-01-04 09:00:00
945
原创 golang并发编程-channel
在golang 并发编程里,经常会听到一句话:不要通过共享内存进行通信,通过通信来共享内存。下面我们会介绍下channel, 通过源码的方式去了解channel是怎么工作的。
2024-01-02 14:48:10
1378
1
原创 golang并发安全-sync.map
1- sync.map 结构体加了readOnly 和 dirty 来实现读写分离,load,store, delete,range 每次都会优先访问read,后面访问dirty都会双重检测以防加锁前Map.dirty可能已被提升为read2- sync.map不适合写多读少,从store 代码中可以看出会频繁加锁访问dirty,双重检测等等,这些都会导致性能下降3- sync.map 没有提供对read, dirty 的长度方法,这个对象使用在于并发场景下,会额外带来锁竞争的问题。
2023-12-27 20:25:23
1431
2
原创 centos服务器搭建k8s集群
我这里用到了CentOS7.6服务器3台(2核4G),我是自己在我windows的虚拟机弄了三台centos,我后面会把我安装的文档放在下面,需要的话自己下去看看。这里多啰嗦一句,搭建好一台,后面两台直接克隆,这样比较节约时间和精力。看笔记的时候要仔细,一步一步来肯定可以搭建好的。
2022-04-11 15:33:06
1671
原创 Kubernetes 单机安装---kubeadm
最近在看云原生,安装Kubernetes(以下简称k8s)出现了不少的问题,这里将我的安装步骤和可能出现的问题进行整理,如有问题可以在下面留言相互学习。另提醒我用的是阿里云服务器(centos)。
2022-04-11 15:32:12
1489
原创 一起学Go之计时器(Timer/Tick)
前言上篇文章写了关于context 源码解读,里面涉及到不少的计时器,所以我们这篇文章就简单了解下go的计时器。Go的计时器主要Timer和Ticker两种,下面我们开始一起学习下计时器主要结构go的计时器基于Go运行时计时器runtime.timer实现的,rumtime.timer的结构体表示如下type runtimeTimer struct { pp uintptr when int64 period int64 f f
2021-10-04 23:17:22
3373
原创 一起学go之Context
前言在go开发中经常使用到context,使用的时候感觉和其他语言(py的flask)上下文有点类似,所以激起我的好奇心,看看go的context都干了啥。看了下源码不多,所以花了点时间,把源码稍微看了看。什么是Context?Context 也叫作“上下文”,一般理解为程序单元的一个运行状态、环境、快照等信息。其中上下是指存在上下层的传递,上会把内容传递给下,程序单元则指的是 Goroutine。Context的作用context 主要用来在 goroutine 之间传递上下文信息,包
2021-10-04 16:28:59
810
原创 centos7安装redis5.0
最近趁优惠买了台阿里服务器,需要装一些组件,所以顺便就把安装的流程记录一下,今天我们安装下redis。安装部署redis下载redis的安装包wget http://download.redis.io/releases/redis-5.0.3.tar.gz解压下载的压缩包tar -zxvf redis-5.0.3.tar.gz进入redis文件夹,进行编译在执行编译之前,需要确认有没有安装gcc确认有没有gcc 环境,没有的话可以执行yum install -y gcc.
2021-07-10 17:22:23
839
3
原创 centos7安装mysql教程
最近买了台阿里云服务器,要装一些组件,网上文章一篇不能解决问题,所以把自己安装的顺序整理下来,写一篇笔记下载和安装mysql第一步:下载rpm包wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm下载成功:第二步:通过yum安装之前安装的包yum -y install mysql57-community-release-el7-10.noarch.rpm下载成功:
2021-07-10 15:56:31
204
原创 一起学GO之数组和切片
数组数组定义数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。因为数组的长度是固定的,所以在Go语言中很少直接使用数组。数组的声明声明语法: var 变量名 [元素数量]类型,默认情况下,一个新的数组中元素的初始值为元素类型的零值,对于数字类型来说就是0 。下面我们来看一个简单的例子package mainimport ( "fmt")func main() { var listName [5]int fmt.Println(lis
2021-07-04 13:10:54
266
2
原创 一起学GO之map
什么是mapMap是一种通过key来获取value的一个数据结构,其底层是散列表,在存储时key不能重复,当我们给定 key,就可以迅速找到对应的 value,不过我们要知道Map 是无序的,我们无法决定它的返回顺序。声明map1-因为map是引用类型,可以使用: var mapname map[keyType]valType2- 通过make内置函数可以创建 map,语法:make(map[keyType] valType) languageMap := map[string]int{"Go":
2021-07-04 13:07:05
301
2
原创 redis实现分布式锁
前言在我们日常的开发中,我们有时候需要考虑一些并发的问题:比如说秒杀,退款等等。针对这个问题我们有很多办法解决,但今天我们从redis的角度去看下怎么解决?
2021-06-20 22:10:33
348
原创 redis实现队列的几种方式(LPUSH/BRPOP,发布/订阅模式,stream)
前面我们在redis学习笔记之基本5种数据结构中提到列表实现队列,我们今天就先从队列开始,经过redis的发布订阅,最后以stream来结尾,来简单说说这三个知识点队列redis中通过列表可以来实现队列具体操作可以下面操作rpush/lpop或lpush/rpop实现简单队列127.0.0.1:6379> lpush word a b c d(integer) 4127.0.0.1:6379> llen word(integer) 4127.0.0.1:6379&g
2021-04-25 22:20:07
10925
原创 简单说说python垃圾回收机制
前言现在高级语言如python, java等,都采用了垃圾收集机制,而不再是像c用户自己需要管理维护内存的方式。自己管理内存极其自由,可以任意申请内存,但如同一把双刃剑,为大量内存泄露,悬空指针等bug埋下隐患。对于一个字符串、列表、类甚至数值都是对象,且定位简单易用的语言,自然不会让用户去处理如何分配回收内存的问题。python采用的是引用计数机制为主,标记-清除和 分代回收两种机制为辅的策略。再说垃圾回收机制前,先和大家一起先了解下什么是内存泄漏内存泄漏内存泄漏是由于开发人员的...
2021-04-11 21:30:38
530
原创 安装不了sshpass解决办法
前言在弄ansiable发现sshpass没有这个包,安装的时候发现pip没有用,然后也访问不了github地址。解决了之后稍微总结下。安装步骤下载安装包进入sourceforge下载 sshpass包编译安装解压进入文件夹,先检查环境是否满足sh configure然后在进行安装make&&make install执行sshpass,返回如下就是成功(djangoDemo) xxxx@xxxxx Downloads % sshpas
2021-03-24 14:09:10
3331
原创 python字符串
什么是字符串由独立字符组成的一个序列,一般使用单引号('')双引号("")或者三引号(''' '''或""" """)包围。字符串的内容可以包含字母、标点、特殊符号、中文、日文等全世界的所有文字。auther = '林小贱'reader = '帅气的读者'注意:相同的引号不能使用多个一起使用,比如 a = ' '123' ' 或 a = " "123" ",如果我们字符串需要带引号,我们可以使用用反斜杠\ 进行转义。a = '\'123\''print("a", a)# 输...
2021-03-21 22:00:44
779
2
原创 python集合(set)
前言我们前面深入了解了字典,列表和元组,对这三个数据类型有了认识,今天我们了解下另外一种数据类型:集合。集合用来保存不重复的元素,即集合中的元素都是唯一的,元素只能是不可变的数据类型(包括整形、浮点型、字符串、元组),无法存储可变的数据类型(列表、字典、集合)。...
2021-03-16 21:19:55
1395
3
原创 python列表(list)和元组(tuple)详解
前言实际开发中时候,经常需要将一组数据存储起来,以便使用。如果学习了其他的语言可能知道数组(Array)这个数据结构,它就可以把多个数据挨个存储到一起,通过数组下标可以访问数组中的每个元素。python中没有数组,但是提供了更加灵活的列表(list)和元组(tuple)。列表初始化a = list()b = []# 可以通过range快速创建listc = list(range(1,6))print("a:", a)print("b:", b)print("c:", c)#
2021-03-13 15:04:19
20212
24
原创 python处理大文本---mmap模块
前言如果现在有一个需求,我们需要处理一个20G的大文件,我们会怎么处理呢?我们先暂定下来自己思考下,我们需要怎么实现这个功能。------------------------------------------------------------------------放上我的老婆大人------------------------------------------------------------------------我们可能会这么实现def get_datas():
2021-03-11 17:00:52
3412
原创 巧用python上下文管理器
前言首先问下帅气的读者们,当你们需要访问一个文件时候,你们是用什么方式访问的,是open吗?如果是,那么你们有没有觉得每次都需要 ‘手动’ 关闭很麻烦或则忘记关闭很麻烦。今天我们带大家来认识python一个新的魔法---上文管理器。如果你知道那么不要急着走开,自己心里默默的问自己是不是可以回答以下几个问题:上下文管理器是什么? 上下文管理器怎么实现,你是否有多种方式来实现呢? 为什么要用上下文管理器?上下文管理器是什么语法首先我们先简单的看一段使用上下文管理器的代码:with o
2021-03-10 23:09:24
1411
11
原创 pyecharts不能导入Bar的问题解决
前言今天用pyecharts画图的时候,发现 from pyecharts import Bar 失败,直接报错cannot import name 'Bar'解决方法1- 导入改为from pyecharts.charts import Bar, 但是发现和 from pyecharts import Bar 导入的方法不一样,所以再去查询了别的了2- 社区发现有人通过 pip install pyecharts-snapshot 来进行解决,结果发现对我来说没有用3- 通过更...
2021-03-08 17:28:57
3407
1
原创 详解python-----字典
在python中字典是一种很重要的数据结构,我们都知道他查询的时间复杂度是O(1),我们工作中也会他的一些基本操作,今天我们就不讲操作,就简单讲一下他是怎么进行插入和获取的。有需要知道操作的可以去菜鸟教程观看 首先我们就说下字典是怎么进行插入的? 插入数据的位置一般取决于数据的两个属性:1-键的哈希值(散列值);2-该值与其他的值的比较。在我们插入数据...
2021-01-28 11:00:00
1696
原创 django源码解读: setting懒加载
前言上次我们了解了django启动原理,细心的朋友可能发现django中的setting配置文件加载时懒加载,接下来我们了解下setting的懒加载懒加载我们从manager.py进入management/__init__.py,我们可以看到导入有这个from django.conf import settings,我们进入setting后就可以看到懒加载源码class LazySettings(LazyObject): """ 全局Django设置或自定义设置对象的惰性代
2021-01-24 14:56:48
1818
8
原创 supervisor使用教程(django例子)
前言Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。也实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。supervisor还提供了一个功能,可以为supervisord或者每个子进程,设
2021-01-23 19:42:43
2726
8
原创 python时间处理模块(calendar,time,datetime,arrow)
前言时间我们平常大部分都接触到,在生活上早上七点五十起床,七点五十就是时间;在开发中我们有时候对某些操作需要记录时间,新增操作时间字段,这又涉及到了时间。接下来我们简单对python的时间处理进行简单的总结。在工作中我们大部分用time或者datetime函数进行时间处理,今天我就总结这两模块外,再新增calendar,arrow这两位成员,好啦下面我们开始讲解。timetime模块是涉及到时间功能中最常用的一个模块,在开发中我们使用很频繁的一个模块。time返回当前时间的时间.
2021-01-18 13:24:01
1526
2
原创 django源码解读:项目启动流程
启动代码流程1- 先看下manager.pydef main(): "Run administrative tasks.""" # set djangoStu.settings become django of run env # 将settings模块设置到环境变量中 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djangoStu.settings') try: from dj...
2021-01-11 09:36:35
3430
8
原创 python缓存机制与functools.lru_cache
前言前阵子看了下django源码,在看到get_commads()方法时,看到了使用functools.lru_cache装饰器来实现缓存,现在我们简单讲解下。概述缓存是一种将定量数据加以保存以备迎合后续获取需求的处理方式,旨在加快数据获取的速度。数据的生成过程可能需要经过计算,规整,远程获取等操作,如果是同一份数据需要多次使用,每次都重新生成会大大浪费时间。所以,如果将计算或者远程请求等操作获得的数据缓存下来,会加快后续的数据获取需求。简单例子import timefrom fun
2021-01-11 09:36:09
3227
原创 python监控文件变化-----watchdog
前言前些日子用了pyinotify来实现文件的监听,现在我们通过watchdog来实现下监听文件的变化。pyinotify依赖与Linux平台的inotify,watchdog对不同平台的事件都进行了封装。所以学好watchdog我们就不怕平台的切换导致模块不能使用了。类型events(watchdog.events.FileSystemEvent)当受监视的文件系统发生更改时,不可变类型的文件系统将会被触发;所有FileSystemEvent对象都必须是不可变的,因此可以...
2020-12-21 21:51:30
7305
4
原创 设计模式-----工厂模式(python版)
什么是工厂模式工厂模式又称多态工厂模式和虚拟构造器模式,通过已经定义的工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。大白话解释您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。代码实现从上面说明来看可能还是不太清楚,下面我们用代码来一步一步的展现工厂模式。我们以写一个简单版的计算的代码来开始(只提供加减乘除的功能)一般新手都会按照如下的方式进行开发class Calculator(object):
2020-12-19 11:55:24
1189
2
原创 python监控文件变化-----pyinotify
概述Pyinotify可以用来监测文件系统的变化, 它依赖于Linux内核的功能—inotify(内核2.6.13合并)。 inotify的是一个事件驱动的通知器,其通知接口通过三个系统调用从内核空间到用户空间。inotify有以下特点通知配置文件的改变 跟踪某些关键的系统文件的变化 监控某个分区磁盘的整体使用情况 系统崩溃时进行自动清理 自动触发备份进程 向服务器上传文件结束时发出通知安装# 方式一 pip install pyinotify# 方式二git clo
2020-12-18 21:10:03
4698
1
原创 django报错汇总
django启动报:'str' object has no attribute 'decode'解决: 146行将将decode修改成encode
2020-12-04 20:56:27
1256
2
原创 linux性能监控工具---bpytop介绍
工具安装git clone https://github.com/aristocratos/bpytop.gitcd bpytopsudo make install使用进入之后按下esc 键展示:Option:可以更改主题和各个参数help:说明QUIT:退出常用键说明o 进入选项页面m 切换mini模式和一般模式h 查看帮助.
2020-12-04 20:53:08
1485
1
原创 django使用uWSGI和nginx启动
前言python程序员一般在本地写代码时候,无论是用pycharm还是终端我们都是使用runserver启动来调试的,今天我们来了解下另外一种(线上部署)启动方式:通过uwsgi启动runserver:调试 Django 时经常用到的运行方式,它使用Django自带的WSGI Server 运行,主要在测试和开发中使用,并且 runserver 开启的方式也是单进程(多线程)uWSGI: Web服务器,它实现了WSGI协议、uwsgi、http 等协议。注意uwsgi是一种通信协议,而uWSG.
2020-11-30 09:08:51
2579
2
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人