zoukankan      html  css  js  c++  java
  • Redis单机版以及集群版的安装搭建以及使用

     

    1,redis单机版

    1.1   安装redis

    n  版本说明

       本教程使用redis3.0版本。3.0版本主要增加了redis集群功能。

    安装的前提条件:

    需要安装gcc:yum install gcc-c++

    1、下载redis的源码包。

    2、把源码包上传到linux服务器

    3、解压源码包

    tar -zxvf redis-3.0.0.tar.gz

    4、Make -j 4      ps:#编译,把源代码编译成可执行的二进制文件。 -j 使用4进程同时编译,提升编译速度 或 使用4核CPU同时编译 -j 后的数字要和你的CPU核心数一样。

    5、Make install

    [root@bogon redis-3.0.0]# make install PREFIX=/usr/local/redis

    1.2   启动redis

    1、前端启动模式

    /usr/local/redis/bin/redis-server

    默认是前端启动模式,端口是6379

    2、后端启动

    1)从redis的源码目录中复制redis.conf到redis的安装目录。

    2)修改配置文件

    3)[root@bogon bin]# ./redis-server redis.conf

    1.3   Redis常用命令

    redis的常用命令主要分为两个方面、一个是键值相关命令、一个是服务器相关命令

    1、键值相关命令

          keys * 取出当前所有的key

          exists name 查看n是否有name这个key

          del name 删除key name

          expire confirm 100 设置confirm这个key100秒过期

          ttl confirm 获取confirm 这个key的有效时长

          select 0 选择到0数据库 redis默认的数据库是0~15一共16个数据库

          move confirm 1 将当前数据库中的key移动到其他的数据库中,这里就是把confire这个key从当前数据库中移动到1中

          persist confirm 移除confirm这个key的过期时间

          randomkey 随机返回数据库里面的一个key

          rename key2 key3 重命名key2 为key3

          type key2 返回key的数据类型

    2、服务器相关命令

          ping PONG返回响应是否连接成功

          echo 在命令行打印一些内容

          select 0~15 编号的数据库

          quit  /exit 退出客户端

          dbsize 返回当前数据库中所有key的数量

          info 返回redis的相关信息

          config get dir/* 实时传储收到的请求

          flushdb 删除当前选择数据库中的所有key

          flushall 删除所有数据库中的数据库

    1.4   常用数据类型

    String

    Hash

    List

    Set

    SortedSet

    2,Redis集群的搭建

    2.1   Redis集群相关概念

    2.1.1   redis-cluster架构图

    redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value

    Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点

    Key:a

    计算a的hash值,例如值为100,100这个槽在server1上,所以a应该放到server1.

     

    Key:hello

    Hash值:10032,此槽在server2上。Hell可以应该存在server2.

     

    2.1.2  redis-cluster投票:容错

    (1)领着投票过程是集群中所有master参与,如果半数以上master节点与master节点通信超过(cluster-node-timeout),认为当前master节点挂掉.

    (2):什么时候整个集群不可用(cluster_state:fail)? 

        a:如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完成时进入fail状态. ps : redis-3.0.0.rc1加入cluster-require-full-coverage参数,默认关闭,打开集群兼容部分失败.

        b:如果集群超过半数以上master挂掉,无论是否有slave集群进入fail状态.

      ps:当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误

    2.2   本指南的集群结构

    集群中有三个节点的集群,每个节点有一主一备。需要6台虚拟机。

    搭建一个伪分布式的集群,使用6个redis实例来模拟。

    2.3   搭建集群需要的环境

    搭建集群需要使用到官方提供的ruby脚本。

    需要安装ruby的环境。

    安装ruby

    yum install ruby

    yum install rubygems

    redis集群管理工具redis-trib.rb

    [root@bogon ~]# cd redis-3.0.0

    [root@bogon redis-3.0.0]# cd src

    [root@bogon src]# ll *.rb

    -rwxrwxr-x. 1 root root 48141 Apr  1 07:01 redis-trib.rb

    [root@bogon src]#

    脚本需要的ruby包:

    需要上传到linux服务。

    安装ruby的包:

    gem install redis-3.0.0.gem

    [root@bogon ~]# gem install redis-3.0.0.gem

    Successfully installed redis-3.0.0

    1 gem installed

    Installing ri documentation for redis-3.0.0...

    Installing RDoc documentation for redis-3.0.0...

    2.4   集群的搭建

    第一步:创建6个redis实例,端口号从7001~7006

    第二步:修改redis的配置文件

    [root@redis local]# vim redis/bin/redis.conf

    1、修改端口号

    2、打开cluster-enable前面的注释。

    第三步:把创建集群的ruby脚本复制到redis-cluster目录下。

    第四步:启动6个redis实例

    第五步:创建集群。

    ./redis-trib.rb create --replicas 1 192.168.25.153:7001 192.168.25.153:7002 192.168.25.153:7003 192.168.25.153:7004 192.168.25.153:7005  192.168.25.153:7006

    [root@bogon redis-cluster]# ./redis-trib.rb create --replicas 1 192.168.25.153:7001 192.168.25.153:7002 192.168.25.153:7003 192.168.25.153:7004 192.168.25.153:7005  192.168.25.153:7006

    >>> Creating cluster

    Connecting to node 192.168.25.153:7001: OK

    Connecting to node 192.168.25.153:7002: OK

    Connecting to node 192.168.25.153:7003: OK

    Connecting to node 192.168.25.153:7004: OK

    Connecting to node 192.168.25.153:7005: OK

    Connecting to node 192.168.25.153:7006: OK

    >>> Performing hash slots allocation on 6 nodes...

    Using 3 masters:

    192.168.25.153:7001

    192.168.25.153:7002

    192.168.25.153:7003

    Adding replica 192.168.25.153:7004 to 192.168.25.153:7001

    Adding replica 192.168.25.153:7005 to 192.168.25.153:7002

    Adding replica 192.168.25.153:7006 to 192.168.25.153:7003

    M: 5a8523db7e12ca600dc82901ced06741b3010076 192.168.25.153:7001

       slots:0-5460 (5461 slots) master

    M: bf6f0929044db485dea9b565bb51e0c917d20a53 192.168.25.153:7002

       slots:5461-10922 (5462 slots) master

    M: c5e334dc4a53f655cb98fa3c3bdef8a808a693ca 192.168.25.153:7003

       slots:10923-16383 (5461 slots) master

    S: 2a61b87b49e5b1c84092918fa2467dd70fec115f 192.168.25.153:7004

       replicates 5a8523db7e12ca600dc82901ced06741b3010076

    S: 14848b8c813766387cfd77229bd2d1ffd6ac8d65 192.168.25.153:7005

       replicates bf6f0929044db485dea9b565bb51e0c917d20a53

    S: 3192cbe437fe67bbde9062f59d5a77dabcd0d632 192.168.25.153:7006

       replicates c5e334dc4a53f655cb98fa3c3bdef8a808a693ca

    Can I set the above configuration? (type 'yes' to accept): yes

    >>> Nodes configuration updated

    >>> Assign a different config epoch to each node

    >>> Sending CLUSTER MEET messages to join the cluster

    Waiting for the cluster to join.....

    >>> Performing Cluster Check (using node 192.168.25.153:7001)

    M: 5a8523db7e12ca600dc82901ced06741b3010076 192.168.25.153:7001

       slots:0-5460 (5461 slots) master

    M: bf6f0929044db485dea9b565bb51e0c917d20a53 192.168.25.153:7002

       slots:5461-10922 (5462 slots) master

    M: c5e334dc4a53f655cb98fa3c3bdef8a808a693ca 192.168.25.153:7003

       slots:10923-16383 (5461 slots) master

    M: 2a61b87b49e5b1c84092918fa2467dd70fec115f 192.168.25.153:7004

       slots: (0 slots) master

       replicates 5a8523db7e12ca600dc82901ced06741b3010076

    M: 14848b8c813766387cfd77229bd2d1ffd6ac8d65 192.168.25.153:7005

       slots: (0 slots) master

       replicates bf6f0929044db485dea9b565bb51e0c917d20a53

    M: 3192cbe437fe67bbde9062f59d5a77dabcd0d632 192.168.25.153:7006

       slots: (0 slots) master

       replicates c5e334dc4a53f655cb98fa3c3bdef8a808a693ca

    [OK] All nodes agree about slots configuration.

    >>> Check for open slots...

    >>> Check slots coverage...

    [OK] All 16384 slots covered.

    [root@bogon redis-cluster]#

    2.5   测试集群

    [root@bogon redis-cluster]# redis01/redis-cli -h 192.168.25.153 -p 7002 -c

     

     

    [root@bogon redis-cluster]# redis01/redis-cli -h 192.168.25.153 -p 7002

    192.168.25.153:7002> set a 100

    (error) MOVED 15495 192.168.25.153:7003

    192.168.25.153:7002>

    [root@bogon redis-cluster]# redis01/redis-cli -h 192.168.25.153 -p 7002 -c

    192.168.25.153:7002> set a 100

    -> Redirected to slot [15495] located at 192.168.25.153:7003

    OK

    192.168.25.153:7003>

    2.6   关闭redis

    redis01/redis-cli -p 7001 shutdown

    2.7   Redis客户端

    2.7.1   Redis-cli

    自带客户端。使用最多的。

    2.7.2   图形化界面客户端

    只支持单机版,不支持集群。

    2.7.3  Jedis客户端

    2.7.3.1         单机版

    需要把jedis的jar包添加到工程中,如果是maven需要添加jar包的坐标。

    Jedis单机版

     1 public class JedisTest {
     2 
     3     @Test
     4     public void testJedisSingle() {
     5         //创建一个jedis的对象。
     6         Jedis jedis = new Jedis("192.168.25.153", 6379);
     7         //调用jedis对象的方法,方法名称和redis的命令一致。
     8         jedis.set("key1", "jedis test");
     9         String string = jedis.get("key1");
    10         System.out.println(string);
    11         //关闭jedis。
    12         jedis.close();
    13     }
    14     
    15     /**
    16      * 使用连接池
    17      */
    18     @Test
    19     public void testJedisPool() {
    20         //创建jedis连接池
    21         JedisPool pool = new JedisPool("192.168.25.153", 6379);
    22         //从连接池中获得Jedis对象
    23         Jedis jedis = pool.getResource();
    24         String string = jedis.get("key1");
    25         System.out.println(string);
    26         //关闭jedis对象
    27         jedis.close();
    28         pool.close();
    29     }

    2.7.3.2         集群版

     1 @Test
     2     public void testJedisCluster() {
     3         HashSet<HostAndPort> nodes = new HashSet<>();
     4         nodes.add(new HostAndPort("192.168.25.153", 7001));
     5         nodes.add(new HostAndPort("192.168.25.153", 7002));
     6         nodes.add(new HostAndPort("192.168.25.153", 7003));
     7         nodes.add(new HostAndPort("192.168.25.153", 7004));
     8         nodes.add(new HostAndPort("192.168.25.153", 7005));
     9         nodes.add(new HostAndPort("192.168.25.153", 7006));
    10         
    11         JedisCluster cluster = new JedisCluster(nodes);
    12         
    13         cluster.set("key1", "1000");
    14         String string = cluster.get("key1");
    15         System.out.println(string);
    16         
    17         cluster.close();
    18     }
  • 相关阅读:
    shell脚本中执行python脚本并接收其返回值的例子
    linux查找所有文件中某个字符串
    Shell脚本中单引号(‘)和双引号(“)的使用区别
    第一个shell脚本
    shell 比较符号
    source ~/.bash_profile是什么意思
    bash shell:获取当前脚本的绝对路径(pwd/readlink)
    poj 3307 Smart Sister 打表解因子生成数问题
    Python将JSON格式数据转换为SQL语句以便导入MySQL数据库
    UISegmentedControl的具体使用
  • 原文地址:https://www.cnblogs.com/append/p/5748121.html
Copyright © 2011-2022 走看看