添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
  • key * dbsize 区别:
  • dbsize 命令在计算键总数的时候不会遍历数据库中所有的键,而是直接返回一个叫键总数变量的值,这个键总数变量存储的就是当前数据库中键的数量,所以 dbsize 命令执行的时间复杂度为 O(1)
  • keys * 命令会遍历数据库中所有的键,这个命令执行的时间复杂度为 O(n),所以在线上环境保存着大量键的情况下,这个命令可能会导致 Redis 阻塞的,不建议在生产环境上使用
  • 检测键是否存在

    # 如果键存在则返回 1,不存在则返回 0
    exists key
    
    127.0.0.1:6379> exists java
    (integer) 1
    127.0.0.1:6379> exists not_exist_key
    (integer) 0
    

    删除键

    # 返回的是成功删除键的个数,如果删除的键不存在,则会返回 0
    del key
    
    127.0.0.1:6379> del java
    (integer) 1
    127.0.0.1:6379> exists java
    (integer) 0
    127.0.0.1:6379> del not_exist_key
    (integer) 0
    

    设置键过期

    # 当超过超时时间后,会自动删除键,单位为秒
    expire key seconds
    
  • ttl 命令会返回键的剩余过期时间,它有 3 种返回值:
  • 大于等于 0 的整数:键剩余的过期时间
  • -1 :键没设置过期时间
  • -2 :键不存在
  • 127.0.0.1:6379> expire hello 10
    (integer) 1
    # 剩余 4 秒
    127.0.0.1:6379> ttl hello
    (integer) 4
    127.0.0.1:6379> ttl hello
    (integer) 1
    127.0.0.1:6379> ttl hello
    (integer) -2
    127.0.0.1:6379> get hello
    (nil)
    

    查看键的类型

    # 返回键的类型,redis 数据结构类型一共包含 5 种
    type key
    
    127.0.0.1:6379> keys *
    1) "python"
    127.0.0.1:6379> type python
    string
    

    单个键

    键重命名

    rename key newKey
    
    127.0.0.1:6379> get python
    "jedis"
    127.0.0.1:6379> rename python java
    127.0.0.1:6379> get python
    (nil)
    127.0.0.1:6379> get java
    "jedis"
    

    字符串

    字符串类型是 Redis 中最基础的数据结构

    键为字符串,值可以是字符串、数字、二进制数据(图片、音频),二进制数据的最大值不能超过 512 MB

    常用命令

    设置值

    设置单个值

    以下操作设置键值对,返回结果 OK 代表设置成功

    set key value
    
    127.0.0.1:6379> set hello world
    

    键 key 不存在才能设置成功,常用于添加新的键值对,常见场景是实现分布式锁,这个命令等同于 set key value nx

    setnx key value
    

    键 key 存在才能设置成功,常用于更新

    set key value xx
    
    # hello 键不存在
    127.0.0.1:6379> exists hello
    (integer) 0
    127.0.0.1:6379> set hello world
    # 因为键 hello 已存在,所以 setnx 失败,结果返回为 0
    127.0.0.1:6379> setnx hello world
    (integer) 0
    # 因为键 hello 已存在,所以 set xx 成功,结果返回为 OK
    127.0.0.1:6379> set hello jedis xx
    

    批量设置值

    mset key1 value1 key2 value2 ...
    
    127.0.0.1:6379> mset a 1 b 2 c 3 d 4
    

    获取值

    获取单个值

    # 如果 key 不存在,则返回 nil (空)
    get key
    
    127.0.0.1:6379> get hello
    "jedis"
    

    批量获取值

    mget key1 key2 ...
    
    127.0.0.1:6379> mget a b c d
    1) "1"
    2) "2"
    3) "3"
    4) "4"
    

    用于对值做自增操作

  • 值如果不是整数,返回错误
  • 值是整数,返回自增后的结果
  • 键不存在,按照值为 0 自增,返回结果 1
  • incr key
    
    27.0.0.1:6379> exists key
    (integer) 0
    # 键不存在,按照值为 0 自增,返回结果 1
    127.0.0.1:6379> incr key
    (integer) 1
    127.0.0.1:6379> incr key
    (integer) 2
    # 值不是整数,返回错误
    127.0.0.1:6379> set hello world
    127.0.0.1:6379> incr hello
    (error) ERR value is not an integer or out of range
    

    常用命令

    设置值

    # 键: key 、值: field value
    hset key field value
    
    127.0.0.1:6379> hset user name mingyu
    (integer) 1
    

    获取值

    # 如果键或 field 不存在,则会返回 nil
    hget key field
    
    127.0.0.1:6379> hget user name
    "mingyu"
    # field 不存在,返回 nil
    127.0.0.1:6379> hget user age
    (nil)
    

    删除 field

    # 结果返回成功删除 field 的个数
    hdel key field
    
    127.0.0.1:6379> hdel user name
    (integer) 1
    127.0.0.1:6379> hdel user age
    (integer) 0
    

    计算 field 个数

    hlen key
    
    127.0.0.1:6379> hset user name mingyu
    (integer) 1
    127.0.0.1:6379> hset user age 18
    (integer) 1
    # 键 user 含有 2 个 field: name、age
    127.0.0.1:6379> hlen user
    (integer) 2
    

    判断 field 是否存在

    # 存在返回 1, 不存在返回 0
    hexists key field
    
    127.0.0.1:6379> hexists user name
    (integer) 1
    127.0.0.1:6379> hexists user city
    (integer) 0
    

    获取所有 field

    hkeys key
    
    127.0.0.1:6379> hkeys user
    1) "name"
    2) "age"
    

    获取所有 value

    hvals key
    
    127.0.0.1:6379> hvals user
    1) "mingyu"
    2) "18"
    

    列表是用于存储多个有序的字符串

    在 Redis 中,不仅可以对列表两端进行插入(push)和弹出(pop)的操作,还可以进行获取指定范围的元素列表、获取指定索引下标的元素等操作。列表是一种比较灵活的数据结构,可以充当栈和队列。

  • 列表的特点:
  • 元素是有序的(可以获取某个范围的元素列表)
  • 列表中的元素可以是重复的
  • 常用命令

    添加操作

    # 从右边插入元素
    rpush key value [value ...]
    # 从左边插入元素
    lpush key value [value ...]
    
    127.0.0.1:6379> lpush listkey b a c
    (integer) 3
    127.0.0.1:6379> lrange listkey 0 -1
    1) "c"
    2) "a"
    3) "b"
    

    获取指定范围内的元素列表

    列表下标从左到右是 0 ~ n - 1,从右到左是 -1 ~ - n

    lrange key start end 
    # 可以获取从左到右所有列表元素
    lrange listkey 0 -1
    

    获取指定下标的元素

    lindex key index
    
    127.0.0.1:6379> lindex listkey -1
    

    获取列表长度

    llen key
    
    127.0.0.1:6379> llen listkey
    (integer) 3
    

    从列表弹出元素

    # 从列表左侧弹出元素
    lpop key
    # 从列表右侧弹出元素
    rpop key
    
    127.0.0.1:6379> lpop listkey
    127.0.0.1:6379> lrange listkey 0 -1
    1) "a"
    2) "b"
    

    删除指定的元素

    这个命令会有 3 种情况:

  • count > 0 从左到右删除最多 count 个元素
  • count < 0 从右到左删除最多 count 绝对值个元素
  • count = 0 删除所有元素
  • lrem key count value
    
    127.0.0.1:6379> lpush listkey a a a a a java b a
    (integer) 8
    127.0.0.1:6379> lrange listkey 0 -1
    1) "a"
    2) "b"
    3) "java"
    4) "a"
    5) "a"
    6) "a"
    7) "a"
    8) "a"
    127.0.0.1:6379> lrem listkey 4 a
    (integer) 4
    127.0.0.1:6379> lrange listkey 0 -1
    1) "b"
    2) "java"
    3) "a"
    4) "a"
    127.0.0.1:6379>
    

    按照索引范围修剪列表

    ltrim key start end
    
    # 会保留列表 listkey 第 2 ~ 4 个元素
    127.0.0.1:6379> ltrim listkey 1 3
    127.0.0.1:6379> lrange listkey 0 -1
    1) "java"
    2) "a"
    3) "a"
    
    # 修改指定索引下标的元素
    lset key index newValue 
    
    127.0.0.1:6379> lrange listkey 0 -1
    1) "java"
    2) "a"
    3) "a"
    127.0.0.1:6379> lset listkey 0 a
    127.0.0.1:6379> lrange listkey 0 -1
    1) "a"
    2) "a"
    3) "a"
    

    集合与列表类型类似,不允许有重复元素,且集合中元素是无序的

    集合内常用命令

    添加元素

    sadd key element [element...]
    
    127.0.0.1:6379> sadd myset a b c
    (integer) 3
    # 集合中已经有a b, 所以此次添加成功元素为 0 个
    127.0.0.1:6379> sadd myset a b
    (integer) 0
    

    删除元素

    srem key element [element...]
    
    127.0.0.1:6379> srem myset a b
    (integer) 2
    # 集合中并没有 hello 元素,所以删除元素个数为 0
    127.0.0.1:6379> srem myset hello
    (integer) 0
    

    计算元素个数

    scard key
    
    127.0.0.1:6379> scard myset
    (integer) 1
    

    判断元素是否在集合中

    sismember key element
    
    127.0.0.1:6379> sismember myset c
    (integer) 1
    127.0.0.1:6379> sismember myset hello
    (integer) 0
    

    从集合中随机弹出元素

    # 弹出元素会将元素从集合中删除
    spop key
    
    127.0.0.1:6379> spop myset
    127.0.0.1:6379> exists myset
    (integer) 0
    

    获取所有元素

    # 返回结果是无序的
    smembers key
    
    127.0.0.1:6379> smembers myset
    (empty array)
    127.0.0.1:6379> sadd myset a b c
    (integer) 3
    127.0.0.1:6379> smembers myset
    1) "c"
    2) "a"
    3) "b"
    

    有序集合

    与集合类似,不同的是集合中的元素是有序的

    集合内常用命令

    添加成员

    zadd key score member [score member ...]
    
    # 向有序集合 user:ranking 添加用户
    127.0.0.1:6379> zadd user:ranking 251 mingyu 100 jack
    (integer) 2
    

    计算成员个数

    zcard key
    
    127.0.0.1:6379> zcard user:ranking
    (integer) 2
    

    计算某个成员的分数

    zscore key member
    
    127.0.0.1:6379> zscore user:ranking mingyu
    "251"
    127.0.0.1:6379> zscore user:ranking jack
    "100"
    127.0.0.1:6379> zscore user:ranking tom
    (nil)
    

    计算成员排名

    排名从 0 开始

    # 从低到高排名
    zrank key member
    # 从高到低排名
    zrevrank key member
    
    127.0.0.1:6379> zrank user:ranking mingyu
    (integer) 1
    127.0.0.1:6379> zrevrank user:ranking mingyu
    (integer) 0
    

    删除成员

    zrem key member
    
    127.0.0.1:6379> zrem user:ranking jack
    (integer) 1
    127.0.0.1:6379> zcard user:ranking
    (integer) 1
    

    增加成员分数

    zincrby key increment member 
    
    127.0.0.1:6379> zincrby user:ranking 9 mingyu
    "260"
    

    参考资料