美文网首页
redis基本API的理解和使用

redis基本API的理解和使用

作者: 寒雨然 | 来源:发表于2020-01-08 20:00 被阅读0次
    前言

    在正式介绍5种数据结构之前,了解一下Redis的一些全局命令、数据结构和内部编码等。

    全局命令
    • 查看所有键
      keys * —o(n)
    • 键总数
      dbsize —o(1)
    • 检查键是否存在
      exists key—o(1)如果键存在则返回1,不存在则返回0
    • 删除键
      del key [key ...]—o(1)通用所有的数据结果
    • 键过期
      expire key seconds 设置过期时间
      ttl key 剩余过期时间,它有3种返回值:(1)大于等于0的整数:键剩余的过期时间。(2)-1:键没设置过期时间。(3)-2:键不存在
    • 键的数据结构类型
      type key
    5种数据结构
    字符串

    字符串类型是Redis最基础的数据结构,字符串类型的值实际可以是字符串(简单的字符串、复杂的字符串(例如JSON、XML)、数字(整数、浮点数),甚至是二进制(图片、音频、视频),但是值最大不能超过512MB。

    字符串数据结构.png * 命令
    (1)设置值
    set key value [ex seconds] [px milliseconds] [nx|xx]
    set hello world
    OK
    

    set命令有几个选项:
    ·ex seconds:为键设置秒级过期时间。
    ·px milliseconds:为键设置毫秒级过期时间。
    ·nx:键必须不存在,才可以设置成功,用于添加。
    ·xx:与nx相反,键必须存在,才可以设置成功,用于更新。
    除了set选项, Redis还提供了setex和setnx两个命令:

    setex key seconds value
    setnx key value
    

    (2)获取值
    get key

    127.0.0.1:6379> get hello
    "world"
    

    (3)批量设置/获取值
    mset/mget key value [key value ...]
    (4)计算相关
    incr key (自增)、decr(自减)、 incrby(自增指定数字)、decrby(自减指定数字)、 incrbyfloat(自增浮点数)
    (5)不常用命令
    append key value(追加)、strlen key(字符长度)、getset key value(设置并返回原值)、setrange key offeset value(设置指定位置的字符)等

    字符串类型命令时间复杂度.png
    • 内部编码
      (1)int: 8个字节的长整型。
      (2)embstr:小于等于39个字节的字符串。
      (3)raw:大于39个字节的字符串
    • 典型使用场景
      (1)缓存功能
      (2)计数
      (3)共享Session
      (4)限速等
    哈希
    哈希类型是指键值本身又是一个键值对结构,形如value={{field1, value1}, ...{fieldN,valueN}} 字符串和哈希类型对比.png
    • 命令
      (1)设置/获取值
      hset/hget key field value
      (2)删除field
      hdel key field [field ...]
      (3)批量设置或获取field-value
      hmget key field [field ...]/hmset key field value [field value ...]
      (4)判断field是否存在
      hexists key
      (5)获取所有field/获取所有value
      hkeys/ hvals key
      (6)其他等
      hgetall key(获取所有的field-value)、hincrby key field,hincrbyfloat key field(像incrby和incrbyfloat命令一样,但是它们的作用域是filed)、hstrlen key field(计算长度)等 哈希类型命令的时间复杂度.png
    • 内部编码
      (1)ziplist(压缩列表):当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个)、同时所有值都小于hash-max-ziplist-value配置(默认64字节时, Redis会使用ziplist作为哈希的内部实现, ziplist使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比hashtable更加优秀。
      (2)hashtable(哈希表):当哈希类型无法满足ziplist的条件时, Redis会使用hashtable作为哈希的内部实现,因为此时ziplist的读写效率会下降,而hashtable的读写时间复杂度为O(1)
    • 使用场景
      (1)缓存对象信息,省去string序列化消耗
      (2)哈希类型是稀疏的
    列表

    列表( list)类型是用来存储多个有序且重复的字符串。

    • 命令
      (1)添加操作
      rpush key value [value ...](右边添加)、lpush key value [value ...](左边添加)、linsert key before|after pivot value(向某个元素前或者后插入元素)
      (2)查询
      lrange key start end(指定范围内的元素列表)、lindex key index(列表指定索引下标的元素)、llen key(列表长度)
      (3)删除
      lpop key(左边删除)、rpop key(右边删除)、lrem key count value(删除指定元素)
      (4)修改
      lset key index newValue
      列表命令时间复杂度.png
    • 内部编码
      (1)ziplist(压缩列表):当列表的元素个数小于list-max-ziplist-entries配置(默认512个),同时列表中每个元素的值都小于list-max-ziplist-value配置时(默认64字节), Redis会选用ziplist来作为列表的内部实现来减少内存的使用。
      (2)linkedlist(链表):当列表类型无法满足ziplist的条件时, Redis会使用linkedlist作为列表的内部实现。
    • 使用场景
      (1)消息队列
      (2)文章列表
    集合
    集合( set)类型也是用来保存多个的字符串元素,但和列表类型不一样的是,集合中不允许有重复元素,并且集合中的元素是无序的,不能通过索引下标获取元素。 集合类型.png
    • 命令
      (1)集合内操作
      sadd key element [element ...](添加元素)、srem key element [element ...](删除元素)、scard key(计算个数)、sismember key element(判断是否在集合中)、srandmember key [count](随即取指定元素)、spop key(随即弹出元素)、smembers key(获取所有元素)
      (2)集合间操作
      sinter key [key ...](交集)、suinon key [key ...](并集)、sdiff key [key ...](差集)
      集合常用命令时间复杂度.png
    • 内部编码
      (1)intset(整数集合):当集合中的元素都是整数且元素个数小于set-maxintset-entries配置(默认512个)时, Redis会选用intset来作为集合的内部实
      现,从而减少内存的使用。
      (2)hashtable(哈希表):当集合类型无法满足intset的条件时, Redis会使用hashtable作为集合的内部实现。
    • 使用场景
      (1)打标签。
      (2)计算共同爱好用户等。
    有序集合

    有序集合相对于哈希、列表、集合来说会有一点点陌生,但既然叫有序集合,那么它和集合必然有着联系,它保留了集合不能有重复成员的特性,但不同的是,有序集合中的元素可以排序。但是它和列表使用索引下标作为排序依据不同的是,它给每个元素设置一个分数( score)作为排序的依据。

    eg: 有序集合.png
    • 命令
      (1)集合内操作
      zadd key score member [score member...](添加元素)、zscore key member(计算某个成员的分数)、zcard key(计算个数)、zrank/zrevrank key member(排名)等
      (2)集合间操作
      zinterstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max](交集)、zunionstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max](并集)
    这个命令参数较多,下面分别进行说明:
    (1)destination:交集计算结果保存到这个键。
    (2)numkeys:需要做交集计算键的个数。
    (3)key[key...]:需要做交集计算的键。
    (4)weights weight[weight...]:每个键的权重,在做交集计算时,每个键中的每个member会将自己分数乘以这个权重,每个键的权重默认是1。
    (5)aggregate sum|min|max:计算成员交集后,分值可以按照sum(和)、min(最小值)、 max(最大值)做汇总,默认值是sum。
    eg:
    127.0.0.1:6379> zinterstore user:ranking:1_inter_2 2 user:ranking:1
    user:ranking:2
    (integer) 3
    
    有序集合命令的时间复杂度.png
    • 内部编码
      (1)ziplist(压缩列表):当有序集合的元素个数小于zset-max-ziplistentries配置(默认128个),同时每个元素的值都小于zset-max-ziplist-value配置(默认64字节)时, Redis会用ziplist来作为有序集合的内部实现,ziplist可以有效减少内存的使用。
      (2)skiplist(跳跃表):当ziplist条件不满足时,有序集合会使用skiplist作为内部实现,因为此时ziplist的读写效率会下降。
    • 使用场景
      (1)添加用户赞数。
      (2)取消用户赞。
      (3)展示获取赞数最多的十个用户。
      (4)展示用户信息以及用户分数。
      列表、集合和有序集合三者的异同点.png

    注意事项:命令遍历所有的键,分别是keys和scan

    相关文章

      网友评论

          本文标题:redis基本API的理解和使用

          本文链接:https://www.haomeiwen.com/subject/duzractx.html