0%

缓存一直是线上系统不可或缺的部分,本文总结了缓存系统中需要关注的一些问题

阅读全文 »

使用redis-benchmark工具对redis集群进行压测

redis-benchmark工具对于redis cluster支持并是不特别好,需要使用{tag}来写入指定node,相关用法在这pr中。

但是使用{tag}测试后不好删除数据,并且根据业务需要,关注的是单Hash单Node下的性能表现,所以最后测试时,直接连接了测试key所在的node,避免了事后清除数据的麻烦。

根据测试结果,可以看出,使用Pipeline的情况下Redis吞吐量能提升一倍有余

在不使用pipeline的情况下猜测是网络开销占用了过多CPU,但具体是iowait还是其他因素造成仍需分析

此外AWS在Redis7/7.1上支持了(增强型IO多路复用)[https://docs.aws.amazon.com/zh_cn/AmazonElastiCache/latest/red-ug/supported-engine-versions.html#redis-version-7.0]可以很大程度上增强多客户端连接时的性能。

阅读全文 »

在项目的 settings 中 github pages 可以通过根目录或docs目录部署。但是这种方式不够灵活,对于一些前段项目,需要不停的通过CI生成站点文件,提交到git中再部署,git中存储了许多构建产物,显得冗余臃肿。

实际上,github也支持通过actions来部署pages,不需要将站点文件储存在git中。

阅读全文 »

SELECT

在ddb中,推荐使用双引号标记表名,列名,使用单引号标记字符串

1
2
3
SELECT *
FROM "TableName"
WHERE primary_key = '';

可以在语句中使用order by等语句

1
2
3
SELECT "column1", "column2"
FROM "TableName"
WHERE primary_key = 'key1' AND range_key = 123 ORDER BY range_key DESC;

也可以使用CAST等函数

1
2
SELECT CAST(column_name AS INT)
FROM "TableName";

UPDATE

update时要注意column_name是否存在,由于ddb类似于nosql的特性,如果对原本不存在的column赋值会导致在原本数据中新增一个字段

(虽然一般不会造成额外影响,但还是需要尽量避免)

1
2
3
UPDATE "TableName"
SET column_name = 1710133352
WHERE primary_key = 'key1' AND range_key = 123;

在使用单实例Redis时, 我们可以使用./redis-cli -h redis_ip -p redis 6379 --ldb --eval script.lua somekey , arg1 arg2命令轻松的进入debug模式调试lua脚本
在正常情况下, 进入debug模式后可以使用一系列命令来执行控制脚本的执行, 使用help命令应该可以看到如下界面

阅读全文 »

在使用Redis时, 通常会使用EXPIRE, PEXPIRE系列函数设置生存时间, 当需要获取超时时间时使用TTL, PTTL获取剩余的生存时间。

同样的, 还可以使用EXPIREAT, PEXPIREAT以unix timestamp格式设置超时时间点, 但需要注意的是, Redis 7.0 之前没有函数能获取设置timestamp, 只能使用TTL, PTTL获取剩余的生存时间。

在实际使用中, 经常需要比较新旧生存周期的大小来决定是否更新数据, 如果你很幸运的使用7.0及之后的版本, 可以使用EXPIREAT, PEXPIREAT配合GT参数来设置过期时间, 如果新的过期时间小于已有过期时间, 则会返回0

那么老版本的Redis该如何实现这种功能呢?

阅读全文 »

在terraform中,常见的输出json字符串或创建json文件的手段是使用流式标记, 如下代码所示:

1
2
3
4
5
6
7
8
9
10
11
12
resource "user" "admin" {
name = "admin"
}

resource "service" "portal" {
permission = <<DATA
{
"user": "${user.admin.name}"
"permission": "*"
}
DATA
}

但是这样的写法不仅繁琐,也容易出错,由于字符串中夹杂大量的变量引用,DATA标记中间的内容很难提供语法检查
常见的错误包括:

  • 最后一个元素不能带逗号
  • 引号及括号没有闭合
  • 夹杂中文字符

并且这些错误属于json语法问题,在terraform plan甚至apply期间是无法发现的,等到resource部署之后才被发现,可能会造成无法挽回的结果。

上述代码的json中便缺失一个逗号,读者是否有看出来呢?

为了解决这些问题,建议大家使用jsonencode函数代替直接编写字符串,得益于tf在语法上的良好兼容,从json迁移到jsonencode并不需要多少工作。

例如上述代码使用jsonencode可以简单的写成如下形式

1
2
3
4
5
6
7
8
9
10
resource "user" "admin" {
name = "admin"
}

resource "service" "portal" {
permission = jsonencode({
"user": "${user.admin.name}",
"permission": "*"
})
}

可以看到几乎就是简单的使用jsonencode讲原来的内容包了起来。

更进一步的,可以整理成如下形式

1
2
3
4
5
6
resource "service" "portal" {
permission = jsonencode({
user: user.admin.name,
permission: "*",
})
}

或者

1
2
3
4
5
6
resource "service" "portal" {
permission = jsonencode({
user = user.admin.name
permission = "*"
})
}

由于tf语法对逗号非常宽容,因此不论写不写逗号都不会影响输出的json,同时就算有语法错误,在plan阶段也可以轻易发现,还能少写很多引号。

因此推荐大家在输出json时都使用这种方法。

安装acme

1
curl https://get.acme.sh | sh -s [email protected]

使用阿里云dns认证方式

文档: https://github.com/acmesh-official/acme.sh/wiki/dnsapi

1
2
3
export Ali_Key="xxxxxxxxxxxxxxxx"
export Ali_Secret="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
acme.sh --issue --dns dns_ali -d your.domain.com

安装密钥

1
acme.sh --install-cert -d your.domain.com --key-file /etc/nginx/your.domain.com.key --fullchain-file /etc/nginx/your.domain.com.pem --reloadcmd "sudo systemctl restart nginx"

在复制表时,可以使用CREATE-SELECT来同时复制表结构和数据

1
CREATE TABLE new_table SELECT  * FROM old_table;

但这样做实际上是有问题的

原因在于,CREATE-SELECT在创建新表时仅复制了字段类型,但是不会设置主键子增等属性。

因此,在复制表时,最好还是使用CREATE-LIKE和INSERT来复制

1
2
3
CREATE TABLE new_table LIKE old_table;

INSERT INTO new_table SELECT * FROM old_table;