Rumah >Java >javaTutorial >Kaedah sambungan Java Redis
Tambah kebergantungan berikut
<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();}}}
Klien boleh menghantar berbilang permintaan serentak tanpa menunggu jawapan pelayan Selepas semua arahan dihantar, ia boleh membaca respons perkhidmatan sekaligus. Ini boleh mengurangkan overhed penghantaran rangkaian dan perlaksanaan berbilang arahan. Overhed rangkaian untuk melaksanakan berbilang arahan sebenarnya hanya setara dengan overhed rangkaian untuk melaksanakan satu arahan. Perlu diingatkan bahawa arahan dibungkus dan dihantar dalam mod saluran paip, dan redis mesti cache hasil pemprosesan semua arahan sebelum memprosesnya. Lebih banyak arahan yang anda bungkus, lebih banyak memori yang digunakan oleh cache. Jadi bukan lebih banyak arahan yang anda bungkus, lebih baik. Setiap arahan yang dihantar dalam saluran paip akan dilaksanakan dengan segera oleh pelayan Jika pelaksanaan gagal, maklumat akan diperolehi dalam tindak balas seterusnya, iaitu saluran paip tidak menyatakan semantik "semua arahan berjaya bersama". dalam saluran paip gagal, dan arahan berikut gagal Perintah itu tidak akan memberi kesan dan akan terus dilaksanakan.
Lihat contoh di atas.
Redis melancarkan fungsi skrip dalam 2.6, membenarkan pembangun menggunakan bahasa Lua untuk menulis skrip dan menghantarnya ke Redis untuk dilaksanakan. Faedah menggunakan skrip adalah seperti berikut:
Operasi 5 permintaan rangkaian asal boleh diselesaikan dengan satu permintaan, dan logik 5 permintaan asal diselesaikan pada. pelayan redis. Menggunakan skrip mengurangkan kependaman pergi balik rangkaian. Ini serupa dengan paip.
Redis akan melaksanakan keseluruhan skrip dan tiada arahan lain akan disisipkan di tengah. Paip bukan atom, tetapi perintah operasi kelompok redis (serupa dengan mset) adalah atom.
Fungsi transaksi redis sangat tidak berguna dan tidak menyokong pemulangan semula apabila melaporkan ralat Walau bagaimanapun, skrip Lua redis mempunyai fungsi transaksi yang hampir biasa dan menyokong pelaporan ralat Untuk operasi roll, secara rasmi disyorkan bahawa jika anda ingin menggunakan fungsi transaksi redis, anda boleh menggunakan redis lua.
Terdapat petikan ini dalam dokumentasi laman web rasmi:
Skrip Redis adalah transaksi mengikut definisi, jadi semua yang anda boleh lakukan dengan transaksi Redis, anda juga boleh lakukan dengan skrip, dan biasanya skrip akan menjadi lebih mudah dan lebih pantas.
Bermula dari versi Redis 2.6.0, melalui penterjemah Lua terbina dalam, anda boleh menggunakan arahan EVAL untuk menilai skrip Lua. Format arahan EVAL
adalah seperti berikut:
EVAL script numkeys key [key ...] arg [arg ...]
Parameter skrip ialah atur cara skrip Lua, yang akan dijalankan dalam konteks pelayan Redis Skrip ini tidak (dan tidak sepatutnya) ditakrifkan sebagai fungsi
Lua. Parameter numkeys digunakan untuk menentukan bilangan parameter utama. Kekunci parameter utama [kunci …] bermula daripada parameter ketiga EVAL
dan mewakili kekunci Redis (kunci) yang digunakan dalam skrip Parameter utama ini boleh dihantar dalam Lua melalui tatasusunan KEYS global > sebagai alamat asas untuk diakses (KEYS[1], KEYS[2] dan seterusnya). Pada penghujung arahan, parameter tambahan arg [arg...] yang bukan parameter utama boleh diakses dalam Lua melalui tatasusunan ARGV pembolehubah global Borang akses adalah serupa dengan pembolehubah KEYS (ARGV[1], ARGV [2], dan seterusnya). Contohnya,
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"di mana "kembali {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" ialah skrip Lua sedang dinilai dan nombor 2 menentukan bilangan parameter utama.
kuantiti, kunci1 dan kunci2 ialah parameter utama, masing-masing diakses menggunakan KEYS[1] dan KEYS[2], dan yang pertama dan kedua adalah parameter tambahan
, yang boleh diakses melalui ARGV[1] dan ARGV[2] mengaksesnya. Dalam skrip Lua, anda boleh menggunakan fungsi redis.call() untuk melaksanakan arahan Redis
berhati-hatilah agar tidak mempunyai gelung tak terhingga atau memakan masa operasi. redis ialah skrip pelaksanaan satu proses, satu utas. Paip tidak menghalang redis.
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>
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
@RestControllerpublic class IndexController {private static final Logger logger = LoggerFactory.getLogger(IndexController.class);@Autowiredprivate StringRedisTemplate stringRedisTemplate;/*** 测试节点挂了哨兵重新选举新的master节点,客户端是否能动态感知到* 新的master选举出来后,哨兵会把消息发布出去,客户端实际上是实现了一个消息监听机制,* 当哨兵把新master的消息发布出去,客户端会立马感知到新master的信息,从而动态切换访问的masterip* @throws InterruptedException*/@RequestMapping("/test_sentinel")public void testSentinel() throws InterruptedException {int i = 1;while (true){try {stringRedisTemplate.opsForValue().set("zhuge"+i, i+"");System.out.println("设置key:"+ "zhuge" + i);i++;Thread.sleep(1000);}catch (Exception e){logger.error("错误:", e);}}}}
RedisTemplate menyediakan penggunaan beberapa kaedah antara muka yang biasa digunakan, iaitu:
private ValueOperations<K, V> valueOps;private HashOperations<K, V> hashOps;private ListOperations<K, V> listOps;private SetOperations<K, V> setOps;private ZSetOperations<K, V> zSetOps;RedisTemplate mentakrifkan operasi pada 5 struktur data
redisTemplate.opsForValue();//操作字符串redisTemplate.opsForHash();//操作hashredisTemplate.opsForList();//操作listredisTemplate.opsForSet();//操作setredisTemplate.opsForZSet();//操作有序setStringRedisTemplate mewarisi daripada RedisTemplate, juga Operasi yang sama seperti di atas tersedia .
StringRedisTemplate menggunakan strategi bersiri Rentetan secara lalai, dan kunci serta nilai yang disimpan disiri dan disimpan
menggunakan strategi ini. RedisTemplate menggunakan strategi bersiri JDK secara lalai, dan kunci serta nilai yang disimpan disiri dan disimpan menggunakan strategi ini.
Iaitu, jika kandungan disimpan dengan RedisTemplate, anda akan melihat banyak aksara yang dikodkan apabila anda membukanya dalam konsol, yang sukar difahami.
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什么的都是一样的。
Atas ialah kandungan terperinci Kaedah sambungan Java Redis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!