Fügen Sie die folgenden Abhängigkeiten hinzu
<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();}}}
Der Client kann mehrere Anfragen gleichzeitig senden, ohne auf die Antwort des Servers zu warten. Nachdem alle Befehle gesendet wurden, kann der Netzwerk-Übertragungsaufwand für die Ausführung mehrerer Befehle erheblich reduziert werden. Es ist zu beachten, dass Befehle im Pipeline-Modus gepackt und gesendet werden und Redis die Verarbeitungsergebnisse aller Befehle vor der Verarbeitung zwischenspeichern muss. Je mehr Befehle Sie packen, desto mehr Speicher verbraucht der Cache. Es ist also nicht so, dass es umso besser ist, je mehr Befehle Sie packen. Jeder in der Pipeline gesendete Befehl wird sofort vom Server ausgeführt. Wenn die Ausführung fehlschlägt, werden die Informationen in der nachfolgenden Antwort abgerufen. Das heißt, die Pipeline drückt nicht die Semantik von „Alle Befehle sind gemeinsam erfolgreich“ aus in der Pipeline schlägt fehl und der folgende Befehl schlägt fehl. Der Befehl hat keine Wirkung und wird weiterhin ausgeführt.
Siehe das Beispiel oben.
Redis hat die Skriptfunktion in 2.6 eingeführt, sodass Entwickler die Lua-Sprache verwenden können, um Skripte zu schreiben und diese zur Ausführung an Redis zu übergeben. Die Verwendung von Skripten bietet folgende Vorteile:
Die ursprünglichen 5 Netzwerkanforderungsvorgänge können mit einer Anforderung abgeschlossen werden. Die Logik der ursprünglichen 5 Anforderungen wird auf dem Redis-Server abgeschlossen. Die Verwendung von Skripten reduziert die Netzwerk-Roundtrip-Latenz. Dies ist ähnlich wie bei Rohren.
Redis führt das gesamte Skript als Ganzes aus und es werden keine anderen Befehle in die Mitte eingefügt. Pipes sind nicht atomar, aber Redis-Batch-Operationsbefehle (ähnlich wie mset) sind atomar.
Ab Redis Version 2.6.0 können Sie über den integrierten Lua-Interpreter den EVAL-Befehl verwenden, um Lua-Skripte auszuwerten. Das Format des EVAL-Befehls ist wie folgt: Der Skriptparameter ist ein Lua-Skript, das im Redis-Serverkontext ausgeführt wird. Dieses Skript ist nicht als Lua-Funktion definiert (und sollte dies auch nicht tun). Der Parameter numkeys wird verwendet, um die Anzahl der Schlüsselparameter anzugeben. Der Schlüsselparameter key [key ...] beginnt mit dem dritten Parameter von EVAL und stellt die im Skript verwendeten Redis-Schlüssel (Schlüssel) dar. Diese Schlüsselparameter können in Lua über das globale Variablen-Array KEYS übergeben werden, auf das zugegriffen wird in Form einer Basisadresse (KEYS[1], KEYS[2] usw.). Am Ende des Befehls kann auf die zusätzlichen Parameter arg [arg...], die keine Schlüsselparameter sind, in Lua über das globale Variablenarray ARGV zugegriffen werden. Die Zugriffsform ähnelt der KEYS-Variablen (ARGV[1], ARGV [2] usw.) . Zum Beispiel
EVAL script numkeys key [key ...] arg [arg ...]
wobei „return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}“ das Lua-Skript ist, das ausgewertet wird, und die Zahl 2 die Anzahl der Schlüsselparameter key1 und angibt key2 sind Schlüsselparameter, auf die über KEYS[1] bzw. KEYS[2] zugegriffen werden kann, während die letzten ersten und zweiten Parameter zusätzliche Parameter sind, auf die über ARGV[1] und ARGV[2] zugegriffen werden kann. In Lua-Skripten können Sie die Funktion redis.call() verwenden, um Redis-Befehle auszuführen
Achten Sie darauf, keine Endlosschleifen und zeitaufwändigen Vorgänge in Lua-Skripten zu haben, da Redis sonst blockiert und keine anderen Befehle akzeptiert. Achten Sie daher bei der Verwendung von
darauf, dass es keine Endlosschleifen oder zeitaufwändigen Vorgänge gibt. Redis ist ein Einzelprozess- und Einzelthread-Ausführungsskript. Pipes blockieren Redis nicht.
1. Führen Sie relevante Abhängigkeiten ein
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"
RedisTemplate bietet die Verwendung mehrerer häufig verwendeter Schnittstellenmethoden, nämlich:
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();}}}
<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>
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什么的都是一样的。
Das obige ist der detaillierte Inhalt vonRedis Java-Verbindungsmethode. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!