SpringBoot 学习笔记_整合NoSQL —— Redis
声明:
本次学习参考 《SpringBoot + Vue 开发实战》 · 王松(著) 一书。
本文的目的是记录我学习的过程和遇到的一些问题以及解决办法,其内容主要来源于原书。
如有侵权,请联系我删除
SpringBoot 整合 NoSQL
NoSQL 指 非关系型数据库,NoSQL 不使用 SQL 作为查询语言,其数据存储可以不需要固定的表格模式,一般都有水平可扩展的特性。
NoSQL 主要分四类:
-
键值对存储数据库
以
Redis
为代表。 这种数据存储通常都是无数据结构的,一般被当做字符串或者二进制数据,但是数据加载速度快。一般用来 处理高并发 或者用于 日志系统 。 -
列存储数据库
以
HBase
、Cassandra
为代表。 功能相对局限,但查找速度快,容易分布式扩展,一般用于 分布式文件系统 。 -
文档型数据库
以
MongoDB
为代表。 与键值对存储类似,不需要预先创建表结构,数据格式灵活,一般用于 Web应用 。 -
图形数据库
以
Neo4J
、DEX
为代表。 专注于构建 关系图谱 。例如社交网络、推荐系统等。
整合 Redit
Redis 是使用 C 编写的基于内存的 NoSQL 数据库,它是目前最流行的键值对存储数据库。 Redis 中 Value 的类型不局限于字符串,还支持列表、集合、有序集合、散列等。
Redis 不仅可以当做缓存使用,也可以配置数据持久化后当做 NoSQL 数据库使用。 目前支持快照持久化和AOF持久化。
Redis 也可以搭建集群或者主从复制结构,在高并发环境下具有很高可用性。
Redis 安装
-
CentOS 7
-
安装 wget:
yum install wget
-
使用 wget 下载 Redis:
wget http://download.redis.id/releases/redis-4.0.10.tar.gz
-
解压 Redis
tar -zxvf redis-4.0.10.tar.gz
-
安装 gcc 命令
yum install gcc
-
进入 Redis 目录,编译
cd redis-4.0.10
make MALLOC=libc
make install
-
配置 Redis
在 Redis 的根目录下,打开配置文件
redis.conf
# 允许 Redis 后台启动 daemonize yes # 允许连接 Redis 实例地址。默认只允许本地连接,将下面这行默认配置注释掉,外网就可以连接了 # bind 127.0.0.1 # 设置登录 Redis 的密码 requirepass 123456 # 关闭 Redis 保护模式,配置密码之后就可以关闭了 protected-mode no
-
关闭 CentOS 7 防火墙
systemctl stop firewalld.service systemctl disable firewalld.service
-
启动 Redis
redis-server redis.conf
-
输入密码,进入 Redis 控制台
redis-cli -a 123456
-
关闭 Redis
- 控制台
127.0.0.1:6379> SHUTDOWN not connected> exit
- 命令行
redis-cli -p 6379 -a 123456 shutdown
- 控制台
-
-
Windows
-
下载 Redis 安装程序
-
https://github.com/MicrosoftArchive/redis/releases
-
-
安装 Redis 程序
点击
install
等待安装完成即可 -
配置 Redis 程序
# 允许 Redis 后台启动 daemonize yes # 允许连接 Redis 实例地址。默认只允许本地连接,将下面这行默认配置注释掉,外网就可以连接了 # bind 127.0.0.1 # 设置登录 Redis 的密码 requirepass 123456 # 关闭 Redis 保护模式,配置密码之后就可以关闭了 protected-mode no
-
启动 Redis 服务
redis-server redis.windows.conf
-
遇到的问题(一)
执行
redis-server redis.windows.conf
启动 Redis 报错Invalid argument during startup: Failed to open the .conf file: Files\Redis\redis.windows.conf CWD=C:\Users\XXX
问题原因:无法打开配置文件解决办法1:通过 cmd 命令进入 Redis 安装目录下,执行
redis-server redis.windows.conf
解决办法2:配置环境变量 REDIS_HOME 的值为 Redis 安装目录,然后执行redis-server %REDIS_HOME%\redis.windows.conf
-
遇到的问题(二)
执行
redis-server
测试 Redis 安装是否正确或者redis-server redis.windows.conf
运行时报错Creating Server TCP listening socket *:6379: bind: No such file or directory
问题原因:Redis 服务已经启动解决办法1:如果第3步没有配置 Redis 密码,在 cmd 中输入
redis-cli
进入 Redis 控制台;执行SHUTDOWN
命令终止 Redis解决办法2:如果第3步配置了 Redis 密码
requirepass 123456
或者配置了 Redis 端口port 6379
,直接输入redis-cli
命令进入后执行SHUTDOWN
会报(error) NOAUTH Authentication required.
错误,需要在 cmd 中输入redis-cli -p 6379 -a 123456
进入 Redis 控制台;执行SHUTDOWN
命令终止 Redis解决办法3(不建议):直接通过
kill
命令杀死 Redis 服务进程
-
整合 Redis
Redis 的 Java 客户端有 Jedis、JRedis、Spring Data Redis 等。
-
创建 SpringBoot 项目,添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
默认情况下,
spring-boot-starter-data-redis
使用的 Redis 工具是 Lettuce。如果需要引入 Jedis,需要排除 Lettuce 引入 Jedis<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <!-- 排除默认的 Lettuce 工具 --> <exclusions> <exclusion> <groupId>id.lettuce</groupId> <artifactId>lettuce-core</artifactId> </exclusion> </exclusions> </dependency> <!-- 引入 Jedis 依赖 --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency>
-
配置 Redis (
application.properties
)### Redis 配置 ### # 使用的 Redis 库编号,Redis 提供了 16 个 database,编号 0-15 spring.redis.database=0 # Redis 实例的地址 spring.redis.host=localhost # Redis 端口号 spring.redis.port=6379 # Redis 登录密码 spring.redis.password=123456 # Redis 连接池中最大连接数 spring.redis.jedis.pool.max-active=8 # Redis 连接池中最大空闲连接数 spring.redis.jedis.pool.max-idle=8 # Redis 连接池的最大阻塞等待时间。默认 -1 表示无限制 spring.redis.jedis.pool.max-wait=-1ms # Redis 连接池最小空闲连接数 spring.redis.jedis.pool.min-idle=0
在 SpringBoot 的自动配置类中提供了 RedisAutoConfiguration 进行 Redis 的配置。
application.properties
中的配置信息将被注入 RedisProperties 中,如果开发者没有提供 RedisTemplate 或者 StringRedisTemplate 实例,则 SpringBoot 默认会提供这两个示例。RedisTemplate 和 StringRedisTemplate 实例则提供了 Redis 的基本操作方法。
-
创建实体类
public class BookRedis implements Serializable { private Integer id; private String name; private String author; /* Getter & Setter */ }
-
创建 Controller
@RestController public class BookRedisController { // RedisTemplate 可以用来操作对象,采用的序列化方案是 JdkSerializationRedisSerializer @Autowired RedisTemplate redisTemplate; // StringRedisTemplate 是 RedisTemplate 的一个 key 和 value 的子类,采用的序列化方案是 StringRedisSerializer @Autowired StringRedisTemplate stringRedisTemplate; /** * StringRedisTemplate 和 RedisTemplate 都是通过 opsForValue、 opsForZSet 或者 opsForSet等方案 * 首先获取一个操作对象,再使用该操作对象完成数据的读写 */ @GetMapping("/test1") public void test1(){ ValueOperations<String, String> ops1 = stringRedisTemplate.opsForValue(); //向 Redis 中存储一条记录 ops1.set("name", "木屋烧烤"); //从 Redis 中取出一条记录 String name = ops1.get("name"); System.out.println(name); ValueOperations ops2 = redisTemplate.opsForValue(); BookRedis book = new BookRedis(); book.setId(10); book.setName("牛排是怎样炼成的?"); book.setAuthor("老板"); //向 Redis 中存储一个对象 ops2.set("book", book); //从 Redis 中取出一个对象 BookRedis bookRedis = (BookRedis)ops2.get("book"); System.out.println(bookRedis); } }
-
测试
https://localhost:8080/test1