欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot中的Redis?緩存問題及操作方法

 更新時(shí)間:2022年10月19日 10:12:59   作者:化羽羽  
這篇文章主要介紹了SpringBoot中的Redis?緩存,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

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 2limit 結(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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于Mybatis中SQL節(jié)點(diǎ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...

    這篇文章主要介紹了解決Android Studio安裝后運(yùn)行出錯(cuò)dose not...和Internal error...的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • SpringBoot模擬員工數(shù)據(jù)庫并實(shí)現(xiàn)增刪改查操作

    SpringBoot模擬員工數(shù)據(jù)庫并實(shí)現(xiàn)增刪改查操作

    這篇文章主要給大家介紹了關(guān)于SpringBoot模擬員工數(shù)據(jù)庫并實(shí)現(xiàn)增刪改查操作的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-09-09
  • Arrays.asList方法總結(jié)

    Arrays.asList方法總結(jié)

    本文主要對(duì)Arrays.asList方法進(jìn)行總結(jié)。具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-02-02
  • Java線程中synchronized和volatile關(guān)鍵字的區(qū)別詳解

    Java線程中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)用

    這篇文章主要介紹了Java設(shè)計(jì)模式編程中Decorator裝飾者模式的運(yùn)用,裝飾者模式就是給一個(gè)對(duì)象動(dòng)態(tài)的添加新的功能,裝飾者和被裝飾者實(shí)現(xiàn)同一個(gè)接口,裝飾者持有被裝飾者的實(shí)例,需要的朋友可以參考下
    2016-05-05
  • MyBatis?Generator使用小結(jié)

    MyBatis?Generator使用小結(jié)

    本文主要介紹了MyBatis?Generator使用小結(jié),它能夠根據(jù)數(shù)據(jù)庫表,自動(dòng)生成java實(shí)體類、dao層接口及mapper.xml文件,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11
  • java序列化對(duì)象根據(jù)不同配置動(dòng)態(tài)改變屬性名的方法

    java序列化對(duì)象根據(jù)不同配置動(dòng)態(tài)改變屬性名的方法

    本文主要介紹了java序列化對(duì)象根據(jù)不同配置動(dòng)態(tài)改變屬性名的方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Java 中文字符按Unicode排序的實(shí)現(xiàn)方法

    Java 中文字符按Unicode排序的實(shí)現(xiàn)方法

    這篇文章主要介紹了Java 中文字符按Unicode排序的實(shí)現(xiàn)方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-10-10
  • Java/Spring項(xiàng)目的包開頭為什么是com詳解

    Java/Spring項(xiàng)目的包開頭為什么是com詳解

    這篇文章主要介紹了Java/Spring項(xiàng)目的包開頭為什么是com的相關(guān)資料,在Java中包命名遵循域名反轉(zhuǎn)規(guī)則,即使用公司的域名反轉(zhuǎn)作為包的前綴,以確保其全球唯一性和避免命名沖突,這種規(guī)則有助于邏輯分層、代碼可讀性提升和標(biāo)識(shí)代碼來源,需要的朋友可以參考下
    2024-10-10

最新評(píng)論