1、Redis常见数据类型
五种常见数据类型:
String:字符串,单个对象或JSON、计数器、分布式锁;
Hash:哈希表,键值对,缓存对象;
List:列表,消息队列,可以头插和尾插;
Set:集合,去重且无序,名单、集合运算场景;
ZSet:有序集合,去重,排行榜等有序信息;
四种新增数据类型:
Bitmap:二值状态,标记用户签到或者登录;
HyperLogLog:海量UV去重;
GEO:地理信息相关;
Stream:消息队列,唯一ID;
2、Redis线程模型
Redis 6.0之前,使用单线程,但是不是说整个Redis都是单线程,而是说Redis接收请求、解析请求、读写数据、响应请求的过程是单线程,采用的是IO多路复用的方式进行监听,如果涉及耗时的后台操作,比如释放文件、释放内存、刷盘操作,还是有后台线程进行处理。
Redis 6.0之后,引入多线程,用来处理网络I/O,但是执行命令仍然是单线程。
3、Redis缓存穿透、缓存击穿、缓存雪崩的区别及解决方法?
缓存穿透:用户访问的数据,缓存不存在,数据库也不存在,当大量类似的请求访问时,会把流量全打到数据库上,导致数据库压力骤增。比如,用户构造大量类似id = -1(不存在的id)访问数据库,导致数据库压力倍增。可以用布隆过滤器解决。
缓存击穿:某个时间,某个热点的key在缓存失效了,或者Redis宕机,导致大量流量打到数据库上面。可以用分布式锁/互斥锁、缓存预热。
缓存雪崩:同一时间,大量key失效,导致大量请求打到数据库。缓存击穿可以看成是缓存雪崩的子集,可以使用随机TTL、多级缓存等方式。