redis

redis

TEXT:

redis

 

  • 授课思想
    • redis是什么
      • 开源免费,BSD协议,C语言编写
    • 为什么学习redis,redis怎么用
    • springboot2.x中redis进行连接(RedisTemplate[Lettuce]),之前是jedis
    • 特点
      • 持久化,AOF和RDB机制
      • 多种数据结构
      • 支持数据备份,集群等高可用功能
      • 读写速度快,读11w,写8w
      • 单线程-原子性,通过MULTI和EXEC指令包起来
      • 队列,发布订阅/过期
      • 分布式
      • 单key可存入512M大小
    • 缺点
      • 持久化的过程代价高,2种方式;耗内存
  • 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
  • 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种配置策略
    • 守护进程方式启动
      • ./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:?
          • ?表示一个字符
      • key的命名建议
        • 不要太长,不超过1024B,不要太短,业务含义可读性差,统一格式:如,user:123:name
  • 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
  • 其他功能
    • 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命令恢复数据,不会丢失数据
    • 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的问题
    • 高可用
      • 通过设计,减少系统停工时间,通俗讲就是:可以一直用
    • 高并发
      • t通过设计,使系统在同一时间段内可以处理很多请求
      • 吞吐量
        • 吞吐量是指单位时间内系统能处理的请求数量,体现系统处理请求的能力,这是目前最常用的性能测试指标。
        • QPS(TPS),并发数、响应时间它们三者之间的关系是:QPS(TPS)= 并发数/平均响应时间
      • 垂直扩展和水平扩展
        • 垂直扩展:提高硬件;水平扩展:增加服务器的数量
    • redis 3.0版本之前
      • redis主从复制
        • master不用做任何修改,从库,配置改端口,启动命令./bin/redis-server redis.conf -port 6380 --slaveof 127.0.0.1 6379
      • 哨兵模式
    • redis 3.0版本之后
      • redis集群
        • 三种:推特,豌豆荚,redis官网 的redis-cluster
    • redis集群概述
      • redis至少3(master)+ 3(slave)才能搭建集群:无中心结构,每个节点保存数据和整个集群的状态
      • 特点
        • 所有节点彼此互联,采用二进制协议优化传输速度和带宽;
        • 节点的fail,半数以上检测失效;
        • 客户端与redis直连(任一节点);
        • redis-cluster把所有物理节点分配到hash槽(不一定平均),由cluster维护;
        • key经过算法,大致平均分配到不同的hash槽里
      • 容错
        • 硬软件发生错误,从错误中恢复的能力。通常从可用,可靠,可测方面衡量
      • 节点分配
        • 官方推荐三个maser:
          • 节点A,覆盖 0~5460
          • 节点B,覆盖 5461~10922
          • 节点C,覆盖 10923~16383
    • redis集群搭建
      • 真集群(不同服务器上),假集群(同一台机器)。例子参考视频
      • 集群测试
  • redis面试
    • redis数据类型几种,各自特性,应用场景
    • 集群方案,3.0版本前后发生了什么变化
    • 数据路由方案与一般的有什么,为什么这么设计,优劣势是什么
    • AOF和RDB机制是如何实现的,他的过期键的策略底层的机制是什么
    • 5.0的版本的string的数据结构为什么会提出来,借鉴了kafka的哪些特性和机制
    • 实际缓存设计中先存db还是缓存,缓存和db的方案如何基于业务合理的设计
发布了8 篇原创文章 · 获赞 1 · 访问量 94
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览