Redis知识整理

首先redis是一个基于内存的nosql中间件,有五种数据结构,支持持久化,常用来做缓存,分布式锁等,相比于同类产品memcache,提供了持久化,更多的数据类型,并且是单线程的。以下是各种数据类型的介绍。

String 

1、最常用的 String ,存储结构是动态字符串,可以修改,采用预分配冗余空间的方式来减少内存的频繁分配,他这是典型的空间换时间的思想(内部为当前字符串分配内存时,实际分配的空间会高于字符串的实际长度,当字符串的大小小于1M时,扩容都是加倍现有空间,如果超过1M,每次扩容1M,字符串最大是512M)因为他是动态字符串结构,我猜测他的扩容规则,应该类似于ArrayList,会新创建分配一块扩容后的内存,然后将数据拷贝到新分配的内存中

List

2、是他的List类型 他的存储结构是双向链表,我们都知道,链表这种结构首尾插入和删除操作的时间复杂度都是O(1),但他随机定位能力较弱时间复杂度比较高是O(n)

hash

3、hash类型 他的数据结构类似于java中的HashMap,数组+链表的方式,hash的内容key和value存放在链表中,数组中存放的是链表的头指针,存储时,他首先会利用hash函数来计算key的hashCode,然后用hashcode对数组长度取模,然后定位到链表的表头,再对链表进行遍历获取相应的value,链表结构是为了处理hash碰撞的情况的,当hash碰撞发生的比较频繁时,他会扩容,数组会扩容为原来的两倍,将所有的键值对重新分配,如果键值对过多,一次完整的搬移操作会耗时过长,所以它采用了一种渐进式的方式,他首先会同时保留新旧两个hash结构,在后续的定时任务,以及hash结构的读写指令中将旧的结构中的数据逐渐地移过去

set

4、set类型 他的内部也是hash结构的,所有的value都指向同一个内部值

zset

5、zset类型 底层使用了两种数据结构,第一个是hash,第二个是跳跃表,hash的作用就是存储value和权重score,保障元素value的唯一性,可以通过元素value找到相应的score值,而跳跃表的作用是为了给元素排序备份和持久化 Redis支持RDB和AOF两种持久化机制,持久化功能有效的避免因进程退出造成的数据丢失问题,RDB是每隔一段时间生成redis内存中的数据的一份完整的快照,AOF方式是有数据写入redis,redis自身就会先将数据写入aof日志文件(会先写入os cache),过大的话会利用缓存淘汰算法,删除旧的数据

你可能感兴趣的:(Redis知识整理)