SpringBoot集成Redis之配置、序列化与持久化方式

 更新时间:2024年11月21日 08:52:40   作者:真心喜欢你吖  
本文介绍了Redis的基本概念、常用数据类型及操作、SpringBoot整合Redis的方法、高级特性与安全性、性能优化、测试与部署、数据一致性及版本更新等内容,通过本文的学习,读者可以掌握Redis的使用方法,并在实际项目中发挥其优势

一、简介什么是Redis

Redis是一个开源的、基于内存的高性能键值对存储数据库,支持多种数据结构如字符串、哈希、列表、集合等。

它以其卓越的性能、高可用性和持久性而广受欢迎。

为什么要使用Redis

Redis的使用可以解决以下问题:

  1. 低延迟读写:提升用户体验。
  2. 支撑海量数据和流量:适用于大数据和高流量的应用。
  3. 大规模集群管理:简化分布式应用的部署和管理。
  4. 成本考量:降低硬件、软件和人力成本。

二、常用Redis类型及操作

1. String类型

介绍:最基本的数据存储类型,用于存储单个数据。

基本操作

  • 添加/修改数据:set key value
  • 获取数据:get key
  • 删除:del key

2. Hash类型

介绍:存储键值对集合,适用于存储对象。

基本操作

  • 添加/修改数据:hset key field value
  • 获取数据:hget key field
  • 删除数据:hdel key field

3. List类型

基本概念:存储有序的数据集合。

基本操作

  • 添加/修改数据:lpush key value(左侧添加),rpush key value(右侧添加)
  • 获取数据:lrange key start stop
  • 获取并移除数据:lpop key(左侧移除),rpop key(右侧移除)

4. Set类型

基本介绍:存储不重复的集合。

基本操作

  • 添加数据:sadd key member
  • 获取数据:smembers key
  • 删除数据:srem key member

5. Sorted Set (zset)

概念:存储可排序的集合。

基本操作

  • 添加数据:zadd key score member
  • 获取全部数据:zrange key start stop
  • 删除数据:zrem key member

三、Spring Boot整合Redis

引入依赖

pom.xml中添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
    <version>2.6.0</version>
</dependency>

配置yaml

application.yml中配置Redis连接信息:

spring:
  redis:
    host: 自己的ip
    port: 自己的端口号  # 默认 6379
    database: 0  # Redis使用的数据库
    timeout: 18000  # 连接超时事件毫秒
    password: yourpassword  # 密码(如果需要)
    lettuce:
      pool:
        max-active: 20  # 连接池最大连接数
        max-idle: 5  # 最大阻塞等待时间
        min-idle: 0  # 连接池最小空闲连接

RedisTemplate模版序列化配置

配置RedisTemplate以使用JSON序列化:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.util.Arrays;

@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String,Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory){
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(lettuceConnectionFactory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

Redis的Demo案例

以下是一个简单的测试案例,展示如何使用RedisTemplate

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@SpringBootTest
public class RedisTest {
    @Autowired
    RedisTemplate<String, Object> redisTemplate;

    @Test
    public void testString() {
        String key = "name";
        String name = "dession";
        redisTemplate.opsForValue().set(key, name);
        redisTemplate.expire(key, 1, TimeUnit.DAYS);
        System.out.println("Retrieved from Redis: " + redisTemplate.opsForValue().get(key));
    }

    @Test
    public void testHash() {
        String key = "users";
        redisTemplate.opsForHash().put(key, "name", "zhangsan");
        redisTemplate.expire(key, 1, TimeUnit.DAYS);
        Map<String, Object> map = new HashMap<>();
        map.put("age", 12);
        map.put("sex", "男");
        redisTemplate.opsForHash().putAll(key, map);
        Object name = redisTemplate.opsForHash().get(key, "name");
        System.out.println("Name from Hash: " + name);
    }
}

四、高级特性与安全性

高级特性

  • 持久化:Redis支持RDB和AOF两种持久化方式,确保数据的安全性。
  • 复制:通过主从复制,可以提高数据的可用性和读取性能。
  • 哨兵模式:用于实现高可用性,自动故障转移。
  • 集群:支持数据分片,提高存储和处理大规模数据集的能力。

安全性

  • 密码认证:配置requirepass指令设置密码,确保只有授权用户可以访问Redis。
  • 网络隔离:将Redis部署在内网中,避免直接暴露在公网上。
  • TLS/SSL:使用TLS/SSL加密数据传输,保护数据在传输过程中的安全。

五、性能优化

  • 选择合适的数据类型:根据使用场景选择合适的数据类型,可以提高性能和降低内存使用。
  • 调整内存使用策略:通过配置maxmemory-policy,可以控制内存使用和数据淘汰策略。
  • 监控和调优:使用Redis自带的监控工具或第三方工具,如Redisson、Spring Boot Actuator等,监控Redis性能并进行调优。

六、测试与部署

  • 测试:在开发和测试环境中充分测试Redis的集成,确保功能正确性和性能满足要求。
  • 部署:在生产环境中部署Redis时,考虑使用容器化技术如Docker,以便于管理和扩展。

七、数据一致性

  • 缓存与数据库同步:确保缓存数据与数据库数据的一致性,可以使用延迟双删策略或消息队列来实现。

八、版本更新

  • 平滑升级:定期检查Redis的新版本,按照官方文档进行平滑升级,以利用新特性和性能改进。

你可以在Spring Boot项目中成功集成Redis,并使用其强大的数据结构来优化你的应用程序。Redis的高级特性和最佳实践还需要你进一步探索和学习。希望这篇文章能帮助你更好地理解和使用Redis。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot 2.0 整合sharding-jdbc中间件实现数据分库分表

    SpringBoot 2.0 整合sharding-jdbc中间件实现数据分库分表

    这篇文章主要介绍了SpringBoot 2.0 整合sharding-jdbc中间件,实现数据分库分表,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-06-06
  • springcloud gateway设置context-path的操作

    springcloud gateway设置context-path的操作

    这篇文章主要介绍了springcloud gateway设置context-path的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • SpringBoot2.0整合SpringCloud Finchley @hystrixcommand注解找不到解决方案

    SpringBoot2.0整合SpringCloud Finchley @hystrixcommand注解找不到解决方案

    这篇文章主要介绍了SpringBoot2.0整合SpringCloud Finchley @hystrixcommand注解找不到解决方案,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • Java实现将Word转换成Html的示例代码

    Java实现将Word转换成Html的示例代码

    在业务中,常常会需要在浏览器中预览Word文档,或者需要将Word文档转成HTML文件保存,本文主要为大家详细介绍了Java实现Word转换成Html的相关方法,希望对大家有所帮助
    2024-02-02
  • springboot启动扫描不到dao层接口的解决方案

    springboot启动扫描不到dao层接口的解决方案

    这篇文章主要介绍了springboot启动扫描不到dao层接口的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java程序死锁问题定位与解决方法

    Java程序死锁问题定位与解决方法

    死锁是一种特定的程序状态,主要是由于循环依赖导致彼此一直处于等待中,而使得程序陷入僵局,相当尴尬,死锁不仅仅发生在线程之间,而对于资源独占的进程之间同样可能出现死锁,本文给大家介绍了Java程序死锁问题定位与解决方法,需要的朋友可以参考下
    2024-11-11
  • mybatis中批量更新多个字段的2种实现方法

    mybatis中批量更新多个字段的2种实现方法

    当我们使用mybatis的时候,可能经常会碰到一批数据的批量更新问题,因为如果一条数据一更新,那每一条数据就需要涉及到一次数据库的操作,本文主要介绍了mybatis中批量更新多个字段的2种实现方法,感兴趣的可以了解一下
    2023-09-09
  • Spring rest接口中的LocalDateTime日期类型转时间戳

    Spring rest接口中的LocalDateTime日期类型转时间戳

    这篇文章主要介绍了Spring rest接口中的LocalDateTime日期类型转时间戳的方法,Java程序中一般将日期类型定义为LocalDateTime,数据库中保存的时间是0时区的时间
    2023-03-03
  • java中BIO、NIO、AIO都有啥区别

    java中BIO、NIO、AIO都有啥区别

    这篇文章主要介绍了java中BIO、NIO、AIO都有啥区别,IO模型就是说用什么样的通道进行数据的发送和接收,Java共支持3种网络编程IO模式:BIO,NIO,AIO,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • 解决@RequestBody搭配@Data的大坑

    解决@RequestBody搭配@Data的大坑

    这篇文章主要介绍了解决@RequestBody搭配@Data的大坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10

最新评论