2.1 Redis数据类型以及持久化

数据类型

  • 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 并发高,原子操作,支持持久化,自带集群,单线程
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容