1.Redis的五种基本数据类型
String,Hash,list,set,zset,对应的基本操作
2.缓存穿透
完全不存在的一个数据,在缓存中查询不到,就去数据库中去查,查找不到,无法再缓存中存。
解决方法:1)布隆过滤器
算法:
1. 首先需要k个hash函数,每个函数可以把key散列成为1个整数
2. 初始化时,需要一个长度为n比特的数组,每个比特位初始化为0
3. 某个key加入集合时,用k个hash函数计算出k个散列值,并把数组中对应的比特位置为1
4. 判断某个key是否在集合时,用k个hash函数计算出k个散列值,并查询数组中对应的比特位,如果所有的比特位都是1,认为在集合中。
2)把空值也传入Redis中,设置一个过期时间,一般不超过5分钟
3.缓存雪崩
如果缓存集中在一段时间内失效,发生大量的缓存穿透,所有的查询都落在数据库上,造成了缓存雪崩。
解决方法:1)不同的key设置不同的实效时间,让缓存失效时间点均匀分布
2)做双份缓存,比如:a缓存设置失效时间短,b缓存是a缓存备份,b缓存是长期缓存,a缓存失效后,访问b缓存
3)加锁和队列,对一个key,只允许一个线程,查数据库和写缓存
4.Redis哨兵机制
首先要了解Redis的主从复制,主节点挂掉,从节点顶替,哨兵机制就是让这个过程完全自动化,保证Redis的高可用行,一个哨兵认为主节点挂掉是主观下线,超过半数的哨兵认为下线,才是客观下线。
5.Redis的排序算法
底层用了快速排序算法,详情看https://segmentfault.com/a/1190000002806846
6.Redis的过期策略
设置过期时间expire key time(秒),让时间失效 persist key,返回key的剩余时间ttl key。
1)定时删除:设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除
2)惰性删除:key过期的时候不删除,每次查数据库的时候,检查是否过期,若过期,则删除,缺点,若一个key值过期,又长期没有从数据库查询,则造成内存泄漏
3)每隔一段时间,定期对过期的key进行处理
7.Redis如何解决key冲突
源码:Redis一共有16384个槽,对key进行特定的hash计算,得到hash的存储位置,加入两个key计算到了同一个位置,则采用链表的方式,新来的key放在表头
业务:一个Redis节点支持16个数据库,0~15,不同数据之间的key互不影响
8.redis是单线程的么,为什么呢
因为Redis的数据是存储在内存当中的,已经很快了,单线程可以减少线程切换的时间
9.redis和memcache区别
1)Redis支持更多的数据类型,memcahed只支持key-value类型
2)Redis支持主从复制,即master—slave模式
4)Redis支持数据持久化
10.Redis的数据持久化
Redis支持两种形式的数据持久化,RDB快照和AOF日志
1)RDB快照:Redis主从同步用的就是这种方式,Redis内部使用copy on write 机制,fork一个子进程,子进程讲数据生成一个临时的文件,通过原子性命令将临时文件更改成RDB快照,我们可以通过Redis的Save命令来指定几分钟后生成或者多少次操作后生成快照
缺点:假如Redis宕机,上一次生成RDB的到宕机之间的数据会全部丢失
2)AOF 日志:对数据库更改的数据更改的指令将会记录到 AOF日志中,当操作越来越多,AOF文件也越来越大,可以启动AOF 的重写功能,Redisfork一个子进程,把以前的多条命令改成一条命令,此时如果数据再发生变化,所有的命令会记录在内存的缓冲区的临时文件中,也会在老的AOF文件中记录,当子进程重写完成后,缓冲区的内容会合并在新的AOF文件中。新的AOF 的文件将会替代旧的AOF文件
11.Redis的分布式锁
一般来讲,Redis的锁通过setnx实现,key是唯一键,value设置当前的时间+过期时间,其他线程等待,其他线程判断是否过期时间,如果过期,通过getset操作,返回旧值,比较当前时间,得到一个时间戳如果比当前时间小,删除ID,释放锁
12.Redis主从复制
https://www.cnblogs.com/lukexwang/p/4711977.html
slaveof 命令可以指定主从服务器,同步:1.从服务器向主服务器发送sync命令,主服务器生成RDB文件,并从现在开始在缓冲区记录所有写命令 3.主服务器把RDB文件发送给从服务器,从服务器拿到RDB文件同步数据库,4.主服务器把缓存区的命令发送给从服务器,从服务器执行缓存区的所有写命令