SpringBoot:往Redis中添加获取数据、序列化方式

RedisTemple:是SpringBoot中提供的一个类,来操作Redis数据的 

 

 

创建项目:

pom.xml:项目创建时加的起步依赖:

 

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.bjpowernode</groupId>
    <artifactId>021-springboot-redis</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <!--redis起步依赖:直接在项目中使用RedisTemplate(StringRedisTemplate)-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <!--springweb起步依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

配置文件application.properties:端口号、Redis的连接等相关设置

#设置煅后端口号,和上下文访问路径
server.port=9001
server.servlet.context-path=/myredis

#指定redis(host,ip,password)
spring.redis.host=localhost
spring.redis.port=6379

#自己的电脑redis没有密码
#spring.redis.password=123

创建控制类:

RedisController:使用RedisTemplate类

package com.bjpowernode.controller;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController  // @Controller和@ResponseBody的组合    @ResponseBody:把String返回值当做数据来返回给浏览器
public class RedisController {

    /*注入RedisTemplate
    * 可以写<String,String> 也可以<Object,Object> 也可以不写
    *
    * RedisTemplate泛型:
    *   RedisTemplate<String,String>
    *   RedisTemplate<Object,Object>
    *   RedisTemplate
    *
    * 注意RedisTemplate的对象名称 redisTemplate  默认采用JDK的序列化方式
    *  */
    @Resource //注解注入进来
    private RedisTemplate redisTemplate;

    //添加数据到Redis
    @PostMapping("/redis/addstring")
    public String addToRedis(String name,String value){

        ValueOperations valueOperations = redisTemplate.opsForValue();
        //添加数据到redis
        valueOperations.set("myname","lisi");

        return "向redis添加string类型的数据";
    }

    //从redis中获取数据
    @GetMapping("/redis/getk")
    public String getData(String k){
        ValueOperations valueOperations = redisTemplate.opsForValue();
        Object v = valueOperations.get(k);
        return "key是:"+k+",它的值是:"+v;
    }
}

 在运行项目之前先打开Windows版本的Redis

 

主启动类MyApplicatioin:运行项目:

package com.bjpowernode;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

使用postman发送请求:

 PostMapper  是一个post请求

 成功添加数据:

 获取数据:

 通过客户端可以看到:用的是jdk的序列化,但是发现可读性 不好

RedisController:中在使用StringRedisTemplate类,后两个方法添加获取数据

package com.bjpowernode.controller;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController  // @Controller和@ResponseBody的组合    @ResponseBody:把String返回值当做数据来返回给浏览器
public class RedisController {

    /*注入RedisTemplate
    * 可以写<String,String> 也可以<Object,Object> 也可以不写
    *
    * RedisTemplate泛型:
    *   RedisTemplate<String,String>
    *   RedisTemplate<Object,Object>
    *   RedisTemplate
    *
    * 注意RedisTemplate的对象名称 redisTemplate  //采用JDK序列化
    *  */
    @Resource //注解注入进来
    private RedisTemplate redisTemplate;

    @Resource
    private StringRedisTemplate stringRedisTemplate; //默认采用字符串序列化

    //添加数据到Redis
    @PostMapping("/redis/addstring")
    public String addToRedis(String name,String value){

        ValueOperations valueOperations = redisTemplate.opsForValue();
        //添加数据到redis
        valueOperations.set("myname","lisi");

        return "向redis添加string类型的数据";
    }

    //从redis中获取数据
    @GetMapping("/redis/getk")
    public String getData(String k){
        ValueOperations valueOperations = redisTemplate.opsForValue();
        Object v = valueOperations.get(k);
        return "key是:"+k+",它的值是:"+v;
    }


    //StringRedisTemplate


    @PostMapping("/redis/{k}/{v}")
    public String addStringKV(@PathVariable String k,
                              @PathVariable String v){

        //使用StringRedisTemplate对象
        stringRedisTemplate.opsForValue().set(k,v);
        return "使用StringRedisTemple对象";

    }

    //从redis中获取数据
    @GetMapping("/redis/getstr/{k}")
    public String getStringValue(@PathVariable String k){
        String v = stringRedisTemplate.opsForValue().get(k);
        return "key是:"+k+",它的值是:"+v;
    }
}

 使用postman发送请求:添加方法

获取方法 

 

 

使用客户端获取数据:StringRedisTemplate采用的String的序列化,可读性较好

 

 

 

序列化

 

 

 

 如果那你想改变RedisTemplate的序列化机制

RedisController:最后一个方法

package com.bjpowernode.controller;

        import org.springframework.data.redis.core.RedisTemplate;
        import org.springframework.data.redis.core.StringRedisTemplate;
        import org.springframework.data.redis.core.ValueOperations;
        import org.springframework.data.redis.serializer.StringRedisSerializer;
        import org.springframework.web.bind.annotation.GetMapping;
        import org.springframework.web.bind.annotation.PathVariable;
        import org.springframework.web.bind.annotation.PostMapping;
        import org.springframework.web.bind.annotation.RestController;

        import javax.annotation.Resource;

@RestController  // @Controller和@ResponseBody的组合    @ResponseBody:把String返回值当做数据来返回给浏览器
public class RedisController {

    /*注入RedisTemplate
     * 可以写<String,String> 也可以<Object,Object> 也可以不写
     *
     * RedisTemplate泛型:
     *   RedisTemplate<String,String>
     *   RedisTemplate<Object,Object>
     *   RedisTemplate
     *
     * 注意RedisTemplate的对象名称 redisTemplate  //采用JDK序列化
     *  */
    @Resource //注解注入进来
    private RedisTemplate redisTemplate;

    @Resource
    private StringRedisTemplate stringRedisTemplate; //默认采用字符串序列化

    //添加数据到Redis
    @PostMapping("/redis/addstring")
    public String addToRedis(String name,String value){

        ValueOperations valueOperations = redisTemplate.opsForValue();
        //添加数据到redis
        valueOperations.set("myname","lisi");

        return "向redis添加string类型的数据";
    }

    //从redis中获取数据
    @GetMapping("/redis/getk")
    public String getData(String k){
        ValueOperations valueOperations = redisTemplate.opsForValue();
        Object v = valueOperations.get(k);
        return "key是:"+k+",它的值是:"+v;
    }


    //StringRedisTemplate


    @PostMapping("/redis/{k}/{v}")  //RESTful风格
    public String addStringKV(@PathVariable String k,
                              @PathVariable String v){

        //使用StringRedisTemplate对象
        stringRedisTemplate.opsForValue().set(k,v);
        return "使用StringRedisTemple对象";

    }

    //从redis中获取数据
    @GetMapping("/redis/getstr/{k}")
    public String getStringValue(@PathVariable String k){
        String v = stringRedisTemplate.opsForValue().get(k);
        return "key是:"+k+",它的值是:"+v;
    }

    /*设置RedisTemplate 序列化
    *  可以设置key 的序列化,可以设置value的序列化
    *  可以同时设置key和value的序列化
    *
    * */
    @PostMapping("/redis/addstr")
    public String addString(String  k,String v){
        //使用RedisTemplate
        //设置key 使用String的序列化
        redisTemplate.setKeySerializer(new StringRedisSerializer());

        //设置value的序列化
        redisTemplate.setValueSerializer(new StringRedisSerializer());

        redisTemplate.opsForValue().set(k,v);

        return "定义RedisTemplate对象 key ,value的序列化";
    }
}

 

 客户端查看:

 图形 客户端界面:

 Json的序列化和反序列化:

创建Student类:

package com.bjpowernode.vo;

import java.io.Serializable;

public class Student implements Serializable {
    //放在Student类上Alt+回车生成序列化版本号
    private static final long serialVersionUID = 6957173297825217669L;
    private Integer id;
    private String name;
    private Integer age;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

RedisController:最后两个方法:

package com.bjpowernode.controller;

        import com.bjpowernode.vo.Student;
        import org.springframework.data.redis.core.RedisTemplate;
        import org.springframework.data.redis.core.StringRedisTemplate;
        import org.springframework.data.redis.core.ValueOperations;
        import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
        import org.springframework.data.redis.serializer.StringRedisSerializer;
        import org.springframework.web.bind.annotation.GetMapping;
        import org.springframework.web.bind.annotation.PathVariable;
        import org.springframework.web.bind.annotation.PostMapping;
        import org.springframework.web.bind.annotation.RestController;

        import javax.annotation.Resource;

@RestController  // @Controller和@ResponseBody的组合    @ResponseBody:把String返回值当做数据来返回给浏览器
public class RedisController {

    /*注入RedisTemplate
     * 可以写<String,String> 也可以<Object,Object> 也可以不写
     *
     * RedisTemplate泛型:
     *   RedisTemplate<String,String>
     *   RedisTemplate<Object,Object>
     *   RedisTemplate
     *
     * 注意RedisTemplate的对象名称 redisTemplate  //采用JDK序列化
     *  */
    @Resource //注解注入进来
    private RedisTemplate redisTemplate;

    @Resource
    private StringRedisTemplate stringRedisTemplate; //默认采用字符串序列化

    //添加数据到Redis
    @PostMapping("/redis/addstring")
    public String addToRedis(String name,String value){

        ValueOperations valueOperations = redisTemplate.opsForValue();
        //添加数据到redis
        valueOperations.set("myname","lisi");

        return "向redis添加string类型的数据";
    }

    //从redis中获取数据
    @GetMapping("/redis/getk")
    public String getData(String k){
        ValueOperations valueOperations = redisTemplate.opsForValue();
        Object v = valueOperations.get(k);
        return "key是:"+k+",它的值是:"+v;
    }


    //StringRedisTemplate


    @PostMapping("/redis/{k}/{v}")  //RESTful风格
    public String addStringKV(@PathVariable String k,
                              @PathVariable String v){

        //使用StringRedisTemplate对象
        stringRedisTemplate.opsForValue().set(k,v);
        return "使用StringRedisTemple对象";

    }

    //从redis中获取数据
    @GetMapping("/redis/getstr/{k}")
    public String getStringValue(@PathVariable String k){
        String v = stringRedisTemplate.opsForValue().get(k);
        return "key是:"+k+",它的值是:"+v;
    }

    /*设置RedisTemplate 序列化
    *  可以设置key 的序列化,可以设置value的序列化
    *  可以同时设置key和value的序列化
    *
    * */
    @PostMapping("/redis/addstr")
    public String addString(String  k,String v){
        //使用RedisTemplate
        //设置key 使用String的序列化
        redisTemplate.setKeySerializer(new StringRedisSerializer());

        //设置value的序列化
        redisTemplate.setValueSerializer(new StringRedisSerializer());

        redisTemplate.opsForValue().set(k,v);

        return "定义RedisTemplate对象 key ,value的序列化";
    }


    /*使用json 序列化,把java对象转换为json
    *
    *
    * */
    @PostMapping("/redis/addjson")
    public String addJson(){
        Student student=new Student();
        student.setId(1001);
        student.setName("zhangsan");
        student.setAge(20);

        redisTemplate.setKeySerializer(new StringRedisSerializer());

        //把值作json序列化
        redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Student.class));

        redisTemplate.opsForValue().set("mystudent",student);

        return "json序列化";
    }

    //反序列化  获取json数据,转换为对象
    @PostMapping("/redis/getjson")
    public String getJson(){

        redisTemplate.setKeySerializer(new StringRedisSerializer());

        //把值作json序列化
        redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Student.class));

        //这个类已经做了,你用什么序列化,它既可以给你反序列化回来
        Object obj = redisTemplate.opsForValue().get("mystudent");

        return "json反序列化="+obj;
    }
}

重启启动主启动类,用postman做这个请求:

java对象序列化

redis客户端:

 

 反序列化获取对象:把redis中存放的json反序列化成一个对象

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个基于Spring Boot和Redis的键值序列化的示例代码: 首先,在pom.xml文件添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency> ``` 然后,在application.properties文件配置Redis连接信息: ```properties spring.redis.host=127.0.0.1 spring.redis.port=6379 spring.redis.password= spring.redis.database=0 spring.redis.pool.max-active=8 spring.redis.pool.max-wait=-1 spring.redis.pool.max-idle=8 spring.redis.pool.min-idle=0 ``` 接下来,我们可以创建一个RedisConfig类,用于配置RedisTemplate和RedisCacheManager: ```java @Configuration @EnableCaching public class RedisConfig extends CachingConfigurerSupport { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(factory); // 使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式) Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class); ObjectMapper mapper = new ObjectMapper(); mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); serializer.setObjectMapper(mapper); // 设置value的序列化规则和key的序列化规则 template.setValueSerializer(serializer); template.setKeySerializer(new StringRedisSerializer()); template.afterPropertiesSet(); return template; } @Bean public CacheManager cacheManager(RedisConnectionFactory factory) { RedisCacheManager cacheManager = RedisCacheManager.create(factory); cacheManager.setDefaultExpiration(1800); // 设置缓存过期时间(单位:秒) return cacheManager; } } ``` 现在,我们可以在任何需要使用Redis的地方注入RedisTemplate,并使用它来存储和读取数据。例如: ```java @Service public class UserService { @Autowired private RedisTemplate<String, Object> redisTemplate; public User getUserById(Long id) { String key = "user:" + id; User user = (User) redisTemplate.opsForValue().get(key); if (user == null) { // 从数据库获取用户信息 user = userRepository.findById(id).orElse(null); if (user != null) { redisTemplate.opsForValue().set(key, user); } } return user; } } ``` 在上面的示例,我们将用户信息存储在Redis,并设置了一个过期时间。当需要获取用户信息时,首先从缓存查找,如果缓存没有,则从数据库获取,并将结果存储在缓存,以便下一次使用。这样可以大大提高系统的性能和响应速度。 总结:以上是一个基于Spring Boot和Redis的键值序列化的示例代码,通过使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值,可以实现最优化最高性能的键值序列化

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

喵俺第一专栏

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

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

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

打赏作者

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

抵扣说明:

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

余额充值