Redis总结
1. NoSql概述
1.1 什么是Nosql
随着web2.0的快速发展,非关系型、分布式数据存储得到了快速的发展,它们不保证关系数据的ACID特性。NoSQL概念在2009年被提了出来。NoSQL最常见的解释是“non-relational”,“Not Only SQL”也被很多人接受。(“NoSQL”一词最早于1998年被用于一个轻量级的关系数据库的名字。)
1.1 为什么要使用Nosql
l 传统的数据库遇到的瓶颈
传统的关系数据库具有不错的性能,高稳定型,久经历史考验,而且使用简单,功能强大,同时也积累了大量的成功案例。在互联网领域,MySQL成为了绝对靠前的王者,毫不夸张的说,MySQL为互联网的发展做出了卓越的贡献。
在90年代,一个网站的访问量一般都不大,用单个数据库完全可以轻松应付。在那个时候,更多的都是静态网页,动态交互类型的网站不多。
到了最近10年,网站开始快速发展。火爆的论坛、博客、sns、微博逐渐引领web领域的潮流。在初期,论坛的流量其实也不大,如果你接触网络比较早,你可能还记得那个时候还有文本型存储的论坛程序,可以想象一般的论坛的流量有多大。
Ø 高并发读写
Web2.0网站,数据库并发负载非常高,往往达到每秒上万次的读写请求
Ø 高容量存储和高效存储
Web2.0网站通常需要在后台数据库中存储海量数据,如何存储海量数据并进行高效的查询往往是一个挑战
1024T=1PB…
Ø 高扩展性和高可用性
随着系统的用户量和访问量与日俱增,需要数据库能够很方便的进行扩展、维护
l NoSql****数据库的优势
Ø 易扩展
NoSQL数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展。也无形之间,在架构的层面上带来了可扩展的能力。
Ø 大数据量,高性能
NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单。一般MySQL使用Query Cache,每次表的更新Cache就失效,是一种大粒度的Cache,在针对web2.0的交互频繁的应用,Cache性能不高。而NoSQL的Cache是记录级的,是一种细粒度的Cache,所以NoSQL在这个层面上来说就要性能高很多了。
Ø 灵活的数据模型
NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦。这点在大数据量的web2.0时代尤其明显。
Ø 高可用
NoSQL在不太影响性能的情况,就可以方便的实现高可用的架构。比如Cassandra,HBase模型,通过复制模型也能实现高可用。
高可用(High Availability) 通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性。
1.2 常见的NoSql产品
1. Redis概述
1.1 什么是Redis
全称:Remote DIctionary Server(远程字典服务器)。是完全开源免费的,用C语言编写的, 遵守BCD协议。是一个高性能的**(key/value)**分布式内存数据库,
基于内存运行并支持持久化的NoSQL数据库,是当前最热门的NoSql数据库之一,也被人们称为数据结构服务器。
Redis的上一代产品 Memcached !!!
Redis 与其他 key - value 缓存产品有以下三个特点
i)Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用!!!
ii)Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储
iii)Redis支持数据的备份,即master-slave(主从)模式的数据备份,也可以集群!!!
1.2 Redis优势
Ø 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
Ø 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
Ø 原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
Ø 丰富的特性 – Redis还支持 publish/subscribe(发布订阅), 通知, key 过期等等特性
1.3 Redis应用场景
1.1 Redis下载
3. Redis的环境和安装
2.1 环境准备
Ø 虚拟机
Ø Linux系统
Ø SSH客户端
2.2 Redis的安装
2.2.1 Redis的编译环境
Redis是C语言开发的,安装redis需要先去官网下载源码进行编译,编译需要依赖于GCC编译环境,如果CentOS上没有安装gcc编译环境,需要提前安装,安装命令如下:
[root@localhost ~]# yum install gcc-c++
如果提示是否下载,选择: y
如果提示是否安装,选择: y
1.1.1 Redis的安装
l 使用filezilla上传Redis安装文件到Linux目录
Ø 上传Redis安装文件
l 解压redis文件
[root@localhost opt]# tar -zxvf redis-3.0.0.tar.gz
l 编译Redis(编译,将.c文件编译为.o文件)
进入解压文件夹,cd redis-3.0.0/
执行 make
编译成功!如果编译过程中出错,先删除安装文件目录,后解压重新编译。
l 安装
[root@localhost redis-3.0.0]# make PREFIX=/opt/redis install
l 安装之后的bin目录
l Copy文件
Redis启动需要一个配置文件,可以修改端口号信息。
[root@localhost redis-3.0.0]# cp redis.conf /opt/redis
1.2 Redis的启动
1.2.1 Redis的前端模式启动
[root@localhost bin]# ./redis-server
前台启动:界面停住,不能进行别的操作!!
使用ctrl+c退出前端启动。
1.2.2 Redis的后端启动
l 修改redis.conf配置文件,daemonize yes以后端模式启动
[root@localhost redis]# vi redis.conf
l 启动时,制定配置文件
[root@localhost redis]# ./bin/redis-server ./redis.conf
l Redis默认端口:6379,通过当前服务进行查看
[root@localhost redis]# ps -ef | grep -i redis
1.2.3 Redis的停止
l 强制结束程序。强制终止Redis进程可能会导致redis持久化数据丢失。
l 正确停止Redis的方式应该是向Redis发送SHUTDOWN命令,方法为(关闭默认的端口)
[root@localhost redis]# ./bin/redis-cli shutdown
1.3 Redis的连接
1.3.1 连接客户端
1.3.2 向Redis服务器发送命令
l Ping,测试客户端与Redis的连接是否正常,如果连接正常,回收到pong
4. Jedis入门
1.1 Jedis介绍
1.2 Java连接Redis
1.2.1 导入jar包
<dependencies>
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.2</version>
</dependency>
</dependencies>
1.2.2 单实例连接
@Test
public void test1(){
// 1.设置IP地址和端口
Jedis jedis = new Jedis("192.168.220.21", 6379);
// 2.设置数据
jedis.set("name", "hhh");
// 3.获得数据
String name = jedis.get("name");
System.out.println("name=" + name);
jedis.close();
}
如果连接不上,需要事先把服务器端端口在防火墙中打开。
也可以选择关闭防火墙测试: systemctl firewalld stop
1.2.3 连接超时
1.2.4 连接池的连接方式
@Test
public void testJedisPool() {
// 1.获取连接池配置对象,设置配置项
JedisPoolConfig config = new JedisPoolConfig();
// 1.1最大的连接数
config.setMaxTotal(30);
// 1.2最大的空闲
config.setMaxIdle(10);
// 2.获取连接池
JedisPool jedisPool = new JedisPool(config, "192.168.221.128", 6379);
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
// 4.设置数据e
jedis.set("name", "bruceLiu");
String name = jedis.get("name");
System.out.println("name=" + name);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (jedis != null) {
jedis.close();
}
// 虚拟机关闭的时候,释放资源
if (jedisPool != null) {
jedisPool.close();
}
}
}
5. Redis的数据结构
1.1 Redis的数据结构介绍
Redis简单理解就是个一个Map结构 key–value 根据key操作value!
1.2 存储String
1.2.1 常用命令
赋值
取值
取值的同时赋值
删除
数值的增减
1.2.2 扩展的命令
1.3 存储Hash
1.3.1 常用命令
- 赋值
3. 取值
4. 删除
- 增加数字
3.2 扩展的命令
4. 存储List
4.1 常用命令
两端添加
查看列表
两端弹出
获取元素的个数
4.2 扩展的命令
!
3. Keys通用操作
4. Redis的多数据库
切换至0数据库下面
将newkey移动到1号数据库
5. Redis的常见服务器命令
*** Redis的主从复制
1.1 什么是主从复制
持久化保证了即使redis服务重启也不会丢失数据,因为redis服务重启后会将硬盘上持久化的数据恢复到内存中,但是当redis服务器的硬盘损坏了可能会导致数据丢失,如果通过redis的主从复制机制就可以避免这种单点故障,如下图:
说明:
n 主redis中的数据有两个副本(replication)即从redis1和从redis2,即使一台redis服务器宕机其它两台redis服务也可以继续提供服务。
n 主redis中的数据和从redis上的数据保持实时同步,当主redis写入数据时通过主从复制机制会复制到两个从redis服务上。
n 只有一个主redis,可以有多个从redis。
n 主从复制不会阻塞master,在同步数据时,master 可以继续处理client 请求
1.2 主从配置
1.2.3主节点的配置
无需特殊配置,保持和之前的单机配置方式。
1.2.4 从redis配置
第一步:克隆出一个从机(Linux)
第二步:修改从机的redis.conf
语法:slaveof
第四步:清除从机中的持久化文件(redis文件夹中bin下)(如果有)
[root@bruce1 bin]# rm -rf appendonly.aof dump.rdb
[root@bruce1 bin]# ll
总用量 15440
-rwxr-xr-x. 1 root root 4588902 7月 1 09:27 redis-benchmark
-rwxr-xr-x. 1 root root 22225 7月 1 09:27 redis-check-aof
-rwxr-xr-x. 1 root root 45443 7月 1 09:27 redis-check-dump
-rwxr-xr-x. 1 root root 4691809 7月 1 09:27 redis-cli
lrwxrwxrwx. 1 root root 12 7月 1 09:27 redis-sentinel -> redis-server
-rwxr-xr-x. 1 root root 6450337 7月 1 09:27 redis-server
第五步:启动从机
[root@bruce1 redis1]# ./bin/redis-server ./redis.conf
第六步:先启动主机的服务端再客户端
[root@bruce1 redis1]# ./bin/redis-cli -p 6379
127.0.0.1:6380> keys *
1) "mylist"
2) "num"
3) "bookCate1"
4) "newbook"
5) "company"
127.0.0.1:6380>
注意:
Ø 主机一旦发生增删改操作,那么从机会将数据同步到从机中
Ø 从机不能执行写操作
127.0.0.1:6380> get username
"hehe"
127.0.0.1:6380> set username haha
(error) READONLY You can't write against a read only slave.
*** Redis集群搭建
2.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 会根据节点数量大致均等的将哈希槽映射到不同的节点!
示例如下:
2.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状态。
2.3 搭建Ruby环境
如果你没关闭防火墙,那么需要开启两个端口:6379 和16379端口,不然搭建无法成功
集群管理工具(redis-trib.rb)是使用ruby脚本语言编写的。
- 第一步: 安装ruby
[root@22 bin]# yum install ruby
[root@22 bin]# yum install rubygems
2.第二步:将以下文件上传到linux系统下/opt下
3.第三步:安装ruby和redis接口
-rw-r--r--. 1 root root 22301 8月 18 2016 dangdang.sql
drwxr-xr-x. 3 root root 4096 7月 1 10:00 redis
drwxr-xr-x. 3 root root 4096 7月 1 09:54 redis1
drwxrwxr-x. 6 root root 4096 4月 1 2015 redis-3.0.0
-rw-r--r--. 1 root root 57856 7月 1 10:03 redis-3.0.0.gem
drwxr-xr-x. 9 root root 4096 6月 28 23:26 tomcat
[root@22 opt]# gem install redis-3.0.0.gem
第四步:将redis-3.0.0包下src目录中的以下文件拷贝到/opt/
[root@22src]# cp redis-trib.rb /opt/
第五步:如果存在持久化文件,则删除
[root@22 bin]# rm -rf appendonly.aof dump.rdb
第六步:修改redis.conf配置文件,打开cluster-enable yes
如果你没关闭防火墙,那么需要开启两个端口:6379 和16379端口,不然搭建无法成功
第七步:克隆出22-27机器(Linux克隆)
第九步:启动所有的实例(可以不起)
[root@22 opt]# ./redis/bin/redis-server ./redis/redis.conf
第十步:创建集群
在这执行:
./redis-trib.rb create --replicas 1 192.168.220.22:6379 192.168.220.23:6379 192.168.220.25:6379 192.168.220.26:6379 192.168.220.27:6379 192.168.220.28:6379
执行后的结果
>>> Creating cluster
Connecting to node 192.168.221.22:6379: OK
Connecting to node 192.168.221.23:6379: OK
Connecting to node 192.168.221.25:6379: OK
Connecting to node 192.168.221.26:6379: OK
Connecting to node 192.168.221.27:6379: OK
Connecting to node 192.168.221.28:6379: OK
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.220.22:6379
192.168.220.23:6379
192.168.220.25:6379
Adding replica 192.168.220.26:6379 to 192.168.220.22:6379
Adding replica 192.168.220.27:6379 to 192.168.220.23:6379
Adding replica 192.168.220.28:6379 to 192.168.220.25:6379
M: 5f1ef3d85f281d2db44b1c38156ce5fe4479c731 192.168.220.22:6379
slots:0-5460 (5461 slots) master
M: 8ca0611e7b2523c8ce82e554324b9116e2797214 192.168.220.23:6379
slots:5461-10922 (5462 slots) master
M: 4ee32bf40d656b08eadb4738a580e01753ff8d3a 192.168.220.25:6379
slots:10923-16383 (5461 slots) master
S: eb7dc1f1aaa73ec7b743cc8ae91536db49bdbca9 192.168.220.26:6379
replicates 5f1ef3d85f281d2db44b1c38156ce5fe4479c731
S: 08e3a315fd0bd1af8ed2192563578b279d3b8b92 192.168.220.27:6379
replicates 8ca0611e7b2523c8ce82e554324b9116e2797214
S: 483f509cb79035914aedafb2b118d4f7ffb0e172 192.168.220.28:6379
replicates 4ee32bf40d656b08eadb4738a580e01753ff8d3a
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.220.22:6379)
M: 5f1ef3d85f281d2db44b1c38156ce5fe4479c731 192.168.220.22:6379
slots:0-5460 (5461 slots) master
M: 8ca0611e7b2523c8ce82e554324b9116e2797214 192.168.220.23:6379
slots:5461-10922 (5462 slots) master
M: 4ee32bf40d656b08eadb4738a580e01753ff8d3a 192.168.220.25:6379
slots:10923-16383 (5461 slots) master
M: eb7dc1f1aaa73ec7b743cc8ae91536db49bdbca9 192.168.220.26:6379
slots: (0 slots) master
replicates 5f1ef3d85f281d2db44b1c38156ce5fe4479c731
M: 08e3a315fd0bd1af8ed2192563578b279d3b8b92 192.168.220.27:6379
slots: (0 slots) master
replicates 8ca0611e7b2523c8ce82e554324b9116e2797214
M: 483f509cb79035914aedafb2b118d4f7ffb0e172 192.168.220.28:6379
slots: (0 slots) master
replicates 4ee32bf40d656b08eadb4738a580e01753ff8d3a
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@22 opt]# ./redis-trib.rb create --replicas 1 192.168.220.22:6379 192.168.220.23:6379 192.168.220.25:6379 192.168.220.26:6379 192.168.220.27:6379 192.168.220.28:6379
>>> Creating cluster
Connecting to node 192.168.220.22:6379: OK
2.5连接集群
命令: [root@22 redis]# ./bin/redis-cli -h 192.168.220.22 -p 6379 -c
-c:指定是集群连接
[root@22 redis]# ./bin/redis-cli -h 192.168.220.22 -p 6379 -c
192.168.220.22:6379> keys *
(empty list or set)
192.168.220.22:6379> get username
-> Redirected to slot [14315] located at 192.168.220.25:6379
"tom"
2.6 查看集群信息
192.168.220.25:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:5
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:3
cluster_stats_messages_sent:1717
cluster_stats_messages_received:1696
192.168.220.25:6379>
2.7 查看集群中节点信息
eb7dc1f1aaa73ec7b743cc8ae91536db49bdbca9 192.168.220.26:6379 slave 5f1ef3d85f281d2db44b1c38156ce5fe4479c731 0 1559615354455 4 connected
192.168.220.27:6379> cluster nodes
8ca0611e7b2523c8ce82e554324b9116e2797214 192.168.220.23:6379 master - 0 1559615389799 2 connected 5461-10922
483f509cb79035914aedafb2b118d4f7ffb0e172 192.168.220.28:6379 slave 4ee32bf40d656b08eadb4738a580e01753ff8d3a 0 1559615387779 6 connected
08e3a315fd0bd1af8ed2192563578b279d3b8b92 :6379 myself,slave 8ca0611e7b2523c8ce82e554324b9116e2797214 0 0 5 connected
4ee32bf40d656b08eadb4738a580e01753ff8d3a 192.168.220.25:6379 master - 0 1559615386769 3 connected 10923-16383
5f1ef3d85f281d2db44b1c38156ce5fe4479c731 192.168.220.22:6379 master - 0 1559615388790 1 connected 0-5460
eb7dc1f1aaa73ec7b743cc8ae91536db49bdbca9 192.168.220.26:6379 slave 5f1ef3d85f281d2db44b1c38156ce5fe4479c731 0 1559615390808 4 connected
Jedis连接集群
1.1 代码实现
//集群存入数据
@Test
public void test3() throws IOException {
// 创建一连接,JedisCluster对象,在系统中是单例存在
Set<HostAndPort> nodes = new HashSet<>();
nodes.add(new HostAndPort("192.168.220.22", 6379));
nodes.add(new HostAndPort("192.168.220.23", 6379));
nodes.add(new HostAndPort("192.168.220.25", 6379));
nodes.add(new HostAndPort("192.168.220.26", 6379));
nodes.add(new HostAndPort("192.168.220.27", 6379));
nodes.add(new HostAndPort("192.168.220.28", 6379));
JedisCluster cluster = new JedisCluster(nodes);
// 执行JedisCluster对象中的方法,方法和redis一一对应。
cluster.set("cluster-test", "This is my jedis cluster test!!");
// String result = cluster.get("cluster-test");
// System.out.println(result);
// 程序结束时需要关闭JedisCluster对象
cluster.close();
System.out.println("集群测试成功!");
}
/*
* 02-测试获取集群中的数据
*/
@Test
public void testJedisGet() throws IOException {
// 创建一连接,JedisCluster对象,在系统中是单例存在
Set<HostAndPort> nodes = new HashSet<>();
nodes.add(new HostAndPort("192.168.220.22", 6379));
nodes.add(new HostAndPort("192.168.220.23", 6379));
nodes.add(new HostAndPort("192.168.220.25", 6379));
nodes.add(new HostAndPort("192.168.220.26", 6379));
nodes.add(new HostAndPort("192.168.220.27", 6379));
nodes.add(new HostAndPort("192.168.220.28", 6379));
JedisCluster cluster = new JedisCluster(nodes);
String result = cluster.get("cluster-test");
System.out.println(result);
// 程序结束时需要关闭JedisCluster对象
cluster.close();
System.out.println("集群测试成功!");
}
1.2 整合Spring
public class TestSpring {
private ApplicationContext applicationContext;
@Before
public void init() {
applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
}
@Test
public void testJedisCluster() {
JedisCluster jedisCluster = (JedisCluster) applicationContext.getBean("jedisCluster");
String value = jedisCluster.get("cluster-test");
System.out.println(value);
System.out.println("Redis整合Spring...");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
<!-- 连接池配置 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<!-- 最大连接数 -->
<property name="maxTotal" value="30" />
<!-- 最大空闲连接数 -->
<property name="maxIdle" value="10" />
<!-- 每次释放连接的最大数目 -->
<property name="numTestsPerEvictionRun" value="1024" />
<!-- 释放连接的扫描间隔(毫秒) -->
<property name="timeBetweenEvictionRunsMillis" value="30000" />
<!-- 连接最小空闲时间 -->
<property name="minEvictableIdleTimeMillis" value="1800000" />
<!-- 连接空闲多久后释放, 当空闲时间>该值 且 空闲连接>最大空闲连接数 时直接释放 -->
<property name="softMinEvictableIdleTimeMillis" value="10000" />
<!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 -->
<property name="maxWaitMillis" value="1500" />
<!-- 在获取连接的时候检查有效性, 默认false -->
<property name="testOnBorrow" value="true" />
<!-- 在空闲时检查有效性, 默认false -->
<property name="testWhileIdle" value="true" />
<!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->
<property name="blockWhenExhausted" value="false" />
</bean>
<!-- redis集群 -->
<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
<constructor-arg index="0">
<set>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.220.22"></constructor-arg>
<constructor-arg index="1" value="6379"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.220.23"></constructor-arg>
<constructor-arg index="1" value="6379"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.220.25"></constructor-arg>
<constructor-arg index="1" value="6379"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.220.26"></constructor-arg>
<constructor-arg index="1" value="6379"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.220.27"></constructor-arg>
<constructor-arg index="1" value="6379"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.220.28"></constructor-arg>
<constructor-arg index="1" value="6379"></constructor-arg>
</bean>
</set>
</constructor-arg>
<constructor-arg index="1" ref="jedisPoolConfig"></constructor-arg>
</bean>
</beans>