(3)Redis延时队列
redis消息队列不是专业的消息队列,没有非常多的高级特性,没有ack保证,适合用于对消息没有很高的可靠性要求的场景。
1.list实现异步消息队列 使用rpush和lpush实现消息入队列。rpop和lpop实现消息出队列。
2.阻塞读:防止队列空时无限循环 如果队列空了,客户端会陷入pop的死循环中,会拉高客户端CPU的消耗,也会是redis的QPS拉高,如果这样的客户端有几十个,redis的慢查询可能也会增多。
QPS:每秒查询率,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准,在因特网上,作为域名系统服务器的机器的性能经常用每秒查询率来衡量。
a.sleep使读操作慢下来 使用sleep,当队列为空时,让线程sleep一会。可以让客户端的CPU消耗降下来,Redis的QPS也能降下来。
b.阻塞读(brpop,blpop) 使用睡眠会导致消息的延时增大。如果只有一个消费者,那么延时就是1秒。如果有多个消费者,这个延迟会降低,因为每个消费者的睡眠时间的叉开的。
...
(2)Redis分布式锁
1.使用set和其两个扩展参数(ex,nx)实现分布式锁 可以使用setnx (set if not exists) 加锁,如果执行结束,再将锁释放掉。
123> setnx lock:task_id true··· doing task ···> del lock:task_id
但是这样会有问题,如果在执行task之间出现了异常,删除锁的操作无法执行,就会出现死锁。
于是可以在加锁的时候加上过期时间,这样即使出现异常也可以保证锁可以正常释放。
1234> setnx lock:task_id true> expire lock:task_id 5··· doing task ···> del lock:task_id
以上逻辑还会有问题,如果在setnx和expire之间服务器突然挂掉了,导致没有给锁加上过期时间,仍然会造成死锁。
这种问题的根源在于setnx和expire不是原子指令。可以使用set的扩展参数,实现setnx和expire的原子操作,从而实现分 ...
并发性能测试工具Jmeter的使用
一 Jmeter的配置与安装
Java JDK的安装
下载jdk8以上版本,包含1.8,本应用已经下载了 jdk-8u241-macosx-x64.dmg
安装java jdk
配置java的环境变量如下
123456789cd /etc/profilesudo vim profile将这几行命令添加到配置文件中,注意路径和版本一定要保持一致JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/HomePATH=$JAVA_HOME/bin:$PATH:.CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:.export JAVA_HOMEexport PATHexport CLASSPATH
测试是否安装成功
java -version
Jmeter的安装
进入jmeter官网,下载Jmeter的安装二进制文件 https://jmeter.apache.org/download_jmeter.cgi ...
(1)Redis的基本数据结构
一、5种基础数据结构 Redis所有的数据结构都是以唯一的key字符串作为名称,然后通过key值来获取相应的value数据。不同类型的数据结构差异在于value不同。
1.string(字符串)a.键值对 相当于字典中的key-value,支持简单的增删改查操作。
b.批量键值对 可以对多个字符串进行批量读写,节省网络耗时开销。
c.过期和set命令扩展(setex,setnx) 对key设置过期时间,超时候会自动删除,这个功能常用来控制缓存的失效时间。
setnx 如果key不存在就创建。如果key存在,就创建失败。
d.计数可以对整数的value进行自增操作。
自增取值范围:long类型的范围,-2^64~2^64
即,-9223372036854775808到9223372036854775807
超出范围,redis会报错。
2.list(列表) Redis中的列表是链表而不是数组。这代表list的插入和删除操作非常快,时间复杂度为O(1),但是索引定位很慢,时间复杂度为 ...
高级函数的使用细节
一 函数签名的概念 一个函数签名 (或类型签名,或方法签名) 定义了函数或方法的输入与输出。
简单的说: 函数的签名就是函数的参数列表与返回值列表的统称。使用签名可以鉴别不同函数的特征,此外,也定义了用户与函数直接交互的方法。
特别说明:
1 参数的名称和返回值的名称,不作为函数签名的一部分。换句话说,就是签名与参数的名称无关。
2 只要两个函数参数列表和返回值列表元素的顺序与类型是一致,就可以说明该两个函数是一样的函数或者说实现了同一个类型函数。
例如:
123456789101112 // 自定义函数类型type MyFuncType func(int, int) int// 实现一个和MyFuncType一样类型的函数func TestFunc (a int, b int) int { return a + b}func main() { var c MyFuncType = TestFunc d := c(1, 1) fmt.Println(d ...
解决go mod模式下本地包引用问题
使用go mod模式,进行项目源码管理,可以解决不用在Gopath下的src目录下进行项目开发。
在go mod 下,解决自定义包倒入出错问题:
1main.go:11:2: package hellogRPC/proto/hello is not in GOROOT (/Users/austsxk/Golang_dev/go/src/hellogRPC/proto/hello)
解决的方法:
在每个包下,都使用go mod进行管理,对于需要在项目本地导入的包,可以在当前包的go mod文件中:
自定义导入包的路径,如上图所示,将在server包中使用到的hellogRPC/proto/hello包就命名为此,并在require中填入相关内容,初始化版本为v0.0.0,然后使用 replace 关键词 将其取代为相对于当前文件的包的相对路径。
在server包中就可以正常导入 hellogRPC/proto/hello包
如下图所示:
计算机系统知识(一)
计算机系统基础知识
计算机系统硬件的基本组成计算机硬件由运算器、控制器、存储器、输入设备、输出设备组成;
运算器、控制器和存储器合起来为CPU;
输入设备与输出设备为外设;
存储器为记忆设备,分为外部存储器和内部存储器。
中央处理单元 负责获取程序的指令、并对指令进行编码、执行指令。
CPU功能
程序控制。CPU通过控制指令的执行来控制程序的执行顺序;
操作控制。CPU产生每条操作指令的操作信号,并将操作信号送往对应的部件,控制对应的部件按指令的功能进行操作;
时间控制。CPU对各种操作的时间进行控制,指令执行过程中操作信号的产生、持续时间、已经出现的时间顺序进行严格的控制。
数据处理。CPU对数据进行数据运算和逻辑运算,对数据加工处理,以便于处理结果被使用。
CPU组成
CPU主要是由运算器、控制器、寄存器组、内部总线等组成;
运算器
运算器由算数逻辑单元、累加寄存器、数据缓冲寄存器、状态条件寄存器组成。进行数据加工处理,用于计算机的算数计算和逻辑计算。
主要功能有两点:
执行所有的算数运算。进行加 ...
Mac Application快捷键神器
引言
app应用越来越多,要提升软件的使用效率,快捷键自然是占据重要位置,那么,每个应用的快捷键如此之多,如果去记忆每一个应用的快捷键,那将是一个繁琐枯燥的工作,并且常用的也就那么几个,不常用的偶尔使用,又去查询快捷键又比较费时,那么该如何解决这样的问题呢?
快捷键之神 - CheatSheet
告别快捷键的记忆与查询,按住command5秒,快捷键一览无余。
哪里下载?下载地址如下:
1https://www.mediaatelier.com/CheatSheet/
权限问题解决?
下载完成后,双击解压zip包,并将应用移动到 应用程序目录下。
双击应用,如果弹出非认证打不开,则在 系统偏好设置—>安全性与隐私—>通用 中允许打开CheatSheet;
允许App控制电脑权限打开;还是在安全性与隐私中,点击 辅助功能,将CheatSheet应用对勾打开即可。
软件怎么使用? 在权限配置完成之后,随便点击一个应用,然后按住 command键5秒左右,就会弹出这个应用相关的快捷键操作手册。
操 ...
leetcode-15 三数之和
题目描述 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
1234[ [-1, 0, 1], [-1, -1, 2]]
解题说明
将数组进行排序,从左向右依次从小到大进行排序;
判断数组长度是否满足输入,如果长度小于等于2,则返回空数组;
定位找值,先固定一个数值,然后定义两个指针,进行左右移动进行目标值确定。如果三个数和等于0,则将三个数加入到结果数组中,在进行判重,如果左指针的值等于左指针加一的值,即相邻数相等,则左指针继续加一,判重条件为左指针小于右指针,退出循环。退出循环后,左右指针各加一,继续从中间向两边查找。如果计算结果大于0,则右指针左移,否则左指针右移。
代码实例
1234567891011121314151617181920212223242526272829 ...
picGo配合github图床、七牛云图床的使用
picGo安装 下载链接: https://github.com/Molunerfinn/PicGo/releases
picGo配置Github图床
登陆Github账号,创建仓库;
Token的生成 进入个人中心,依次点击,settings—> developer setting —> personal aceess tokens 。点击generate token;然后写一个描述,全部都点中;最后生成token。
picGo中Github图床的设置
图片上传使用即可。
picGo配置七牛云图床【已经申请好七牛云存储空间/免费10G】
下载对应版本的picGo应用
1下载链接: https://github.com/Molunerfinn/PicGo/releases
AccessKey和SecretKey:可以在七牛云控制台,秘钥管理页面找到你的配置。登陆七牛云->个人中心->密钥管理
存储空间名:填写前面创建的空间名称
访问地址:对应自己设 ...