一、5种基础数据结构

​ Redis所有的数据结构都是以唯一的key字符串作为名称,然后通过key值来获取相应的value数据。不同类型的数据结构差异在于value不同。

1.string(字符串)

a.键值对

​ 相当于字典中的key-value,支持简单的增删改查操作。

b.批量键值对

​ 可以对多个字符串进行批量读写,节省网络耗时开销。

c.过期和set命令扩展(setex,setnx)

​ 对key设置过期时间,超时候会自动删除,这个功能常用来控制缓存的失效时间。

​ setnx 如果key不存在就创建。如果key存在,就创建失败。

d.计数

可以对整数的value进行自增操作。

自增取值范围:long类型的范围,-2^64~2^64

即,-9223372036854775808到9223372036854775807

超出范围,redis会报错。

2.list(列表)

​ Redis中的列表是链表而不是数组。这代表list的插入和删除操作非常快,时间复杂度为O(1),但是索引定位很慢,时间复杂度为O(n)。列表中的每个元素都使用双向指针顺序,可以同时支持前向后向遍历。

​ 当列表最后一个元素弹出之后,该数据结构被自动删除,内存被回收。

​ 通常使用列表实现队列或栈。

a.队列

​ 队列:先进先出。 通过rpush(右插入) 和 lpop(左去除)实现

b.栈

​ 栈:后进先出。 通过rpush(右插入) 和 rpop(右去除)实现

c.lindex/ltrim (慢操作)

​ lindex 根据索引取列表中的数据。redis中的列表是链表,需要对链表进行遍历,这样性能就会随着参数index的增大而变差。 算法复杂度 O(n)

​ lrange 获取列表指定索引区间内的所有元素。索引的获取区间是左闭右闭的。算法复杂度O(n)

ltrim 两个参数 start_index和end_index定义了一个区间,在这个区间内的值ltrim要保留,区间之外的统统砍掉。 我们可以使用ltrim实现一个定长链表。算法复杂度O(n)

​ ltrim name 1 0 相当于清空列表,因为区间长度为负。同理,只要区间长度为负,都会清空列表。

d.快速列表(quicklist)

​ redis列表的底层存储不是简单的linkedlist,而是称之为 快速链表(quicklist)的一个结构。

​ 首先,在列表元素较少的情况下,会使用一个连续的内存存储,结构是ziplist(压缩列表)他将所有的元素彼此紧挨着一起存储,分配的是一个连续的内存。当数据量大时会改成quicklist。

​ 相较于普通的链表需要附加指针空间太大,会浪费空间,还会加重内存的碎片化。比如某普通链表里存的只是int类型的数据,结构上还需要两个额外的指针prev和next。Redis将链表和ziplist结合起来组成quicklist,也就是将多个ziplist使用双向指针串起来。既满足了快速的插入删除性能,又不会出现太大的空间冗余。

3.hash(字典)

​ 无序字典,内部存储了很多键值对。

​ hash结构也可以用来存储用户信息,与字符串需要一次性全部序列化整个对象不同,hash可以对用户结构中的每个字段单独存储。这样当需要获取用户信息时可以部分获取。节省了网络流量。

​ hash结构的存储消耗要高于单个字符串。

a.hset/hget/hgetall/hmset

b.hincrby

​ hash结构的单个子key也可以进行计数,和incr用法基本一样。

4.set(集合)

​ 内部键值对是无序的,唯一的。set的内部实现相当于一个特殊的字典,字典中所有的value都是一个值,NULL。

​ 当集合中的最后一个元素被移除之后,数据结构被自动删除,内存被回收。

​ set结构可以用来存储某次活动中中奖用户的ID,因为set可以去重,可以保证同一个用户不会中奖两次。

a.sadd/smembers/sismember/scard/spop

​ sadd key [value] 添加数据,可批量。 如果集合中已存在数据,不会重复添加

​ smembers key 查看集合中所有的元素。(和添加顺序不同,因为set是无序的)

​ sismember key value 查看集合中是否存在元素 返回1存在 0不存在

​ scard key 获取set长度

​ spop key count 弹出count个元素。count可以不填,默认为1

5.zset(有序集合)

​ zset有序集合一方面是一个set,保证了内部value的唯一性,另一方面他可以给每一个value赋予一个score,代表这个value的排序权重。内部实现用的是一种叫做**’跳跃列表’**的数据结构。

​ zset最后一个元素被移除后,数据结构被自动删除,内存被回收。

​ zset可以存储粉丝列表,value值是粉丝用户ID,score是关注时间,可以对粉丝列表按关注时间进行排序。

​ zset可以用来储存学生的成绩,value值是学生的ID,score是成绩。可以对成绩排序得到学生的名次。

a.zadd/zrange/zrevrange/zcard

​ zadd key score value [score] [value] 添加元素 可批量

​ zrange key start end 按score排序列出,区间为排名范围(左闭右闭

​ zrevrange key start end 按score逆序列出。

​ zcard key 获取长度

b.zscore/zrank/zrangebyscore/zrem

​ zscore key value 获取指定value的元素的score 内部score使用double类型存储,所以存在浮点数精度问题

​ zrank key value 获取value的当前排行

​ zrangebyscore key start end 将score在区间内的元素排序 inf表示无穷大。 withscores排序同时返回score

​ zrem key value 删除value