redis-实操-string

177 阅读4分钟

String类型

命令

  1. 命令含义返回值对应的英文速记
    setnx [key] [value]如果key不存在时设置该key对应的值1 - 成功
    0 - 失败
    set if not exist【如果不存在则设置】
    msetnx [key1] [value1] [key2] [value2]...所有key都不存在时,设置值1 - 成功
    0 - 失败
    multiple set if not exist【如果不存在则设置多个值】
  2. 命令含义返回值对应的英文速记
    del [key]删除指定的key1 - 成功
    0 - 失败
    delete【删除】
  3. 命令含义返回值英文速记例子
    set [key] [value] [EX seconds] [PX mill-seconds]设置值【如果key存在,则覆盖原始值;否则,创建新的键值对】1 - 成功
    0 - 失败
    set 【设置】
    mset [key1] [value1] [key2] [value2] ...设置值【如果key存在,则覆盖原始值;否则,创建新的键值对】1 - 成功
    0 - 失败
    multiple set【设置多个值】
    setrange [key] [startoffset] [value]修改指定的键对应位置的值
    startoffset为值开始位置的偏移量
    value为需要替换为的值
    如果startoffset超过当前字符串长度,则会填充\x001字符。
    数字 - 修改后字符串的长度127.0.0.1:6379> get k2
    "v2"
    127.0.0.1:6379> setrange k2 1 100
    (integer) 4
    127.0.0.1:6379> get k2
    "v100"
    127.0.0.1:6379> setrange k2 5 111
    (integer) 8
    127.0.0.1:6379> get k2
    "v100\x00111"
    127.0.0.1:6379> getrange k2 4 5
    "\x001"
    append [key] [value]向字符串添加值数字 - 修改后字符串的长度127.0.0.1:6379> get k1
    "100"
    127.0.0.1:6379> append k1 aa
    (integer) 5
    127.0.0.1:6379> get k1
    "100aa"
    getset [key] [value]获取key对应的旧值,并且将其替换为新值字符串 - 旧值127.0.0.1:6379> get k1
    "100aa"
    127.0.0.1:6379> getset k1 aaa
    "100aa"
    127.0.0.1:6379> get k1
    "aaa"
    incr [key]如果对应的字符串是一个数字,则加一,否则报错。数字 - 加一后数字大小increase【增加】127.0.0.1:6379> set k1 100
    OK
    127.0.0.1:6379> incr k1
    (integer) 101
    127.0.0.1:6379> set k2 aaa
    OK
    127.0.0.1:6379> incr k2
    (error) ERR value is not an integer or out of range
    decr [key]如果对应的字符串是一个数字,则减一,否则报错。数字 - 减一后数字大小decrease【减去】127.0.0.1:6379> set k1 100
    OK
    127.0.0.1:6379> decr k1
    (integer) 99
    127.0.0.1:6379> set k2 aaa
    OK
    127.0.0.1:6379> decr k2
    (error) ERR value is not an integer or out of range
    incrby [key] [number]如果对应的字符串是一个数字,且number是数字,则加上number的值,否则报错。数字 - 增加后数字大小increase by【增加一个数】127.0.0.1:6379> set k1 100
    OK
    127.0.0.1:6379> set k2 aaa
    OK
    127.0.0.1:6379> incrby k1 200
    (integer) 300
    127.0.0.1:6379> incrby k1 aaa
    (error) ERR value is not an integer or out of range
    127.0.0.1:6379> incrby k2 aaa
    (error) ERR value is not an integer or out of range
    decrby [key] [number]如果对应的字符串是一个数字,且number是数字,则减去number的值,否则报错。数字 - 减去后数字大小decrease by 【减去一个数】127.0.0.1:6379> set k1 100
    OK
    127.0.0.1:6379> set k2 aaa
    OK
    127.0.0.1:6379> decrby k1 50
    (integer) 50
    127.0.0.1:6379> decrby k1 aaa
    (error) ERR value is not an integer or out of range
    127.0.0.1:6379> decrby k2 1
    (error) ERR value is not an integer or out of range
  4. 命令含义返回值英文速记例子
    get [key]获取key对应的值值,如果key没有值,返回nil127.0.0.1:6379> setnx k1 v1
    (integer) 1
    127.0.0.1:6379> get k1
    "v1"
    mget [key1] [key2] [...]获取多个key对应的值列表值,如果某个key没有值,对应的项为nil127.0.0.1:6379> setnx k1 v1
    (integer) 1
    127.0.0.1:6379> setnx k2 v2
    (integer) 1
    127.0.0.1:6379> mget k1 k3 k2
    1) "v1"
    2) (nil)
    3) "v2"
    strlen [key]获取key对应的value字符串长度字符串长度。
    如果查询不存在的key,返回0
    127.0.0.1:6379> setnx k1 v1
    (integer) 1
    127.0.0.1:6379> strlen k1
    (integer) 2
    127.0.0.1:6379> strlen k3
    (integer) 0
    getrange [key] [start] [end]获取字符串某个范围的值值。
    如果查询的key不存在,返回""。
    如果查询的范围超过字符串的长度,返回""
    127.0.0.1:6379> set k1 v1
    OK
    127.0.0.1:6379> getrange k1 3 4
    ""
    127.0.0.1:6379> getrange k2 0 1
    ""
    127.0.0.1:6379> getrange k1 1 4
    "1"
  5. 设置过期时间

    命令含义例子
    setex [key] [expire-seconds] [value]创建和设置一个值的过期时间127.0.0.1:6379> get k1
    "v1"
    127.0.0.1:6379> setex k1 5 vvvv
    OK
    127.0.0.1:6379> get k1
    "vvvv"
    127.0.0.1:6379> get k1
    (nil)

数据结构概述

  1. 采用的是类似Java 动态数组的 ArrayList 设计思路。可以动态扩容。不同的是,扩容的倍数刚开始会比较小,后面会变大。

  2. 如果让我们设计string的底层实现,我们应该如何实现呢?

    目标

    1. 不可删除字符
    2. 可供修改
    3. 性能良好

    设计:

    1. 不删除意味着如果采用数组,无需删除移动元素,数组其他特性时间复杂度都为1。【可能采用数组】

    2. 可修改意味着可能需要原地替换,并且允许增加字符的话,最好是设计为动态可扩容数据结构,至于缩容,如果考虑性能和空间可以想想。

    3. 内存的容量是一定的,不可能允许一个数据占用无限大的空间,所以设置默认字符串最大长度,以及提供修改的配置。

    4. 扩容一般遵从先慢后快,或者说刚开始扩容小,比如刚开始1K,后扩容大,比如1M扩。但是不能无限大,这样很容易把内存消耗完。

      对应的数学图示应该是:

在这里插入图片描述