Redis数据结构

Redis的数据结构

Redis有5种基础数据结构,分别为:string (字符串)、list (列表)、set (集合)、hash (哈希) 和 zset (有序集合)。

String

 

字符串,redis中的所有数据结构都是k-v结构。String的使用非常广泛,一般作为缓存减轻数据库压力时,就是把数据转换为json字符串存如redis,使用时再取出来反序列化。

Redis的字符串是动态字符串,可以修改的字符串,结构上类似于JAVA的ArrayList,使用预分配冗余空间的方式减少频繁内存分配。当字符串长度小于1M时,每次扩容为翻倍,大于1M时,每次扩容增加1M。字符串最大长度为512M。

List

Redis的list类似于JAVA的LinkedList,是链表结构。所以它的插入和删除非常快,但是查询会慢。

list通常可以当作队列来使用,它也可以从队列的左右端进行对队列中元素的操作。

队列:右进左出

>rpush key value1 value2 value3    //右侧依次放入value1 value2 value3三个元素到key中

>lpop key    //从左侧取出第一个元素,取出的值为value1

栈:右进右出

>rpush key value1 value2 value3    //右侧依次放入value1 value2 value3三个元素到key中

>rpop key               //右侧取出第一个元素,取出的值为value3

相关命令还有:lindex,需要遍历整个链表,随着链表长度增加,性能下降。ltrim  start_index end_index 保留start_index到end_index中的元素,其余的删掉,start_index和end_index中如果为负数,则为倒数第几个,如-1则为倒数第一个。

快速列表:由于简单列表中每个元素需要保存对上一个和下一个元素的指针,这样很浪费空间。所以使用一种叫quick list的结构。较少元素的时候会使用一块连续的内存结构,叫ziplist,压缩列表,它将所有元素都紧挨着一起存储。当数据量多的时候,会改变成quick list,就是将两个 ziplist通过prev和next指针关联起来。这样能满足快速的插入删除,又不会出现太多的空间冗余。

Hash(字典)

相当于JAVA的HashMap,无序唯一,数组加链表的结构。但是redis的Hash的值只能存储字符串,rehash的方式也不一样。JAVA的HashMap的rehash是个耗时的过程,但是redis为了保证高性能,使用了渐近式rehash策略。

渐近式rehash:在rehash的同时,保留新旧两个hash结构,查询时会查新旧两个hash结构,后续丁氏人物中,慢慢的将旧hash内容迁移到hash结构中。

Set(集合)

相当于JAVA的HashSet,无序唯一,相当于HashMap中所有key对应的value都是NULL。

ZSet(有序列表)

也有叫sorted set,有序唯一,它可以给每一个value赋予一个score,代表排序权重。,内部实现使用的是“跳跃列表”的数据结构。

 

Redis能做什么?

1、记录帖子的点赞数、评论数和点击数 (hash)。
2、记录用户的帖子 ID 列表 (排序),便于快速显示用户的帖子列表 (zset)。
3、记录帖子的标题、摘要、作者和封面信息,用于列表页展示 (hash)。
4、记录帖子的点赞用户 ID 列表,评论 ID 列表,用于显示和去重计数 (zset)。
5、缓存近期热帖内容 (帖子内容空间占用比较大),减少数据库压力 (hash)。
6、记录帖子的相关文章 ID,根据内容推荐相关帖子 (list)。
7、如果帖子 ID 是整数自增的,可以使用 Redis 来分配帖子 ID(计数器)。
8、收藏集和帖子之间的关系 (zset)。
9、记录热榜帖子 ID 列表,总热榜和分类热榜 (zset)。
10、缓存用户行为历史,进行恶意行为过滤 (zset,hash)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值