Go读取Excel数据
引言需求:给定一个时间戳 + 时区(Asia/shanghai) + 输出格式,返回该时区下特定格式的时间字符串
注意:一定需要考虑到不同国家冬夏令时情况
抽象一下:难点在于不同时区不同夏令时(夏时制)间转换
基本概念夏时令夏季人为将时间调快一小时,英文为Daylight Saving Time,简称DST
冬令时冬季人为把时针拨回一小时
注意:大多数时候,也会将冬夏令时,统称为夏令时
影响:夏天的时候,中国的北京时间(东八区)与美国太平洋时区(西八区)的时差是15小时,而到了冬天却变成16小时。
各个国家和地区的时区规则,请参见此处的列表 。
实时查询各个国家和地区时间,请参见该网站
官方支持官方包中提供了time.LoadLocation可以完成以上的需求;
1234567891011121314151617const TIME_LAYOUT = "2006-01-02 15:04:05"func parseWithLocation(name string, timeStr string) (time.Time, error) { locat ...
设计分布式锁
设计原则
互斥性。在任意时刻,只有一个客户端持有锁。
不死锁。分布式锁本质上是一个基于租约(Lease)的租借锁,如果客户端获得锁后自身出现异常,锁能够在一段时间后自动释放,资源不会被锁死。
一致性。硬件故障或网络异常等外部问题,以及慢查询、自身缺陷等内部因素都可能导致 Redis 发生高可用切换,replica 提升为新的 master。此时,如果业务对互斥性的要求非常高,锁需要在切换到新的 master 后保持原状态。
设计的六个层次
你只看到了第二层,你把我想成了第一层。实际上,我在第五层。
——芜湖大司马
Redis 实现分布式锁有六个层次,看看大家平常用的分布式锁处在第几个层次。
层次一:12redis.SetNX(ctx, key, "1")defer redis.del(ctx, key)
使用 SetNx 命令,可以解决互斥性的问题,但不能做到不死锁。
层次二:12redis.SetNX(ctx, key, "1", expiration)defer redis.del(ctx, key)
使用 lua 脚本保证 SetN ...
shell实现SSH自动登陆
作为一个工具人,时刻保持着偷懒意识,在类unix系统中,不要浪费了shell这种神奇的工具,让计算机为我们服务~
基础知识,复习一下脚本的运行方式通过文件名执行 ./file_name.sh注:需要执行权限,可通过 sudo chmod +x ./file_name.sh 添加
指定脚本解释器来执行文件 sh file_name.shsh file_name.sh 就是指定了脚本解释器 /bin/sh来解释执行脚本;常见的脚本解释器还有:/bin/bash等,我们可以使用ls -l /bin/*sh命令来查看当前可用的脚本解释器;
使用. ./file_name或source命令执行脚本这种方式不会像前两种方式一样fork一个子进程去执行脚本,而是使用当前shell环境执行。我们不必重启shell或者重新登录系统,就能使当前的更改生效。一般用于 .bashrc或者.bash_profile被修改的时候,
shebang定义:我们写一个shell脚本时,总是习惯在最前面加上一行 #!/binbash,它就是脚本的shebang。
作用:它指示了此脚本运行时的解 ...
Prometheus 使用指南
引言相关概念TSDB:时序数据库 是数据库大家庭中的一员,专门存储随时间变化的数据;
时序 (Time Series) 指的是某个变量随时间变化的所有历史;每个时序由一个名字(Metric)和一组标签 (labels) 标识定义。
样本 (Sample) 指的是历史中该变量的瞬时值;每个样本由时序标识、时间戳(一个毫秒级的 unix 时间戳)、数值 (float64 值) 3 部分构成
时序是如何被定义的?
时序格式每个时序由一个名字(Metric)和一组标签 (labels) 标识定义的。(时序名字本质上就是一个隐藏标签)。
<metric name>{<label name>=<label value>, ...}
12# 该时序的名字为 api_http_requests_total,标签为 path、status、method 和 instanceapi_http_requests_total{path="/users",status=200,method="GET" ...
Redis-客户端
Redis服务器是一对多服务器程序,对于每个与服务器连接的客户端,服务器都为这些客户端建立了相应的redisClient结构,保存了客户端的状态信息。
客户端分类普通客户端Lua脚本的伪客户端AOF文件的伪客户端
客户端通用属性包括下面这些信息:
12345678910111213int flags:套接字描述符robj* name:名字int flags:标志sds querybuf:输入缓冲区robj **argv:命令与命令参数int argc:命令参数的个数struct redisCommand *cmd: 命令的实现函数char buf[]: 固定大小的输出缓冲区,默认16KBint bufpos: 记录buf数组已使用的字节数量authenticated:身份验证标识time_t ctime:创建客户端的时间time_t lastinteraction:客户端与服务器最后一次进行互动的时间time_t obuf_soft_limit_reached_time:输出缓冲区第一次到达软性限制的时间
套接字描述符fd
伪客户端 : fd = -1
普通客户端: f ...
Redis-事件驱动
Redis服务器是一个事件驱动的程序,事件分为两类:文件事件和时间事件。
文件事件和时间事件之间的关系?文件事件和时间事件之间是合作关系,服务器会轮流处理这两种事件,并且处理事件的过程中也不会进行抢占。
为什么作者不使用已有的成熟的事件驱动模型相关库,比如 Libevent 或 Libev?下面从源码入手介绍下 Redis 中封装的 ae 库及其内部机制。
文件事件
是对服务器对套接字操作的抽象。
文件事件处理器
Redis基于Reactor模式开发了自己的网络事件处理器,这个处理器被称为文件事件处理器。
文件事件处理器以单线程方式运行。文件事件处理器使用IO多路复用技术,同时监听多个套接字,并为套接字关联不同的事件处理函数。当套接字的可读或者可写事件触发时,就会调用相应的事件处理函数。
文件事件处理器的构成四个组成部分:socket,I/O多路复用程序,文件事件分派器,以及事件处理器。
每当一个套接字准备好执行连接应答,写入,读取,关闭等操作时,就会产生一个文件事件。尽管多个文件事件可能会并发的出现,但I/O多路复用程序总是将所有产生事件的套接字都 ...
Redis之AOF持久化
当redis server启动时,如果没有开启AOF模式,则加载AOF文件,否则将加载RDB文件。如果redis中数据发生变化,那么不会直接写到硬盘里,而是先写到AOF缓冲区aof_buf中。
AOF定义AOF是append-only file的简称。通过保存Redis服务器所执行的写命令来记录数据库状态。注意:PUBSUB命令和SCRIPT LOAD命令虽然没有修改数据库,但是也会将这两个命令写入AOF文件中。因为,PUBSUB命令行频道的所有订阅者发送消息的行为带有副作用,接收到消息的客户端可能会因此发生改变。同理SCRIPT LOAD命令,它修改了数据库状态,也是一个带有副作用的命令。
相关配置123456789101112131415161718192021# 开启AOF持久化方式appendonly yes# AOF持久化文件名appendfilename appendonly-<port>.aof# 每秒把缓冲区的数据同步到磁盘appendfsync everysec# 数据持久化文件存储目录dir /var/lib/redis# 是否在执行重写时不同步数据 ...
Redis之RDB持久化
定义
RDB 是 Redis 将 server 端的内存中的键值对以二进制的方式,持久化存储的一种文件形式。 文件中,一般会以 对象的长度+对象的格式来存储,只要根据这个格式,就能渐进的遍历整个文件。
Redis 还支持开启 LZF 的压缩算法,可以牺牲 CPU 时间,来减少 RDB 文件的大小;如果开启LZF并且超过20个 bytes 时, 会将压缩后的字符写入文件。
触发方式自动触发Redis通过配置save参数,来触发RDB持久化条件。 默认如下配置:
123save 900 1:表示900 秒内如果至少有 1 个 key 的值变化,则保存save 300 10:表示300 秒内如果至少有 10 个 key 的值变化,则保存save 60 10000:表示60 秒内如果至少有 10000 个 key 的值变化,则保存
手动触发提供了两种命令
save该命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止。
bgsave执行该命令时,Redis会在后台异步进行快照操作,同时还可以响应客户端请求。具体操作是Redis进程执行 ...
Redis-快速列表(quicklist)
前言: quicklist是一个3.2版本之后新增的基础数据结构,是redis自定义的一种复杂数据结构,将ziplist和adlist结合到了一个数据结构中。主要是作为list的基础数据结构。在3.2之前,list是根据元素数量的多少采用ziplist或者adlist作为基础数据结构,3.2之后统一改用quicklist.
定义从数据结构的角度来说quicklist结合了两种数据结构的优缺点,复杂但是实用。通过将每个压缩表用双向链表的方式连接起来,来寻求一种收益最大化。
特点quicklist目的是最大程度减小内存空间占用并保证性能
链表(adlist)在插入、删除节点的时间复杂度很低,但是内存利用率低,且由于内存不连续容易产生内存碎片。利用ziplist减少node数量。
压缩表(ziplist)内存连续,存储效率高;但是插入和删除的成本太高,需要频繁的进行数据搬移、释放或申请内存。为避免长度较长的ziplist修改时带来的内存拷贝开销,通过配置项配置合理的ziplist长度。
核心数据结构quicklistquicklistNode实际上就是对ziplist的进一步封装,q ...
Redis-对象系统(redisObject)
Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象,而每种对象又通过不同的编码映射到不同的底层数据结构。
查看redis内部数据结构实现
127.0.0.1:6379> lpush lst 123 456
(integer) 2
127.0.0.1:6379> object encoding lst
"quicklist"
引言
字符串:sds
列表:quicklist注:在3.2之前,list是根据元素数量的多少采用ziplist或者adlist作为基础数据结构,3.2之后统一改用quicklist
哈希: ziplist、dict(数量多or元素长)
集合:intset(当集合元素都是整数且元素数量不多时使用),dict
有序集合:ziplist、skiplist
对象系统对象定义12345678#define LRU_BITS 24typedef struct redisObject { uns ...