摘要:如何使用操作詳解簡介是一個開源許可的,內存中的數據結構存儲系統,它可以用作數據庫緩存和消息中間件。解決辦法是即使查出的對象為空,也放入緩存時間設短一點。緩存雪崩,是指在某一個時間段,緩存集中過期失效。
如何使用StringRedisTemplate操作Redis詳解 Redis簡介
Redis 是一個開源(BSD許可)的,內存中的數據結構存儲系統,它可以用作數據庫、緩存和消息中間件。支持事務5.0版本新增stream數據類型。
Spring boot單數據源配置Springboot的redis單數據源配置特別簡單
(1)配置appliation.properties文件
spring.redis.host=x.x.x.x spring.redis.port=6379 #redis的數據庫號 spring.redis.database=4 spring.redis.timeout = 30000ms spring.redis.jedis.pool.max-active=200 spring.redis.jedis.pool.max-idle=0 spring.redis.lettuce.pool.max-idle=5 spring.redis.jedis.pool.max-wait=20000ms
(2)StringRedisTemplate的基本操作
StringRedisTemplate自動關閉redis連接 //注入對象 @Autowired private StringRedisTemplate stringRedisTemplate; #獲取ValueOperations操作String數據 ValueOperationsSpring boot多數據源配置,配置一個1號庫,一個4號庫valueOperations = stringRedisTemplate.opsForValue(); valueOperations.set("strRedis","StringRedisTemplate"); valueOperations.get("strRedis"); #設置過期時間 set("timeStep", new Date().getTime()+"", 2 ,TimeUnit.MINUTES); #獲取SetOperations操作Set數據 SetOperations set = stringRedisTemplate.opsForSet(); set.add("set1","22"); set.add("set1","33"); set.add("set1","44"); Set resultSet =stringRedisTemplate.opsForSet().members("set1"); stringRedisTemplate.opsForSet().add("set2", "1","2","3");//向指定key中存放set集合 Set resultSet1 =stringRedisTemplate.opsForSet().members("set2"); log.info("resultSet:"+resultSet); log.info("resultSet1:"+resultSet1); #獲取ListOperations操作List數據,list可以用來實現隊列。 //將數據添加到key對應的現有數據的左邊 Long redisList = stringRedisTemplate.opsForList().leftPush("redisList", "3"); stringRedisTemplate.opsForList().leftPush("redisList", "4"); //將數據添加到key對應的現有數據的右邊 Long size = stringRedisTemplate.opsForList().size("redisList"); //從左往右遍歷 String leftPop = stringRedisTemplate.opsForList().leftPop("redisList"); //從右往左遍歷 String rightPop = stringRedisTemplate.opsForList().rightPop("redisList"); //查詢全部元素 List range = stringRedisTemplate.opsForList().range("redisList", 0, -1); //查詢前三個元素 List range1 = stringRedisTemplate.opsForList().range("redisList", 0, 3); //從左往右刪除list中元素A (1:從左往右 -1:從右往左 0:刪除全部) Long remove = stringRedisTemplate.opsForList().remove("key", 1, "A"); log.info("redisList----"+redisList); log.info("size----"+size); log.info("leftPop----"+leftPop); log.info("rightPop----"+rightPop); log.info("range----"+range); log.info("range1----"+range1); log.info("remove----"+remove); //判斷key對應的map中是否存在hash Boolean aBoolean = stringRedisTemplate.opsForHash().hasKey("hash", "hash1"); //往key對應的map中新增(key1,value1) stringRedisTemplate.opsForHash().put("hash", "hash1", "value1"); //獲取key對應的map中hash1的值 Object o = stringRedisTemplate.opsForHash().get("hash", "hash1"); //刪除key對應的map中多個子hash(可變參數) Long delete = stringRedisTemplate.opsForHash().delete("hash", "key1", "key2", "key3"); //獲取hash對應的map Map
添加依賴
org.apache.commons commons-pool2 org.springframework.boot spring-boot-starter-data-redis
修改application.properties配置文件
#1號庫 spring.redis.redis-onedb.database=0 spring.redis.redis-onedb.hostName=192.168.90.42 spring.redis.redis-onedb.port=9110 spring.redis.redis-onedb.timeout=5000 #4號庫 spring.redis.redis-fourdb.database=4 spring.redis.redis-fourdb.hostName=192.168.90.42 spring.redis.redis-fourdb.port=9110 spring.redis.redis-fourdb.timeout=5000
創建RedisConfig.java文件
@Configuration public class RedisConfig { @Bean @ConfigurationProperties(prefix = "spring.redis.lettuce.pool") @Scope(value = "prototype") public GenericObjectPoolConfig redisPool(){ return new GenericObjectPoolConfig(); } @Bean @ConfigurationProperties(prefix = "spring.redis.redis-fourdb") public RedisStandaloneConfiguration redisConfigA(){ return new RedisStandaloneConfiguration(); } @Bean @ConfigurationProperties(prefix = "spring.redis.redis-onedb") public RedisStandaloneConfiguration redisConfigB(){ return new RedisStandaloneConfiguration(); } @Primary @Bean public LettuceConnectionFactory factoryA(GenericObjectPoolConfig config, RedisStandaloneConfiguration redisConfigA){ LettuceClientConfiguration clientConfiguration = LettucePoolingClientConfiguration.builder() .poolConfig(config).commandTimeout(Duration.ofMillis(config.getMaxWaitMillis())).build(); return new LettuceConnectionFactory(redisConfigA, clientConfiguration); } @Bean public LettuceConnectionFactory factoryB(GenericObjectPoolConfig config, RedisStandaloneConfiguration redisConfigB){ LettuceClientConfiguration clientConfiguration = LettucePoolingClientConfiguration.builder() .poolConfig(config).commandTimeout(Duration.ofMillis(config.getMaxWaitMillis())).build(); return new LettuceConnectionFactory(redisConfigB, clientConfiguration); } @Bean(name = "fourRedis") public StringRedisTemplate redisBusTemplate(@Qualifier("factoryA") LettuceConnectionFactory factoryA){ StringRedisTemplate template = getRedisTemplate(); template.setConnectionFactory(factoryA); return template; } @Bean(name = "oneRedis") public StringRedisTemplate redisLoginTemplate(@Qualifier("factoryB")LettuceConnectionFactory factoryB){ StringRedisTemplate template = getRedisTemplate(); template.setConnectionFactory(factoryB); return template; } private StringRedisTemplate getRedisTemplate(){ StringRedisTemplate template = new StringRedisTemplate(); template.setValueSerializer(new GenericFastJsonRedisSerializer()); template.setValueSerializer(new StringRedisSerializer()); return template; } }
在需要使用的類,注入就可以使用
@Resource(name = "oneRedis") private StringRedisTemplate oneRedis; @Resource(name = "fourRedis") private StringRedisTemplate fourRedis;StringRedisTemplate實現事務
stringRedisTemplate.setEnableTransactionSupport(true); try { stringRedisTemplate.multi();//開啟事務 stringRedisTemplate.opsForValue().increment("count", 1); stringRedisTemplate.opsForValue().increment("count1", 2); //提交 stringRedisTemplate.exec(); }catch (Exception e){ log.error(e.getMessage(), e); //開啟回滾 stringRedisTemplate.discard(); }
注意:StringRedisTemplate開啟事務之后,不釋放連接。如果我們使用Spring事務管理不存在這個問題
StringRedisTemplate實現樂觀鎖redisTemplate.watch("key"); // 1 redisTemplate.multi(); redisTemplate.boundValueOps("key").set(""+id); ListStringRedisTemplate實現pipe管道 StringRedisTemplate實現分布式鎖list= redisTemplate.exec(); System.out.println(list); if(list != null ){ //操作成功 System.out.println(id+"操作成功"); }else{ //操作失敗 System.out.println(id+"操作失敗"); }
String lockKey = "key"; String lockValue = lockKey+System.currentTimeMillis(); // value需要記住用于解鎖 while (true){ Boolean ifPresent = stringRedisTemplate.opsForValue(). setIfAbsent("redis-lock:" + lockKey, lockValue, 3, TimeUnit.SECONDS); if (ifPresent){ log.info("get redis-lock success"); break; } } //解鎖 String lockKey = "key"; String lockValue = lockKey + System.currentTimeMillis(); boolean result = false; // value需要記住用于解鎖 stringRedisTemplate.watch("redis-lock:" + lockKey); String value = stringRedisTemplate.opsForValue().get("redis-lock:" + lockKey); if (null == value){ result = true; }else if (value.equals(lockValue)) { stringRedisTemplate.delete("redis-lock:" + lockKey); result = true; } stringRedisTemplate.unwatch();Redis緩存擊穿、穿透和雪崩
緩存擊穿,是指一個key非常熱點,在不停的扛著大并發,大并發集中對這一個點進 行訪問,當這個key在失效的瞬間,持續的大并發就穿破緩存,直接請求數據庫,就 像在一個屏障上鑿開了一個洞 緩存穿透,是指查詢一個數據庫一定不存在的數據。正常的使用緩存流程大致是, 數據查詢先進行緩存查詢,如果key不存在或者key已經過期,再對數據庫進行查 詢,并把查詢到的對象,放進緩存。如果數據庫查詢對象為空,則不放進緩存。 解決辦法是即使查出的對象為空,也放入緩存時間設短一點。 緩存雪崩,是指在某一個時間段,緩存集中過期失效。
有問題,請留言!
個人博客地址 王開金的博客
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75766.html
摘要:和注解的方法返回值要一致刪除緩存在需要刪除緩存的方法上加注解,執行完這個方法之后會將中對應的記錄刪除。代表返回值,意思是當返回碼不等于時不緩存,也就是等于時才緩存。返回值特定值如果被設置了如果沒有被設置例子自動將對應到并且返回原來對應的。 本文主要講 Redis 的使用,如何與 SpringBoot 項目整合,如何使用注解方式和 RedisTemplate 方式實現緩存。最后會給一個用...
閱讀 1589·2021-09-02 15:41
閱讀 997·2021-09-02 15:11
閱讀 1278·2021-07-28 00:15
閱讀 2307·2019-08-30 15:55
閱讀 1144·2019-08-30 15:54
閱讀 1692·2019-08-30 15:54
閱讀 2975·2019-08-30 14:02
閱讀 2523·2019-08-29 16:57