SpringBoot整合redis前置配置以及序列化

本文的配置是基于这篇博客之上的
1.springboot引入redis的相关依赖,在pom.xml文件中加入:

        <!--引入redis-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

2.配置redis的服务ip地址,在application.properties中指定:

#指定redis的主机地址
spring.redis.host=192.168.31.53

现在redis的环境已经搭建好了,测试一下,redis可否能用,在springboot的测试类写下面的测试代码:

 	@Autowired
    StringRedisTemplate stringRedisTemplate;

    @Autowired
    RedisTemplate redisTemplate;
    /**
     * Redis常见的五大数据类型
     *  String(字符串)、List(列表)、Set(集合)、Hash(散列)、ZSet(有序集合)
     *  stringRedisTemplate.opsForValue()[String(字符串)]
     *  stringRedisTemplate.opsForList()[List(列表)]
     *  stringRedisTemplate.opsForSet()[Set(集合)]
     *  stringRedisTemplate.opsForHash()[Hash(散列)]
     *  stringRedisTemplate.opsForZSet()[ZSet(有序集合)]
     */
    @Test
    public void test01(){
//        stringRedisTemplate.opsForValue().append("lp","88");
//        String a = stringRedisTemplate.opsForValue().get("lp");
//        System.out.println(a);

        stringRedisTemplate.opsForList().leftPush("mylist","1");
        stringRedisTemplate.opsForList().leftPush("mylist","2");
    }

发现操作一切正常!!!!!!
在这里插入图片描述
其实Reis环境配好了,那么使用方法跟缓存基础篇的玩法一样,只要你配好了环境,用的缓存就是redis。




序列化问题

想将对象放进redis中存储,就得解决下面的问题:

1.将对象所代表的类实现Serializable接口:

public class Employee implements Serializable {
	... ...
}

2.在测试类中模拟存储对象:

    @Autowired
    EmployeeMapper employeeMapper;

    @Autowired
    StringRedisTemplate stringRedisTemplate;

    @Autowired
    RedisTemplate redisTemplate;
    
	@Test
    public void test02(){
        Employee employee = employeeMapper.getEmpById(1);
		redisTemplate.opsForValue().set("emp-01",employee);

    }

结果发现虽然存进入了,但key 和 value 我们都看不懂:
在这里插入图片描述
因为默认保存对象,使用的是jdk序列化机制,序列化后的数据保存到redis中。



springboot自然考虑到了这一点,所以我们可以自定义序列化的规则:将数据以json的方式保存,自己将对象转为json:
1.想完成这种转变,我们只需要将下面的bean加入容器:

    @Bean
    public RedisTemplate<Object, Employee> empRedisTemplate(
            RedisConnectionFactory redisConnectionFactory)
            throws UnknownHostException {
        RedisTemplate<Object, Employee> template = new RedisTemplate<Object, Employee>();
        template.setConnectionFactory(redisConnectionFactory);
        Jackson2JsonRedisSerializer<Employee> ser = new Jackson2JsonRedisSerializer<Employee>(Employee.class);
        template.setDefaultSerializer(ser);
        return template;
    }

2.在操作时,不用原来的stringRedisTemplate和redisTemplate,而使用该bean来操作:

    @Autowired
    RedisTemplate<Object,Employee> empRedisTemplate;
    
    @Test
    public void test02(){
        Employee employee = employeeMapper.getEmpById(1);
        empRedisTemplate.opsForValue().set("emp-01",employee);
    }

运行结果很成功,也很直观:
在这里插入图片描述


使用Jedis来操作redis非关系型数据库

在上面的基础下,加下面的依赖:

        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>

如果不做任何配置,redis的连接工厂使用的依旧是lettuce
运行下面代码:

    @Autowired
    RedisConnectionFactory redisConnectionFactory;
    @Test
    void test1(){
        System.out.println(redisConnectionFactory.getClass());
    }

在这里插入图片描述
想要使用是jedis作为连接工厂,则还需在application.yml中配置:

spring:
  redis:
    host: 192.168.2.128
    port: 6379
    client-type: jedis  #!!!!!!!!!!!!!!!!!!!配置这个东西
    #下面的可以选择配置
#    jedis:
#      pool:
#        max-active: 10
    

再次运行上面的测试代码块结果如下:
在这里插入图片描述
下面写一个显示访问地址次数的demo:

1.编写拦截器:
package com.atguigu.admin.interceptor;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@Component
public class RedisUrlCountInterceptor implements HandlerInterceptor {

    @Autowired
    StringRedisTemplate redisTemplate;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String uri = request.getRequestURI();
        //默认每次访问当前uri就会计数+1
        redisTemplate.opsForValue().increment(uri);
        return true;
    }
}

2.注册拦截器
@Configuration
public class AdminWebConfig implements WebMvcConfigurer{
    /**
     * Filter、Interceptor 几乎拥有相同的功能?
     * 1、Filter是Servlet定义的原生组件。好处,脱离Spring应用也能使用
     * 2、Interceptor是Spring定义的接口。可以使用Spring的自动装配等功能
     *
     */
    @Autowired
    RedisUrlCountInterceptor redisUrlCountInterceptor;
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
	     registry.addInterceptor(redisUrlCountInterceptor)
	                .addPathPatterns("/**")
	                .excludePathPatterns("/","/login","/css/**","/fonts/**","/images/**",
	                        "/js/**","/aa/**");
    }


3.编写controller:
    @GetMapping("/main.html")
    public String mainPage(HttpSession session,Model model){
        ValueOperations<String, String> opsForValue =
                redisTemplate.opsForValue();
        String s = opsForValue.get("/main.html");
        String s1 = opsForValue.get("/sql");
        model.addAttribute("mainCount",s);
        model.addAttribute("sqlCount",s1);
        return "main";

    }
4.在main页面用themeleaf模板引擎取值显示:
                        <div class="col-md-6 col-xs-12 col-sm-6">
                            <div class="panel purple">
                                <div class="symbol">
                                    <i class="fa fa-gavel"></i>
                                </div>
                                <div class="state-value">
                                    <div class="value" th:text="${mainCount}">230</div>
                                    <div class="title">/main.html</div>
                                </div>
                            </div>
                        </div>
                        <div class="col-md-6 col-xs-12 col-sm-6">
                            <div class="panel red">
                                <div class="symbol">
                                    <i class="fa fa-tags"></i>
                                </div>
                                <div class="state-value">
                                    <div class="value" th:text="${sqlCount}">3490</div>
                                    <div class="title">/sql</div>
                                </div>
                            </div>
                        </div>

显示效果:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Spring Boot可以很方便地与Redis集成,使用RedisTemplate可以实现对Redis的操作。在使用RedisTemplate时,需要对数据进行序列化和反序列化,以便存储和读取数据。Spring Boot提供了多种序列化方式,包括JdkSerializationRedisSerializer、Jackson2JsonRedisSerializer、GenericJackson2JsonRedisSerializer等。其中,JdkSerializationRedisSerializer是默认的序列化方式,但由于其效率较低,一般不建议使用。Jackson2JsonRedisSerializer和GenericJackson2JsonRedisSerializer则可以将数据序列化为JSON格式,效率较高,推荐使用。在使用Jackson2JsonRedisSerializer和GenericJackson2JsonRedisSerializer时,需要注意对象的类必须有默认的构造函数。 ### 回答2: Spring Boot 是一个快速开发框架,而 Redis 是一款高效 NoSQL 数据库,二者结合在一起可以提供更加高效的开发和运行效率。在实际应用中,往往需要使用RedisSpringBoot序列化功能来存储和读取数据。 Spring Boot 提供了一种比较友好的整合 Redis 的方式,也提供了对于 Redis 序列化功能的支持。在 SpringBoot 中,我们可以通过引入 Jedis 或 Lettuce 作为 Redis 客户端来实现对 Redis 服务的访问。 在默认情况下,SpringBoot 使用的是 JDK 序列化器来序列化数据。但是 JDK 序列化器的效率并不高,而且在某些情况下可能会出现序列化和反序列化的数据不一致问题,因此建议我们自定义 Redis 序列化器来提高效率。 SpringBoot 提供了一个 RedisTemplate 实现来进行 Redis 数据操作,同时通过配置 RedisTemplate 的 ValueSerializer 和 KeySerializer 实现自定义的序列化和反序列化功能。以下是自定义 Redis 序列化器的实现步骤: - 首先,需要定义一个实现 RedisSerializer 接口的 Redis 序列化器; - 然后,通过配置 RedisTemplate 的 ValueSerializer 和 KeySerializer 来设置 Redis 序列化器; - 最后,在代码中使用 RedisTemplate 进行 Redis 数据操作即可。 以下是一个 Redis 序列化器的简单示例: public class RedisObjectSerializer implements RedisSerializer<Object> { private Converter<Object, byte[]> serializer = new SerializingConverter(); private Converter<byte[], Object> deserializer = new DeserializingConverter(); @Override public byte[] serialize(Object obj) throws SerializationException { if (obj == null) { return new byte[0]; } return serializer.convert(obj); } @Override public Object deserialize(byte[] bytes) throws SerializationException { if (bytes == null || bytes.length == 0) { return null; } return deserializer.convert(bytes); } } 以下是一个自定义 RedisTemplate 的简单示例: @Configuration public class RedisConfig { @Bean public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) { RedisTemplate<Object, Object> template = new RedisTemplate<>(); template.setConnectionFactory(connectionFactory); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new RedisObjectSerializer()); return template; } } 在进行 Redis 数据操作时,我们可以使用 RedisTemplate 对象来进行操作,如下所示: @Autowired private RedisTemplate<Object, Object> redisTemplate; public void setData(String key, Object value) { redisTemplate.opsForValue().set(key, value); } public Object getData(String key) { return redisTemplate.opsForValue().get(key); } 总之,自定义 Redis 序列化器是为了提高 Redis 的运行效率和数据传输速率,也能够避免出现数据不一致问题。在 SpringBoot 中,只需要通过配置 RedisTemplate 的 ValueSerializer 和 KeySerializer 即可完成 Redis 序列化器的自定义配置。 ### 回答3: SpringBoot 是一款非常方便的框架,可以简化企业级应用程序的开发。它已经集成了大量常用的组件,Redis 是其中一个非常常用的缓存组件。本文将介绍如何在 SpringBoot整合 Redis 缓存,并且使用序列化进行存储。 Redis 是一款基于 key-value 存储的 NoSQL 数据库,它是一个开源的高性能 Key-Value 数据库。在 Redis 中,key 和 value 都是一个二进制的字符串。因此,在存取数据时,可以通过序列化和反序列化将对象转换成字符串类型然后进行存储和读取。 使用 Redis 缓存时,我们可以使用 SpringBoot 的自动配置来集成 Redis 缓存。SpringBoot 提供了一个 starter,也就是 Redis Starter,集成了 jedis 和 lettuce 两种 Redis 客户端,可以轻松实现对 Redis 的自动配置和启动。 在使用 Redis 缓存时,需要使用序列化将需要缓存的对象转换为字符串,然后将其存入 Redis 中。SpringBoot 支持多种序列化方式,包括 JDK 序列化、gson、Jackson、fastjson 等。其中,JSON 序列化是最常用的一种方式,因为它具有良好的可读性和可扩展性。 SpringBoot 提供了一个 RedisTemplate 类,使我们可以轻松地访问 Redis 的 API。在使用 RedisTemplate 时,需要指定序列化方式,如果我们要使用 JSON 序列化,可以在 RedisTemplate配置中添加以下内容: ``` @Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(redisConnectionFactory); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); template.setHashKeySerializer(new StringRedisSerializer()); template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); template.afterPropertiesSet(); return template; } } ``` 在上面的配置中,我们首先定义了一个 RedisTemplate bean,它将使用 String 作为 key,Object 作为 value。然后,我们将 RedisConnectionFactory 注入 RedisTemplate 中,并设置了默认的序列化器为 GenericJackson2JsonRedisSerializer。 以上就是整合 Redis 序列化的步骤。在对需要缓存的数据进行序列化的时候,需要注意序列化的时效性和数据的更新策略。如果数据量过大,需要考虑 Redis 的缓存清理机制以及缓存命中率等问题。希望本文对大家有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

键盘歌唱家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值