Go MySQL SELECT @@max_allowed_packet
SELECT @@max_allowed_packet
我们使用的是 阿里云的 RDS, 它提供了很棒的数据库优化服务,可以定期观察,清理一些慢查询。
在 慢SQL明细
里面, 发现最近一周有不少的 SQL :
1 | SELECT @@max_allowed_packet |
sqlcipher 解密微信 db 错误
在使用 sqlcipher
解密微信 db 时, 出错
1 | sqlcipher error file is not a database |
原因是 sqlcipher
的版本和 加密的微信 db 版本不兼容
因为 我通过 brew install sqlcipher
安装的是 最新的 v4.0.0
解决方案是 安装 v3.x.x
版本的, 于是通过源代码的方式生成
锁相关知识
悲观锁
悲观锁并发控制实际上是 先取锁再访问 的保守策略,指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理) 修改保持保守态度(悲观),因此在整个数据处理过程中,将数据处于锁定状态。
关于PHP, 我学到了什么
自动类加载 (auto-load)
自动类加载说白了就是自动 include
/ require
php 文件,这里以: Aliyun_Log_Client
为例说明。
如果想使用 Aliyun_Log_Client
这个类, 需要先 :
1 | require_once('aliyun/Aliyun/Log/Client.php'); |
这里你不仅需要手动 require
, 还需要知道 php
文件的相对位置。
但是如果实现了自动类加载呢, 你只需要
1 | use Aliyun_Log_Client; |
我们知道 PHP
执行的本质还是需要将依赖的 php
文件都加载在一起,那么自动类加载是如何做到的呢?
主要需要做两件事:
spl_autoload_register
注册一个解析class
名的函数- 根据
class
名找到对应的php
文件并调用require
golang 的分片
与数组的区别
- 数组是固定长度的,而分片确实可动态增长的,以定义为例:
1 | // 定义数组, 一定要指定长度 |
- 在函数调用时, 数组是值传递,而分片是引用传递
其实对于 golang
来讲,函数调用的时候都是值传递,拷贝一个副本, 之所以表现为值传递和引用传递,在于一个拷贝的是数据值,另一个拷贝的是数据指针,两个指针值指向的是同一个内存地址。
字典【Redis 设计与实现】
内部实现
1 | typedef struct dictEntry { |
结构示意图:
简单动态字符串 (SDS)【Redis 设计与实现】
内部实现
1 | struct sdshdr { |
c 字符串通常是以空字符 ‘\0’ 结尾,所以一个 SDS 的长度为: len + free + 1
与 c 字符串的区别
类型 | c 字符串 | SDS |
---|---|---|
获取字符串长度 | O(N) | O(1) |
是非 API 安全 | 存在缓冲区溢出风险 | API 安全,无缓冲区溢出 |
是否二进制安全 | 非二进制安全 | 二进制安全 |
修改字符串导致内存分配 | 每次重新分配 | N 次修改最多 N 次分配 |
是否兼容 <string.h> 标准库 | 完全兼容 | 部分兼容 |
使用travis-ci自动构建你的Github主页
之前使用 hexo 搭建自己的Github pages, 配置了很久的 next 主题, 写了一段时间的文章,感觉棒棒的。 但是后面换了电脑,忘记备份数据,所有的markdown文件也没有push到Github上,因为这些原因我就没有写过了。
最近打算重新拾起写文章记录的习惯,因为只有不断的总结才能更好的理解学习。考虑到之前遇到的问题,加上有过gitlab ci的使用经验,决定使用 travis-ci 自动构建github主页。
Mac OS gem install 问题
在使用gem install travis
时出错:
1 | ERROR: You must add /O=Digital Signature Trust Co./CN=DST Root CA X3 to your local trusted store |