String
string是以一种纯字符串作为value的形式存在的。也是这几种之中使用最多的数据结构。value可以存储json格式、数值型等。底层都是用SDS实现的。
使用场景: string使用场景一般是存储简单的键值类型。比如用户信息,登录信息,配置信息等。还有一种用得比较多的是string的incr/decr操作,即自减/自增操作。调用它是原子性的,无论调用多少次,都一一计算成功。例如需要增减库存的操作。
List
list是一个集合,而在redis中,list的使用场景多种多样。在redis中,插入list中的值,只需要找到list的key即可,而不需要像hash一样插入两层的key。list是一种有序的、可重复的集合。底层有ziplist和linkedlist两种实现。
使用场景:
1.可以用来当做消息队列。
2.文章列表或者数据分页展示的应用。比如,我们常用的博客网站的文章列表,当用户量越来越多时,而且每一个用户都有自己的文章列表,而且当文章多时,都需要分页展示,这时可以考虑使用Redis的列表,列表不但有序同时还支持按照范围内获取元素,可以完美解决分页查询功能。大大提高查询效率
pub/sub
上面list当做消息队列是一对一的,pub/sub可以用来一对N,用户订阅频道后就可以收到消息,订阅者可以订阅多个频道,发布者可以向指定的频道或者所有频道发送消息。比较坑的是如果发消息的时候没收到,那消息就没有了。
Hash
hash是一个集合,使用过hash的人都知道,hash的读取性能都一样快。在redis中,hash因为是一个集合,所以有两层。第一层是key:hash集合value,第二层是hashkey:string value。所以判断是否采用hash的时候可以参照有两层key的设计来做参考。并且注意的是,设置过期时间只能在第一层的key上面设置。底层用了ziplist或hashtable来实现
使用场景:使用hash,一般是有那种需要两层key的应用场景,也可以是‘删除一个key可以删除所有内容’的场景。例如一个商品有很多规格,规格里面有不同的值。
)FCH[OH5{J9Z{XA6$]ZEDDN.png
上面的例子表示成下面的图:
Set
set是一种无序的,不能重复的集合。并且在redis中,只有一个key。
使用场景: 可以基于 Set 玩儿交集、并集、差集的操作,比如交集吧,我们可以把两个人的好友列表整一个交集,看看俩人的共同好友是谁。底层实现为intset(整数集合)或者hashtable
88.png
SortedSet
sortset在redis中是有序的,并且不能重复。既有list的有序,又有set的不可重复性。底层实现为ziplist或skiplist。当使用skiplist时,还同时会有dict字典存储成员到分值的映射。这样做的好处是字典加快了根据成员查找分值,而跳表则是实现了有序的特点
使用场景: sortset的使用场景一般是排行榜之类的场景,比如微博的热度排行榜。
也可以用来做延时队列,消息内容作为key,时间戳为排序基准,
Geo
GEO,使用得也不多。用于处理地理位置的信息。
使用场景 : 在redis中,GEO可以保存地理位置的信息,并且可以计算地理位置的距离等。场景就在于使用地理位置时,并且需要计算,快速的场景,可使用。
HyperLogLog
HyperLogLog只会根据输入元素来计算基数,而不会存储输入元素本身,所以HyperLogLog不能像集合那样,返回输入的各个元素。
使用场景:比如数据集{1,3,5,7,5,7,8},那么这个数据集的基数集为{1,3,5,7,8},基数(不重复元素)为5.基数估计就是在误差可接受的范围内,快速计算基数。
网友评论