问题描述
- redis中的list,hash,set,zset的内存占用或效率的大概次序是怎么样的?
-
用一个键来存储一堆值,如果list,hash,set,zset业务都可以实现,从内存效率上来看,大概的顺序是怎么样的?
解决方案
set hash list zset
不需要顺序 就用set把。
解决方案二:
list是有序的,set是无序的,后者性能更高,前者适合实现堆栈、队列这些需要顺序的结构。这里说的序是指插入序,不是排序。zset是有序列表,这里的有序是排序,不是插入序。hash适合检索信息,也就是从hash中查找数据会很快。
解决方案三:
先说下这几种redis 数据结构底层实现对应的数据结构:
list 数目较小时可以理解为一种特殊数组(ziplist),数目大于配置的上限时底层实现会自动切换成链表
hash 数目较小时可以理解为一种特殊数组(ziplist),数目大于配置的上限时底层实现会自动切换成hash table
set 根据元素的类型 int 时经过封装的数组(intset),其他则为hash table
sort set 数目较小时可以理解为一种特殊数组(ziplist),数目大于配置上限时就会切换成跳表skip list
内存占用上来说一般可认为跳表会略大于 链表\数组\hash table 其他的数据结构之间差异不大,如果真要比较可能要查看源码计算。
时间效率上来说,要具体到业务常用的操作比较才有意义,比如 同样对list数据结构操作 rpop 时间复杂度O(1) 而 LRANGE时间复杂度为O(N)
每个命令的时间复杂度官网上都能查到。
想要了解redis底层实现,推荐个链接 redisbook.com,希望以上对你有帮助。
时间: 2024-09-19 18:00:47