Redis入门

Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,其具备如下特性:

  • 基于内存运行,性能高效
  • 支持分布式,理论上可以无限扩展
  • key-value存储系统
  • 开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API

相比于其他数据库类型,Redis具备的特点是:

  • C/S通讯模型
  • 单进程单线程模型
  • 丰富的数据类型
  • 操作具有原子性
  • 持久化
  • 高并发读写
  • 支持lua脚本

基础类型

  • String
  • List
  • Hash
  • Set
  • SortSet

使用场景

  • 会话缓存
  • 消息队列
  • 活动排行榜或计数
  • 发布,订阅消息
  • 商品列表,评论列表
  • 分布式锁
    • redisTemplate
    • redisson

部署方式

  • 主从模式:
    主从模式的一个作用是备份数据,这样当一个节点损坏(指不可恢复的硬件损坏)时,数据因为有备份,可以方便恢复。另一个作用是负载均衡,所有客户端都访问一个节点肯定会影响Redis工作效率,有了主从以后,查询操作就可以通过查询从节点来完成。
    对主从模式必须的理解:一个Master可以有多个Slaves
    默认配置下,master节点可以进行读和写,slave节点只能进行读操作,写操作被禁止
    不要修改配置让slave节点支持写操作,没有意义,原因一,写入的数据不会被同步到其他节点;原因二,当master节点修改同一条数据后,slave节点的数据会被覆盖掉
    slave节点挂了不影响其他slave节点的读和master节点的读和写,重新启动后会将数据从master节点同步过来
    master节点挂了以后,不影响slave节点的读,Redis将不再提供写服务,master节点启动后Redis将重新对外提供写服务。
    master节点挂了以后,不会slave节点重新选一个master
    对有密码的情况说明一下,当master节点设置密码时:
    客户端访问master需要密码
    启动slave需要密码,在配置中进行配置即可
    客户端访问slave不需要密码

  • 哨兵模式:
    sentinel模式是建立在主从模式的基础上,如果只有一个Redis节点,sentinel就没有任何意义
    当master节点挂了以后,sentinel会在slave中选择一个做为master,并修改它们的配置文件,其他slave的配置文件也会被修改,比如slaveof属性会指向新的master
    当master节点重新启动后,它将不再是master而是做为slave接收新的master节点的同步数据
    sentinel因为也是一个进程有挂掉的可能,所以sentinel也会启动多个形成一个sentinel集群
    当主从模式配置密码时,sentinel也会同步将配置信息修改到配置文件中,不许要担心。
    一个sentinel或sentinel集群可以管理多个主从Redis。
    sentinel最好不要和Redis部署在同一台机器,不然Redis的服务器挂了以后,sentinel也挂了
    sentinel监控的Redis集群都会定义一个master名字,这个名字代表Redis集群的master Redis。
    当使用sentinel模式的时候,客户端就不要直接连接Redis,而是连接sentinel的ip和port,由sentinel来提供具体的可提供服务的Redis实现,这样当master节点挂掉以后,sentinel就会感知并将新的master节点提供给使用者。
    sentinel模式基本可以满足一般生产的需求,具备高可用性。但是当数据量过大到一台服务器存放不下的情况时,主从模式或sentinel模式就不能满足需求了,这个时候需要对存储的数据进行分片,将数据存储到多个Redis实例中,就是下面要讲的。

  • cluster模式:hsah一致性算法

常见问题

  • 缓存穿透:缓存穿透的概念很简单,用户想要查询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库查询。发现也没有,于是本次查询失败。当用户很多的时候,缓存都没有命中,于是都去请求了持久层数据库。这会给持久层数据库造成很大的压力,这时候就相当于出现了缓存穿透。
    解决方案:

    • 布隆过滤器
    • 缓存空对象
  • 缓存击穿:缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力
    解决方案:

    • 设置热点数据永远不过期
    • 更新数据时加互斥锁
  • 缓存雪崩:缓存雪崩是指,缓存层出现了错误,不能正常工作了。于是所有的请求都会达到存储层,存储层的调用量会暴增,造成存储层也会挂掉的情况
    解决方案:

    • 限流降级
    • 随机失效时间
    • 热点数据均匀分布在不同搞得缓存数据库中。
    • 设置热点数据永远不过期。
  • redis崩溃后如何保证恢复

    • RDB方式:通过快照完成的,当到达某个条件,redis会自动生成快照文件
      主要参数是单位时间和修改键的个数,可通过配置文件修改
      redis快照:redist使用fork函数,复制一个当前线程的副本,将内存中的数据写入临时文件,临时文件写完后,会覆盖调RDB文件
    • AOF方式:AOF默认关闭,开启后,会将每一个修改redis数据的操作记录下来,生成到AOF文件中
      主要参数是:占上次AOF文件大小的百分比(auto-aof-rewrite-percentage)和AOF文件最小大小(auto-aof-rewrite-min-size)
  • 缓存和数据库一致性问题

    • 先更新数据库,再删缓存,如果删除失败则异步重试
    • 订阅数据的日志Binlog,当Binlog日志发生变化时,阿里的canal会生成消息

参考文章

https://mp.weixin.qq.com/s/D4Ik6lTA_ySBOyD3waNj1w

posted @ 2020-09-15 21:44  mudongs  阅读(70)  评论(0)    收藏  举报