• Redis基本内容


    redis

    1 基本概念

    linux系统部署:https://www.cnblogs.com/hunanzp/p/12304622.html

    https://segmentfault.com/a/1190000023364209

    redis-cli

    redis-server

    启动 Redis

    redis-server
    
    • 1

    查看 redis 是否启动?

    redis-cli
    
    • 1

    以上命令将打开以下终端:

    redis 127.0.0.1:6379>
    
    • 1

    127.0.0.1 是本机 IP ,6379 是 redis 服务端口。现在我们输入 PING 命令。

    redis 127.0.0.1:6379> ping
    PONG
    
    • 1
    • 2

    关闭redis服务

    shutdown	# 关闭redis
    exit	    # 退出
    
    • 1
    • 2

    2 数据类型

    2.1 基本数据结构

    String字符串

    List列表:在redis里面,我们可以把list玩成 ,栈、队列、阻塞队列

    • 相当于链表,消息排队、消息队列 (Lpush Rpop), 栈( Lpush Lpop)

    • 命令以l开头,lpush、lrange、lindex

    Set集合:无序不重复

    • 命令以s开头,sadd、scard、sismember、smembers
    • 交叉并集合,sdiff、sinter、sunion

    Hash哈希:map集合key-value

    • h开头,hset、hget、hgetall、hdel、hmset、hlen、hexists、hkeys、hvals

    Zset有序集合

    • z开头,zadd、zcount、zcard、zrange、zrangebyscore、zrem

    2.2 特殊数据结构

    geospatial 地理位置,底层是一个zset

    • geo开头命令,geoadd、geodist、geohash、geopost、georadius、georadiusbymember

    hyperloglog 不重复数字(基数)统计法

    bitmap,二进制记录

    • setbit、getbit、bitcount

    3 事务

    命令的集合,把所有命令组合成一个队列进行序列化,依次执行

    multi(开启事务) set get add 等操作 exec(执行事务)
    # discard 取消事务
    # 中途编译型异常,队列中所有命令都不会执行,运行时异常,其他命令正常运行,出错的命令执行出错
    
    • 1
    • 2
    • 3

    监视器:watch

    watch money
    multi
    # 执行各种对money的操作
    # 如果中途有其他线程对money进行了修改,此时事务执行出错
    exec
    
    unwatch money # 需要先解除监视
    watch money # 再获取最新的值,再执行事务
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    4 持久化(重点)

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

    • RDB:快照写入文档的持久化文档,保存到dump.rdb,rdb文件放在redis启动目录后启动时会自动检查dump.rdb并恢复其中的数据

    在这里插入图片描述

    • AOF,以日志的形式记录每一个写操作, 保存在appendonly.aof 文件,更靠谱,但是效率更低

    比较:

    RDB,建议只在Slave上持久化RDB文件。AOF用在主服务器数据备份

    5 发布订阅

    发布:publish channelName "message"

    订阅:subscribe channelName

    6 主从复制

    主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点 (master/leader),后者称为从节点(slave/follower);数据的复制是单向的,只能由主节点到从节点。 Master以写为主,Slave 以读为主。

    主从复制的作用主要包括:

    1、数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。

    2、故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务 的冗余。

    3、负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务 (即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;在写 少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。

    4、高可用(集群)基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复 制是Redis高可用的基础。

    6.1 搭建主从结构

    参考:https://segmentfault.com/a/1190000039242024

    本文示例采用docker compose搭建一主两从的主从结构。

    • 新建docker-compose.yml添加以下配置信息。
    version: "3"
    services:
      redis-master:
        image: redis:6.0
        ports: 
        - "6379:6379"
        container_name: "redis-master"
        command: redis-server
        networks:
        - redis-master-slave
      redis-slave-1:
        image: redis:6.0
        ports:
        - "6380:6379"
        container_name: "redis-slave-1"
        command: redis-server --slaveof redis-master 6379 
        depends_on: 
        - redis-master
        networks:
        - redis-master-slave
      redis-slave-2:
        image: redis:6.0
        ports:
        - "6381:6379"
        container_name: "redis-slave-2"
        command: redis-server --slaveof redis-master 6379 
        depends_on: 
        - redis-master
        networks:
        - redis-master-slave
    networks:
      redis-master-slave:
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • cd到当前目录,执行指令docker-compose up启动docker,效果如下:

    在这里插入图片描述

    打开新的窗口,redis-cli 连接redis服务,info replication 查看主从关系

    在这里插入图片描述

    6.2 测试数据同步

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

    redis-cli -p 6379	# 连接主机redis端口
    redis-cli -p 6380	# 连接从机redis 端口
    redis-cli -p 6381	# 连接从机redis 端口
    
    • 1
    • 2
    • 3

    主机可以正常的写和读

    在这里插入图片描述

    从机1号,不能写,但是主机上的更新马上会同步到从机上

    在这里插入图片描述

    从机2号,同样

    在这里插入图片描述

    界面显示

    在这里插入图片描述

    6.3 复制原理

    源码分析可参考:https://segmentfault.com/a/1190000039242024

    Slave 启动成功连接到 master 后会发送一个sync同步命令 Master 接到命令,启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行 完毕之后,master将传送整个数据文件到slave,并完成一次完全同步。

    • 全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
    • 增量复制:Master 继续将新的所有收集到的修改命令依次传给slave,完成同步 但是只要是重新连接master,一次完全同步(全量复制)将被自动执行! 我们的数据一定可以在从机中 看到!

    6.4 哨兵模式

    主从切换技术的方法是:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工 干预,费事费力,还会造成一段时间内服务不可用。这不是一种推荐的方式,更多时候,我们优先考虑 哨兵模式。

    哨兵模式:后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库。

    哨兵:独立的进程,监控redis服务的运行情况

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

    单哨兵——多哨兵,单个哨兵检测到主机下线被称为“主观下线”,当一定数量的哨兵都认为主机下线时,进行一次投票,此时的主从切换称为“客观下线”

    7 缓存穿透和雪崩

    • 缓存穿透:缓存没有命中,都去查数据库了
    • 缓存击穿:热点数据缓存过期,瞬间所有压力跑到数据库中
    • 缓存雪崩:缓存集体失效(写入的缓存失效,或者缓存的服务器宕机),形成的压力波峰

    解决方案:

    • redis高可用,多增设几台redis,这样一台挂掉之后其他的还可以继续 工作,其实就是搭建的集群。
    • 限流降级,在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对 某个key只允许一个线程查询数据和写缓存,其他线程等待。
    • 数据预热 ,数据加热的含义就是在正式部署之前,我先把可能的数据先预先访问一遍,这样部分可能大量访问的数 据就会加载到缓存中。在即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让 缓存失效的时间点尽量均匀。

    8 问题:

    redis绑定的端口被占用,杀死进程

     netstat -tulp|grep redis
    (Not all processes could be identified, non-owned process info
     will not be shown, you would have to be root to see it all.)
    tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      11845/redis-server
    tcp6       0      0 [::]:6379               [::]:*                  LISTEN      11845/redis-server
    $ kill -9 11845
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    非root用户没有写入磁盘的权限,将写入操作关闭之后运行

    # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. 
    # To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
    
    
    • 1
    • 2
    • 3
  • 相关阅读:
    使用php 获取时间今天、明天、昨天时间戳的详解
    MaxEnt模型融合技术的物种分布模拟、参数优化方法、结果分析制图与论文写作
    github 终端克隆操作,以及对 https/ssh 的理解
    【JavaEE进阶序列 | 从小白到工程师】String类常用的成员方法,一文直接上手使用
    Dart利用私有构造函数_()创建单例模式
    宏观视角下的浏览器
    R实现地图相关图形绘制
    springboot小区疫苗接种管理系统设计与实现毕业设计源码021530
    MySQL MHA
    webadi修改经历
  • 原文地址:https://blog.csdn.net/qq_42647903/article/details/126483765