zoukankan      html  css  js  c++  java
  • 对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算法;

  • 相关阅读:
    左侧列固定的表格
    百度地图上添加多个标记,标记上添加信息展示窗口、跳转到导航界面
    vue-cli4版本解决eslint问题
    使用脚手架搭建项目
    正则表达式学习
    函数参数:
    装饰器(重点)
    列表生成式、生成器、迭代器
    logging 日志模块
    json 、 pickle 、shelve序列化
  • 原文地址:https://www.cnblogs.com/ruili07/p/11533557.html
Copyright © 2011-2022 走看看