痕无落


  • 首页

  • 归档

  • 标签

一次 Dead Lock 事件的处理

发表于 2019-02-25
表结构12345678CREATE TABLE `group_works` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `group` varchar(50) NOT NULL, `work` varchar(50) NOT NULL, ...
阅读全文 »

Go MySQL SELECT @@max_allowed_packet

发表于 2019-02-25

SELECT @@max_allowed_packet

我们使用的是 阿里云的 RDS, 它提供了很棒的数据库优化服务,可以定期观察,清理一些慢查询。

在 慢SQL明细 里面, 发现最近一周有不少的 SQL :

1
SELECT @@max_allowed_packet
阅读全文 »

sqlcipher 解密微信 db 错误

发表于 2018-12-13

在使用 sqlcipher 解密微信 db 时, 出错

1
sqlcipher error file is not a database

原因是 sqlcipher 的版本和 加密的微信 db 版本不兼容

因为 我通过 brew install sqlcipher 安装的是 最新的 v4.0.0
解决方案是 安装 v3.x.x 版本的, 于是通过源代码的方式生成

阅读全文 »

锁相关知识

发表于 2017-09-05

悲观锁

悲观锁并发控制实际上是 先取锁再访问 的保守策略,指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理) 修改保持保守态度(悲观),因此在整个数据处理过程中,将数据处于锁定状态。

阅读全文 »

关于PHP, 我学到了什么

发表于 2017-08-22 | 分类于 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 文件都加载在一起,那么自动类加载是如何做到的呢?

主要需要做两件事:

  1. spl_autoload_register 注册一个解析 class 名的函数
  2. 根据 class 名找到对应的 php 文件并调用 require
阅读全文 »

golang 的分片

发表于 2017-08-20 | 分类于 golang

与数组的区别

  • 数组是固定长度的,而分片确实可动态增长的,以定义为例:
1
2
3
4
5
// 定义数组, 一定要指定长度
var names [5]string

// 定义分片, 不需要指定长度
var names []string
  • 在函数调用时, 数组是值传递,而分片是引用传递

其实对于 golang 来讲,函数调用的时候都是值传递,拷贝一个副本, 之所以表现为值传递和引用传递,在于一个拷贝的是数据值,另一个拷贝的是数据指针,两个指针值指向的是同一个内存地址。

阅读全文 »

字典【Redis 设计与实现】

发表于 2017-08-18 | 分类于 redis

内部实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
typedef struct dictEntry {
void *key;
union {
void *val;
uint64_t u64;
int64_t s64;
double d;
} v;
struct dictEntry *next;
} dictEntry;

typedef struct dictType {
unsigned int (*hashFunction)(const void *key);
void *(*keyDup)(void *privdata, const void *key);
void *(*valDup)(void *privdata, const void *obj);
int (*keyCompare)(void *privdata, const void *key1, const void *key2);
void (*keyDestructor)(void *privdata, void *key);
void (*valDestructor)(void *privdata, void *obj);
} dictType;

/* This is our hash table structure. Every dictionary has two of this as we
* implement incremental rehashing, for the old to the new table. */
typedef struct dictht {
dictEntry **table;
unsigned long size;
unsigned long sizemask;
unsigned long used;
} dictht;

typedef struct dict {
dictType *type;
void *privdata;
dictht ht[2];
long rehashidx; /* rehashing not in progress if rehashidx == -1 */
int iterators; /* number of iterators currently running */
} dict;

结构示意图:

redis-dict

阅读全文 »

简单动态字符串 (SDS)【Redis 设计与实现】

发表于 2017-08-16 | 分类于 redis

内部实现

1
2
3
4
5
struct sdshdr {
len int; // 所保存的字符串长度
free int; // 未使用的字节长度
char buf[]; // 字节数组,用于保存字符串
}

c 字符串通常是以空字符 ‘\0’ 结尾,所以一个 SDS 的长度为: len + free + 1

与 c 字符串的区别

类型 c 字符串 SDS
获取字符串长度 O(N) O(1)
是非 API 安全 存在缓冲区溢出风险 API 安全,无缓冲区溢出
是否二进制安全 非二进制安全 二进制安全
修改字符串导致内存分配 每次重新分配 N 次修改最多 N 次分配
是否兼容 <string.h> 标准库 完全兼容 部分兼容
阅读全文 »

使用travis-ci自动构建你的Github主页

发表于 2017-07-29

之前使用 hexo 搭建自己的Github pages, 配置了很久的 next 主题, 写了一段时间的文章,感觉棒棒的。 但是后面换了电脑,忘记备份数据,所有的markdown文件也没有push到Github上,因为这些原因我就没有写过了。
最近打算重新拾起写文章记录的习惯,因为只有不断的总结才能更好的理解学习。考虑到之前遇到的问题,加上有过gitlab ci的使用经验,决定使用 travis-ci 自动构建github主页。

阅读全文 »

Mac OS gem install 问题

发表于 2017-07-28 | 分类于 MacOS

在使用gem install travis时出错:

1
ERROR:  You must add /O=Digital Signature Trust Co./CN=DST Root CA X3 to your local trusted store
阅读全文 »
12…4
wangming

wangming

做一个高产的程序员

37 日志
5 分类
28 标签
GitHub 微博
© 2015 - 2019 wangming
由 Hexo 强力驱动
主题 - NexT.Pisces