Redis笔记
发布日期:2022-09-29 16:52:46 浏览次数:2 分类:技术文章

本文共 14000 字,大约阅读时间需要 46 分钟。

使用场景:

    发布、订阅消息系统
    地图信息分析
    定时器、计数器
    String数据结构是简单的key-value类型,value其实不仅可以是String,也可以是数字。
        常规key-value缓存应用:
        常规计数:微博数,粉丝数等。

   set使用地方: 在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis还为

集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能

  hash使用:Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。

  存储部分变更的数据,如用户信息等。

  Zset使用:排行榜应用; 取TOP N操作 !

1.网站的瓶颈?

     1.数据量太大,一个机器放不下
     2.数据的索引(B+Tree),一个机器内存也放不下
     3.访问量(读写混合),一个服务器承受不了

2. 数据库优化的发展过程?

     1.优化mysql底层的数据结构和索引
      2.文件缓存(IO)
      3.Memcached(当时最热门的技术)
      4.读写分离
      5.分库分表

3.  MyISAM :表锁(将整个表锁了),十分影响效率,高并发下出现严重的锁问题

    Innodb:行锁(一行一行的锁)
     使用分库分表来解决 写 的压力

4.   NoSQL

      NoSQL = Not Only SQL,意思:不仅仅是SQL,泛指非关系型的数据库

     很多的数据类型:用户信息,地理位置,社交网络,这些数据类型的存储不需要一个固定的

       格式,可以使用Map<String,Object>使用键值对来进行控制

5. NoSQL 的特点?
      1.易扩展
      2.大数据量高性能  官方记录:Redis 一秒可以写8万次,读11万次!
      3.多样灵活的数据模型 (不需要事先设计数据库   随取随用,)

     NoSQL

- 代表着不仅仅是SQL
- 没有声明性查询语言
- 没有预定义的模式
- 键值对存储,列存储,文档存储,图形数据库
- 最终一致性,而非ACID属性
- 非结构化和不可预知的数据
- CAP定理 - BASE
    高性能,高可用性 和 可伸缩性

6.大数据时代的3V : 主要是对问题的描述

海量 Volume
多样 Variety
实时 Velocity

互联网需求的3高 : 主要是对程序的要求

高并发
高可用
高性能

7.  做一个架构师?

      没有什么是加一层解决不了的

8. 文档型数据库:MongoDB    (商品描述、详情、评价信息(多文字类))

9.商品的图片?

      分布式文件系统  FastDFS
       淘宝自己的   TFS
       Google的 GFS
      Hadoop  HDFS
       阿里云的   oss

10. 商品的关键字(搜索)?

       搜索引擎,淘宝内用 ISearch:多隆 一高兴一个人开发的
      搜索引擎: solr   es
       

11. 商品的热门的波段信息?

        内存数据库
      Redis  Tair  Memache

12.  商品的交易,外部的支付接口?

         三方应用, 一个支付接口

13.   大型互联网的应用问题?

         1.数据类型太多了
         2.数据源繁多,经常重构
         3.数据要改造,大面积改造

     解决方法: UDSL(统一数据服务平台)

14.NoSQL四大分类?

      1.KV键值:
    新浪:BerkeleyDB+redis
    美团:redis+tair
    阿里、百度:memcache+redis

  2.文档型数据库(bson格式比较多):

    MongoDB
    MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可
    扩展的高性能数据存储解决方案。
             MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰
富,最像关系数据库的。

  3.列存储数据库:
          HBase
        分布式文件系统

   4.图关系数据库
它不是放图形的,放的是关系比如:朋友圈社交网络、广告推荐系统
社交网络,推荐系统等。专注于构建关系图谱
Neo4J

15. Redis能干嘛?

    内存存储和持久化:redis支持异步将内存中的数据写到硬盘上,同时不影响继续服务
    取最新N个数据的操作,如:可以将最新的10条评论的ID放在Redis的List集合里面

 使用场景:

    发布、订阅消息系统
    地图信息分析
    定时器、计数器
    String数据结构是简单的key-value类型,value其实不仅可以是String,也可以是数字。
        常规key-value缓存应用:
        常规计数:微博数,粉丝数等。

16.Redis-benchmark是官方自带的Redis性能测试工具,可以有效的测试Redis服务的性能。

17. Redis 启动命令?

        # 【shell】启动redis服务
      [root@192 bin]# cd /usr/local/bin
        [root@192 bin]# redis-server /opt/redis-5.0.7/redis.conf

     # redis客户端连接===> 观察地址的变化,如果连接ok,是直接连上的,redis默认端口号 6379

      [root@192 bin]# redis-cli -p 6379

     # 【shell】ps显示系统当前进程信息

      [root@192 myredis]# ps -ef|grep redis

     # 【redis】关闭连接

       127.0.0.1:6379> shutdown

18.  Redis里面有16个数据库,默认使用的是第0个

       # 切换数据库
        127.0.0.1:6379> select 7

      #DBSIZE查看当前数据库的key的数量

      127.0.0.1:6379[7]> DBSIZE
       (integer) 0

     #清除当前数据库

       127.0.0.1:6379> FLUSHDB
       OK

       #Flushall:清空全部的库

     #查看所有的name值

      127.0.0.1:6379>keys *
 
     #判断name是否存在
     127.0.0.1:6379>EXI

19. redis 6.0 引入了对多线程,为了提高网络IO读写性能,但是

     默认关闭,并且执行命令是单线程的

20. redis为什么单线程还这么快?

      核心:redis是将所有的数据全部存放在内存中的,所以说使用单线程去操作效率就
       是最高的,多线程(CPU上下文会切换,耗时的操作),对于内存来说,
       如果没有上下文切换,效率就是最高的。 多次读写都是在一个CPU上的
    CPU> 内存 > 硬盘

     这种模拟出来的情况就有一个代价,就是上下文的切

换,对于一个内存的系统来说,它没有上下文的切换就是效率最高的。redis 用 单个CPU 绑定一块内存
的数据,然后针对这块内存的数据进行多次读写的时候,都是在一个CPU上完成的,所以它是单线程处
理这个事。在内存的情况下,这个方案就是最佳方案。

21.  redis常见的五大数据类型?

        Redis-key
        String
         List
        Set
         Hash   
         Zset
     三种特殊的数据类型?
         geospatial
          hyperloglog
          bitmaps

 1.  String类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象。

   String类型是redis最基本的数据类型,一个redis中字符串value最多可以是512M。

   2. Hash(哈希,类似 Java里的Map)

       Redis hash 是一个键值对集合。
       Redis hash 是一个String类型的field和value的映射表,hash特别适合用于存储对象。
      类似Java里面的Map<String,Object>

   3.List(列表)

        Redis列表是简单的字符串列表,按照插入顺序排序,你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
        它的底层实际是个链表 !

   4. Set(集合)

          Redis的Set是String类型的无序集合,它是通过HashTable实现的

   5. Zset(sorted set:有序集合)

22. Redis-Key 是什么?

# keys * 查看所有的key
127.0.0.1:6379> keys *
(empty list or set)

127.0.0.1:6379> set name qinjiang

OK

127.0.0.1:6379> keys * 1) "name"

 # exists key 的名字,判断某个key是否存在

127.0.0.1:6379> EXISTS name
(integer) 1

127.0.0.1:6379> EXISTS name1

(integer) 0

# move key db ---> 当前库就没有了,被移除了

127.0.0.1:6379> move name 1
(integer) 1
127.0.0.1:6379> keys *
(empty list or set)
# expire key 秒钟:为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删 除。
# ttl key 查看还有多少秒过期,-1 表示永不过期,-2 表示已过期
127.0.0.1:6379> set name qinjiang
OK

# type key 查看你的key是什么类型

127.0.0.1:6379> type name
string

23.字符串 String 常用命令?

     set key1 value1 # 设置值
      get key1           # 获得key
     del key1           # 删除key
      keys *              # 查看全部的key
     append key1 "hello" # 对不存在的 key 进行 APPEND ,等同于 SET key1 "hello"
     STRLEN key1     # # 获取字符串的长度  

       # incr、decr 一定要是数字才能进行加减,+1 和 -1。

      # incrby、decrby 命令将 key 中储存的数字加上指定的增量值。

     # range [范围]

     # getrange 获取指定区间范围内的值,类似between...and的关系,从零到负一表示全部

    # mset Mset 命令用于同时设置一个或多个 key-value 对。

   # mget Mget 命令返回所有(一个或多个)给定 key 的值。
     # 如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。
     # msetnx 当所有 key 都成功设置,返回 1 。 # 如果所有给定 key 都设置失败(至少有一个 key 已经存在),那么返回 0 。原子操 作

     String数据结构是简单的key-value类型,value其实不仅可以是String,也可以是数字。

        常规key-value缓存应用:
        常规计数:微博数,粉丝数等。

24.列表List 常用命令?

       # Lpush:将一个或多个值插入到列表头部。(左)
       # rpush:将一个或多个值插入到列表尾部。(右)
      # lrange:返回列表中指定区间内的元素,区间以偏移量 START 和 END 指定。

    # lpop 命令用于移除并返回列表的第一个元素。当列表 key 不存在时,返回 nil 。

     # rpop 移除列表的最后一个元素,返回值为移除的元素。

      Lindex,按照索引下标获得元素(-1代表最后一个,0代表是第一个)

     llen 用于返回列表的长度。

     lrem key 根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素。

     # Ltrim key 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区 间之内的元素都将被删除。

    # rpoplpush 移除列表的最后一个元素,并将该元素添加到另一个列表并返回。

    # lset key index value 将列表 key 下标为 index 的元素的值设置为 value 。

   List 性能总结

它是一个字符串链表,left,right 都可以插入添加
如果键不存在,创建新的链表
如果键已存在,新增内容
如果值全移除,对应的键也就消失了
链表的操作无论是头和尾效率都极高,但假如是对中间元素进行操作,效率就很惨淡了。

   Redis的list是每个子元素都是String类型的双向链表。

   25.Set 数据类型 常用命令?

    单值多value
      # sadd 将一个或多个成员元素加入到集合中,不能重复
      # smembers 返回集合中的所有的成员。
      # sismember 命令判断成员元素是否是集合的成员。
     # srem key value 用于移除集合中的一个或多个成员元素
    # scard,获取集合里面的元素个数
     # srandmember key 命令用于返回集合中的一个随机元素。
    # spop key 用于移除集合中的指定 key 的一个或多个随机元素

    # smove SOURCE DESTINATION MEMBER

    # 将指定成员 member 元素从 source 集合移动到 destination 集合。
      
    使用地方: 在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis还为
集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能

26. 哈希Hash?

        kv模式不变,但V是一个键值对
       # hset、hget 命令用于为哈希表中的字段赋值 。
       # hmset、hmget 同时将多个field-value对设置到哈希表中。会覆盖哈希表中已存在的字段。
       # hgetall 用于返回哈希表中,所有的字段和值。 # hdel 用于删除哈希表 key 中的一个或多个指定字段
       # hlen 获取哈希表中字段的数量。
       # hexists 查看哈希表的指定字段是否存在。
       # hkeys 获取哈希表中的所有域(field)。
       # hvals 返回哈希表所有域(field)的值。

      # hincrby 为哈希表中的字段值加上指定增量值。

      # hsetnx 为哈希表中不存在的的字段赋值 。

hash使用:Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。

存储部分变更的数据,如用户信息等。

27. 有序集合Zset ?

       在set基础上,加一个score值。之前set是k1 v1 v2 v3,现在zset是 k1 score1 v1 score2 v2
       # zadd 将一个或多个成员元素及其分数值加入到有序集当中。
       # zrange 返回有序集中,指定区间内的成员
       # zrangebyscore 返回有序集合中指定分数区间的成员列表。有序集成员按分数值递增(从小到大) 次序排列。
       # zrem 移除有序集中的一个或多个成员
       # zcard 命令用于计算集合中元素的数量。
       # zcount 计算有序集合中指定分数区间的成员数量。
      # zrank 返回有序集中指定成员的排名。其中有序集成员按分数值递增(从小到大)顺序排列。

  Zset使用:排行榜应用; 取TOP N操作 !

28.GEO地理位置?   Geospatial地理位置详解  获取地理位置的坐标
      GEO 的数据结构总共有六个常用命令:geoadd、geopos、geodist、georadius、
georadiusbymember、gethash

  #getadd 添加地理位置

  127.0.0.1:6379> geoadd china:city 116.23 40.22 北京
   (integer) 1

   #getpos   获得当前定位:一定是一个坐标值

   127.0.0.1:6379> geopos china:city 北京
    1) "116.23000055551528931"
    2) "40.2200010338739844"

   #geodist  返回两个给定位置之间的距离,如果两个位置之间的其中一个不存在,那么命令返回空值。

   127.0.0.1:6379> geodist china:city 北京 上海
    "1088785.4302"

    #georadius  以给定的经纬度为中心, 找出某一半径内的元素

    # 在 china:city 中寻找坐标 100 30 半径为 1000km 的城市
     127.0.0.1:6379> georadius china:city 100 30 1000 km
    重庆
    西安

   #geohash   Redis使用geohash将二维经纬度转换为一维字符串,字符串越长表示位置更精确,两个字符串越相似 表示距离越近。

   127.0.0.1:6379> geohash china:city 北京 重庆
     wx4sucu47r0
     wm5z22h53v0

    GEO底层的实现原理其实就是Zset(有序集合),我们可以使用zset命令来操作geo

 
29.Bitmaps
      位存储
     统计用户信息,活跃,不活跃,登录,未登录,  打卡  ,两种状态的,都可以用bitmaps
     Bitmaps 位图,数据结构,都是操作二进制来进行记录,就只用0和1俩个状态

    127.0.0.1:6379> setbit sign 0 1

     0

     127.0.0.1:6379> getbit sign 3  # 查看周四是否打卡

     1

30. 事务?

        redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。

       Redis事务没有隔离级别的概念:

       redis单条命令是保存原子性的,但是事务不保证原子性

      Redis事务的三个阶段:

          开始事务  (multi)
          命令入队
           执行事务  (exec)

     放弃事务(DISCARD)

      若在事务队列中存在命令性错误(类似于java编译性错误),则执行EXEC命令时,所有命令都不会执行

       若在事务队列中存在语法性错误(类似于java的1/0的运行时异常),则执行EXEC命令时,其他正确

        命令会被执行,错误命令抛出异常。

31.监控?Watch (本身就可以做一个乐观锁)

      悲观锁:
        悲观锁(Pessimistic Lock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在
        拿数据的时候都会上锁,这样别人想拿到这个数据就会block直到它拿到锁。传统的关系型数据库里面就
        用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在操作之前先上锁。
   
      乐观锁:
       乐观锁(Optimistic Lock),顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会
      上锁。但是在更新的时候会判断一下再此期间别人有没有去更新这个数据,可以使用版本号等机制,乐
       观锁适用于多读的应用类型,这样可以提高吞吐量,乐观锁策略:提交版本必须大于记录当前版本才能
       执行更新。
     
       乐观锁: 1. 获取version  2.更新的时候比较 version

      redis的监视测试:

         测试多线程修改值,使用watch可以当做redis的乐观锁操作
 
     怎样解决监视问题: 如果事务执行失败
       unwatch  解锁   
       之后在重新监视   watch money
        exec   比对监视的值是否发生了变化,如果变化就执行失败

32. Jedis

       使用java来操作Redis
      编码测试:
         连接数据库
         操作命令
         断开连接

    Jedis所有的命令 就是我们之前学习的指令

    setex  过期时间

    setnx   没有的就创建

33.  SpringBoot整合Redis?

        SpringBoot 操作数据:spring-data jpa jdbc mongodb redis  

      说明: 在SpringBoot2.x之后,原来使用的jedis被替换成了lettuce

     jedis:采用的是直连,多个线程操作的话,是不安全的,如果想要避免不安全的,
       使用jedis pool 连接池    BIO模式

    lettuce:采用netty,实例可以再多个线程中进行共享,不存在线程不安全的情况,

      可以减少线程数量,   NIO模式

    使用:

     1,导入依赖
       <dependency>
         <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-data-redis</artifactId>
       </dependency>

    2.配置redis,可以查看 RedisProperties 分析

        # Redis服务器地址 spring.redis.host=127.0.0.1
        # Redis服务器连接端口 spring.redis.port=6379

   在企业中,我们所有的pojo类,都会序列化

    在真实的开发中,公司都会自己封装一个RedisUtils

34. Redis的配置文件?

        启动的时候,就通过配置文件来启动的

       进入Redis.conf文件里面,用vim

      持久化 ,在规定的时间内,执行了多少次操作,则会持久化到文件  rdb   aof

        redis是内存数据库,如果没有持久化,那么数据断电即失。

35.  Redis持久化?

       Redis 是内存数据库,如果不将内存中的数据库状态保存到磁盘,那么一旦服务器进程退出,服务器中
        的数据库状态也会消失。所以 Redis 提供了持久化功能!

  RDB (Redis DataBase)

   1.  什么是RDB
        在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快
         照文件直接读到内存里。

  2.  Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程

     都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的。
      这就确保了极高的性能。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那
     RDB方式要比AOF方式更加的高效。
 
     RDB的缺点是最后一次持久化后的数据可能丢失。

    rdb保存的文件是dump.rdb  都是在我们的配置文件中快照进行配置的

   ps -ef|grep   //查看进程

    3. RDB快照触发机制?

        1.save的规则满足的情况下,会自动触发rdb规则,生成dump.rdb文件
        2.执行flushall命令,也会触发我们的rdb规则,生成dump.rdb文件
        3.退出redis,也会产生rdb文件

     4.如何恢复rdb文件?

         1、将备份文件(dump.rdb)移动到redis安装目录并启动服务即可
         2、CONFIG GET dir 获取目录

     5.rdb快照的优缺点?

  优点:
        1、适合大规模的数据恢复
         2、对数据完整性和一致性要求不高
   缺点:
         1、在一定间隔时间做一次备份,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改
          2、Fork的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑。

34.AOF?

        AOF(Append Only File)
           以日志的形式来记录每个写操作,将Redis执行过的所有指令记录下来(读操作不记录),只许追加文件
           但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件
           的内容将写指令从前到后执行一次以完成数据的恢复工作
              AOF保存的是 appendonly.aof 文件

       总结:1、RDB 持久化方式能够在指定的时间间隔内对你的数据进行快照存储

        2、AOF 持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始
         的数据,AOF命令以Redis 协议追加保存每次写的操作到文件末尾,Redis还能对AOF文件进行后台重
         写,使得AOF文件的体积不至于过大。
         
35.Redis的发布订阅?
       1.是什么?
         Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
         Redis 客户端可以订阅任意数量的频道。

       2.命令?

           #订阅者
          redis 127.0.0.1:6379> SUBSCRIBE redisChat

         #发布者

        redis 127.0.0.1:6379> PUBLISH redisChat "Hello,Redis"
           (integer) 1
        redis 127.0.0.1:6379> PUBLISH redisChat "Hello,Kuangshen"
           (integer) 1

    3.原理?

         Redis 通过 PUBLISH(推送) 、SUBSCRIBE(接受) 和 PSUBSCRIBE(接收多个) 等命令实现发布和订阅功能。

      Pub/Sub 从字面上理解就是发布(Publish)与订阅(Subscribe),在Redis中,你可以设定对某一个

       key值进行消息发布及消息订阅,当一个key值上进行了消息发布后,所有订阅它的客户端都会收到相应
       的消息。这一功能最明显的用法就是用作实时消息系统,比如普通的即时聊天,群聊等功能。

       使用场景:

          1,实时消息系统
           2.实时聊天(频道当做聊天室,将信息回显给所有人)
           3.订阅,关注系统都是可以的

        稍微复杂的场景,我们就会使用消息中间件来做 MQ (ribbitMQ)

36.Redis 的主从复制?

      1.是什么? 主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master/leader),
       后者称为从节点(slave/follower);
      数据的复制是单向的,只能由主节点到从节点。Master以写为主,Slave 以读为主。
        (主从复制,读写分离,80%的情况下都在进行读操作,减缓服务器的压力,主从复制是标配的)

      默认情况下,每台Redis服务器都是主节点; 一个主节点可以有多个从节点(或者没有从节点),但是一个从节点只能有一个主节点

     2.主从复制的作用主要包括?:

         1、数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
        2、故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务
          的冗余。
         3、负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务
          (即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写
             少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
           4、高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是
            Redis高可用的基础。

 高可用大部分情况下都在说集群

       3.一般来说,要将Redis运用于工程项目中,只使用一台Redis是万万不能的(一主二从),原因是什么?

            1、从结构上,单个Redis服务器会发生单点故障,并且一台服务器需要处理所有的请求负载,压力较大;
            2、从容量上,单个Redis服务器内存容量有限,就算一台Redis服务器内存容量为256G,也不能将所有
              内存用作Redis存储内存,一般来说,单台Redis最大使用内存不应该超过20G。

    4.环境配置?

         只配置从库,不用配置主库, 默认情况下,每台Redis服务器都是主节点
 
    5.一主二从?
         命令:
           127.0.0.1:6380> SLAVEOF 127.0.0.1:6379   //80认79当老大

     6.细节1?

         主机可以写,从机不能写只能读,主机中的所有信息和数据,都会自动被从机保存。

        细节2?

          主机断开连接,从机依旧连接到主机的,但是没有写操作,这个时候,如果主机回来了,从机依旧可以直接
          获取到主机写的信息。

       细节3?

         如果使用命令行,来配置的主从,这个时候如果重启了,就会变回主机,只要重新配成从机,立马就会从主机中获取值。

     7.复制原理?

         Slave 启动成功连接到 master 后会发送一个sync命令
          Master 接到命令,启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,并完成一次完全同步。
          全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
          增量复制:Master 继续将新的所有收集到的修改命令依次传给slave,完成同步
          但是只要是重新连接master,一次完全同步(全量复制)将被自动执行,我们的数据一定可以在从机中看到。

    8.层层链路?

         上一个主节点连接下一个从节点,中间的节点依旧是从节点
           这个时候也可以完成我们的主从复制

       上一个Slave 主节点可以是下一个slave 和 Master,Slave 同样可以接收其他 slaves 的连接和同步请求,那么

        该 slave 作为了链条中下一个的master,可以有效减轻 master 的写压力!

     9.谋朝篡位?

          如果主机断开了连接,我们可以使用 SLAVEOF on one 让自己变成主机,其他的节点就可以手动连接到最新的这个主节点(手动)
         (哨兵没用之前,手动选老大,哨兵用了之后,自动选老大),如果这个时候老大修复了,那就只能重新配置,他现在是一个光杆司令。

37. 哨兵模式?(自动选取老大的模式)

       谋朝篡位的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库。

      哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独

       立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。

     1.这里的哨兵有两个作用?

        通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。
            当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服
            务器,修改配置文件,让它们切换主机。

    2.哨兵的使用过程?

         假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行failover(故障转移)过程,仅仅是哨兵1主观的认
          为主服务器不可用,这个现象成为主观下线。当后面的哨兵也检测到主服务器不可用,并且数量达到一
          定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover[故障转移]操作。
          切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为
          客观下线。

    3.启动哨兵?

        命令: Redis-sentinel /myredis/sentinel.conf
    
   4.查看哨兵日志?
     info replication 查看

    5.如果主机此时回来了,只能当从机,归并到新的主机下

    6.哨兵模式的优缺点?

         优点
       1. 哨兵集群模式是基于主从模式的,所有主从的优点,哨兵模式同样具有。
       2. 主从可以切换,故障可以转移,系统可用性更好。
       3. 哨兵模式是主从模式的升级,系统更健壮,可用性更高。
          缺点
       1. Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。
       2. 实现哨兵模式的配置也不简单,甚至可以说有些繁琐

38. Redis的缓存穿透和雪崩?

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

      解决方法?

       1.布隆过滤器
           布隆过滤器是一种数据结构,对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合则
           丢弃,从而避免了对底层存储系统的查询压力;
       2. 缓存空对象
           当存储层不命中后,即使返回的空对象也将其缓存起来,同时会设置一个过期时间,之后再访问这个数
           据将会从缓存中获取,保护了后端数据源;

        但是这种方法会存在两个问题:

           1、如果空值能够被缓存起来,这就意味着缓存需要更多的空间存储更多的键,因为这当中可能会有很多
            的空值的键;
            2、即使对空值设置了过期时间,还是会存在缓存层和存储层的数据会有一段时间窗口的不一致,这对于
            需要保持一致性的业务会有影响。

 

    2. 缓存击穿?(量太大了,缓存过期)
           这里需要注意和缓存击穿的区别,缓存击穿,是指一个key非常热点,在不停的扛着大并发,大并发集中
           对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一
          个屏障上凿开了一个洞。
           当某个key在过期的瞬间,有大量的请求并发访问,这类数据一般是热点数据,由于缓存过期,会同时访
            问数据库来查询最新数据,并且回写缓存,会导使数据库瞬间压力过大。

       解决方案?

          设置热点数据永不过期
                从缓存层面来看,没有设置过期时间,所以不会出现热点 key 过期后产生的问题。
         加互斥锁
               分布式锁:使用分布式锁,保证对于每个key同时只有一个线程去查询后端服务,其他线程没有获得分布
              式锁的权限,因此只需要等待即可。这种方式将高并发的压力转移到了分布式锁,因此对分布式锁的考验很大。

      3.缓存雪崩?
          缓存雪崩,是指在某一个时间段,缓存集中过期失效。
             产生雪崩的原因之一,比如在写本文的时候,马上就要到双十二零点,很快就会迎来一波抢购,这波商
             品时间比较集中的放入了缓存,假设缓存一个小时。那么到了凌晨一点钟的时候,这批商品的缓存就都
             过期了。而对这批商品的访问查询,都落到了数据库上,对于数据库而言,就会产生周期性的压力波
              峰。于是所有的请求都会达到存储层,存储层的调用量会暴增,造成存储层也会挂掉的情况。

      解决方法?

          
        redis高可用
           这个思想的含义是,既然redis有可能挂掉,那我多增设几台redis,这样一台挂掉之后其他的还可以继续
            工作,其实就是搭建的集群。
         限流降级
            这个解决方案的思想是,在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对
            某个key只允许一个线程查询数据和写缓存,其他线程等待。

      

转载地址:https://blog.csdn.net/qq_18072961/article/details/125501648 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Redis笔记
下一篇:redis笔记

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年03月25日 08时51分43秒