Redis 之 有序集合差集
有序集合没有差集命令Redis集合中提供了SINTER、SUNION、SDIFF命令分别用来处理集合的交集、并集、差集运算。 有序集合中提供了ZINTERSTORE、ZUNIONSTORE命令分别用来处理有序集合的交集、并集运算。却没有提供用来处理有序集合差集的命令。 项目中用到Redis的有序集合来存储数据,需要对有序集合进行差集运算,在网上看到这篇文章:redis有序集合求差集 zdiff? 提供的解决方法,在此记录下。 解决思路先使用ZUNIONSTORE计算并集,并设置并集后成员分数权重。 ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX] 再使用ZREMRANGEBYSCORE去除分数为0的成员。 ZREMRANGEBYSCORE key min max 栗子先添加两个有序集合chinese和english: 127.0.0.1:6379> ZADD chinese 100 user1 99 user2 98 user3 ...
Redis 之 GEO 地理位置
最近在做上门洗车项目时有个需求:需要根据用户选择的坐标位置和支持的服务范围来查找附近的洗车门店。项目中用到Redis来做缓存,刚好Redis有支持GEO地理位置的功能,用来实现该需求再合适不过了。遂研究了下Redis的GEO地理位置如何使用。 概述Redis从3.2版本开始支持geohash算法,地理位置的坐标是以WGS84为标准。WGS84全称World Geodetic System 1984,是为GPS全球定位系统使用而建立的坐标系统。 GEO 命令Redis的GEO目前提供以下6个命令,详情可点击查看。 1. GEOADD:增加某个地理位置的坐标。 2. GEOPOS:获取某个地理位置的坐标。 3. GEODIST:获取两个地理位置的距离。 4. GEORADIUS:根据给定地理位置坐标获取指定范围内的地理位置集合。 5. GEORADIUSBYMEMBER:根据给定地理位置获取指定范围内的地理位置集合。 6. GEOHASH:获取某个地理位置的geohash值。 ...
Dockerfile 之 ADD/COPY 指令
Build Context(构建上下文)在使用docker build命令通过Dockerfile创建镜像时,会产生一个build context(构建上下文)。所谓的构建上下文就是docker build命令的PATH或URL指定的路径中的文件的集合。在镜像build过程中可以引用上下文中的任何文件,比如我们要介绍的ADD和COPY指令就可以引用上下文中的文件。 ADDADD指令用于将构建上下文中指定的文件添加到镜像中的,支持两种形式的写法: ADD src dest ADD ["src", "dest"] ADD指令有以下几个特点: 1. 如果指定的 src 是归档文件(tar, zip, tgz, xz 等)会自动将其解压。 2. 如果指定的 src 是目录,只会添加目录中的内容而不包含目录自身。 3. 如果指定的 src 是 URL 地址,会从 URL 地址下载文件并将其添加到 dest,如果下载的文件是归档文件不会自动解压。 通过一个简单的栗子来说明当前构建上下文目录结构: root# tree . ...
Dockerfile 之 RUN/CMD/ENTRYPOINT 指令
RUNRUN指令指定的命令在docker build构建镜像的时候执行。常用于安装软件包。可以有多个RUN指令,且每个都生效。 Dockerfile 文件123FROM ubuntu:18.04RUN apt update && apt install -y vimRUN touch a 执行docker build构建镜像时会在一层镜像层中更新源并安装vim命令,在另一个镜像层中创建a文件。 注意:apt update和apt install被放在一个RUN指令中执行,这样能够保证每次安装的是最新的包。如果apt install在单独的RUN中执行,则会使用apt update创建的镜像层,而这一层可能是很久以前缓存的。 CMD && ENTRYPOINTCMD指令指定的命令在容器启动后执行。可以有多个CMD指令,但只有最后一个生效。CMD指定的命令会被docker run之后的参数替换。 Dockerfile 文件123FROM ubuntu:trustyCMD hostnameCMD ping localhost 执行docker build ...
创建自己的 Docker 镜像
docker pull下来的镜像有时候不能满足我们的需求,这时候我们可以在这些镜像的基础上创建属于我们自己的镜像。 使用 docker commit 创建自己的镜像执行docker run -it ubuntu:18.04 /bin/bash,进入容器后发现没有vim命令: root# docker run -it ubuntu:18.04 /bin/bash root@1d0e7bcf5430:/# vim bash: vim: command not found 以此为例,我们来创建一个已经安装了vim命令的ubuntu镜像。 先在容器内安装vim命令: 12apt update && apt upgrade -yapt install -y vim 安装完vim命令后我们就可以将这个容器打包成自己的镜像了。 首先我们要知道容器的ID,使用docker ps -a查看: root# docker ps -a CONTAINER ID IMAGE COMMAND CREATED ...
Dockerfile 常用指令
记录下Dockerfile中常用的指令,完整列表和说明可参考官方文档。 Dockerfile123456789101112131415161718192021222324252627FROM scratchMAINTAINER lz94wpzWORKDIR /workspacesCOPY alpine-minirootfs-3.9.3-x86_64.tar.gz /# COPY ["alpine-minirootfs-3.9.3-x86_64.tar.gz", "/"]ADD alpine-minirootfs-3.9.3-x86_64.tar.gz /# ADD ["alpine-minirootfs-3.9.3-x86_64.tar.gz", "/"]ENV HELLO helloENV WORLD worldRUN ["/bin/sh", "-c", "echo $HELLO"]RUN echo $WORLDCMD ["/bin/sh", "-c", "/bin/echo $HELLO"]# CMD echo $WORLD# ENTRYPOINT ["/bin/sh", "- ...
使用 nohup 和 & 让命令在后台执行
&在终端执行命令,如果想让命令在后台执行,不占用终端窗口,可以在该命令后面加上&。&可以把这个命令转换为后台运行的任务进程: 1command & 不过,虽然进程在后台运行了,但进程运行中输出的日志一样会打印到终端窗口上。如果不想终端窗口产生大量输出,我们可以将这些输出重定向到某个文件中: 1command > out.file 2>&1 & 这样,所有的标准输出和错误输出都将被重定向到out.file文件中。 使用&将命令转换为后台运行的任务进程时有两点需要了解下: 1. 命令转换为后台任务进程执行时,会返回该进程的 ID。有了 ID 我们就能对该进程进行操作了,如:结束进程。 2. 一旦执行该命令的终端窗口关闭了,后台运行的任务进程也会随之停止。换句话说,执行该命令的终端窗口不能关闭,除非你不想让后台任务进程继续运行了。 nohup在前面介绍&的使用时我们知道,一旦运行&命令的终端窗口关闭了,后台运行的任务进程也会随之停止。这显然不是我们 ...
Crontab 定时任务
crontabcrontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于crontab文件中,以供之后读取和执行。该词来源于希腊语chronos(χρνο),原意是时间。通常,crontab储存的指令被守护进程激活,crond常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs。 /etc 目录下的几个 cron 目录/etc目录主要用来存放系统中的配置文件,基本上所有的配置文件都可以在这里找到。运行以下命令查看: 1ls /etc/cron* 这个命令会列出/etc目录下所有以cron开头的文件和文件夹。可以看到主要有以下文件夹: 12345/etc/cron.hourly # 这里存放了每小时需要运行的脚本/etc/cron.daily # 这里存放了每天需要运行的脚本/etc/cron.weekly # 这里存放了每个星期需要运行的脚本/etc/cron.monthly # 这里存放了每月需要运行的脚本/etc/cron.d # 如果既不是按小时,也不按天,周 ...