前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot 整合 Redis

SpringBoot 整合 Redis

作者头像
收心
发布2022-01-17 14:21:05
3690
发布2022-01-17 14:21:05
举报
文章被收录于专栏:Java实战博客

Java 学习Redis地址是:https://developer.redis.com/develop/java/ 首先 SpringBoot 的 约定优于配置 在整合Redis的时候 就得到了充分的体现

我们几乎不需要手写什么配置,大部分的配置基于SpringBoot配置好的就行。

首先 老规矩,加入 Maven的依赖

代码语言:javascript
复制
        <!--springboot中的redis依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

依赖加入好后,刷新一下 Maven,编写我们的配置信息 yml格式

代码语言:javascript
复制
spring:
  # 配置redis信息
  redis:
    # redis的ip
    host: 192.168.3.10
    # redis的端口
    port: 6379
    # redis的密码
    password: 123456
    # 指定的redis的数据库
    database: 0

看清楚格式,别弄处什么空格,或者什么的

然后开始写我们的测试用例了。

这里,我直接拿我公司项目来做测试案例代码了

我们核心是 RedisTemplate 所有操作 ,都让他来干。

因为 Redis 有 这5种基本数据结构类型分别为:String(字符串)、List(列表)、Set(集合)、Hash(散列)和 Zset(有序集合)。

我们简单说明这几种类型的特点:

  • String : 类似与Map集合。相同Key 会覆盖原有数据
  • List:
  • Set:
  • Hash:
  • Zset:

实验: Key-Value 存储、读取

代码语言:javascript
复制
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;

/**
 * @author : zanglikun
 * @date : 2021/1/29 15:42
 * @Version: 1.0
 * @Desc : Redis的测试使用
 */

@RunWith(SpringRunner.class)  // 这行 不加 就不会由SpringBoot项目管理,就会导致不会走SpringBoot的默认RedisTemplate 的配置,会爆 空指针异常
@SpringBootTest
public class shop1688Test {
    @Autowired
    RedisTemplate redisTemplate;

    @Test
    public void testSet() {
        try {
            redisTemplate.boundValueOps("张三").set("88888");
            System.out.println("存入成功");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Test
    public void testGet() {
        String s = (String) redisTemplate.boundValueOps("张三").get(); // 没有结果就是 null 有结果就正常输出
        System.out.println("结果是:" + s);
    }
}

RedisTemplate的序列化与反序列化

添加一个 Persion类 用来 下文 操作 JAVA 对象

代码语言:javascript
复制
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import java.io.Serializable;

/**
 * @author : zanglikun
 * @date : 2021/1/29 16:43
 * @Version: 1.0
 * @Desc : 自定义的Player类,用于下文的 正反序列化
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Player implements Serializable {
	private String name;
	private int age;
	private boolean isman;
	private static final long serialVersionUID = 1L;
}

添加一个 Java object 对象 并设置1000秒后 消失

代码语言:javascript
复制
    // 往Redis 中 添加一个Java的Player 对象 
    @Test
    public void testSetJavaObject() {
        Player player = new Player();
        player.setAge(21);
        player.setName("臧立昆");
        player.setIsman(true);
        Object o = JSON.toJSON(player);
        Class<?> aClass = o.getClass();
        System.out.println(aClass);
    // 添加一个对象 并设置 数量 1000 单位 为秒 消失的记录
        redisTemplate.opsForValue().set(player.getName(), JSON.toJSON(player),1000, TimeUnit.SECONDS);
        System.out.println("存入成功");
    }

这里 图片 TTL 应该是 1000 但这里-1 所以 我用的是上文的图

取数据 因为直接取数据 不能很好的反序列化并封装在 对象内,所以,只能通过Json的方法转成对象使用。所以我们的解决方案是:添加配置类

代码语言:javascript
复制
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.76</version>
        </dependency>

配置一个配置类RedisConfig,以后 使用我们的配置过序列化的 RedisTemplate 模板类 操作了 模板类如下

代码语言:javascript
复制
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
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;
/**
 * @Author: 臧立昆
 * @Email: 740969606@qq.com
 * @Date: 2020/8/1
 * @Time: 18:53
 */
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
    
    // 自己定义了一个 RedisTemplate
    @Bean
    @SuppressWarnings("all")
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        // 我们为了自己开发方便,一般直接使用 <String, Object>
        RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
        template.setConnectionFactory(factory);
        // Json序列化配置
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        // String 的序列化
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // key采用String的序列化方式
        template.setKeySerializer(stringRedisSerializer);
        // hash的key也采用String的序列化方式
        template.setHashKeySerializer(stringRedisSerializer);
        // value序列化方式采用jackson
        template.setValueSerializer(jackson2JsonRedisSerializer);
        // hash的value序列化方式采用jackson
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }

    //自定义cacheManager缓存管理器
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory)
    {
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

        //解决查询缓存转换异常的问题
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);

        //配置序列化(解决乱码的问题)

        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ZERO)
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
                .disableCachingNullValues();

        RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
                .cacheDefaults(config)
                .build();
        return cacheManager;
    }

}

实验:反序列化查询一个 JAVA对象(前提是存储好了)

代码语言:javascript
复制
    @Test
    public void testGetJavaObject() throws ClassNotFoundException {
        JSONObject obj = (JSONObject)redisTemplate.opsForValue().get("臧立昆");
        Player player = JSON.toJavaObject(obj, Player.class);
        System.out.println(player);
    }

搞定。

特殊说明: 解决问题的光鲜,藏着磕Bug的痛苦。 万物皆入轮回,谁也躲不掉! 以上文章,均是我实际操作,写出来的笔记资料,不会出现全文盗用别人文章!烦请各位,请勿直接盗用!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实验: Key-Value 存储、读取
  • RedisTemplate的序列化与反序列化
    • 实验:反序列化查询一个 JAVA对象(前提是存储好了)
    相关产品与服务
    文件存储
    文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档