Redis(四)Redis数据类型及命令

205 阅读11分钟

Redis数据类型

官方命令大全网址:www.redis.cn/commands.ht…

Redis 中存储数据是通过 key-value 格式存储数据的,其中 value 可以定义五种数据类型

  • string(字符类型)
  • Hash(散列类型)
  • List(列表类型)
  • Set(集合类型)
  • SortedSet(有序集合类型,简称zset)

注意:在 redis 中的命令语句中,命令是忽略大小写的,而 key 是不忽略大小写的

string 类型

命令

赋值
  • 语法

    SET key value

  • 示例

    127.0.0.1:6379> set test 123

  • 图例

    微信截图_20210807222518.png

取值
  • 语法

    GET key

  • 示例

    127.0.0.1:6379> get test

  • 图例

    微信图片_20210807222827.png

取值并赋值
  • 语法

    GETSET key value

  • 示例

    getset test 222

  • 图例

    微信截图_20210807223110.png

数值增减

注意事项

  • 当value为整数数据时,才能使用以下命令操作数值的增减
  • 数值递增都是【原子】操作
  • redis中的每一个单独的命令都是原子性操作。当多个命令一起执行的时候,就不能保证原子性,不过我们可以使 用事务和lua脚本来保证这一点

非原子性操作示例

int i = 1; 
i++; 
System.out.println(i);
递增数字
  • 语法

    INCR key

  • 示例

    incr num

  • 图例

    微信截图_20210807223943.png

增加指定的整数
  • 语法

    INCRBY key increment

  • 示例

    incrby num 2

  • 图例

    微信截图_20210807224157.png

递减数值
  • 语法

    DECR key

  • 示例

    DECR num

  • 图例

    微信截图_20210807224537.png

减少指定的整数
  • 语法

    DECRBY key decrement

  • 示例

    DECRBY num 2

  • 图例

    微信截图_20210807224807.png

仅当不存在时赋值

使用该命令可以实现【分布式锁】的功能

  • 语法

    setnx key value

  • 示例

    SETNX job "programmer"

  • 图例

    微信截图_20210807225151.png

其它命令
向尾部追加值

APPEND 命令,向键值的末尾追加 value

如果键不存在则将该键的值设置为 value ,即相当于 SET key value 。返回值是追加后字符串的总长度

  • 语法

    APPEND key value

  • 示例

    append str " world!"

  • 图例

    微信截图_20210807225752.png

获取字符串长度

STRLEN 命令,返回键值的长度,如果键不存在则返回0

  • 语法

    STRLEN key

  • 示例

    strlen str

  • 图例

    微信截图_20210807230036.png

同时设置/获取多个键值

STRLEN 命令,返回键值的长度,如果键不存在则返回0

  • 语法

    MSET key value [key value …]

    MGET key [key …]

  • 示例

    mset k1 v1 k2 v2 k3 v3

    mget k1 k3

  • 图例

    微信截图_20210807230809.png

hash类型

hash 类型也叫散列类型,它提供了字段和字段值的映射。字段值只能是字符串类型,不支持散列类型、集合类型等 其它类型

命令

赋值

HSET 命令不区分插入和更新操作,当执行插入操作时 HSET 命令返回 1 ,当执行更新操作时返回 0

设置一个字段值
  • 语法

    HSET key field value

  • 示例

    hset user username zhangsan

  • 图例

    Snipaste_2021-08-09_11-46-20.png

设置多个字段值
  • 语法

    HMSET key field value [field value ...]

  • 示例

    hmset user age 20 username lisi

  • 图例

    Snipaste_2021-08-09_11-49-34.png

当字段不存在时赋值

类似 HSET ,区别在于如果字段存在,该命令不执行任何操作

  • 语法

    HSETNX key field value

  • 示例

    hsetnx user age 30

  • 图例

    Snipaste_2021-08-09_11-53-19.png

    如果user中没有age字段则设置age值为30,否则不做任何操作

取值
获取一个字段值
  • 语法

    HGET key field

  • 示例

    hget user username

  • 图例

    Snipaste_2021-08-09_11-56-15.png

获取多个字段值
  • 语法

    HMGET key field [field ...]

  • 示例

    hmget user age username

  • 图例

    Snipaste_2021-08-09_12-00-18.png

获取所有字段值
  • 语法

    HGETALL key

  • 示例

    hgetall user

  • 图例

    Snipaste_2021-08-09_12-30-42.png

删除字段

可以删除一个或多个字段,返回值是被删除的字段个数

  • 语法

    HDEL key field [field ...]

  • 示例

    hdel user age

  • 图例

    Snipaste_2021-08-09_12-37-25.png

增加数字
  • 语法

    HINCRBY key field increment

  • 示例

    hincrby user age 4

  • 图例

    Snipaste_2021-08-09_12-43-13.png

其它命令
判断字段是否存在
  • 语法

    HEXISTS key field

  • 示例

    hexists user age

    hexists user name

  • 图例

    Snipaste_2021-08-09_12-48-12.png

只获取字段名或字段值
  • 语法

    HKEYS key

    HVALS key

  • 示例

    hkeys user

    hvals user

  • 图例

    Snipaste_2021-08-09_12-52-10.png

获取字段数量
  • 语法

    HLEN key

  • 示例

    hlen user

  • 图例

    Snipaste_2021-08-09_12-55-16.png

string类型和hash类型的区别

hash类型适合存储那些对象数据,特别是对象属性经常发生【增删改】操作的数据。 string类型也可以存储对象数据,将java对象转成json字符串进行存储,这种存储适合【查询】操作

list类型

ArrayList与LinkedList的区别

  • ArrayList 使用数组方式存储数据,所以根据索引查询数据速度快,而新增或者删除元素时需要设计到位移操作,所以比较慢

  • LinkedList 使用双向链表方式存储数据,每个元素都记录前后元素的指针,所以插入、删除数据时只是更改前后元素的指针指向即可,速度非常快。然后通过下标查询元素时需要从头开始索引,所以比较慢,但是如果查询前几个元素或后几个元素速度比较快

List类型介绍

  • Redis 的列表类型( list 类型)可以 存储一个有序的字符串列表 ,常用的操作是向列表两端添加元素,或者获得列表的某一个片段

  • 列表类型内部是使用双向链表( double linked list )实现的,所以向列表两端添加元素的时间复杂度为O(1) ,获取越接近两端的元素速度就越快。这意味着即使是一个有几千万个元素的列表,获取头部或尾部的10条记录也是极快的

命令

赋值
一个或多个值插入到列表头部

如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。 当 key 存在但不是列表类型时,返回一个错误

  • 语法

    LPUSH key value [value ...]

  • 示例

    lpush list1 1 2 3 4

  • 图例

    Snipaste_2021-08-09_19-46-22.png

一个或多个值插入到列表的尾部(最右边)

如果列表不存在,一个空列表会被创建并执行 RPUSH 操作。 当列表存在但不是列表类型时,返回一个错误

  • 语法

    RPUSH key value [value ...]

  • 示例

    rpush list1 5 6 7 8

  • 图例

    Snipaste_2021-08-09_19-50-39.png

从列表两端弹出元素

从列表左边弹出一个元素,会分两步完成:

第一步是将列表左边的元素从列表中移除

第二步是返回被移除的元素值

同理右边就是从右边移除,返回移除的值

  • 语法

    LPOP key

    RPOP key

  • 示例

    lpop list1

    rpop list1

  • 图例

    Snipaste_2021-08-09_20-01-55.png

取值
获取列表中的某一片段

将返回startstop之间的所有元素(包含两端的元素),索引从0开始。索引可以 是负数,如:“-1”代表最后边的一个元素

  • 语法

    LRANGE key start stop

  • 示例

    lrange list1 0 2

  • 图例

    Snipaste_2021-08-09_19-53-43.png

获取列表中元素的个数
  • 语法

    LLEN key

  • 示例

    llen list1

  • 图例

    Snipaste_2021-08-09_20-05-12.png

其它命令
删除列表中指定个数的值

LREM 命令会删除列表中前 count 个值为 value 的元素,返回实际删除的元素个数。根据 count 值的不同,该命令的执行方式会有所不同

 当count>0时, LREM会从列表左边开始删除

 当count<0时, LREM会从列表后边开始删除

 当count=0时, LREM删除所有值为value的元素
  • 语法

    LREM key count value

  • 示例

    lrem list2 1 3

    lrem list2 -1 6

    lrem list2 0 1

  • 图例

    Snipaste_2021-08-09_20-14-44.png

获得指定索引的元素值
  • 语法

    LINDEX key index

  • 示例

    lindex list2 1

  • 图例

    Snipaste_2021-08-09_20-18-10.png

获得指定索引的元素值

当索引参数超出范围,或对一个空列表进行 LSET 时,返回一个错误

  • 语法

    LSET key index value

  • 示例

    lindex list2 1 88

  • 图例

    Snipaste_2021-08-09_20-21-59.png

只保留列表指定片段

让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除,指定范围和LRANGE一致

  • 语法

    LTRIM key start stop

  • 示例

    ltrim list2 1 2

  • 图例

    Snipaste_2021-08-09_20-26-26.png

向列表中插入元素

该命令首先会在列表中从左到右查找值为pivot的元素,然后根据第二个参数是BEFORE还是AFTER来决定将value插入到该元素的前面还是后面

  • 语法

    LINSERT key BEFORE|AFTER pivot value

  • 示例

    linsert list2 before 88 66

    linsert list2 after 88 77

  • 图例

    Snipaste_2021-08-09_20-31-15.png

将元素从一个列表转移到另一个列表中

用于移除列表的最后一个元素,并将该元素添加到另一个列表并返回

  • 语法

    RPOPLPUSH source destination

  • 示例

    rpoplpush list2 list3

  • 图例

    Snipaste_2021-08-09_20-38-46.png

set类型

set类型介绍

set 类型即集合类型,其中的数据是不重复且没有顺序

集合类型的常用操作是向集合中加入或删除元素、判断某个元素是否存在等,由于集合类型的 Redis 内部是使用值为空的散列表实现,所有这些操作的时间复杂度都为 0(1)

Redis 还提供了多个集合之间的交集、并集、差集的运算

命令

赋值
添加元素/删除元素
  • 语法

    SADD key member [member ...]

    SREM key member [member ...]

  • 示例

    sadd set1 a b c

    srem set1 a

  • 图例

    Snipaste_2021-08-09_23-24-12.png

取值
获得集合中的所有元素
  • 语法

    SMEMBERS key

  • 示例

    smembers set1

  • 图例

    Snipaste_2021-08-09_23-27-23.png

判断元素是否在集合中
  • 语法

    SISMEMBER key member

  • 示例

    sismember set1 a

    sismember set1 d

  • 图例

    Snipaste_2021-08-09_23-29-59.png

集合运算命令
集合的差集运算

A-B:属于A并且不属于B的元素构成的集合

  • 语法

    SDIFF key [key ...]

  • 示例

    sdiff setA setB

  • 图例

    Snipaste_2021-08-09_23-33-36.png

集合的交集运算

A ∩ B:属于A且属于B的元素构成的集合

  • 语法

    SINTER key [key ...]

  • 示例

    sinter setA setB

  • 图例

    Snipaste_2021-08-09_23-35-51.png

集合的并集运算

A ∪ B:属于A或者属于B的元素构成的集合

  • 语法

    SUNION key [key ...]

  • 示例

    sunion setA setB

  • 图例

    Snipaste_2021-08-09_23-37-57.png

其它命令
获得集合中元素的个数
  • 语法

    SCARD key

  • 示例

    scard set1

  • 图例

    Snipaste_2021-08-09_23-40-23.png

从集合中弹出一个元素

由于集合是无序的,所有SPOP命令会从集合中随机选择一个元素弹出

  • 语法

    SPOP key [count]

  • 示例

    spop set1

    spop set1 2

  • 图例

    Snipaste_2021-08-09_23-44-24.png

zset类型 (sortedset)

zset介绍

在 set 集合类型的基础上,有序集合类型为集合中的每个元素都 关联一个分数 ,这使得我们不仅可以完成插入、删除和判断元素是否存在在集合中,还能够获得分数最高或最低的前N个元素、获取指定分数范围内的元素等与分数有关的操作

与列表类型的相似与区别

  • 相似

    • 二者都是有序的

    • 二者都可以获得某一范围的元素

  • 区别

    • 列表类型是通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后,访问中间数据的速度会变慢

    • 有序集合类型使用散列表实现,所有即使读取位于中间部分的数据也很快

    • 列表中不能简单的调整某个元素的位置,但是有序集合可以(通过更改分数实现)

    • 有序集合要比列表类型更耗内存

命令

赋值
增加元素

向有序集合中加入一个元素和该元素的分数,如果该元素已经存在则会用新的分数替换原有的分数。返回值是新加入到集合中的元素个数,不包含之前已经存在的元素

  • 语法

    ZADD key score member [score member ...]

  • 示例

    zadd zset1 80 zhangsan 89 lisi 94 wangwu

    zadd zset1 97 zhangsan

  • 图例

    Snipaste_2021-08-10_12-30-16.png

删除元素

移除有序集合key中的一个或多个成员,不存在的成员将被忽略

当key存在但不是有序集类型时,返回一个错误

  • 语法

    ZREM key member [member ...]

  • 示例

    zrem zset1 wangwu

  • 图例

    Snipaste_2021-08-10_12-56-26.png

取值
获得排名在某个范围的元素列表
ZRANGE:按照元素分数从小到大的顺序返回索引从start到stop之间的所有元素(包含两端的元素)

ZREVRANGE:按照元素分数从大到小的顺序返回索引从start到stop之间的所有元素(包含两端的元素)

如果需要获得元素的分数的可以在命令尾部加上 WITHSCORES 参数
  • 语法

    ZRANGE key start stop [WITHSCORES]

    ZREVRANGE key start stop [WITHSCORES]

  • 示例

    zrange zset1 0 2

    zrevrange zset1 0 2

  • 图例

    Snipaste_2021-08-10_12-46-04.png

获取元素的分数
  • 语法

    ZSCORE key member

  • 示例

    zscore zset1 zhangsan

  • 图例

    Snipaste_2021-08-10_12-51-03.png

其它命令
获得指定分数范围的元素
  • 语法

    ZRANGEBYSCORE key min max [WITHSCORES]

  • 示例

    zrangebyscore zset1 80 90

  • 图例

    Snipaste_2021-08-10_13-00-57.png

增加某个元素的分数

返回值是更改后的分数

  • 语法

    ZINCRBY key increment member

  • 示例

    zincrby zset1 92 zhangsan

  • 图例

    Snipaste_2021-08-10_13-04-02.png

获得集合中元素的数量
  • 语法

    ZCARD key

  • 示例

    zcard zset1

  • 图例

    Snipaste_2021-08-10_13-06-05.png

获得指定分数范围内的元素个数
  • 语法

    ZCOUNT key min max

  • 示例

    zcount zset1 80 100

  • 图例

    Snipaste_2021-08-10_13-08-48.png

按照排名范围删除元素
  • 语法

    ZREMRANGEBYRANK key start stop

  • 示例

    zremrangebyrank zset1 0 1

  • 图例

    Snipaste_2021-08-10_13-13-56.png

按照分数范围删除元素
  • 语法

    ZREMRANGEBYSCORE key start stop

  • 示例

    zremrangebyscore zset1 0 200

  • 图例

    Snipaste_2021-08-10_13-16-01.png

获取元素的排名
ZRANK:从小到大

ZREVRANK:从大到小
  • 语法

    ZRANK key member

    ZREVRANK key member

  • 示例

    zrank zset1 a

    zrevrank zset1 a

  • 图例

    Snipaste_2021-08-10_13-23-36.png

通用命令

keys

返回满足给定pattern 的所有key

  • 语法
`keys pattern`
  • 示例

    keys zset*

  • 图例

    Snipaste_2021-08-10_13-34-50.png

del

删除

  • 语法
`del key`
  • 示例

    del test

  • 图例

    Snipaste_2021-08-10_13-41-28.png

exists

确认一个key 是否存在

  • 语法

    exists key

  • 示例

    exists test

  • 图例

    Snipaste_2021-08-10_13-45-58.png

expire(重要)

Redis在实际使用过程中更多的用作缓存,然而缓存的数据一般都是需要设置生存时间的,即:到期后数据销毁

EXPIRE key seconds 设置key的生存时间(单位:秒)key在多少秒后会自动删除

TTL key 查看key生于的生存时间

PERSIST key 清除生存时间

PEXPIRE key milliseconds 生存时间设置单位为:毫秒

  • 语法

    EXPIRE key seconds

  • 示例

    expire test 5

  • 图例

    Snipaste_2021-08-10_13-52-00.png

rename

重命名key

  • 语法

    rename oldkey newkey

  • 示例

    rename zset1 zset2

  • 图例

    Snipaste_2021-08-10_13-56-28.png

type

显示指定key的数据类型

  • 语法

    type key

  • 示例

    type zset2

  • 图例

    Snipaste_2021-08-10_13-59-29.png