一:跳表
每两个节点抽一个节点做索引,两个索引之间也可以抽一个索引再做索引,递归的抽两个点做索引,类似金字塔形式
跳表插入:
可以选择同时将这个数据插入从第几级索引到最底层节点中,比如随机函数生成了值 K,那我们就将这个结点添加到底层叶子节点到第K层节点的所有节点及索引中,这样可以避免某两个节点或者索引值过多编程了单链表
二;redis的五种数据类型
1、String字符串:字符串类型是 Redis 最基础的数据结构,key value均为字符串。
2、Hash哈希:在Redis中,哈希类型是指value本身又是一个(可以,value)结构。
3、List列表(双向链表):列表(list)类型是用来存储多个有序的字符串(有索引下标)。
4、Set集合:类似list,但是是无序的,可以做集合操作(交集并集)。
5、Sorted Set有序集合(跳表实现):Sorted Set 有个score参数,用做排序。
三:REDIS为什么这么快
1、单线程无需上下午切换
2、数据保存在内存,所有操作基于内存
3、非阻塞多路复用
四:redis过期策略
1、定时器定期扫描所有key是否过期,优点:不会漏掉任何一个key;缺点:耗资源
2、lazy的删除方法,在使用的是否判断是否过期,优点:节省资源;缺点:长期不用的会会一直存在内存中
3、折中策略:定时随机扫描部分key
4、内存不够淘汰策略,最基本的保底策略
五:缓存雪崩,缓存穿透,缓存击穿,缓存并发,缓存预热
1、缓存雪崩:redis缓存服务异常,可能是大量过期,可能是服务挂掉等各种原因,解决方法
事前:服务高可用
事中:有其它缓存
事后:备份及时恢复
2、缓存穿透:大量请求不存在的key,视缓存如无物,解决方法:
超过一定阈值,将该key写入缓存并标记为null
3、缓存击穿:热点key突然失效瞬间导致大量请求数据库,解决方案;
失效时间长或者不失效
4、缓存并发:高并发的client同时set-key,server是单线程的,解决方法:
队列化阻塞式执行
5、缓存预热:刚上线的时候没有缓存,如果请求量比较大就会很慢,解决方案:
推算数据库中可能的热点key或者数据量不大的时候全部缓存进去
六:redis持久化
持久化就是将数据库落盘保证数据不丢失,redis持久化有两种方式
1、AOF,默认一秒一次,将所有的修改操作记录到本地,所以一般会很大
2、RDB,快照模式,fork一个子进程将当前所有key-value都dump出来并替换旧文件
七:redis高可用几种情况
1、主备模式,会自动同步数据但是故障不会自动切换
2、哨兵模式,主动同步并自动切换,另起一个哨兵程序进行主备监听和切换
3、分布式模式,多台分布式,并且每台都有主备,做到高可用易扩展