Redis是一个key-vaule的内存数据库,由于内存的快速访问特性,使得redis有较高的性能,可以处理大量复杂的数据结构。
Redis的基本功能:
String类型及操作:String是最简单的类型,可以理解为与memcached是一样的类型,一个key对应一个vaule,但是它的功能很丰富,从内部看String可以看作是byte数组,最大上限是1G字节。
hash类型及操作: hash是string类型的field和vaule的映射表,hash特别适合用于存储对象,相较于将对象的每个字段存储成单个String类型,hash会占用更少的内存,并且可以更方便的存取整个对象。节省内存的原因是新建一个hash对象时开始是用zipmap(small hash)来存储的。这个zipmap并不是hash table ,所以相比正常的hash实现可以节省不少hash本身需要的一些元数据的开销,但是zipmap的添加、删除、查找都是O(n),又由于一般对象的属性都不会太多,所以使用zipmap还是很快的,也就说添加、删除平均还是O(1)。如果field或者vaule的大小超出一定限制后,redis会自动将zipmap替换成正常的hash来实现。这个限制可以在配置文件中指定: hash-max-ziplist-entries 64 #对象属性最多64个,hash-max-ziplist-vaule 512 # vaule 最大为512字节。
list类型及操作:list是一个链表结构,主要功能是push,pop,以及获取一个范围的所有值等等。操作中的key可以理解为链表的名字。list的内部是使用双向链表来实现的,链表的最大长度是2的32次方-1,我们可以向链表的头部或尾部添加删除元素,这使得list即可用作栈,也可以作队列。
set类型及操作:set是集合,集合中的每一个元素都是不同的,且没有顺序。一个集合最多能存储2的32次方-1个元素。由于集合内部是使用hash table实现的,所以添加、删除、查找的复杂度都是O(1),最方便的是多个集合类型之间还可以进行并集,交集和差集运算。hash table会随着添加或者删除自动调整大小,需要注意的是调整大小的时候需要同步,会堵塞其它的读写操作。
sorted set 类型及其操作 :sorted set 是在set的基础上添加了一个顺序属性,这一属性可以在添加修改元素的时候指定,每次指定后,zset会自动重新按新的值调整顺序。
1.有序集合和列表类型有些相似之处:(1)二者都是有序的(2)二者都可以获取某一范围的元素。但是二者也有区别,不同之处如下:(1)列表是通过双向链表来实现的,获取两端的数据特别快,当元素增多后访问中间数据的速度比较慢(2)有序集合是使用散列表来实现的,所以即使读取中间数据速度也是很快的(3)列表中不能简单地调整某个元素的位置,但有序集合可以(4)有序集合比列表类型更耗费内存。