网上的常规与经典面试题汇总与答案—–缓存和消息队列
String是最常用的一种数据类型,普通的key/value存储都可以归为此类。
一个Key对应一个Value,string类型是二进制安全的。
Redis的string可以包含任何数据,比如jpg图片(生成二进制)或者序列化的对象。
hash是一个string 类型的field和value的映射表。
hash特别适合存储对象。相对于将对象的每个字段存成单个string 类型。一个对象存储在hash类型中会占用更少的内存,并且可以更方便的存取整个对象。
Redis的Hash数据类型的value内部是一个HashMap,如果该Map的成员比较少,则会采用一维数组的方式来紧凑存储该MAP,省去了大量指针的内存开销
采用string类型的存储对象,需要将对象进行序列化 使用hash数据类型不需要
list是一个链表结构,主要功能是push, pop, 获取一个范围的所有的值等。操作中key理解为链表名字。
Redis的list类型其实就是一个每个子元素都是string类型的双向链表。我们可以通过push,pop操作从链表的头部或者尾部添加删除元素,这样list既可以作为栈,又可以作为队列(栈就是insertFirst+deleteFirst,队列就是insertLast+deleteFirst)。可以支持反向查找和遍历,方便操作,不过带来了部分额外的内存开销。
是string类型的无序集合。set是通过hash table实现的,可以进行添加、删除和查找。对集合我们可以取并集,交集,差集.
Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。
https://www.cnblogs.com/chenpingzhao/archive/2017/06/10/6965164.html
RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。
也是默认的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb
可以通过配置设置自动做快照持久化的方式。我们可以配置redis在n秒内如果超过m个key被修改就自动做快照
client 也可以使用save或者bgsave命令通知redis做一次快照持久化。save操作是在主线程中保存快照的,由于redis是用一个主线程来处理所有 client的请求,这种方式会阻塞所有client请求。所以不推荐使用
https://www.cnblogs.com/xingzc/p/5988080.html
因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了
单线程只是在处理我们的网络请求的时候只有一个线程来处理,一个正式的Redis Server运行的时候肯定是不止一个线程的
https://blog.csdn.net/chenyao1994/article/details/79491337
https://blog.csdn.net/zzh920625/article/details/78173099?foxhandler=RssReadRenderProcessHandler
https://blog.csdn.net/seven__________7/article/details/70225830
https://www.sohu.com/a/129521820_487514
https://www.jianshu.com/p/8b77d4583bab?utm_campaign
处理消息堆积的方法就是把它存下来。只是这个存储可以做成很多方式。比如存储在内存里,存储在分布式KV里,存储在磁盘里,存储在数据库里等等。但归结起来,主要有持久化和非持久化两种。 持久化的形式能更大程度地保证消息的可靠性(如断电等不可抗外力),并且理论上能承载更大限度的消息堆积(外存的空间远大于内存)。 但并不是每种消息都需要持久化存储。很多消息对于投递性能的要求大于可靠性的要求,且数量极大(如日志)。这时候,消息不落地直接暂存内存,尝试几次failover,最终投递出去也未尝不可