寻名
发布于 2020-11-03 / 42 阅读
1

SpringBoot 之 Redis

一、 SpringBoot 之 Redis

Redis 作为一款强大的内存数据存储系统,在现代应用开发中具有不可替代的地位。SpringBoot 框架以其简洁高效的特点,为与 Redis 的集成提供了便利。

二、Redis 简介

Redis 是一个开源的、使用内存存储的键值对数据结构服务器,支持多种数据结构和丰富的操作命令,常用于缓存、数据存储、消息队列等场景。

三、Redis-cli 操作

  1. 连接 Redis 服务器
    • redis-cli -h <host> -p <port> :指定主机和端口进行连接。
  2. 基本操作命令
    • 字符串操作
      • SET key value [EX seconds|PX milliseconds] [NX|XX] :设置字符串值,并可设置过期时间和条件。
      • GET key :获取字符串值。
      • INCR key :将字符串值自增 1。
    • 哈希操作
      • HSET key field value :设置哈希字段值。
      • HGET key field :获取哈希字段值。
      • HDEL key field [field...] :删除哈希字段。
    • 列表操作
      • LPUSH key value [value...] :在列表头部添加元素。
      • RPUSH key value [value...] :在列表尾部添加元素。
      • LPOP key :弹出列表头部元素。
      • RPOP key :弹出列表尾部元素。
    • 集合操作
      • SADD key member [member...] :向集合添加元素。
      • SMEMBERS key :获取集合所有元素。
      • SREM key member [member...] :从集合删除元素。
    • 有序集合操作
      • ZADD key score member [score member...] :添加有序集合元素及分数。
      • ZRANGE key start stop [WITHSCORES] :按索引范围获取元素及分数。
      • ZREM key member [member...] :删除有序集合元素。

四、Redis 的过期时间设置

  1. 命令设置
    • EXPIRE key seconds :设置键的过期时间,以秒为单位。
    • PEXPIRE key milliseconds :设置键的过期时间,以毫秒为单位。
  2. 数据结构层面设置
    • 在使用 SET 命令设置字符串值时,可以通过 EXPX 选项设置过期时间。

五、Spring Boot 集成 Redis

  1. 引入依赖
    在项目的 pom.xml 文件中添加 spring-boot-starter-data-redis 依赖。
  2. 配置连接信息
    application.propertiesapplication.yml 文件中配置 Redis 的主机地址、端口、密码等连接参数,例如:
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=your_password

六、Spring Boot 中 Redis 的操作

  1. 字符串操作
    • redisTemplate.opsForValue().set(key, value) :设置字符串值。
    • redisTemplate.opsForValue().get(key) :获取字符串值。
  2. 哈希操作
    • redisTemplate.opsForHash().putAll(hashKey, map) :批量设置哈希字段值。
    • redisTemplate.opsForHash().entries(hashKey) :获取哈希的所有字段和值。
  3. 列表操作
    • redisTemplate.opsForList().leftPush(listKey, value) :在列表头部添加元素。
    • redisTemplate.opsForList().rightPop(listKey) :弹出列表尾部元素。
  4. 集合操作
    • redisTemplate.opsForSet().add(setKey, values) :向集合添加元素。
    • redisTemplate.opsForSet().members(setKey) :获取集合所有元素。
  5. 有序集合操作
    • redisTemplate.opsForZSet().add(zsetKey, value, score) :添加有序集合元素及分数。
    • redisTemplate.opsForZSet().range(zsetKey, start, end) :按索引范围获取元素。

七、Redis 分布式锁

  1. 分布式锁的概念及应用场景
    • 概念:在分布式系统中,用于协调多个进程或线程对共享资源的访问,确保同一时间只有一个进程或线程能够获取锁并进行操作。
    • 应用场景:如分布式任务调度、分布式事务处理等。
  2. 实现方式 - Redisson
    • Redisson 是一个基于 Redis 的 Java 分布式锁实现框架。
    • 提供了丰富的锁类型和特性,如可重入锁、公平锁、读写锁等。
    • 示例代码:
Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379");
RedissonClient redisson = Redisson.create(config);

RLock lock = redisson.getLock("your_lock_key");

try {
    // 尝试获取锁,最多等待 10 秒,锁自动释放时间为 30 秒
    boolean acquired = lock.tryLock(10, 30, TimeUnit.SECONDS);
    if (acquired) {
        // 执行业务逻辑
    }
} catch (InterruptedException e) {
    e.printStackTrace();
} finally {
    // 释放锁
    lock.unlock();
}
  1. 分布式锁的注意事项
    • 锁的超时时间设置要合理,避免锁提前释放或无法释放。
    • 处理锁获取失败的情况,进行适当的重试或错误处理。

八、Redis 的过期策略

  1. 定时删除
    • 为每个设置了过期时间的键创建一个定时器,当过期时间到达时,删除键。
    • 优点:保证内存及时释放。
    • 缺点:消耗 CPU 资源。
  2. 惰性删除
    • 当获取键时,检查键是否过期,如果过期则删除。
    • 优点:节省 CPU 资源。
    • 缺点:可能导致内存无法及时释放。
  3. 定期删除
    • 每隔一段时间,随机检查一定数量的设置了过期时间的键,删除其中过期的键。
    • 是定时删除和惰性删除的一种平衡策略。

九、Redis 的淘汰策略

  1. noeviction :默认策略,当内存使用达到限制时,不删除数据,新的写入操作会报错。
  2. volatile-lru :从设置了过期时间的数据中,使用 LRU 算法删除最近最少使用的数据。
  3. volatile-ttl :从设置了过期时间的数据中,删除即将过期的数据。
  4. volatile-random :从设置了过期时间的数据中,随机删除数据。
  5. allkeys-lru :从所有数据中,使用 LRU 算法删除最近最少使用的数据。
  6. allkeys-random :从所有数据中,随机删除数据。

十、Redis 的持久化

  1. RDB(Redis Database Backup)
    • 原理:将 Redis 在某一时刻的数据快照保存到磁盘文件中。
    • 优点:恢复数据速度快,适合大规模数据的备份。
    • 缺点:可能会丢失数据,因为是定时保存。
  2. AOF(Append Only File)
    • 原理:将 Redis 执行的写命令记录到日志文件中。
    • 优点:数据完整性更好,最多丢失一秒的数据。
    • 缺点:文件较大,恢复数据相对较慢。

十一、Redis 作为缓存的应用

  1. 缓存数据的策略
    • 确定缓存的粒度,是缓存整个对象还是部分属性。
    • 设置合适的缓存过期时间,根据数据的更新频率和重要性。
  2. 缓存穿透、缓存雪崩和缓存击穿的解决方案
    • 缓存穿透:
      • 对不存在的数据也进行缓存(空值或特殊标识)。
      • 使用布隆过滤器快速判断数据是否存在。
    • 缓存雪崩:
      • 给不同的缓存设置不同的过期时间,避免集中过期。
      • 增加互斥锁或分布式锁,控制并发访问数据库。
    • 缓存击穿:
      • 对热点数据设置永不过期。
      • 使用锁机制,保证只有一个线程去查询数据库并更新缓存。

十二、注意事项

  1. 数据一致性
    • 当使用 Redis 作为缓存时,要注意与数据库的数据一致性问题,通过合适的更新策略和同步机制来解决。
  2. 内存管理
    • 监控 Redis 的内存使用情况,及时调整数据结构和优化存储方式。
  3. 性能优化
    • 根据业务需求,合理选择数据结构和操作命令,以提高性能。

综上所述,Spring Boot 与 Redis 的集成提供了强大的功能和灵活的应用方式,但在实际使用中需要充分考虑各种因素,以确保系统的稳定和高效运行。