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

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

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

对象类型和编码

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

Read more »

服务端数据库

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

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

Raft算法

  1. 基本概念
    在任何时刻,服务器节点都处于三个状态之一:leader、follower或者candidate。
  • follwer:不会发送任何请求,只相应leader和candidate的请求;
  • leader:处理所有客户端请求,如果一个可会断和follower通信,那么follower会重定向给leader;
  • candidate:用来选举新leader。
    下图展示了上面三种状态的转换:
    Read more »

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

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

1
/etc/sudoers
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 »

CAS原子操作

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

Read more »

B树

B-tree树即B树,B即Balanced,平衡的意思。因为B树的原英文名称为B-tree,而国内很多人喜欢把B-tree译作B-树,其实,这是个非常不好的直译,很容易让人产生误解。如人们可能会以为B-树是一种树,而B树又是另一种树。而事实上是,B-tree就是指的B树。
B树的定义如下:

  • 定义任意非叶子结点最多只有M个儿子,且M>2;
  • 根结点的儿子数为[2, M];
  • 除根结点以外的非叶子结点的儿子数为[M/2, M],向上取整;
  • 非叶子结点的关键字个数=儿子数-1;
  • 所有叶子结点位于同一层;
  • k个关键字把节点拆成k+1段,分别指向k+1个儿子,同时满足查找树的大小关系。
    Read more »

SSL/TLS

  1. 基本流程
  • 客户端想服务端索要并验证公钥。
  • 双方协商生成对话密钥。
  • 双方采用对话密钥进行加密通信。
    Read more »