-
redis是nosql(巨大的内存map) 单线程(避免资源竞争,切换),耗时操作会导致卡顿
-
redis的持久化方式:RDB(默认)和AOF,异步写入硬盘
-
RDB持久化原理:通过bgsave命令触发,然后父进程执行fork操作创建子进程,子进程创建RDB文件,根据父进程内存生成临时快照文件,完成后对原有文件进行原子替换(定时一次性将所有数据进行快照生成一份副本存储在硬盘中)【生成快照,对比替换】
优点:是一个紧凑压缩的二进制文件,Redis加载RDB恢复数据远远快于AOF的方式。
缺点:由于每次生成RDB开销较大,非实时持久化, -
AOF持久化原理:开启后,Redis每执行一个修改数据的命令,都会把这个命令添加到AOF文件中。【保存操作记录】
优点:实时持久化。
缺点:所以AOF文件体积逐渐变大,需要定期执行重写操作来降低文件体积,加载慢
-
-
内存淘汰策略:在Redis的用于缓存的内存不足时,怎么处理新写入操作。
- noeviction:报错。
- allkeys-lru:在键空间中,移除最近最少使用的key。
- allkeys-random:在键空间中,随机移除某个key。
- 过期时间:
- volatile-lru:在过期键空间中,移除最近最少使用的key。
- volatile-random:在过期键空间中,随机移除某个key。
- volatile-ttl:在过期键空间中,有更早过期时间的key优先移除。
-
处理“一次写入过多”:集群,限流
-
redisObject:
{
type, //数据类型,String, Hash, List(双向链表), Set, Store Set
encoding, //编码方式,raw, int, hashtable, likedlist, ziplist, zipmap, intset
lru, //
ptr, //数据指针
vm, //虚拟内存
... //其他
}
typedef struct redisObject {
unsigned type:4;//类型, 字符串、列表、集合、有序集合、字典
unsigned encoding:4;//编码,标识底层数据结构,
unsigned lru:LRU_BITS; //最近一次被访问的时间,长时间不被访问的对象可被内存回收
int refcount;//引用计数,用于对象内存回收。事实上,redis会初始化创建0到9999个整数对象用于共享,从而节约内存操作
void *ptr;//指向底层数据结构实例的指针
} robj;
- 数据类型:
-
List:由双向链表实现。Redis的内部缓冲队列使用该结构
-
hash:由dict实现。内部存储的key对应的value是一个map。通过key + field来操作数据。
-
Set:由value为null的HashMap实现。计算hash值来查重。
-
Sorted Set:由HashMap+SkipList(在有序链表的基础上发展而来)实现。HashMap存放成员到score的映射,SkipList存放所有的成员。根据score排序。从SkipList查找比从HashMap查找快【跳表比平衡树实现简单】
-
多层链表:每两个节点多加一个指针,指向下下个节点,生成两层链表。利用有序的性质,查找时间可以节约一半。在两层链表的基础上,每隔三个节点再多加一个指针下一个这种节点,这便是三成链表(各个节点所含指针个数是1:2:3循环)。
-
skiplist借鉴了多层链表的思想。由于插入和删除会破坏各层节点指针的比例。插入节点时,随机生成层数。
-
与平衡树(AVL、红黑树)比skiplist有如下优点:
- 占用内存少。通过调节概率p,可以使每个节点的平均指针数发生变化,redis中为1.33,而二叉树每个节点都有两个指针。
- ZRANGE or ZREVRANGE等范围查询更简单。Skiplist可以看作特殊的双向链表,只需找到范围中的最小节点,顺序遍历即可,而平衡树找到范围中的最小节点,仍需中序遍历。
- 实现和调试简单。
-
//跳表节点
typedef struct zskiplistNode {
int key;
int value;
struct zskiplistLevel {
struct zskiplistNode *forward;
} level[1];
} zskiplistNode;
//跳表
typedef struct zskiplist {
struct zskiplistNode *header, *tail;
unsigned long length;
int level;
} zskiplist;
底层原理并不只是为了找工作面试用,更多的是拓宽了我们的眼界,在遇到问题时多了一种可供选择的方案,不断拓展我们的知识面,才能在解决问题的时候做到厚积薄发 !