Springboot 操作数据
Springboot-data jpa jdbc mongodb redis
SpringbootData 也是Springboot 齐名的
导入Springboot -redis 依赖,点去后发现 不再是jedis 而是 lettuce
Springboot-redis_spring
两者的区别
jedis : 采用的直接连,多个线程的话,是不安全的,如果想要避免不安全的,使用jedis pool 连接池! 更像BIO 模式
lettuce : 采用netty ,实例可以再多个线程中进行共享,不存在线程不安全的情况!可以减少线程数据,更像NIO模式
导入依赖

<!--        redis  的-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
#配置redis
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=123456
package com.jj.demo;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;

@SpringBootTest
class DemoApplicationTests {
//注入redis 的依赖
    @Autowired
    RedisTemplate redisTemplate;
    @Test
    void contextLoads() {
//        redisTemplate 操作不同的数据类型,api 和我们的指令一样
//       opsForValue 操作的书字符类型的
//opsForList()操作List类似List
//        opsForHash 操作HASH 的
//        opsForGeo 操作地图的
//        opsForSet set 集合的
//


//        测试
        redisTemplate.opsForValue().set("Sprinboot-key01","fjj");
        System.out.println(redisTemplate.opsForValue().get("Sprinboot-key01"));
    }

}

效果

2020-12-28 18:50:54.600  INFO 9036 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode.
2020-12-28 18:50:54.626  INFO 9036 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 8 ms. Found 0 Redis repository interfaces.
2020-12-28 18:50:55.875  INFO 9036 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2020-12-28 18:50:56.940  INFO 9036 --- [           main] com.jj.demo.DemoApplicationTests         : Started DemoApplicationTests in 3.903 seconds (JVM running for 5.489)

fjj

2020-12-28 18:50:59.711  INFO 9036 --- [extShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'applicationTaskExecutor'

Process finished with exit code 0

自定义redis 类
写实体类,注意这里我没有实现序列化

package com.jj.demo.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;

@Component
@AllArgsConstructor
@NoArgsConstructor
@Data
public class User {
    private String name;
    private int age;
}

测试类

@Test
    void demo2(){
    User user = new User("冯娇娇",18);
    redisTemplate.opsForValue().set("user",user);
    System.out.println(redisTemplate.opsForValue().get("user"));

}

会报错

Springboot-redis_序列化_02

说需要一个序列化,我们可以用java 自己的序列化
在实体类里写上
Springboot-redis_spring_03
这次结果就变了

2020-12-28 20:49:12.992  INFO 11932 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2020-12-28 20:49:14.121  INFO 11932 --- [           main] com.jj.demo.DemoApplicationTests         : Started DemoApplicationTests in 3.576 seconds (JVM running for 5.299)

User(name=冯娇娇, age=18)

2020-12-28 20:49:17.301  INFO 11932 --- [extShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'applicationTaskExecutor'

Process finished with exit code 0

为什么要自己写序列化呢?
Springboot-redis_spring_04不写序列化的话,这里就会变成这样的

我们也可以不用Springboot 自己带的 序列化,可以自己写
这是百度复制别人的,是个比较固定的版本

package com.jj.demo.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
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;

import java.net.UnknownHostException;

@Configuration
public class RedisConfig {
    /**
     *  编写自定义的 redisTemplate
     *  这是一个比较固定的模板
     */
    @Bean
    @SuppressWarnings("all")
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        // 为了开发方便,直接使用<String, Object>
        RedisTemplate<String, Object> template = new RedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);

        // Json 配置序列化
        // 使用 jackson 解析任意的对象
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
        // 使用 objectMapper 进行转义
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
        // 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);
        // 把所有的配置 set 进 template
        template.afterPropertiesSet();

        return template;
    }
}


测试类注入我们自己的就行了 就不会乱了
Springboot-redis_序列化_05