Skip List 的应用
首先这里是 skip list 的介绍。
Redis Sorted Set
之前用 Redis 的 Sorted Set 存在线用户。
# key, score, member
$redis.zadd('online-users', Time.now.to_i, current_user.id)
查询某用户最后访问的时间
last_seen = $redis.zscore("online-users", self.id)
ZADD 的复杂度是 O(log(N)),ZSCORE 的复杂度是 O(1)。
ZSET 是由一个 dict 和 skip list 实现的。dict 是一个根据 member 生成的哈希表,所以 ZSCORE 的复杂度是 O(1),ZADD 还需插入到 skip list 里所以需要 O(log(N))。
这个 skip list 是根据 score 排序的,所以根据 score 找 member 的复杂度是 O(log(N)),用于 ZRANK 等命令。
倒排索引
前几天在公司听了搜索的分享,才知道这个东西。 维基百科
比如有两个到排索引,一个是“五角场”,另外一个是“火锅”。那在搜索“五角场 火锅”的时候就要合并这两条链,找出两条链上相同的节点。
如果是普通的链表的话,效率是 O(M + N)。skip list 在合并时,如果另外那个表跳跃过去的节点仍然小于当前表的节点,中间的节点就不用考虑了。
comments powered by Disqus