精华内容
下载资源
问答
  • 信息太少,推断你是CS结构系统,Client取Server端时间,简单说就是一个信息传递问题,不知道你现在CS间传递信息方式,一般有RMI、Soap等等,以RMI为例=======接口部分===============import java。...

    给的信息太少,推断你是CS结构的系统,Client取Server端时间,简单说就是一个信息传递的问题,不知道你现在的CS间传递信息方式,一般有RMI、Soap等等,以RMI为例

    =======接口部分===============

    import java。

    rmi。Remote;

    import java。rmi。RemoteException;

    public interface IDoRemote extends Remote {

    public int getServerTime() throws RemoteException;

    }

    =======接口实现===============

    public class DoRemoteImpl extends UnicastRemoteObject implements IDoRemote {

    /**

    * @throws RemoteException

    */

    protected DoRemoteImpl() throws RemoteException {

    super();

    }

    private static final long serialVersionUID = -8158779541912069375L;

    /**

    * @see iy。

    test。RemoteServer。IDoRemote#getServerTime()

    */

    public int getServerTime() throws RemoteException {

    return rseInt(new SimpleDateFormat("yyyyMMdd")。

    format(new Date()));

    // return new Date();

    }

    ========Server端绑定===============

    public static void main(String[] args) {

    try {

    eateRegistry(8808);

    DoRemoteImpl Server = new DoRemoteImpl();

    bind("//localhost:8808/Date-Server", Server);

    } catch ( 。

    MalformedURLException me) {

    intln("Malformed URL: " + String());

    } catch (RemoteException re) {

    intln("Remote exception: " + String());

    }

    }

    ===========客户端的调用方式============

    String url = "//localhost:8808/Date-Server";

    IDoRemote RmiObject = (IDoRemote) Naming。

    lookup(url);

    intln(" Server Date: " + tServerTime());

    PS。 如果使用jdk5。0以下版本需要用rmic编译一下

    可以搜搜网上相关文档,有很多例子

    全部

    展开全文
  • 背景为了减少占用内存空间,通常会对放到 ...设置过期时间设置过期时间的四种方式#将key过期时间设置为ttl秒expire#将key过期时间设置为ttl毫秒pexpire#将key过期时间设置为timestamp指定秒数时间戳expire#...

    8a2281d156754d0715a19ef6fb506aed.png

    背景

    为了减少占用内存空间,通常会对放到 Redis 中的键通过 expire 设置一个过期时间,那 Redis 是怎么实现对过期键删除的呢?

    设置过期时间

    设置过期时间的四种方式
    # 将 key 的过期时间设置为 ttl 秒
    expire   # 将 key 的过期时间设置为 ttl 毫秒
    pexpire  # 将 key 的过期时间设置为 timestamp 指定的秒数时间戳
    expire  # 将 key 的过期时间设置为 timestamp 指定的毫秒数时间戳
    pexpire  

    其中前三种方式都会转化为最后一种方式来实现过期时间

    5a6a550b1bba90f293208da918c0473a.png
    expire命令实现
    0014e73539d2ab3bb373bc3783aaa0ab.png
    命令转化

    保存过期时间

    我们看下 redisDb 的结构

    typedef struct redisDb {
        dict *dict;                 /* The keyspace for this DB */
        dict *expires;              /* Timeout of keys with a timeout set */
        ...
    }

    可见在 redisDb 结构的 expire 字典(过期字典)保存了所有键的过期时间

    过期字典的键是一个指向键空间中的某个键对象的指针

    过期字典的值保存了键所指向的数据库键的过期时间

    6625a719b257ee08b7e26f43a4aa6913.png
    带有过期键的例子

    注意

    图中过期字段和键空间中键对象有重复,实际中不会出现重复对象,键空间的键和过期字典的键都指向同一个键对象

    过期键的判断

    通过查询过期字典,检查下面的条件判断是否过期

    1. 检查给定的键是否在过期字典中,如果存在就获取键的过期时间

    2. 检查当前 UNIX 时间戳是否大于键的过期时间,是就过期,否则未过期

    过期键的删除策略

    惰性删除

    在取出该键的时候对键进行过期检查,即只对当前处理的键做删除操作,不会在其他过期键上花费 CPU 时间

    缺点:对内存不友好,如果一但键过期了,但会保存在内存中,如果这个键还不会被访问,那么久会造成内存浪费,甚至造成内存泄露

    如何实现?

    就是在执行 Redis 的读写命令前都会调用 expireIfNeeded 方法对键做过期检查

    如果键已经过期,expireIfNeeded 方法将其删除

    如果键未过期,expireIfNeeded 方法不做处理

    7218ab07628df44e3f15da3fcb4a8b6f.png
    惰性删除

    对应源码 db.c/expireIfNeeded 方法

    int expireIfNeeded(redisDb *db, robj *key) {
        // 键未过期返回0
        if (!keyIsExpired(db,key)) return 0;

        // 如果运行在从节点上,直接返回1,因为从节点不执行删除操作,可以看下面的复制部分
        if (server.masterhost != NULLreturn 1;

        // 运行到这里,表示键带有过期时间且运行在主节点上
        // 删除过期键个数
        server.stat_expiredkeys++;
        // 向从节点和AOF文件传播过期信息
        propagateExpire(db,key,server.lazyfree_lazy_expire);
        // 发送事件通知
        notifyKeyspaceEvent(NOTIFY_EXPIRED,
            "expired",key,db->id);
        // 根据配置(默认是同步删除)判断是否采用惰性删除(这里的惰性删除是指采用后台线程处理删除操做,这样会减少卡顿)
        return server.lazyfree_lazy_expire ? dbAsyncDelete(db,key) :
                                             dbSyncDelete(db,key);
    }
    补充

    我们通常说 Redis 是单线程的,其实 Redis 把处理网络收发和执行命令的操作都放到了主线程,但 Redis 还有其他后台线程在工作,这些后台线程一般从事 IO 较重的工作,比如刷盘等操作。

    上面源码中根据是否配置 lazyfree_lazy_expire(4.0版本引进) 来判断是否执行惰性删除,原理是先把过期对象进行逻辑删除,然后在后台进行真正的物理删除,这样就可以避免对象体积过大,造成阻塞,后面会在深入研究下 Redis 的 lazyfree 原理 源码位置 lazyfree.c/dbAsyncDelete 方法

    定期删除

    定期策略是每隔一段时间执行一次删除过期键的操作,并通过限制删除操作执行的时长和频率来减少删除操作对CPU 时间的影响,同时也减少了内存浪费

    Redis 默认会每秒进行 10 次(redis.conf 中通过 hz 配置)过期扫描,扫描并不是遍历过期字典中的所有键,而是采用了如下方法

    1. 从过期字典中随机取出 20 个键

    2. 删除这 20 个键中过期的键

    3. 如果过期键的比例超过 25% ,重复步骤 1 和 2

    为了保证扫描不会出现循环过度,导致线程卡死现象,还增加了扫描时间的上限,默认是 25 毫秒(即默认在慢模式下,如果是快模式,扫描上限是 1 毫秒)

    对应源码 expire.c/activeExpireCycle 方法

    void activeExpireCycle(int type) {
            ...
            do {
               ...
                if (num > ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP)
                    // 选过期键的数量,为 20
                    num = ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP;

                while (num--) {
                    dictEntry *de;
                    long long ttl;
                    // 随机选 20 个过期键
                    if ((de = dictGetRandomKey(db->expires)) == NULLbreak;
                    ...
                    // 尝试删除过期键    
                    if (activeExpireCycleTryExpire(db,de,now)) expired++;
                    ...
                }
                ...
               // 只有过期键比例 
            } while (expired > ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP/4);
        }
        ...
    }

    补充

    因为 Redis 在扫描过期键时,一般会循环扫描多次,如果请求进来,且正好服务器正在进行过期键扫描,那么需要等待 25 毫秒,如果客户端设置的超时时间小于 25 毫秒,那就会导致链接因为超时而关闭,就会造成异常,这些现象还不能从慢查询日志(之前分享过慢查询日志的文章 Redis慢查询日志)中查询到,因为慢查询只记录逻辑处理过程,不包括等待时间。

    所以我们在设置过期时间时,一定要避免同时大批量键过期的现象,所以如果有这种情况,最好给过期时间加个随机范围,缓解大量键同时过期,造成客户端等待超时的现象

    Redis 过期键删除策略

    Redis 服务器采用惰性删除和定期删除这两种策略配合来实现,这样可以平衡使用 CPU 时间和避免内存浪费

    AOF、RDB 和复制功能对过期键的处理

    RDB文件

    生成 RDB 文件

    在执行 save 命令或 bgsave 命令创建一个新的 RDB文件时,程序会对数据库中的键进行检查,已过期的键就不会被保存到新创建的 RDB文件中

    载入 RDB 文件

    主服务器:载入 RDB 文件时,会对键进行检查,过期的键会被忽略

    从服务器:载入 RDB文件时,所有键都会载入。但是会在主从同步的时候,清空从服务器的数据库,所以过期的键载入也不会造成啥影响

    AOF文件

    AOF 文件写入

    当过期键被惰性删除或定期删除后,程序会向 AOF 文件追加一条 del 命令,来显示的记录该键已经被删除

    AOF 重写

    重启过程会对键进行检查,如果过期就不会被保存到重写后的 AOF 文件中

    复制

    从服务器的过期键删除动作由主服务器控制

    主服务器在删除一个过期键后,会显示地向所有从服务器发送一个 del 命令,告知从服务器删除这个过期键

    从服务器收到在执行客户端发送的读命令时,即使碰到过期键也不会将其删除,只有在收到主服务器的 del 命令后,才会删除,这样就能保证主从服务器的数据一致性

    疑问点?

    1. 如果主从服务器链接断开怎么办?

    2. 如果发生网络抖动,主服务器发送的 del 命令没有传递到从服务器怎么办?

    其实上面两个问题 Redis 开发者已经考虑到了,只是主从复制涉及到的知识点还挺多,下面我就简单的说下解决的思路,后面会再分享一篇主从复制的文件

    首先看疑问点1-如果主从服务器链接断开怎么办?

    Redis 采用 PSYNC 命令来执行复制时的同步操作,当从服务器在断开后重新连接主服务器时,主服务器会把从服务器断线期间执行的写命令发送给从服务器,然后从服务器接收并执行这些写命令,这样主从服务器就会达到一致性,那主服务器如何判断从服务器断开链接的过程需要哪些命令?主服务器会维护一个固定长度的先进先出的队列,即复制积压缓冲区,缓冲区中保存着主服务器的写命令和命令对应的偏移量,在主服务器给从服务器传播命令时,同时也会往复制积压缓冲区中写命令。从服务器在向主服务器发送 PSYNC 命令时,同时会带上它的最新写命令的偏移量,这样主服务器通过对比偏移量,就可以知道从服务器从哪里断开的了

    然后,我们再来看疑问点2-如果发生网络抖动,主服务器发送的 del 命令没有传递到从服务器怎么办?

    其实主从服务器之间会有心跳检测机制,主从服务器通过发送和接收 REPLCONF ACK 命令来检查两者之间的网络连接是否正常。当从服务器向主服务器发送 REPLCONF ACK 命令时,主服务器会对比自己的偏移量和从服务器发过来的偏移量,如果从服务器的偏移量小于自己的偏移量,主服务器会从复制积压缓冲区中找到从服务器缺少的数据,并将数据发送给从服务器,这样就达到了数据一致性

    小结

    本文主要分析了 Redis 的过期策略是采用惰性删除和定期删除两种策略配合完成,然后简单看了两种策略的源码和是怎么实现的。最后介绍了 Redis 在进行 RDB 、 AOF 和主从复制操作时,如何对过期键进行处理,特别介绍了主从复制在发生主从链接断开和网络抖动命令丢失是如何处理的,希望大家看完能有收获

    参考资料

    《Redis设计与实现》第二版.黄健宏

    《Redis深度历险:核心原理与深度实战》.老钱

    https://yq.aliyun.com/articles/205504

    beb68fa8e534dbc317c9ee9efdb5b7f8.png

    展开全文
  • 相信不少用户在网站建设过程中,思考过一些问题,那就是云服务器和独立服务器相比如何?...一、关于配置规格云服务器:因为云服务器的高度扩展性,以及是满足市场需求,使得云服务器的初始配置比如CPU、内存、...

    相信不少用户在网站建设过程中,思考过一些问题,那就是云服务器和独立服务器相比如何?首先我们要知道传统物理服务器也就是独立服务器发展至今已经非常成熟了,当然用户最先了解到的还是独立服务器一如既往的高昂价格。所以这期间出现了云服务器,堪称轻量级市场的新贵,那么他们之间到底有什么区别?谁更好?

    一、关于配置规格

    云服务器:

    因为云服务器的高度扩展性,以及是满足市场需求,使得云服务器的初始配置比如CPU、内存、磁盘空间都相对较低,不会有太高的规格。

    独立服务器:

    独立服务器因为自身市场的定位,所以起步的初始配置规格会更高。

    二、关于安全性

    云服务器:

    云服务器基于云计算,而云计算集群使得云服务器对安全的要求更高,因此云服务器天生具备防ARP和MAC地址欺骗,快照备份更是家常便饭,保护数据的能力相对安全。

    独立服务器:

    独立服务器的安全性和云服务器相比显得不够出色,一般是请专业人员进行维护,并且配合第三方安全服务使用。

    三、关于资源利用

    云服务器:

    云服务器基于服务器集群,配置可弹性伸缩,用户按需购买,资源利用率较高。

    独立服务器:

    一般选用固定型号和配置的服务器产品,不易升级扩展,可能出现资源过剩的情况。

    四、关于使用成本

    云服务器:

    云服务器由于弹性扩展能力强,大大降低了使用成本,用户完全可以购买低配置之后后续升级,所以云服务器使用成本更低。

    独立服务器:

    45017e9e53a06b611c80b3146a907ee1.png

    独立服务器不管是租用还是托管,因为基础配置规格高以及物理硬件百分百占有,所以使用成本较高。

    如何选择?

    云服务器结构灵活,按需所用,运营成本低的特性,非常适合个人、中小企业用来扩展业务。而对于独立服务器这种在技术上相对成熟,并且具有超高的硬件设施,显然更适合大型企业的使用。

    最后,说几句题外话,本来还想写一期云服务器、独立服务器的推荐盘点的,思来想去还是放弃了,所以结尾送个彩蛋吧,如果大家不知道购买哪家的云服务器和独立服务器比较好,可以建议去SugarHosts看看,周围不少朋友的个人网站,以及公司的企业网站,都是用的SugarHosts,口碑不错,大家可以去看看。

    展开全文
  • 出于一些原因,你可能需要每月收集一次 Linux 系统运行时间报告。-- Magesh Maruthamuthu...在一段时间后重启 Linux 服务器是解决某些未解决问题好方法。(LCTT 译注:本文这些观点值得商榷,很多服务器可以稳定运...
    800ac606c1dbe7d22a35eebfd154233a.png

    出于一些原因,你可能需要每月收集一次 Linux 系统运行时间报告。

    -- Magesh Maruthamuthu(作者)

    出于一些原因,你可能需要每月收集一次 Linux 系统运行时间 报告。如果是这样,你可以根据需要使用以下 bash 脚本 之一。

    我们为什么要收集这份报告?在一段时间后重启 Linux 服务器是解决某些未解决问题的好方法。(LCTT 译注:本文这些观点值得商榷,很多服务器可以稳定运行几千天,尤其是有了内核热补丁之后,启动并不是必须的。)

    建议每 180 天重新启动一次。但时间段也许取决于你公司的政策。如果你已经长时间运行服务器而没有重启。这可能导致服务器上出现一些性能或内存问题,我在许多服务器上都注意到了这一点。

    这些脚本一次性提供了所有系统运行报告。

    什么是 uptime 命令

    uptime 命令将告诉你系统已经运行了多长时间。它在一行中显示以下信息:当前时间、系统运行了多长时间、当前登录了多少用户以及过去 1、5 和 15 分钟的平均系统负载。

    什么是 tuptime?

    tuptime 是用于报告系统的历史和统计运行时间的工具,可在重启之间保存。它类似于 uptime 命令,但输出更有趣。

    1)检查 Linux 系统运行时间的 Bash 脚本

    该 bash 脚本将收集所有服务器正常运行时间,并将报告发送到给定的电子邮箱地址。

    请替换为你的电子邮箱地址,而不是用我们的,否则你将不会收到邮件。

    # vi /opt/scripts/system-uptime-script.sh#!/bin/bash> /tmp/uptime-report.outfor host in cat /tmp/servers.txtdoecho -n "$host: "ssh $host uptime | awk '{print $3,$4}' | sed 's/,//'done | column -t >> /tmp/uptime-report.outcat /tmp/uptime-report.out | mail -s "Linux Servers Uptime Report" "2daygeek@gmail.com"

    给 system-uptime-script.sh 设置可执行权限。

    $ chmod +x /opt/scripts/system-uptime-script.sh

    最后运行 bash 脚本获取输出。

    # sh /opt/scripts/system-uptime-script.sh

    你将收到类似以下的报告。

    # cat /tmp/uptime-report.out192.168.1.5: 2 days192.168.1.6: 15 days192.168.1.7: 30 days192.168.1.8: 7 days192.168.1.9: 67 days192.168.1.10: 130 days192.168.1.11: 23 days

    2)检查 Linux 系统是否运行了 30 天以上的 Bash 脚本

    此 bash 脚本会收集运行 30 天以上的服务器,并将报告发送到指定的邮箱地址。你可以根据需要更改天数。

    # vi /opt/scripts/system-uptime-script-1.sh#!/bin/bash> /tmp/uptime-report-1.out for host in cat /tmp/servers.txtdoecho -n "$host: "ssh $host uptime | awk '{print $3,$4}' | sed 's/,//'done | column -t >> /tmp/uptime-report-1.outcat /tmp/uptime-report-1.out | awk ' $2 >= 30' > /tmp/uptime-report-2.outcat /tmp/uptime-report-2.out | mail -s "Linux Servers Uptime Report" "2daygeek@gmail.com"

    给 system-uptime-script-1.sh 设置可执行权限。

    $ chmod +x /opt/scripts/system-uptime-script-1.sh

    最后添加一条 cronjob 来自动执行。它会在每天早上 7 点运行。

    # crontab -e0 7 * * * /bin/bash /opt/scripts/system-uptime-script-1.sh

    注意: 你会在每天早上 7 点会收到一封电子邮件提醒,它是昨天的详情。

    你将收到类似下面的报告。

    # cat /tmp/uptime-report-2.out192.168.1.7: 30 days192.168.1.9: 67 days192.168.1.10: 130 days

    展开全文
  • 租用香港服务器的时候,带宽也是客户考虑的因素之一。租用香港服务器的带宽多大,是共享带宽还是独享带宽,服务器能跑到多少带宽,峰值多少呢?租用香港服务器如何选择带宽?用简单的一点说法来解释,就像西电东输的...
  • 用户通过映射盘访问服务器文件夹,每层文件夹都有不同权限控制,因为服务器上经常有文件夹被删除或移动,现在我想知道是谁干,还有时间,有没有什么方案可以实现,环境:windows server 。...
  • 的时间又是怎么同步和校正的呢?下面来教大家如何通过设置时间服务器来给局域网内的其他电脑同步时间,具体步骤如下: 工具/原料 NTP(Network Time Protocol,网络时间协议)是用来...
  • 心跳包技术:心跳包之所以叫心跳包是因为:它像心跳一样每隔固定时间发一次,以此来告诉服务器,这个客户端还活着。事实上这是为了保持长连接,至于这个包内容,是没有什么特别规定,不过一般都是很小包,...
  • 用户通过映射盘访问服务器文件夹,每层文件夹都有不同权限控制,因为服务器上经常有文件夹被删除或移动,现在我想知道是谁干,还有时间,有没有什么方案可以实现,环境:win2003serve...
  • 2、重启了服务器(已知操作,有没有我不知道的操作不知道) 3、服务器无法正常启动,以安全模式可以正常启动,查找愿意发现是操作系统桌面被删除了 4、请问怎么样可以删除操作系统桌面? 5、如果不是...
  • 但是香港服务器运行的时间越长,我们就更应该格外的小心,因为有太多没必要的内存会影响整体的性能,那么我们怎么优化香港服务器,让它一直都这么流畅下去呢?下面小编就分享一些提高它整体性能的方法。 一、合理...
  • 对于中小企业来说,选择服务器托管可以节省大量的时间和资金,让企业能够将精力都用在业务的拓展上,所以对企业的发展来说是非常有利。但是很多企业不知道如何正确的选择服务器, 方法/步骤 1 (1)在选择...
  • 一、性能指标我们知道服务器,有 CPU、内存、IO、网络等一系列指标,除了这些系统级的,还有些针对各个语言自己的性能参数,而一个服务器的吞度量与请求对CPU的消耗、外部接口、IO等等紧密关联的,面对这么多繁杂的...
  • 更新后,我们需要知道是否需要重启才能应用,更新后是否出现了新问题,需要如何去解决。 一般来说,即使更新系统可以消除错误降低安全风险,也可以减少出现故障时排查时间。 二、删除不用...
  • 门户网站则是尽量保证大带宽和大流量,而针对游戏网站对服务器的要求我们来做一下详细剖析: 1、服务器CPU的挑选 网页游戏服务器每天接受至少几百、至多上千万的访问量,对CPU的快速吞吐量、稳定性、长时间运行都...
  • 如果您有一个正在运行Linux服务器,您可能怀疑有一些恶意流量进来,或者想知道这个新机器网络动态。有很多工具可以完成这项工作,其中一些工具已经存在很长时间了。然而,其中一些命令可能非常复杂,或者实际上...
  • 我解释我想做什么第一在开始时,应用程序将只有一个服务器(短时间)与DNS,PHP,Mysql,Data和memcache.第二然后我会把它们分成两部分> DNS,Mysql,memcache>数据,PHP第三这里是问题,我不知道如何做到这一点,以保持...
  • 没想到得知消息开学至少要到5月8号了……我看我们这届毕业生可以收拾收拾原地毕业算了,不过好在消息出还不算是太晚,现在还有点时间来处理毕设和论文,其他只能走一步算一步了……早知道去年就应该出去实习啊...
  • 如何将Exchange 2007迁移到一台新的服务器并且保留原有服务器名发布时间:2007-08-04 08:00:00 来源: 作者: 点击:578用户请求,想要知道如何将Exchange 2007迁移到一台新的服务器并且保留原有服务器名。...
  • 要确定服务器的寿命,重要的是要明确这一点。  这两者的区别在于:汽车中的大多数部件都是机械的。不管这些组件的设计有多好,或者你维护它们的程度如何,它们最终都会损坏。而相反,服务器中的
  • 随着Exchange服务器的运行时间推移,发现Exchange队列数据库占用的磁盘空间有时会很大,从而导致磁盘空间紧张。最后可能导致出现SMTP传输的反压力情况发生。发生这种情况的时候通常有两种方式去缓解状况:1、停止...
  • 一些做客户端你可能不知道的姿势: Linux用户、组、权限问题以及命令用法 SSH协议相关 其实,这些姿势在《鸟哥Linux私房菜》一书中有非常详尽解释,非常推荐。但是通读此书对我们来说时间成本略高。而且...
  • 如何在 Windows Server 2003 中配置权威时间服务器 察看本文应用于产品 重要说明:本文包含有关如何修改注册表信息。修改注册表之前,一定要先对其进行备份,并且一定要知道在出现问题时如何还原注册表。...
  • 最近在个人小项目需要购买一些服务器,花了一些时间,对市面上主要云服务提供商做了一些简单对比,记录下来备忘,同时,也给希望可以给同样需要人提供一些思路,节省时间. 主要考虑因素 云服务器各种套餐让人...
  • 既然如此,首先想到的就是让本地时间以服务器的时间为基准,只要让服务器传一个时间戳过来就可以了。那如何实现动态获取时间呢?毕竟不能每次获取时间都到服务器去要吧。一个粗糙的思路,只要知道...
  • 我们知道将空闲shell会话保留在Linux服务器上是可能存在安全风险。而且还会消耗系统资源。想象一下,如果你有多个用户远程访问同一个Linux系统,并让他们会话处于空闲状态。作为Linux系统管理员,你可以看到...
  • (3)服务器如何知道某个msg是gop_cache关键帧,并且清理前面帧。 (4)audio和videogop_cache如何对应起来(同步)? (5)客户端连入时候如何把gop_cache发给客户端。 (6)gop...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,522
精华内容 608
关键字:

如何知道服务器的时间