美文网首页
Java高级技术day79:Redis

Java高级技术day79:Redis

作者: 开源oo柒 | 来源:发表于2019-11-09 21:50 被阅读0次

    一、Redis的安装和数据类型

    1.Redis简介:

    Remote Dictionary Server(Redis)是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。
    它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。

    2.Redis 的特点:

    (1)支持多种数据结构,如 string(字符串)、 list(双向链表)、dict(hash 表)、set(集合)、 zset(排序 set)、hyperloglog(基数估算);
    (2)支持持久化操作,可以进行 aof 及 rdb 数据持久化到磁盘,从而进行数据备份或数 据恢复等操作,较好的防止数据丢失的手段。
    (3)支持通过 Replication 进行数据复制,通过 master-slave 机制,可以实时进行数据的 同步复制,支持多级复制和增量复制,master-slave 机制是 Redis 进行 HA 的重要手段。
    (4)单进程请求,所有命令串行执行,并发情况下不需要考虑数据一致性问题。

    3.安装Redis单机版:

    (1)需要在Linux系统中安装gcc;命令(yum install -y gcc-c++ );
    (2)将下载好的redis压缩包上传到Linux服务器中,并解压安装包;命令(tar -zxvf redis...... );
    (3)redis 的版本:
    副版本号奇数版本号是测试版,不建议在生产环境中使用。偶数版本时稳定版建议在生产环境中使用。3.0 版本更新比较大。集成了集群技术。
    (4)编译redis;进入redis的解压完毕的根目录下 执行命令:make;
    (5)安装 redis 命令:进 入 redis 的 解 压 完 毕 的 根 目 录 下,执行命令(make install PREFIX=/usr/local/redis);
    (6)将 redis 解压目录下的 redis.conf 文件拷贝到 安装好的 redis 的 bin 目录下 命令(cp redis.conf /usr/local/redis/bin );
    (7)修改拷贝的redis.conf配置文件;命令:vim redis.conf ;
    (8)将daemonize no 改为 yes ;

    修改redis配置文件
    • 启动redis:

    在 bin 目录下执行命令:./redis-server redis.conf ;

    启动
    • 查看 redis 启动是否成功 :

    输入命令:ps aux|grep redis ;

    查看状态
    • 关闭redis:

    命令 ./redis-cli shutdown ;

    • 测试redis

    在 bin目录下启动 redis 自带的客户端 ./redis-cli常见 redis 命令:ping--->pong。

    测试

    4.Redis的数据类型:

    4.1String字符串:

    Redis 字符串是字节序列。Redis 字符串是二进制安全的,这意味着他们有一个已知的 长度没有任何特殊字符终止,所以你可以存储任何东西,512 兆为上限。

    set和get
    del和flushdb

    (1)incr 让当前键值以 1 的数量递增,并返回递增后的值 ;
    (2)incrby 可以指定参数一次增加的数值,并返回递增后的值;
    (3)decr 让当前键值以 1 的数量递减 并返回递减后的值;
    (4)decrby 可以指定参数一次递减的数值,并返回递减后的值;
    (5)incrbyfloat 可以递增一个双精度浮点数;
    (6)append 作用是向键值的末尾追加 value。如果键不存在则将该键的值设置为 value。返 回值是追加后字符串的总长度。
    (7)mget/mset 作用与 get/set 相似,不过 mget/mset 可以同时获得/设置多个键的键值 ;
    (8)del 根据 key 来删除 value ;
    (9)flushdb 清除当前库的所有数据 ;

    4.2Hash(hash 表)

    Redis 的哈希是键值对的集合。 Redis 的哈希值是字符串字段和字符串值之间的映射, 因此它们被用来表示对象。

    结构

    (1)hset 存储一个哈希键值对的集合;示例:hset key field value ;
    (2)hget 获取一个哈希键的值;示例:hget key field ;
    (3)hmset 存储一个或多个哈希是键值对的集合;示例:hmset key field1 value1 ......fieldN keyN ;
    (4)hmget 获取多个指定的键的值;示例:hmget key field1 ... fieldN;
    (5)hexists 判断哈希表中的字段名是否存在 如果存在返回 1 否则返回 0 ;示例:hexists key field ;
    (6)hdel 删除一个或多个字段;示例:hdel key field;
    (7) hgetall 获取一个哈希是键值对的集合;示例:hgetall key ;
    (8)hvals 只返回字段值;示例:hvals key ;
    (9)hkeys 只返回字段名;示例:hkeys key ;
    (10)hlen 返回 key 的 hash 的元素个数;示例:hlen key;


    hset和hget hash
    删除
    hvals和hkeys,hlen
    4.3List(链表) :

    Redis 的链表是简单的字符串列表,排序插入顺序。您可以添加元素到 Redis 的列表的 头部或尾部。

    结构

    (1)lpush key value 向链表左侧添加;
    (2)rpush key value 向链表右侧添加 ;
    (3)lpop key 从左边移出一个元素;
    (4)rpop key 从右边移出一个元素;


    示例
    示例

    (5)llen key 返回链表中元素的个数 相当于关系型数据库中 select count(*) ;
    (6)lrange key start end lrange 命令将返回索引从 start 到 stop 之间的所有元素。Redis 的列 表起始索引为 0。
    (7)lrange 也支持负索引 lrange nn -2 -1 如 -1 表示最右边第一个元素 -2 表示最右边第二 个元素,依次类推。
    (8)lindex key indexnumber 如果要将列表类型当做数组来用,lindex 命令是必不可少的。
    (9)lindex 命令用来返回指定索引的元素,索引从 0 开始 ;如果是负数表示从右边开始计算的索引,最右边元素的索引是-1。
    (10)Lset key indexnumber value :是另一个通过索引操作列表的命令,它会将索引为 index 的元素赋值为 value。

    4.4Set(集合) :

    Redis 的集合是字符串的无序集合。

    结构

    (1)sadd key value 添加一个 string 元素到,key 对应的 set 集合中,成功返回 1,如果元素已经在集合中返回 0。
    (2)scard key 返回 set 的元素个数,如果 set 是空或者 key 不存在返回 0 ;
    (3)smembers key 返回 key 对应 set 的所有元素,结果是无序的;
    (4)sismember key value 判断 value 是否在 set 中,存在返回 1,0 表示不存在或者 key 不存 在。
    (5)srem key value 从 key 对应 set 中移除给定元素,成功返回 1,如果 value 在集合中不存 在或者 key 不存在返回 0;


    sadd
    移除
    4.5SortedSet(有序集合)zset:

    Redis 的有序集合类似于 Redis 的集合,字符串不重复的集合。

    (1)zadd key score value 将一个或多个 value 及其 socre 加入到 set 中 ;
    (2)zrange key start end 0 和-1 表示从索引为 0 的元素到最后一个元素(同 LRANGE 命令 相似);
    (3)zrange key 0 -1 withscores 也可以连同 score 一块输出,使用 WITHSCORES 参数 ;
    (4)zremrangebyscore key start end 可用于范围删除操作。


    示例

    二、Redis的配置和数据持久化方式

    1.Redis中的常见命令:

    (1)ping 测试 redis 是否链接 如果已链接返回 PONG ;
    (2)echo value 测试 redis 是否链接 如果已链接返回 echo 命令后给定的值;
    (3)keys * 返回所有的 key 可以加*通配 ;
    (4)exists key 判断 string 类型一个 key 是否存在 如果存在返回 1 否则返回 0 ;
    (5)expire key time(s) 设置一个 key 的过期时间 单位秒。时间到达后会删除 key 及 value ;
    (6)ttl key 查询已设置过期时间的 key 的剩余时间 如果返回-2 表示该键值对已经被删除;
    (7)persist 移除给定 key 的过期时间;
    (8)select dbindex 选择数据库(0-15) ;
    (9)move key dbIndex 将当前数据库中的 key 转移到其他数据库中 ;
    (10)dbsize 返回当前数据库中的 key 的数目;
    (11)info 获取服务器的信息和统计;
    (12)flushdb 删除当前选择的数据库中的 key;
    (13)flushall 删除所有数据库中的所有;
    (14)key quit 退出连接。

    2.redis.conf文件修改的位置:

    修改 修改

    3.Redis 的数据持久化RDB 方式

    将 Redis 在内存中的数据库状态保存到磁盘里面,RDB 文件是一个经过压 缩的二进制文件,通过该文件可以还原生成 RDB 文件时的数据库状态(默认下,持久化到 dump.rdb 文件,并且在 redis 重启后,自动读取其中文件,据悉,通常情况下一千万的字 符串类型键,1GB 的快照文件,同步到内存中的 时间是 20-30 秒)。

    • RDB 的生成方式:
      (1)执行命令手动生成 :

    有两个 Redis 命令可以用于生成 RDB 文件,一个是 SAVE,另一个是 BGSAVE SAVE 命令会阻塞 Redis 服务器进程,直到 RDB 文件创建完毕为止,在服务器进程阻塞期间,服 务器不能处理任何命令请求,BGSAVE 命令会派生出一个子进程,然后由子进程负责创建 RDB 文件,服务器进程(父进程)继续处理命令请求,创建 RDB 文件结束之前,客户端发 送的 BGSAVE 和 SAVE 命令会被服务器拒绝 。

    (2)通过配置自动生成:

    可以设置服务器配置的 save 选项,让服务器每隔一段时间自动执行一次 BGSAVE 命 令,可以通过 save 选项设置多个保存条件,但只要其中任意一个条件被满足,服务器就会 执行 BGSAVE 命令。

    save 900 1   
    save 300 10   
    save 60 10000   
    那么只要满足以下三个条件中的任意一个,BGSAVE 命令就会被执行   
    服务器在 900 秒之内,对数据库进行了至少 1 次修改   
    服务器在 300 秒之内,对数据库进行了至少 10 次修改  
    服务器在 60 秒之内,对数据库进行了至少 10000 次修改 
    

    4.Redis 的数据持久化AOF 方式

    AOF 持久化方式在 redis 中默认是关闭的,需要修改配置文件开启该方式。
    AOF:把每条命令都写入文件,类似 mysql 的 binlog 日志;
    AOF 方式:是通过保存 Redis 服务器所执行的写命令来记录数据库状态的文件。

    • AOF文件刷新的方式:
      (1)appendfsync always:每提交一个修改命令都调用 fsync 刷新到 AOF 文件,非常非常 慢,但也非常安全。
      (2)appendfsync everyse:每秒钟都调用 fsync 刷新到 AOF 文件,很快,但可能会丢失 一秒以内的数据。
      (3)appendfsync no:依靠 OS 进行刷新,redis 不主动刷新 AOF,这样最快,但安全性较差。
    • AOF 数据恢复方式:

    服务器在启动时,通过载入和执行 AOF 文件中保存的命令来还原服务器关闭之前的数 据库状态,具体过程:
    载入 AOF 文件;
    创建模拟客户端;
    从 AOF 文件中读取一条命令;
    使用模拟客户端执行命令;
    循环读取并执行命令,直到全部完成;
    如果同时启用了 RDB 和 AOF 方式,AOF 优先,启动时只加载 AOF 文件恢复数据;

    三、Redis的集群环境

    1.Redis 集群介绍:

    Redis3.0 版本之后支持 Cluster。集群要求集群节点中必须要支持主备模式,也就说集 中的主节点(Master)至少要有一个从节点(Slave) 。

    Redis-Cluster架构图
    • 每一个蓝色的圈都代表着一个 redis 集群中的主节点。它们任何两个节点之间都是相互 连通的。客户端可以与任何一个节点相连接,然后就可以访问集群中的任何一个节点。对其 进行存取和其他操作

    2. Redis-Cluster 选举:容错

    Redis 之间通过互相的 ping-pong 判断是否节点可以连接上。如果有一半以上的节点去 ping 一个节点的时候没有回应,集群就认为这个节点宕机了,然后去连接它的从节点。如 果某个节点和所有从节点全部挂掉,我们集群就进入 fail 状态。还有就是如果有一半以上的 主节点宕机,那么我们集群同样进入 fail 了状态。这就是我们的 redis 的投票机制,具体原 理如下图所示:


    image.png
    2.1什么时候整个集群不可用(cluster_state:fail)?

    投票过程是集群中所有master参与,如果半数以上master节点与master节点通信超时 (cluster-node-timeout),认为当前 master 节点挂掉。
    (1)如果集群任意 master 挂掉,且当前 master 没有 slave。此时集群进入 fail 状态,也可 以理解成集群的 slot 映射[0-16383]不完整时进入 fail 状态。
    (2)如果集群超过半数以上 master 挂掉,无论是否有 slave,集群进入 fail 状态。

    3. Redis-Cluster 数据存储:

    当我们的存取的 key 到达的时候,redis 会根据 crc16 的算法得出一个结果,然后把 结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,通 过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存 取操作。

    image.png
    • 示例:
      (1)使用 CRC16 算法对 key 进行计算,得到一个数字,然后对数字进行取余。 CRC16 : name = 26384;26384%16384 = 10000 ;
      (2)查找到包含 10000 插槽的节点,比如是 node2,自动跳转到 node2 ;
      (3)在 node2 上执行 set name kevin 命令完成数据的插入 4. 如果在 node1 上执行 get name,先使用 CRC16 算法对 key 进行计算,在使用 16384 取余,得到插槽的下标,然后跳到拥有该插槽的 node2 中执行 get name 命令, 并返回结果。

    4.安装集群:

    搭建一个 Redis 的最小集群,使用伪集群方式。
    Redis 中最小的集群三对主从。
    在 192.168.226.131中安装 6 个 redis 实例。
    如果使用已经使用过的单机版创建集群时,需要删除 dump.rdb 与 apeend文件。6 个 redis 实例的端口分配:8001、8002、8003、8004、8005、8006;

    4.1安装步骤:

    redis 集群时需要使用一个 ruby 的脚本来完成集群。

    (1)安装ruby环境:(yum install ruby);
    (2)安装ruby的包管理器:(yum install rubygems);

    (3) 进入到 redis 的安装目录下的 src 目录下找到到 redis-trib.rb 这个文件 这是集群 时需要的脚本。
    (4)这个脚本的执行需要依赖于一些其他的 ruby 包 所以我们还要下载一个 redis-3.0.0.gem;上传到Linux服务器中;并安装:(gem install redis-3.0.0.gem );
    (5)在local目录下创建一个目录名为:“redis-cluster”;命令:mkdir redis-cluster。
    (6)将安装好的 redis 下的 bin 目录拷贝到 redis-cluster 目录下 并起名为 redis01 命令:进入到 redis 目录下执行:cp -r bin ../redis-cluster/redis01。
    (7)修改 redis.conf 配置文件 命令:vim redis.conf
    修改端口:默认的为 6379 将六个 redis 实例的端口改成从 7001-7006 在配置文件 的 port 属性中。

    image.png

    修改开启集群:在配置文件中搜索 cluster 找到后 将默认为注释的 cluster-enabled yes 去掉注释。


    (8)将这个 redis01 拷贝 6 份到当前这个目录下

    拷贝

    (9)修改拷贝的redis端口:


    修改端口

    (10) 把创建集群的 ruby 脚本复制到 redis-cluster 中 命令:


    image.png
    (11)创建一个能够批量启动的脚本程序 ;命令:vim startall.sh ;
    image.png
    (12)为脚本设置为可执行权限:chmod +x startall.sh;

    (13)启动脚本;查看redis是否启动成功;查看命令:ps aux|grep redis ;
    (14)创建集群:

    ./redis-trib.rb create --replicas 1 192.168.226.131:8001 192.168.226.131:8002 192.168.226.131:8003 192.168.226.131:8004 1192.168.226.131:8005  192.168.226.131:8006 
    
    yes
    • 测试集群:

    测试 Redis 集群:可以连接集群中的任意一个节点进行测试 注意一定要有-c 参数,否 则能连上,但是无法操作 redis 集群 ;
    命令:[root@localhost redis-cluster]# ./redis01/redis-cli -h 192.168.10.128 -p 7001 -c ;

    • 创建关闭Redis集群的脚本:命令:vim shutdown.sh ;


      关闭脚本
      测试

    相关文章

      网友评论

          本文标题:Java高级技术day79:Redis

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