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

Redis?Java客戶端建立的兩種方式小結(jié)

 更新時(shí)間:2025年04月07日 09:34:43   作者:Calvad0s  
Redis具有快速讀取數(shù)據(jù)的能力,將經(jīng)常訪問的數(shù)據(jù)緩存到Redis中,可以減輕數(shù)據(jù)庫的壓力,本文主要介紹了Redis?Java客戶端建立的兩種方式小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下

第一種方式:Jedis方式

(1)引入依賴

<!--jedis-->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.7.0</version>
</dependency>
<!--單元測試-->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>5.7.0</version>
    <scope>test</scope>
</dependency>

(2)創(chuàng)建工廠類

public class JedisConnectionFactory {

    private static final JedisPool jedisPool;

    static {
        //配置連接池
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        //最大連接數(shù),也就是線程池最多可以創(chuàng)建8個(gè)連接
        poolConfig.setMaxTotal(8);
        //最大空閑連接
        poolConfig.setMaxIdle(8);
        //最小空閑連接,超過一段時(shí)間后,如果一直沒有人訪問,空閑連接就會被釋放,直到為0為止
        poolConfig.setMinIdle(0);
        //最大等待時(shí)間,如果超過1000毫秒,則報(bào)錯(cuò)
        poolConfig.setMaxWaitMillis(1000);
        //創(chuàng)建連接池對象
        jedisPool = new JedisPool(poolConfig,
                "127.0.0.1",6379,1000,"123456");
    }

    public static Jedis getJedis(){
        return jedisPool.getResource();
    }

}

(3)創(chuàng)建Junit測試類

public class JedisTest {

    private Jedis jedis;

    @BeforeEach
    void setUp(){
        //建立連接
        jedis = JedisConnectionFactory.getJedis();
        //選擇庫
        jedis.select(0);
    }

    @Test
    void testString() {
        //存入數(shù)據(jù)
        String result = jedis.set("name", "Jack");
        System.out.println("result = " + result);
        // 獲取數(shù)據(jù)
        String name = jedis.get("name");
        System.out.println("name = " + name);
    }

    @AfterEach
    void tearDown() {
        if (jedis != null) {
            jedis.close();
        }
    }

}

第二種方式:SpringDataRedis

SpringData是Spring中數(shù)據(jù)操作的模塊,包含對各種數(shù)據(jù)庫的集成,其中對Redis的集成模塊就叫做SpringDataRedis。

  • 提供了對不同Redis客戶端的整合(Lettuce和Jedis)
  • 提供了RedisTemplate統(tǒng)一API來操作Redis
  • 支持Redis的發(fā)布訂閱模型
  • 支持Redis哨兵和Redis集群
  • 支持基于Lettuce的響應(yīng)式編程
  • 支持基于JDK.JSON.字符串.Spring對象的數(shù)據(jù)序列化及反序列化
  • 支持基于Redis的JDKCollection實(shí)現(xiàn)

(1)創(chuàng)建SpringBoot項(xiàng)目,選擇場景啟動(dòng)器

(2)引入依賴

<!--common-pool-->
<dependency>
	<groupId>org.apache.commons</groupId>
	<artifactId>commons-pool2</artifactId>
</dependency>
<!--Jackson依賴-->
<dependency>
	<groupId>com.fasterxml.jackson.core</groupId>
	<artifactId>jackson-databind</artifactId>
</dependency>

(3)配置application.yml

spring:
  redis:
    host: 127.0.0.1
    port: 6379
    password: 123456
    lettuce:
      pool:
        max-active: 8  #最大連接
        max-idle: 8   #最大空閑連接
        min-idle: 0   #最小空閑連接
        max-wait: 100ms #連接等待時(shí)間

(4)編寫測試類

@SpringBootTest
class SpringdataredisDemoApplicationTests {

    @Resource
    private RedisTemplate redisTemplate;

    @Test
    void testString() {
        redisTemplate.opsForValue().set("name","Tom");
        Object name = redisTemplate.opsForValue().get("name");
        System.out.println(name); //Tom
    }

}

(5)序列化引起的問題

我們這時(shí)可能會發(fā)現(xiàn)一個(gè)問題,那就是我可以在Java代碼中set和get,取值都沒問題。但我如果在代碼中set,在命令端get,就會出現(xiàn)一堆看不懂的二進(jìn)制,如下:

原因:RedisTemplate可以接收任意Object作為值寫入Redis,只不過寫入前會把Object序列化為字節(jié)形式,key也會被序列化為字節(jié)形式,默認(rèn)是采用JDK序列化。 

因?yàn)檫@種序列化方式一是我們讀不懂,二是內(nèi)存占用較大。

所以我們要修改序列化方式,采用自定義的方式。

(6)創(chuàng)建自定義序列化配置類

@Configuration
public class RedisConfig {

    @Bean
    @Resource
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory){
        // 創(chuàng)建RedisTemplate對象
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        // 設(shè)置連接工廠
        template.setConnectionFactory(connectionFactory);
        // 創(chuàng)建JSON序列化工具
        GenericJackson2JsonRedisSerializer jsonRedisSerializer =
                new GenericJackson2JsonRedisSerializer();
        // 設(shè)置Key的序列化
        template.setKeySerializer(RedisSerializer.string());
        template.setHashKeySerializer(RedisSerializer.string());
        // 設(shè)置Value的序列化
        template.setValueSerializer(jsonRedisSerializer);
        template.setHashValueSerializer(jsonRedisSerializer);
        // 返回
        return template;
    }
}

(7)運(yùn)行測試類

我們發(fā)現(xiàn)不管是key還是value,都已經(jīng)被我們自定義序列化。

(8)測試一下對象存儲

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private String name;
    private Integer age;
}
@Test
void testSaveUser(){
	redisTemplate.opsForValue().set("user:1",new User("Uzi",21));
	User user = (User) redisTemplate.opsForValue().get("user:1");
	System.out.println(user);
}

注意:盡管JSON序列化可以滿足我們的需求,但仍然存在一些問題,如上圖,除了我們set的數(shù)據(jù)以外,還有個(gè)@class,這是一筆不小的內(nèi)存開銷啊,那么有方法可以解決嗎?

解決辦法:使用StringRedisTemplate

為了節(jié)省內(nèi)存空間,我們并不會使用JSON序列化器來處理value,而是統(tǒng)一使用String序列化器,要求只能存儲String類型的key和value。當(dāng)需要存儲Java對象時(shí),手動(dòng)完成對象的序列化和反序列化。

(9)新建測試類,使用StringRedisTemplate

@SpringBootTest
public class RedisStringTests {

    @Resource
    private StringRedisTemplate stringRedisTemplate;
    
    //用來手動(dòng)序列化和反序列化,需引入Jackson包
    private static final ObjectMapper mapper = new ObjectMapper();

    @Test
    void testString() {
        stringRedisTemplate.opsForValue().set("name","Tom");
        Object name = stringRedisTemplate.opsForValue().get("name");
        System.out.println(name);
    }

    @Test
    void testSaveUser() throws JsonProcessingException {
        User user = new User("Uzi",21);
        //手動(dòng)序列化
        String json = mapper.writeValueAsString(user);
        stringRedisTemplate.opsForValue().set("user:1",json);
        String jsonUser = stringRedisTemplate.opsForValue().get("user:1");
        //手動(dòng)反序列化
        User user1 = mapper.readValue(jsonUser, User.class);
        System.out.println(user1);
    }
}

到此這篇關(guān)于Redis Java客戶端建立的兩種方式小結(jié)的文章就介紹到這了,更多相關(guān)Redis Java客戶端建立內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中GC與四種引用的關(guān)系詳解

    Java中GC與四種引用的關(guān)系詳解

    這篇文章主要介紹了Java中GC與四種引用的關(guān)系詳解,Java 中一共有 4 種類型的引用 : StrongReference、 SoftReference、 WeakReference 以及 PhantomReference這 4 種類型的引用與 GC 有著密切的關(guān)系, 讓我們逐一來看它們的定義和使用場景,需要的朋友可以參考下
    2023-09-09
  • MyBatis-Plus實(shí)現(xiàn)優(yōu)雅處理JSON字段映射

    MyBatis-Plus實(shí)現(xiàn)優(yōu)雅處理JSON字段映射

    默認(rèn)情況下,MyBatis-Plus 是不支持直接映射 JSON 類型的,這時(shí)候就需要借助其他的方法,下面小編就來和大家講講MyBatis-Plus如何優(yōu)雅處理JSON字段映射吧
    2025-04-04
  • springboot增加注解緩存@Cacheable的實(shí)現(xiàn)

    springboot增加注解緩存@Cacheable的實(shí)現(xiàn)

    這篇文章主要介紹了springboot增加注解緩存@Cacheable的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java中的ByteArrayInputStream詳解

    Java中的ByteArrayInputStream詳解

    Java中,ByteArrayInputStream類是實(shí)現(xiàn)內(nèi)存級別的字節(jié)流讀取的工具,可以從字節(jié)數(shù)組中讀取數(shù)據(jù),這個(gè)類位于java.io包中,繼承自InputStream,ByteArrayInputStream的主要特點(diǎn)有:在內(nèi)存中操作,不涉及磁盤IO,可以重用流讀取數(shù)據(jù)
    2024-09-09
  • Spring事務(wù)失效場景實(shí)例詳解

    Spring事務(wù)失效場景實(shí)例詳解

    實(shí)際項(xiàng)目開發(fā)中,如果涉及到多張表操作時(shí),為了保證業(yè)務(wù)數(shù)據(jù)的一致性,大家一般都會采用事務(wù)機(jī)制,好多小伙伴可能只是簡單了解一下,遇到事務(wù)失效的情況,便會無從下手,下面這篇文章主要給大家介紹了關(guān)于Spring事務(wù)失效場景的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • SpringCloud中的Eureka集群配置方法

    SpringCloud中的Eureka集群配置方法

    這篇文章主要介紹了SpringCloud中的Eureka集群配置,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • SpringCloud Gateway使用詳解

    SpringCloud Gateway使用詳解

    Spring Cloud Gateway是一個(gè)基于Spring Boot 2.x和Spring WebFlux的API網(wǎng)關(guān),可以幫助我們構(gòu)建微服務(wù)架構(gòu)中的統(tǒng)一入口。感興趣的同學(xué)可以參考一下
    2023-04-04
  • SpringBoot淺析緩存機(jī)制之Ehcache?2.x應(yīng)用

    SpringBoot淺析緩存機(jī)制之Ehcache?2.x應(yīng)用

    EhCache?是一個(gè)純Java的進(jìn)程內(nèi)緩存框架,具有快速、精干等特點(diǎn)。它是Hibernate中的默認(rèn)緩存框架。Ehcache已經(jīng)發(fā)布了3.1版本。但是本文的講解基于2.x版本
    2022-08-08
  • 有關(guān)tomcat內(nèi)存溢出的完美解決方法

    有關(guān)tomcat內(nèi)存溢出的完美解決方法

    下面小編就為大家?guī)硪黄嘘P(guān)tomcat內(nèi)存溢出的完美解決方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-05-05
  • Maven打包之解決沒有依賴jar包問題及分析

    Maven打包之解決沒有依賴jar包問題及分析

    用戶使用Maven打包FTPServer程序時(shí),因未配置依賴打包導(dǎo)致jar體積過小且運(yùn)行報(bào)錯(cuò),解決方法是添加maven-assembly插件生成包含依賴的jar包,確保程序正常運(yùn)行
    2025-09-09

最新評論

大厂| 杂多县| 雷波县| 汝南县| 昆山市| 固镇县| 白城市| 贵定县| 贡觉县| 石首市| 连城县| 鹤壁市| 岑溪市| 襄城县| 莱西市| 溆浦县| 南靖县| 宁武县| 格尔木市| 甘南县| 太谷县| 谷城县| 永济市| 囊谦县| 台北县| 长武县| 北票市| 天津市| 甘孜县| 沾益县| 临城县| 克什克腾旗| 柯坪县| 夏津县| 马关县| 电白县| 孟村| 威海市| 西华县| 儋州市| 榆社县|