(全栈须知)5.应用场景整理
前言
redis搬运整理参考:
《Redis 列表》
《Redis使用场景》、《Redis的使用场景》
1、Redis使用场景
消息队列的使用 RabbitMQ
更专业。
【哈希hash相当于是简化版的有序集合(sorted set)
】
redis支持集群水平扩展,支持持久化,在高发、逻辑简单、非核心的功能上可以替代MySQL。
a. 缓存功能:作为mysql缓存
对于高并发的数据查询服务,可以将常用查询结果放到redis:[ key => value ]、设为优先使用。注意设置合理的键名。
b. session共享:php原生支持
php自动管理。
c. 限速器:验证码/短信
每分钟/30s发送最多一条验证短信,限制通过速率。
d. 计数器:文章浏览
对于与评论等相对不重要的热数据,可以全部放到redis中,比如像IT之家主要看评论的这种。
- 对象属性自增:每条微博都有点赞数,评论数,转发数和浏览数四条属性,这时用hash进行计数会更好,该计数器的key设为为weibo:weibo_id,hash的 field 为like_number、comment_number、forward_number和view_number,在对应操作后通过 HINCRBY 使
hash
中的 field 自增。 - 集合属性自增:如果应用有一个发帖排行榜的功能,便选择sorted set吧,将集合的 key 设为POST_RANK。当用户发帖后,使用 ZINCRBY 将该用户 id 的 score 增长 1。sorted set会重新进行排序,用户所在排行榜的位置也就会得到实时的更新。
- 可重复的时间轴:使用:列表(List)。
e. 排行榜:热点排序
使用:有序集合(sorted set)。ZREVRANGEBYSCORE 返回有序集中指定分数区间内的所有的成员。
f. 好友关系:交集关系计算
使用:集合(Set)。对于一个用户A,将它的关注和粉丝的用户id都存放到两个set中:
- A:follow:存放A所有关注的用户id
- A:follower:存放A所有粉丝的用户id
g. 倒排索引:常量搜索
假设一个城市北京,通过拼音词库将北京转为beijing,再通过前缀分词将这两个词分为若干个前缀索引,有:北、北京、b、be…beijin和beijing。将这些索引分别作为set的 key(例如:index:北)并存储北京的 id,倒排索引便建立好了。接下来只需要在搜索时通过关键词取出对应的set并得到其中的 id 即可。
h. 商品秒杀:列表lpop
初始化,添加秒杀商品rpush ==> 分布式消费,消费锁lpop
...
2、RabbitMQ异步场景
RabbitMQ可以搭建集群,用于任务的异步处理。相比Redis,RabbitMQ实现了AMQP协议,队列可靠性更高,多了各端中阶段的ack验证,性能差些。
《RabbitMQ与Redis队列对比》
a. 消息队列:流量削峰,异步处理
把执行任务保存为执行单元、延时处理,发布、订阅处理任务。秒杀
时可以串行执行,应用解耦
时异步延时处理,普通队列
任务并行执行。
b. 发布订阅/即时通讯
适合运行在命令行的web后台环境使用。
3、API 风格
《API设计风格(RRC、REST、GraphQL、服务端驱动)》
a. RESTful(表征状态转移) API
面向资源
b. GraphQL(描述性查询语言) API
面向结果数据
d. RPC(远程过程调用) API
面向过程