数据类型
- 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 并发高,原子操作,支持持久化,自带集群,单线程
网友评论