可以⽤来保存地理位置,并作位置距离计算或者根据半径计算位置等。实现附近的⼈,或者计算最优地
图路径。GeoHash算法将⼆维经纬度映射成⼀维的整数。把整个地球看成是⼀个⼆维的平⾯,然后把这
个平⾯不断地等分成⼀个⼀个⼩的⽅格,每⼀个 坐标元素都位于其中的 唯⼀⼀个⽅格 中,等分之后的
⽅格越⼩,那么坐标也就 越精确,把每⼀个⽅格编码为52位的整数放到zset⾥⾯,通过权值来获得附近
的⼈。
pub/sub
功能是订阅发布功能,可以⽤作简单的消息队列。
Redis中set和zset的区别
set是Redis下的⽆序集合对象,是通过hashtable编码实现。
zset是Redis下的有序集合对象,是通过ziplist或者zskiplist编码实现。
ziplist编码的有序集合对象使⽤压缩列表作为底层实现,每个集合元素使⽤两个紧挨在⼀起的压缩列表节点来保
存,第⼀个节点保存元素的成员,第⼆个节点则保存元素的分值。对于skiplist编码实现,它同时内部包含⼀个字典
和跳跃表,程序都可以⽤O(log(N))的复杂度往集合中添加成员,并可以⽤O(1)的复杂度查找给定成员的分值。
SDS相对于C语⾔字符串具有哪些优点
1. O(1)时间复杂度获取字符串⻓度
2. 空间不⾜时会⾃动扩充,防⽌缓存区溢出。
3. 采⽤空间预分配和惰性空间释放策略减少修改字符串时带来的内存重分配次数。
4. ⼆进制安全, C字符串中的字符必须符合某种编码,对于图⽚、⾳频等信息⽆法保存,sds是⼆进制安全的,
写⼊什么读取就是什么
5. 可以兼容部分的C字符串函数。
Redis为什么⽤skiplist⽽不⽤红⿊树?
跳表的插⼊、删除、查找操作时间复杂度和红⿊树是⼀样的,都是 O(logn)。但是跳表的范围查找⽐红⿊树⾼
效。
跳表的实现⾮常灵活,可以通过改变索引构建策略,有效平衡执⾏效率和内存消耗。
跳表实现起来⽐红⿊树来说要简单。我们为了代码的简单、易读,⽐起红⿊树,我们更倾向⽤跳表。
字典是如何实现的?
Redis 中的字典相当于 Java 中的 HashMap,内部实现也差不多类似,都是通过 "数组 + 链表" 的 链地址法 来解决
部分 哈希冲突,同时这样的结构也吸收了两种不同数据结构的优点。
字典结构内部包含 两个 hashtable,通常情况下只有⼀个 hashtable 有值,但是在字典扩容缩容时,需要分配新的
hashtable,然后进⾏ 渐进式搬迁 (rehash),这时候两个 hashtable 分别存储旧的和新的 hashtable,待搬迁结束
后,旧的将被删除,新的 hashtable 取⽽代之。
评论1