Redis入门:缓存与持久化全面解析

一、Redis是什么?为什么它这么快?

Redis(Remote Dictionary Server)是一个开源的、基于内存的键值存储系统。它常被用作数据库、缓存和消息中间件

Redis核心特性与高性能原因:

  1. 基于内存:数据主要存储在内存中,读写速度远超磁盘数据库。

  2. 单线程架构:避免了多线程的上下文切换和竞争条件,简化了设计。

  3. 高效的数据结构:Redis提供了字符串、哈希、列表、集合、有序集合等丰富的数据结构,直接内置在底层实现中。

  4. I/O多路复用:使用epoll、kqueue等机制处理大量并发连接。

二、Redis安装与基本使用

1. 安装(以Linux为例)

wget http://download.redis.io/releases/redis-7.0.0.tar.gz
tar xzf redis-7.0.0.tar.gz
cd redis-7.0.0
make
src/redis-server # 启动服务器
src/redis-cli    # 启动命令行客户端

2. 五大基础数据类型与命令

2. AOF(Append Only File)

3. 如何选择?

四、Spring Boot集成Redis实战
1.添加依赖 (pom.xml):

作为下一步,你可以深入学习Redis的事务、发布订阅、主从复制和集群模式,以应对更复杂的业务场景。

  • String(字符串):最简单的键值对。

    SET username "zhangsan"  # 设置值
    GET username             # 获取值 -> "zhangsan"
    INCR counter            # 自增 -> 常用于计数

    Hash(哈希):适合存储对象。

    HSET user:1000 name "lisi" age 30  # 设置字段
    HGET user:1000 name               # 获取字段 -> "lisi"
    HGETALL user:1000                 # 获取所有字段 -> 1) "name" 2) "lisi" 3) "age" 4) "30"

    List(列表):有序、可重复的字符串列表。

    LPUSH mylist "world"  # 从左边插入
    LPUSH mylist "hello"
    LRANGE mylist 0 -1    # 获取列表所有元素 -> 1) "hello" 2) "world"
    RPOP mylist           # 从右边弹出一个元素 -> "world"

    Set(集合):无序、不可重复的集合。

    SADD tags "java" "python" "redis"  # 添加元素
    SMEMBERS tags                      # 获取所有成员
    SISMEMBER tags "java"              # 检查成员是否存在 -> (integer) 1

    Sorted Set(有序集合):带分数的有序集合。

    ZADD leaderboard 100 "player1" 200 "player2" # 添加成员和分数
    ZRANGE leaderboard 0 -1 WITHSCORES          # 按分数升序排列
    ZREVRANGE leaderboard 0 -1 WITHSCORES       # 按分数降序排列(排行榜)
    三、持久化:内存数据如何持久到磁盘?

    由于Redis数据存储在内存中,重启或宕机会导致数据丢失。因此,持久化至关重要。Redis提供了两种主要方式:

    1. RDB(Redis Database)

  • 机制:在指定的时间间隔内,生成内存中所有数据的一个快照(Snapshot)文件(.rdb)。

  • 配置 (redis.conf):

    save 900 1      # 900秒内至少有1个key发生变化,则触发保存
    save 300 10     # 300秒内至少有10个key发生变化
    save 60 10000   # 60秒内至少有10000个key发生变化

  • 优点

    • 文件紧凑,适合做备份和灾难恢复

    • 最大化Redis性能,父进程唯一的工作就是fork一个子进程来完成持久化。

    • 恢复大数据集时速度比AOF快。

  • 缺点

    • 可能会丢失最后一次快照之后的数据(数据不够安全)。

    • 当数据集很大时,fork子进程的过程可能会非常耗时。

  • 机制:记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据。

  • 配置 (redis.conf):

    appendonly yes              # 开启AOF
    appendfsync everysec        # 每秒同步一次(在性能和数据安全间取得平衡)
    # appendfsync always       # 每次写命令都同步,最安全,性能最差
    # appendfsync no           # 由操作系统决定何时同步,性能最好,最不安全

  • 优点

    • 数据安全性更高,最多丢失一秒的数据(appendfsync everysec)。

    • AOF文件易于理解和解析。

  • 缺点

    • AOF文件通常比RDB文件大。

    • 恢复速度通常比RDB慢。

  • 追求极致性能,可以容忍分钟级数据丢失:仅使用RDB。

    • 数据安全性要求很高:同时开启RDB和AOF。在这种情况下,Redis重启时会优先使用AOF文件来恢复数据,因为它通常更完整。

    • 建议:在大多数生产环境中,同时开启RDB和AOF是一种稳妥的策略。RDB用于定期备份和快速恢复,AOF用于保证数据安全。

      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-data-redis</artifactId>
      </dependency>

      2.配置连接 (application.yml):

      spring:
        redis:
          host: localhost
          port: 6379
          # password: your-password # 如果设置了密码
          database: 0

      3.使用RedisTemplate

      @RestController
      public class TestController {
          
          @Autowired
          private RedisTemplate<String, String> redisTemplate;
          
          @GetMapping("/set")
          public String setValue(String key, String value) {
              redisTemplate.opsForValue().set(key, value);
              return "Value set successfully!";
          }
          
          @GetMapping("/get")
          public String getValue(String key) {
              return redisTemplate.opsForValue().get(key);
          }
          
          @GetMapping("/setUser")
          public String setUser() {
              // 使用Hash存储对象
              redisTemplate.opsForHash().put("user:2000", "name", "wangwu");
              redisTemplate.opsForHash().put("user:2000", "age", "25");
              return "User set successfully!";
          }
      }
      五、总结

      Redis以其惊人的速度和丰富的数据结构,成为了现代应用架构中不可或缺的一环。本文带你从零开始,了解了:

    • Redis的核心概念与数据类型。

    • RDB和AOF两种持久化机制的原理与取舍

    • 如何在Spring Boot项目中集成和使用Redis。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值