✔ String
此类型和 memcache 相似,作为常规的 key-value 缓存应用
应用场景:
○ 例如微博数、粉丝数等。
✔ Hash
redis hash是一个 string 类型的 field 和value 的映射表,hash 特别适合用于存储对象(因为对象可能包含很多属性)
常用命令:hget hset hgetall
常用来存储对象信息:
✔ List(有序)
list 列表是简单的字符串列表,按照插入顺序排序(内部实现为LinkedList),可以选择将一个链表插入到头部或尾部。
常用命令:
○ lpush/rpush:添加左边/右边元素
○ lpop/rpop:移除左边/右边第一个元素
○ lrange:获取列表片段
应用场景:
○ Twitter的关注列表、粉丝列表等
○ 文章的评论列表
○ 分页查询,例如类似微博的下拉不断分页
○ 消息队列:redis的链表结构,可以轻松实现阻塞队列,可以使用左进右出的命令组成来完成队列的设计。
✔ Set(自动去重)
案例:在微博中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis还为集合提供了求交集、并集、差集等操作,可以实现 共同关注、共同喜好、二度好友 等功能。对于上面所有集合操作,还可以使用不同命令选择将结果返回给客户端还是存到一个新集合中。
○ 面对面建群
✔ SortedSet(去重且自动排序)
redis sorted set 的内部使用 HashMap 和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到 score 的映射,跳跃表按 score 从小到大保存所以集合元素。使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。时间复杂度和红黑树相同,增加、删除的操作较为简单。
应用场景:
○ 排行榜 :有序集合经典使用场景。例如视频网站需要对用户上传的视频做排行榜,榜单维护可能是多方面 :按照时间、按照播放量、按照获得的赞数等。
○ 用 Sortedset来做带权重的队列,比如普通消息的 score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务,让重要任务优先执行。(微博热搜榜)
○ 班级成绩单
☺ HyperLogLog
• 供不精确的去重计数功能,比较适合用来做大规模数据的去重统计,例如统计UV;
☺ Geospatial
• 可以用来保存地理位置,并作位置举例计算或者根据半径计算位置等。
• 附近的人
• 计算最优地图路径
☺ Pub/Sub:主题订阅模式
可以实现 1:N 的消息队列,但是在消费者下线的情况下,生产的消息会丢失,得使用专业的消息队列如RocketMQ等。