Redis
- 基于内存进行存储,支持key-value的存储形式,底层使用C语言编写。
- 基于key-value形式的数据字典,结构非常简单,没有数据表的概念,直接用键值对的形式完成数据的管理。
- Redis支持5种数据类型(这里的数据类型与Java种的数据类型并不是对应的):
- 字符串
- 列表
- 集合
- 有序集合
- 哈希
安装
这里使用的免安装版本的。安装版本的比较不方便,注意redis官方不支持win版本,但是有第三方提供。
启动Redis
- 这是win启动redis服务的文件
双击打开,这样就成功了
- 这是win启动redis客户端的文件
双击启动后,这样就成功了,注意先启动redis服务,后启动客户端
-
在这个窗口就可以操作redis数据库了。
-
对数据库进行操作
存:set key value 取:get key
Spring Boot 整合Redis
- 操作Redis的方式有很多种
- 在SpringBoot整合Redis,实际上操作Redis的是SpringData Redis或者jedis框架。
-
首先构建Springboot项目,这里可以使用maven自己构建maven工程,也可以使用IDEA提供的脚手架快速构建
下面是所需依赖
<parent> <groupId>org.springframework.boot</groupId> <version>2.2.5.RELEASE</version> <artifactId>spring-boot-starter-parent</artifactId> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 整合redis--> <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> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies>
-
创建实体类,注意必须要实现序列化接口
/* * @description: 想要存到redis数据库中,必须要实现序列化接口 * @author: wdhcr * @dateTime: 2020/4/13 15:27 */ @Data public class Student implements Serializable { private Integer id; private String name; private Double score; private Date birthday; }
-
创建控制器
@RestController public class StudentController { /* * @description: 自动创建实例化,操作redis数据库 * @author: wdhcr * @dateTime: 2020/4/13 15:33 */ @Autowired private RedisTemplate redisTemplate; @PostMapping("/setStudent") public void setStudent(@RequestBody Student student) { /*ValueOperations<K, V>将redis中的key-value封装成一个对象,我们之就只需要操作这个对象即可 * public ValueOperations<K, V> opsForValue() { return this.valueOps; } * */ redisTemplate.opsForValue().set("student", student); } }
-
创建application.yml配置文件
spring: redis: database: 0 host: localhost port: 6379
-
创建启动类,位置要在controller的上一层
@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class,args); } }
-
启动springboot项目
-
接下来使用postman工具发送一条数据
-
注意发送json数据要在请求头携带数据类型,如下:
-
使用post请求发送数据
-
-
当后端没有报错时,证明保存成功了 。
-
当我们开心的使用redis客户端进行~get student~时发现
原因:
-
这是因为redis在存的时候自动的对key值进行了序列化的操作,当存的时候会在student前面追加一些字符串。
-
可以使用
keys *student
查看它存入后的名字,可以看到在student前面追加了一些字符串。 -
我们可以试着用查出来的名字get一下
可以看到获取到了,且它的每个属性前面都追加了字符串,redis把对象序列化成这样存到内存中。不用担心,我们在取的时候他会自动反序列化回来。
-
-
编写获取student对象的代码
@GetMapping("/get/{key}") public Student getStudent(@PathVariable("key") String key){ return (Student) redisTemplate.opsForValue().get(key); }
在使用postman发送请求
我们可以看到,又将student对象原封不动的取出来了。
-
到这里我们来验证一下上面说过了实体类必须实现序列化接口,我们把
Serializable
接口去掉再发送请求就会报错,如下
在我们取值时就会报错Failed to deserialize payload,无法进行反序列化。
-
接下来编写删除操作的控制器
/* * @description: 根据key删除值 * @params: [key] * @return: boolean * @author: wdhcr * @dateTime: 2020/4/13 18:34 */ @DeleteMapping("/delete/{key}") public boolean delete(@PathVariable("key") String key){ return redisTemplate.delete(key); }
当返回true时,表示删除成功。
我们使用postman工具发送删除请求
我们发送一次获取请求
可以看到获取不到了
-
以上就是Springboot整合Redis的增删改查操作
Redis的五种数据类型
-
字符串
字符串的存取比较简单直接上代码
/* * @description: redis存取字符串或object * @params: [] * @return: java.lang.String * @author: wdhcr * @dateTime: 2020/4/13 18:51 */ @GetMapping("/string") public String stringType(){ //存,存string或object类型数据时使用opsForValue() redisTemplate.opsForValue().set("string","hello word!"); //取 return (String) redisTemplate.opsForValue().get("string"); }
-
列表
/* * @description: redis存取列表数据 * @params: [] * @return: java.util.List * @author: wdhcr * @dateTime: 2020/4/13 19:02 */ @GetMapping("/list") public List listType(){ /*ListOperations是框架为我们封装好的操作list数据的实例化接口 * public ListOperations<K, V> opsForList() { return this.listOps; } * * * listOperations可从左边存取,也可从右边存取 * * */ ListOperations listOperations = redisTemplate.opsForList(); //存 listOperations.leftPush("list","hello word"); listOperations.leftPush("list","你好 世界!"); listOperations.leftPush("list","Java!"); //取 根据key ,起始下标,结束下表 List<String> list = listOperations.range("list", 0, 2); return list; }
结果:
-
集合
/* * @description: redis存取集合数据 * @params: [] * @return: java.util.Set<java.lang.String> * @author: wdhcr * @dateTime: 2020/4/13 19:04 */ @GetMapping("/set") public Set<String> setType(){ SetOperations setOperations = redisTemplate.opsForSet(); //set会自动去重数据。 setOperations.add("set","hello"); setOperations.add("set","hello"); setOperations.add("set","word"); setOperations.add("set","word"); setOperations.add("set","java"); Set set = setOperations.members("set"); return set; }
结果:set会自动去重
-
有序集合
/* * @description: redis存取有序集合数据 * @params: [] * @return: java.util.Set<java.lang.String> * @author: wdhcr * @dateTime: 2020/4/13 19:06 */ @GetMapping("/zset") public Set<String> zsetType(){ ZSetOperations zSetOperations = redisTemplate.opsForZSet(); //set会自动去重数据。 zSetOperations.add("zset","hello",1); zSetOperations.add("zset","hello",2); zSetOperations.add("zset","word",3); zSetOperations.add("zset","word",4); zSetOperations.add("zset","java",5); //key 起始,到结束 Set set = zSetOperations.range("zset",0,5); return set; }
结果:
-
哈希
-
这里的哈希和Java中的哈希不太一样
- Java中的hashMap 格式:key,value;
- HashOperations 格式:key,hashkey(描述value的key),value;
key是每组数据的id,hashkey就相当于hashmap中的key,是对value值的描述举个例子:
age:123
这个hashkey就是值age,value指123
/* * @description: redis对哈希的存取 * @params: [] * @return: void * @author: wdhcr * @dateTime: 2020/4/13 19:21 */ @GetMapping("/hash") public void hashType(){ HashOperations hashOperations = redisTemplate.opsForHash(); hashOperations.put("key","name","张三"); System.out.println(hashOperations.get("key","name")); }
以上就是对Redis的简单入门使用方法。
-