首先感谢掘金@敖丙的《吊打面试官》系列的启发
what
redis是一个缓存,基于内存操作数据,算是数据库的小弟,帮助数据库挡掉一些经常查询的内容,避免扫描库(你要知道有些查询要关联很多表,虽然你可能只查一条数据,但可能要要执行2-3秒,在高并发下是致命的),主要用的Redis以及Java的Memcached,两者各有特点,但市场倾向于Redis
知识点罗列
Redis
- 数据结构:
类型 | 作用 | 示例 |
---|---|---|
String | 保存字符串 | session |
Hash | key-value | 计数器 |
List | 数组 | 数组类型数据 |
Set | 去重数组 | 自动去重 |
SortedSet | 去重排序数组 | 微博热搜榜单 |
HyperLog | ||
Geo | ||
Pub/Sub | ||
Redis modules | 暴露接口自定义redis模块,自定义数据结构(json支持,对图数据库支持,匹配添加正则功等),访问redis数据空间,实现阻塞命令,动态链接加载模块,编写神经网络模块等 | * 官方有文档,待学习,应用如:BloomFilter,redisSearch,redis-ML |
内存清理
待补充分布式锁
目的:redis cluster时候保证一个数据同时只有一个实例在读/写
实现:zookeeper或者setnx争抢锁,expire释放,类似进程锁
持久化
持久方式 | 实现原理 | 应用场景 |
---|---|---|
RDB() | 全量 | 冷备份,耗时 |
AOF | 增量 | 实时增量(sync属性配置同步时间) |
混合使用 | 全量启动,AOF恢复近期数据 |
寻找key
1.keys-会阻塞-无重复项
2.scan-不阻塞-会有重复项
异步队列实现
1.rpush生产,lpop消费
2.sleep稍后重试,blpop休息直到消息来
3.应用场景:曾经调用仓库系统发货,仓库系统库存1一分钟更新一次,所以将发货数据推入队列中
4.pub/sub可以实现一次生产多次消费,高级的MQ解决意外情况
5.延时队列,sortedset,时间戳做score,内容做key调用zadd生产,zrangebysccore获取N秒前消息轮询消费
pipeline
1.多次IO一次返回
2.压测
同步机制
1.主从同步
2.从从同步
集群
redis sentinal高可用,master宕机选新头儿
redis cluster 扩展性,多个实例
BloomFilter
布隆过滤器,常用用于避免缓存击穿
实现原理:二进制向量和随机映射函数
作用:检查元素是否在合集中
工作流程:布隆过滤器的原理是,当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点,把它们置为1。检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些点有任何一个0,则被检元素一定不在;如果都是1,则被检元素很可能在。这就是布隆过滤器的基本思想。