SpringBoot框架详解(六)集成Redis

SpringBoot框架详解(六)集成Redis

hello world

Redis: 一个NoSQL数据库,常用做缓存使用(cache)

Redis的数据类型:string,hash,set,zset,list

Redis是一个中间件:是一个独立的服务器。

java中著名的客户端:jedis,lettuce,Redisson

Spring.SpringBoot 中有一个RedisTemplate和StringRedisTemplate,处理和redis交互。

RedisTemplate 使用的 lettuce 客户端库。

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

springboot自动创建了RedisTemplate等放到了容器中 


data-redis使用的是  lettuce客户端库

在程序中使用RedisTemplate 类的方法 操作redis数据,实际就是调用的lettuce客户端中的方法

0.配置本机redis连接

src/main/resources/application.properties


server.port=9001
server.servlet.context-path=/myredis

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

1. 向redis中添加和获取数据

1.1 RedisTemplate
package com.firewolf.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
public class RedisController {

    /**
     * 注入RedisTemplate
     *
     * RedisTemplate 泛型
     * RedisTemplate<String,String>
     * RedisTemplate<Object,Object>
     * RedisTemplate
     *
     * 注意:RedisTemplate 对象的名称 redisTemplate
     * */
    @Resource
    private RedisTemplate redisTemplate;

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

//        操作Redis中String类型的数据,先获取ValueOperations对象
        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;
    }
}

可以通过postman进行测试

  • http://localhost:9001/myredis/redis/addstring?name=myname&value=lisi

  • http://localhost:9001/myredis/redis/getk?k=myname

为什么post请求可以传get的params呢?

​ url传参无论是post和get都是可以的,只是post还多出了更多的数据传输通道,不受url长度限制。

存字符串类型的值会有乱码

127.0.0.1:6379> keys *
1) "stunum"
2) "\xac\xed\x00\x05t\x00\x06myname"
1.2 StringRedisTemplate避免乱码(使用restful风格)

    @Resource
    private StringRedisTemplate stringRedisTemplate;
//    使用rest风格
    @PostMapping("/redis/{k}/{v}")
    public String addStringKV(@PathVariable String k,
                              @PathVariable String v){
//        使用StringRedisTemplate对象
        stringRedisTemplate.opsForValue().set(k,v);
        return "使用StringRedisTemplate对象";
    }

    @GetMapping("/redis/getstr/{k}")
    public String getStringValue(@PathVariable String k){
        String v = stringRedisTemplate.opsForValue().get(k);
        return "k的value"+v;
    }
  • 向数据库传入数据

    • http://localhost:9001/myredis/redis/stunum/100
  • 读取数据

    • http://localhost:9001/myredis/redis/getstr/stunum
1.3 对比StringRedisTemplate和RedisTemplate.

​ StringRedisTemplate:把k,v都是作为String处理,使用的是String的序列化,可读性好。

​ RedisTemplate:把k,v经过了序列化存到redis。k,v是序列化的内容,不能直接识别。

RedisTemplate:默认使用的jdk序列化,可以修改为前提的序列化。

1.4 Redis序列化

序列化:把对象转化为可传输的字节序列过程称为序列化。

反序列化:把字节序列还原为对象的过程称为反序列化。

为什么需要序列化?

序列化的最终的目的是为了对象可以跨平台存储,和进行网络传输。

进行跨平台存储和网络传输的方式就是IO,而IO支持的数据格式是字节数组。

我们把对象转成字节数组需要一种规则,即序列化。

从IO流里面读出数据的时候再以这种规则把对象还原回来,即反序列化。

序列化的方式?

序列化的规则有多种:JDK(不支持跨语言\适用于规模下,没有高并发) \ JSON \ XML \ Hessian \ Kryo (java不支持跨语言) \ Thrift (meta公司)\ Protostuff

Java的序列化

把Java对象转为byte[],二进制数据。

Json的序列化

转化成json格式的对象{“name”:“李四”,“age”:18}

1.5 设置key或value序列化方式
    /***
     * 设置 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的序列化";

    }

idea 快捷键 ctrl+h 打开hierarchy查看源码类的层级机构图

1.6 序列化版本号

idea->setting->editor->inspections->Serialization issues
勾选Serializable class without a serialVersionUID field(生成序列化版本号)

在类名上alt+enter 第一项 add serialVersionUID

import java.io.Serializable;

//类名旁 alte+enter
public class Student implements Serializable {
    private static final long serialVersionUID = 7751711337147644023L;
    private Integer id;
    private String name;
    private Integer age;

1.7 使用json序列化对象

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

        redisTemplate.setKeySerializer(new StringRedisSerializer());
//        把值作为json序列化
        redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Student.class));
        redisTemplate.opsForValue().set("mystudent",student);
        return "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;
    }

redis_cil 客户端查库验证

127.0.0.1:6379> get mystudent
"{\"id\":1001,\"name\":\"zhangsan\",\"age\":19}"

springboot+redis部分结束,redis基础部分在redis专栏。
Know how to be grateful, know how to be grateful, people will become kind, tolerant and loving

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值