zoukankan      html  css  js  c++  java
  • Redis总结1

    一.Redis安装(Linux)

      1.在官网上下载Linux版本的Redis(链接https://redis.io/download)

      

      2.在Linux的/usr/local中创建Redis文件夹mkdir redis(一般第三方软件放在/usr/local中),上传文件到该文件夹中(securityCRT中输入rz命令即可)

      3.解压文件,并进入解压后的文件夹中,执行make命令,完毕后可以查看该文件夹中的目录如下

          

      4.可以进入src文件夹中,执行./redis-server即可启动Redis,例如(注意这种方式启动Redis 使用的是默认配置)

          

      5.可以通过启动参数告诉Redis使用指定配置文件来启动

    ./redis-server ../redis.conf

      6.修改Redis.conf配置(先退出redis)

        找到Redis.conf文件:

          1.注释以下绑定的主机地址 # bind 127.0.0.1

          2. daemonize设置为yes

          3.设置密码requirepass 123456

      7.在src文件中,连接Redis,例如:(-h是主机地址,-p是端口号,-a是密码,--raw是防止存取中文出现编码格式问题)

    ./redis-cli -h 127.0.0.1 -p 6379 -a "123456" --raw

      如果能ping通,则说明启动成功(这里可能是密码太简单了,有一个警告)

        

      8.远程连接redis (这里使用的是RedisClient),如下所示

      

    二.Redis基本数据类型

      Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及zset(sorted set:有序集合)。

      其相应的设置及获取操作如下:

        String:set和get

        Hash:hmset和hget

        List:lpush和lrange

        Set:sadd和smembers

        zset:zadd和zrangebyscore

    三.Jedis操作Redis(Java操作Redis)(案例)

      <!--导入相应的依赖-->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>
    Jedis  jedis = new Jedis ("192.168.2.129",6379); //连接redis
    jedis.auth("123456"); //redis的密码(如果没有,可以不填)
    jedis.set("name","zs");//添加String类型数据,其他方法可以参考相关的api文档

    四.SpringBoot整合Redis

      项目导入相关的依赖后,首先在配置文件中配置redis如下

    spring.redis.host=192.168.2.129
    spring.redis.port=6379
    #使用第0个库 spring.redis.database=0 spring.redis.password=123456
    #最大连接时间 spring.redis.timeout=5000 spring.redis.pool.max-idle=8 spring.redis.pool.min-idle=0

      编写测试类:(使用模板)

        

      注意:当需要保存对象的时候,创建一个People类,并直接把这个对象放在redis中会报错

        

        

        如下图所示:

        

        解决办法:让这个对象实现序列化接口

        Redis存放对象:使用String类型,采用Json格式,将对象序列化后转成Json格式放在Redis中,如果需要获取对象,把Json的值取出,并反序列化成对象)

    .Redis高可用机制

      方法:Redis主从复制、Redis持久化机制、哨兵机制、keepalived等的支持。

      (1)Redis主从复制:(Redis支持一主多从)

        主从复制作用有:数据备份,读写分离,集群,容错机制,提高可用性等。(这些点与MySQL主从复制的目的类似)

        主服务器权限:读和写

        从服务器权限:读

        如何实现Redis主从复制:

          只需要在从服务器中修改配置文件redis.conf文件,添加(主服务器的IP地址)

          slaveof 192.168.2.129 6379  

          如果主服务器有密码例如123456,则需要修改 masterauth 123456

      (2)Redis持久机制:

        由于Redis的数据都存放在内存中,如果没有配置持久化,Redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数据保存到磁盘上,当Redis重启后,可以从磁盘中恢复数据。比如说,服务器重启,session是会失效的,但是如果将session保存在redis中,就可以解决session失效的问题。

        Redis提供三种方式进行持久化:(Redis默认开启了RDB存储方式进行持久化,以一个dump.rdb文件存储)

          RDB持久化(原理是将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化):

            特征:非实时存储,二进制文件的方式进行存储,体积小,但每次备份会覆盖上一次备份。

            注意:它开启持久化条件是在一定时间内,key和value达到一定的存储次数。

          AOF持久化(原理是将Reids的操作日志以追加的方式写入文件):

            特征:实时存储,日志文件方式进行存储,体积大,安全,更适用于备份。

            开启:在redis.conf文件中,将appendonly设置为yes

          RDB-AOF混合模式

      (3)哨兵机制:   

        Redis的哨兵(sentinel) 系统用于管理多个 Redis 服务器,该系统执行以下三个任务:
          监控: 哨兵(sentinel) 会不断地检查你的Master和Slave是否运作正常。

          提醒当被监控的某个 Redis出现问题时, 哨兵(sentinel) 可以通过 API 向管理员或者其他应用程序发送通知。

          自动故障迁移:当一个Master不能正常工作时,哨兵(sentinel) 会开始一次自动故障迁移操作,它会将失效Master的其中一个Slave升级为新的Master, 并让失效Master的其他Slave改为复制新的Master; 当客户端试图连接失效的Master时,集群也会向客户端返回新Master的地址,使得集群可以使用Master代替失效Master。

        修改sentinel.conf配置文件:

    sentinel monitor mymast  192.168.2.129 6379 1  #主机IP 端口号 选举次数
    sentinel auth-pass mymaster 123456    #配置主服务器的密码(如没设置密码,可以省略)  
    sentinel down-after-milliseconds mymaster 500    #修改服务器挂掉后检测时间

        启动哨兵机制(以加载配置文件的方式):

    ./redis-sentinel ../sentinel.conf

      (4)keepalived:

        使用keepalived监听,如果服务器全部宕机或其他问题,可以设置自动重启服务器,如果还未解决问题,可以设置发送邮件提示开发人员。

    六.Redis事务

      Redis支持事务,连接进入redis后,可以通过multi命令开启事务。Redis 事务的执行并不是原子性的,它会批量执行,中间出错也不影响其他事务(不会回滚)。案例:

        

        exec是提交事务,若未提交,则数据不会保存在Redis中,使用get自然也就获取不到。执行完毕后自动退出事务。

    七.Redis和数据库数据一致性

      三种更新策略:

        先更新数据库,再更新缓存(基本不考虑)

        先删除缓存,再更新数据库

        先更新数据库,再删除缓存(重点,一般使用该方式)

      因为写和读是并发的,没法保证顺序,如果删了缓存,还没有来得及写库,另一个线程就来读取,发现缓存为空,则去数据库中读取数据写入缓存,此时缓存中为脏数据。如果先写了库,再删除缓存前,写库的线程宕机了,没有删除掉缓存,则也会出现数据不一致情况。 如果是redis集群,或者主从模式,写主读从,由于redis复制存在一定的时间延迟,也有可能导致数据不一致。

      优化方案:

        双删加超时:在写库前后都进行redis.del(key)操作,并且设定合理的超时时间。

      注意:如果项目对缓存的要求是强一致性的,那么建议不要使用缓存。

    八.Redis通讯协议(RESP )

      RESP 是redis客户端和服务端之前使用的一种通讯协议;

      RESP 的特点:实现简单、快速解析、可读性好

      客户端发送命令的格式:

        简单字符串:以 + 开头,例如  eg: "+ok"

        错误信息:以 - 开头

        整数类型:以 : 开头

        大字符串类型:以 $ 开头

        数组类型:以 * 开头

     

  • 相关阅读:
    HDU 3681 Prison Break(状态压缩dp + BFS)
    POJ 2711 Regular Words(DP + 高精度)
    ZOJ 2745 01-K Code(DP)(转)
    DAG模型——硬币问题
    HDU 1619 Unidirectional TSP(单向TSP + 路径打印)
    DAG模型——嵌套矩阵
    HDU 4294 A Famous Equation(DP)
    HDU 3920 Clear All of Them I(DP + 状态压缩 + 贪心)
    POJ 3254 Corn Fields(DP + 状态压缩)
    HDU 2089 不要62(数位DP)
  • 原文地址:https://www.cnblogs.com/ywb-articles/p/10660071.html
Copyright © 2011-2022 走看看