下载与图形化界面

redis 3.0.504
Another-Redis-Desktop-Manager-win-1.17.1

Redis 数据类型

五种常用数据类型

Redis 存储的是 key-value 结构的数据,其中 key 是字符串类型, value 有五种常用数据类型

  1. 字符串 String
    普通字符串,redis 中最简单的数据类型

  2. 哈希 hash
    也叫散列,类似于 java 中的 hashmap 结构

  3. 列表 list
    按照插入顺序排序,可以有重复元素,类似于 java 中的 linkedlist

  4. 集合 set
    无序集合,没有重复元素,类似 java 中的 hashset

  5. 有序集合 sorted set / zset
    集合中的每个元素关联一个分数(score),根据分数升序排序,没有重复元素

Redis 常用命令

字符串操作命令

  1. 设置指定 key 的值:
    set key value

  2. 获取指定 key 的值:
    get key

  3. 设置指定 key 的值,并将 key 的过期时间设为 seconds 秒:
    setex key seconds value

  4. 只有在 key 不存在时设置 key 的值:
    setnx key value

哈希操作命令

Redis hash 是一个 string 类型的 filed 和 value 的映射表,hash 特别适合用于存储对象

  1. 将哈希表 key 中的字段 field 的值设为 value:
    hset key field value

  2. 获取存储在哈希表中指定字段的值:
    hget key field

  3. 删除存储在哈希表中的指定字段
    hdel key field

  4. 获取哈希表中的所有字段
    hkeys key

  5. 获取哈希表中所有值
    hvals key

列表常用命令

Redis 列表是简单的字符串列表,按照插入顺序排序

  1. 将一个或多个插入到列表头部:
    lpush key vakue1 [value2]

  2. 获取列表指定范围内的元素:
    lrange key start stop
    返回全部元素:lrange key 0 -1

  3. 移除并获取列表最后一个元素:
    rpop key

  4. 获取列表长度:
    llen key

集合操作命令

Redis set 是 string 类型的无序集合。集合成员是唯一的,集合不能出现重复的数据

  1. 向集合添加一个或多个成员:
    sadd key member1 [member2]

  2. 返回集合中的所有成员:
    smembers key

  3. 获取集合成员数:
    scard key

  4. 返回给定所有集合的交集:
    sinter key1 [key2]

  5. 返回所有给定集合的并集:
    sunion key1 [key2]

  6. 删除集合中的一个或多个成员:
    srem key member1 [member2]

有序集合操作命令

Redis 有序集合是 string 类型元素的集合,且不允许有重复成员,每个元素都会关联一个 double 类型的分数

  1. 向有序集合添加一个或多个成员
    zadd key score1 member1 [score2 member2]

  2. 通过索引区间返回有序集合中指定区间内的成员[和分数]
    zrange key start stop [withscores]

  3. 有序集合中对指定成员的分数加上增量 increment
    zincrby key increment member

  4. 移除有序集合中的一个或多个成员
    zrem key member [member …]

通用命令

Redis 的通用命令是不分数据类型的,都可以使用的命令:

  1. 查找所有符合给定模式(pattern)的 key:
    keyse pattern

  2. 检查给定 key 是否存在:
    exists key

  3. 返回 key 锁储存的值的类型:
    type key

  4. key 存在时删除 key:
    del key

在 java 中操作 Redis

Redis的 java客户端

Redis 的 java 客户端,常用的几种:

  1. Jedis

  2. Lettuce

  3. Spring Data Redis:
    是 spring 的一部分,对 Redis 底层开发包进行了高度封装。
    在 spring 项目中,可以使用 Spring Data Redis 来简化操作

Spring Data Redis 使用方式

操作步骤:

  1. 导入 Spring Data Redis 的 maven 坐标
  2. 配置 Redis 数据源
  3. 编写配置类,创建 RedisTemplate 对象
  4. 通过 RedisTemplate 对象操作 Redis

Redis 相关问题

  1. 缓存击穿:指查询一个不存在的数据,mysql 查询不到数据也不会直接写入缓存,会导致每次请求都查数据库
    解决方案:

    1. 缓存空数据:查询返回的数据为空,仍把空结果进行缓存
      优点:简单
      缺点:消耗内存,可能发生不一致的问题
    2. 使用布隆过滤器:布隆过滤器使用 bitmap(位图),相当于一个以位(bit)为单位的数组,数组每个单元只存二进制数0或1
      存数据:通过多个 hash 函数获取 hash 值,根据 hash 计算对应位置
      查询: 使用相同的 hash 函数获取 hash 值,根据 hash 计算对应位置是否全为1
      误判率:数组越小误判率越大,数组越大误判率越小,同时带来更多内存消耗
      布隆过滤器实现方案:Redisson/Guava
  2. 缓存击穿:给某一个 key 设置了过期时间,恰好这时间点对这个 key 有大量的并发请求,这些并发的请求可能瞬间把数据库压垮
    解决方案:

    1. 互斥锁(分布式锁):保证数据强一致性、性能差
    2. 逻辑过期:高可用、性能优
  3. 缓存雪崩:同一时段大量的缓存 key 同时失效或 Redis 服务器宕机,导致大量请求到达数据库,带来巨大压力
    解决方案:

    1. 给不同的 key 的 TTL 添加随机值
    2. 给业务增加多级缓存
    3. 利用 Redis 集群提高服务可用性:哨兵模式、集群模式
    4. 给缓存业务添加降级限流策略(可做为系统的保底策略,适用于穿透、击穿、雪崩)
  4. Redis 合适的应用场景:

    1. String:缓存、技术、共享 Session
    2. Hash: 存对象
    3. List:消息队列
    4. Set: 兴趣标签
    5. ZSET: 排行榜
  5. Redis 6.0之前为什么一直不使用多线程:

    1. 使用 Redis,CPU 不是瓶颈,受制于内存、网络
    2. 提高 Redis 性能,可用 Pipeline(命令批量处理)
    3. 单线程内部维护比较低
    4. 多线程会需要线程切换、加锁、解锁,也有可能导致死锁问题
    5. 惰性 Rehash(渐进式 Rehash)阻塞减少