Redis基础知识

  • 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;

底层原理并不只是为了找工作面试用,更多的是拓宽了我们的眼界,在遇到问题时多了一种可供选择的方案,不断拓展我们的知识面,才能在解决问题的时候做到厚积薄发 !

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值