Springboot 操作数据
Springboot-data jpa jdbc mongodb redis
SpringbootData 也是Springboot 齐名的
导入Springboot -redis 依赖,点去后发现 不再是jedis 而是 lettuce
两者的区别
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"));
}
会报错
说需要一个序列化,我们可以用java 自己的序列化
在实体类里写上
这次结果就变了
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 自己带的 序列化,可以自己写
这是百度复制别人的,是个比较固定的版本
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;
}
}
测试类注入我们自己的就行了 就不会乱了