(1)Redis的基本数据结构
一、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