zoukankan      html  css  js  c++  java
  • Redis_入门学习

    说明

      参考文章:https://www.cnblogs.com/sanduzxcvbnm/p/11300942.html

      Redis_配置文件:https://www.cnblogs.com/chunxiaozhang/p/12718647.html

      Redis_数据使用:https://www.cnblogs.com/chunxiaozhang/p/12718618.html

      Redis_命令大全:https://www.cnblogs.com/chunxiaozhang/p/12745405.html

    一:基础

      1、Redis

    Remote Dictionary Server(Redis)是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。

      2、redis持久化

    redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File)。
    RDB,简而言之,就是在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上;
    AOF,则是换了一个角度来实现持久化,那就是将redis执行过的所有写指令记录下来,在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。
    RDB和AOF两种方式也可以同时使用,在这种情况下,如果redis重启的话,则会优先采用AOF方式来进行数据恢复,这是因为AOF方式的数据恢复完整度更高。
    
    redis持久化 – RDB
        RDB方式,是将redis某一时刻的数据持久化到磁盘中,是一种快照式的持久化方法。redis在进行数据持久化的过程中,会先将数据写入到一个临时文件中,待持久化过程都结束了,才会用这个临时
        文件替换上次持久化好的文件。正是这种特性,让我们可以随时来进行备份,因为快照文件总是完整可用的。对于RDB方式,redis会单独创建(fork)一个子进程来进行持久化,而主进程是不会进行
        任何IO操作的,这样就确保了redis极高的性能。
    如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。
    
    redis持久化 – AOF
        Append Only File,即只允许追加不允许改写的文件。AOF方式是将执行过的写指令记录下来,在数据恢复时按照从前到后的顺序再将指令都执行一遍,就这么简单。
        配置redis.conf中的appendonly yes就可以打开AOF功能。如果有写操作(如SET等),redis就会被追加到AOF文件的末尾。默认的AOF持久化策略是每秒钟fsync一次(fsync是指把缓存中的写指令记录到磁盘中),
    因为在这种情况下,redis仍然可以保持很好的处理性能,即使redis故障,也只会丢失最近1秒钟的数据。
        如果在追加日志时,恰好遇到磁盘空间满、inode满或断电等情况导致日志写入不完整,也没有关系,redis提供了redis-check-aof工具,可以用来进行日志修复。
    AOF文件出现了被写坏的情况,redis并不会贸然加载这个有问题的AOF文件,而是报错退出。这时可以通过以下步骤来修复出错的文件:
        备份被写坏的AOF文件
        运行redis-check-aof –fix进行修复
        用diff -u来看下两个文件的差异,确认问题点
        重启redis,加载修复后的AOF文件
    
    redis持久化 – AOF重写
        在重写即将开始之际,redis会创建(fork)一个“重写子进程”,这个子进程会首先读取现有的AOF文件,并将其包含的指令进行分析压缩并写入到一个临时文件中。
        与此同时,主工作进程会将新接收到的写指令一边累积到内存缓冲区中,一边继续写入到原有的AOF文件中,这样做是保证原有的AOF文件的可用性,避免在重写过程中出现意外。
        当“重写子进程”完成重写工作后,它会给父进程发一个信号,父进程收到信号后就会将内存中缓存的写指令追加到新AOF文件中。
        当追加结束后,redis就会用新AOF文件来代替旧AOF文件,之后再有新的写指令,就都会追加到新的AOF文件中了。

      3、redis主从同步

    redis是支持主从同步的,而且也支持一主多从以及多级从结构。
    主从结构,一是为了纯粹的冗余备份,二是为了提升读性能,比如很消耗性能的SORT就可以由从服务器来承担。
    redis的主从同步是异步进行的,这意味着主从同步不会影响主逻辑,也不会降低redis的处理性能。
    主从架构中,可以考虑关闭主服务器的数据持久化功能,只让从服务器进行持久化,这样可以提高主服务器的处理性能。
    主从架构中,从服务器通常被设置为只读模式,这样可以避免从服务器的数据被误修改。但可以接受CONFIG等指令.
    同步原理:
        从服务器会向主服务器发出SYNC指令,当主服务器接到此命令后,就会调用BGSAVE指令来创建一个子进程专门进行数据持久化工作,也就是将主服务器的数据写入RDB文件中。在数据持久化期间,
    主服务器将执行的写指令都缓存在内存中。在BGSAVE指令执行完成后,主服务器会将持久化好的RDB文件发送给从服务器,从服务器接到此文件后会将其存储到磁盘上,然后再将其读取到内存中。这个
    动作完成后,主服务器会将这段时间缓存的写指令再以redis协议的格式发送给从服务器。即使有多个从服务器同时发来SYNC指令,主服务器也只会执行一次BGSAVE,然后把持久化好的RDB文件发给多个下游

      4、redis的事务处理

    事务是指“一个完整的动作,要么全部执行,要么什么也没有做”。MULTI、EXEC、DISCARD、WATCH四个指令构成了redis事务处理的基础。
        MULTI用来组装一个事务;
        EXEC用来执行一个事务;
        DISCARD用来取消一个事务;
        WATCH用来监视一些key,一旦这些key在事务执行之前被改变,则取消事务的执行。
    举例:
    redis> MULTI //标记事务开始
    OK
    redis> INCR user_id //多条命令按顺序入队
    QUEUED
    redis> INCR user_id
    QUEUED
    redis> INCR user_id
    QUEUED
    redis> PING
    QUEUED
    redis> EXEC //执行
    1) (integer) 1
    2) (integer) 2
    3) (integer) 3
    4) PONG
    
    关事务,经常会遇到的是两类错误:
    1.调用EXEC之前的错误
    2.调用EXEC之后的错误
        调用EXEC之前的错误:有可能是由于语法有误导致的,也可能时由于内存不足导致的。只要出现某个命令无法成功写入缓冲队列的情况,redis都会进行记录,在客户端调用EXEC时,redis会拒绝执行这一事务。
    (这时2.6.5版本之后的策略。在2.6.5之前的版本中,redis会忽略那些入队失败的命令,只执行那些入队成功的命令)
        调用EXEC之后的错误:redis则采取了完全不同的策略,即redis不会理睬这些错误,而是继续向下执行事务中的其他命令。

     二:linux安装

      1、下载redis

    官网下载:https://redis.io/download
    linux下载:wget http://download.redis.io/releases/redis-5.0.8.tar.gz

      2、linux环境

    [root@bogon ~]# gcc -v --检测redis安装的编译工具
    [root@bogon ~]# yum install gcc-c++ --安装gcc
    
    /**
        5.0及以上redis版本以下这三个依赖可不用安装
        ruby是创建redis集群依赖工具,5.0版本及以后不再依赖ruby
        gem install redis命令可能因版本问题报错
    **/
    [root@localhost redis]# yum install ruby
    [root@localhost redis]# yum install rubygems
    [root@localhost redis]# gem install redis

      3、单节点安装

    /**安装**/
    [root@localhost redis]# tar -xzvf redis-5.0.8.tar.gz -C ./redis-one/ --解压文件到指定目录
    [root@localhost redis-5.0.8]# make --编译文件,输出位置为当前
    [root@localhost redis-5.0.8]# make PREFIX=/root/redis/redis-bin install --构建文件,指定构建输出位置,不指定默认在 /usr/local/bin
    [root@localhost bin]# ll /root/redis/redis-bin --查看构建出来的文件,与安装目录下src中对应文件效果一样
    总用量 32776
    -rw-r--r--. 1 root root     108 4月  17 17:07 dump.rdb 
    -rwxr-xr-x. 1 root root 4366840 4月  17 16:10 redis-benchmark --Redis性能测试工具
    -rwxr-xr-x. 1 root root 8125032 4月  17 16:10 redis-check-aof --AOF文件修复工具
    -rwxr-xr-x. 1 root root 8125032 4月  17 16:10 redis-check-rdb --RDB文件检查工具
    -rwxr-xr-x. 1 root root 4807832 4月  17 16:10 redis-cli --Redis命令行客户端
    lrwxrwxrwx. 1 root root      12 4月  17 16:10 redis-sentinel -> redis-server
    -rwxr-xr-x. 1 root root 8125032 4月  17 16:10 redis-server ----Redis服务器
    
    /**启动和关闭**/
    [root@localhost bin]# redis-server /redis.confg & --以指定配置文件启动,&表示支持后台运行:退出命令行也不会关闭
    [root@localhost bin]# redis-cli --连接默认节点6379,-p 7001以指定端口连接
    [root@localhost bin]# redis-cli shutdown --关闭节点

      4、集群安装

    此命令以单服务器安装,属伪集群,实际生产集群创建大致相同
    
    1、安装单节点
    [root@localhost redis]# tar -xzvf redis-5.0.8.tar.gz -C ./redis-one/ --解压文件到指定目录
    [root@localhost redis-5.0.8]# make --编译文件,输出位置为当前
    [root@localhost redis-5.0.8]# make PREFIX=/root/redis/redis-bin install --构建文件,指定构建输出位置,不指定默认在 /usr/local/bin
    
    2、扩展节点
    /** make install 安装了redis,redis-server ./redis.conf 即可启动不同的节点实例,以指定的配置文件为准 故在伪集群中只需配置不同的redis.conf,通过redis-server启动不同的实例,生产中不同服务器则都需要完整的安装 **/ [root@localhost redis-5.0.8]# cp ./redis.conf /root/redis/redis-cluster/7001 [root@localhost redis-5.0.8]# cp ./redis.conf /root/redis/redis-cluster/7002 [root@localhost redis-5.0.8]# cp ./redis.conf /root/redis/redis-cluster/7003 [root@localhost redis-5.0.8]# cp ./redis.conf /root/redis/redis-cluster/7004 [root@localhost redis-5.0.8]# cp ./redis.conf /root/redis/redis-cluster/7005 [root@localhost redis-5.0.8]# cp ./redis.conf /root/redis/redis-cluster/7006
    3、修改节点配置文件 /**其他节点依次修改**/ port 7000 //端口7000,7002,7003 bind 本机ip //默认ip为localhost,缺省和默认时支持远程连接,指定时只能本地连接 daemonize yes //redis后台运行 pidfile /var/run/redis_7000.pid //pidfile文件对应7000,7001,7002 cluster-enabled yes //开启集群 把注释#去掉 cluster-config-file nodes_7000.conf //集群的配置 配置文件首次启动自动生成 7000,7001,7002 cluster-node-timeout 15000 //请求超时 默认15秒,可自行设置 appendonly yes //aof日志开启 有需要就开启,它会每次写操作都记录一条日志 5、检查redis运行状态 [root@bogon bin]# ps -ef | grep redis
    6、创建集群
    /** redis5.0之前版本创建集群,redis-trib.rb在安装目录src下**/ [root@localhost bin]# redis-trib.rb create --replicas 1 192.168.31.245:7000 192.168.31.245:7001 192.168.31.245:7002 192.168.31.210:7003 192.168.31.210:7004 192.168.31.210:7005 /**
      redis5.0之后支持使用redis-cli创建集群 --cluster-replicas 1 表示主从配置比,1表示的是1:1,前三个是主,后三个是从 若配置文件中设置的密码,则还需要加上-a passwod
    *
    */ [root@localhost bin]# ./redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1
    7、启动和关闭 /** 集群的启停与单节点一样,在集群重启后,redis会自动把相关节点纳入管理,因为有node.conf文件的存在**/ [root@localhost bin]# redis-cli -c -h 127.0.0.1 -p 7001 --连接集群节点方式

      5、集群管理

    添加新主节点
    /**
        new_host:new_port:新节点地址:端口号
        existing_host:existing_port:已存在的最后一个主节点的IP:端口地址,可根据slots槽点数判断最后一个主节点
        --cluster-master-id node_id:表示的是最后一个主节点的节点id,表示的是新添加的主节点要在这个节点后面
    **/
    [root@bogon bin]# redis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-master-id node_id
    
    添加新从节点
    /**
        new_host:new_port:新节点地址:端口号
        existing_host:existing_port:要添加从节点的主节点地址:端口号
        --cluster-master-id node_id:要添加从节点的主节点id
    **/
    [root@bogon bin]# redis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-slave --cluster-master-id node_id
    
    hash槽重新分配
    /**
        添加完新节点后,需要对新添加的主节点进行hash槽重新分配,redis共有16384个槽。
        host:port:新添加的主节点IP和端口
        --cluster-from node_id:集群第一个主节点的节点id
        --cluster-to node_id:集群最后一个主节点的节点id,也就是新添加的那个主节点id
        --cluster-slots 500:新主节点分配多少,此处500表示是分配从0-499个slots槽数,若不加上这个会让手动输入
        --cluster-yes:自动应答为yes,若不加上这个会让手动输入yes,表示同意此次分配
    **/
    [root@bogon bin]# redis-cli --cluster  reshard host:port --cluster-from node_id --cluster-to node_id --cluster-slots <args> --cluster-yes
    
    删除节点
    /**
        host:port:要删除节点的IP:端口号
        node_id:删除节点的节点id
    **/
    [root@bogon bin]# redis-cli --cluster  del-node host:port node_id

     三:Redis原理

      1、Redis的数据库

        Redis支持多个数据库,并且每个数据库的数据是隔离的不能共享,并且基于单机才有,如果是集群就没有数据库的概念。
        每个数据库对外都是一个从0开始的递增数字命名,Redis默认支持16个数据库(可以通过配置文件支持更多,无上限),可以通过配置databases来修改这一数字。客户端与Redis建立连接后会自动选择0号数据库,
    不过可以随时使用SELECT命令更换数据库。

      2、Redis单线程原理

  • 相关阅读:
    java 实现前面带零的数字进行加减运算(保留前面的0)
    java 判断字符串是否是整数(纯数字:正整数、负整数、0)、至少包含一位小数、数字(可以是整数或小数)
    java 抽象类使用@Autowrited注入对象,子类直接使用父类的该属性
    java、springboot使用proguard混淆代码
    idea 使用阿里云仓库下载的jar包出现证书校验问题(PKIX:unable to find valid certification path to requested target)
    windows10安装zookeeper-3.6.2并生成zookeeper服务
    zookeeper-3.4.8 集群搭建
    zookeeper安装和使用 windows环境
    Dubbo入门---搭建一个最简单的Demo框架
    服务端高并发分布式架构演进之路
  • 原文地址:https://www.cnblogs.com/chunxiaozhang/p/12718672.html
Copyright © 2011-2022 走看看