Redis 列表(List)

单键多值
Redis 列表是简单的字符串列表,按照插入顺序进行排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节 点性能会较差。

Redis设计粉丝列表 redis 列表操作_数据结构


常用命令

lpush/rpush <key><value1><value2><value3> .... 从左边/右边插入一个或多个值。

lpop/rpop <key>从左边/右边吐出一个值。值在键在,值光键亡。

rpoplpush <key1><key2>从列表右边吐出一个值,插到<key2>列表左边。

lrange <key><start><stop> 按照索引下标获得元素(从左到右)
lrange mylist 0 -1 0 左边第一个,-1 右边第一个,(0-1 表示获取所有)

lindex <key><index>按照索引下标获得元素(从左到右)

llen <key>获得列表长度

linsert <key> before <value><newvalue>在的后面插入插入值

lrem <key><n><value>从左边删除 n 个 value(从左到右)

lset<key><index><value>将列表 key 下标为 index 的值替换成 value

Redis设计粉丝列表 redis 列表操作_redis_02


从左边放:

Redis设计粉丝列表 redis 列表操作_linux_03


Redis设计粉丝列表 redis 列表操作_redis_04


Redis设计粉丝列表 redis 列表操作_Redis_05


从右边放:

Redis设计粉丝列表 redis 列表操作_数据结构_06


Redis设计粉丝列表 redis 列表操作_Redis_07


Redis设计粉丝列表 redis 列表操作_Redis设计粉丝列表_08


Redis设计粉丝列表 redis 列表操作_Redis设计粉丝列表_09


Redis设计粉丝列表 redis 列表操作_数据结构_10


Redis设计粉丝列表 redis 列表操作_redis_11


Redis设计粉丝列表 redis 列表操作_Redis设计粉丝列表_12


Redis设计粉丝列表 redis 列表操作_Redis_13


Redis设计粉丝列表 redis 列表操作_数据结构_14

Redis设计粉丝列表 redis 列表操作_Redis_15

Redis设计粉丝列表 redis 列表操作_redis_16


Redis设计粉丝列表 redis 列表操作_Redis设计粉丝列表_17


Redis设计粉丝列表 redis 列表操作_数据结构_18


Redis设计粉丝列表 redis 列表操作_Redis设计粉丝列表_19


数据结构

List 的数据结构为快速链表 quickList。

首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是 ziplist,也即是 压缩列表

它将所有的元素紧挨着一起存储,分配的是一块连续的内存。

当数据量比较多的时候才会改成 quicklist。 因为普通的链表需要的附加指针空间太大,会比较浪费空间。

比如这个列表里存的只 是 int 类型的数据,结构上还需要两个额外的指针 prev 和 next。

Redis设计粉丝列表 redis 列表操作_Redis_20


Redis 将链表和 ziplist 结合起来组成了 quicklist。也就是将多个 ziplist 使用双向指 针串起来使用。这样既满足了快速的插入删除性能,又不会出现太大的空间冗余。

Redis 集合(Set)

简介
Redis set 对外提供的功能与 list 类似是一个列表的功能,特殊之处在于 set 是可以自动排重,是无序的,当你需要存储一个列表数据,又不希望出现重复数据时,set 是一个很好的选 择,并且 set 提供了判断某个成员是否在一个 set 集合内的重要接口,这个也是 list 所 不能提供的。

Redis 的 Set 是 string 类型的无序集合。它底层其实是一个 value 为 null 的 hash 表,所 以添加,删除,查找的复杂度都是 O(1)。

一个算法,随着数据的增加,执行时间的长短,如果是 O(1),数据增加,查找数据的 时间不变

常用命令
sadd <key><value1><value2> ..... 将一个或多个 member 元素加入到集合 key 中,已经存在的 member 元素将被忽略
smembers <key>取出该集合的所有值。
sismember <key><value>判断集合<key>是否为含有该<value>值,有 1,没有 0
scard<key>返回该集合的元素个数。

srem <key><value1><value2> .... 删除集合中的某个元素。
spop <key>随机从该集合中吐出一个值。
srandmember <key><n>随机从该集合中取出 n 个值。不会从集合中删除 。
smove <source><destination>value 把集合中一个值从一个集合移动到另一个集合
sinter <key1><key2>返回两个集合的交集元素。
sunion <key1><key2>返回两个集合的并集元素。
sdiff <key1><key2>返回两个集合的差集元素(key1 中的,不包含 key2 中的)

Redis设计粉丝列表 redis 列表操作_linux_21


Redis设计粉丝列表 redis 列表操作_Redis_22


Redis设计粉丝列表 redis 列表操作_数据结构_23


Redis设计粉丝列表 redis 列表操作_Redis_24


Redis设计粉丝列表 redis 列表操作_Redis设计粉丝列表_25


Redis设计粉丝列表 redis 列表操作_Redis_26


Redis设计粉丝列表 redis 列表操作_Redis设计粉丝列表_27


Redis设计粉丝列表 redis 列表操作_Redis_28


Redis设计粉丝列表 redis 列表操作_Redis_29


Redis设计粉丝列表 redis 列表操作_Redis_30


Redis设计粉丝列表 redis 列表操作_Redis_31


Redis设计粉丝列表 redis 列表操作_Redis设计粉丝列表_32


数据结构

Set 数据结构是 dict 字典,字典是用哈希表实现的。

Java 中 HashSet 的内部实现使用的是 HashMap,只不过所有的 value 都指向同一个对象。 Redis 的 set 结构也是一样,它的内部也使用 hash 结构,所有的 value 都指向同一个内 部值。