作者Gitee地址 https://gitee.com/thciweicloud
作者项目 面包博客,一个微服务架构的前后端分离博客系统。
SpringBoot 整合Redis
Redis
基于内存进行存储,支持 key-value 的存储形式,底层是用 C 语言编写的。
基于 key-value 形式的数据字典,结构非常简单,没有数据表的概念,直接用键值对的形式完成数据的管理,Redis 支持 5 种数据类型:
- 字符串
- 列表
- 集合
- 有序集合
- 哈希
安装 Redis
1、下载 Redis
https://redis.io/download
2、解压,并在本地硬盘任意位置创建文件夹,在其中创建 3 个子文件夹
- bin:放置启动 Redis 的可执行文件
- db:放置数据文件
- etc:放置配置文件,设置 Redis 服务的端口、日志文件位置、数据文件位置…
启动 Redis 服务
在powershell中启动服务
在自己的myRedis文件夹中通过 bat或者
redis-server.exe redis.windows.conf
-开启服务 redis-server --service-start
-关闭服务 redis-server --service-stop
-卸载服务 redis-server --service-uninstall
-服务重命名 redis-server --service-name server-name
1、进入 redis 目录,启动 redis-server。
sudo ./bin/redis-server ./etc/redis.conf
2、进入 redis 目录,启动 redis-cli,启动 Redis 的客户端管理窗口,在此窗口中即可操作 Redis 数据库。
./bin/redis-cli
3、对数据进行操作。
set key value
get key
keys *
keys na*
4、关闭 Redis 服务。
shutdown
5、退出客户端,control+c。
参考这篇文章让redis成为我们本地的服务
https://blog.csdn.net/Mrqiang9001/article/details/79428976?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-3.control
整合 Redis
实际是Spring Data Redis 这个框架 操作 Redis。
1、创建 Maven 工程。
数据库连接池 commons-pool2
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.2.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
2、创建实体类,实现序列化接口 Serializable,否则无法存入 Redis 数据库。
package com.thciwei.demo.entity;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
public class Student implements Serializable {
private Integer id;
private String name;
private Double score;
private Date birthday;
}
3、创建控制器。
package com.thciwei.demo.controller;
import com.thciwei.demo.entity.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class StudentHandler {
@Autowired
private RedisTemplate redisTemplate;
@PostMapping("/set")
public void set(@RequestBody Student student) {
redisTemplate.opsForValue().set("student", student);
}
}
4、创建配置文件 application.yml
0表示统一的redis数据库,host 连服务器就写服务器的 ip
有密码一定要配置密码
spring:
redis:
database: 0
host: localhost
port: 6379
password: thciwei
5、创建启动类
package com.thciwei.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
我们使用 get 查询redis中数据,但redis会自动把我们的存入数据追加一些东西,所以可以通过keys *查询名称,再用 get
如 get “\xac\xed\x00\x05t\x00\astudent”
事实上存入数据时,redis会自动把数据序列化,当取出时再执行反序列化,所以实体类当然要实现序列化接口
redis增删改查
增和改使用set方法,查询get,删除delete,使用postman验证即可
{
"id":1,
"name":"李四",
"score":96.5,
"birthday":"1996-03-03"
}
package com.thciwei.demo.controller;
import com.thciwei.demo.entity.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
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", student);
}
@GetMapping("/get/{key}")
public Student get(@PathVariable("key") String key) {
return (Student) redisTemplate.opsForValue().get(key);
}
@DeleteMapping("/delete/{key}")
public boolean delete(@PathVariable("key") String key){
redisTemplate.delete(key);
return redisTemplate.hasKey(key);
}
}
Redis 5 种数据类型
字符串
@GetMapping("/string")
public String stringTest(){
redisTemplate.opsForValue().set("str","Hello World");
String str = (String) redisTemplate.opsForValue().get("str");
return str;
}
列表
range方法后面跟的是index,几到几
@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;
}
集合
set集合具有数据唯一性的特征,最后 get 获得值只是 hello、world、java
@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;
}
有序集合
特性:顺序可控
它与set区别在哪里呢,你是用postman测试set请求,返回的json数据并没有按照我们存入的hello world java出来,而 zset进行排序,数据量大的情况下,可以根据顺序调用数据,其他方面与 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;
}
哈希
HashMap需要 key value
redis这里 HashOperations 需要 key hashkey value
如何理解不同?key 是每一组数据的 ID,hashkey 和 value 是一组完整的 HashMap 数据,通过 key 来区分不同的 HashMap。
HashMap hashMap1 = new HashMap();
hashMap1.put(key1,value1);
HashMap hashMap2 = new HashMap();
hashMap2.put(key2,value2);
HashMap hashMap3 = new HashMap();
hashMap3.put(key3,value3);
HashOperations<String,String,String> hashOperations = redisTemplate.opsForHash();
hashOperations.put(hashMap1,key1,value1);
hashOperations.put(hashMap2,key2,value2);
hashOperations.put(hashMap3,key3,value3);
@GetMapping("/hash")
public void hashTest(){
HashOperations<String,String,String> hashOperations=redisTemplate.opsForHash();
hashOperations.put("key","hashkey","hello");
System.out.println(hashOperations.get("key","hashkey"));
}
//取得hello