Springboot Redis
快速入门
Redis中Object的存储方式类似于Tuple<Key,Object>
-
maven
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.erf</groupId> <artifactId>springboot-data-redis</artifactId> <version>1.0-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.5</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency> </dependencies> </project>
-
yaml
server: port: 8081 spring: redis: database: 0 host: localhost port: 6379
-
实体类实现Serializable接口
package com.erf.entity; import lombok.Data; import java.io.Serializable; import java.util.Date; @Data public class Student implements Serializable { private int id; private String name; private Double score; private Date birthday; }
-
注入及使用
package com.erf.controller; import com.erf.entity.Student; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.web.bind.annotation.*; @RestController public class StudentHandler { @Autowired private RedisTemplate redisTemplate; @PostMapping("/set") public void set(@RequestBody Student student){ redisTemplate.opsForValue().set(student.getId(),student); } @GetMapping("/get/{key}") public Student get(@PathVariable("key") String key){ ValueOperations valueOperations = redisTemplate.opsForValue(); Object o = valueOperations.get(key); Student s = (Student) o; return s; } @DeleteMapping("/delete/{key}") public boolean delete(@PathVariable("key") String key){ Boolean delete = redisTemplate.delete(key); return delete; } }
Redis的数据类型
-
字符串
@GetMapping("/string") public String stringTest(){ redisTemplate.opsForValue().set("str","Hello World"); String str = (String) redisTemplate.opsForValue().get("str"); return str; }
-
列表
@GetMapping("/list") public List<String> listTest(){ ListOperations<String,String> listOperations = redisTemplate.opsForList(); listOperations.leftPush("list","Hello"); listOperations.leftPush("list","World"); listOperations.leftPush("list","Java"); List<String> list = listOperations.range("list",0,2); return list; }
-
集合
GetMapping("/set") public Set<String> setTest(){ SetOperations<String,String> setOperations = redisTemplate.opsForSet(); setOperations.add("set","Hello"); setOperations.add("set","Hello"); setOperations.add("set","World"); setOperations.add("set","World"); setOperations.add("set","Java"); setOperations.add("set","Java"); Set<String> set = setOperations.members("set"); return set; }
-
有序集合
@GetMapping("/zset") public Set<String> zsetTest(){ ZSetOperations<String,String> zSetOperations = redisTemplate.opsForZSet(); zSetOperations.add("zset","Hello",1); zSetOperations.add("zset","World",2); zSetOperations.add("zset","Java",3); Set<String> set = zSetOperations.range("zset",0,2); return set; }
-
哈希
@GetMapping("/hashsave")public String hashSave(){ HashOperations<String,String,String> hashOperations = redisTemplate.opsForHash(); hashOperations.put("hashMap1","1","11"); hashOperations.put("hashMap2","1","111"); hashOperations.put("hashMap1","2","22"); hashOperations.put("hashMap2","2","222"); hashOperations.put("hashMap1","3","33"); hashOperations.put("hashMap2","3","333"); String result = (String)redisTemplate.opsForHash().get("hashMap2", "3"); System.out.println(result); return result;}
持久化机制
-
AOF
全量备份总是耗时的,有时候我们提供一种更加高效的方式AOF,工作机制很简单,redis会将每一个收到的写命令都通过write函数追加到文件中。通俗的理解就是日志记录。
-
RDB
- 优势
(1)RDB文件紧凑,全量备份,非常适合用于进行备份和灾难恢复。
(2)生成RDB文件的时候,redis主进程会fork()一个子进程来处理所有保存工作,主进程不需要进行任何磁盘IO操作。
(3)RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。
-
劣势
RDB快照是一次全量备份,存储的是内存数据的二进制序列化形式,存储上非常紧凑。当进行快照持久化时,会开启一个子进程专门负责快照持久化,子进程会拥有父进程的内存数据,父进程修改内存子进程不会反应出来,所以在快照持久化期间修改的数据不会被保存,可能丢失数据。