场景十:利用set交并差实现推荐系统池
可以使用如下命令实现:
总而言之就是实现数据的关联差异:
场景十一:利用set不重复特征获取所有业务系统权限
我们可以设置用户为一个set集合,他的权限为value,然后合并所有用户就可以拿到所有不重复权限
场景十二:利用set不重复特征获取UV和IP数据
我们可以采用将ip或者cookie放到set中保证不重复,对同类型数据进行快速去重
场景十三:利用set不重复特征实现黑白名单
实现时把对应黑白名单信息源添加到set中即可。
操作规范
Sorted_Set类型
redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。
基本操作
操作都是关联score的,获取时按照score值来进行排序获取。
同时需要注意,删除的时候按照值删除,而不是按照score删除。
扩展操作【应用场景】
sorted_set最经典的应用场景就是进行排行榜设置了。当然除此之外还有些带权重的操作都类似:
- 场景十四:利用set不重复排序特征实现计数器组合排序排行榜功能
- 场景十五:利用set不重复排序特征实现基于时效性任务提醒
- 场景十六:利用set不重复排序特征实现带权重任务队列
接下来看下这三种场景
场景十四:利用set不重复排序特征实现计数器组合排序排行榜功能
可以利用如下命令直接获取排名
场景十五:利用set不重复排序特征实现基于时效性任务提醒
队列中全部为vip,按照会员时间长短排序,短时间到期后提醒下一个。
场景十六:利用set不重复排序特征实现带权重任务队列
仅是任务队列可以通过队列,但是如果队列中的任务有优先级,则需要使用带权重的。
操作规范
Redis数据结构综合应用场景及总结
最后总结一下各类数据结构他们的性能和特点吧,方便之后用的时候好记忆:
数据类型 | 特点 | 查询性能 | 插入、删除性能 | 适用场景 |
string | 性能高 | O(1)【多指令时为O(N)】 | O(1)【多指令时为O(N)】 | 计数器、分布式自增主键、按时按次服务计算、热点数据刷新、时效性投票系统 |
hash | 结构性 | O(1)【同时设置多字段时为O(N)】 | O(1)【同时设置多字段时为O(N)】 | 购物车操作、抢购系统 |
list | 顺序性 | O(n) | O(1) | 社交点赞、任务队列、分布式日志顺序显示 |
set | 不重复性 | O(1)【多值操作时为O(N)】 | O(1)【多值操作时为O(N)】 | 黑白名单、推荐系统、业务系统权限整合、UV\IP数据统计 |
sorted_set | 不重复排行榜 | O(1) | O(log(n)) | 合并排行榜、带权重的任务队列、vip超时队列【时间作为得分】 |
总体而言,redis的设计就是简单、快,时间复杂度最多不超过O(N),并且设计了多种有特色的数据结构,利用这些数据结构服务现有的业务场景。
时间复杂度部分来源于 https://blog.csdn.net/zzm848166546/article/details/80360665,深度好文
限时限次结算的服务控制
按此结算的服务限制需要限制:每分钟最多调用10次。
选定类型:string,选定命令 setex , 设定redis的生命周期,每次incr后get一次,到10次的时候禁止调用,并且生命周期到期后清空值。
操作同理,但是可以设置数字的最大值,利用超过报异常来避免每次get操作
微信接收消息顺序通知
需要区分置顶用户和普通用户,并且后来的消息在最上边,先看到【按栈模型使用】
选定类型:list、set,选定命令 消息来了之后先和set比较是否为置顶用户然后加入不同的list,并且后来的list较新展示
如果需要做计数,再对相同的消息设备同步使用一个计数redis去实现。当然这里使用sorted_set也可以,用时间作为排行榜得分。
总结
通过一周的学习终于从场景的角度更深入的理解了redis的使用,基于这周的学习内容,依据redis的不同数据结构的特性,再次梳理下场景:
- string,redis对于KV的操作效率很高,可以直接用作计数器。例如,统计在线人数等等,另外string类型是二进制存储安全的,所以也可以使用它来存储图片,甚至是视频等。【计数器、分布式自增、分布式锁、热点数据刷新】
- hash,存放键值对,一般可以用来存某个对象的基本属性信息,例如,用户信息,商品信息等,另外,由于hash的大小在小于配置的大小的时候使用的是ziplist结构,比较节约内存,所以针对大量的数据存储可以考虑使用hash来分段存储来达到压缩数据量,节约内存的目的,例如,对于大批量的商品对应的图片地址名称。比如:商品编码固定是10位,可以选取前7位做为hash的key,后三位作为field,图片地址作为value。这样每个hash表都不超过999个,只要把redis.conf中的hash-max-ziplist-entries改为1024,即可。【数据对象存储、秒杀系统、分布式锁】
- list,列表类型【顺序性】,可以用于实现消息队列,也可以使用它提供的range命令,做分页查询功能。【任务队列、社交点赞、分布式日志顺序显示】
- set,集合,整数的有序列表可以直接使用set。可以用作某些去重功能,例如用户名不能重复等,另外,还可以对集合进行交集,并集操作,来查找某些元素的共同点。【推荐系统、数据去重、运营数据统计、黑白名单】
- Sorted_Set,有序集合,可以使用范围查找,排行榜功能或者topN功能。【排行榜】
总而言之,string当做计数器,hash存储对象,list实现消息队列(安全队列),set用来去重和联表查询,zset用来做排行榜。