《Redis深度历险核心原理与应用实践》读书笔记
前言
- 《Redis深度历险核心原理与应用实践》是掌阅服务端技术专家钱文品所著,看完后感觉有点东西。书马上要还了,避免忘记,在此与自己所学结合做个笔记。不涉及源码篇(因为这块没怎么看懂)。
基础和应用篇
Redis可以做什么
- 1、缓存最近热帖内容(hash)。
- 2、分布式锁(hash、string)。
- 3、记录帖子的点赞数,评论数和点击数(hash)。
- 4、记录用户帖子ID列表(zset)
- 5、记录帖子点赞用户id,评论id列表,用于显示和去重(zset)
- 6、记录帖子相关文章ID,根据内容推荐相关帖子(list)
- 7、帖子id自增,可以使用redis来分配帖子ID(计数器)
- 8、收藏集和帖子之间关系(zset)
- 9、记录热帖列表,总热榜和分类热榜(zset)
- 10、缓存用户历史行为,过滤恶意行为(zset、hash)
- 11、消息队列(zset、list、set),延迟队列(zset)
- 12、限流(hash)
…省略…
5种基础数据结构
- string:字符数组
- list:相当于java里LinkedList,支持栈、队列。
- hash:相当于java的HashMap
- set:相当于java里HashSet
- zset:类似于java的SortedSet和HashMap结合体,是set保证唯一,另外有score字段,代表排序权重。
位图
- 存放bool型数据,比如用户一年的签到记录,签了是1,没签是0,记录365天。
HyperLogLog
- 存储PV和UV(有极小的误差)
布隆过滤器
- 可以理解为一个不怎么精确的set结构,当你使用它的contains方法判断某个对象是否存在时,可能误判(误判率预计约0.1%,调参后实际情况会低很多)。
限流
- 漏斗,漏桶限流
- 令牌桶算法
- 滑动窗口算法
这几个算法基本实现可以移步 https://gitee.com/apple_1030907690/spring-boot-kubernetes/tree/v1.0.6/
附件的人或物(GEO)
- 用数据库来算附近的人或物(GeoHash)
scan
- 可以条件查询redis中数据
原理篇
- Redis是单线程程序
- 通信协议RESP
- 持久化,AOF(指令增量)和RDB(快照方式)
- 管道:操作合并。
- 事务:Redis事务不具备原子性,仅仅满足事务隔离性的串行化—当前执行的事务有着不被其他事务打断的权利。
- PubSub:消息多播,缺点,不支持持久化。
集群篇
- Sentinel:监控主节点健康,使用哨兵查询主节点地址,客户端来连接集群。
- Codis(代理方式)、Redis Cluster:数据分片方案。
拓展篇
- Stream:新的强大的支持多播的可持久化消息队列(需要Redis5.0及以上)
- info指令:查询Redis信息
- 过期策略:定时扫描,惰性策略删除过期key(当用户访问时,如果过期了再删除)。
保护Redis
- 指令安全:慎重使用可能会导致Redis卡顿的指令(如keys)
- 端口安全:尽量不对外暴露redis端口
- lua脚本安全:应该让Redis以普通用户身份启动,这样即使存在恶意代码,黑客也没拿到root权限。
- SSL代理:redis不支持ssl链接,如果要在公网传输,可以考虑SSL代理,常见的有ssh,官方推荐spiped工具。