自定义配置RedisTemplate的Java代码学习

package com.ch.ch6_9;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
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;

@EnableCaching
@SpringBootApplication
public class Ch69Application {
    public static void main(String[] args) {
        SpringApplication.run(Ch69Application.class, args);
    }

    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> rTemplate = new RedisTemplate<Object, Object>();
        rTemplate.setConnectionFactory(redisConnectionFactory);


        @SuppressWarnings({"unchecked", "rawtypes"})
        Jackson2JsonRedisSerializer<Object> 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);


        //设置值的序列化采用Jackson2JsonRedisSerializer
        rTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        //设置键的序列化采用StringRedisSerializer
        rTemplate.setKeySerializer(new StringRedisSerializer());

        return rTemplate;
    }
}

这段Java代码代表了一个启用了Redis缓存的Spring Boot应用程序。让我们逐步解释这段代码的目的和功能:

  1. 包和导入:

    • 代码位于包com.ch.ch6_9中。
    • 导入了一些类和注解,以便访问所需的功能。
  2. 注解:

    • @EnableCaching:此注解用于启用Spring应用程序的缓存支持。
  3. 应用程序类:

    • Ch69Application是Spring Boot应用程序的主类。
    • 它包含了main方法,是应用程序的入口点。
    • 方法SpringApplication.run(Ch69Application.class, args)用于启动Spring Boot应用程序。
  4. Redis配置:

    • 方法redisTemplate标记有@Bean注解,这意味着它将用于创建和配置一个RedisTemplate Bean。
    • RedisTemplate是Spring Data Redis提供的用于与Redis交互的类。
    • 它用于执行对Redis的各种操作,例如获取、设置和删除数据。
  5. Redis序列化和反序列化:

    • Redis以键值对的形式存储数据。在Redis中存储复杂数据类型(如对象)时,需要指定如何进行序列化和反序列化。
    • 在此代码中,使用Jackson库进行Java对象与JSON格式之间的序列化和反序列化。
    • Jackson2JsonRedisSerializer是一个Redis序列化器,用于将Java对象转换为JSON格式以便在Redis中存储,反之亦然。
  6. ObjectMapper配置:

    • ObjectMapper是Jackson提供的处理JSON序列化和反序列化的类。
    • 在此代码中,创建了一个自定义的ObjectMapper,用于配置序列化和反序列化的行为。
    • om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY)设置了在JSON序列化中包含属性的可见性规则,它允许包含所有属性。
    • om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL)启用了非最终类的默认类型信息,这对于正确反序列化JSON对象是必要的。
  7. 设置RedisTemplate:

    • 使用自定义的序列化器和Redis连接工厂来配置RedisTemplate
    • rTemplate.setValueSerializer(jackson2JsonRedisSerializer)设置用于在Redis中存储值的序列化器。在这里,使用的是Jackson2JsonRedisSerializer
    • rTemplate.setKeySerializer(new StringRedisSerializer())设置用于Redis键的序列化器。这里使用了StringRedisSerializer,表示键将以字符串形式存储。
  8. Redis连接工厂:

    • 这段代码片段没有显示Redis连接工厂的部分,但预期在应用程序配置的其他地方提供。RedisConnectionFactory作为参数被注入到redisTemplate方法中。

总体而言,这段代码使用Jackson2JsonRedisSerializer和StringRedisSerializer设置了一个RedisTemplate,进行了自定义序列化和反序列化配置。这使得应用程序能够将Redis作为缓存层,并支持以JSON格式存储和检索Java对象。

(1)项目简介 这个demo很简单,是一个记账小工程。用户可以注册、修改密码,可以记账、查找记账记录等。 (2)接口介绍 用户操作相关: post /users 用户注册 post /users/login 用户登录(这里我把login当成一个名词) put /users/pwd?userId=xxx&sign=xxx 用户修改密码 delete /users?uerId=xxx&sign=xxx 删除用户 记账记录操作相关: post /records?userId=xxx&sign=xxx 增加一条记账记录 get /records/:id?userId=xxx&sign=xxx 查询一条记账记录详情 put /records/:id?userId=xxx&sign=xxx 修改一条记账记录详情 get /records?查询参数&userId=xxx&sign=xxx 分页查询记账记录 delete /records/:id?userId=xxx&sign=xxx 删除一条记账记录 其中url中带sign参数的表示该接口需要鉴权,sign必须是url中最后一个参数。具体的鉴权方法是:用户登录后,服务器生成返回一个token,然后客户端要注意保存这个token,需要鉴权的接口加上sign签名,sign=MD5(url+token),这样可以避免直接传token从而泄露了token。这里我觉得接口最好还带一个时间戳参数timestamp,然后可以在服务端比较时间差,从而避免重放攻击。而且这样还有一个好处,就是如果有人截获了我们的请求,他想伪造我们的请求则不得不改时间戳参数(因为我们在服务器端会比较时间),这样一来sign势必会改变,他是无法得知这个sign的。如果我们没有加时间戳参数的话,那么,他截获了请求url,再重发这个请求势必又是一次合法的请求。我在这里为了简单一些,就不加时间戳了,因为这在开发测试阶段实在是太麻烦了。 (3)关于redis和数据库的说明 服务端在用户登录后,生成token,并将token保存到redis中。后面在接口鉴权的时候会取出token计算签名MD5(除sign外的url+token),进行比对。 这个demo搭建了一个redis主从复制,具体可以参考:http://download.csdn.net/detail/zhutulang/9585010 数据库使用mysql,脚本在 src/main/resources/accounting.sql
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

王摇摆

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

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

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

打赏作者

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

抵扣说明:

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

余额充值