SpringBoot中的Redis?緩存問題及操作方法
1、五大基本數(shù)據(jù)類型和操作
1.1 字符串-string
命令 | 說明 |
---|---|
set key value | 如果key還沒有,那就可以添加,如果key已經(jīng)存在了,那會(huì)覆蓋原有key的值 |
get key | 如果key還沒有,獲取為(nil),代表key沒有被使用,如果key存在,可以獲取對(duì)應(yīng)key的值 |
exists key | 判斷某個(gè)key是否存在,返回Integer值1 代表存在,如果 exists car2 則返回0,不存在 |
move key db | 將當(dāng)前數(shù)據(jù)庫存在的鍵值移動(dòng)到其它數(shù)據(jù)庫,其中db是數(shù)據(jù)庫的序號(hào) |
expire key 秒鐘 | 為已經(jīng)存在的key設(shè)置過期時(shí)間,注意過期之后,從內(nèi)存中去掉了,是get不到的 |
ttl key | 查看還有多少秒過期,-1表示永不過期,-2表示已過期 |
type key | 命令用于返回 key 所儲(chǔ)存的值的類型 |
del key | 根據(jù)key值刪除 |
append key value | 根據(jù)key將其值進(jìn)行字符串拼接 |
strlen key | 根據(jù)key獲取其值的字符串長度,字節(jié)數(shù) |
incr key | 對(duì)key對(duì)應(yīng)數(shù)值進(jìn)行加一操作,對(duì)應(yīng)的字符串值必須是數(shù)值 |
decr key | 對(duì)key對(duì)應(yīng)數(shù)值進(jìn)行減一操作 |
incrby key 數(shù)值 | 對(duì)key對(duì)應(yīng)數(shù)值按照指定的值進(jìn)行遞增 |
decrby key 數(shù)值 | 對(duì)key對(duì)應(yīng)數(shù)值按照指定的值進(jìn)行遞減 |
getrange key 起始位置 結(jié)束位置 | 獲取指定區(qū)間內(nèi)的值,類似between。。。and的關(guān)系,起始位置為0,結(jié)束位置為-1 就是返回所有 |
setrange key 起始位置 具體值 | 設(shè)置指定區(qū)間內(nèi)的值,具體值會(huì)從起始位置開始覆蓋 |
setex key 過期秒值 真實(shí)值 | 設(shè)置帶過期時(shí)間的key,動(dòng)態(tài)設(shè)置。 |
setnx key value | 只有在 key 不存在時(shí),才會(huì)設(shè)置 key 的值,如果已經(jīng)存在了,不覆蓋,設(shè)置不了; |
setnx key value | 如果返回0 代表沒有設(shè)置成功,key對(duì)應(yīng)值已經(jīng)存在,如果返回1代表設(shè)置成功;這個(gè)就是redis的分布式鎖命令,很重要; |
mset key1 val1 key2 val2 .... | 同時(shí)設(shè)置一個(gè)或多個(gè) key-value 對(duì) |
mget key1 key2 key3 .... | 獲取所有(一個(gè)或多個(gè))給定 key 的值。 |
msetnx key1 val1 key2 val2 ..... | 同時(shí)設(shè)置一個(gè)或多個(gè) key-value 對(duì),當(dāng)且僅當(dāng)所有給定 key 都不存在 |
1.2 列表-list
list操作起來類似于棧;
命令 | 說明 |
---|---|
lpush key val1 val2 val3 .... | 從左側(cè)開始存放元素,先進(jìn)后出 |
lrange key 起始位置 結(jié)束位置 | 從左側(cè)開始,指定范圍獲取元素,-1代表所有 |
rpush key val1 val2 val3 .... | 從右側(cè)開始存放元素,先進(jìn)先出 |
lpop key | 從左側(cè)一次取出一個(gè)元素 |
rpop key | 從右側(cè)一次取出一個(gè)元素 |
lindex key index | 按照索引下標(biāo)獲得元素(從左到右,左下標(biāo)從0開始,如果是-1代表最后一個(gè),-2代表倒數(shù)第二個(gè)) |
llen key | 獲取集合元素個(gè)數(shù) |
lrem key 個(gè)數(shù) 具體的值 | 從左往右刪除指定個(gè)數(shù)等于具體值的元素,返回的值為實(shí)際刪除的數(shù)量,個(gè)數(shù)0,表示刪除全部給定的值 |
ltrim key 開始index 結(jié)束index | 截取指定范圍的值后再賦值給key |
rpoplpush 源列表 目的列表 | 移除列表的最后一個(gè)元素,并將該元素添加到另一個(gè)列表并返回 |
lset key index value | 將key集合中的指定下標(biāo)位置值改為value |
linsert key before/after 值1 值2 | 在list某個(gè)已有 值1 的前后再添加具體 值2 |
小結(jié):
- 它是一個(gè)字符串鏈表,left、right都可以插入添加;
- 如果鍵不存在,創(chuàng)建新的鏈表;
- 如果鍵已存在,新增內(nèi)容;
- 如果值全移除,對(duì)應(yīng)的鍵也就消失了;
- 鏈表的操作無論是頭和尾效率都極高,但假如是對(duì)中間元素進(jìn)行操作,效率就很慘淡了;
1.3 集合-set
命令 | 說明 |
---|---|
sadd key val1 val2 ... | 集合set中添加元素,如果有重復(fù)元素會(huì)自動(dòng)去除 |
smembers key | 查看集合中的元素 |
sismember key val | 判斷val是否在set集合中,如果在返回1 ,不在返回0 |
scard key | 獲取集合里面的元素個(gè)數(shù) |
srem key value | 刪除集合中元素 |
srandmember key 某個(gè)整數(shù) | 隨機(jī)出幾個(gè)數(shù),如果超過最大數(shù)量就全部取出 |
srandmember key 某個(gè)整數(shù) | 如果寫的值是負(fù)數(shù),比如-3 ,表示需要取出3個(gè),但是可能會(huì)有重復(fù)值。 |
spop key | 隨機(jī)出棧 |
smove key1 key2 | 將key1里的某個(gè)值賦給key2 |
sdiff key1 key2 | 在第一個(gè)set里面而不在后面任何一個(gè)set里面的項(xiàng) |
sinter key1 key2 | 在兩個(gè)set中都有的值的交集返回 |
sunion key1 key2 | 在兩個(gè)set中所有的值的集合返回,會(huì)自動(dòng)排除重復(fù) |
1.4 鍵值對(duì)-hash
K V模式不變,但V是一個(gè)鍵值對(duì);
命令 | 說明 |
---|---|
hset 父key 子key 子value | 將父key,增加子鍵值對(duì),類似屬性 |
hget 父key 子key | 獲取父key,某個(gè)子key的值,獲取屬性值 |
hmset 父key 子key1 子val1 子key2 子val2 .... | 批量添加屬性 |
hmget 父key 子key1 子key... | 批量獲取屬性 |
hgetall 父key | 批量獲取屬性及值 |
hdel 父key 子key | 刪除子key屬性及值 |
hlen 父key | 返回父key中的子key個(gè)數(shù),相當(dāng)于java實(shí)體的屬性個(gè)數(shù) |
hexists 父key 子key | 判斷父key中是否包含某個(gè)子key,結(jié)果為1,代表存在 |
hkeys 父key | 獲取父key中所有的子key |
hvals 父key | 獲取父key中的所有的子val |
hincrby 父key 子key 值 | 給指定的子key值增加固定的值 |
hincrbyfloat 父key 子key 值 | 給有指定key的值增加小數(shù) |
hsetnx 父key 子key 子val | 如果子key存在則失敗,如果不存在則賦值 |
1.5 有序集合-zset
在set基礎(chǔ)上,加一個(gè)score值。之前set是k1 v1 v2 v3,現(xiàn)在zset是k1 score1 v1 score2 v2;
命令 | 說明 |
---|---|
zadd key score1 val1 score2 val2 score3 val3 ... | 有序集合添加帶score值的元素 |
zscore key val | 獲取集合中某個(gè)值對(duì)應(yīng)score值 |
zrange key 0 -1 [withscores] | zrange zset1 0 -1 ,結(jié)果為所有的值,不帶分?jǐn)?shù);如:zrange zset1 0 -1 ,結(jié)果為所有的值,不帶分?jǐn)?shù) |
zrange zset1 0 -1 withscores | 結(jié)果為所有的值和分?jǐn)?shù) |
zrangebyscore key 開始score 結(jié)束score | 獲取score值在開始score-結(jié)束score之間的元素 |
zrangebyscore zset1 10 40 | 獲取score值在10-40之間的元素,包含10和40 |
zrangebyscore zset1 10 (40 | 不包含40值;( 的含義是不包含 |
zrangebyscore zset1 (10 (40 | 不包含10,40值 |
zrangebyscore zset1 10 50 limit 2 2 | limit 結(jié)果的起始下標(biāo),獲取的個(gè)數(shù);limit 含義是限制獲取的條數(shù),相當(dāng)于mysql的分頁; |
zrem key 某score下對(duì)應(yīng)的value值 | 刪除元素 |
zcard key | 獲取key對(duì)應(yīng)的值的個(gè)數(shù);注意score 和 value是一個(gè)整體 |
zcount key score區(qū)間 | 獲取分值區(qū)間內(nèi)元素個(gè)數(shù) |
zrank key values值 | 獲得下標(biāo)值 |
zscore key 對(duì)應(yīng)value值 | 獲得value對(duì)應(yīng)分?jǐn)?shù) |
zrevrank key value值 | 逆序獲得對(duì)應(yīng)逆序的下標(biāo)值 |
zrevrange key 起始下標(biāo),結(jié)束下標(biāo) | 將之前順序進(jìn)行倒序 |
zrevrangebyscore key 結(jié)束score 開始score | 根據(jù)score值輸出元素 |
zincrby key 增加分值 value值 | 給對(duì)應(yīng)的值增加score值 |
2、Redis整合
2.1 spring-boot-starter-data-redis 依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
2.2 redis配置
#端口號(hào) server: port: 8096 # redis配置 spring: redis: host: 127.0.0.1 #如果是redis遠(yuǎn)程服務(wù)器,此處redis服務(wù)器ip地址 port: 6379 #默認(rèn)端口 # database: 0 #指定redis數(shù)據(jù)庫,默認(rèn)是0 # password: # 密碼有就寫,沒有就省略
2.3 SpringBoot框架自動(dòng)配置的redisTemplate
2.3.1 清空數(shù)據(jù)庫
//自動(dòng)裝配 SpringBoot框架自動(dòng)配置的redisTemplate @Autowired private RedisTemplate<Object,Object> redisTemplate; //基于SpringBoot框架自動(dòng)配置的redisTemplate,操作redis緩存 //獲取連接 RedisConnection connection = redisTemplate.getConnectionFactory().getConnection(); //清空數(shù)據(jù)庫中的所有數(shù)據(jù) log.info("清空數(shù)據(jù)庫中的所有數(shù)據(jù)"); connection.flushDb();
2.3.2 添加數(shù)據(jù)
//程序中,添加數(shù)據(jù)據(jù)到redis log.info("------ 基于SpringBoot框架自動(dòng)配置的redisTemplate 添加數(shù)據(jù) ------"); redisTemplate.opsForValue().set("kh96_class_name","KGC_KH96"); redisTemplate.opsForValue().set("student_num",19);
2.3.3 獲取數(shù)據(jù)
//程序中,從redis獲取數(shù)據(jù) log.info("------ 基于SpringBoot框架自動(dòng)配置的redisTemplate 獲取數(shù)據(jù) ------"); log.info("****** 根據(jù) 班級(jí)的key:{},獲取班級(jí)名稱:{} ******","kh96_class_name",redisTemplate.opsForValue().get("kh96_class_name")); log.info("****** 根據(jù) 班級(jí)的key:{},獲取班級(jí)人數(shù):{} ******","student_num",redisTemplate.opsForValue().get("student_num"));
2.3.4 修改值 (出現(xiàn)錯(cuò)誤)
//程序中,基于SpringBoot框架自動(dòng)配置的redisTemplate,操作redis緩存,存在問題 //場景:對(duì)班級(jí)人數(shù)進(jìn)行增減操作,比如將班級(jí)人數(shù),增加10 log.info("------ 基于SpringBoot框架自動(dòng)配置的redisTemplate 操作數(shù)據(jù) ------"); redisTemplate.opsForValue().increment("student_num",10); //直接報(bào)錯(cuò),會(huì)報(bào)500異常: redis.clients.jedis.exceptions.JedisDataException: ERR value is not an integer or out of range //原因,通過系統(tǒng)默認(rèn)的 redisTemplate,存放key和value值時(shí),會(huì)自動(dòng)使用Object類的序列化和反序列化,導(dǎo)致redis中真實(shí)存放的數(shù)據(jù)不是原始值,而是序列化后的值
數(shù)據(jù)結(jié)果:
2.4 自定義redisTemplate
2.4.1 fastjson 依賴
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.62</version> </dependency>
2.4.2 自定義redisTemplate 配置類
//Redis自定義配置類,實(shí)現(xiàn)一個(gè)自定義序列化方式的 redisTemplate,提緩緩掉默認(rèn)自動(dòng)配置的 redisTemplate,實(shí)現(xiàn)String類型任意類型的value @Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { // 自定義redisTemplate的模板對(duì)象 RedisTemplate<String, Object> template = new RedisTemplate<>(); // 設(shè)置連接工廠 template.setConnectionFactory(redisConnectionFactory); //由于要通過程序操作遠(yuǎn)程的redis數(shù)據(jù)庫,必須支持序列化,才可以讓程序中的數(shù)據(jù),在網(wǎng)絡(luò)中傳輸 //定義String類型的序列化方式 StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); // 定義fastjson序列化方式,可以序列化任何對(duì)象 FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class); // 需改為新的序列化方式 template.setKeySerializer(stringRedisSerializer); template.setValueSerializer(fastJsonRedisSerializer); template.setHashKeySerializer(stringRedisSerializer); template.setHashValueSerializer(fastJsonRedisSerializer); // 初始化為新的模板 template.afterPropertiesSet(); return template; } }
2.4.3 使用自定義redisTemplate 重新操作數(shù)據(jù)
//自動(dòng)裝配自定義 redisTemplate @Autowired private RedisTemplate<String,Object> redisTemplate; //其他代碼不變
操作結(jié)果:
2.5 自定義redisUtils工具類
2.5.1 自定義redisUtils工具類
---> RedisUtil 工具類
2.5.2 使用自定義redisTemplate和redisUtils工具類
@GetMapping("/testRedisUtils") public String testSpringBootRedisUtils(){ //基于自定義的redisTemplate 和 RedisUtils 工具類,操作redis緩存 //程序中,添加數(shù)據(jù)據(jù)到redis log.info("------ 基于自定義的redisTemplate 和 RedisUtils 工具類 添加數(shù)據(jù) ------"); redisUtils.set("kh96_class_name_utils","KGC_KH96"); redisUtils.set("student_num_utils",19); //程序中,從redis獲取數(shù)據(jù) log.info("------ 基于自定義的redisTemplate 和 RedisUtils 工具類 獲取數(shù)據(jù) ------"); log.info("****** 根據(jù) 班級(jí)的key:{},獲取班級(jí)名稱:{} ******","kh96_class_name_utils",redisUtils.get("kh96_class_name_utils")); log.info("****** 根據(jù) 班級(jí)的key:{},獲取班級(jí)人數(shù):{} ******","student_num_utils",redisUtils.get("student_num_utils")); //程序中,基于SpringBoot框架自動(dòng)配置的redisTemplate,操作redis緩存 //場景:對(duì)班級(jí)人數(shù)進(jìn)行增減操作,比如姜班級(jí)人數(shù),增加10 log.info("------ 基于自定義的redisTemplate 和 RedisUtils 工具類 操作數(shù)據(jù) ------"); redisUtils.incr("student_num_utils",10); return "工具類 RedisUtils 操作 redis 成功!"; }
2.5.3 程序中如何存放對(duì)象到 redis
核心思想:一般都是姜對(duì)象轉(zhuǎn)換為json字符串,存入redis,獲取對(duì)象數(shù)據(jù),就先獲取json字符串,再轉(zhuǎn)換為對(duì)應(yīng)對(duì)象即可;
@GetMapping("/testRedisUtils") public String testSpringBootRedisUtils(){ //程序中如何存放對(duì)象到 redis //核心思想:一般都是姜對(duì)象轉(zhuǎn)換為json字符串,存入redis,獲取對(duì)象數(shù)據(jù),就先獲取json字符串,再轉(zhuǎn)換為對(duì)應(yīng)對(duì)象即可 //模擬用戶登錄成功后,將用戶信息存入redis中,方便后續(xù)從redis中獲取用戶信息 User loginUser = User.builder().userId(1001).userName("KH96").userTel("135012030404").build(); //直接將對(duì)象存入redis即可 log.info("------ 基于自定義的redisTemplate 和 RedisUtils 工具類 存儲(chǔ)對(duì)象 ------"); //自動(dòng)把實(shí)體,通過fastjson的序列化方式,轉(zhuǎn)發(fā)為JSON字符串存儲(chǔ) redisUtils.set(loginUser.getUserId().toString(),loginUser); //模擬獲取登錄用戶信息,直接從redis獲取存入的JSON字符串,轉(zhuǎn)換為目標(biāo)用戶對(duì)象 User realUser = JSON.parseObject(redisUtils.get(loginUser.getUserId().toString()).toString(),User.class); log.info("------ 基于自定義的redisTemplate 和 RedisUtils 工具類獲取對(duì)象:{} ",realUser); return "工具類 RedisUtils 操作 redis 成功!"; }
數(shù)據(jù)結(jié)果:
到此這篇關(guān)于SpringBoot中的Redis 緩存的文章就介紹到這了,更多相關(guān)SpringBoot Redis 緩存內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot整合Redis實(shí)現(xiàn)token緩存
- SpringBoot結(jié)合Redis實(shí)現(xiàn)緩存管理功能
- SpringBoot整合redis使用緩存注解詳解
- SpringBoot+MyBatis+Redis實(shí)現(xiàn)分布式緩存
- springboot使用redis注解做緩存的基本操作方式
- SpringBoot中Redis的緩存更新策略詳解
- springboot整合ehcache和redis實(shí)現(xiàn)多級(jí)緩存實(shí)戰(zhàn)案例
- SpringBoot結(jié)合Redis實(shí)現(xiàn)緩存
- SpringBoot使用Redis實(shí)現(xiàn)分布式緩存
- SpringBoot3.0集成Redis緩存的實(shí)現(xiàn)示例
相關(guān)文章
關(guān)于Mybatis中SQL節(jié)點(diǎn)的深入解析
這篇文章主要給大家介紹了關(guān)于Mybatis中SQL節(jié)點(diǎn)的深入解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-03-03解決Android Studio安裝后運(yùn)行出錯(cuò)dose not...和Internal error...
這篇文章主要介紹了解決Android Studio安裝后運(yùn)行出錯(cuò)dose not...和Internal error...的相關(guān)資料,需要的朋友可以參考下2017-03-03SpringBoot模擬員工數(shù)據(jù)庫并實(shí)現(xiàn)增刪改查操作
這篇文章主要給大家介紹了關(guān)于SpringBoot模擬員工數(shù)據(jù)庫并實(shí)現(xiàn)增刪改查操作的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-09-09Java線程中synchronized和volatile關(guān)鍵字的區(qū)別詳解
這篇文章主要介紹了Java線程中synchronized和volatile關(guān)鍵字的區(qū)別詳解,synchronzied既能夠保障可見性,又能保證原子性,而volatile只能保證可見性,無法保證原子性,volatile不需要加鎖,比synchronized更輕量級(jí),不會(huì)阻塞線程,需要的朋友可以參考下2024-01-01舉例講解Java設(shè)計(jì)模式編程中Decorator裝飾者模式的運(yùn)用
這篇文章主要介紹了Java設(shè)計(jì)模式編程中Decorator裝飾者模式的運(yùn)用,裝飾者模式就是給一個(gè)對(duì)象動(dòng)態(tài)的添加新的功能,裝飾者和被裝飾者實(shí)現(xiàn)同一個(gè)接口,裝飾者持有被裝飾者的實(shí)例,需要的朋友可以參考下2016-05-05java序列化對(duì)象根據(jù)不同配置動(dòng)態(tài)改變屬性名的方法
本文主要介紹了java序列化對(duì)象根據(jù)不同配置動(dòng)態(tài)改變屬性名的方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05Java 中文字符按Unicode排序的實(shí)現(xiàn)方法
這篇文章主要介紹了Java 中文字符按Unicode排序的實(shí)現(xiàn)方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-10-10Java/Spring項(xiàng)目的包開頭為什么是com詳解
這篇文章主要介紹了Java/Spring項(xiàng)目的包開頭為什么是com的相關(guān)資料,在Java中包命名遵循域名反轉(zhuǎn)規(guī)則,即使用公司的域名反轉(zhuǎn)作為包的前綴,以確保其全球唯一性和避免命名沖突,這種規(guī)則有助于邏輯分層、代碼可讀性提升和標(biāo)識(shí)代碼來源,需要的朋友可以參考下2024-10-10