有口碑的郑州网站建设,做网站的策划需要做什么,做融资的网站有哪些,公司网站设计 杭州 推荐刚写了redis主要的数据结构#xff1a;
动态字符串、双端链表、字典、压缩列表、整数集合、跳表等
redis肯定不能直接使用这些数据结构来实现数据库#xff0c;它用这些数据库建立了一个对象系统#xff0c;包含#xff1a;
字符串对象、列表对象、哈希对象、集合对象、…刚写了redis主要的数据结构
动态字符串、双端链表、字典、压缩列表、整数集合、跳表等
redis肯定不能直接使用这些数据结构来实现数据库它用这些数据库建立了一个对象系统包含
字符串对象、列表对象、哈希对象、集合对象、有序集合对象
我们可以针对不同的使用场景为对象设置多种分不同的数据结构实现从而优化对象在不同场景下的效率。
键值对
对于redis的键值对来说key只有字符串类型而v可以是各种类型
我们习惯把“这个键所对应的值是一个列表”表达为这是一个“列表键。
TYPE 命令的实现方式也与此类似 当我们对一个数据库键执行 TYPE 命令时 命令返回的结果为数据库键对应的值对象的类型 而不是键对象的类型
# 键为字符串对象值为列表对象redis RPUSH numbers 1 3 5
(integer) 6redis TYPE numbers
list
对象
我们看一下redis对象的组成
typedef struct redisObject {// 类型unsigned type:4;// 编码unsigned encoding:4;// 指向底层实现数据结构的指针void *ptr;// ...
} robj;
通过 encoding 属性来设定对象所使用的编码 而不是为特定类型的对象关联一种固定的编码 极大地提升了 Redis 的灵活性和效率 因为 Redis 可以根据不同的使用场景来为一个对象设置不同的编码 从而优化对象在某一场景下的效率。
字符串对象
字符串对象的编码可以是 int 、 raw 或者 embstr 。
如果一个字符串对象保存的是整数值 并且这个整数值可以用 long 类型来表示 那么字符串对象会将整数值保存在字符串对象结构的 ptr属性里面将 void* 转换成 long 并将字符串对象的编码设置为 int 。
如果字符串对象保存的是一个字符串值 并且这个字符串值的长度大于 39 字节 那么字符串对象将使用一个简单动态字符串SDS来保存这个字符串值 并将对象的编码设置为 raw 。
如果字符串对象保存的是一个字符串值 并且这个字符串值的长度小于等于 39 字节 那么字符串对象将使用 embstr 编码的方式来保存这个字符串值。
embstr 编码是专门用于保存短字符串的一种优化编码方式 这种编码和 raw 编码一样 都使用 redisObject 结构和 sdshdr 结构来表示字符串对象但 raw 编码会调用两次内存分配函数来分别创建 redisObject 结构和 sdshdr 结构而 embstr 编码则通过调用一次内存分配函数来分配一块连续的空间 空间中依次包含 redisObject 和 sdshdr 两个结构。 embstr 编码有以下好处
embstr 编码创建删除字符串对象只需操作一次内存因为数据都保存在一块连续的内存 所以这种编码的字符串对象比 raw 编码字符串对象能更好地利用缓存带来的优势。
列表对象
列表对象的编码可以是 ziplist 或者 linkedlist 。
当列表对象可以同时满足以下两个条件时 列表对象使用 ziplist 编码
列表对象保存的所有字符串元素的长度都小于 64 字节列表对象保存的元素数量小于 512 个
不能满足这两个条件的列表对象需要使用 linkedlist 编码。
哈希对象
哈希对象的编码可以是 ziplist 或者 hashtable 。
当哈希对象可以同时满足以下两个条件时 哈希对象使用 ziplist 编码
哈希对象保存的所有键值对的键和值的字符串长度都小于 64 字节哈希对象保存的键值对数量小于 512 个
不能满足这两个条件的哈希对象需要使用 hashtable 编码。
集合对象
集合对象的编码可以是 intset 或者 hashtable 。
当集合对象可以同时满足以下两个条件时 对象使用 intset 编码
集合对象保存的所有元素都是整数值集合对象保存的元素数量不超过 512 个
不能满足这两个条件的集合对象需要使用 hashtable 编码。
有序集合对象
有序集合的编码可以是 ziplist 或者 skiplist 。
当有序集合对象可以同时满足以下两个条件时 对象使用 ziplist 编码
有序集合保存的元素数量小于 128 个有序集合保存的所有元素成员的长度都小于 64 字节
不能满足以上两个条件的有序集合对象将使用 skiplist 编码。
这里多说两句各个语言的对象其实都差不多底层实现也就那几个比如java中的容器c的STL。java的hashset就是一个哈希而已hashmap就是k带了一个v而”有序的“Treemap使用了红黑树这种有平衡性的搜索二叉树。
redis的有序集合并没有再采取hash红黑树的操作而是把平衡树换成了跳表实际上性能真的没差多少甚至有时比红黑树有优势比如跳表的性能较为平均红黑树攒了很多次不平衡要调整可能会带来资源需求的一个高峰再加上跳表实现简单的优点红黑树真的没什么优势。
并且就算是真的想用一种带平衡性的搜索树现在竞赛也是用的华人之光发明的SB树。
有序集合的优点就是它的有序操作比如拿最大最小值红黑树时间o(logN),而哈希表只能一个一个遍历。缺点在于插入一个值的时间也是o(logN),跳表也是。而哈希表插入数是o(1).
要了解底层和这些优缺点