1.Redis中的数据类型
Redis中的数据类型包括:String(字符串)、Hash(字典)、List(列表)、Set(集合)、Sorted Set【Zset】(有序集合)。
Redis 所有的数据结构都是一个key对应一个value,不同类型的数据结构之间的差异就在于value的结构不同,例如string数据类型,他的value就是一个字符串,list数据类型,他的value是一个链表。
排行榜应选用有序集合Zset,原因是排行榜既要去重,也要排序,用这种结构最为合适。
1.1 String
字符串 String 是 Redis 最简单的数据结构,可以存储字符串、整数或者浮点数。最常见的应用场景就是对象缓存,例如缓存用户对象,key是"userInfo"+#{用户ID},value是用户信息对象的JSON字符串。
Redis String使用场景
-
缓存:像我们平时开发,经常会把一个对象转成json字符串,然后放到redis里缓存
-
计数器:像博客文章的阅读量、评论数、点赞数等等
-
分布式系统生成自增长ID
1.2 List
Redis 的列表相当于 Java 语言里面的 LinkedList。LinkedList优点:插入性能高,不管是从末尾插入还是中间插入LinkedList缺点:随机读性能差,例如LinkedList.get(10),这种操作,性能就很低,因为他需要遍历这个链表,从头开始遍历这个链表,直到找到index = 10的这个元素为止。
Redis List 使用场景
-
异步队列
-
任务轮询(RPOPLPUSH)
-
文章列表(lrange key 0 9)
1.3 Hash
Redis的Hash结构相当于Java语言的HashMap,内部实现结构上与JDK1.7的HashMap一致,底层通过数据+链表实现。
Redis Hash 使用场景
-
记录整个博客的访问人数(数据量大会考虑HyperLogLog,但是这个数据结构存在很小的误差,如果不能接受误差,可以考虑别的方案)
-
记录博客中某个博主的主页访问量、博主的姓名、联系方式、住址
1.4 Set
Redis的set集合相当于Java的HashSet。Redis 中的 set 类型是一种无序集合,集合中的元素没有先后顺序。
补充:HashSet就是基于HashMap来实现的,HashSet,他其实就是说一个集合,里面的元素是无序的,他里面的元素不能重复的,HashMap的key是无顺序的,你插入进去的顺序,跟你迭代遍历的顺序是不一样的,而且HashMap的key是没有重复的,HashSet直接基于HashMap实现的。
Redis Set 使用场景
-
微博抽奖:如果数据量不是特别大的时候,可以使用spop(移除并返回集合中的一个随机元素)或srandmember(返回集合中一个或多个随机数)
-
QQ标签:一个用户多个便签
-
共同关注(交集)
-
共同好友(交集)
1.5 Sorted Set
sorted set 有序集合,sorted set 增加了一个权重参数 score,使得集合中的元素能够按 score 进行有序排列,还可以通过 score 的范围来获取元素的列表。使得它类似于Java的TreeSet和HashMap的结合体。
Sorted set 使用场景
-
排行榜
-
订单支付超时(下单时插入,member为订单号,score为订单超时时间戳,然后写个定时任务每隔一段时间执行zrange)
总结
要结合实际项目仔细分析业务需求,根据数据类型适用场景不同做合适的选择。