spring Boot는 spring-data-redis 및 lettuce에 의존하는 Redis 통합을 위한 구성 요소 패키지인 spring-boot-starter-data-redis를 제공합니다.
또한 여기에 두 가지 작은 세부 사항이 있습니다.
Spring Boot 1.x 시대에는 spring-data-redis의 하위 레이어가 Jedis를 사용했고 2.x 시대에는 Lettuce로 대체되었습니다.
Lettuce는 commons-pool2
<!-- springboot整合redis--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- 使用 lettuce 时要加这个包;使用 jedis 时则不需要。--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency>
## Redis 服务器地址 spring.redis.host=localhost ## Redis 服务器连接端口 spring.redis.port=6379 ## Redis 数据库索引(默认为 0) spring.redis.database=0 ## 以下非必须,有默认值 ## Redis 服务器连接密码(默认为空) spring.redis.password= ## 连接池最大连接数(使用负值表示没有限制)默认 8 spring.redis.lettuce.pool.max-active=8 ## 连接池最大阻塞等待时间(使用负值表示没有限制)默认 -1 spring.redis.lettuce.pool.max-wait=-1 ## 连接池中的最大空闲连接 默认 8 spring.redis.lett uce.pool.max-idle=8 ## 连接池中的最小空闲连接 默认 0 spring.redis.lettuce.pool.min-idle=0
에 따라 달라집니다. 이번 단위 테스트에서는 redisTemplate을 사용하여 문자열을 저장합니다"Hello Redis"
.
Spring Data Redis는 API를 재분류하고 캡슐화하여 동일한 유형의 작업을 Operation 인터페이스:
독점 작업 | Description |
---|---|
ValueOperations | 문자열 유형 데이터 작업 |
ListOperations | 목록형 데이터 연산 |
SetOperations | 세트형 데이터 연산 |
ZSetOperations | zset형 데이터 연산 |
해시 연산 | 맵형 데이터 연산 |
//解决中文乱码问题 @Configuration public class RedisConfig { @Bean public RedisTemplate redisTemplateInit(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory); //设置序列化Key的实例化对象 redisTemplate.setKeySerializer(new StringRedisSerializer()); //设置序列化Value的实例化对象 redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); /** * * 设置Hash类型存储时,对象序列化报错解决 */ redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); return redisTemplate; } }
RedisTemplate
그러나 이는 분명히 Redis의 실제 상황과 반대됩니다. 가장 작은 저장 단위 수준에서 Redis는 본질적으로 문자열만 저장할 수 있고 다른 유형은 저장할 수 없습니다. 이러한 관점에서 보면 StringRedisTemplate은 Redis의 스토리지 특성에 더 가깝습니다. RedisTemplate은 어떻게 값을 직렬화하여 모든 유형을 지원합니까?
RedisTemplate을 사용하여 객체를 저장할 때 객체의 주소가 deserialization을 위해 저장되므로 저장 공간이 크게 낭비됩니다. 이 문제를 해결하려면 수동으로 직렬화 및 deserialize를 원한다고 생각하고 StringRedisTemplate을 사용하세요.
Users users = new Users(); users.setId(2); users.setUsername("李四2"); redisTemplate.opsForValue().set("user:2", JSON.toJSONString(users)); //存的时候序列化对象 String u = redisTemplate.opsForValue().get("user:2"); //redis 只能返回字符串 System.out.println("u="+ JSON.parseObject(u,Users.class)); //使用JSON工具反序化成对象
springboot의 경우 spring-boot-starter-web 종속성은 도입되지 않았으므로 jackson 종속성을 추가해야 합니다.
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency>
키 자동 만료 문제를 운영하며, Redis는 각 데이터를 저장할 때 시간 초과를 설정할 수 있으며 이 시간 이후에는 데이터가 자동으로 삭제됩니다.
일반적으로 사용되는 Redis 시간 단위
MINUTES: 분
SECONDS: 초
DAYS: 일
//给user对象设置10分钟过期时间 redisTemplate.opsForValue().set("user:1", JSON.toJSONString(users),10,TimeUnit.MINUTES );
//删除键 redisTemplate.delete(key); //判断键是否存在 boolean exists = redisTemplate.hasKey(key);
보통 언제 키를 저장하기 때문에 get/set를 사용하여 저장하는 것은 자연스러운 일입니다. 사실 이는 좋은 습관이 아닙니다. Redis는 키를 저장하는 데 필요한 최소 메모리를 갖습니다. 저장하는 키가 아무리 작더라도 이 메모리보다 작지는 않습니다. 따라서 해시를 합리적으로 사용하면 많은 메모리를 절약하는 데 도움이 됩니다.
@Test public void testHash() { String key = "tom"; HashOperations<String, Object, Object> operations = redisTemplate.opsForHash(); operations.put(key, "name", "tom"); operations.put(key, "age", "20"); String value= (String) operations.get(key,"name"); System.out.println(value); }
위 테스트 사례에 따르면 해시 세트 중에 3개의 매개변수를 전달해야 하는 것으로 나타났습니다. 첫 번째는 키, 두 번째는 필드, 세 번째는 저장된 값입니다. 일반적으로 Key는 데이터의 집합을 나타내고, field는 key와 관련된 속성, value는 속성에 해당하는 값을 의미합니다.
Redis List는 다양한 응용 시나리오를 갖고 있으며 Redis의 가장 중요한 데이터 구조 중 하나이기도 합니다. List를 사용하여 쉽게 대기열을 구현할 수 있습니다. List의 일반적인 응용 시나리오는 List의 Push 작업을 사용하여 List에 작업을 저장한 다음 작업자 스레드가 POP 작업을 사용하여 실행할 수 있습니다.
/** * 测试List * leftPush 将数据添加到key对应的现有数据的左边,也就是头部 * leftPop 取队列最左边数据(从数据库移除) * rightPush 将数据添加到key对应的现有数据的右边,也就是尾部 */ @Test public void testList() { final String key = "list"; ListOperations<String,Object> list = redisTemplate.opsForList(); list.leftPush(key, "hello"); list.leftPush(key, "world"); list.leftPush(key, "goodbye"); Object mete = list.leftPop("list"); System.out.println("删除的元素是:"+mete); //删除 goodbye String value = (String) list.leftPop(key); System.out.println(value.toString()); // range(key, 0, 2) 从下标0开始找,找到2下标 List<Object> values = list.range(key, 0, 2); for (Object v : values) { System.out.println("list range :" + v); } } }
Redis 목록은 역방향 검색과 순회를 지원할 수 있는 양방향 연결 목록으로 구현되어 작동이 더 편리합니다. 그러나 전송 버퍼 큐 등을 포함하여 Redis 내에서 많은 구현이 추가됩니다. ., 또한 이 데이터 구조를 사용합니다.
Redis Set에서 제공하는 외부 기능은 List 기능과 유사합니다. 특별한 점은 Set이 목록 데이터를 저장해야 할 때 자동으로 중복 제거할 수 있다는 것입니다. Set을 원하지 않는 것은 중복된 데이터가 발생할 때 좋은 선택이며 Set은 멤버가 List가 제공할 수 없는 Set 컬렉션에 있는지 여부를 결정하는 중요한 인터페이스를 제공합니다.
/** * 测试Set */ @Test public void testSet() { final String key = "set"; SetOperations<String,Object> set = redisTemplate.opsForSet(); set.add(key, "hello"); set.add(key, "world"); set.add(key, "world"); set.add(key, "goodbye"); Set<Object> values = set.members(key); for (Object v : values) { System.out.println("set value :" + v); } Boolean exist = set.isMember(key,"hello") //判断是否存在某个元素 operations.move("set", "hello", "setcopy"); //把set集合中的hello元素放到setcopy 中 } }
Redis ZSet의 사용 시나리오는 Set과 유사합니다. 차이점은 Set이 자동으로 정렬되지 않는 반면 ZSet은 사용자가 추가 우선순위(Score) 매개변수를 제공하여 멤버를 정렬할 수 있다는 것입니다. 그리고 삽입 순서, 즉 자동 정렬입니다.
아아아아위 내용은 Java SpringBoot는 Redis를 어떻게 작동합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!