一、reids常见数据结构
-
基本类型
-
String: 普通key-value
-
Hash: 类似hashMap
-
List: 双向链表
-
Set: 不可重复
-
SortedSet: 不可重复、有序、hash+跳表
-
-
特殊类型
二、redis通用命令
-
keys: 所有key
-
del: 删除key
-
exists:判断是否存在
-
expire: 设置有效期
-
ttl:查看剩余失效时间
三、Redis常见命令
string类型
-
特性:
-
常见命令:
hash类型
-
特性:
-
hash类型、也叫散列、其value是一个无序字典、类似java中hashMap
-
-
常见命令:
list类型
-
特性:
-
常见命令
-
场景
-
1.模拟栈
-
入口和出口在同一边、先进后出
-
2.模拟队列
-
入口和出口不在同一边、先进先出
-
3.阻塞队列
-
入口出口不在同一边、出队时候才有blpop或者brpop
-
set类型
-
特性:
-
可以看作value为null的hashMap
-
无序
-
元素不可重复
-
查找快
-
支持交并差
-
-
常见命令
sortedSet类型
-
特性
-
常见命令
Geo类型
-
概述
-
允许地理坐标信息,帮助我们通过经纬度来检索数据
-
-
常见命令
BitMap类型
-
概述
-
Redis**中是利用string类型数据结构实现BitMap,**因此最大上限是512M,转换为bit则是 2^32个bit位
-
-
常见命令
-
场景
HyperLogLog类型
-
概述
-
HLL是基于string结构实现的,单个HLL的内存永远小于16kb!作为代价,其测量结果是概率性的,有小于0.81%的误差
-
-
常见命令
-
作用
-
做海量数据统计
-
-
优点
-
内存占用极低
-
性能非常好
-
-
缺点
-
有一定的误差
-
redis应用场景
-
基于list实现点赞列表
-
基于sortebSet实现排行榜
-
基于set实现共同关注、共同好友
-
基于bitMap实现签到数据统计
-
基于hyperLogLog实现Uv统计
-
geoHash实现地理位置
-
Lua分布式锁、计数器
-
热点数据查询
-
共享session
-
时效性数据、短信验证码
-
全局唯一id
-
分布式锁
四、Redis缓存优缺点
五、Redis缓存更新策略
-
低一致性:
-
超时时间机制、内存默认淘汰机制
-
六、缓存穿透、击穿、雪崩
穿透
-
出现原因:
-
请求缓存数据库中不存在的值
-
击穿
-
出现原因
-
热点数据失效、大并发打入数据库
-
-
解决方案
雪崩
-
出现原因
-
大批量key同时失效、并发同时打入数据库/reids宕机
-
-
redis高可用
七、分布式锁
满足分布式系统或集群下多进程可见并且互斥的锁
setNx实现方案
-
实现思路
-
利用setnx获取锁、并设置过期时间、保存线程标识
-
释放锁先判断线程标识是否与自己一致、一致则删除(原因:不加标识如果线程阻塞、锁超时释放、则其他线程获取到该锁、如果没有唯一标识则可能会删别人的锁、造成并发问题)
-
特性
-
利用setNx满足互斥
-
利用超时时间避免死锁
-
利用redis集群保证高可用高并发
-
-
出现问题
-
不可重试:获取锁只尝试一次没有重试机制的话会造成500人1秒并发进行抢购100商品、可能会出现商品还有剩余
-
超时释放:如果线程执行较长、导致锁释放、存在隐患
-
-
主从一致性:如果redis主从存在延迟、当主节点宕机、如果存在数据部分未同步、主从出现了切换、存在隐患
Redission实现方案
-
原理
-
缺陷
-
redis宕机引起琐失效
-
redission的mulyLock实现方案(连锁)
八、秒杀设计思路
-
先利用redis完成库存余量、单数限制,完成抢单业务
-
再将下单业务放入队列,进行异步下单
九、redis消息队列
-
实现方案
-
list结构:基于list结构模拟消息队列
-
PubSub:基本的点对点消息模型,订阅发布模式
-
Stream:5.0版本比较完善的消息队列模型
-
特点
-
消息可回溯
-
消息可被多消费
-
可以阻塞读取
-
有消息漏读风险
-
-
基于stream的XREADGROUP(消息组)
-
消息可回溯
-
可以争抢消费
-
可以阻塞读取
-
没有漏读风险
-
有消息确认机制。保证消息至少消费一次
-
-
-
十、Redis持久化
-
持久化方案
-
RDB持久化
-
AOF持久化
-
RDB方式
内存快照
-
执行时机
-
执行save命令(阻塞)
-
执行bgsave命令(异步)
-
reids正常停机时
-
触发RDB条件时
# 900秒内,如果至少有1个key被修改,则执行bgsave , 如果是save "" 则表示禁用RDB
save 900 1
save 300 10
save 60 10000
-
-
原理
-
bgsave基本流程
-
RDB缺点
-
数据有丢失风险
-
fork子进程、压缩、写出RDB文件都比较耗时
-
AOF方式
Redis处理的每一个写命令都会记录在AOF文件,可以看做是命令日志文件。
-
# 表示每执行一次写命令,立即记录到AOF文件
appendfsync always
# 写命令执行完先放入AOF缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案
appendfsync everysec
# 写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
appendfsync no -
策略对比
十一、主从
单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。
-
主从同步流程:
-
注意:
-
repl_balLog:大小有上限,写满后会覆盖最早数据,环形覆盖,如果slav断开太长,长时间位同步,偏移量被覆盖则会再次触发全量同步
-
-
全量和增量区别
-
什么时候全量,什么时候增量
-
全量
slave首次连接master节点
slave断开太久,偏移量已被覆盖
-
增量
slave断开又恢复,偏移量没有被覆盖
-
-
优化方案
十二、哨兵
Redis提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复。
-
作用
-
工作原理
-
每隔1秒发送一次ping命令,如果超过一定时间没有相向则认为是主观下线
-
如果大多数sentinel都认为实例主观下线,则判定服务下线
-
-
故障转移
-
java集成哨兵配置
spring:
redis:
sentinel:
master: sentinelmaster
nodes:
- 192.168.3.161:27001
- 192.168.3.161:27002
- 192.168.3.161:27003 -
java配置读写分离
@Bean
public LettuceClientConfigurationBuilderCustomizer clientConfigurationBuilderCustomizer(){
// MASTER:从主节点读取
//MASTER_PREFERRED:优先从master节点读取,master不可用才读取replica
//REPLICA:从slave(replica)节点读取
//REPLICA _PREFERRED:优先从slave(replica)节点读取,所有的slave都不可用才读取master
return clientConfigurationBuilder -> clientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED);
}
十三、分片集群
-
为了解决
-
海量数据存储问题
-
-
高并发写的问题
-
特征
-
集群中有多个master,每个master保存不同数据
-
每个master都可以有多个slave节点
-
master之间通过ping监测彼此健康状态
-
客户端请求可以访问集群任意节点,最终都会被转发到正确节点
-
-
如何定位hash槽
-
根据有效key进行hash,对16384取余
-
余数作为插槽,寻找插槽所在位置即可
-
-
-
这一类数据使用相同的有效部分,例如key都以{typeId}为前缀
-
-
java分片集群配置
spring:
redis:
cluster:
nodes:
- 192.168.3.161:7001
- 192.168.3.161:7002
- 192.168.3.161:7003
- 192.168.3.161:8001
- 192.168.3.161:8002
- 192.168.3.161:8003
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。