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修改了它,过期时间会消失