完全复制

  • 第一步是同步
    1)从服务器向主服务器发送SYNC命令。
    2)收到SYNC命令的主服务器执行BGSAVE命令,在后台生成一个RDB文件,并使用一个缓冲区记录从现在开始执行的所有写命令。
    3)BGSAVE命令执行完毕后,将生成的RDB文件传输给从服务器,从服务器接收到开始更新。
    4)主服务器将记录在缓冲区的所有写命令发送给从服务器,从服务器状态更新。
    如下图示例所示:
  • 命令传播
    主服务器将更改服务器状态的命令发送给从服务器。
    Read more »

对象类型和编码

在redis中,并没有使用之前学到的数据结构来直接构建数据库,而是基于这些数据结构构建了一个对象系统,这个系统包含了字符串对象,列表对象,哈希对象,集合对象和有序集合对象五种类型。

Read more »

服务端数据库

redis中将所有的数据库信息保存在redisServer结构体中,结构体中的变量有两百多个,这里就不写了。
主要的结构成员是:

1
2
3
struct redisServer{
redisDb* db;
};
Read more »

Redis常用数据结构和使用场景(Zset中跳表数据结构)

缓存击穿 缓存穿透 缓存雪崩

  1. 缓存击穿:
    访问一个缓存和数据库都不存在的 key,此时会直接打到数据库上,并且查不到数据,没法写缓存,所以下一次同样会打到数据库上。
    此时,缓存起不到作用,请求每次都会走到数据库,流量大时数据库可能会被打挂。此时缓存就好像被“穿透”了一样,起不到任何作用。
    Read more »

基本结构

数据结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
typedef struct zskiplistNode {
//成员对象
robj *obj;
//分值
double score;
//后退指针
struct zskiplistNode *backward;
struct zskiplistLevel {
//前进指针
struct zskiplistNode *forward;
//跨度
unsigned int span;
} level[];
} zskiplistNode;

typedef struct zskiplist {
struct zskiplistNode *header, *tail;
unsigned long length;
int level;
} zskiplist;
Read more »

3.0哈希表

下面是哈希表结构:

1
2
3
4
5
6
7
8
/* 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;
Read more »

使用vim 修改了/etc/sudoers 下的sudoers,导致无法鉴权。

这两天在嵌入式linux上搞网络编程,发现ubuntu设置的防火墙把端口屏蔽了,想手动打开,普通用户提权的时候不小心用vim修改了

1
/etc/sudoers
Read more »

CAS原子操作

CAS英文全称Compare & Set(Swap),也就是原子操作,执行过程中不能被中断,在X86中有相应的汇编指令CMPCHG来实现。
CAS机制当中使用了3个基本操作数:内存地址V,旧的预期值A,要修改的新值B。
更新一个变量的时候,只有当变量的预期值A和内存地址V当中的实际值相同时,才会将内存地址V对应的值修改为B。

Read more »

ICMP

ping 基于ICMP协议,ICMP 主要的功能包括:确认 IP 包是否成功送达目标地址、报告发送过程中 IP 包被废弃的原因和改善网络设置等。
ICMP报文格式如下,封装在IP包里面,工作在网络层:

Read more »