Bootstrap

Redis - ⭐常用命令

  1. 特点:Redis 的所有自带的命令都是原子性的,不用担心并发问题

一、通用命令

命令功能
KEYS查看符合模板的所有 key
SET添加一个 key-value 键值对,如果原本存在则会更新 key 对应的 value 和 key 对应的 EXPIRE
DEL删除一个指定的 Key
EXIST判断 key 是否存在
EXPIRE给 key 设置有效期(单位:sec),到期自动删除
PERSIST将 key 设置为永久有效
TTL查看 key 的有效期,-1 表示永久有效,-2 表示不存在

二、不同数据结构操作命令

  1. key 格式最佳实践:[projectName]:[serviceName]:[className]:[id]

String 类型

  1. ⭐ Spring Data Redis 命令

    方法描述
    set(K key, V value)存储到 redis。key 已经存在时,覆盖旧值,不存在时新增
    set(K key, V value, long timeout, TimeUnit unit)设置失效时间为指定时间。超过后 key 会被移除
    set(K key, V value, Duration timeout)设置超时时间,超过指定时间后,key 被移除(Duration 是 Jdk 8 的 API)
    set(K key, V value, long offset)覆写(overwrite)给定 key 所储存的字符串值,从偏移量 offset 开始
    get(Object key)获取指定 key 的 value,key 不存在时,返回 null。key 不能 null
    getAndSet(K key, V value)获取 key 的旧值,并赋值新的 value。key 不能 null
    get(K key, long start, long end)获取指定 key 指定范围的字符串 [start,end],从索引 0 开始
    append(K key, String value)将新的 value 追加到 key 的旧值尾部,key 不存在时,自动新建。key 不能为 null
    Long size(K key)获取 key 的 value 的长度,key 不存在时,返回 0。key 不能为 null
    Boolean setIfAbsent(K key, V value)如果 key 不存在,则新增,否则不改变原来的值。其余重载方法与 set 方法对应。key、value 不能为 null
    `Boolean setIfAbsent(K key, V value, long timeout, TimeUnit unit)
    Boolean setIfAbsent(K key, V value, Duration timeout)`1、key 不存在时进行设值,返回 true,否则不进行设值,返回 false
    2、此方法相当于先设置 key,然后设置 key 的过期时间,它的操作是原子性的,是事务安全的
    Boolean setIfPresent(K key, V value, Duration timeout)key 存在时,才修改它的值,否则不新增,与 setIfAbsent 相反
    Long increment(K key)将存储为字符串值的整数值增加1,并返回结果(key 不存在时自动创建)
    Long increment(K key, long delta)将存储为字符串值的整数值增加 delta,并返回结果(key 不存在时自动创建)(delta 为负数时,做减法)
    Double increment(K key, double delta)将存储为字符串值的小数值增加 delta,并返回结果(key 不存在时自动创建)
    Long decrement(K key)将存储为字符串的整数值减1,key 不存在时自动创建
    Long decrement(K key, long delta)减去指定的数值,key 不存在时自动创建(delta为负数时,做加法)
    List multiGet(Collection keys)同时获取多个 key 的值,按请求的 key 的顺序返回对应的 value,key 不存在的返回 null
    multiSet(Map<? extends K, ? extends V> map)同时存储多个 key-value
    Boolean multiSetIfAbsent(Map<? extends K, ? extends V> map)当 key 不存在时新增,否则不进行操作
  2. Redis 命令

    命令功能
    SET添加或修改键值对
    SETNXset key-value if not exists 添加键值对,存在则不做修改
    SETEX添加键值对,指定有效期
    GET根据 key 获取 value
    MSET批量添加多个 String 键值对
    MGET根据多个 key 获取多个 value
    INCR整数 key 自增 1
    INCRBY整数 key 自增并自定义步长
    INCRBYFLOAT浮点数 key 自增并自定义步长
  3. 使用建议:建议 SDS 长度小于 44 字节(因为 SDS < 44 byte 时会采用 EMBSTR 编码,采用连续内存空间,只需要申请一次内存,效率高)

  4. String 编码方式

    1. INT 编码:存储整数值且大小在 LONG_MAX 范围内,则直接将数据保存在 RedisObject 的 ptr 指针位置
    2. EMBSTR 编码:SDS 长度 ≤ 44 字节,RedisObject 和 SDS 申请连续内存空间,共 64 byte 大小,效率高
    3. RAW 编码:SDS 长度 > 44 字节,RedisObject 的 ptr 指针指向 SDS 独立内存空间(需要申请两次内存空间)

Hash 类型

  1. 定义:value 是一个无序字典,类似 Java 中的 HashMap

  2. 功能:针对单个字段 CRUD 很方便,因为对象中每个字段独立存储

  3. 示例

    user:1001                            // key
      ├── name: "John Doe"               // hashKey: name
      ├── age: "30"                      // hashKey: age
      └── email: "[email protected]"      // hashKey: email
    
  4. Spring Data Redis 命令

    方法描述
    Long size(H key)获取指定 hash(key) 的元素个数,kye 不存在时,返回 0
    Boolean hasKey(H key, Object hashKey)判断 hash 中 是否存在指定的元素,key 不存在时,返回 false
    Set keys(H key)获取指定 hash(key) 中所有的 hashKey。key 不存在时,返回空集合[]
    List values(H key)获取指定 hash(key) 的所有值。key 不存在时,返回空 list
    Long delete(H key, Object... hashKeys)删除指定的 hash(key) 中指定的元素(hashKeys),返回成功删除元素个数,key 不存在时返回 0
    void put(H key, HK hashKey, HV value)往 key 中插入键值对 hashKey-value。hashKey 重复时,后插入的覆盖旧值。key 不存在时,自动新增
    void putAll(H key, Map<? extends HK, ? extends HV> m)单次插入多个元素。key 不存在时自动新增
    Boolean putIfAbsent(H key, HK hashKey, HV value)key 或者 hashKey 不存在时,才插入值
    HV get(H key, Object hashKey)获取 hash 中指定的 hashKey,key 不存在时,返回 null
    Map<HK, HV> entries(H key)获取指定 key 的 hash map。key 不存在时,返回空 map
    Long lengthOfValue(H key, HK hashKey)获取 key 对应的 hash map 的 hashKey 对应的元素值的长度
    List multiGet(H key, Collection hashKeys)同时获取 key 对应的 hash map 中的多个元素值,hashKey 不存在时,返回 null
    Long increment(H key, HK hashKey, long delta)为指定 key 的 hash map 中的元素 hashKey 的数值加上整数值 delta。key 不存在时,直接新增
    Double increment(H key, HK hashKey, double delta)为指定 key 的 hash map 中的元素 hashKey 的数值加上浮点数值 delta。key 不存在时,直接新增
  5. Redis 命令

    命令描述
    ⭐HSET key field value添加或修改 key 的 field 字段值
    ⭐HGET key field获取 key 的 field 字段值
    HMGET key field1 [field2]批量查询一个 key 的多个 field 字段值
    HMSET key field1 value1 [field2 value2]批量添加或修改 key 的多个 field 值
    HGETALL key获取 key 中的所有 field 和 value
    HKEYS key获取 key 中的所有 field
    HVALS key获取 key 中的所有 value
    HINCRBY key field increment将 key 的 field 字段的值增加 increment
    HSETNX key field value如果 key 的 field 字段不存在,则设置其值为 value
  6. 编码方式

    1. ZipList 编码
      • 优点
        1. 节省内存:ZipList 是一个压缩列表,它将多个元素存储在单个连续内存块中,减少了内存的使用。
        2. 高效访问小数据集:对于小规模的数据集,ZipList 可以提供快速的访问性能。
      • 缺点
        1. 限制条件:只有当哈希表中的元素数量不超过 hash_max_ziplist_entries(默认为 512 个)且每个元素的大小不超过 hash_max_ziplist_value(默认为 64 字节)时,才使用 ZipList 编码。
        2. 性能下降:如果哈希表很大或频繁修改,ZipList 的性能会因为需要频繁重新分配内存而下降。
    2. HashTable 编码
      • 优点
        1. 扩展性好:当哈希表超过 ZipList 编码的限制时,Redis 会自动转换为 HashTable 编码,这种编码没有元素数量和大小的限制。
        2. 处理大数据集:对于大规模的数据集,HashTable 编码提供了更稳定的性能。
      • 缺点
        1. 内存使用较高:与 ZipList 相比,HashTable 使用更多的内存,因为它需要额外的空间来处理哈希冲突和存储指针。
        2. 访问速度可能较慢:对于较小的数据集,HashTable 的访问速度可能不如 ZipList 快,因为它的数据结构更复杂。

List 类型

  1. 定义:类似 Java 中的 LinkedList 类,可看做一个双向链表结构

  2. 功能:支持正向检索和反向检索

  3. 特点:有序、元素可以重复、插入删除快、查询速度一般

  4. Spring Data Redis 命令

    方法描述
    Long size(K key)返回存储在键中的列表的长度。键不存在时,返回 0;key 存储的值不是列表时返回错误
    Long leftPush(K key, V value)将指定的值插入到列表的头部。键不存在自动创建。(从左边插入)。返回 list 的大小(size)
    Long leftPushAll(K key, V... values)批量从左插入。key 不能为 null。返回 list 的大小(size)
    Long leftPushAll(K key, Collection values)批量从左插入。key,values 不能为 null
    Long leftPush(K key, V pivot, V value)对于名字为 key 的 list,从左往右先查询第一个出现的 pivot 元素,然后将 value 插入到它的左边
    Long leftPushIfPresent(K key, V value)只有当 key 存在时,才新增,否则不处理
    Long rightPush(K key, V value)右侧插入,key 不存在时,自动创建
    Long rightPush(K key, V pivot, V value)从右往左查找第一个 pivot 元素,然后将新的 value 插入到它的右侧
    Long rightPushAll(K key, Collection values)右侧批量插入
    Long rightPushAll(K key, V... values)右侧批量插入
    Long rightPushIfPresent(K key, V value)当 key 存在时,进行右侧插入,否则不处理
    set(K key, long index, V value)为名字为 key 的列表索引为 index 的元素替换为新的 value 值。key 必须存在,index 索引不能越界
    Long remove(K key, long count, Object value)删除列表(key) 中指定个数(count)的元素(value)
    count=0:删除所有 value;count>0:从左往右删除 count 个 value;count<0,从右往左删除
    List range(K key, long start, long end)查询 list 的元素值,索引范围为 [start,end],-1 表示倒数第一个元素
    V index(K key, long index)获取列表中指定索引处的元素。index 越界或 key 不存在则返回 null,index=-1 表示倒数第一个元素
    V leftPop(K key)弹出最左边的元素,弹出之后该值在列表中将不复存在。当列表为空时,返回 null。
    V rightPop(K key)弹出最右边的元素,弹出之后该值在列表中将不复存在。当列表为空时,返回 null。
    V leftPop(K key, long timeout, TimeUnit unit)弹出最左边的元素,当元素不存在时,线程阻塞等待,直到存在新元素,或者超时抛出异常
    V rightPop(K key, long timeout, TimeUnit unit)弹出最右边的元素,当元素不存在时,线程阻塞等待,直到存在新元素,或者超时抛出异常
  5. Redis 命令

    命令功能
    ⭐LPUSH key elem1 elem2 …向链表左侧插入一个或多个元素
    ⭐RPUSH key elem1 elem2 …向链表右侧插入一个或多个元素
    ⭐BLPOP & BRPOPBlock LPOP & Block RPOP,阻塞式获取,在没有元素时会等待指定时间
    LPOP key移除并返回列表左侧的第一个元素,没有则返回 nil
    RPOP key移除并返回列表右侧的第一个元素,没有则返回 nil
    LRANGE key start end返回一段 index 范围内的所有元素,-x 表示倒数第 x 个元素
  6. 底层数据结构:QuickList


Set 类型

  1. 定义:类似 Java 中的 HashSet 类,key 是 set 的名字,value 是集合中的值

  2. 功能:快速获知 value 是否在当前 set 中

  3. 特点

    1. 无序
    2. 元素唯一
    3. 查找速度快
    4. 支持交集、并集、补集功能
  4. Spring Data Redis 命令

    方法描述
    Long add(K key, V... values)往 set 中添加元素,key 不存在时自动新建。value 重复时覆盖旧值。返回 set 中的元素个数
    Long remove(K key, Object... values)移除 set 中的元素。返回 set 中剩余的元素个数。set 中没有元素时自动删除 key。key 不存在时不影响
    Boolean move(K key, V value, K destKey)将 key 对应的 set 中的值 value 剪切到目标 set(destKey) 中。key、value、destKey 不存在时不做任何操作
    V pop(K key)随机弹出 set 中的一个元素,弹出后,set 中就没有了。当 set 为空时,返回 null
    List pop(K key, long count)随机弹出 set 中 count 个元素,如果 set 的大小为 3,而 count 为 5,此时只会返回 3 个元素
    Long size(K key)获取 key 对应 set 的集合大小. key 不存在时,返回 0
    Set members(K key)获取 set 中所有的元素,key 不存在时,返回空 set
    V randomMember(K key)从 set 中随机返回一个元素,set 中此元素还会存在。key 不存在时,返回 null
    List randomMembers(K key, long count)随机返回 set 中 count 个元素
    Boolean isMember(K key, Object o)判断 key 对应的 set 中是否包含元素 o。key 不存在时,返回 false
    Set union(K key, K otherKey)获取 key 与 otherKey 对应的 set 的并集。旧值不受影响,返回合并后的值
    Set union(K key, Collection otherKeys)获取多个 set 的并集
    Long unionAndStore(K key, K otherKey, K destKey)求 key 、otherKey 的 set 并集,并将结果添加到 destKey 中。destKey 不存在时,自动创建
    返回新集合中的元素个数。当 destKey 中事先已经有值,则会被先清除
    Long unionAndStore(K key, Collection otherKeys, K destKey)将多个 set 的并集结果放入到 destKey 对应的 set 中
    destKey 不存在时自动创建。当 destKey 中事先已经有值,则会被先清除
    Set difference(K key, K otherKey)求 key 与 otherKey 对应的 set 的差集,key 减去 otherKey 后剩余的结果
    Set difference(K key, Collection otherKeys)获取 key 与所有 otherKeys 的差集
    Long differenceAndStore(K key, K otherKey, K destKey)将差集结果放入到 destKey 中。当 destKey 中事先已经有值,则会被先清除
    Long differenceAndStore(K key, Collection otherKeys, K destKey)将差集结果放入到 destKey 中。当 destKey 中事先已经有值,则会被先清除
    Set intersect(K key, K otherKey)获取 key 与 otherKey 的交集,双方都拥有的元素
    Set intersect(K key, Collection otherKeys)获取 key 与其它所有 otherKeys 的交集
    Long intersectAndStore(K key, K otherKey, K destKey)将交集结果放到 destKey 集合中。当 destKey 中事先已经有值,则会被先清除
    Long intersectAndStore(K key, Collection otherKeys, K destKey)将交集结果放到 destKey 集合中。当 destKey 中事先已经有值,则会被先清除
  5. Redis 命令

    命令功能
    SADD key member …添加元素
    SREM key member …删除元素
    SCARD key获取元素个数
    SISMEMBER key member判断一个元素是否存在于 set 中
    SMEMBERS获取 set 中所有元素
    SINTER key1 key2 …求 key1 和 key2 集合的交集
    SDIFF key1 key2 …求 key1 和 key2 集合的差集
    SUNION key1 key2 ….求 key1 和 key2 集合的并集
  6. 编码方式

    1. IntSet 编码:存储的所有数据都是整数,并且元素数量不超过 set-max-intset-entries 时,使用 IntSet 节省内存空间
    2. HT 编码:key 用来存元素,value 统一为 null             

SortedSet 类型(ZSet)

  1. 定义:有序的 set 集合,类似 Java 中的 TreeSet,每一个元素都有一个 score 属性用于排序

  2. 功能:排序且元素唯一,实现排行榜类似的功能

  3. 特点:可排序、元素不重复、查询速度快

  4. Spring Data Redis命令

    方法描述
    Boolean add(K key, V value, double score)添加元素,如果key 不存在时则新增,value 已经存在则更新,返回插入成功结果
    score 表示权重,用于排序,值越小,排序越靠前(由小到大)
    Long rank(K key, Object o)获取元素 o 在有序集合中的索引
    Set range(K key, long start, long end)获取有序的集合中指定索引范围的值,索引从0开始,-1 表示倒数第一个元素
    Set rangeByScore(K key, double min, double max)根据权重范围查询
    Set rangeByScore(K key, double min, double max, long offset, long count)offset 表示偏移量,count 表示需要获取的个数
    Long count(K key, double min, double max)获取权重在 [min,max] 直接的元素个数
    Long remove(K key, Object... values)删除有序集合中指定的元素(value)
    Long removeRange(K key, long start, long end)删除有序集合中指定索引范围内的元素
    Long removeRangeByScore(K key, double min, double max)删除有序集合中指定权重范围内的元素
    Long zCard(K key)获取集合的大小
    Long size(K key)获取集合的大小,底层调用 zCard
    Double score(K key, Object o)获取集合中指定元素的权重
  5. Redis 命令

    命令功能
    ZADD key score member添加 member 元素及其 score 值,到 key 集合中
    ZREM key member删除 member 元素
    ZSCORE key member查询 member 元素的 score 值
    ZRANK key member查询 member 元素的排名
    ZREVRANK key member查询 member 元素倒序排名
    ZCARD key获取 sorted set 中的元素个数
    ZCOUNT key min max统计 score 值在给定范围内的元素个数
    ZINCRBY key increment member指定 member 元素自增,步长为 increment
    ZRANGE key min max查询指定 升序 rank 范围 内的元素(max为最大排名,min为最小排名)
    ZREVRANGE key max min查询指定 降序 rank 范围 内的元素(max为最大排名,min为最小排名)
    ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]查询指定 升序 score 范围 内的元素 (min为最小score,max为最大score)
    LIMIT :条件查询 / offset:跳过的个数, 1则不含 max / num ; 的数据数量
    ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT]查询指定 降序 score 范围 内的元素 (min为最小score,max为最大score)
    LIMIT :条件查询 / offset:跳过的个数, 1则不含 max / num ; 的数据数量
    ZDIFF & ZINTER & ZUNION差集 & 交集 & 并集
  6. 编码方式

    1. ZipList 编码
      1. 用于实现排序功能 (手动实现排序) 并且减少内存消耗
      2. 需要根据 score 值手动实现排序功能,并通过连续存储 ele score 的方式实现键值存储
      3. 要求元素数量小于 zset_max_ziplist_entries 个,元素小于 zset_max_ziplist_value 字节
    2. SkipList 编码:用于实现排序功能,元素较多时 ZSet 会将 ZipList 编码转为 SkipList 编码
    3. Dict 编码:用于实现查找和元素唯一功能

;