TEXT:
redis
- 授课思想
- redis是什么
- 开源免费,BSD协议,C语言编写
- 为什么学习redis,redis怎么用
- springboot2.x中redis进行连接(RedisTemplate[Lettuce]),之前是jedis
- 特点
- 持久化,AOF和RDB机制
- 多种数据结构
- 支持数据备份,集群等高可用功能
- 读写速度快,读11w,写8w
- 单线程-原子性,通过MULTI和EXEC指令包起来
- 队列,发布订阅/过期
- 分布式
- 单key可存入512M大小
- 缺点
- 持久化的过程代价高,2种方式;耗内存
- redis是什么
- NOSQL
- 类型
- 键值
- redis
- 图
- neo4j
- 文档
- mongodb
- 列存储数据库
- hbase
- 键值
- 适用场景
- 数据模型比较简单,对数据性能要求较高,不需要高度的数据一致性,对于给定key,比较容易映射复杂值
- 类型
- redis安装
- linux
- 依赖gcc
- 下载,解压,安装,make或make MALLOC=libc
- make PREFIC=/user/local/redis install
- 安装到指定目录
- /usr/local/redis/bin下命令,服务与客户端启动命令
- 客户端:ping→PONG
- linux
- redis核心配置文件redis.conf讲解文件
- 将redis.conf拷贝到安装目录bin同级文件夹下
- 修改启动方式(守护进程)
- daemonize no/yes
- 持久化配置(条件)
- save <seconds> <changes>
- 默认提供三个条件(并行)
- save 900 1
- 需要密码访问
- requirepass password123
- redis最大内存机制
- maxmemory <bytes>
- 建议占比1/4,1/2
- 内存打满解决方式
- 设置过期时间
- 采用LRU算法动态删除不用的数据,8种配置策略
- maxmemory <bytes>
- 守护进程方式启动
- ./redis-server ./redis.conf
- ps -ef|grep -i redis
- 客户端用密码登录
- ./redis-cli -h host -p port -a password
- 本机简写:./redis-cli -a password
- 客户端关闭
- kill -9 pid
- ./redis-cli shutdown
- 已经连接上客户端,直接执行shutdown
- redis常用命令
- 菜鸟教程 管理key键
- exists key
- 应用场景
- 限时活动的优惠信息,网站数据缓存(积分榜),手机验证码,限制网站访客访问频率
- 应用场景
- keys
- keys *
- 所有
- keys user:?
- ?表示一个字符
- keys *
- key的命名建议
- 不要太长,不超过1024B,不要太短,业务含义可读性差,统一格式:如,user:123:name
- exists key
- 菜鸟教程 管理key键
- redis常用数据类型
- string
- 二进制安全
- 传输时,保证二进制数据安全,也就是不被篡改,破译。如果被攻击,能够及时检测出来
- 特点
- redis客户端→redis服务端→硬盘
- 编码,解码发生在客户端完成,执行效率高
- 不需要频繁的编解码,不会出现乱码
- 传统二进制不安全的方式举例
- html/jsp→java→mysql→硬盘
- 此过程中每个箭头中都可能会发生编码解码步骤,有被篡改的风险
- setnx key value 不存在就插入(not exists) setex key time value 过期时间(expire)
- 计数器
- 二进制安全
- hash
- 适合用于存储javaBean,User(id,name,age)
- hash的value实际是一个hashmap
- list
- 类似于java中linkedlist
- 应用场景
- 对数据量大的集合数据删减
- 关注列表,粉丝列表,留言评价
- lrange实现分页效果
- 任务队列
- 体检:ABC三人体检123三个项目,最多场景下可以每个项目一个人,成三个队列
- 商品下单后,物流任务队列和物流已完成环节队列
- RPOPLPUSH source队列 destnation队列
- 对数据量大的集合数据删减
- set
- 类似于java中hashtable
- 场景
- 抽奖功能
- SRANDMEMBER key [count] 返回集合中一个或多个随机数
- REM key member1 [member2] 移除集合中一个或多个成员
- SPOP key 移除并返回集合中的一个随机元素
- 共同好友,关注
- 交集,差集,并集
- 唯一性,存ip
- 抽奖功能
- zset
- 每个元素关联一个double类型的分数,并以此,从小到大排序,成员唯一,分数可以重复
- 场景
- 网站排行榜,奥运金牌榜,学生成绩列表,带权重队列
- hyperloglog
- string
- 其他功能
- redis订阅发布
- 命令
- subscribe cctv5
- publish cctv5 nba信息
- 通常先订阅消息,再发布消息
- 场景
- 聊天室,群聊,订阅号,博客订阅
- 命令
- 多数据库
- select dbIndex,move key1 db,flushdb,flushall
- 缓存预热:开发人员清理数据库后,主流程执行一遍,将冒烟数据缓存到redis
- redis事物
- redis执行一个事物中的命令或多命令,在exec前都会放入执行序列(命令会序列化),执行过程中不允许加塞
- 开始事务→命令入队→执行事务
- set a 80,set b 30,multi,get a ,get b, decrby a 50,incrby b 50,exec
- multi后的命令不会立即执行,直到exec,才开始依次执行
- mulit→exec 报错处理:语法无错误,仅仅报错的命令行不予执行,其余指令照常运行,不予回滚 语法有错误,则会回滚事物
- 放弃队列执行,discard,(multi后,exec前)
- watch
- watch,监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
- watch a,multi,get a ,get b, decrby a 50,incrby b 50,exec
- 应用场景
- 商品秒杀,一组命令同事执行,要么都不执行
- redis数据淘汰策略
- 6~8?种:应主动设置key的过期时间,保证redis的 高性能
- redis持久化
- RDB
- 保存快,还原快,不适宜小内存机器
- 满足条件执行快照:1正常关闭,shutdown,2 满足save条件配置
- AOF
- 每次执行写命令都会将(写命令)用write函数存入.aof文件中,重启redis会执行.aof命令恢复数据,不会丢失数据
- RDB
- redis缓存与数据库同步
- 实时同步
- 对强一致性要求高的数据,先查缓存,没有查db,更新时先更新db,再更新缓存
- 建议给key设置过期时间,而不是直接更新缓存内容:热点数据
- 异步队列
- 使用kafka作为异步队列
- 使用阿里的canal
- 模拟mysql-slave
- udf自定义函数方式
- sql触发器:一种特殊类型的存储过程
- lua脚本,同步数据
- 定时任务
- 实时同步
- redis知识点总结
- 缓存穿透
- 查询一个一定不存在的数据,缓存中查不到就从db查,db查不到则不写入缓存,这样每次请求都到db,造成缓存穿透
- 解决办法:db查不到数据就缓存空结果 "",下次exists(key),存在返回空,不存在则查询db
- 缓存雪崩
- 缓存集中在一段时间内失效,发生大量的缓存穿透,所有请求都落到db,造成缓存雪崩
- 解决办法:没有特别好的办法,均匀分配过期时间,加锁排队,2 限流--限流算法:令牌桶 漏桶
- 热点key(双重锁)
- 使用锁,单机使用sychronized,lock,分布式系统使用分布式锁
- 缓存过期时间不设置,而是冗余到key的value里,当检测到存的时间超过过期时间,则异步更新数据
- 缓存标签:用另一个缓存标签来存过期时间,当缓存标签过期时,更新实际缓存
- 缓存穿透
- redis订阅发布
- redis高级
- 单点redis的问题
- 高可用
- 通过设计,减少系统停工时间,通俗讲就是:可以一直用
- 高并发
- t通过设计,使系统在同一时间段内可以处理很多请求
- 吞吐量
- 吞吐量是指单位时间内系统能处理的请求数量,体现系统处理请求的能力,这是目前最常用的性能测试指标。
- QPS(TPS),并发数、响应时间它们三者之间的关系是:QPS(TPS)= 并发数/平均响应时间
- 垂直扩展和水平扩展
- 垂直扩展:提高硬件;水平扩展:增加服务器的数量
- redis 3.0版本之前
- redis主从复制
- master不用做任何修改,从库,配置改端口,启动命令./bin/redis-server redis.conf -port 6380 --slaveof 127.0.0.1 6379
- 哨兵模式
- redis主从复制
- redis 3.0版本之后
- redis集群
- 三种:推特,豌豆荚,redis官网 的redis-cluster
- redis集群
- redis集群概述
- redis至少3(master)+ 3(slave)才能搭建集群:无中心结构,每个节点保存数据和整个集群的状态
- 特点
- 所有节点彼此互联,采用二进制协议优化传输速度和带宽;
- 节点的fail,半数以上检测失效;
- 客户端与redis直连(任一节点);
- redis-cluster把所有物理节点分配到hash槽(不一定平均),由cluster维护;
- key经过算法,大致平均分配到不同的hash槽里
- 容错
- 硬软件发生错误,从错误中恢复的能力。通常从可用,可靠,可测方面衡量
- 节点分配
- 官方推荐三个maser:
- 节点A,覆盖 0~5460
- 节点B,覆盖 5461~10922
- 节点C,覆盖 10923~16383
- 官方推荐三个maser:
- redis集群搭建
- 真集群(不同服务器上),假集群(同一台机器)。例子参考视频
- 集群测试
- redis面试
- redis数据类型几种,各自特性,应用场景
- 集群方案,3.0版本前后发生了什么变化
- 数据路由方案与一般的有什么,为什么这么设计,优劣势是什么
- AOF和RDB机制是如何实现的,他的过期键的策略底层的机制是什么
- 5.0的版本的string的数据结构为什么会提出来,借鉴了kafka的哪些特性和机制
- 实际缓存设计中先存db还是缓存,缓存和db的方案如何基于业务合理的设计