美文网首页
2.1 Redis数据类型以及持久化

2.1 Redis数据类型以及持久化

作者: MelodyOf流沙 | 来源:发表于2021-03-15 18:42 被阅读0次

    数据类型

    • String 字符串类型,值最大可存储512MB(底层采用SDS实现)
    struct sdshdr{
         //记录buf数组中已使用字节的数量
         //等于 SDS 保存字符串的长度
         int len;
         //记录 buf 数组中未使用字节的数量
         int free;
         //字节数组,用于保存字符串
         char buf[];
    }
    
    • Hash 对应key field value,常用于存储对象信息。对于v值较小的情况下,hash底层结构由ziplist数据结构支撑,v值较大的情况下,使用dict字典结构进行支撑。
    typedf struct dict{
        dictType *type;//类型特定函数,包括一些自定义函数,这些函数使得key和
                       //value能够存储
        void *private;//私有数据
        dictht ht[2];//两张hash表 
        int rehashidx;//rehash索引,字典没有进行rehash时,此值为-1
        unsigned long iterators; //正在迭代的迭代器数量
    }dict;
    
    • List 可以保存重复元素,使用场景可用于朋友圈等。底层实现结构有:ziplist,quicklist, linkedList


      redis-list底层结构.png
    • Set 集合,所有元素保持唯一性,无序,可用于求交集,并集等,场景可用在粉丝,共同关注等。底层数据结构是,当数据量不大,且value都为整数时,使用intset进行存储;其他情况使用dict进行存储.

    typedef struct intset {
     
        // 编码方式
        uint32_t encoding;
     
        // 集合包含的元素数量
        uint32_t length;
     
        // 保存元素的数组
        int8_t contents[];
     
    } intset;
    
    • ZSet 有序集合,和set的区别是,集合中每个元素都会对应一个double的分数,这个分数的作用是为了进行排序.场景用在排行榜。底层数据结构是,当数据较小时(元素个数小于128个,元素总大小小于64字节时)使用ziplist,其他情况使用skiplist(跳表).


      skiplist数据结构.png
    • Bitmap/Geo
    skiplist和红黑树和avl之间对比
    • 红黑树插入删除效率远远高于avl,红黑树只需要最多旋转3次即可完成插入删除。而avl为了平衡树,旋转次数可能远远大于3次。而对于查询而言,红黑树可能比avl会多一层高,因此查询速度不如avl,但基本可以忽略不计。所以大部分的程序实现都采用了红黑树而非avl,比如linux的进程管理,epool的文件管理等实现。
    • 跳表和红黑树之间做对比,跳表由于叶子节点都前后连接,所以支持范围查询;跳表实现比红黑树实现简单;跳表的插入删除和查询效率和红黑树之间区别不大,都可计算为O(logn)


      image.png

    持久化

    RDB

    全量备份,备份数据非语句。bgsave会新开一个进程进行备份生成rdb文件。系统可配置自动备份时间,并提供压缩文件。

    • RDB 方式数据没办法做到实时持久化/秒级持久化,也就造成会有部分时间的数据丢失
    • 如果数据量太大,fork子进程时可能会阻塞系统。
    AOF

    与RDB存储某个时刻的快照不同,AOF持久化方式会记录客户端对服务器的每一次写操作命令到日志当中,并将这些写操作以 Redis协议追加保存到以后缀为aof文件末尾

    • 相同数据量下,AOF的文件通常体积会比RDB大。因为AOF是存指令的,而RDB是所有指令的结果快照。但AOF在日志重写后会压缩一些空间。
    • 在大量写入和载入的时候,AOF的效率会比RDB低。因为大量写入,AOF会执行更多的保存命令,载入的时候也需要大量的重执行命令来得到最后的结果。 RDB对此更有优势。

    Nosql对比

    • Memcached 单个key存储小
    • Mongodb 支持索引,数据量存储大
    • Redis 并发高,原子操作,支持持久化,自带集群,单线程

    相关文章

      网友评论

          本文标题:2.1 Redis数据类型以及持久化

          本文链接:https://www.haomeiwen.com/subject/yftkcltx.html