• 对Redis的一些理解


    阻塞IO:
    当使用read或者write对某一文件描述符(File Descriptor FD)进行读写的时候,如果数据没有收到,那么该线程会被挂起,直到收到数据。


    I/O多路复用:
    多个连接的管理可以在同一进程, 把多个连接的事件通知业务代码处理, 该方法能同时监控多个文件描述符(fd)的读写情况,当其中的某些fd可读/写时,该方法就会返回可读/写的fd个数。


    epoll作为I/O多路复用:
    网络IO传递的fd_set数据, epoll只告诉那些需要读/写的socket, 整个过程只在调用epoll的时候才会阻塞,收发客户消息是不会阻塞的。

    例子:
    比如一个tcp服务器处理20个客户端socket。A方案:顺序处理,如果第一个socket因为网卡读数据处理慢了,一阻塞后面都玩蛋去。
    B方案:每个socket请求都创建一个分身子进程来处理,不说每个进程消耗大量系统资源,光是进程切换就够操作系统累的了。
    C方案**(I/O复用模型,epoll):将用户socket对应的fd注册进epoll(实际上服务器和操作系统之间传递的不是socket的fd而是fd_set的数据结构),
    然后epoll只告诉哪些需要读/写的socket,只需要处理那些活跃的、有变化的socket fd的就好了。这样,整个过程只在调用epoll的时候才会阻塞,收发客户消息是不会阻塞的。


    LRU最近最少使用缓存算法:
    运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put。

    一种方式是基于双链表: 点击到的就推到头部, 如果数据量变大, 肯定会造成数据热点; 另外,频繁移动数据位置也会造成资源浪费;


    另一种是为Key计数, 随机10个key加入pool, 外加时间衰减因素, 没过一分钟衰减1;


    redis对过期数据的处理:
    惰性删除:惰性删除策略不会在键过期的时候立马删除,而是当外部指令获取这个键的时候才会主动删除。处理过程为:接收get执行、判断是否过期(这里按过期判断)、执行删除操作、返回nil(空)。
    定期删除:定期删除是设置一个时间间隔,每个时间段都会检测是否有过期键,如果有执行删除操作。这个概念应该很好理解。

    “读后写”问题:
    存在A、B两个进程,同时操作下面这段代码:

    $objRedis = new Redis();
    //获取key
    $intNum = $objRedis->get('key');
    if ($intNum == 1) {
    //如果key的值为1,则给key加1
    $bolRet = $objRedis->incr('key');

    //do something...
    }

    一种方法是: Redis操作方法添加线程锁(lock),让其他线程排队. 另一种是对key进行加盐, 需要根据场景设计(大规模数据写入), 应该还有后续数据处理;


    缓存技术并不是raft算法;

  • 相关阅读:
    js内置数据类型
    vue禁止复制的方式
    阻止element组件中的<el-input/>的粘贴功能
    Vue插件集合
    qs.parse()、qs.stringify()、JSON.stringify() 用法及区别
    es6数组的一些函数方法使用
    文章段落首字母缩进两个字符
    深圳scala-meetup-20180902(3)- Using heterogeneous Monads in for-comprehension with Monad Transformer
    深圳scala-meetup-20180902(2)- Future vs Task and ReaderMonad依赖注入
    深圳scala-meetup-20180902(1)- Monadic 编程风格
  • 原文地址:https://www.cnblogs.com/ruili07/p/11533557.html
Copyright © 2020-2023  润新知