>  기사  >  Java  >  Java가 Redis 클러스터를 운영하는 예시에 대한 자세한 설명

Java가 Redis 클러스터를 운영하는 예시에 대한 자세한 설명

零下一度
零下一度원래의
2017-05-26 14:38:303408검색

Redis 클러스터 구축에 대한 자세한 내용은 내 다른 기사 Redis 클러스터 구축 및 간단한 사용을 참조하세요.

Redis가 무엇이고 무엇을 할 수 있나요

Redis는 데이터베이스, 캐시 및 메시지 대기열 브로커로 사용할 수 있는 오픈 소스(BSD 라이센스), 메모리 내 데이터 구조 서버입니다. 문자열, 해시 테이블, 목록, 집합, 순서 집합, 비트맵, 하이퍼로그 로그 및 기타 데이터 유형을 지원합니다. 내장된 복제, Lua 스크립트, LRU 제거, 트랜잭션 및 다양한 수준의 디스크 지속성 기능을 제공하는 동시에 Redis Sentinel을 통해 고가용성을 제공하고 Redis 클러스터를 통해 자동 파티셔닝을 제공합니다. (Redis 공식 홈페이지에서 발췌)

In-Memory 데이터베이스로서 Redis는 아직도 현대 인터넷 웹 시스템에서 주로 캐시로 사용되고 있습니다. 대규모 인터넷 웹 시스템은 높은 성능을 요구하며, 프런트엔드와 데이터 레이어 사이에 데이터 캐싱을 추가하는 것은 필수 수단 중 하나가 되었습니다. 현재 널리 사용되는 두 가지 기술은 Redis와 Memcached입니다. 이 기사는 그런 내용이 아닙니다. 이 글에서는 주로 Java 웹이 Redis와 Redis 클러스터를 운영하는 방법에 대해 설명합니다.

일반 Java 프로그램 운영 Redis

Redis는 다양한 언어로 클라이언트를 제공하는데, Java에서 가장 인기 있는 것이 Jedis입니다. 소스 코드와 사용 방법을 보려면 방문하세요. 현재 Jedis의 최신 버전은 2.9.0입니다. 독립형 머신이든 클러스터이든 Jedis에는 매우 자세한 지침과 예제 코드가 있습니다. 다음은 간단한 설명입니다. 패키지 관리를 위해 Maven을 사용하는 경우 이 예제에서는 다음과 같이 최신 2.9.0 버전을 사용합니다.

  redis.clients      jedis      2.9.0  
操作 Redis 单机
import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;import redis.clients.jedis.JedisPoolConfig; /** * Created by fengdezitai on 2016/10/9. */public class JedisClient {     private static final String host= "192.168.31.121";     private static final JedisClient jedisClient = new JedisClient();     private Jedis jedis = null;    /**     * 私有构造函数     */    private JedisClient(){}     public static JedisClient getInstance(){        return jedisClient;    }     private JedisPoolConfig getPoolConfig(){        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();        jedisPoolConfig.setMaxIdle(10);        jedisPoolConfig.setMaxTotal(100);        jedisPoolConfig.setMaxWaitMillis(3000);        return jedisPoolConfig;    }     /**     * 添加     * @param key     * @param value     * @return     * @throws Exception     */    public Boolean add(String key,String value) throws Exception{        JedisPool pool = new JedisPool(getPoolConfig(),host);        Jedis jedis = null;        try {            jedis = pool.getResource();            if(jedis.exists(key)){                throw new Exception(String.format("key (%s) 已存在 ",key));            }            jedis.set(key,value);         }catch (Exception e){            throw e;        }        finally {            if(jedis!=null){                jedis.close();            }        }        pool.destroy();        return true;    }     /**     * 获取值     * @param key     * @return     * @throws Exception     */    public String get(String key) throws Exception{        JedisPool pool = new JedisPool(getPoolConfig(),host);        Jedis jedis = null;        String result = "";        try {            jedis = pool.getResource();            result = jedis.get(key);        }catch (Exception e){            throw e;        }        finally {            if(jedis!=null){                jedis.close();            }        }        pool.destroy();        return result;    }     public static void main(String[] args) {        JedisClient jedisClient = JedisClient.getInstance();        try {            /*Boolean result = jedisClient.add("hello", "redis1");            if(result){                System.out.println("success");            }*/             System.out.println(jedisClient.get("hello"));        }catch (Exception e){            e.printStackTrace();        }    }}

Operation redis Cluster

import redis.clients.jedis.*;
import java.util.HashSet;
import java.util.Set;
 
/**
 * Created by fengdezitai on 2016/10/13.
 */
public class JedisClusterClient {
 
    private static int count = 0;
 
    private static final JedisClusterClient redisClusterClient = new JedisClusterClient();
 
    /**
     * 私有构造函数
     */
    private JedisClusterClient() {}
 
    public static JedisClusterClient getInstance() {
        return redisClusterClient;
    }
 
    private JedisPoolConfig getPoolConfig(){
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(1000);
        config.setMaxIdle(100);
        config.setTestOnBorrow(true);
        return config;
    }
 
    public void SaveRedisCluster() {
        Set jedisClusterNodes = new HashSet();
        jedisClusterNodes.add(new HostAndPort("192.168.31.245", 7000));
        jedisClusterNodes.add(new HostAndPort("192.168.31.245", 7001));
        jedisClusterNodes.add(new HostAndPort("192.168.31.245", 7002));
        jedisClusterNodes.add(new HostAndPort("192.168.31.210", 7003));
        jedisClusterNodes.add(new HostAndPort("192.168.31.210", 7004));
        jedisClusterNodes.add(new HostAndPort("192.168.31.210", 7005));
 
        JedisCluster jc = new JedisCluster(jedisClusterNodes,getPoolConfig());
        jc.set("cluster", "this is a redis cluster");
        String result = jc.get("cluster");
        System.out.println(result);
    }
 
    public static void main(String[] args) {
        JedisClusterClient jedisClusterClient = JedisClusterClient.getInstance();
        jedisClusterClient.SaveRedisCluster();
    }
}  

Spring mvc 운용 Redis

Spring mvc에서 Redis를 운용하기 위해서는 당연히 먼저 Spring mvc 프레임워크를 설정해야 한다. 다음은 Spring mvc 환경이 설정되어 있다고 가정한다. 이 예에서 Spring 버전은 4.3.2 RELEASE입니다. Spring에 대한 Maven 참조는 다음과 같습니다.

4.3.2.RELEASE 
    
          org.springframework      spring-core      ${spring.version}                        commons-logging          commons-logging                   
          org.springframework      spring-web      ${spring.version}     
          org.springframework      spring-oxm      ${spring.version}     
          org.springframework      spring-tx      ${spring.version}     
          org.springframework      spring-jdbc      ${spring.version}     
          org.springframework      spring-webmvc      ${spring.version}                        commons-logging          commons-logging                   
          org.springframework      spring-aop      ${spring.version}     
          org.springframework      spring-context-support      ${spring.version}     
 
          org.springframework      spring-test      ${spring.version}

Redis 독립 실행형 운영

Jedis만 사용하여 주입을 구현합니다(다음 참조 spring-data-redis와 다름)

이전 JedisClient 코드를 참조할 수 있으며 Redis에 액세스하려면 서비스만 구현하면 되며 Spring mvc에 통합될 수 있습니다. 서비스 코드는 다음과 같습니다.

import org.springframework.stereotype.Service;
import util.JedisClient;
 
/**
 * Created by fengdezitai on 2016/10/9.
 */
@Service
public class RedisService {
 
    public String get(String key) throws Exception{
        JedisClient jedisClient = JedisClient.getInstance(); //上面实现的JedisClient
        String result = "";
        try {
            result = jedisClient.get("hello");
        }catch (Exception e){
            throw e;
        }
        return result;
    }
}

Controller는 다음과 같이 구현됩니다.

@Controller
@RequestMapping(value = "redisAllInOne")
public class RedisAllInOneController {
 
    @Autowired
    private RedisService redisService;
 
    @RequestMapping(value = "get",method = RequestMethod.GET)
    @ResponseBody
    public Object getByMyService(String key){
        try {
            String result = redisService.get(key);
            return result;
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
}  

통합을 위해 spring-data-redis 패키지 사용

위는 직접 구현한 주입입니다. , 여기서 spring-data- Redis를 통합하려면 다음과 같은 간단한 구성만 필요합니다. 버전은 최신 버전 1.7.2.RELEASE:

      org.springframework.data      spring-data-redis      1.7.2.RELEASE

spring-data를 사용하세요. Redis는 주입 프로세스를 직접 구현할 필요가 없으며 제공되는 일부 구성을 통해 연결 풀 구성, RedisTemplate 구성, JedisConnectionFactory 구성을 실현할 수 있으며 JedisConnectionFactory를 통해 연결 풀 매개변수, Redis 서버, 포트, 비밀번호를 구성할 수 있습니다. , 시간 초과, 데이터베이스 인덱스 등 RedisTemplate은 주입된 Bean입니다. RedisTemplate에 의해 자동으로 주입된 엔터티를 사용하여 구성에 따라

redis 서비스 속성 구성에 따라 일련의 redis 작업을 수행할 수 있습니다. file:

redis.maxIdle=300redis.maxWait=3000redis.testOnBorrow=trueredis.host=192.168.31.121redis.port=6379redis.password=passwordredis.timeout=3000
spring-data-redis xml 配置文件 redis-context.xml:                                                              -->                                                                                                          -->

그런 다음 spring 구성 파일에서 위 파일을 참조합니다.

위 구성을 설명합니다.

poolConfig는 redis 연결 풀을 구성한 다음 두 개의 JedisConnectionFactory와 RedisTemplate 하나는 하나의 JedisConnectionFactory에 해당하므로 시나리오에 따라 서로 다른 Redis 연결을 구성할 수 있습니다. 예를 들어 일관성 없는 시간 초과 요구 사항, 데이터베이스 0-15는 서로 다른 데이터를 저장할 수 있습니다. 데이터베이스 1과 2는 여기서 구성됩니다. commonRedisTemplate을 호출하면 데이터베이스1에 저장되고, 캐시RedisTemplate을 호출하면 데이터베이스2에 저장됩니다.

이후 이 두 RedisTemplate은 다음과 같이 서비스 계층에 삽입되고 참조될 수 있습니다.

import org.apache.commons.lang3.StringUtils;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Repository;
 
import javax.annotation.Resource;
import java.io.*;
 
@Repository
public class RedisCache {  
    @Resource(name = "cacheRedisTemplate")
    private RedisTemplate

마지막으로 컨트롤러에서 이를 호출하여

@Autowired
private RedisCache redisCache;
 
 
@RequestMapping(value = "get", method = RequestMethod.GET)
@ResponseBody
public Object getByMyService(String key) {
    try {
        String result = redisService.get(key);
        return result;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}
 
@RequestMapping(value = "save", method = RequestMethod.GET)
@ResponseBody
public Object save() {
    Token token = new Token();
    token.setAccess_token("token");
    token.setExpires_in(1000);
    try {
        redisCache.put("token", token);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return "ok";
}  

작동합니다. Redis 클러스터

Jedis만 사용하여 주입을 구현합니다(spring-data-redis 아래 참조와 다름)

이전 JedisClusterClient 코드를 가져와 인용하기만 하면 됩니다. Redis에 접근하기 위한 서비스로 Spring mvc에 통합될 수 있습니다. 서비스 코드는 다음과 같습니다.

import org.springframework.stereotype.Service;
import util.JedisClusterClient;
 
/**
 * Created by fengdezitai on 2016/10/13.
 */
@Service
public class RedisClusterService {
 
    public void save() throws Exception{
        //调用 JedisClusterClient 中的方法
        JedisClusterClient jedisClusterClient = JedisClusterClient.getInstance();
        try {
            jedisClusterClient.SaveRedisCluster();
        }catch (Exception e){
            throw e;
        }
    }
}

마지막으로 컨트롤러에서 구현된 서비스를 호출합니다.

@Controller
@RequestMapping(value = "redisCluster")
public class RedisClusterController {
 
    @Autowired
    private RedisClusterService redisClusterService;
 
    @RequestMapping(value = "save",method = RequestMethod.GET)
    @ResponseBody
    public Object save(){
        try{
            redisClusterService.save();
        }catch (Exception e){
            e.printStackTrace();
            return String.format("error: %s",e.getMessage());
        }
        return "ok";
    }
}  

참고:

spring-data-redis를 사용하는 경우 버전 문제가 발생합니다. 통합 작업 Reids 클러스터의 경우 최신 버전 1.7의 spring-data-redis에만 클러스터 작업이 포함되어 있으며 최신 spring-data-redis의 일부 기능에도 Spring mvc 버전에 일부 제한이 있으므로 더 높은 버전을 선택하십시오. Spring mvc가 해당됩니다.

저장된 값이 엔터티 객체인 경우 직렬화 가능 인터페이스를 구현해야 합니다.

[관련 권장 사항]

사용 코드에 대한 자세한 설명 Spring 프레임워크 주석 예시

2. Java 트랜잭션 관리 학습을 위한 Spring 및 Hibernate의 자세한 코드 설명

3. Restful 프로그램 개발을 위한 Spring Boot

4.

spring mvc에서 지원하는 7가지 반환 방법에 대한 자세한 설명

5. Spring의 Aspect 기반 강화 구현 예시

6. Java Spring용 PHPRPC 예시

8. 🎜 >봄철 Elasticsearch 활용 실전 튜토리얼 자세히 설명

위 내용은 Java가 Redis 클러스터를 운영하는 예시에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.