Redis学习笔记

38 阅读3分钟

一、数据结构与常用命令

1. 字符串(String)

  • 特点:二进制安全,支持动态扩容(SDS结构),可存储字符串、数字等。

  • 常用命令

    • SET key value:设置值

    • GET key:获取值

    • INCR key:自增(原子操作)

    • SETEX key seconds value:设置带过期时间的值

2. 哈希(Hash)

  • 特点:键值对集合,适合存储对象。

  • 常用命令

    • HSET key field value:设置字段值

    • HGET key field:获取字段值

    • HGETALL key:获取所有字段值

3. 列表(List)

  • 特点:双向链表,支持头部/尾部操作。

  • 常用命令

    • LPUSH key value:左插入

    • RPUSH key value:右插入

    • LPOP key:左弹出

    • LRANGE key start end:范围查询

4. 集合(Set)

  • 特点:无序、唯一,底层用哈希表或整数集合(intset)实现。

  • 常用命令

    • SADD key member:添加元素

    • SMEMBERS key:获取所有元素

    • SINTER key1 key2:求交集

5. 有序集合 (Sorted Set)

  • 特点:有序、唯一,每个元素关联一个分数(score),底层用跳表(SkipList)实现。

  • 常用命令

    • ZADD key score member:添加元素

    • ZRANGE key start end WITHSCORES:按分数范围查询

二、通用命令与客户端

1. 通用命令

  • KEYS *:查询所有键(谨慎使用,避免阻塞)

  • EXPIRE key seconds:设置键过期时间

  • TTL key:查看键剩余过期时间

  • DEL key:删除键

2. Java 客户端

  • Jedis

    • Jedis jedis = new Jedis("localhost", 6379);  
      jedis.set("name", "zhangsan");  
      String value = jedis.get("name");  
      jedis.close();  
      
  • Redisson 分布式锁

    • // 配置  
      Config config = new Config();  
      config.useSingleServer().setAddress("redis://localhost:6379");  
      RedissonClient redisson = Redisson.create(config);  
      // 加锁  
      RLock lock = redisson.getLock("myLock");  
      lock.lock();  
      try {  
          // 业务逻辑  
      } finally {  
          lock.unlock();  
      }  
      

三、持久化机制

1. RDB (快照持久化)

  • 原理:定时将内存数据生成快照文件(.rdb)。

  • 触发方式

    • 手动:SAVE(阻塞)、BGSAVE(异步)
    • 自动:在redis.conf中配置(如save 900 1表示900秒内至少1次写操作则触发)。
  • 优缺点

    • 优点:文件小,恢复快。

    • 缺点:可能丢失最近数据(两次快照间的数据)。

2. AOF (日志持久化)

  • 原理:记录所有写操作命令,重启时重放命令恢复数据。

  • 配置

    • appendonly yes:开启AOF
    • appendfsync always|everysec|no:同步策略(默认everysec)。
  • 优缺点

    • 优点:数据安全性高(最多丢失1秒数据)。

    • 缺点:文件体积大,恢复速度慢。

四、主从复制与哨兵模式

1. 主从复制(一主多从)

  • 作用:数据备份、读写分离。

  • 配置步骤

    • 主节点:正常配置(bind 0.0.0.0,关闭保护模式)。
    • 从节点:在redis.conf中添加replicaof 主节点IP 端口
  • 验证

    • 主节点执行INFO replication查看从节点列表。

    • 从节点执行INFO replication确认角色为slave

2. 哨兵模式( Sentinel

  • 作用:自动监控主从节点,主节点故障时自动故障转移。

  • 配置步骤

    • 创建sentinel.conf

      1. sentinel monitor mymaster 主节点IP 端口 2  
        sentinel down-after-milliseconds mymaster 30000  
        
    • 启动哨兵:redis-sentinel sentinel.conf

五、缓存常见问题与解决方案

1. 缓存穿透

  • 问题:请求不存在的数据,导致数据库压力过大。

  • 解决方案

    • 缓存空对象:查询不存在的数据时缓存NULL(设置短过期时间)。

    • 布隆过滤器:提前过滤无效请求(Google Guava实现)。

2. 缓存击穿

  • 问题:热门key过期瞬间,大量请求直达数据库。

  • 解决方案

    • 互斥锁(Redisson) :只允许一个线程重建缓存。

    • 热点数据永不过期:手动更新缓存,避免自动过期。

3. 缓存雪崩

  • 问题:大量key同时过期或缓存服务故障,请求直达数据库。

  • 解决方案

    • 随机化过期时间:给key添加随机过期时间偏移。

    • 多级缓存:本地缓存(如Ehcache)+ Redis,减少Redis压力。

    • 限流降级:限制请求量,非核心业务返回默认值。

六、 分布式锁 实现

1. 核心要求

  • 互斥性、原子性、过期时间、可重入性、安全性(避免误删其他线程的锁)。

2. Redisson 实现

  • 加锁

    • RLock lock = redisson.getLock("resourceLock");  
      lock.lock(10, TimeUnit.SECONDS); // 加锁并设置过期时间  
      
  • 释放锁

    • if (lock.isHeldByCurrentThread()) {  
          lock.unlock();  
      }  
      
  • 特点:自动续期(锁持有线程存活时,过期时间自动延长)。