【Redis】Redis基础(一):数据结构

Redis安装

DOCKER
docker pull redis
docker run --name redis -d -p6379:6379 redis
docker exec -it redis redis-cli
Ubuntu
apt-get install redis

Redis数据结构

String(字符串)

内部表示是一个字符数组,是可以修改的字符串,类似于ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。扩容时,当字符串长度小于1MB,加倍现有的空间;超过1MB,一次只会多扩1MB的空间。最长为512MB。

实用场景:
1、缓存购物车库存
2、用户信息,SessionId

Set(集合)

相当于HashSet,键值对无序、唯一的。

使用场景:
1、某活动中中奖的用户ID

Hash(字典)

无序字典,内部存储了很多键值对。底层和Java1.7的HashMap差不多,都是数组+链表结构,也就是当发生Hash碰撞时,就会将碰撞的元素使用链表串起来。值只能是字符串。

Redis采用了渐进式rehash策略。也就是rehash的同时,保留新旧两个hash结构,查询时会同时查询两个hash结构,然后在后续的定时任务和hash操作指令中,一点点地将hash内容迁移到新hash结构中,搬迁完成就会用新hash结构。

1、帖子的点赞数、评论数和点击数
2、帖子标题、摘要、作者和封面信息,列表页展示
3、近期热帖内容(内容空间占用较大,减低数据库压力)
4、用户行为历史、过滤恶意行为

Zset(有序集合)

类似于Java的SortedList和HashMap结合体,一方面是一个set,保证了内部value的唯一性,另一方面可以给每个value赋予一个score,代表这个value的排序权重。

内部实现为跳跃链表。
1、用户帖子ID列表,便于快速显示用户的帖子列表
2、帖子点赞用户ID列表,评论ID列表,用于显示和去重计数
3、收藏集合帖子之间的关系
4、记录热榜帖子ID列表、总热榜和分类热榜
5、粉丝列表,value为用户ID,score为关注时间

List(列表)

相当于双向链表。也就是说插入和删除很快(O(1)),但遍历慢(O(n))。当列表弹出了最后一个元素后,会自动删除并回收内存。

常用来做异步队列使用,将需要延后处理的任务结构体序列化成字符串,塞进列表,然后另一个线程从这个列表中轮询数据进行处理

快速链表:Redis底层存储的是称为“快速链表”的结构。在列表元素较少的时候,会使用一块连续的内存存储,即压缩列表ziplist。它将所有的元素彼此紧挨着一起存储。数据量比较多的时候才会改成quicklist。Redis将链表和ziplist结合成了quicklist,也就是将多个ziplist使用双向指针串起来使用。

实用场景:
1、帖子相关文章ID,根据内容推荐相关帖子
2、异步队列


容器型数据结构通用规则

list、set、hash、zset为容器型结构
1、容器不存在,就会创建一个容器再进行操作。如rpush
2、容器元素为空,则立即删除容器释放内存。


过期时间

过期是以对象为单位的,如一个hash结构的过期是整个hash对象的过期,而不是key的过期。
String如果设置了过期时间后,使用set修改了它,过期时间会消失

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值