>  기사  >  웹 프론트엔드  >  Java Spring mvc는 Redis 및 Redis 클러스터를 운영합니다.

Java Spring mvc는 Redis 및 Redis 클러스터를 운영합니다.

高洛峰
高洛峰원래의
2017-05-26 14:40:391466검색

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  

Operation 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();
        }
    }
}

redis 클러스터 운영

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 통합을 위해 다음과 같이 maven 패키지를 참조하면 됩니다.

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

spring-data-redis를 사용합니다. 즉, 저장 프로세스를 직접 구현하는 대신 제공되는 일부 구성을 통해 연결 풀 구성, RedisTemplate 구성, JedisConnectionFactory 구성을 통해 연결을 구성할 수 있습니다. 풀 매개변수, Redis 서버, 포트, 비밀번호, 시간 제한, 데이터베이스 인덱스 등 RedisTemplate은 Redis에서 자동으로 삽입된 엔터티를 사용하여 Redis에서 일련의 작업을 수행할 수 있습니다.

redis 서비스 속성 구성 파일:

redis.maxIdle=300
redis.maxWait=3000
redis.testOnBorrow=true
redis.host=192.168.31.121
redis.port=6379
redis.password=password
redis.timeout=3000

spring-data-redis xml 구성 파일 redis-context.xml:

                                    
                                    -->
                     
                                                 
                                    -->

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

  

위 구성을 설명합니다.

poolConfig 즉, Redis 연결 풀을 구성한 다음 두 개의 JedisConnectionFactory를 구성하고 RedisTemplate 하나는 하나의 JedisConnectionFactory에 해당합니다. 일관되지 않은 시간 초과 요구 사항, 데이터베이스 0-15가 다른 데이터를 저장할 수 있는 등 시나리오에 따라 다양한 Redis 연결을 구성할 수 있습니다. 데이터베이스 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

마지막으로 Controller에서 호출하여 Redis 클러스터를 작동합니다

@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";
}  
주입 자체를 구현하기 위해 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;
        }
    }
}

spring-data-redis 패키지를 사용하여

@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 및 spring -data-redis maven 패키지 참조는 이전과 동일합니다. spring-data-redis 1.7.2.RELEASE를 참조하는 이유는 현재 이 최신 버전만 클러스터 작업을 지원하기 때문입니다.

redis 클러스터 서비스 속성 구성

spring-data-redis xml 클러스터 구성 파일 redis-cluster-context.xml

redis.maxIdle=300
redis.maxWait=3000
redis.testOnBorrow=false
redis.timeout=3000

Spring 구성 파일 뒤 위 구성을 설명하기 위해

<br/>

에 인용했습니다.

<br/>
poolConfig는 연결 풀 구성이고, redisClusterConfig는 Redis 클러스터의 각 노드를 구성합니다(노드 호스트와 포트는 속성 구성 파일), 클러스터 구성은 내 다른 블로그에서 찾을 수 있습니다. 다음은 JedisConnectionFactory와 RedisTemplate의 쌍인 독립형 구성과 동일합니다.

이후 이 RedisTemplate을 서비스 계층에 삽입하고 참조할 수 있습니다. 코드는 다음과 같습니다.

마지막으로 컨트롤러에서 호출합니다. 🎜>참고:

버전 문제, Reids 클러스터를 통합하기 위해 spring-data-redis를 사용하는 경우 spring-data-redis의 최신 버전 1.7에만 클러스터에 대한 작업이 포함되고 최신 spring-data-redis의 일부 기능은 포함되지 않습니다. Spring mvc 버전에도 몇 가지 제한 사항이 있으므로 상위 버전의 Spring mvc를 선택하는 것이 좋습니다.

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

[관련 권장 사항]

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

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

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