Redis数据结构&命令&适用场景

133 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 1 天,点击查看活动详情

String

Redis基本数据类型,存储单个数据,最常用的数据类型,一个key对应一个value,适用于大多数的缓存业务。

推荐

  • 可用做缓存。第一次查询数据库后,将查询结果存入Redis中,后续查询可以直接从Redis中获取。
  • 用做计数功能,统计访问量、点赞数等。

注意

  • 存入大key,例如一个kv的字节数超过10KB,就会被识别会大key,业务设计上尽量避免有大key

  • 对于批量命令,需注意一个批次操作的命令个数或key个数,数量越大越容易导致超时以及Redis服务负载问题。

命令备注
APPEND-
BITCOUNT-
BITPOS-
DECR-
DECRBY-
GET-
GETBIT-
GETRANGE-
GETSET-
INCR-
INCRBY-
INCRBYFLOAT-
MGET-
MSET-
PSETEX-
SETNX-
SETRANGE-
STRLEN-

List

  • 双向链表特征,有序,允许重复,不会进行排序

  • 头尾插入O(1)、查找O(n)

命令备注
LINDEX-
LINSERT-
LLEN-
LPOP-
LPUSH
LPUSHX-
LRANGE-
LREM-
LSET
LTRIM-
RPOP-
RPUSH-
RPUSHX-

推荐

  • 简单列表类(xx列表等)

  • 扩展为队列(LPUSH、LPOP)、堆栈使用(RPUSH、RPOP), 插入删除尽量操作队头、队尾元素

注意

  • 超大拉链,例如元素个数过多

  • 频繁的O(N)操作,例如:

    • LRANGE 0
    • LINDEX x
    • LTRIM

Hash

  • 存储键值对,格式为:key → [filed, value],可以简单理解为一个named-hashmap。

  • 插入、查找、删除均为O(1)

推荐

  • 存放结构化的数据,例如带属性信息,但filed个数有限不能无限多,value也不可过大

  • 方便查询子field

注意

  • 单个hash的field数量过多,造成大key问题

  • 同质化key的大量增删改查操作,造成数据倾斜、热点key等问题

  • 频繁O(N) range类操作,例如:

    • Hmget
    • Hgetall
    • Hscan
命令备注
HDEL-
HEXISTS-
HGET-
HGETALL-
HINCRBY-
HINCRBYFLOAT-
HKEYS-
HLEN-
HMGET-
HMSET-
HSCAN-
HSET-
HSETNX-
HSTRLEN-
HVALS-

Set

  • 相当于HashSet, 内部用Hash结构存储(value为NULL)

  • 集合的差、并、补适合单机使用,分布式场景下需要配合Hash Tag 使用

推荐

存放简单无序关系

注意

  • 单个Set的Field数量不可过多,会造成大key问题

  • 利用HashTag做差、并、补场景,不注意出现数据倾斜与热点问题

  • 频繁O(N) range类操作,例如:SMEMBERS

命令备注
SADD-
SCARD-
SDIFF-
SDIFFSTORE-
SINTER-
SINTERSTORE此命令需要操作的key在同一个分片上,因此需要配合Hashtag使用
SISMEMBER-
SMEMBERSSMEMBERS是O(N)命令,特别消耗资源,执行的时候请注意有多少个元素,建议超过1000个元素或者整个set大于100KB的就不要执行,若有需求请使用SSCAN分批读取
SMOVE此命令需要操作的key在同一个分片上,因此需要配合Hashtag使用
SPOP-
SRANDMEMBER-
SREM-
SSCAN-
SUNION此命令需要操作的key在同一个分片上,因此需要配合Hashtag使用
SUNIONSTORE此命令需要操作的key在同一个分片上,因此需要配合Hashtag使用

Ordered Set(ZSet)

  • 带排序功能的Set,Set中每个成员都有一个权重,成员根据权重顺序排列

  • 插入删除O(logn),查找O(1)

推荐

  • 排行榜(TopN)

  • 时序数据

注意

  • 大拉链,单个zset的Field数量不可过多,造成大key问题

  • 大量使用扫全集的操作,例如:Zrange

命令备注
ZADD-
ZCARD
ZCOUNT-
ZINCRBY
ZRANGE-
ZRANGEBYSCORE-
ZRANK-
ZREM-
ZREMRANGEBYRANK-
ZREMRANGEBYSCORE-
ZREVRANGE-
ZREVRANGEBYSCORE-
ZREVRANK-
ZSCAN
ZSCORE-
ZUNIONSTORE此命令需要操作的key在同一个分片上,因此需要配合Hashtag使用
ZINTERSTORE此命令需要操作的key在同一个分片上,因此需要配合Hashtag使用
ZLEXCOUNT-
ZPOPMAX-
ZPOPMIN-