日韩精品欧美激情国产一区_中文无码精品一区二区三区在线_岛国毛片AV在线无码不卡_亞洲歐美日韓精品在線_使劲操好爽好粗视频在线播放_日韩一区欧美二区_八戒八戒网影院在线观看神马_亚洲怡红院在线色网_av无码不卡亚洲电影_国产麻豆媒体MDX

Spring Boot 集成 Redis

時(shí)間:2022-10-13 11:13:47 類(lèi)型:JAVA
字號(hào):    

 Spring Boot 集成 Redis

3.1 依賴(lài)導(dǎo)入

Spring Boot 集成 redis 很方便,只需要導(dǎo)入一個(gè) redis 的 starter 依賴(lài)即可。如下:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--阿里巴巴fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.35</version>
</dependency>

這里也導(dǎo)入阿里巴巴的 fastjson 是為了在后面我們要存一個(gè)實(shí)體,為了方便把實(shí)體轉(zhuǎn)換成 json 字符串存進(jìn)去。

3.2 Redis 配置

     導(dǎo)入了依賴(lài)之后,我們?cè)?application.yml 文件里配置 redis:

spring:
    #redis相關(guān)配置
    redis:
      database: 5
      # 配置redis的主機(jī)地址,需要修改成自己的
      host: 127.0.0.1
      port: 6379
      password: 123456
      timeout: 5000
      jedis:
        pool:
          # 連接池中的最大空閑連接,默認(rèn)值也是8。
          max-idle: 500
          # 連接池中的最小空閑連接,默認(rèn)值也是0。
          min-idle: 50
          # 如果賦值為-1,則表示不限制;如果pool已經(jīng)分配了maxActive個(gè)jedis實(shí)例,則此時(shí)pool的狀態(tài)為exhausted(耗盡)
          max-active: 1000
          # 等待可用連接的最大時(shí)間,單位毫秒,默認(rèn)值為-1,表示永不超時(shí)。如果超過(guò)等待時(shí)間,則直接拋出JedisConnectionException
          max-wait: 2000

3.3 常用 api 介紹

    Spring Boot 對(duì) redis 的支持已經(jīng)非常完善了,豐富的 api 已經(jīng)足夠我們?nèi)粘5拈_(kāi)發(fā),這里我介紹幾個(gè)最常用的供大家學(xué)習(xí),其他 api 希望大家自己多學(xué)習(xí),多研究。用到會(huì)去查即可。

    有兩個(gè) redis 模板:RedisTemplate 和 StringRedisTemplate。

    我們不使用 RedisTemplate,RedisTemplate 提供給我們操作對(duì)象,操作對(duì)象的時(shí)候,我們通常是以 json 格式存儲(chǔ),但在存儲(chǔ)的時(shí)候,會(huì)使用 Redis 默認(rèn)的內(nèi)部序列化器;導(dǎo)致我們存進(jìn)里面的是亂碼之類(lèi)的東西。當(dāng)然了,我們可以自己定義序列化,但是比較麻煩,所以使用 StringRedisTemplate 模板。

    StringRedisTemplate 主要給我們提供字符串操作,我們可以將實(shí)體類(lèi)等轉(zhuǎn)成 json 字符串即可,在取出來(lái)后,也可以轉(zhuǎn)成相應(yīng)的對(duì)象,這就是上面我導(dǎo)入了阿里 fastjson 的原因。

3.3.1 redis:string 類(lèi)型

新建一個(gè) RedisService,注入 StringRedisTemplate,使用 stringRedisTemplate.opsForValue()

可以獲取 ValueOperations<String, String> 對(duì)象,通過(guò)該對(duì)象即可讀寫(xiě) redis 數(shù)據(jù)庫(kù)了。如下:

public class RedisService {
    @Resource
    private StringRedisTemplate stringRedisTemplate;
    /**
          * set redis: string類(lèi)型
          * @param key key
          * @param value value
    */
    public void setString(String key, String value){
        ValueOperations<String, String> valueOperations = stringRedisTemplate.opsForValue();
        valueOperations.set(key, value);
    }
    /**
         * get redis: string類(lèi)型
         * @param key key
         * @return
     */
    public String getString(String key){
        return stringRedisTemplate.opsForValue().get(key);
    }
}

該對(duì)象操作的是 string,我們也可以存實(shí)體類(lèi),只需要將實(shí)體類(lèi)轉(zhuǎn)換成 json 字符串即可。下面來(lái)測(cè)試一下:

@RestController
@RequestMapping("/redis")
public class RedisController {
    private static final Logger logger =
            LoggerFactory.getLogger(RedisController.class);

    @Resource
    private RedisService redisService;
    @RequestMapping("/setString")
    public String setString(){
        //測(cè)試redis的string類(lèi)型
        redisService.setString("qq","88888888");
        logger.info("我的qq號(hào)為:{}", redisService.getString("qq"));
// 如果是個(gè)實(shí)體,我們可以使用json工具轉(zhuǎn)成json字符串,
        User user = new User(1l,"?子", "123456");
        redisService.setString("userInfo", JSON.toJSONString(user));

        return "success";
    }
}

3.3.2 redis:hash 類(lèi)型

hash 類(lèi)型其實(shí)原理和 string 一樣的,但是有兩個(gè) key,使用 stringRedisTemplate.opsForHash()可以獲取HashOperations<String, Object, Object> 對(duì)象。比如我們要存儲(chǔ)訂單信息,所有訂單信息都放在 order 下,針對(duì)不同用戶(hù)的訂單實(shí)體,可以通過(guò)用戶(hù)的 id 來(lái)區(qū)分,這就相當(dāng)于兩個(gè) key了。

@Service
public class RedisService {
@Resource
private StringRedisTemplate stringRedisTemplate;
/**
* set redis: hash類(lèi)型
* @param key key
* @param filedKey filedkey
* @param value value
*/
    public void setHash(String key, String filedKey, String value){
        HashOperations<String, Object, Object> hashOperations =
        stringRedisTemplate.opsForHash();
        hashOperations.put(key,filedKey, value);
    }
    /**
    * get redis: hash類(lèi)型
    * @param key key
    * @param filedkey filedkey
    * @return
    */
    public String getHash(String key, String filedkey){
        return (String) stringRedisTemplate.opsForHash().get(key, filedkey);
    }
}

測(cè)試一下:

User user = new User(1l,"莊子", "123456");
//測(cè)試redis的hash類(lèi)型
redisService.setHash("user", "name", JSON.toJSONString(user));
logger.info("用戶(hù)姓名:{}", redisService.getHash("user","name"));

3.3.3 redis:list 類(lèi)型

使用 stringRedisTemplate.opsForList() 可以獲取 ListOperations<String, String>

listOperations redis 列表對(duì)象,該列表是個(gè)簡(jiǎn)單的字符串列表,可以支持從左側(cè)添加,也可以支持

從右側(cè)添加,一個(gè)列表最多包含 2 ^ 32 -1 個(gè)元素

public class RedisService {
@Resource
    private StringRedisTemplate stringRedisTemplate;
    /**
    * set redis:list類(lèi)型
    * @param key key
    * @param value value
    * @return
    */
    public long setList(String key, String value){
        ListOperations<String, String> listOperations =
        stringRedisTemplate.opsForList();
        return listOperations.leftPush(key, value);
    }
    /**
    * get redis:list類(lèi)型
    * @param key key
    * @param start start
    * @param end end
    * @return
    */
    public List<String> getList(String key, long start, long end){
        return stringRedisTemplate.opsForList().range(key, start, end);
    }
}

可以看出,這些 api 都是一樣的形式,方便記憶也方便使用。具體的 api 細(xì)節(jié)我就不展開(kāi)了,大家可以

自己看 api 文檔。其實(shí),這些 api 根據(jù)參數(shù)和返回值也能知道它們是做什么用的。來(lái)測(cè)試一下:

//測(cè)試redis的list類(lèi)型
redisService.setList("list", "football");
redisService.setList("list", "basketball");
List<String> valList = redisService.getList("list",0,-1);
for(String value :valList){
    logger.info("list中有:{}", value);
}


<