真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

RedisJava連接的方法

本篇內(nèi)容主要講解“redis Java連接的方法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Redis Java連接的方法”吧!

在湖南等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、外貿(mào)網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作按需策劃設(shè)計(jì),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計(jì),成都全網(wǎng)營(yíng)銷推廣,外貿(mào)網(wǎng)站建設(shè),湖南網(wǎng)站建設(shè)費(fèi)用合理。

一、Java連接池連接(管道,lua)

加入如下依賴

redis.clientsjedis2.9.0

1、Test

public class Test {public static void main(String[] args) {JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();jedisPoolConfig.setMaxTotal(20);jedisPoolConfig.setMaxIdle(10);jedisPoolConfig.setMinIdle(5);// timeout,這里既是連接超時(shí)又是讀寫超時(shí),從Jedis 2.8開始有區(qū)分connectionTimeout和soTimeout的構(gòu)造函數(shù)JedisPool jedisPool = new JedisPool(jedisPoolConfig, "192.168.157.6", 6379, 3000, null);Jedis jedis = null;try {// 從redis連接池里拿出一個(gè)連接執(zhí)行命令jedis = jedisPool.getResource();System.out.println(jedis.set("single", "zhuge"));System.out.println(jedis.get("single"));// 管道示例// 管道的命令執(zhí)行方式: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 results = pl.syncAndReturnAll();System.out.println(results);// lua腳本模擬一個(gè)商品減庫(kù)存的原子操作// lua腳本命令執(zhí)行方式:redis‐cli ‐‐eval /tmp/test.lua , 10jedis.set("product_count_10016", "15"); // 初始化商品10016的庫(kù)存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 {// 注意這里不是關(guān)閉連接,在JedisPool模式下,Jedis會(huì)被歸還給資源池。if (jedis != null)jedis.close();}}}

2、管道(Pipeline)

客戶端可以一次性發(fā)送多個(gè)請(qǐng)求而不用等待服務(wù)器的響應(yīng),待所有命令都發(fā)送完后再一次性讀取服務(wù)的響應(yīng),這樣可以極大的降低多條命令執(zhí)行的網(wǎng)絡(luò)傳輸開銷,管道執(zhí)行多條命令的網(wǎng)絡(luò)開銷實(shí)際上只相當(dāng)于一次命令執(zhí)行的網(wǎng)絡(luò)開銷。需要注意到是用pipeline方式打包命令發(fā)送,redis必須在處理完所有命令前先緩存起所有命令的處理結(jié)果。打包的命令越多,緩存消耗內(nèi)存也越多。所以并不是打包的命令越多越好。pipeline中發(fā)送的每個(gè)command都會(huì)被server立即執(zhí)行,如果執(zhí)行失敗,將會(huì)在此后的響應(yīng)中得到信息;也就是pipeline并不是表達(dá)“所有command都一起成功”的語(yǔ)義,管道中前面命令失敗,后面命令不會(huì)有影響,繼續(xù)執(zhí)行。

例子參考如上。

3、Redis Lua腳本

Redis在2.6推出了腳本功能,允許開發(fā)者使用Lua語(yǔ)言編寫腳本傳到Redis中執(zhí)行。使用腳本的好處如下:

1、減少網(wǎng)絡(luò)開銷

本來5次網(wǎng)絡(luò)請(qǐng)求的操作,可以用一個(gè)請(qǐng)求完成,原先5次請(qǐng)求的邏輯放在redis服務(wù)器上完成。使用腳本,減少了網(wǎng)絡(luò)往返時(shí)延。這點(diǎn)跟管道類似。

2、原子操作

Redis會(huì)將整個(gè)腳本作為一個(gè)整體執(zhí)行,中間不會(huì)被其他命令插入。管道不是原子的,不過redis的批量操作命令(類似mset)是原子的。

3、替代redis的事務(wù)功能

redis自帶的事務(wù)功能很雞肋,報(bào)錯(cuò)不支持回滾,而redis的lua腳本幾乎現(xiàn)了常規(guī)的事務(wù)功能,支持報(bào)錯(cuò)回滾操作,官方推薦如果要使用redis的事務(wù)功能可以用redis lua替代。
官網(wǎng)文檔上有這樣一段話:

A Redis script is transactional by definition, so everything you can do with a Redis transaction, you can also do with a script,and usually the script will be both simpler and faster.

從Redis2.6.0版本開始,通過內(nèi)置的Lua解釋器,可以使用EVAL命令對(duì)Lua腳本進(jìn)行求值。EVAL命令的格
式如下:

EVAL script numkeys key [key ...] arg [arg ...]

script參數(shù)是一段Lua腳本程序,它會(huì)被運(yùn)行在Redis服務(wù)器上下文中,這段腳本不必(也不應(yīng)該)定義為一
個(gè)Lua函數(shù)。numkeys參數(shù)用于指定鍵名參數(shù)的個(gè)數(shù)。鍵名參數(shù) key [key …] 從EVAL的第三個(gè)參數(shù)開始算
起,表示在腳本中所用到的那些Redis鍵(key),這些鍵名參數(shù)可以在 Lua中通過全局變量KEYS數(shù)組,用1
為基址的形式訪問( KEYS[1] , KEYS[2] ,以此類推)。在命令的最后,那些不是鍵名參數(shù)的附加參數(shù) arg [arg …] ,可以在Lua中通過全局變量ARGV數(shù)組訪問,訪問的形式和KEYS變量類似( ARGV[1] 、 ARGV[2] ,諸如此類)。例如

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"

其中 “return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}” 是被求值的Lua腳本,數(shù)字2指定了鍵名參數(shù)的數(shù)
量, key1和key2是鍵名參數(shù),分別使用 KEYS[1] 和 KEYS[2] 訪問,而最后的 first 和 second 則是附加
參數(shù),可以通過 ARGV[1] 和 ARGV[2] 訪問它們。在 Lua 腳本中,可以使用redis.call()函數(shù)來執(zhí)行Redis命令

例子參考如上。

注意,不要在Lua腳本中出現(xiàn)死循環(huán)和耗時(shí)的運(yùn)算,否則redis會(huì)阻塞,將不接受其他的命令, 所以使用
時(shí)要注意不能出現(xiàn)死循環(huán)、耗時(shí)的運(yùn)算。redis是單進(jìn)程、單線程執(zhí)行腳本。管道不會(huì)阻塞redis。

二、哨兵的Jedis連接代碼

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 sentinels = new HashSet();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,這里既是連接超時(shí)又是讀寫超時(shí),從Jedis 2.8開始有區(qū)分connectionTimeout和soTimeout的構(gòu)造函數(shù)JedisSentinelPool jedisSentinelPool = new JedisSentinelPool(masterName, sentinels, jedisPoolConfig, 3000, null);Jedis jedis = null;try {// 從redis連接池里拿出一個(gè)連接執(zhí)行命令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 {// 注意這里不是關(guān)閉連接,在JedisPool模式下,Jedis會(huì)被歸還給資源池。if (jedis != null)jedis.close();}}}

三、哨兵的Spring Boot整合Redis連接

1、引入相關(guān)依賴

org.springframework.bootspring‐boot‐starter‐data‐redisorg.apache.commonscommons‐pool2

2、springboot項(xiàng)目核心配置

server:port: 8080spring:redis:database: 0timeout: 3000sentinel: #哨兵模式master: mymaster #主服務(wù)器所在集群名稱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

3、訪問代碼

@RestControllerpublic class IndexController {private static final Logger logger = LoggerFactory.getLogger(IndexController.class);@Autowiredprivate StringRedisTemplate stringRedisTemplate;/*** 測(cè)試節(jié)點(diǎn)掛了哨兵重新選舉新的master節(jié)點(diǎn),客戶端是否能動(dòng)態(tài)感知到* 新的master選舉出來后,哨兵會(huì)把消息發(fā)布出去,客戶端實(shí)際上是實(shí)現(xiàn)了一個(gè)消息監(jiān)聽機(jī)制,* 當(dāng)哨兵把新master的消息發(fā)布出去,客戶端會(huì)立馬感知到新master的信息,從而動(dòng)態(tài)切換訪問的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("設(shè)置key:"+ "zhuge" + i);i++;Thread.sleep(1000);}catch (Exception e){logger.error("錯(cuò)誤:", e);}}}}

4、StringRedisTemplate與RedisTemplate

spring 封裝了 RedisTemplate 對(duì)象來進(jìn)行對(duì)redis的各種操作,它支持所有的 redis 原生的 api。在
RedisTemplate中提供了幾個(gè)常用的接口方法的使用,分別是:

private ValueOperations valueOps;private HashOperations hashOps;private ListOperations listOps;private SetOperations setOps;private ZSetOperations zSetOps;

RedisTemplate中定義了對(duì)5種數(shù)據(jù)結(jié)構(gòu)操作

redisTemplate.opsForValue();//操作字符串redisTemplate.opsForHash();//操作hashredisTemplate.opsForList();//操作listredisTemplate.opsForSet();//操作setredisTemplate.opsForZSet();//操作有序set

StringRedisTemplate繼承自RedisTemplate,也一樣擁有上面這些操作。
StringRedisTemplate默認(rèn)采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存
的。RedisTemplate默認(rèn)采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。
也就是若是用RedisTemplate保存的內(nèi)容,你在控制臺(tái)打開看到會(huì)是很多編碼后的字符,比較難理解。

Redis客戶端命令對(duì)應(yīng)的RedisTemplate中的方法列表:
Redis Java連接的方法
Redis Java連接的方法
Redis Java連接的方法
Redis Java連接的方法

四、集群的Jedis連接代碼

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 jedisClusterNode = new HashSet();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,這里既是連接超時(shí)又是讀寫超時(shí),從Jedis 2.8開始有區(qū)分connectionTimeout和soTimeout的構(gòu)造函數(shù)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 {// 注意這里不是關(guān)閉連接,在JedisPool模式下,Jedis會(huì)被歸還給資源池。if (jedisCluster != null)jedisCluster.close();}}}

五、集群模式Springboot整合redis

其實(shí)集群模式跟哨兵模式很類似,只不過配置文件修改一下即可

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# 連接池阻塞等待時(shí)間(負(fù)值表示沒有限制)max‐wait: 1000

只不過 sentinel換成了 cluster,然后API什么的都是一樣的。

到此,相信大家對(duì)“Redis Java連接的方法”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!


本文標(biāo)題:RedisJava連接的方法
路徑分享:http://weahome.cn/article/pphsss.html

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部