Redis数据结构总结

Key

  • 显而易见,key不要太长,否则浪费内存,在可读性和长度间取个平衡;
  • Keys命令,返回满足条件的key,时间复杂度O(n),n为db中的key数量,生产环境慎用;
  • Scan命令,通过增量迭代的方式提供类似Keys的功能,迭代过程中的信息存储到游标并返回给客户端,服务端并不记录迭代的任何信息,因此,支持多客户端并发迭代,支持客户端中途停止迭代。每次调用的时间复杂度是O(1),一次完整迭代的时间复杂度为O(n)。但Scan命令有以下限制:
    • 支持指定每次返回的count,但不提供任何保证;
    • 集合中的一个元素在迭代过程中可能会返回多次,客户端能处理重复的情况;
    • 迭代过程中,集合中有元素新增或删除,该元素有可能返回,也有可能不返回;
  • Expire/TTL相关指令,用于设置失效时间;
  • Sort排序指令,时间复杂度O(N+M*log(M)),N为集合的元素个数,M为返回的集合数,耗时较高,可根据情况分到Salve节点中执行;

String

Redis服务端并不关心Value格式,所以String其实就是byte数组。该数据结构一般用于缓存,存任何你想存得东西。
- get/set系列命令,基本都是O(1)级别的时间复杂度,非常爽;
- incr/decr系列指令,Redis原生的计数器实现,非常适合实时计数的需求;
- setex指令,带过期时间的set原子操作,和缓存功能完美匹配;
- setbit/getbit/bitop,直接操作bit位,想知道怎么玩?(传送门

Hash

相当于带field的String,比String类型更结构化。多数操作都是O(1)级别的时间复杂度,各种快,用于缓存或内存数据库。

List

由于List是一个双向的链表,可用于支持各种需要队列的业务中,操作都是O(1)复杂度(同时处理多个元素的命令除外,如LTRIM),还提供Block版本的API,好得不能再好。

Set

带去重功能的集合,匹配类似于好友列表之类的业务场景。除了smembers外,针对单个元素的操作都是O(1),同时提供sinter、sunion等取交集和并集的操作。

SortedSet

可以指定权重的去重有序集合,可用于需要支持排序的场景。zadd/zrem的复杂度是O(logn),1亿个元素也就20+。但像ZRangeByScore/ZRemRangeByScore这样的命令,时间复杂度为O(logn+M)(n为集合中元素个数,M为操作的元素个数),如果M很大的话,效率也不好。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值