美文网首页Amazing Redis
Redis的学习与总结

Redis的学习与总结

作者: 厨房有只偷吃的猫 | 来源:发表于2019-02-01 16:07 被阅读18次

    前言

    本文为学习Redis的一个总结,包含了资料的整理,Redis的介绍,常用数据类型,常用命令,多数据库与事务的特性以及持久化的概述;如何在Linux上部署,以及使用Java客户端开发工具包来连接使用Redis,并记录了常见的问题,关于Redis的高级特性与使用场景后续开新文章进行补充。

    参考资料(记录与分享)

    视频教程教常用命令、数据类型、Jedis简单使用、事务与持久化简单概述,属于入门级别:

    Redis入门【慕课网】

    这篇很全的概述,包含特性、场景、还有基本的用法,都是概述性的简要说明:

    Redis从入门到实战【GitChat技术杂谈】

    这篇稍微有点高级,哈哈哈:

    Redis总结【JavaGuide】

    可以在线的测试一些学会的命令:

    Redis官方在线测试页面

    redis.conf相关的,懒翻译配置文件中英语就看他吧 :

    Redis配置文件详解

    在Linux上搞Redis的参考:

    Redis在linux上的配置

    Redis介绍&使用场景&特点&缺点

    (参考资料里,别人总结的很好,过去看看就好了,重要的再粘过来。)

    数据类型&常用操作

    数据类型
    • 字符串 String 【二进制存储,最大512M】
    • 哈希 Hash
    • 字符串列表 List
    • 字符串集合 Set
    • 有序字符串集合(Sorted Set)
    命令操作【这块重点】

    Redis从入门到实战【GitChat技术杂谈】

    Redis的Java客户端开发包

    Jedis介绍
    • Jedis是Redis官方首选的Java客户开发包
    • GitHub地址
    • Jedis中的操作方法基本上和Redis的操作命令是一致的
    Jedis 代码测试
    1. Maven&JUint单元测试依赖

      <dependencies>
          <dependency>
              <groupId>redis.clients</groupId>
              <artifactId>jedis</artifactId>
              <version>3.0.0</version>
          </dependency>
          <dependency>
              <groupId>junit</groupId>
              <artifactId>junit</artifactId>
              <version>4.12</version>
              <scope>test</scope>
          </dependency>
      </dependencies>
      

      A candy:在线查询Maven依赖

    2. 简单的连接测试

      import org.junit.Test;
      import redis.clients.jedis.Jedis;
      
      public class JedisTest {
          /**
           * Jedis的简单使用
           */
          @Test
          public void demo(){
              //设置IP地址以及端口
              Jedis jedis = new Jedis("192.168.121.128",6379);
              //保存数据
              jedis.set("name","菜鸟");
              //获取数据
              String value = jedis.get("name");
              //打印数据
              System.out.println(value);
              //释放资源
              jedis.close();
      
          }
      }
      
      
    3. 使用连接池

      import org.junit.Test;
      import redis.clients.jedis.Jedis;
      import redis.clients.jedis.JedisPool;
      import redis.clients.jedis.JedisPoolConfig;
      
      public class JedisTest {
         
          /**
           * 使用连接池
           */
          @Test
          public void demoPoll(){
              //连接池配置
              JedisPoolConfig config = new JedisPoolConfig();
              //最大连接数
              config.setMaxTotal(30);
              //最大空余连接数
              config.setMaxIdle(10);
              //根据 config host port 创建连接池
              JedisPool jedisPool = new JedisPool(config,"192.168.121.128",6379);
      
              //获取核心对象
              Jedis jedis = null;
              try {
                  jedis = jedisPool.getResource();
                  //设置数据
                  jedis.set("name","弱鸡");
                  //获取数据
                  String value = jedis.get("name");
      
                  System.out.println(value);
              }catch (Exception e){
                  e.printStackTrace();
              }finally {
                  //释放资源
                  if(jedis != null){
                      jedis.close();
                  }
                  if(jedisPool != null){
                      jedisPool.close();
                  }
              }
          }
      }
      
      

    问题&解决方案

    Linux上安装启动问题
    1. Make报错

      直接 make 如果报错,则执行 make MALLOC=libc;然后 ./redis-server

    2. 启动的一个小问题,还是要说一下

      教程里面的redis版本低的原因吧,启动是 ./bin/redis-server 我用的时候都在src目录下,而非bin,所以不进入目录情况下带目录名启动应该是 ./src/redis-server

    Jedis连接不上的问题
    1. Jedis连接Linux上的redis出现 DENIED Redis is running in protected mode问题的解决方案

      为什么如上更改了配置还报错? 启动的时候记得加载配置文件 ./redis-server ./redis.conf

    2. 连接超时

      原因:Linux 上的6379端口没有打开,需要在防火墙中打开该端口

      设置Linux的端口开放:
      (1)vim /etc/sysconfig/iptables

      (2)-A INPUT -m state -- state NEW -m tcp -p --dport 6379 -j ACCEPT

      [可以yy复制22端口那行然后,p粘贴]

      (3)重启防火墙设置:service iptables restart

    多数据库与事务特性

    多数据库
    1. select 1 选择数据库 默认是0库
    2. 移动某个key到其他数据库 move key 1
    事务

    也就是命令串行化、原子化执行,似的数据具有一致性

    • 开启事务 multi
    • 提交事务 exec
    • 回滚事务 discard

    Redis的持久化

    Redis之所以快,就是他的数据存储在了内存中(难怪多了会崩),为了能够重启Redis后数据仍然能够存在并读取使用,就需要将数据存储到磁盘里。

    两种方式:

    • RDB 方式
    • AOF 方式
    RDB方式

    优势:

    1. 数据库只包含一个文件,通过文件备份策略,定期配置,恢复系统灾难
    2. 压缩文件转移到其他介质上
    3. 性能最大化,redis开始持久化时,分叉出进程,由子进程完成持久化的工作
      ,避免服务器进程执行I/O操作,启动效率高

    劣势:

    1. 无法高可用:系统一定在定时持久化之前宕机,数据还没写入,数据已经丢失
    2. 通过fock分叉子进程完成工作,数据集大的时候,服务器需要停止几百毫秒甚至1秒

    配置:
    cd /usr/local/redis
    vim redis.conf

    默认:
    save 900 1 #每900秒至少1个key变化,持久化一次,到内存一个快照
    save 300 10 #每300秒至少10个key变化,往硬盘写一次
    save 60 10000 #每60秒至少10000个key变化,写一次
    dbfilename dump.rdb #数据的文件名
    dir ./ #保存的路径,redis路径下

    AOF方式

    优势:

    1. 同步:

      a. 每秒同步:异步完成,效率高,一旦系统宕机,修改的数据丢失
      b. 每修改同步:同步持久化,每分钟发生的变化记录到磁盘中,效率低,安全
      c. 不同步

    2. 日志写入操作追加模式append

      a.系统宕机,不影响存在的内容
      b.写入一半数据,若系统崩溃,下次启动redis,redis-check-aof工具解决数据一致性

    3. 如果日志过大,自动重写机制,修改的数据写入到到磁盘文件,创建新文件,记录产生的修改命令,重写切换时,保证数据安全

    4. 格式清晰的日志文件,完成数据的重建

    劣势:

    1. 对于相同数据文件,相比RDB,A OF文件较大
    2. 效率低

    配置:
    vim redis.conf
    默认:
    appendonly no #AOF方式默认关闭
    appendfilename appendonly.aof #配置文件
    appendfsync always #每修改一次,同步到磁盘上
    appendsync everysec 每秒同步到磁盘一次
    appensync no 不同步

    相关文章

      网友评论

        本文标题:Redis的学习与总结

        本文链接:https://www.haomeiwen.com/subject/vjedsqtx.html