Redis教程

Redis 基础数据结构

本文主要是介绍Redis 基础数据结构,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Redis 是 Redis remote dictionary server 远程字典服务的缩写。

Redis 所有的数据结构都以唯一的key 作为名称,然后通过唯一的key 来获取value 数据,所以不同类型的数据结构的差异就在于value 的结构不一样。

1. String 类型

可以理解为一个字符数组,内部实现类似于ArrayList。 采用预分配冗余空间减少内存的频繁分配。 一般 capacity > length。 字符串最大长度是512MB.

127.0.0.1:6379> set strkey strval
OK
127.0.0.1:6379> get strkey
"strval"

2.list 列表

相当于java 的 LinkedList。 是链表而不是数组。

插入和删除非常快,时间复杂度为o(1),但是索引定位非常慢,时间复杂度为O(n)。 而且列表中的每个元素都是双向链表,支持前向后向遍历。

当列表弹出了最后一个元素之后,该数据结构会被自动删除,内存会被回收。

右进左出: 队列

右进右出:栈(很少用作这种数据结构)

深入理解:快速列表。 list 不仅仅是一个简单的LinkedList,是可以称之为快速列表的结构。

在列表元素较少的情况下,会使用一块连续的内存存储,这个结构是ziplist,即压缩列表。

   当元素较多的时候改成quicklist。因为普通的链表需要的附加指针空间会浪费空间,比如链表只是存一个int,但是pre、next 就需要两个额外的指针。所以redis 将 链表和ziplist组合在一起。多个ziplist 形成链表。

3. hash 字典

可以理解为java 的hashmap。 它是无序字典。内部结构也是基于数组+链表。碰撞之后变为链表结构。不同的是,Redis的字典的值只能是字符串,另外rehash 的方式不一样。

当hash移除了最后一个元素之后该数据结构会被自动删除,内存会被回收。

hash 也有缺点,hash 的存储消耗高于单个字符串。

4. set 集合

相当于java 的hashset,它内部的键值对是无序的、唯一的。它的内部实现先当与一个特殊的字典,字典中的所有value 都是一个NULL。(Java 中所有的值都是一个Object 对象)

当集合中最后一个元素被移除之后,数据结构被自动删除,内存被回收。

典型场景: 保存中奖用户的用户ID,因为有去重功能,所以不会重复。

5. zset 有序列表

它类似于java 的 SortedSet 和 HashMap的结合体。一方面它是set保证内部value 的唯一性,另一方面它可以为每个value 赋予一个score代表这个value 的排序权重。

zset 中的最后一个value被移除后也会被内存回收。

典型场景: 保存用户的分数,value 是学生姓名,score 是学生分数

zset 内部是通过跳跃列表的数据结构实现的。跳跃列表类是一种层级结构,最下面一层所有的元素都会串起来。然后每隔几个元素挑处一个代表,再将这几个代表使用另外一级指针串起来。形成金字塔结构。

 

容器数据结构通用规则:

1. create if not exists: 如果容器不存在就创建一个

2. drop if no elements: 没有元素则删除后释放内存

关于过期时间:

redis 的所有数据结构都可以设置过期时间,注意hash 的过期时间是整个hash,不是某个key。 而且字符串用set 方法修改后相当于新开对象,过期时间为-1(永久)。

 

这篇关于Redis 基础数据结构的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!