Redis(一期)
2022-10-19 15:22:15 0 举报
AI智能生成
redis知识点总结
作者其他创作
大纲/内容
Redis数据类型选择和应用场景
key的类型是字符串。
常用
string字符串类型
string字符串类型
Redis的String能表达3种值的类型:字符串、整数、浮点数 100.01 是个六位的串
应用场景:
1、key和命令是字符串
2、普通的赋值
3、incr用于乐观锁
incr:递增数字,可用于实现乐观锁 watch(事务)
incr:递增数字,可用于实现乐观锁 watch(事务)
4、setnx用于分布式锁
当value不存在时采用赋值,可用于实现分布式锁
当value不存在时采用赋值,可用于实现分布式锁
list列表类型
list列表类型
list列表类型可以存储有序、可重复的元素
获取头部或尾部附近的记录是极快的
list的元素个数最多为2^32-1个(40亿)
获取头部或尾部附近的记录是极快的
list的元素个数最多为2^32-1个(40亿)
应用场景:
1、作为栈或队列使用
列表有序可以作为栈和队列使用
列表有序可以作为栈和队列使用
2、可用于各种列表,比如用户列表、商品列表、评论列表等。
set集合类型
set集合类型
Set:无序、唯一元素
集合中最大的成员数为 2^32 - 1
集合中最大的成员数为 2^32 - 1
应用场景:
适用于不能重复的且不需要顺序的数据结构
比如:关注的用户,还可以通过spop进行随机抽奖
sortedset(zset)有序集合类型
sortedset有序集合类型
特点
SortedSet(ZSet) 有序集合: 元素本身是无序不重复的
每个元素关联一个分数(score)
可按分数排序,分数可重复
应用场景:
由于可以按照分值排序,所以适用于各种排行榜。比如:点击排行榜、销量排行榜、关注排行榜等。
hash类
型。
型。
hash类型(散列表)
Redis hash 是一个 string 类型的 field 和 value 的映射表,它提供了字段和字段值的映射。
每个 hash 可以存储 2^32 - 1 键值对(40多亿)。
每个 hash 可以存储 2^32 - 1 键值对(40多亿)。
应用场景:
对象的存储 ,表数据的映射
不常用的
bitmap位图类型
bitmap是进行位操作的
通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身。
bitmap本身会极大的节省储存空间。
通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身。
bitmap本身会极大的节省储存空间。
应用场景:
1、用户每月签到,用户id为key , 日期作为偏移量 1表示签到
2、统计活跃用户, 日期为key,用户id为偏移量 1表示活跃
3、查询用户在线状态, 日期为key,用户id为偏移量 1表示在线
geo地理位置类型
geo是Redis用来处理位置信息的。在Redis3.2中正式使用。主要是利用了Z阶曲线、Base32编码和
geohash算法
geohash算法
应用场景:
1、记录地理位置
2、计算距离
3、查找"附近的人"
Redis5.0新增一种:stream类型
stream是Redis5.0后新增的数据结构,用于可持久化的消息队列。
几乎满足了消息队列具备的全部内容,包括:
消息ID的序列化生成
消息遍历
消息的阻塞和非阻塞读取
消息的分组消费
未完成消息的处理
消息队列监控
每个Stream都有唯一的名称,它就是Redis的key,首次使用 xadd 指令追加消息时自动创建。
注意:Redis中命令是忽略大小写,(set SET),key是不忽略大小写的 (NAME name)
Redis的Key的设计
1. 用:分割
2. 把表名转换为key前缀, 比如: user:
3. 第二段放置主键值
4. 第三段放置列名
Redis扩展功能
发布与订阅
频道/模式的订阅与退订
发布订阅的机制
使用场景:哨兵模式,Redisson框架使用
在Redis哨兵模式中,哨兵通过发布与订阅的方式与Redis主服务器和Redis从服务器进行通信。这个我
们将在后面的章节中详细讲解。
Redisson是一个分布式锁框架,在Redisson分布式锁释放的时候,是使用发布与订阅的方式通知的,
们将在后面的章节中详细讲解。
Redisson是一个分布式锁框架,在Redisson分布式锁释放的时候,是使用发布与订阅的方式通知的,
事务
ACID回顾
Atomicity(原子性):构成事务的的所有操作必须是一个逻辑单元,要么全部执行,要么全部不
执行。Redis:一个队列中的命令 执行或不执行
执行。Redis:一个队列中的命令 执行或不执行
Consistency(一致性):数据库在事务执行前后状态都必须是稳定的或者是一致的。
Redis: 集群中不能保证时时的一致性,只能是最终一致性
Redis: 集群中不能保证时时的一致性,只能是最终一致性
Isolation(隔离性):事务之间不会相互影响。
Redis: 命令是顺序执行的,在一个事务中,有可能被执行其他客户端的命令的
Redis: 命令是顺序执行的,在一个事务中,有可能被执行其他客户端的命令的
Durability(持久性):事务执行成功后必须全部写入磁盘。
Redis有持久化但不保证 数据的完整性
Redis有持久化但不保证 数据的完整性
Redis事务
Redis的事务是通过multi、exec、discard和watch这四个命令来完成的。
Redis的单个命令都是原子性的,所以这里需要确保事务性的对象是命令集合。
Redis将命令集合序列化并确保处于同一事务的命令集合连续且不被打断的执行
Redis不支持回滚操作
事务命令
multi:用于标记事务块的开始,Redis会将后续的命令逐个放入队列中,然后使用exec原子化地执行这个
命令队列
命令队列
exec:执行命令队列
discard:清除命令队列
watch:监视key
unwatch:清除监视key
事务机制
事务的执行
Watch的执行
Redis的弱事务性
Lua脚本
lua是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用
程序中,从而为应用程序提供灵活的扩展和定制功能。
程序中,从而为应用程序提供灵活的扩展和定制功能。
Lua应用场景
游戏开发、独立应用脚本、Web应用脚本、扩展和数据库插件。
nginx上使用lua 实现高并发
OpenRestry:一个可伸缩的基于Nginx的Web平台,是在nginx之上集成了lua模块的第三方服务器
OpenRestry是一个通过Lua扩展Nginx实现的可伸缩的Web平台,内部集成了大量精良的Lua库、第三
方模块以及大多数的依赖项。
方模块以及大多数的依赖项。
用于方便地搭建能够处理超高并发(日活千万级别)、扩展性极高的动态Web应用、Web服务和动态网
关。
关。
功能和nginx类似,就是由于支持lua动态脚本,所以更加灵活。
OpenRestry通过Lua脚本扩展nginx功能,可提供负载均衡、请求路由、安全认证、服务鉴权、流量控
制与日志监控等服务。
OpenRestry通过Lua脚本扩展nginx功能,可提供负载均衡、请求路由、安全认证、服务鉴权、流量控
制与日志监控等服务。
创建并修改lua环境
Lua环境协作组件
EVAL/EVALSHA命令实现
EVAL命令
EVALSHA
SCRIPT命令
脚本管理命令实现
脚本复制
慢查询日志
慢查询设置
慢查询记录的保存
慢查询日志的阅览&删除
添加日志实现
慢查询定位&处理
1、尽量使用短的key,对于value有些也可精简,能使用int就int。
2、避免使用keys *、hgetall等全量操作。
3、减少大key的存取,打散为小key 100K以上
4、将rdb改为aof模式
rdb fork 子进程 数据量过大 主进程阻塞 redis性能大幅下降
关闭持久化 , (适合于数据量较小,有固定数据源)
rdb fork 子进程 数据量过大 主进程阻塞 redis性能大幅下降
关闭持久化 , (适合于数据量较小,有固定数据源)
5、想要一次添加多条数据的时候可以使用管道
6、尽可能地使用哈希存储
7、尽量限制下redis使用的内存大小,这样可以避免redis使用swap分区或者出现OOM错误
内存与硬盘的swap
内存与硬盘的swap
监视器
实现监视器
向监视器发送命令信息
Redis监控平台
Redis核心原理
Redis持久化
为什么要持久化
Redis是内存数据库,宕机后数据会消失。
Redis重启后快速恢复数据,要提供持久化机制
Redis持久化是为了快速的恢复数据而不是为了存储数据
Redis有两种持久化方式:RDB和AOF
注意:Redis持久化不保证数据的完整性。
当Redis用作DB时,DB数据要完整,所以一定要有一个完整的数据源(文件、mysql)
在系统启动时,从这个完整的数据源中将数据load到Redis中
在系统启动时,从这个完整的数据源中将数据load到Redis中
数据量较小,不易改变,比如:字典库(xml、Table)
RDB
RDB执行流程(原理)
RDB文件结构
RDB的优缺点
AOF
AOF持久化实现
AOF原理
AOF重写、触发方式、混合持久化
AOF文件的载入与数据还原
RDB与AOF对比
应用场景
底层数据结构
RedisDB结构
RedisObject结构
结构信息概览
7种type
10种encoding
缓存过期和淘汰策略
maxmemory
expire数据结构
删除策略
定时删除
惰性删除
主动删除
通讯协议及事件处理机制
通信协议
请求响应模式
请求数据格式
命令处理流程
协议响应格式
协议解析及处理
事件处理机制
文件事件
时间事件
aeEventLoop
aeMain
aeProcessEvent
Redis企业实战
架构设计
组件选择/多级
缓存大小
key数量
读写峰值
命中率
过期策略
性能监控指标
缓存预热
缓存问题
缓存穿透
缓存雪崩
缓存击穿
数据不一致
数据并发竞争
Hot Key
Big Key
缓存与数据库一致性
缓存更新策略
不同策略之间的优缺点
与Mybatis整合
分布式锁
watch
setnx
Redission分布式锁的使用
分布式锁的特性
ookeeper分布式锁的对比
分布式集群架构中的session分离
阿里Redis使用手册
键值设计
命令使用
客户端使用
相关工具
删除BigKey
Redis高可用方案
主从复制
主从配置
主Redis配置
从Redis配置
作用
读写分离
数据容灾
原理与实现
复制流程
同步数据集
心跳检测
哨兵模式
部署方案
搭建配置
执行流程
哨兵leader选举
故障转移
主服务器的选择
集群与分区
分区的意义
分区的方式
client端分区
proxy端分区
官方cluster分区
部署架构
分片
容灾
常见缓存分类
客户端缓存
传统互联网
页面缓存
页面自身对某些元素或全部元素进行存储,并保存成文件。
浏览器缓存
当客户端向服务器请求资源时,会先抵达浏览器缓存,如果浏览器有“要请求资源”的副本,就可以直接
从浏览器缓存中提取而不是从原始服务器中提取这个资源。
从浏览器缓存中提取而不是从原始服务器中提取这个资源。
浏览器缓存分类
强制缓存
直接使用浏览器的缓存数据
协商缓存
服务器资源未修改,使用浏览器的缓存(304);反之,使用服务器资源(200)。
移动互联网
APP缓存
原生APP中把数据缓存在内存、文件或本地数据库(SQLite)中。比如图片文件。
网络端缓存
Web代理缓存
可以缓存原生服务器的静态资源,比如样式、图片等。
常见的反向代理服务器比如大名鼎鼎的Nginx。
边缘缓存
边缘缓存中典型的商业化服务就是CDN了。
CDN通过部署在各地的边缘服务器,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度
和命中率。
和命中率。
CDN的关键技术主要有内容存储和分发技术。现在一般的公有云服务商都提供CDN服务。
服务端缓存
数据库级缓存
数据库是用来存储和管理数据的。
MySQL在Server层使用查询缓存机制。将查询后的数据缓存起来。
K-V结构,Key:select语句的hash值,Value:查询结果
InnoDB存储引擎中的buffer-pool用于缓存InnoDB索引及数据块。
平台级缓存
平台级缓存指的是带有缓存特性的应用框架。
比如:GuavaCache 、EhCache(二级缓存,硬盘)、OSCache(页面缓存)等。
部署在应用服务器上,也称为服务器本地缓存。
部署在应用服务器上,也称为服务器本地缓存。
应用级缓存
具有缓存功能的中间件:Redis、Memcached、EVCache(AWS)、Tair(阿里 、美团)等。
采用K-V形式存储。
利用集群支持高可用、高性能、高并发、高扩展。
分布式缓存
缓存的优势、代价
使用缓存的优势
提升用户体验
减轻服务器压力
提升系统性能
使用缓存的代价
额外的硬件支出
高并发缓存失效
缓存与数据库数据同步
缓存并发竞争
Main Topic
Main Topic
缓存的读写模式
Cache Aside Pattern(常用)
Main Topic
Read/Write Through Pattern
Main Topic
Write Behind Caching Pattern
Main Topic
缓存架构设计思路
多层次
Main Topic
数据类型
Main Topic
要做集群
Main Topic
缓存的数据结构设计
Redis简介和安装
Redis简介
什么是Redis
Main Topic
Redis发展历史
Main Topic
Redis应用场景
Main Topic
Redis单机版安装和使用
Redis下载
Redis安装环境
Redis安装
Redis启动
前端启动
后端启动的关闭方式
命令说明
Redis客户端访问
Java程序访问Redis
Main Topic
Spring访问Redis
Main Topic
SpringBoot访问Redis
Main Topic
0 条评论
下一页