Redis 基本介绍
Redis Introduction
The open source, in-memory data store used by millions of developers as a database, cache, streaming engine, and message broker.
基本概念:redis 是一个开源的、使用 C 语言编写的、支持网络交互的、可基于内存也可持久化的 Key-Value 数据库(非关系性数据库)。
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis支持丰富的数据类型,支持string,list,sorted set,set,zset,hash等数据结构的存储。
- 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行。
- 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除。
- 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
redis 数据类型
Redis data types
Overview of data types supported by Redis
Redis is a data structure server. At its core, Redis provides a collection of native data types that help you solve a wide variety of problems, from caching to queuing to event processing. Below is a short description of each data type, with links to broader overviews and command references.
Redis 远程连接配置
默认情况下 Redis 是无法在远程直接进行连接,如果想要强制远程连接需要进行更改配置文件。
配置 bind IP 0.0.0.0
关闭保护模式 protected-mode no
服务器放行 端口 6379
如果是宝塔面板(需要安全放行 6379 端口)
Springboot Redis
Redis 是我们 Java 开发中,使用频次非常高的一个 nosql 数据库,数据以 key-value 键值对的形式存储在内存中。redis 的常用使用场景,可以做缓存,分布式锁,自增序列等,使用 redis 的方式和我们使用数据库的方式差不多,首先我们要在自己的本机电脑或者服务器上安装一个 redis 的服务器,通过我们的java 客户端在程序中进行集成,然后通过客户端完成对redis的增删改查操作。
SpringBoot 中更常见的方式是集成 spring-data-redis,这是 spring 提供的一个专门用来操作redis的项目,封装了对 redis 的常用操作,里边主要封装了 jedis 和 lettuce 两个客户端。相当于是在他们的基础上加了一层门面。
添加redis所需依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
常规配置如下: 在 application.yml 配置文件中配置 redis 的连接信息
spring:
redis:
host: localhost
port: 6379
password: root
database: 0
application.properties
#Redis 服务器主机地址
spring.data.redis.host=127.0.0.1
#Redis 服务器连接端口
spring.data.redis.port=6379
#Redis 服务器连接密码(默认为空)
spring.data.redis.password=123456
#连接池最大连接数(使用负值表示没有限制)
spring.data.redis.pool.max-active=8
#连接池最大阻塞等待时间(使用负值表示没有限制)
spring.data.redis.pool.max-wait=-1
#连接池中的最大空闲连接
spring.data.redis.pool.max-idle=8
#连接池中的最小空闲连接
spring.data.redis.pool.min-idle=0
#连接超时时间(毫秒)
spring.data.redis.timeout=30000
StringRedisTemplate
RedisTemplate 和 StringRedisTemplate 的区别?
两者的关系是 StringRedisTemplate 继承 RedisTemplate。
两者的数据是不共通的;也就是说 StringRedisTemplate 只能管理 StringRedisTemplate 里面的数据,RedisTemplate 只能管理 RedisTemplate 中的数据。
SDR默认采用的序列化策略有两种,一种是 String 的序列化策略,一种是JDK的序列化策略。
StringRedisTemplate
默认采用的是 String 的序列化策略,保存的 key 和 value 都是采用此策略序列化保存的。
RedisTemplate
默认采用的是 JDK 的序列化策略,保存的 key 和 value 都是采用此策略序列化保存的。
那么就可以得出一个结论,如果你想使用默认的配置来操作 redis,则如果操作的数据是字节数组,就是用 redistemplate,如果操作的数据是明文,使用stringredistemplate。
当然在项目中真实使用时,一般是自定义 redistemplate 的 bean 实例,来设置具体的序列化策略,说白了就是 redistemplate 通过自定义 bean 可以实现和 stringredistemplate 一样的序列化,使用起来更加灵活。
Springboot web
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Java Date 类时间格式化
详细代码:
package com.mslmsxp.redistest.service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.text.SimpleDateFormat;
import java.util.Date;
@RestController
@Slf4j
public class RedisService {
@Autowired(required = false)
private StringRedisTemplate redis;
@GetMapping("/redis")
public String GetRedisData() {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy.MM.dd hh:ss:mm:SSS");
String time = simpleDateFormat.format(new Date());
redis.opsForValue().set("time", time);
String name = redis.opsForValue().get("time");
log.info("successfully add");
return name;
}
}
Reactive 反应式
反应式编程(Reactive Programming)对有些人来说可能相对陌生一点。反应式编程是一套完整的编程体系,既有其指导思想,又有相应的框架和库的支持,并且在生产环境中有大量实际的应用。在支持度方面,既有大公司参与实践,也有强大的开源社区的支持。
反应式编程出现的时间并不短,不过在最近的一段时间内,它得到了很大的关注。这主要体现在主流编程平台和框架增强了对它的支持,使它得到了更多的受众,同时也反映了其在开发中的价值。
就 Java 平台来说,几个突出的事件包括:Java 9中把反应式流规范以 java.util.concurrent.Flow 类的方式添加到了标准库中;Spring 5对反应式编程模型提供了内置支持,并增加了新的 WebFlux 模块来支持反应式 Web 应用的开发。在前端开发中,Angular 框架也内置使用了 RxJS。
反应式编程所涵盖的内容很多。本 Chat 作为反应式编程的入门,主要侧重在 Java 平台。与其他编程范式一样,反应式编程要求开发人员改变其固有的思维模式,以不同的角度来看问题。对于熟悉了传统面向对象编程范式的人来说,这样的思想转变可能并不那么容易。
反应式编程在解决某些问题时有其先天的优势。在对应用性能要求很高的今天,反应式编程有更大的用武之地。作为开发人员来说,根据项目的需求和特征,选择最适合的编程模型可以达到事半功倍的效果。这也是本 Chat 的出发点。