다음 종속성을 추가합니다.
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version></dependency>
public class Test {public static void main(String[] args) {JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();jedisPoolConfig.setMaxTotal(20);jedisPoolConfig.setMaxIdle(10);jedisPoolConfig.setMinIdle(5);// timeout,这里既是连接超时又是读写超时,从Jedis 2.8开始有区分connectionTimeout和soTimeout的构造函数JedisPool jedisPool = new JedisPool(jedisPoolConfig, "192.168.157.6", 6379, 3000, null);Jedis jedis = null;try {// 从redis连接池里拿出一个连接执行命令jedis = jedisPool.getResource();System.out.println(jedis.set("single", "zhuge"));System.out.println(jedis.get("single"));// 管道示例// 管道的命令执行方式:cat redis.txt | redis‐cli ‐h 127.0.0.1 ‐a password ‐ p 6379 ‐‐pipePipeline pl = jedis.pipelined();for (int i = 0; i < 10; i++) {pl.incr("pipelineKey");pl.set("zhuge" + i, "zhuge");}List<Object> results = pl.syncAndReturnAll();System.out.println(results);// lua脚本模拟一个商品减库存的原子操作// lua脚本命令执行方式:redis‐cli ‐‐eval /tmp/test.lua , 10jedis.set("product_count_10016", "15"); // 初始化商品10016的库存String script = " local count = redis.call('get', KEYS[1]) " +" local a = tonumber(count) "+" local b = tonumber(ARGV[1]) " +" if a >= b then " +" redis.call('set', KEYS[1], count‐b) "+" return 1 " +" end " +" return 0 ";System.out.println("script:"+script);Object obj = jedis.eval(script, Arrays.asList("product_count_10016"), Arrays.asList("10"));System.out.println(obj);} catch (Exception e) {e.printStackTrace();} finally {// 注意这里不是关闭连接,在JedisPool模式下,Jedis会被归还给资源池。if (jedis != null)jedis.close();}}}
클라이언트는 서버의 응답을 기다리지 않고 한 번에 여러 요청을 보낼 수 있습니다. 모든 명령이 전송된 후 한 번에 서비스 응답을 읽으면 여러 명령 실행의 네트워크 전송 오버헤드가 크게 줄어들 수 있습니다. 명령은 파이프라인 모드로 패키징되어 전송되며, Redis는 명령을 처리하기 전에 모든 명령의 처리 결과를 캐시해야 합니다. 더 많은 명령을 패키지할수록 캐시가 더 많은 메모리를 소비합니다. 따라서 패키징하는 명령이 많을수록 좋은 것은 아닙니다. 파이프라인에서 전송된 각 명령은 실행이 실패하면 후속 응답에서 정보를 얻습니다. 즉, 파이프라인은 "모든 명령이 함께 성공합니다"라는 의미를 표현하지 않습니다. 파이프라인의 명령이 실패하면 다음 명령은 효과가 없으며 계속 실행됩니다.
위의 예를 참조하세요.
Redis는 2.6에서 스크립트 기능을 출시하여 개발자가 Lua 언어를 사용하여 스크립트를 작성하고 실행을 위해 Redis에 전달할 수 있도록 했습니다. 스크립트 사용의 이점은 다음과 같습니다.
원래 5개의 네트워크 요청 작업은 하나의 요청으로 완료될 수 있습니다. Redis 서버에서 원래 5개의 요청 논리가 완료됩니다. 스크립트를 사용하면 네트워크 왕복 대기 시간이 줄어듭니다. 이는 파이프와 유사합니다.
Redis는 전체 스크립트를 전체적으로 실행하며 중간에 다른 명령이 삽입되지 않습니다. 파이프는 원자적이지 않지만 redis 배치 작업 명령(mset와 유사)은 원자적입니다.
redis의 트랜잭션 기능은 매우 쓸모가 없습니다. 오류 보고 시 롤백을 지원하지 않습니다. 그러나 redis의 Lua 스크립트는 거의 일반적인 트랜잭션 기능을 가지며 오류 보고 시 롤백 작업을 지원합니다. Redis의 트랜잭션 기능을 Redis Lua로 대체할 수 있으므로 공식적으로 권장됩니다.
공식 웹사이트 문서에는 다음 구절이 있습니다:
Redis 스크립트는 정의상 트랜잭션이므로 Redis 트랜잭션으로 할 수 있는 모든 것은 스크립트로도 할 수 있으며 일반적으로 스크립트는 더 간단하고 빠릅니다. .
Redis 버전 2.6.0부터 내장된 Lua 인터프리터를 통해 EVAL 명령을 사용하여 Lua 스크립트를 평가할 수 있습니다. EVAL 명령의 형식은 다음과 같습니다. 스크립트 매개변수는 Redis 서버 컨텍스트에서 실행되는 Lua 스크립트입니다. 이 스크립트는 Lua 함수로 정의되지 않습니다. numkeys 매개변수는 키 매개변수의 수를 지정하는 데 사용됩니다. 키 매개변수 key [key ...]는 EVAL의 세 번째 매개변수에서 시작하며 스크립트에 사용되는 Redis 키(키)를 나타냅니다. 이러한 키 매개변수는 Lua에서 전역 변수 KEYS 배열을 통해 전달될 수 있으며 1
에 액세스됩니다. 기본 주소 형식(KEYS[1], KEYS[2] 등) 명령 끝에서 키 매개변수가 아닌 추가 매개변수 arg [arg...]는 전역 변수 ARGV 배열을 통해 Lua에서 액세스할 수 있습니다. 액세스 형식은 KEYS 변수(ARGV[1], ARGV)와 유사합니다. [2] 등). 예를 들어
EVAL script numkeys key [key ...] arg [arg ...]
여기서 "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}"는 평가 중인 Lua 스크립트이고 숫자 2는 키 매개변수의 수인 key1 및 key2는 각각 KEYS[1] 및 KEYS[2]를 사용하여 액세스할 수 있는 키 매개변수이고, 마지막 첫 번째와 두 번째는 ARGV[1] 및 ARGV[2]를 통해 액세스할 수 있는 추가 매개변수입니다. Lua 스크립트에서는 redis.call() 함수를 사용하여 Redis 명령을 실행할 수 있습니다
예제는 위를 참조하세요.
를 사용할 때 무한 루프나 시간이 많이 걸리는 작업이 발생하지 않도록 주의하세요. redis는 단일 프로세스, 단일 스레드 실행 스크립트입니다. 파이프는 Redis를 차단하지 않습니다.
2. Sentinel의 Jedis 연결 코드
127.0.0.1:6379> eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second2 1) "key1"3 2) "key2"4 3) "first"5 4) "second"
3. Redis 연결을 통합합니다
1. Springboot 프로젝트 핵심 구성
public class Test2 {public static void main(String[] args) {JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();jedisPoolConfig.setMaxTotal(20);jedisPoolConfig.setMaxIdle(10);jedisPoolConfig.setMinIdle(5);String masterName = "mymaster";Set<String> sentinels = new HashSet<String>();sentinels.add(new HostAndPort("192.168.157.6",26379).toString());sentinels.add(new HostAndPort("192.168.157.6",26380).toString());sentinels.add(new HostAndPort("192.168.157.6",26381).toString());// timeout,这里既是连接超时又是读写超时,从Jedis 2.8开始有区分connectionTimeout和soTimeout的构造函数JedisSentinelPool jedisSentinelPool = new JedisSentinelPool(masterName, sentinels, jedisPoolConfig, 3000, null);Jedis jedis = null;try {// 从redis连接池里拿出一个连接执行命令jedis = jedisSentinelPool.getResource();while(true) {Thread.sleep(1000);try {System.out.println(jedis.set("single", "zhuge"));System.out.println(jedis.get("single"));} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}} catch (Exception e) {e.printStackTrace();} finally {// 注意这里不是关闭连接,在JedisPool模式下,Jedis会被归还给资源池。if (jedis != null)jedis.close();}}}3을 소개합니다. 접시 spring은 Redis에서 다양한 작업을 수행하기 위해 RedisTemplate 개체를 캡슐화합니다. 이는 모든 Redis 기본 API를 지원합니다.
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring‐boot‐starter‐data‐redis</artifactId></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons‐pool2</artifactId></dependency>
server:port: 8080spring:redis:database: 0timeout: 3000sentinel: #哨兵模式master: mymaster #主服务器所在集群名称nodes: 192.168.0.60:26379,192.168.0.60:26380,192.168.0.60:26381lettuce:pool:max‐idle: 50min‐idle: 10max‐active: 100max‐wait: 1000
Redis客户端命令对应的RedisTemplate中的方法列表:
public class Test3 {public static void main(String[] args) throws IOException {JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();jedisPoolConfig.setMaxTotal(20);jedisPoolConfig.setMaxIdle(10);jedisPoolConfig.setMinIdle(5);Set<HostAndPort> jedisClusterNode = new HashSet<HostAndPort>();jedisClusterNode.add(new HostAndPort("192.168.0.61", 8001));jedisClusterNode.add(new HostAndPort("192.168.0.62", 8002));jedisClusterNode.add(new HostAndPort("192.168.0.63", 8003));jedisClusterNode.add(new HostAndPort("192.168.0.61", 8004));jedisClusterNode.add(new HostAndPort("192.168.0.62", 8005));jedisClusterNode.add(new HostAndPort("192.168.0.63", 8006));// timeout,这里既是连接超时又是读写超时,从Jedis 2.8开始有区分connectionTimeout和soTimeout的构造函数JedisCluster jedisCluster = new JedisCluster(jedisClusterNode, 6000, 5000, 10, "zhuge", jedisPoolConfig);try {while(true) {Thread.sleep(1000);try {System.out.println(jedisCluster.set("single", "zhuge"));System.out.println(jedisCluster.get("single"));} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}} catch (Exception e) {e.printStackTrace();} finally {// 注意这里不是关闭连接,在JedisPool模式下,Jedis会被归还给资源池。if (jedisCluster != null)jedisCluster.close();}}}
其实集群模式跟哨兵模式很类似,只不过配置文件修改一下即可
server:port: 8080spring:redis:database: 0timeout: 3000password: zhugecluster:nodes:192.168.0.61:8001,192.168.0.62:8002,192.168.0.63:8003lettuce:pool:# 连接池中的最大空闲连接max‐idle: 50# 连接池中最小空闲连接min‐idle: 10max‐active: 100# 连接池阻塞等待时间(负值表示没有限制)max‐wait: 1000
只不过 sentinel换成了 cluster,然后API什么的都是一样的。
위 내용은 Redis Java 연결 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!