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를 선택하는 것이 좋습니다.
저장된 값이 엔터티 객체인 경우 직렬화 가능 인터페이스를 구현해야 합니다.
[관련 권장 사항]