(十四)Spring Boot NoSQL【Redis】

一、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 安装

       参考 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 测试结果

分别调用两个接口:
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值