redis为什么那么快
如果有这么一块数据,它是存在内存里的,并且采用异步非阻塞IO,而且是单线程来处理,你不需要关心线程的创建和销毁,那么你I/O操作这块数据能不快吗?实际上redis单线程机制和保证多路复用,测试了下8万数据仍然保证在秒级存取。
使用单线程,一个缓存数据库,并不太依靠于cpu,影响因素我感觉主要是内存和网络,linux服务器每秒可以发送几百万个请求,时间复杂度为N和logN,所以redis存取只依赖于内存I/O,而不需要做大量的计算,线程又是cpu级别的,所以开个单线程就可以了。
Redis的持久化机制
持久化对于计算机来说,就是能够放在磁盘上,进程宕机与否与我数据无关,redis使用Rdb和aof机制进行持久化,rdb存的是内存数据集的快照,主要以二进制文件存储,它存储的时候是fork了一个子进程,负责把内存数据写到临时文件中去。
Aof机制只存写命令,append机制把写命令追加到文件中去。
Redis的缺点
缓存雪崩问题,缓存击穿问题,以及缓存和数据库双写一致性问题,写入数据大于50k会造成取数据性能转换为java对象后性能差问题。单机受内存限制,为了预估和节约内存,需要定期删数据,重启将硬盘持久话化的数据加载时间会比较久。
程序员面试笔记C/C++、算法、数据结构篇京东月销量官方店旗舰店¥58.1购买Redis会不会造成数据丢失
当然,客户端的lru缓冲过大,导致大量键淘汰,故障重启,导致数据丢失,还有网络分区,主从复制不一致等问题导致数据丢失。
Redis饱和怎么办,什么策略
Redis采用LRU等机制进行淘汰其它数据
分数排行你准备采用什么结构
分数排行当然用zset
跳表结构是什么,hash表咋不用
跳表本身是一种数据结构,用于解决数据中的查找问题,如果存在这样一个链表,查找某个元素,假设从头开始比较的时间复杂度为N,如果我们每两个节点引入一个指针,形成新的链表,那么节点数直接少了一半,查找的时候也少了一半,类似二分查找。并且跳表为每个节点加入一个层级的关系。
Hash表存在hash碰撞,如果不考虑hash碰撞的情况下,hash的时间复杂度为O(1),比跳表更快。