1、redis支持哪些数据类型呢?

redis支持string、list、hash、set、zset(有序)

2、什么是redis持久化?持久化有哪几种方式?优缺点是哪些?

持久化:定时将redis内存中数据,储存到磁盘中,从而做热备。

方式:rdb、aof。
rdb:利用fork进程,便利整个hashTable,利用 cope and wirte,将这个db dump保存下来。
aof:将redis写操作指令,写到一个类似日志的文件中。

优缺点:rdb方式持久化数据秘籍,容易备份,容易容灾恢复,但是备份力度大,crash的时候回丢失save几分钟之前的数据。aof持久化力度小,crash丢失数据少,但是这种持久化比rdb占用更大的空间。

3、redis有哪些架构模式,都有什么特点?

架构模式:单机模式、主从复制模式、哨兵模式、集群模式(proxy)、集群直连模式

单机模式:搭建简单;但是容量有限、处理能力有限、不可高可用
主从复制模式:master/slave角色,数据一致,降低slave读压力;但是不能降低master的写压力,不可高可用
哨兵模式:高可用、监控各个节点、故障自动转移;但是主从切换花时间丢数据,没有降低master写压力
集群模式(proxy):支持多种hsah算法(MD5,CRC16,CRD32等等)、支持失败节点自动删除、后端数据分片对用户透明,业务处理只需按单个redis处理;但是增加新的proxy需要维护高可用、不支持故障自动转移
集群直连模式:无中心化、高可用、支持故障自动转移、数据按solt模式分布、可拓展性强;但是数据异步复制,存在数据不一致、数据隔离性差

4、使用过redis分布锁吗?它是怎么实现的?

说到分布锁首先要注意这几个点:
互斥性。在任意时刻,只有一个客户端能持有锁。
不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。
具有容错性。只要大部分的Redis节点正常运行,客户端就可以加锁和解锁。
解铃还须系铃人。加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解了。

一般使用redis的SETNX做分布式锁,使用资源id作为key,value中存放requestId和和失效时间。为什么值中要放requestId和失效时间呢。因为我们加的锁要保证同一个请求加的锁,同一一个请求可以解锁。

大致流程是:一个请求对某个资源加了锁,只能这个资源获得这个锁,独占这个资源,并使用该资源;其他请求都不能获取到这个分布式锁的钥匙。获得分布式锁钥匙的请求,处理完资源后需要释放锁。

5、使用过Redis做异步队列么,你是怎么用的?有什么缺点?

1、使用list结构作为消息队列,rpush生产消息,lpop消费消息(或者blpop brpop)。当lpop没有数据的时候,需要适当的处理程序中取lpop操作,例如适当sleep。
2、使用redis的发布/订阅模式,可以实现1:N的消息消费。
缺点:在消费者下线的时候,队列消息会丢失
百度了下这个更加全:http://www.bubuko.com/infodetail-3531961.html

6、什么是缓存穿透?如何避免?什么是缓存雪崩?何如避免?

缓存穿透: 一般的缓存系统都是通过key、value去查询缓存,如果不存在对应的value时候,就去数据库中查询。一些恶意的请求会故意大量去查询不存在的key,从而对后端造成极大的压力。这个就是缓存穿透。
缓存穿透的避免:
1、对查询结果为空的数据也进行缓存,并设置很短的失效时间;或者再insert数据后 清除缓存。
2、对不存在key进行过滤,比如将所用存在的key放在bigmap中,查询时通过bigmap过滤。布隆过滤
缓存雪崩: 在一段时间内,发生大量的缓存穿透,所有查询都落在数据库上,而造成缓存雪崩。
如何避免:
1、在缓存失效后,通过锁或者队列控制读数据库写缓存,比如某个key只允许一个线程对读数据库写缓存,其他请求等待。
2、使用双缓存,A1缓存为原始缓存,A2为永久缓存,并且A1缓存设置短失效时间,A1失效后可以范文A2
3、针对不同的key设置不同的失效时间,使缓存失效尽量均匀些。