Redis【2】五大基本数据类型

Redis 在线测试
Redis 命令参考

Redis基本

1
2
3
4
5
6
7
+ 命令起效返回`1` 不起效返回`0` 找不到返回`nil` 语法错误`error`...
+ `SELECT [0~15]`切换数据库,Redis默认16个数据库
+ `DBSIZE`查询当前数据库记录数
+ `FLUSHDB`清空当前库
+ `FLUSHALL`清空所有库共16个
+ Redis索引(下标)都从0开始
+ 默认端口6379

key

对所有key生效

  1. 添加&修改
    1
    2
    # expire
    + `expire key 秒钟`为给定的key设置过期时间
  2. 查询
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # keys
    + `keys *`显示所有的key值.支持Ant风格
    + `?`匹配一个字符
    + `*`匹配0个或多个字符
    + `[]`表示匹配括号间任意一个字符,用 - 表示范围
    + 例如: a[a-c] 可以匹配`aa` `ab` `ac`不能匹配`ad`
    + `\?`匹配`?`
    + `keys k?`只查询`k1` `k2`而不查询`k11`
    + `keys k??`只查询`k11` `k12`而不查询`k1`

    # exists
    + `exists key`判断某个key是否存在
    # type
    + `type key`查看你的key是什么类型
    # ttl
    + `ttl key`查看还有多少秒到期。-1永不过期。-2不存在或已到期。【其实已到期就是不存在,因为到期自动删除了k】
  3. 删除
    1
    2
    # del
    + `del key`删除key,返回成功删除数量。删除多个 del k1 k2【用空格分隔,而不是逗号】

String字符串

Redis最基本的类型,一共key对应一个value,是二进制安全的,可以包含jpg图片或者序列号的对象.value最多可以是512M

  1. 添加&修改
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    # set
    + `set k1 v1`设置key。不存在插入,存在覆盖。直接使用`set k1`默认插入空字符串""
    # setex
    + `setex k4 10 v4`十秒后过期移除
    # setnx
    + `setnx k5 v5`key不存在再插入。插入成功返回1,失败返回0
    # mset
    + `mset k1 v1 k2 v2 k3 v3`必须是双数,否则错误。`mset k1 v1 k2`则错误
    # msetnx
    + `msetnx k4 v4 k5 v5`全部插入返回1,全部不插入返回0。已存在任何一个key都全部不插入
    # getset
    + `getset k1 v1`【先get再set】返回旧值,再设置新值。key不存在返回空(nil)

    # append
    + `append k1 123`在value后面追加内容123

    ## incr/decr/incrby/decrby
    > 一定要是数字才能进行加减,返回计算后的值
    + `incr k1`加1
    + `decr k1`减1
    + `incrby k1 2`加2
    + `decrby k1 3`减3
  2. 查询
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    + `get k1`获取key的值。不存在返回空(nil)
    + `mget k1 k2 k3`依次返回对应的value
    + `getset k1 v1`【先get再set】返回旧值,再设置新值。key不存在返回空(nil)

    + `strlen k1`返回value的字符串长度。不存在返回0

    ## getrange/setrange
    > 测试`set k1 abcdefg`
    + `getrange k1 0 -1`获取全部数据,相当于`get k1`。【不同的是k2如果不存在,返回空字符串""】
    + `getrange k1 1 3`返回下标1 2 3的数据,此时返回"bcd"【下标从0开始】
    + `setrange k1 2 xyz`返回设置后的长度7。把下标234设置成xyz。此时`get k1`返回"abxyzfg"
  3. 拓展
    1
    2
    3
    4
    5
    6
    # 可以当成对象进行使用
    127.0.0.1:6379> mset student:1:name naniu student:2:name erdan
    OK
    127.0.0.1:6379> mget student:1:name student:2:name
    1) "naniu"
    2) "erdan"

List列表

左头右尾,lpush依次头插入,rpush依次尾插入,lpop删除头,rpop删除尾
就把它当做LinkedList就行了。lpush头插入,rpush尾插入,lpop删除头,rpop删除尾
lrange key 0 -1 就是for循环,从左开始循环
注意:不存在为空的集合,如果集合无元素,就会删除这个集合的key。

  1. 添加&修改
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    + `lpush list01 1 2 3 4 5`从左往右,依次头插入。此时集合[5,4,3,2,1]
    + `rpush list02 1 2 3 4 5`尾插入,此时集合[1,2,3,4,5]

    ## linsert
    > 返回插入之后的集合长度。插入失败返回-1,也就是a1不存在集合中。集合不存在返回0。
    + `linsert list01 before a1 a2`在集合的第一个值为`a1`的前面添加`a2`
    + `linsert list01 after a1 a2`在集合的第一个值为`a1`的后面添加`a2`

    + `lset list01 1 ddd`把下标1的值改为`ddd`

    ## ltrim
    > 截取指定范围作为新集合【也就是删除了集合不指定的部分】
    + `ltrim list01 3 5`除了下标3 4 5其他的元素全部删除。

    ## rpoplpush
    > 把第一个的尾值放到第二个头部
    + `rpoplpush a1 a2`删除并返回a1的头节点,并把头节点尾插入到a2中。
    注意:如果a1不存在,则返回空(nil)。如果a2不存在,则新建并插入a1的头节点。
  2. 查询
    1
    2
    3
    4
    5
    6
    ## lrange
    + `lrange list01 0 -1`查看集合的全部内容
    + `lrange list01 2 4`查看集合下标2 3 4的内容。下标从0开始。

    + `lindex list01 2`返回下标2的元素。下标越界返回空(nil)
    + `llen list01`返回集合长度。不存在或集合空返回0
  3. 删除
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ## lpop/rpop 
    > 如果删除的是最后一个元素,则删除集合。
    > 也就是删除这个集合的key。集合就不存在了。
    + `lpop list01`删除头节点,返回删除的内容。为空返回(nil)
    + `rpop list01`删除尾节点,返回删除的内容。为空返回(nil)

    ## lrem
    > 删除N个value
    + `lrem list01 2 dd`返回删除的数量。删除前2个dd
    + `lrem list01 0 dd`返回删除的数量。删除全部dd

Set集合

String类型的无序集合.值不允许重复.

  1. 添加&修改
    1
    2
    3
    + `sadd set01 1 1 1 1 2 3 3 4`返回4。4表示成功插入元素的数量

    + `smove set01 set02 x`把`set01`中的值`x`移到`set02`中。成功返回1,失败返回0
  2. 查询
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    + `smembers set01`查看set01里面的数据,无序。
    + `srandmember set01 3`随机获取3个元素。如果获取数量>元素数,则获取全部。

    + `sismember set01 x`查询集合中是否有元素`x`,有返回1,无返回0。集合不存在返回0

    + `scard set01`获取集合里面的元素个数。集合不存在返回0

    + `sdiff set01 set02 ...`获取`set01`中有,而`set02`和`后面`中没有的元素
    + `sinter set01 set02 ...`获取`set01`中有,而`set02`和`后面`中也有的元素
    + `sunion set01 set02 ...`获取`set01`和`set02`和`后面`中全部的的元素,并去重。
  3. 删除
    1
    2
    3
    4
    + `srem set01 3`删除集合中值为`3`的元素。删除成功返回1,失败返回0。集合不存在返回0

    + `spop set01`随机删除1个元素
    + `spop set01 3`随机删除3条记录【在3.2+版本可用。】【未验证】

Hash哈希

类似于java的Map.KV模式不变.但V是一个键值对.
我们这里称【主key为k1,副key为k2,k2对应的值为v2】

  1. 添加&修改
    1
    2
    3
    4
    5
    6
    + `hset user id 11`设置k1=user,k2=id,v2=11。k2存在返回0,不存在返回1。
    + `hmset student id 7 name daniu age 26`插入成功返回ok.失败error.
    + `hsetnx user id 25`如果不存在则添加。添加成功返回1,失败返回0

    + `hincrby student id 2`执行一次id的值都会增长2。返回增加后的值
    + `hincrbyfloat id 1.1`执行一次id的值都会增长1.1。返回增加后的值
  2. 查询
    1
    2
    3
    4
    5
    6
    7
    8
    9
    + `hget user id`根据k1,k2查找对应的v2。k1,k2不存在都返回空(nil)
    + `hmget student id nameee age`返回三条数据,依次是对应的v2。第二条是空(nil)。
    + `hkeys student`得到k1=student中所有的k2
    + `hvals student`得到k1=student中所有的v2
    + `hgetall student`返回6条数据。依次是"id" "7" "name" "daniu" "age" "26"

    + `hexists student id`判断是否存在对应的k1,k2。有返回1,无返回0。

    + `hlen student`返回k1=student里面k2的数量
  3. 删除
    1
    2
    + `hdel student name`删除k1为student k2为name的数据。删除成功返回1,失败返回0
    + `hdel student id name ...`删除多条记录。返回删除k2的成功数量。【未验证】

Zset有序集合

Zset(sorted set) 有序集合 和set一样不允许重复,不同的是每个元素都会关联一个double类型的分数,
通过这些分数从大到小降序排列,成员是唯一的,分数是可以重复的

  1. 多说一句

    1
    2
    3
    + 在`set`基础上,加一个`score`值
    + 之前`set`是k1 v1 v2 v3
    + 现在`zset`是k1 score1 v1 score2 v2
  2. 添加&修改

    1
    + `zadd zset01 60 v1 70 v2 80 v3 90 v4 100 v5 110 v1`返回插入数量5
  3. 查询

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    ## zrange
    + `zrange zset01 0 -1`返回全部。返回五条记录。依次"v1" "v2" "v3" "v4" "v5"
    + `zrange zset01 0 -1 withscores`返回全部包括分数。返回十条记录。依次"v1" 60.0 "v2" 70.0以此类推
    + `zrange zset01 1 3`查看下标为1 2 3的数据.返回三条数据.依次"v2" "v3" "v4"
    + `zrange zset01 1 3 withscores`查看下标为1 2 3的数据包括分数.返回六条数据.依次"v2" 70.0 "v3" 80.0 "v4" 90.0
    ## zrevrange
    > 与zrange查询反方向
    + `zrevrange zset01 0 -1`返回全部。返回五条记录。依次"v5" "v4" "v3" "v2" "v1"
    + `zrevrange zset01 0 -1 withscores`返回全部包括分数。返回十条记录。依次"v5" 100.0 "v4" 90.0以此类推
    + `zrevrange zset01 1 3`查看下标为1 2 3的数据.返回三条数据.依次"v4" "v3" "v2"
    + `zrevrange zset01 1 3 withscores`查看下标为1 2 3的数据包括分数.返回三条数据.依次"v4" 90.0 "v3" 80.0 "v2" 70.0

    ## zrangebyscore
    > zrangebyscore key 开始score 结束score
    + `zrangebyscore zset01 60 90`返回60<=score<=90的值.返回四条数据.依次"v1" "v2" "v3" "v4"
    + `zrangebyscore zset01 60 90 withscores`返回60<=score<=90的值和score.返回八条数据.依次"v1" 60.0 "v2" 70.0以此类推
    + `zrangebyscore zset01 60 (90`返回60<=score<90的值.返回三条数据.依次"v1" "v2" "v3"
    + `zrangebyscore zset01 (60 (90`返回60<score<90的值.返回两条数据.依次"v2" "v3"
    + `zrangebyscore zset01 60 90 withscores limit 2 1`先查出60<=score<=90的数据.从查询出来的数据下标2开始查询1条数据.此时返回两条数据.依次"v3" 80.0
    ## zrevrangebyscore【不做演示】
    > `zrevrangebyscore key 结束score 开始score` 与zrangebyscore反方向,结束为最大值,开始为最小值

    + `zrank zset01 v2`得到对应的下标1。v1=0,v2=1,v3=2,v4=3,v5=4。若不存在zset01或v2,返回空(nil)
    + `zrevrank zset01 v2`逆序获得下标值,与zrank相反。同理返回3。v5=0,v4=1,v3=2,v2=3,v1=4

    + `zscore zset01 v1`获取key为zset01 值为v1的score。此时返回 60.0

    + `zcard zset01`一个v对应一个double数。返回zset01中v的数量。

    + `zcount zset01 60 70`返回分数在[60,70]的数量。
    + `zcount zset01 60 (70`返回分数在[60,70)的数量。
    + `zcount zset01 (60 (70`返回分数在(60,70)的数量。
  4. 删除

    1
    + `zrem zset01 v5 v3 v9`返回成功删除的记录数2