Redis 核心原理和实战笔记
2021-03-07 16:34:32 1 举报
AI智能生成
Redis如此流行,在使用中高效和简洁。开发人员必会的一项技能,思维导图全面总结展示Redis的核心原理以及实战使用,通过思维导图全面认识和了解Redis,对相关的知识做到心中有数
作者其他创作
大纲/内容
Redis 核心原理和实战笔记
01、简介
高性能、分布式内存型数据库,官网提供的QPS 每秒超过10万
多种数据类型支持(新 9 种数据类型支持)功能完善:消息队列、自动过期删除、事务、数据持久化、分布式锁、附近的人、慢查询分析、Sentinel 和集群等数据持久化
大厂加持:Twitter、Github、阿里巴巴、腾讯、新浪微博等等
发展历程
Redis3 的集群模式
Redis4的混合持久化
Redis5的可靠消息队列
最新版本Redis6
02、Redis的架构
Redis 使用的是 I/O 多路复用功能来监听多 socket 链接的,这样就可以使用一个线程链接来处理多个请求,减少线程切换带来的开销,同时也避免了 I/O 阻塞操作,从而大大提高了 Redis 的运行效率。
03、基础篇(夯实基础)
Redis执行流程
大方向:客户端发命令->服务端执行->返回结果到客户端
具体细节:1、客户端转换命令为 Redis 通讯协议2、通过Socket发送3、服务端判断授权、转换并执行命令、相关记录和统计
Redis安装和使用
Redis安装-简单-具体看官网
Redis 使用
redis-server\t启动 Redisredis-cli\tRedis 命令行工具redis-benchmark\t基准测试工具redis-check-aof\tAOF 持久化文件检测工具和修复工具redis-check-dump\tRDB 持久化文件检测工具和修复工具redis-sentinel\t启动 redis-sentinel
redis.conf 文件
默认是非后台启动daemonize no 改为 daemonize yes
Redis 配置查询/设置
查询:config get xxx如:config get dbfilename
设置:1、改配置文件(重启生效-不丢失)2、config set key value (立即生效,重启-丢失)
Redis 持久化
手动触发save:阻塞主线程,生产慎用bgsave :fork() 一个子进程来执行持久化
自动触发① save m n(可设置多个) :在 m 秒内,如果有 n 个键发生改变,则自动触发持久化② flushall : 清空Redis数据库,生产慎用。会触发自动持久化③ 主从同步触发:当从节点执行全量复制操作时,主节点会执行 bgsave 命令,并将 RDB 文件发送给从节点,该过程会自动触发 Redis 持久化
重要的参数① save 参数 :配置触发 RDB 持久化条件的参数② rdbcompression 参数:默认值是 yes 表示开启 RDB 文件压缩,Redis 会采用 LZF 算法进行压缩。(时/空问题)③ rdbchecksum 参数: 默认值为 yes 表示写入文件和读取文件时是否开启 RDB 文件检查,检查是否有无损坏,如果在启动是检查发现损坏,则停止启动。
优/缺
优:占用小,恢复快,持久化fork子进程
缺:某个时刻数据,会丢一部分数据
手动触发bgrewriteaof 命令
自动触发:满足 AOF 设置的策略触发和满足 AOF 重写触发always:每条 Redis 操作命令都会写入磁盘,最多丢失一条数据;everysec:每秒钟写入一次磁盘,最多丢失一秒的数据;no:不设置写入磁盘的规则,根据当前操作系统来决定何时写入磁盘,Linux 默认 30s 写入一次数据至磁盘
AOF 重写(解决无效信息/命令)不阻塞auto-aof-rewrite-min-size:允许 AOF 重写的最小文件容量,默认是 64mb 。auto-aof-rewrite-percentage:AOF 文件重写的大小比例,默认值是 100,表示 100%,也就是只有当前 AOF 文件,比最后一次(上次)的 AOF 文件大一倍时,才会启动 AOF 文件重写。
优:数据更加完整、持久数据是Redis 键值操作命令
缺:AOF 文件要大于 RDB 文件(同数据)、负载高时候性能问题
混合持久化方式,Redis 4.0支持,结合了 RDB 和 AOF 的优点Redis 5.0 默认值开启:aof-use-rdb-preamble yes
AOF 重写时会把 Redis 的持久化数据,以 RDB 的格式写入到 AOF 文件的开头,之后的数据再以 AOF 的格式化追加的文件的末尾
混合持久化的加载流程
优:更快启动,更少数据丢失
缺:文件可读性差、Redis4.0之前版本不支持
注:如果对数据不敏感,则禁用持久化,提升执行效率
持久化文件加载规则
1、如果只开启了 AOF 持久化,Redis 启动时只会加载 AOF 文件(appendonly.aof),进行数据恢复;2、如果只开启了 RDB 持久化,Redis 启动时只会加载 RDB 文件(dump.rdb),进行数据恢复;3、如果同时开启了 RDB 和 AOF 持久化,Redis 启动时只会加载 AOF 文件(appendonly.aof),进行数据恢复。
Redis 数据结构(9 种数据类型)
STRING( 字符串)
可以 是 字符串、 整数 或者 浮点 数
命令(通用的命令)
GET
GET <KEY>
SET
SET <KEY> <VALUE>
DEL
DEL <KEY>
LIST( 列表)
一个 链 表, 链 表上 的 每个 节点 都 包含 了 一个 字符串
命令
LPUSH
LPUSH <LIST-KEY> <VALUE>
LPUSH list-key 111
RPUSH
RPUSH <LIST-KEY> <VALUE>
RPUSH list-key 222
LPOP
LPOP <LIST-KEY> <VALUE>
LPOP list-key 111
RPOP
RPOP <LIST-KEY> <VALUE>
RPOP list-key 222
LINDEX
LINDEX <LIST-KEY> <INDEX>
LINDEX list-key 0
LRANGE
LRANGE <LIST-KEY> <START-INDEX> <END-INDEX>
LRANGE list-key 0 -1
SET( 集合)
包含 字符串 的 无序 收集 器( unordered collection), 并且 被 包含 的 每个 字符串 都是 独一无二、 各不相同 的
SADD
将给 定 元素 添加 到 集合
SMEMBERS <SET-KEY>
返回 集合 包含 的 所有 元素
SISMEMBER <SET-KEY> <VALUE>
检查 给定 元素 是否 存在 于 集合 中
HASH( 散 列)
包含 键值 对的 无序 散 列表
HSET
在 散 列 里面 关联 起 给定 的 键值 对
HSET <HASH-KEY> <KEY> <VALUE>
HGET
获取 指定 散 列 键 的 值
HGET <HASH-KEY> <KEY>
HGETALL
获取 散 列 包含 的 所有 键值 对
HGETALL <HASH-KEY>
HDEL
如果 给定 键 存 在于 散 列 里面, 那么 移 除 这个 键
HDEL <HASH-KEY> <KEY>
ZSET( 有序 集合)
字符串 成员( member) 与 浮点 数 分值( score) 之间 的 有序 映射, 元素 的 排列 顺序 由 分值 的 大小 决定
ZADD
将 一个 带有 给定 分值 的 成员 添加 到有 序 集合 里面
ZADD <ZSET-KEY> <VALUE> <KEY>
ZRANGE
根据 元素 在 有序 排列 中 所处 的 位置, 从 有序 集合 里面 获取 多个 元素
ZRANGEBYSCORE
获取 有序 集合 在给 定 分值 范围内 的 所有 元素
ZRANGE <ZSET-KEY> 0 -1 WITHSCORES
ZREM
如果 给定 成员 存在 于 有序 集合, 那么 移 除 这个 成员
ZREM <ZSET-KEY> <KEY>
范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询
Redis 事务
Redis 过期时间
expire、pexpire、expireat、pexpireat
字符串中的过期
set key value ex seconds:设置键值对的同时指定过期时间(精确到秒);set key value px milliseconds:设置键值对的同时指定过期时间(精确到毫秒);setex key seconds valule:设置键值对的同时指定过期时间(精确到秒)。
主:删除过期的key,从:没有过期概念
Redis key过期策略(删除已经过期的键值对)
定时删除:在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除
惰性删除:key过期的时候不删除,每次从数据库获取key的时候去检查是否过期,若过期,则删除,返回null。
定期删除 : 每隔一段时间执行一次删除(在redis.conf配置文件设置hz,1s刷新的频率)过期key操作
Redis 使用的是惰性删除+定期删除过期策略。
Redis 内存淘汰策略(maxmemory-policy)(超过 Redis 设置的最大内存-maxmemory)
1、noeviction:不淘汰任何数据,当内存不足时,新增操作会报错,Redis 默认内存淘汰策略;2、allkeys-lru:淘汰整个键值中最久未使用的键值;3、allkeys-random:随机淘汰任意键值;4、volatile-lru:淘汰所有设置了过期时间的键值中最久未使用的键值;5、volatile-random:随机淘汰设置了过期时间的任意键值;6、volatile-ttl:优先淘汰更早过期的键值。 Redis 4.0 版本+1、volatile-lfu:淘汰所有设置了过期时间的键值中,最少使用的键值;2、allkeys-lfu:淘汰整个键值中最少使用的键值。
LRU
LRU是Least Recently Used的缩写,即【最近最少使用】
LFU
LFU(least frequently used (LFU) ),即【最少频率使用】
04、进阶篇(登高望远)
Redis 管道技术-Pipeline
用于一次处理多个 Redis 命令,从而提高整个交互的性能
注意:发送的命令数量(缓存区也就是命令的最大存储体积为 1GB)
Redis 地理空间-GEO3.2+ 才能使用
经纬度查询工具
命令功能
查询位置信息
距离统计
查询某位置内的其他成员信息
应用场景1、查询附近的人、附近的地点等;2计算相关的距离信息。
Redis 游标迭代器(过滤器)-Scan
Scan 相关命令
scan cursor [MATCH pattern] [COUNT count]
SCAN 命令用于迭代当前数据库中的key集合。SSCAN 命令用于迭代SET集合中的元素。HSCAN 命令用于迭代Hash类型中的键值对。ZSCAN 命令用于迭代SortSet集合中的元素和元素对应的分值
不会出现像 KEYS 或者 SMEMBERS 命令带来的可能会阻塞服务器的问题
keys 命令 血案,数据量越大查询时间就越长(O-n)
Redis 消息队列
主题/广播
“发后既忘”和不能持久化
List 版消息队列
ZSet 版消息队列
Redis 5 Stream
05、实战(事必躬亲)
Redis 分布式锁
setnx(set if not exists)expire 不推荐:命令 SET resource-name anystring NX EX max-lock-time 是一种用 Redis 来实现锁机制的简单方法
Redission
Redis 布隆过滤器
对于布隆过滤器来说,它说没有的值一定没有,它说有的值有可能没有
guava实现布隆过滤器
场景
垃圾邮件过滤爬虫里的 URL 去重判断一个元素在亿级数据中是否存在
缓存穿透
Redis 实现延迟队列
ZSet 有一个 Score 属性可以用来存储延迟执行的时间实现机制:无限循环的方式来执行任务检查
RediSearch 高性能的全文搜索引擎
Redis Module(扩展模块)运行在 Redis 服务器上
初始化索引和字段
Redis 性能测试
测试方式
编写代码模拟并发进行性能测试;使用 redis-benchmark 进行测试。
技术选型,比如测试 Memcached 和 Redis;对比单机 Redis 和集群 Redis 的吞吐量;评估不同类型的存储性能,例如集合和有序集合;对比开启持久化和关闭持久化的吞吐量;对比调优和未调优的吞吐量;对比不同 Redis 版本的吞吐量,作为是否升级的一个参考标准。
Redis 慢查询
slowlog-log-slower-than 和 slowlog-max-len
清空 slowlog reset
Redis 性能优化方案
缩短键值对的存储长度;使用 lazy free(延迟删除)特性;设置键值的过期时间;禁用耗时长的查询命令;使用 slowlog 优化耗时命令;使用 Pipeline 批量操作数据;避免大量数据同时失效;客户端使用优化;限制 Redis 内存大小;使用物理机而非虚拟机安装 Redis 服务;检查数据持久化策略;使用分布式架构来增加读写速度。
Redis 主从同步
开启主从同步:replicaof host port
完整数据同步-》部分数据同步
Redis 哨兵模式
让 Redis 拥有自动容灾恢复(failover)的能力
Redis Sentinel 的最小分配单位是一主一从
Redis 集群模式
Redis 将所有的数据分为 16384 个 slots(槽),每个节点负责其中的一部分槽位
Redis Cluster 是无代理模式去中心化的运行模式
rebalance 命令重新分配各个节点负责的槽数量
案例:Redis 问题汇总和相关解决方案
缓存雪崩:短时间内,有大量缓存同时过期
加锁排队
随机化过期时间
缓存穿透:数据库和缓存都无数据
使用过滤器
缓存空结果
缓存击穿:某个热点缓存,在某一刻失效了,此时刚好有大量的并发请求
设置永不过期
缓存预热
数据不一致问题
Redis 监控/可视化工具
Redis Desktop Manager
RedisClient
AnotherRedisDesktopManager
Redis 面试总结
对比Memcached
而 memcached 只能 存储 普通 的 字符串 键。
Redis 除了 能 存储 普通 的 字符串 键 之外, 还可以 存储 其他 4 种数 据 结构,
Memcached 不具备持久化功能
Redis 属于单线程还是多线程
4单 6 多
单线程快原因
基于内存操作
多路复用和非阻塞 I/O
避免上下文切换
Redis 6.0 默认是禁用多线程的,线程数一定要小于机器核数,线程数并不是越大越好。多线程 I/O 的读写并发能力
Redis 如何实现限流功能
Redis 中的 ZSet(有序集合)加上滑动时间算法来实现简单的限流
单机:Google 开源的 guava 包,很方便的实现令牌桶算法
Redis-Cell 模块,该模块使用的是漏斗算法
Redis网站备忘
Redis中文官方网站
Redis Github地址
0 条评论
下一页