最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot如何使用redis

 更新時間:2025年03月10日 10:02:55   作者:今天的接口寫完了嗎?  
文章主要介紹了如何在Spring Boot項目中配置Redis并解決亂碼問題,同時提供了使用Redis操作不同類型數據(如String、List、Hash、Set、ZSet和Bitmap)的代碼示例

一、pom.xml

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
 </dependencies>

二、application.properties

# Redis服務器地址
spring.redis.host=192.168.11.84
# Redis服務器連接端口
spring.redis.port=6379
# Redis服務器連接密碼(默認為空)
spring.redis.password=
# Redis數據庫索引(默認為0) 共15個
spirng.redis.database=0
## 連接超時時間(毫秒)
spring.redis.timout=30000
# 連接池最大連接數(使用負值表示沒有限制) 默認 8
spring.redis.lettuce.pool.max-active=8
# 連接池中的最大空閑連接 默認 8
spring.redis.lettuce.pool.max-idle=8
# 連接池中的最小空閑連接 默認 0
spring.redis.lettuce.pool.min-idle=1
#連接池中最大空閑等待時間,3s沒有活干的時候直接驅逐該鏈接
spring.redis.lettuce.pool.min-evicate-idle-time-millis=3000
# 連接池最大阻塞等待時間(使用負值表示沒有限制) 默認 -1
spring.redis.lettuce.pool.max-wait=-1

三、編寫一個配置類用于解決亂碼問題和對象真實的類型問題

package com.by.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.net.UnknownHostException;

@Configuration
public class RedisConfig {
    @Bean
    @ConditionalOnMissingBean(name = "redisTemplate")
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
            throws UnknownHostException {
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
        // key序列化方式
        template.setKeySerializer(StringRedisSerializer.UTF_8);
        //Jackson2JsonRedisSerializer 序列化方式 來代替自來的jdk序列化方式,因為后者會亂碼
        Jackson2JsonRedisSerializer jack = new Jackson2JsonRedisSerializer(Object.class);
        template.setValueSerializer(jack);
        template.setHashKeySerializer(StringRedisSerializer.UTF_8);
        template.setHashValueSerializer(jack);
        /**
         * 使用objeck設置對象的類型為真實的對象類型 而不是hsash
         */
        ObjectMapper mapper=new ObjectMapper();
        // 啟用默認類型推理,將類型信息作為屬性寫入JSON
        // 就是把對象的全類名寫入json
        mapper.activateDefaultTyping(mapper.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL);
         // 將類型的信息作為屬性傳給json
        jack.setObjectMapper(mapper);
        return template;
    }
}

四、代碼案例

4.1 model 準備 因為有可能存對象

  • Student.java
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Student implements Serializable {
   private Integer id;
   private String name;
}
  • Product.java
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Product implements Serializable {
    private Integer id;
    private String name;
}

4.2 使用redis 操作string

@Slf4j
@SpringBootTest
class StringTest {
    /**
     * 使用redis 操作string
     */
    @Autowired
    private StringRedisTemplate str;
    // 自動序列化,用 @Autowired報錯
    @Resource(name ="redisTemplate")
    private RedisTemplate<String,Student> redisTemplate;
    private  final  String key ="zhouxingxing";

    /**
     * 將對象序列化 不用手動將對象轉成字符串
     */
    @Test
    void m8() {
        // jdk 序列化
        Student student = Student.builder().id(1).name("張三").build();
//        JdkSerializationRedisSerializer serializer =new JdkSerializationRedisSerializer();
//        byte[] serialize = serializer.serialize(student);
//        String s=new String(serialize);
        // s亂碼
        redisTemplate.opsForValue().set("student", student);
        Student student1 =  redisTemplate.opsForValue().get("student");
        System.out.println(student1.getName());

    }
    /**
     * string里的get set 方法
     */
    @Test
    void m1() {
        str.opsForValue().set("xiaolong", "帥呆了");
        String xiaolong = str.opsForValue().get("xiaolong");
        log.info("xiaolong:{}", xiaolong);
    }

    /**
     * string里的strlen 方法
     * append 方法:追加字符串
     */
    @Test
    void m2() {
        str.opsForValue().set("xiaolong", "帥呆了");
        String xiaolong = str.opsForValue().get("xiaolong");
        log.info("xiaolong:{}", xiaolong);
        // 追加字符串
        str.opsForValue().append("xiaolong", "哈哈");
        // 獲取長度
        Long size = str.opsForValue().size("xiaolong");
        log.info("長度為:{}", size);//15
    }

    /**
     * string里的incr 方法
     * incrBy 方法:增加指定值
     */
    @Test
    void m3() {
        str.opsForValue().set("xiaolong", "100");
        Long xiaolong = str.opsForValue().decrement("xiaolong", 2);
        log.info("xiaolong:{}", xiaolong); //98
    }

    /**
     * 將student 對象存到redis 里
     * JSONUtil.toJsonStr(對象)--->將對象轉成序列化的json字符串
     */
    @Test
    void m4() {
        Student student = Student.builder().id(1).name("張三").build();
        str.opsForValue().set("student", JSONUtil.toJsonStr(student));
        log.info("student:{}", str.opsForValue().get("student"));//student:{"id":1,"name":"張三"}
    }
    @Test
    public void m7() {
        str.opsForHash().put(key,"20220325","鄭州");
        str.opsForHash().put(key,"20220326","洛陽");
        // 拿到所有小key的值
        List<Object> values = str.opsForHash().values(key);
        for (Object value : values) {
            System.out.println(value);
        }
    }

4.3 使用redis 操作list

@SpringBootTest
@Slf4j
public class ListTest {
    @Autowired
    private StringRedisTemplate redisTemplate;
    private final String key = "xiaolong";
    /**
     * 給list左推元素和又推元素
     * 從右方刪除元素并返回刪除的元素
     */
    @Test
    void m1() {
        redisTemplate.opsForList().leftPush(key, "g1");
        redisTemplate.opsForList().leftPush(key, "g2");
        redisTemplate.opsForList().leftPush(key, "g3");
        redisTemplate.opsForList().rightPush(key, "g4");//順序為 g3 g2 g1 g4
        // 從右邊刪除元素 并返回刪除的元素
        String s = redisTemplate.opsForList().rightPop(key);
        log.info("刪除元素為:{}", s);// g4
    }

    @Test
    public void m2() {
        List<Object> obj = redisTemplate.executePipelined((RedisCallback<Object>) connection -> {
            //隊列沒有元素會阻塞操作,直到隊列獲取新的元素或超時
            return connection.bLPop(600, "list1".getBytes());
        }, new StringRedisSerializer());
        for (Object str : obj) {
            System.out.println(str);
        }
    }

4.4 使用redis 操作hash

@Slf4j
@SpringBootTest
public class HashTest {
    @Autowired
    private StringRedisTemplate redisTemplate;
    // 自動序列化
    @Resource(name ="redisTemplate")
    private RedisTemplate<String, Student> redisTemplate1;
    // 設置大key
    private final String key = "xiaolong";
    @Test
     void m10() {
        Student student = Student.builder().id(1).name("張三").build();
        redisTemplate1.opsForHash().put(key, "g1", student);
        Object o = redisTemplate1.opsForHash().get(key, "g1");
    }
 // 設置商品黑名單
    @Test
    public void m9() {
        Product p1 = Product.builder().id(1).name("華為").build();
        Product p2 = Product.builder().id(2).name("小米").build();
        redisTemplate1.opsForHash().put("黑名單","名單列表1",p1);
        redisTemplate1.opsForHash().put("黑名單","名單列表2",p2);
    }

    /**
     * 獲取大key里所有小key的值
     */
    @Test
    public void m1() {
        redisTemplate.opsForHash().put(key, "g1", "小芳");
        redisTemplate.opsForHash().put(key, "g2", "小紅");
        // 拿到所有小key的值
        List<Object> values = redisTemplate.opsForHash().values(key);
        for (Object value : values) {
            log.info("所有小key的值為:"+value);
        }
    }

4.5 使用redis 操作set

@SpringBootTest
@Slf4j
public class SetTest {
  @Autowired
   private StringRedisTemplate redisTemplate;
   private final String xiaoming = "xiaoming";
   private final String xiaohong = "xiaohong";
  @Test// 交集
    void m1()
    {
        // 添加小明同學感興趣的學科
        redisTemplate.opsForSet().add(xiaoming, "語文", "數學","物理");
        // 添加小紅同學感興趣的學科
        redisTemplate.opsForSet().add(xiaohong, "語文", "英語");
        // 獲取兩位同學共同感興趣的學科
        Set<String> tong = redisTemplate.opsForSet().intersect(xiaohong, xiaoming);
        for (String s : tong) {
           log.info("小明和小紅共同感興趣的學科為:"+s);// 語文
        }
    }
    @Test//并集
    void m2()
    {
        // 添加小明同學感興趣的學科
        redisTemplate.opsForSet().add(xiaoming, "語文", "數學","物理");
        // 添加小紅同學感興趣的學科
        redisTemplate.opsForSet().add(xiaohong, "語文", "英語");
        // 獲取兩位同學共同感興趣的學科
        Set<String> tong = redisTemplate.opsForSet().union(xiaohong, xiaoming);
        for (String s : tong) {
            log.info("小明和小紅共同感興趣的學科為:"+s);// 語文
        }
    }

4.6 使用redis 操作zset

@SpringBootTest
@Slf4j
public class ZsetTest {
    @Autowired
    private StringRedisTemplate redisTemplate;
    @Resource(name = "redisTemplate")
    private RedisTemplate<String, Integer> redisTemplate1;
    private String key = "xiaolong";
    /**
     * zset有序集合唯一 去重 適用于今日頭條和熱搜
     * 給xiaolong 添加三門得成績
     */
    @Test
    public void m1() {
        redisTemplate.opsForZSet().add(key, "語文", 90);
        redisTemplate.opsForZSet().add(key, "數學", 100);
        redisTemplate.opsForZSet().add(key, "英語", 80);
        Long aLong = redisTemplate.opsForZSet().zCard(key);
        log.info("{科目數量為:}", aLong);
        // 獲取xiaolong的最高分 spring 沒有給我們封裝
        redisTemplate.execute(new RedisCallback<Object>() {
            @Override
            public Object doInRedis(RedisConnection connection) throws DataAccessException {
                return connection.bLPop(5, key.getBytes());
            }
        });
    }

4.7 Redis 操作BitMap

@Component
public class BitMapDemo {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    private final  String key ="sign#2022#zhouxingxing";
    public void test(){
       //設置簽到
        stringRedisTemplate.opsForValue().setBit(key,2,true);
        stringRedisTemplate.opsForValue().setBit(key,85,true);
        //獲取周星星同學的簽到天數
        RedisCallback<Long> callback = connection -> { return  connection.bitCount(key.getBytes(),0,365);};
        Long count = stringRedisTemplate.execute(callback);
        //打印周星星2022年簽到天數
        System.out.println("周星星2022年一共簽到天數:"+count);
    }
}

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java JVM調優(yōu)五大技能詳解

    Java JVM調優(yōu)五大技能詳解

    這篇文章主要為大家介紹了JVM調優(yōu)的五大技能,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • springboot項目啟動后執(zhí)行方法的三種方式

    springboot項目啟動后執(zhí)行方法的三種方式

    有時項目需求,需要項目啟動的時候向數據庫中查詢一下系統(tǒng)屬性,或者需要加載某個特定的方法,下面這篇文章主要給大家介紹了關于springboot項目啟動后執(zhí)行方法的三種方式,需要的朋友可以參考下
    2022-06-06
  • springboot controller參數注入方式

    springboot controller參數注入方式

    這篇文章主要介紹了springboot controller參數注入方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Spring Boot集成MinIO進行文件存儲和管理的詳細步驟

    Spring Boot集成MinIO進行文件存儲和管理的詳細步驟

    這篇文章主要介紹了Spring Boot集成MinIO進行文件存儲和管理的詳細步驟,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2025-04-04
  • Java之ThreadPoolExecutor類詳解

    Java之ThreadPoolExecutor類詳解

    這篇文章主要介紹了Java之ThreadPoolExecutor類詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08
  • 5分鐘快速學會spring boot整合JdbcTemplate的方法

    5分鐘快速學會spring boot整合JdbcTemplate的方法

    這篇文章主要給大家介紹了如何通過5分鐘快速學會spring boot整合JdbcTemplate的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用spring boot整合JdbcTemplate具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-12-12
  • MyBatis-Plus的物理刪除和邏輯刪除(使用場景)

    MyBatis-Plus的物理刪除和邏輯刪除(使用場景)

    數據庫中的數據刪除會分為兩種:物理刪除 和 邏輯刪除,接下來通過本文給大家介紹MyBatis-Plus的物理刪除和邏輯刪除使用場景分析,感興趣的朋友一起看看吧
    2021-09-09
  • Spring?Data?JPA框架快速入門之自定義Repository接口

    Spring?Data?JPA框架快速入門之自定義Repository接口

    Spring?Data?JPA是Spring基于JPA規(guī)范的基礎上封裝的?套?JPA?應?框架,可使開發(fā)者?極簡的代碼即可實現對數據庫的訪問和操作,本篇我們來了解Spring?Data?JPA框架的自定義Repository接口
    2022-04-04
  • SpringBoot整合Web之AOP配置詳解

    SpringBoot整合Web之AOP配置詳解

    面向切面編程(aspect-oriented programming,AOP)主要實現的目的是針對業(yè)務處理過程中的切面進行提取,諸如日志、事務管理和安全這樣的系統(tǒng)服務,從而使得業(yè)務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發(fā)的效率
    2022-08-08
  • Java中的Feign深入分析

    Java中的Feign深入分析

    這篇文章主要介紹了Java中的Feign深入分析,Feign是一個用于發(fā)送HTTP請求的工具,它的主要作用是在不同的服務之間傳遞Token,為了使用Feign,你需要在項目中配置一個Feign的配置類,需要的朋友可以參考下
    2023-09-09

最新評論

陵水| 论坛| 新营市| 吴忠市| 新密市| 健康| 明光市| 汉中市| 磐石市| 永仁县| 台安县| 呼和浩特市| 报价| 应城市| 宜宾市| 阿拉尔市| 新乐市| 宣武区| 玉田县| 赤城县| 都匀市| 尼木县| 定结县| 凯里市| 秦安县| 靖边县| 浪卡子县| 白山市| 邢台市| 乌海市| 轮台县| 汝阳县| 喀什市| 江川县| 武鸣县| 红安县| 中西区| 九寨沟县| 云浮市| 桃园县| 全椒县|