Redis学习与总结

Posted nm666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis学习与总结相关的知识,希望对你有一定的参考价值。

前言

本文为学习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学习与总结的主要内容,如果未能解决你的问题,请参考以下文章

Redis学习与总结

《Redis核心技术与实战》学习总结

Redis学习与总结

《Redis设计与实现》(1-5)个人学习总结

Redis设计思路学习与总结

《Redis核心技术与实战》学习总结