[TOC]
这是我参与8月更文挑战的第1天,活动详情查看:8月更文挑战
Redis 作为高性能的Key-Value的内存数据库,在实际应用场景中,尝尝被作为缓存使用,可以面对数据高并发读写,避免对关系型数据库造成过大压力。
缓存
作为高性能的Key-Value内存数据库,日常开始使用中最常见的使用场景便是作为数据缓存。只需要通过String类型将待缓存数据对象通过序列化后缓存起来即可。但使用时也有一些需要注意的点:
- 必须保证不同缓存内容的key不会重复,并且尽可能短。可以使用对象主键等。
- 对于热点数据在数据库新增或查询后将其放入缓存,修改后更新缓存,删除后对应去除缓存。同时也需要对其设置过期时间。
- 合理利用缓存提高接口、网站访问速度,同时能够有效降低数据库压力。
- Redis提供键过期,可以将其作为缓存过期淘汰策略。
计数器
Redis提供了incr命令来实现计数功能,通过内存操作性能高,能够很好适用于这些场景。
- 社交业务产品中统计技术功能
- 用户点赞数、关注数、粉丝数
- 帖子点赞数、评论数、热度
- 消息已读、未读,红点消息数
- 话题消息数、帖子数、收藏数
- 统计网站、接口的调用次数等。
限流
限流是一种限制某些操作、接口执行访问速率的操作。例如网关限制接口访问频次,针对于用户维度、全局维度来控制接口的访问频率。
- MQ 防止重复消费同样可以利用
incr计数,保证时间段内只会被消费一次。 - 接口限流,限制接口时间段内请求次数上限。
- 限流方式:
- 本地令牌桶
- lua脚本使用
incr实现redis简单限流
队列
Redis有list push 和 list pop这样的命令,可以很方便的执行队列操作。但是一般情况下不使用。
分布式锁
在分布式场景下,对同一资源的并发访问。比如全局ID、库存减少、秒杀、订单状态一致性等。并发量不大情况下可以使用数据库悲观锁、乐观锁来实现。但是并发量高的场景中,利用数据库锁机制来控制资源会很大程度影响数据库的性能。此时可以使用Redis的setnx功能来编写分布式锁,进行操作是来获取分布式锁,当然实际操作中需要考虑更多细节内容。
- 互斥性。互斥是所得基本特性,同一时刻只能被一个线程操作。
- 超时释放。通过超时释放,可以避免死锁,防止不必要的线程等待和浪费资源。MySQL的InnoDB中
innodblockwait_timeout参数配置超时释放锁。 - 可重入性。一个线程在持有该锁的情况下可以对其再次请求加锁。防止锁在线程执行完临界操作前释放。
- 高性能和高可用。加锁和解锁的过程需要尽量减少性能消耗,但是也需要保证高可用,避免分布式锁意外失效。
在此说一下分布式锁的实现方案:
-
Memcached分布式锁
利用Memcached的add命令,此命令是原子操作。只有在key不存在的情况下才能add成功,此时就获得到锁。
-
Zookeeper分布式锁
利用zookeeper的顺序临时节点来实现分布式锁和等待队列。
-
Redis分布式锁
基于Redis的分布式锁和Memcached的实现方式类似,Redis是使用其
setnx命令,此命令同样也是源自操作,只有在key不存在的情况下才可以设置成功,从而获得锁。
排行榜
使用Redis的sortedset操作对热点数据进行排序。展示一段时间点赞量最多的帖子等等。