一、NoSQL 介绍
NoSQL 是指非关系型数据库 ,非关系型数据库和关系型数据库两者存在许多显著的不同点,其中最重要的是 NoSQL 不使用 SQL 作为查询语言。其数据存储可以不需要固定的表格模式,一般都有水平可扩展性的特征。 NoSQL 主要有如下几种不同的分类:
- key/value 键值存储。这种数据存储通常都是无数据结构的, 一般被当作字符串或者二进制数据,但是数据加载速度快,典型的使用场景是处理高并发或者用于日志系统等,这一类的数据库有 Redis、Tokyo Cabinet 等。
- 列存储数据库。列存储数据库功能相对局限,但是查找速度快,容易进行分布式扩展,一般用于分布式文件系统中,这一类的数据库有 HBase、Cassandra等。
- 文档型数据库 和 key/value 键值存储类似,文档型数据库也没有严格的数据格式,这既是缺点也是是优势,因为不需要预先创建表结构,数据格式更加灵活,一般可用在 We 应用中,这一类数据库有 MongoDB、CouchDB等。
- 图形数据库 。图形数据库专注于构建关系图谱,例如社交网络,推荐系统等,这一类的数据库有 Neo4J、 DEX等。
二、Redis简介
Redis 是一个使用 C 编写的基于内存的 NoSQL 数据库,它是目前最流行的键值对存储数据库。Redis 由一个Key 、Value 映射的字典构成, 与其他 NoSQL 不同, Redis 中的Value 类型不局限于符串,还支持列表、集合、有序集合、散列等。Redis 不仅可以当作缓存使用,也可以配置数持久化后当作 NoSQL 数据库使用,目前支持两种持久化方式:快照持久化和 AOF 持久化。另一方面, Redis 也可以搭建集群或者主从复制结构,在高并发环境下具有高可用性。
三、Redis 安装
四、Spring Boot 中使用Redis
Redis 的 Java 客户端有很多,例如 Jedis, JRedis 、 Spring Data Redis 等,Spring Boot 借助于 Spring Data Redis 为 Redis 提供了开箱即用自动化配置,开发者只需要添加相关依赖并配置 Redis 连接信息即可。
4.1 创建 Spring Boot 项目
点击File->New->Project->Spring Initializr->勾选Spring Web,添加如下依赖:
<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>
默认情况下 spring-boot-starter-data-redis
使用的 Redis 工具是 Lettuc,考虑到有的开发者习惯使用 Jedis ,因此可以从 spring-boot-starter-data-redis
中排除 Lettuc 并引入 Jedis ,修改为以下依赖:
<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>
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
4.2 配置Redis
spring:
redis:
database: 0 # Redis数据库索引(默认为0)
host: localhost #Redis服务器地址
port: 6379 # Redis服务器连接端口
password: # Redis服务器连接密码(默认为空)
jedis:
pool:
max-active: 200 # 连接池最大连接数(使用负值表示没有限制)
max-idle: 10 # 连接池中的最大空闲连接
min-idle: 0 # 连接池中的最小空闲连接
max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制)
注意:如果项目中用了 Lettuce 只需将 jedis 修改 lettuce 即可
4.3 配置Redis
@Configuration
public class RedisConfig {
@Bean
@SuppressWarnings("all")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
System.out.println("==================自定义的redisTemplate实例化了===================");
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
// hash的key也采用String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
// value序列化方式采用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash的value序列化方式采用jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
可能会需要引入相关依赖包,可以参考:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.13.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.0</version>
</dependency>
4.4 创建 Controller
@RestController
@RequestMapping("/test")
public class TestController {
/* redis常量key */
public static final String REDIS_KEY = "test:_w";
@Resource
private RedisTemplate redisTemplate;
//请求地址:localhost:8080/test/add
@GetMapping("/add")
public void add(){
//当前时间时间戳
String nowStr = String.valueOf(System.currentTimeMillis());
//设置redis中的key值
String redisKey = REDIS_KEY.concat(nowStr);
//向对应的key值添加数据
redisTemplate.opsForValue().set(REDIS_KEY,"测试向redis中添加数据");
//设置过期时间
redisTemplate.expire(REDIS_KEY,20, TimeUnit.SECONDS);
}
//请求地址:localhost:8080/test/get
@GetMapping("/get")
public void get(){
//获取redis中的数据
String str = (String) redisTemplate.opsForValue().get(REDIS_KEY);
System.out.println("获取redis中的数据-->" + str);
}
}
4.5 测试结果
分别调用两个接口: