4

使用理解基本API

redis提供了5种数据结构,理解每次数据结构的特点在开发和运维中是很重要的.使用redis版本:3.0.7

本章内容如下:

  1. 基本全局命令

  2. redis字符串.

  3. redis哈希结构.

1.1 全局命令

redis有5种数据结构,它们是键值对中的值,对于键来说是一些通用命令.

1.1.1 查看所有键

    keys pattern

例:

查询所有键

1.1.2 键总数

    dbsize

dbsize命令会返回当前数据库中所有键的总数.
例:
键数量

1.1.3 检查键是否存在

    exists key

检查key是否存在,存在返回1,不存在0.

键是否存在

1.1.4 删除键

    del key [...]

del是通用命令,无论任何数据结构类型,del都可以将其删除.
例:

删除键

返回结果为删除key的个数,如果删除一个不存在的键,会返回0.

1.1.5 键过期

    expire key seconds

redis支持对键添加过期时间,当超过时间后键会被自动删除.

键超时

ttl命令会返回键剩余的过期时间,它有三个返回值:

  • 大于或等于0的整数,键的剩余时间.

  • -1:键未设置过期时间.

  • -2:键不存在.

查看键剩余时间

clipboard.png

1.1.6 键的数据类型

    type key

例如:key的数据类型为字符串类型,返回结果为string,键set为集合类型返回结果为set.

键类型

1.2 数据结构和内部编码

type命令时间返回的是当前键的数据结构类型,他们分别是string(字符串),hash(哈希),list(列表),set(集合),zset(有序集合).
这些只是redis对外的数据类型.
每种数据类型都有自己的内部编码实现,而且是多种编码,这样redis会在适合的场景选择适合的内部编码.
可以通过object encoding命令查询内部编码:
clipboard.png

redis的5种数据结构:
redis的5种数据结构

redis数据结构与内部编码:
redis5种数据结构的内部编码

1.3 字符串

字符串类型是redis最基础的数据类型,其他几种数据结构都是在字符串基础上建立的.字符串的值可以是字符串、数字、二进制,值最大不可以超过512mb.

1.3.1 命令

(1) 设置值:

  • set命令:为键设置值.

    set key value
  • setex命令:为键设置值,并设置秒级的过期时间.

    setex key value seconds
  • setpx命令:为键设置值,并设置毫秒秒级的过期时间.

    setpx key value millisecond
  • setnx命令:向键设置值前判断键是否存在,不存在则设置值存在则不设置.

    setnx key value
  • setxx命令:与setnx相反,向键设置值前判断键是否存在,存在则设置值存在则不设置.

    setxx key value

setnxsetxx的使用场景:由于redis是单线程命令处理机制,如果多个客户端同时向redis服务使用setnx命令也只会有一个客户端执行成功.setnx可以用于分布式锁的一个解决方案.

(2) 计数:

  • incr命令:用于对键的值进行自增操作,返回结果为三种:

    • 值不是整数,返回错误.

    • 值是整数,返回自增后的结果.

    • 值不存在,按照值为0自增,返回1.

    例:

        exists key
        (integer) 0
        incr key
        (integer) 1
  • incrby命令:用于对键的值进行指定自增量的自增操作,返回结果与incr相同.
    例:

        exists key
        (integer) 0
        incrby key 10
        (integer) 10
  • incrbyfloat命令:用于对键的值进行指定浮点型自增量的自增操作.

  • decr命令:用于对键的值进行自减操作.

  • decrby命令:用于对键的值进行指定值进行减值操作.

  • append命令:用于对键的值进行追加操作,返回追加后的值的得长度.
    例:

    set hello w
    OK
    append hello orld
    (integer) 5
    get hello
    "world"
  • strlen命令:用于查看键的值得长度.
    例:

    set hello world
    OK
    strlen hello
    (integer) 5
  • setrange命令:用于键的值内指定索引字符的替换,如果参数是多个字符则从指定位置开始逐个替换,返回替换后值的长度.
    例:

    set hello world
    OK
    setrange hello 0 helloworld
    (integer) 10
  • getrange命令:用于获取键的值指定索引的内容.

    getrange key start end

例:

    set hello world
    OK
    getrange hello 0 2
    "wor"

1.3.2 内部编码

字符串类型的内部编码有3种:

  • int:8个字节长度的长整形.

  • embstr:小于等于39个字节的字符串.

  • raw:大于39个字节的字符串.
    整数类型示例:

    set key 6379
    OK
    object encoding key
    "int"

短字符串示例:

    set key hello,word
    OK
    object encoding key
    "embstr"

长字符串示例:

    set key "one string greater than 39 char............."
    OK
    object encoding key
    "raw"
    strlen key
    (integer) 44

1.4 哈希

哈希类型是指键值本身又是一个键值对结构,例如:value={{field1,value1},....,{fieldN,valueN}}.哈希类型中的映射关系叫做field-value,这里的value是指field对应的值,不是键对应的值.

1.4.1 命令

(1) 设置值

  • hset命令:

    hset key field value

例:

    hset user:1 name username
    (integer) 1
    hset user:1 name codger
    (integer) 0

如果设置不存在的field则相应1,存在则相应0.此外还提供了hsetnx命令,它们的关系就像set命令与setnx命令一样,只不过作用于转移到field.
(2) 获取值

  • hget命令:

    hget key field

例:

    hget user:2 name
    (nil)
    hget user:1 name
    "codger"

获取user:1name域(属性)对应的值,不存在则返回nil.

(3) 删除field

    hdel key field [field1...]

例:

    hdel user:1 name
    (integer) 1

hdel命令可以删除一个或多个field,返回结果为删除成功的field数量.

(4) 计算field数量

    hlen key

例:

    hlen user:1
    (integer) 1

hlen命令,可以获取键对应的hash结构值的field数量.

(5) 批量设置或获取field-value

  • hmget命令:批量获取键对应的hash结构值的多个field的值.

    hmget key field [field...]
  • hmset命令:批量设置键对应的hash结构值的多个field.
    例:

批量设置与获取

(6) 判断field是否存在

    hexists key field

例:

    hexists user:1 gender
    (integer) 1

user:1是否包含gender域,包含则返回1不包含则返回0.

(7) 获取所有field

    hkeys key

hkeys命令返回指定哈希键所有的field.
hkeys

(8) 获取所有value

    hvals key

hvals命令返回指定哈希键所有的value.
例:
hvals
(9) 获取所有的field-value

    hgetall key

例:
hgetall
获取user:1,所有的field-value.

(10) hincrbyhincrbyfloat:hincrbyhincrbyfloat,就像incrbyincrbyfloat命令用于,但它的作用域是field.
(11) hstrlen命令:获取value字符串的长度(需要redis3.2以上)

1.4.2 内部编码

内部编码 编码描述
ziplist(压缩列表) 当哈希类型元素个数小于hash-max-ziplist-entries配置(默认为512个)、同时所有值都小于hash-max-ziplist-value配置(默认为64字节)时,redis会使用ziplist作为哈希的内部实现,ziplist使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比hashtable更优秀.
hashtable(哈希表) 当哈希类型无法满足ziplist的条件时,redis会使用hashtable作为哈希的内部实现,因为此时ziplist无法保证读写效率.

codger
280 声望27 粉丝

高级BUG开发工程师.