Redis--Nosql数据库

录:
1、redis介绍
    a) 什么是NoSql
    b) NoSql的分类
    c) 什么是redis
    d) Redis应用场景
2、redis安装和启动
3、redis客户端
    a) redis自带客户端
    b) 图形界面的客户端(了解)
    c) Java客户端jedis(重点)
4、Redis数据类型(重点)
    a) string类型
    b) hash散列类型
    c) List类型
    d) Set类型
    e) SortedSet
5、Keys命令(了解)
6、Redis的持久化方案
    a) Rbd方式
    b) Aof方式
7、Redis的主从复制
8、Redis的集群(重点)
9、Jedis连接redis集群

1、Redis介绍    <--返回目录

    * 什么是NoSql?
        - 为了解决高并发、高可用、高可扩展,大数据存储等一系列问题而产生的数据库解决方案,就是NoSql。
        - NoSql,叫非关系型数据库,它的全名Not only sql。它不能替代关系型数据库,只能作为关系型数据库的一个良好补充。
    * NoSql的分类
        - 键值(Key-Value)存储数据库
            相关产品: Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB
            典型应用:内容缓存,主要用于处理大量数据的高访问负载。
            数据模型:一系列键值对
            优势:快速查询
            劣势:存储的数据缺少结构化
        - 列存储数据库
            相关产品:Cassandra, HBase, Riak
            典型应用:分布式的文件系统
            数据模型:以列簇式存储,将同一列数据存在一起
            优势:查找速度快,可扩展性强,更容易进行分布式扩展
            劣势:功能相对局限
        - 文档型数据库
            相关产品:CouchDB、MongoDB
            典型应用:Web应用(与Key-Value类似,Value是结构化的)
            数据模型:一系列键值对
            优势:数据结构要求不严格
            劣势:查询性能不高,而且缺乏统一的查询语法
        - 图形(Graph)数据库
            相关数据库:Neo4J、InfoGrid、Infinite Graph
            典型应用:社交网络
            数据模型:图结构
            优势:利用图结构相关算法。
            劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。

    * 什么是redis
        - Redis是使用c语言开发的一个高性能键值数据库。Redis可以通过一些键值类型来存储数据。
        - 键值类型:
            String字符类型
            hash散列类型
            list列表类型
            set集合类型
            sortedset有序集合类型

    * redis历史发展
            2008年,意大利的一家创业公司Merzia推出了一款基于MySQL的网站实时统计系统LLOOGG,然而没过多久该公司的创始人 Salvatore Sanfilippo便对MySQL的性能感到失望,
        于是他决定亲自为LLOOGG量身定做一个数据库,并于2009年开发完成,这个数据库就是Redis。不过Salvatore Sanfilippo并不满足只将Redis用于LLOOGG这一款产品,
        而是希望更多的人使用它,于是在同一年Salvatore Sanfilippo将Redis开源发布,并开始和Redis的另一名主要的代码贡献者Pieter Noordhuis一起继续着Redis的开发,
        直到今天。
            Salvatore Sanfilippo自己也没有想到,短短的几年时间,Redis就拥有了庞大的用户群体。Hacker News在2012年发布了一份数据库的使用情况调查,
        结果显示有近12%的公司在使用Redis。国内如新浪微博、街旁网、知乎网,国外如GitHub、Stack Overflow、Flickr等都是Redis的用户。
        VMware公司从2010年开始赞助Redis的开发, Salvatore Sanfilippo和Pieter Noordhuis也分别在3月和5月加入VMware,全职开发Redis。

    * redis的应用场景
        缓存(数据查询、短连接、新闻内容、商品内容等等)。(最多使用)
        分布式集群架构中的session分离。
        聊天室的在线好友列表。
        任务队列。(秒杀、抢购、12306等等)
        应用排行榜。
        网站访问统计。
        数据过期处理(可以精确到毫秒)

2、redis安装和启动    <--返回目录

    * redis下载
        官网地址:http://redis.io/
        下载地址:http://download.redis.io/releases/redis-3.0.0.tar.gz

    * redis的安装
        redis的安装环境会安装到linux系统中。
        第一步:安装VMware,并且在VMware中安装centos系统(参考linux教程)。
        第二步:将redis的压缩包,上传到linux系统
        第三步:对redis的压缩包进行解压缩
        Redis解压缩之后的文件是用c语言写的源码文件
        [root@itheima ~]# tar -zxf redis-3.0.0.tar.gz

        第四步:安装c语言环境(安装centos之后,自带c语言环境)
        [root@itheima ~]# yum install gcc-c++
        第五步:编译redis源码
        [root@itheima ~]# cd redis-3.0.0
        [root@itheima redis-3.0.0]# make

        第六步:安装redis
        [root@itheima redis-3.0.0]# make install PREFIX=/usr/local/redis19

        第七步:查看是否安装成功
                
    * redis启动        
        - 前端启动
            前端启动的命令:
                [root@itheima bin]# ./redis-server
            前端启动的关闭:
                强制关闭:Ctrl+c
                正常关闭:[root@itheima bin]# ./redis-cli shutdown
            前端启动的问题:
                一旦客户端关闭,则redis服务也停掉。
        
        - 后端启动
            第一步:需要将redis解压之后的源码包中的redis.conf文件拷贝到bin目录下
                [root@itheima bin]# cp /root/redis-3.0.0/redis.conf ./

            第二步:修改redis.conf文件,将daemonize改为yes
                先要使用vim redis.conf
    
            第三步:使用命令后端启动redis
                [root@itheima bin]# ./redis-server redis.conf
                
            第四步:查看是否启动成功
                ps -aux|grep redis
                
        - 关闭后端启动的方式:
            强制关闭:[root@itheima bin]# kill -9 5071
            正常关闭:[root@itheima bin]# ./redis-cli shutdown

            在项目中,建议使用正常关闭。
            因为redis作为缓存来使用的话,将数据存储到内存中,如果使用正常关闭,则会将内存数据持久化到本地之后,再关闭。

            如果是强制关闭,则不会进行持久化操作,可能会造成部分数据的丢失。

3、Redis客户端    <--返回目录

    * Redis自带的客户端
        - 启动
            启动客户端命令:[root@itheima bin]# ./redis-cli -h 127.0.0.1 -p 6379
            -h:指定访问的redis服务器的ip地址
            -p:指定访问的redis服务器的port端口

            还可以写成:[root@itheima bin]# ./redis-cli
            使用默认配置:默认的ip【127.0.0.1】,默认的port【6379】
        - 关闭
            Ctrl+c
            127.0.0.1:6379> quit

    * 图形界面客户端

  安装包

  安装后,打开的界面

 * 客户端要连接上redis,需要设置防火墙打开端口。防火墙设置:
        [root@itheima redis-3.0.0]# vim /etc/sysconfig/iptables
        # Firewall configuration written by system-config-firewall
        # Manual customization of this file is not recommended.
        *filter
        :INPUT ACCEPT [0:0]
        :FORWARD ACCEPT [0:0]
        :OUTPUT ACCEPT [0:0]
        -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
        -A INPUT -p icmp -j ACCEPT
        -A INPUT -i lo -j ACCEPT
        -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
        -A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
        -A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
        -A INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT
        -A INPUT -j REJECT --reject-with icmp-host-prohibited
        -A FORWARD -j REJECT --reject-with icmp-host-prohibited
        COMMIT
        ~                                                                                                                                                                                                                                                                                                       
        "/etc/sysconfig/iptables" 16L, 677C 已写入
        [root@itheima redis-3.0.0]# service iptables restart
        iptables:清除防火墙规则:                                 [确定]
        iptables:将链设置为政策 ACCEPT:filter            [确定]
        iptables:正在卸载模块:                                   [确定]
        iptables:应用防火墙规则:                                 [确定]
        [root@itheima redis-3.0.0]#

* Jedis客户端
        - jedis介绍
            Redis不仅是使用命令来操作,现在基本上主流的语言都有客户端支持,比如java、C、C#、C++、php、Node.js、Go等。
            在官方网站里列一些Java的客户端,有Jedis、Redisson、Jredis、JDBC-Redis、等其中官方推荐使用Jedis和Redisson。
            在企业中用的最多的就是Jedis,下面我们就重点学习下Jedis。
            Jedis同样也是托管在github上,地址:https://github.com/xetorthio/jedis

        - 工程搭建
            创建java project
            添加jar包:commons-pool2-2.3.jar和jediss-2.7.0.jar
           
        - 单实例连接redis

@Test 
public void jedisClient() {
    Jedis jedis = new Jedis("192.168.242.137",6379);
    jedis.set("s2","222");
    String result = jedis.get("s2");
    System.out.println(result);
    jedis.close();
}

        - 使用jedis连接池连接redis服务器

@Test
public void jedisPool() {
    JedisPool pool = new JedisPool("192.168.242.137",6379);
    Jedis jedis = pool.getResource();
    jedis.set("s4","444");
    String result = jedis.get("s4");
    System.out.println(result);
    jedis.close();
    pool.close();
}

    * Spring整合jedisPool

  配置spring配置文件applicationContext.xml

<!-- 连接池配置 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
    <!-- 最大连接数 -->
    <propertyname="maxTotal"value="30"/>
    <!-- 最大空闲连接数 -->
    <propertyname="maxIdle"value="10"/>
    <!-- 每次释放连接的最大数目 -->
    <propertyname="numTestsPerEvictionRun"value="1024"/>
    <!-- 释放连接的扫描间隔(毫秒) -->
    <propertyname="timeBetweenEvictionRunsMillis"value="30000"/>
    <!-- 连接最小空闲时间 -->
    <propertyname="minEvictableIdleTimeMillis"value="1800000"/>
    <!-- 连接空闲多久后释放, 当空闲时间>该值且空闲连接>最大空闲连接数时直接释放 -->
    <propertyname="softMinEvictableIdleTimeMillis"value="10000"/>
    <!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 -->
    <propertyname="maxWaitMillis"value="1500"/>
    <!-- 在获取连接的时候检查有效性, 默认false -->
    <propertyname="testOnBorrow"value="false"/>
    <!-- 在空闲时检查有效性, 默认false -->
    <propertyname="testWhileIdle"value="true"/>
    <!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->
    <propertyname="blockWhenExhausted"value="false"/>
</bean>

<!-- redis单机通过连接池 -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool"
    destroy-method="close">
    <constructor-argname="poolConfig" ref="jedisPoolConfig"/>
    <constructor-argname="host" value="192.168.242.130"/>
    <constructor-argname="port" value="6379"/>
</bean>

        测试代码:

@Test
publicvoid testJedisPool() {
    JedisPool pool = (JedisPool) applicationContext.getBean("jedisPool");
    Jedis jedis = null;
    try {
        jedis = pool.getResource();
        jedis.set("name", "lisi");
        String name = jedis.get("name");
        System.out.println(name);
    } catch (Exception ex) {
        ex.printStackTrace();
    } finally {
        if (jedis != null) {
            // 关闭连接
            jedis.close();
        }
    }
}

4、redis数据类型    <--返回目录

    string字符类型,hash散列类型,list列表类型,set集合类型,sortedset有序集合类型

redis命令操作(一)--键key,字符串String

redis命令操作(二)--哈希Hash,列表List

redis命令操作(三)--集合Set,有序集合ZSet

5、 Keys命令    <--返回目录

redis命令操作(一)--键key,字符串String

6、Redis的持久化方案    <--返回目录

6.1、 rbd方式

  rdb方式是redis默认的方式,redis通过快照来将数据持久化到磁盘中。

  在redis.conf中修改持久化快照的条件,如下:

  在redis.conf中可以指定持久化文件存储的目录

  rdb方式存在的问题

  一旦redis非法关闭,那么会丢失最后一次持久化之后的数据。如果数据不重要,则不必要关心。如果数据不能允许丢失,那么要使用aof方式。

6.2、aof方式

  Redis默认是不使用该方式持久化的。Aof方式的持久化,是操作一次redis数据库,则将操作的记录存储到aof持久化文件中。

  第一步:开启aof方式的持久化方案
  将redis.conf中的appendonly改为yes,即开启aof方式的持久化方案。

  Aof文件存储的目录和rdb方式的一样。

  Aof文件存储的名称

 6.3、结论

  在使用aof和rdb方式时,如果redis重启,则数据从aof文件加载。

7、 Redis的主从复制    <--返回目录

7.1、什么是主从复制

  持久化保证了即使redis服务重启也不会丢失数据,因为redis服务重启后会将硬盘上持久化的数据恢复到内存中,但是当redis服务器的硬盘损坏了可能会导致数据丢失,如果通过redis的主从复制机制就可以避免这种单点故障,如下图:

  说明:

主redis中的数据有两个副本(replication)即从redis1和从redis2,即使一台redis服务器宕机其它两台redis服务也可以继续提供服务。
主redis中的数据和从redis上的数据保持实时同步,当主redis写入数据时通过主从复制机制会复制到两个从redis服务上。
只有一个主redis,可以有多个从redis。
主从复制不会阻塞master,在同步数据时,master 可以继续处理client 请求

  一个redis可以即是主又是从,如下图:

7.2、主从复制设置

  主机无需设置。

  从机设置:

第一步:复制出一个从机
[root@itheima redis19]# cp bin/ bin2 –r


第二步:修改从机的redis.conf
语法:Slaveof masterip masterport
slaveof 192.168.242.137 6379

第三步:修改从机的port地址为6380

在redis.conf中修改

第四步:清除从机中的持久化文件
[root@itheima bin2]# rm -rf appendonly.aof dump.rdb

第五步:启动从机
[root@itheima bin2]# ./redis-server redis.conf

第六步:启动6380的客户端
[root@itheima bin2]# ./redis-cli -p 6380

注意:
    主机一旦发生增删改操作,那么从机会将数据同步到从机中
    从机不能执行写操作

127.0.0.1:6380> set s2 222
(error) READONLY You can't write against a read only slave.

8、 Redis的集群(重点)    <--返回目录

8.1、redis-cluster架构图

  架构细节:

(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.
(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value
Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,
然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点

  示例如下:

8.2、redis-cluster投票:容错

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

 

8.3、安装ruby

集群管理工具(redis-trib.rb)是使用ruby脚本语言编写的。

第一步:安装ruby
[root@itheima bin2]# yum install ruby
[root@itheima bin2]# yum install rubygems

第二步:将以下文件上传到linux系统

第三步:安装ruby和redis接口
[root@itheima ~]# gem install redis-3.0.0.gem

第四步:将redis-3.0.0包下src目录中的以下文件拷贝到redis19/redis-cluster/

[root@itheima src]# cd /usr/local/redis19/
[root@itheima redis19]# mkdir redis-cluster
[root@itheima redis19]# cd /root/redis-3.0.0/src/
[root@itheima src]# cp redis-trib.rb  /usr/local/redis19/redis-cluster

第五步:查看是否拷贝成功

8.4、搭建集群

搭建集群最少也得需要3台主机,如果每台主机再配置一台从机的话,则最少需要6台机器。

端口设计如下:7001-7006

第一步:复制出一个7001机器
[root@itheima redis19]# cp bin ./redis-cluster/7001 –r

第二步:如果存在持久化文件,则删除
[root@itheima 7001]# rm -rf appendonly.aof dump.rdb

第三步:设置集群参数

第四步:修改端口

第五步:复制出7002-7006机器
[root@itheima redis-cluster]# cp 7001/ 7002 -r
[root@itheima redis-cluster]# cp 7001/ 7003 -r
[root@itheima redis-cluster]# cp 7001/ 7004 -r
[root@itheima redis-cluster]# cp 7001/ 7005 -r
[root@itheima redis-cluster]# cp 7001/ 7006 –r

第六步:修改7002-7006机器的端口

第七步:启动7001-7006这六台机器

 第八步:修改start-all.sh文件的权限
[root@itheima redis-cluster]# chmod u+x start-all.sh

[root@itheima redis-cluster]# ./start-all.sh

第九步:创建集群

[root@itheima redis-cluster]# ./redis-trib.rb create --replicas 1 192.168.242.137:7001 192.168.242.137:7002 192.168.242.137:7003 192.168.242.137:7004 192.168.242.137:7005  192.168.242.137:7006
>>> Creating cluster
Connecting to node 192.168.242.137:7001: OK
Connecting to node 192.168.242.137:7002: OK
Connecting to node 192.168.242.137:7003: OK
Connecting to node 192.168.242.137:7004: OK
Connecting to node 192.168.242.137:7005: OK
Connecting to node 192.168.242.137:7006: OK
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.242.137:7001
192.168.242.137:7002
192.168.242.137:7003
Adding replica 192.168.242.137:7004 to 192.168.242.137:7001
Adding replica 192.168.242.137:7005 to 192.168.242.137:7002
Adding replica 192.168.242.137:7006 to 192.168.242.137:7003
M: 8240cd0fe6d6f842faa42b0174fe7c5ddcf7ae24 192.168.242.137:7001
   slots:0-5460 (5461 slots) master
M: 4f52a974f64343fd9f1ee0388490b3c0647a4db7 192.168.242.137:7002
   slots:5461-10922 (5462 slots) master
M: cb7c5def8f61df2016b38972396a8d1f349208c2 192.168.242.137:7003
   slots:10923-16383 (5461 slots) master
S: 66adf006fed43b3b5e499ce2ff1949a756504a16 192.168.242.137:7004
   replicates 8240cd0fe6d6f842faa42b0174fe7c5ddcf7ae24
S: cbb0c9bc4b27dd85511a7ef2d01bec90e692793b 192.168.242.137:7005
   replicates 4f52a974f64343fd9f1ee0388490b3c0647a4db7
S: a908736eadd1cd06e86fdff8b2749a6f46b38c00 192.168.242.137:7006
   replicates cb7c5def8f61df2016b38972396a8d1f349208c2
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.242.137:7001)
M: 8240cd0fe6d6f842faa42b0174fe7c5ddcf7ae24 192.168.242.137:7001
   slots:0-5460 (5461 slots) master
M: 4f52a974f64343fd9f1ee0388490b3c0647a4db7 192.168.242.137:7002
   slots:5461-10922 (5462 slots) master
M: cb7c5def8f61df2016b38972396a8d1f349208c2 192.168.242.137:7003
   slots:10923-16383 (5461 slots) master
M: 66adf006fed43b3b5e499ce2ff1949a756504a16 192.168.242.137:7004
   slots: (0 slots) master
   replicates 8240cd0fe6d6f842faa42b0174fe7c5ddcf7ae24
M: cbb0c9bc4b27dd85511a7ef2d01bec90e692793b 192.168.242.137:7005
   slots: (0 slots) master
   replicates 4f52a974f64343fd9f1ee0388490b3c0647a4db7
M: a908736eadd1cd06e86fdff8b2749a6f46b38c00 192.168.242.137:7006
   slots: (0 slots) master
   replicates cb7c5def8f61df2016b38972396a8d1f349208c2
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@itheima redis-cluster]#

8.5、连接集群

[root@itheima 7001]# ./redis-cli -h 192.168.242.137 -p 7001 –c
-c:指定是集群连接

8.6、查看集群信息

  查看集群信息

192.168.242.137:7002> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:2
cluster_stats_messages_sent:2372
cluster_stats_messages_received:2372
192.168.242.137:7002>

  查看集群节点

192.168.242.137:7002> cluster nodes
8240cd0fe6d6f842faa42b0174fe7c5ddcf7ae24 192.168.242.137:7001 master - 0 1451581348093 1 connected 0-5460
cb7c5def8f61df2016b38972396a8d1f349208c2 192.168.242.137:7003 master - 0 1451581344062 3 connected 10923-16383
66adf006fed43b3b5e499ce2ff1949a756504a16 192.168.242.137:7004 slave 8240cd0fe6d6f842faa42b0174fe7c5ddcf7ae24 0 1451581351115 1 connected
a908736eadd1cd06e86fdff8b2749a6f46b38c00 192.168.242.137:7006 slave cb7c5def8f61df2016b38972396a8d1f349208c2 0 1451581349101 3 connected
4f52a974f64343fd9f1ee0388490b3c0647a4db7 192.168.242.137:7002 myself,master - 0 0 2 connected 5461-10922
cbb0c9bc4b27dd85511a7ef2d01bec90e692793b 192.168.242.137:7005 slave 4f52a974f64343fd9f1ee0388490b3c0647a4db7 0 1451581350108 5 connected

9、Jedis连接redis集群    <--返回目录

9.1、设置防火墙

[root@itheima redis-cluster]# vim /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7001 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7002 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7003 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7004 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7005 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7006 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7007 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
~                                                                                                     
~                                                                                                     
~                                                                                                     
~                                                                                                     
"/etc/sysconfig/iptables" 23L, 1146C 已写入
[root@itheima redis-cluster]# service iptables restart
iptables:清除防火墙规则:                                 [确定]
iptables:将链设置为政策 ACCEPT:filter                    [确定]
iptables:正在卸载模块:                                   [确定]
iptables:应用防火墙规则:                                 [确定]
[root@itheima redis-cluster]#

9.2、代码

9.3、使用spring

  配置applicationContext.xml

<!-- 连接池配置 -->
<beanid="jedisPoolConfig"class="redis.clients.jedis.JedisPoolConfig">
    <!-- 最大连接数 -->
    <propertyname="maxTotal"value="30"/>
    <!-- 最大空闲连接数 -->
    <propertyname="maxIdle"value="10"/>
    <!-- 每次释放连接的最大数目 -->
    <propertyname="numTestsPerEvictionRun"value="1024"/>
    <!-- 释放连接的扫描间隔(毫秒) -->
    <propertyname="timeBetweenEvictionRunsMillis"value="30000"/>
    <!-- 连接最小空闲时间 -->
    <propertyname="minEvictableIdleTimeMillis"value="1800000"/>
    <!-- 连接空闲多久后释放, 当空闲时间>该值且空闲连接>最大空闲连接数时直接释放 -->
    <propertyname="softMinEvictableIdleTimeMillis"value="10000"/>
    <!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 -->
    <propertyname="maxWaitMillis"value="1500"/>
    <!-- 在获取连接的时候检查有效性, 默认false -->
    <propertyname="testOnBorrow"value="true"/>
    <!-- 在空闲时检查有效性, 默认false -->
    <propertyname="testWhileIdle"value="true"/>
    <!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->
    <propertyname="blockWhenExhausted"value="false"/>
</bean>
<!-- redis集群 -->
<beanid="jedisCluster"class="redis.clients.jedis.JedisCluster">
    <constructor-argindex="0">
        <set>
            <beanclass="redis.clients.jedis.HostAndPort">
                <constructor-argindex="0"value="192.168.101.3"></constructor-arg>
                <constructor-argindex="1"value="7001"></constructor-arg>
            </bean>
            <beanclass="redis.clients.jedis.HostAndPort">
                <constructor-argindex="0"value="192.168.101.3"></constructor-arg>
                <constructor-argindex="1"value="7002"></constructor-arg>
            </bean>
            <beanclass="redis.clients.jedis.HostAndPort">
                <constructor-argindex="0"value="192.168.101.3"></constructor-arg>
                <constructor-argindex="1"value="7003"></constructor-arg>
            </bean>
            <beanclass="redis.clients.jedis.HostAndPort">
                <constructor-argindex="0"value="192.168.101.3"></constructor-arg>
                <constructor-argindex="1"value="7004"></constructor-arg>
            </bean>
            <beanclass="redis.clients.jedis.HostAndPort">
                <constructor-argindex="0"value="192.168.101.3"></constructor-arg>
                <constructor-argindex="1"value="7005"></constructor-arg>
            </bean>
            <beanclass="redis.clients.jedis.HostAndPort">
                <constructor-argindex="0"value="192.168.101.3"></constructor-arg>
                <constructor-argindex="1"value="7006"></constructor-arg>
            </bean>
        </set>
    </constructor-arg>
    <constructor-argindex="1"ref="jedisPoolConfig"></constructor-arg>
</bean>

  测试代码

private ApplicationContext applicationContext;
@Before
publicvoid init() {
    applicationContext = new ClassPathXmlApplicationContext(
            "classpath:applicationContext.xml");
}

// redis集群
@Test
publicvoid testJedisCluster() {
    JedisCluster jedisCluster = (JedisCluster) applicationContext
            .getBean("jedisCluster");

    jedisCluster.set("name", "zhangsan");
    String value = jedisCluster.get("name");
    System.out.println(value);
}

---

原文地址:https://www.cnblogs.com/xy-ouyang/p/14199637.html