欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Ubuntu搭建Redis单机版和集群版以及java连接测试

程序员文章站 2022-05-20 19:40:08
...

环境准备:

        搭建之前,需要先安装一个ubuntu的操作系统,我使用的是虚拟机中安装,ubuntu14.04版本。

         redis-3.2.6版本

        SSH远程连接。

redis时C语言编写的,所以在安装之前,要先安装c语言环境,就是gcc,否则不能编译源码,就是不能make

       执行命令: yum install gcc-c++

一、搭建redis单机版

  1. 进入到/usr/local 目录下, 有两种安装方式: 1)离线安装,2)在线安装  

          离线安装,则需要将redis的安装包通过ssh上传到ubuntu中。  官网上下载安装包(地址:https://redis.io/download)

     2.在线安装: wget http://download.redis.io/releases/redis-3.2.6.tar.gz

     3.解压压缩包 tar xzf redis-4.0.9.tar.gz

                          cd redis-4.0.9    进入到解压之后的文件夹中  (我使用的是root账户进入的,并且授予了权限,如果使用的是其他的账号进入,则 在命令的执行前面加上   sudo

                           make    //对源文件进行编译

                           cd src  //进入到编译好的文件下面。

                           make install PREFIX=/usr/local/redis      //redis安装到制定的usr/local/redis的文件夹下面,如果没有redis这个文件夹,会自动创建。   PREFIX参数指定redis的安装目录。一般软件安装到/usr目录下

      4.启动redis单机版 :  1)进入到redis的安装目录下面的bin文件夹:   cd  /usr/local/redis/bin/

                                        2)执行命令启动: ./redis-server

                                        如果需要后台启动,则需要配置redsi的配置文件

                                       3)把/usr/local/redis-3.2.6/redis.conf复制到/usr/local/redis/bin目录下

                                             命令:cp /usr/localredis-3.2.6/redis.conf  /usr/local/redis/bin/

                                       4)修改配置  cd /usr/local/redis/bin/

                                                            vi redis.conf

                                        5)修改其中的

                          Ubuntu搭建Redis单机版和集群版以及java连接测试

                                    将启动方式修改为后台启动,daemonize就是后台启动的意思,将no 修改为yes

                                       6)保存并退出

                                        7)重新启动redis,   cd /usr/local/redis/bin/

                                              ./redis-server redis.conf

                            查看是否已经启动:  ps aux|grep redis                                                 Ubuntu搭建Redis单机版和集群版以及java连接测试

                                            表示redsi已经启动,并且默认的redis的运行端口是6379端口。

  二、java连接Redis的单机版

在java中使用jedis连接redis遇到的问题: 在使用jedis连接的时候,第一个问题遇到的是连接失败,not connection 因为在redis.conf中,需要将其中的 bind 127.0.0.1 这行注释掉,因为这个配置只能本地访问,外网不能访问,所以注释掉。
但是又遇到了第二个问题:
DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified,.... 这个问题
原因是在reds.conf配置文件中,需要将redis.conf中的文件中的配置 protected-model yes 改为
protected-model no 然后重新启动redis就可以在java中连接     
Ubuntu搭建Redis单机版和集群版以及java连接测试

Ubuntu搭建Redis单机版和集群版以及java连接测试

java连接的配置:
            1)创建一个maven工程,并导入依赖                    

         <!--redis的依赖  -->
        <dependency>
	    <groupId>redis.clients</groupId>
	    <artifactId>jedis</artifactId>
	    <version>2.9.0</version>
	</dependency>

    书写测试方式:

/**
 * redis的连接和操作
 * @author 8050
 *
 */
public class RedisTest {
	
	private Jedis jedis = new Jedis("192.168.129.128", 6379);
	
	@Test
	public  void RedisFun1() {	
		String string = jedis.set("zzz", "11");
		String value = jedis.get("zzz");
		System.out.println(value);
		
		jedis.incr("zzz");
		System.out.println("自增之后的zzz的值为"+jedis.get("zzz"));
		System.out.println("decr之后的值"+jedis.decr("zzz"));
		
		jedis.append("zzz", "append");
		System.out.println(jedis.get("zzz"));
		
		jedis.del("zzz");
		System.out.println("is exist?"+jedis.exists("zzz"));
		jedis.close();
		
	}
	
	
	@Test
	public void RedisList() {
		
		//将数据存储到list数据中的时候,先存储在list中的数据,是在最左面,删除的话,删除的是最左面的。
		jedis.lpush("list5", "1","2","3");
		List<String> lrange = jedis.lrange("list5", 0, -1);
		for (String string2 : lrange) {
			System.out.println(string2);
		}
		
		String lpop = jedis.lpop("list5");
		String rpop = jedis.rpop("list5");
		System.out.println("删除的左边的元素是"+lpop+"删除的右边的元素是"+rpop);
		
		jedis.del("list5");
		System.out.println("is list5 exist?"+jedis.exists("list5"));
		
	}
	
	@Test
	public void RedisSet() {
		jedis.sadd("set1", "e", "a","b","c","d");
		Set<String> smembers = jedis.smembers("set1");
		System.out.println(smembers);
		
		//弹出右边的一个
		String lpop = jedis.spop("set1");
		System.out.println(lpop);
	}
	
	
	@Test
	public void hash() {
		Map<String, String> map = new HashMap<>();
		map.put("k1", "v1");
		map.put("k2", "v2");
		map.put("k3", "v3");
		
		jedis.hmset("map1", map);
		Map<String, String> map2 = jedis.hgetAll("map1");
		System.out.println(map2.toString());
	}

三、redis集群版的搭建            

         单机版的redsi已经配置OK,下面配置集群版的redis。
          
    1.cd /usr/local/      
      2.mkdir redis-cluster
      3.cd redis-cluster 
       mkdir 7000 7001 7002 7003 7004 7005                 //创建6个文件夹,作为redis的6的节点,3个服务,3个备份机。
      搭建的redis的集群,因为选举投票的机制,所以必须为基数,并且为了保证高可用,搭建3个机器的redis集群,并且每个节  点,搭建一个备份机
     4.cd /usr/local/redis/
    复制redis中的bin文件夹到redis-cluster下的每个文件夹下
      cp -r /usr/local/redis-cluster/7000/
      cp -r /usr/local/redis-cluster/7001/
      cp -r /usr/local/redis-cluster/7002/
      cp -r /usr/local/redis-cluster/7003/
      cp -r /usr/local/redis-cluster/7004/
      cp -r /usr/local/redis-cluster/7005/
 
   5、修改每个bin下的配置文件:
         cd bin
         vim  redis.conf
       修改 redis01 的端口号,6个实例redis端口号分别为7001-7006
       并打开cluster-enable前面的注释
    6.将redis-3.2.6下面的src中的redis-trib.rb复制到/usr/local/redis-cluster/下
         cd /usr/local/redis-3.2.6/src   
         cp *.rb /usr/local/redis-cluster/
    7.分别启动6个实例
         cd /usr/local/redis-cluster/7000/bin
         ./redis-server redis.conf
        cd /usr/local/redis-cluster/7001/bin
         ./redis-server redis.conf
          
           。。。。。。
         依次启动6个实例
    8.创建集群:
         1)创建集群之前,需要安装ruby
           sudo apt-get ruby
           但是执行这个命令,有的可能会报错,
         然后 cd /usr/local/redis-3.2.6/src
           执行,提示ruby的版本太低。
Ubuntu搭建Redis单机版和集群版以及java连接测试Ubuntu搭建Redis单机版和集群版以及java连接测试
      解决的方法: 
1.先安装rvm,然后通过rvm更新ruby
2.[aaa@qq.com~]#gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB

   [aaa@qq.com ~]# curl -sSL https://get.rvm.io | bash -s stable
  [aaa@qq.com ~]# find / -name rvm -print
                 会显示
               /usr/local/rvm
     /usr/local/rvm/src/rvm
     /usr/local/rvm/src/rvm/bin/rvm
     /usr/local/rvm/src/rvm/lib/rvm
     /usr/local/rvm/src/rvm/scripts/rvm
     /usr/local/rvm/bin/rvm
     /usr/local/rvm/lib/rvm

     /usr/local/rvm/scripts/rvm

3.更新配置文件 : source /usr/local/rvm/scripts/rvm

4.查看rvm中的ruby版本

     rvm list known

Ubuntu搭建Redis单机版和集群版以及java连接测试

5.选择一个高于2.2.2的ruby版本安装
           rvm install 2.4.4  我选择的是2.4.4
    使用一个ruby版本  rvm use 2.4.4
       并且设置为默认的版本  rvm use 2.4.4 --default
    查看ruby的版本 是否是选择的 ruby --version

6.ruby就已经安装了 ,直接执行命令 gem install redis  安装redis

7. 然后就可以创建cluster了:  执行下面命令:
                 cd /usr/local/redis-cluster/
        ./redis-trib.rb create --replicas 1 192.168.129.128:7000 192.168.129.128:7001 192.168.129.128:7002 192.168.129.128:7003 192.168.129.128:7004 192.168.129.128:7005

        然后查看是否启动集群: ps aux|grep redis   就可以查看后台的进程是否启动。

Ubuntu搭建Redis单机版和集群版以及java连接测试

代表redis集群启动成功,6个节点都已经启动。

四、java连接Redis集群和spring整合

    1.创建maven工程:

        <dependencies>  
	    <dependency>  
	        <groupId>org.springframework.data</groupId>  
	        <artifactId>spring-data-redis</artifactId>  
	        <version>1.0.2.RELEASE</version>  
	    </dependency>  
	    <dependency>  
	        <groupId>org.springframework</groupId>  
	        <artifactId>spring-test</artifactId>  
	        <version>3.1.2.RELEASE</version>  
	        <scope>test</scope>  
	    </dependency>  
	      
	    <dependency>  
	        <groupId>redis.clients</groupId>  
	        <artifactId>jedis</artifactId>  
	        <version>2.9.0</version>  
	    </dependency>  
	      
	     <dependency>  
	        <groupId>junit</groupId>  
	        <artifactId>junit</artifactId>  
	        <version>4.8.2</version>  
	        <scope>test</scope>  
	    </dependency>  
	</dependencies>
      2.spring和redis的整合配置文件

            

<?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:p="http://www.springframework.org/schema/p"  
	     xmlns:aop="http://www.springframework.org/schema/aop"   
	     xmlns:context="http://www.springframework.org/schema/context"  
	     xmlns:jee="http://www.springframework.org/schema/jee"  
	     xmlns:tx="http://www.springframework.org/schema/tx"  
	     xsi:schemaLocation="http://www.springframework.org/schema/aop 
					         http://www.springframework.org/schema/aop/spring-aop-4.0.xsd  
					         http://www.springframework.org/schema/beans 
					         http://www.springframework.org/schema/beans/spring-beans-4.0.xsd  
					         http://www.springframework.org/schema/context 
					         http://www.springframework.org/schema/context/spring-context-4.0.xsd  
					         http://www.springframework.org/schema/jee 
					         http://www.springframework.org/schema/jee/spring-jee-4.0.xsd  
					         http://www.springframework.org/schema/tx 
					         http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">   
		
		<context:property-placeholder location="classpath:redis.properties"/>
		<context:annotation-config/>
		
		
		<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
			 <property name="maxIdle" value="${redis.maxIdle}"/>
	         <property name="maxTotal" value="${redis.maxActive}" />
	         <property name="maxWaitMillis" value="${redis.maxWait}" />
	         <property name="testOnBorrow" value="${redis.testOnBorrow}"/>
		</bean>
		
		<bean id="hostport1" class="redis.clients.jedis.HostAndPort">
			<constructor-arg name="host" value="192.168.129.128"/>
			<constructor-arg name="port" value="7000"/>
		</bean>
		
		<bean id="hostport2" class="redis.clients.jedis.HostAndPort">
			<constructor-arg name="host" value="192.168.129.128"/>
			<constructor-arg name="port" value="7001"/>
		</bean>
		
		<bean id="hostport3" class="redis.clients.jedis.HostAndPort">
			<constructor-arg name="host" value="192.168.129.128"/>
			<constructor-arg name="port" value="7002"/>
		</bean>
		
		<bean id="hostport4" class="redis.clients.jedis.HostAndPort">
			<constructor-arg name="host" value="192.168.129.128"/>
			<constructor-arg name="port" value="7003"/>
		</bean>
		
		<bean id="hostport5" class="redis.clients.jedis.HostAndPort">
			<constructor-arg name="host" value="192.168.129.128"/>
			<constructor-arg name="port" value="7004"/>
		</bean>
		
		<bean id="hostport6" class="redis.clients.jedis.HostAndPort">
			<constructor-arg name="host" value="192.168.129.128"/>
			<constructor-arg name="port" value="7005"/>
		</bean>
		
		<bean id="redisCluster" class="redis.clients.jedis.JedisCluster">
			<constructor-arg name="jedisClusterNode">
					<set>
						<ref bean="hostport1"/>
						<ref bean="hostport2"/>
						<ref bean="hostport3"/>
						<ref bean="hostport4"/>
						<ref bean="hostport5"/>
						<ref bean="hostport6"/>
					</set>
			</constructor-arg>
			
			<constructor-arg name="connectionTimeout" value="6000"/>
			<constructor-arg name="soTimeout" value="5000"/>
			<constructor-arg name="maxAttempts" value="3" />
			<constructor-arg name="poolConfig">
             <ref bean="jedisPoolConfig"/>
        	</constructor-arg>
		</bean>
</beans>
    redis.properties文件:
redis.maxIdle=10
redis.maxActive=1000
redis.maxWait=5000
redis.testOnBorrow=true

3.测试方法,测试是否连接和存取数据

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import redis.clients.jedis.JedisCluster;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations= {"classpath:spring-redis.xml"})
public class RedisCluterTest {

	@Autowired
	JedisCluster jedisCluster;
	
	//通过jedisCluster 操作redis集群
	@Test
	public void fun1() {
		//返回ack
		String name = jedisCluster.set("name", "xxx");
		String age = jedisCluster.set("age", "28");
		String sex = jedisCluster.set("sex", "1");
		
		System.out.println(name+"  "+age+"   "+sex);
		
		String name1 = jedisCluster.get("name");
		String age1 = jedisCluster.get("age");
		String sex1 = jedisCluster.get("sex");
		System.out.println("get的值"+name1+"   "+ age1 +"  "+ sex1);
	}
	
	
}