javascript
【笑小枫的SpringBoot系列】【八】SpringBoot集成Redis
SpringBoot集成Redis
Redis原生命令大全,作者整理的很詳細,大部分命令轉化為java命令基本也是關鍵詞
Redis 命令參考
接下來開始我們的正題,一起學習下,SpringBoot整合Redis
引入依賴
pom文件不貼全部代碼了,依賴有些多了,占據的篇幅過大,只貼新增的吧
- pom.xml
Redis配置
隨著配置越來越多,這里就不貼全部了,注意和datasource同級,在spring的下級,要去掉spring哈🐾
- 添加application.yml 配置
- 在config包下添加RedisConfig.java 配置類👇
工具類
配置完配置,其實我們的Redis就已經集成了,SpringBoot的starter是真的香,后面我們會講解一下如何制作我們自己的starter。
下面配置一下redis常用的工具類,在util包下創建RedisUtil.java類👇
package com.maple.demo.util;import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import org.apache.commons.lang3.BooleanUtils; import org.springframework.data.redis.core.*; import org.springframework.stereotype.Component;import javax.annotation.Resource; import java.util.List; import java.util.Set; import java.util.concurrent.TimeUnit;/*** Redis常用的一些操作** @author 笑小楓* @date 2022/07/19*/ @Component public class RedisUtil {@Resourceprivate RedisTemplate<String, Object> redisTemplate;/*** 寫入緩存*/public boolean set(final String key, Object value) {boolean result = false;try {ValueOperations<String, Object> operations = redisTemplate.opsForValue();operations.set(key, value);result = true;} catch (Exception e) {e.printStackTrace();}return result;}/*** 寫入緩存設置時效時間*/public boolean set(final String key, Object value, Long expireTime) {boolean result = false;try {ValueOperations<String, Object> operations = redisTemplate.opsForValue();operations.set(key, value);redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);result = true;} catch (Exception e) {e.printStackTrace();}return result;}/*** 更新緩存*/public boolean getAndSet(final String key, String value) {boolean result = false;try {redisTemplate.opsForValue().getAndSet(key, value);result = true;} catch (Exception e) {e.printStackTrace();}return result;}/*** 批量刪除對應的value*/public void remove(final String... keys) {for (String key : keys) {remove(key);}}/*** 批量刪除key*/public void removePattern(final String pattern) {Set<String> keys = redisTemplate.keys(pattern);if (CollectionUtils.isNotEmpty(keys)) {redisTemplate.delete(keys);}}/*** 刪除對應的value*/public void remove(final String key) {if (exists(key)) {redisTemplate.delete(key);}}/*** 判斷緩存中是否有對應的value*/public boolean exists(final String key) {Boolean isExists = redisTemplate.hasKey(key);return BooleanUtils.isTrue(isExists);}/*** 讀取緩存*/public Object get(final String key) {ValueOperations<String, Object> operations = redisTemplate.opsForValue();return operations.get(key);}/*** 哈希 添加*/public void hmSet(String key, Object hashKey, Object value) {HashOperations<String, Object, Object> hash = redisTemplate.opsForHash();hash.put(key, hashKey, value);}/*** 哈希獲取數據*/public Object hmGet(String key, Object hashKey) {HashOperations<String, Object, Object> hash = redisTemplate.opsForHash();return hash.get(key, hashKey);}/*** 列表添加*/public void lPush(String k, Object v) {ListOperations<String, Object> list = redisTemplate.opsForList();list.rightPush(k, v);}/*** 列表獲取*/public List<Object> lRange(String k, long l, long l1) {ListOperations<String, Object> list = redisTemplate.opsForList();return list.range(k, l, l1);}/*** 集合添加*/public void addSet(String key, Object value) {SetOperations<String, Object> set = redisTemplate.opsForSet();set.add(key, value);}/*** 刪除集合下的所有值*/public void removeSetAll(String key) {SetOperations<String, Object> set = redisTemplate.opsForSet();Set<Object> objectSet = set.members(key);if (objectSet != null && !objectSet.isEmpty()) {for (Object o : objectSet) {set.remove(key, o);}}}/*** 判斷set集合里面是否包含某個元素*/public Boolean isMember(String key, Object member) {SetOperations<String, Object> set = redisTemplate.opsForSet();return set.isMember(key, member);}/*** 集合獲取*/public Set<Object> setMembers(String key) {SetOperations<String, Object> set = redisTemplate.opsForSet();return set.members(key);}/*** 有序集合添加*/public void zAdd(String key, Object value, double source) {ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();zset.add(key, value, source);}/*** 有序集合獲取指定范圍的數據*/public Set<Object> rangeByScore(String key, double source, double source1) {ZSetOperations<String, Object> zSet = redisTemplate.opsForZSet();return zSet.rangeByScore(key, source, source1);}/*** 有序集合升序獲取*/public Set<Object> range(String key, Long source, Long source1) {ZSetOperations<String, Object> zSet = redisTemplate.opsForZSet();return zSet.range(key, source, source1);}/*** 有序集合降序獲取*/public Set<Object> reverseRange(String key, Long source, Long source1) {ZSetOperations<String, Object> zSet = redisTemplate.opsForZSet();return zSet.reverseRange(key, source, source1);} }測試一下吧
編寫我們的測試類
package com.maple.demo.controller;import com.alibaba.fastjson.JSON; import com.maple.demo.util.RedisUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*;/*** @author 笑小楓* @date 2022/7/20*/ @Slf4j @RestController @AllArgsConstructor @RequestMapping("/example") @Api(tags = "實例演示-Redis接口文檔") public class TestRedisController {private final RedisUtil redisUtil;@PutMapping("/insertStr")@ApiOperation(value = "插入String類型的數據到redis")public void insertStr(String key, String value) {redisUtil.set(key, value);}@PostMapping("/getStr")@ApiOperation(value = "根據key獲取redis的數據")public String getStr(String key) {return String.valueOf(redisUtil.get(key));}@DeleteMapping("/deleteStr")@ApiOperation(value = "根據key刪除redis的數據")public Boolean deleteStr(String key) {redisUtil.remove(key);return redisUtil.exists(key);}@PostMapping("/operateMap")@ApiOperation(value = "模擬操作Map集合的數據")public Object operateMap() {redisUtil.hmSet("maple:map", "xiaofeng", "笑小楓");return redisUtil.hmGet("maple:map", "xiaofeng");}@PostMapping("/operateList")@ApiOperation(value = "模擬操作List集合的數據")public String operateList() {String listKey = "maple:list";redisUtil.lPush(listKey, "小楓");redisUtil.lPush(listKey, "小明");redisUtil.lPush(listKey, "小楓");return JSON.toJSONString(redisUtil.lRange(listKey, 0, 2));}@PostMapping("/operateSet")@ApiOperation(value = "模擬操作Set集合的數據")public String operateSet() {String listKey = "maple:set";redisUtil.addSet(listKey, "小楓");redisUtil.addSet(listKey, "小明");redisUtil.addSet(listKey, "小楓");log.info("集合中是否包含小楓" + redisUtil.isMember(listKey, "小楓"));log.info("集合中是否包含小紅" + redisUtil.isMember(listKey, "小紅"));return JSON.toJSONString(redisUtil.setMembers(listKey));}@PostMapping("/operateZSet")@ApiOperation(value = "模擬操作ZSet有序集合的數據")public String operateZSet() {String listKey = "maple:zSet";redisUtil.zAdd(listKey, "小楓", 8);redisUtil.zAdd(listKey, "小明", 1);redisUtil.zAdd(listKey, "小紅", 12);redisUtil.zAdd(listKey, "大明", 5);redisUtil.zAdd(listKey, "唐三", 10);redisUtil.zAdd(listKey, "小舞", 9);// 降序獲取source最高的5條數據return JSON.toJSONString(redisUtil.reverseRange(listKey, 0L, 4L));} }具體的返回結果我就不一一貼圖了,自己建站,流量和網速永遠都是一大詬病(哭窮🙈)
簡單貼兩張吧,怕你們說我敷衍😂😂
- 模擬操作List集合的數據
- 模擬操作ZSet有序集合的數據
監聽redis Key過期的事件
- 開始redis過期Key的監聽事件
如果數據要求比較嚴謹,請慎用此功能
修改redis.conf配置為文件,我用的Redis3.2版本(比較古老了😅),windows下是redis.windows-service.conf文件
看一下notify-keyspace-events Ex是否被注釋(默認是注釋),放開注釋即可。
K:keyspace事件,事件以__keyspace@<db>__為前綴進行發布; E:keyevent事件,事件以__keyevent@<db>__為前綴進行發布; g:一般性的,非特定類型的命令,比如del,expire,rename等; $:字符串特定命令; l:列表特定命令; s:集合特定命令; h:哈希特定命令; z:有序集合特定命令; x:過期事件,當某個鍵過期并刪除時會產生該事件; e:驅逐事件,當某個鍵因maxmemore策略而被刪除時,產生該事件; A:g$lshzxe的別名,因此”AKE”意味著所有事件。- 修改我們的RedisConfig.java文件,添加開啟監聽redis Key過期事件,完整配置如下👇
- 定義監聽器RedisKeyExpireListener
小結
好啦,本文就到這里了,我們簡單的總結一下,主要介紹了以下內容👇👇
- 本文核心:SpringBoot繼承redis
- SpringBoot常用的redis操作演示
- 監聽Redis的key過期機制
關于笑小楓💕
本章到這里結束了,喜歡的朋友關注一下我呦😘😘,大伙的支持,就是我堅持寫下去的動力。
老規矩,懂了就點贊收藏;不懂就問,日常在線,我會就會回復哈~🤪
笑小楓個人博客:https://www.xiaoxiaofeng.com
本文源碼:https://github.com/hack-feng/maple-demo
本系列其它文章
本系列的源碼已同步在Github:https://github.com/hack-feng/maple-demo
SpringBoot項目創建
SpringBoot配置基于swagger2的knife4j接口文檔
SpringBoot集成Mybatis Plus
SpringBoot返回統一結果包裝
SpringBoot返回統一異常處理
SpringBoot日志打印Logback詳解
SpringBoot控制臺自定義banner
SpringBoot集成Redis
SpringBoot用戶登錄攔截器
SpringBoot處理請求跨域問題
SpringBoot接口日志信息統一記錄
SpringBoot導入Excel
SpringBoot導出Excel
SpringBoot發送郵件
SpringBoot根據模板生成Word
SpringBoot生成PDF
SpringBoot文件上傳下載
SpringBoot中的Properties配置
總結
以上是生活随笔為你收集整理的【笑小枫的SpringBoot系列】【八】SpringBoot集成Redis的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Week_Demo
- 下一篇: 哔哩哔哩视频云画质与窄带高清AI落地实践