Redis工作原理及应用案例 | 青训营笔记
这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天 ✌
1. Redis介绍
Redis是一个内存中的键值对存储数据库,最常用作主数据库、缓存、消息代理和队列。Redis提供亚毫秒级的响应时间,应用场景包括:高频读、低频写特点的缓存系统、计数器、消息队列系统、排行榜、社交网络等各种实时系统。其具备以下特性:
- 基于键值对存储,在内存运行
- 支持分布式,理论上可以无限扩展
- C/S通讯模型
- 单进程单线程模型
- 丰富的数据类型
- 操作具有原子性
- 持久化
- 高并发读写
为什么需要Redis?: 随着数据量以及读写压力的不断增加,MySQL数据库从单机演进出集群,传统关系型数据库的使用在磁盘IO存储性能上存在瓶颈问题。因此,“数据冷热分离”机制被提出,将热数据(经常使用到的数据)存储到IO性能更好的内存中,冷数据存储到硬盘中。
2. Redis数据类型
Redis是一个多模型数据库,提供多种内置数据结构,例如:
- string:任何文本或二进制数据(最大512MB)
- Hashes:最常用于表示对象的字段值对
- List:按字符串添加为链接列表时顺序排序的string集合
- Set:无序集合,能够与其他集合相交、并集和差异
- Ordered Set:排序集,在已排序集合中,每个成员都与可用于对集合进行排序的分数相关联。
- Bitmap:位图,不一定是数据类型,而是字符串类型上的一组面向位的操作
- HyperLogLogs:一种用于统计唯一事物(集合的基数)的概率数据结构
- Geospatial:地理空间,经度/纬度/名称键值对的排序集,可用于地图、地理搜索和“附近”功能
- Streams:一种数据类型,它对仅附加日志进行建模,并可用作持久消息队列
3. Redis应用案例
(1)连续签到: 采用string数据结构,和expire配合使用(expireAt:超时点,超时后计数归为0),记录用户的连续签到天数,key:用户ID ,value:连续签到天数
(2)消息通知: 采用list数据结构作为消息队列,列表按插入时间顺序排序
(3)计数: 对于多项计数需求,可通过hash结构存储实现
(4)排行榜: 应用需求:排名更具积分实时变更。zset数据结构(zskiplist)实现,结合dict,可实现通过key操作跳表。
(5)限流: 应用需求:放行的请求数超过设定阈值N时要禁止访问。对访问请求的key调用incr,超过限制N则禁止访问。
(6)分布式锁: 对于并发场景,要求一次只能有一个协程执行。该应用场景利用redis是单线程执行的特性,且setnx只有未设置过才能执行成功。