Redis
01.Redis是什么
数据从单表演进出分库分表
MySQL从单机演进出集群:数据量增长、读写数据压力的不断增加
数据分冷热:热数据存储到内存中
02.Redis原理
-
概念
Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,其具备如下特性:
-
基于内存运行,性能高效
-
支持分布式,理论上可以无限扩展
-
key-value存储系统
-
开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API
-
-
原理
-
数据从内存中读写
-
数据保存到硬盘防止数据丢失
-
AOF文件
-
RDB文件
-
-
单线程处理所有操作命令
-
03.Redis的使用
-
1.连续签到String数据结构
GET/SET,Key过期
String数据结构:可以存储字符串、数字、二进制数据;通常配合expire使用;用于存储计数、Session
-
2.消息通知List数据结构
用list作为消息队列
Quicklist:由一个双向链表和listpack实现
-
3.计数Hash数据结构dict
一个用户有多项计数需求,可通过hash结构存储
hash数据结构dict:
rehash:将ht[0]中的数据全部迁移到ht[1]中。数据量小的场景下,直接将数据从ht[0]拷贝到ht[1]速度是较快的。数据量大的场景,迁移过程将会明显阻塞用户请求;渐进式rehash:每次用户访问时都会迁移少量数据,将整个迁移过程平摊到所有的访问用不请求过程中。
-
4.排行榜zset数据结构zskiplist
使用setnx实现分布式锁
结合dict可实现通过key操作跳表的功能
查找数字7的路径,head,3,3,7
结合dict(哈希)后可实现通过key操作跳表的功能
-
5.限流
要求1秒内放行的请求为N,超过N则禁止访问
Key:comment_freq_limit_1671356046
对这个Key调用incr,超过限制N则禁止访问。1671356046是当前时间戳
-
6.分布式锁
并发场景,要求一次只能有一个协程执行
执行完成后,其他等待中的协程才能执行
可以使用redis的setnx实现,利用了两个特性:Redis是单线程执行命令、setnx只有未设置过才能执行成功