当前位置: 首页 > 科技观察

Redis常用数据结构介绍及业务应用场景分析

时间:2023-03-12 06:28:15 科技观察

redis数据结构Redis内置了很多常用数据结构。了解这些数据结构的作用和应用场景,可以让我们在需求开发中灵活运用,解决实际问题。字符串和数字字符串是redis中最基本的数据结构。您可以将它们用作最基本的kv(键值)类型缓存(最大值为512MB)。你只需要将需要缓存的对象串起来。编解码器。另外,String还可以保存数值型数据,可以用来实现计数功能(redi提供了incr等原子操作)。常见应用场景计数器:保存各种计数(如视频播放数、点赞数、活动参与人数、库存剩余数、红包总量)kv:key-value类型的缓存数据,比如保存一篇文章的内容,保存一个用户的信息等。如果大于等于0,可以实现一些分布式限流功能,比如限制一分钟内接口请求数不超过1000条,还可以实现一个用户一分钟内最多发表N条评论的功能。分布式锁:通过string的setnx可以实现一个简单的分布式锁,比如限制一个用户不能同时请求接口(避免接口处理时用户维度并发操作导致数据错误)。(有人会质疑网上的redis分布式锁存在这样那样的问题,其实大部分需要分布式锁的场景都比较简单,要实现一个完美的分布式方案,可能会严重影响接口性能或者实现复杂)ListList更多时候是作为队列使用的(最多2^32-1个元素),使用入队和出队功能。如果你把它当作各种列表来使用,它往往不具备反重载功能,使用起来不是很方便。抢红包常见应用场景:发红包、拆包红包入队、抢红包离队。SetSet是一个无序且不重复的集合。添加、删除、检查是否存在的时间复杂度都是O(1)。SortedSetSortedSet是一种结合了List和Set的数据结构。它是一个有序的(按元素得分排序)非重复(元素键不重复)的集合。SortedSet是业务开发中非常常用的一种数据结构(相比List和Set使用更广泛),因为在实际需求中,有很多列表场景,比如视频列表,评论列表,关注列表,点赞列表,排行榜和其他列表一样,每个列表都必须按照一定的规则进行排序,而且大部分不能重复,所以很适合使用SortedSet。排行榜等常见应用场景中的列表:用于排名的分数作为分数列表分页:member存储id(视频id,用户id等)QPS很低,有时间戳的重复时间戳可能不多),使用zrevrangebyscore进行分页查询,使用zscore判断是否关注等。Hashhash是一种map结构,可以像存储一个对象的多个字段一样,存储一个key的多种类型的数据。常见的应用场景是将一个对象的多个字段,比如文章的作者、发布时间、标签等保存为一个hash上的多个字段。PubSubredis中的pub/sub可以实现广播功能,类似于rocketmq中广播的常见应用场景,websocket场景,当服务端向客户端发送消息时,因为不知道客户端与客户端建立的链接服务器,它可以发送广播让相应的服务器发送消息。其他数据结构除了上面提到的最基本的数据结构,redis还提供了一些其他的数据结构,其中一些需要安装相关的redis栈才能使用。bitmapbitmap本质上是一个string字符串,但是可以通过位来操作,这个key的值可以想象成一个由位组成的数组。常见的应用场景记录多个是否标记:比如记录一个用户是否是会员,是否是认证用户等,这些标记作为位在一个用户位图的不同索引上,这样就只有多个标记信息一个用户的一个请求就可以得到,存储相对于kv存储来说是比较节省资源的。一张位图最多可以存储512MB的数据,一共有2^32位,所以可以存储很多数据。比如签到场景可以存储用户在某天是否签到。Bloomfilterbloomfilter(也叫Bloomfilter)可以理解为一个特殊的集合集合,可以用来判断一个值是否在这个集合中,但是不同于普通的集合,它的判断有一定的误判(falsepositive)的可能性,如果bloomfilter判断一个值不在这个集合中,那么肯定不在,但是如果判断在里面,那么它可能不在。常见的应用场景减少请求量和缓存穿透:比如为了为了防止大量的请求在没有穿透数据库查询的情况下直接查询缓存,我们可以在缓存查询之前加一层Bloomfilter查询。如果没有Bloomfilter,说明数据肯定不在数据库和缓存中,就不用继续查询了。hyperlogloghyperloglog是一种概率去重计数数据结构,可以实现一定精度的去重计数。常见的应用场景需要去重统计,但又不想保存所有记录的数据:文章阅读数,网站访问量等。geohashgeohash可以实现距离计算,距离查询等地理位置-相关功能常见应用场景距离判断,附近人