Redis学习总结

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下载

(1)Http://redis.io/

(2)Http://www.redis.cn/

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 常用命令

  1. 赋值

在这里插入图片描述
3. 取值

在这里插入图片描述
在这里插入图片描述
4. 删除

在这里插入图片描述

  1. 增加数字

在这里插入图片描述

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脚本语言编写的。

  1. 第一步: 安装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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值