虚拟机使用指南
创建虚拟机
Linux使用指南
yum
# 更新yum包
sudo yum update -y
# 加入安装过旧版本,先卸载旧版本
sudo yum remove docker docker-common docker-selinux docker-engine
# 安装 yum-util 工具包和 devicemapper 驱动依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 设置 yum 源(加速 yum 下载速度)
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 或者
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 用yum 下载vim
yum -y install vim
JDK
# 查看jdk版本
java -version
# 下载jdk1.8
下载路径:
https://www.oracle.com/technetwork/java/javase/
downloads/jdk8-downloads-2133151.html
下载名称:
jdk-8u401-linux-x64.tar.gz
# 在/opt/路径下创建software,用来存放外部应用
mkdir /opt/software
# 将jdk的压缩文件放到software里面,并解压
tar -zxvf jdk-8u401-linux-x64.tar.gz
# 将解压出来的jdk文件夹改一下名字,后面配置环境变量更方便,
mv jdk1.8.0_401/ /opt/software/jdk180
# 然后进去目录,记住当前路径
cd /opt/software/jdk180
pwd # /opt/software/jdk180
# 配置环境变量(jdk环境变量的配置路径在/etc/profile)
vim /etc/profile
# 指令如下
i # 插入
# 在最末尾加入下面的配置
export JAVA_HOME=/opt/software/jdk180
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib
Esc # 准备退出
:wq! # 保存写入并退出
# 激活配置
source /etc/profile
# 检查是否配置成功
java -version
# 显示如下:
java version "1.8.0_401"
Java(TM) SE Runtime Environment (build 1.8.0_401-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.401-b10, mixed mode)
安装Mysql-5.7.22
0、下载前准备前工作,检测是否安装了mysql
# 查看
yum list installed | grep mysql
1、下载安装包
wget https://doris-build-hk.oss-cn-hongkong.aliyuncs.com/mysql-client/mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz
2、解压
tar -zxvf mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz
3、删除不必要的压缩包
rm mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz
4、移动文件,将解压的mysql文件夹移动到 /usr/local
目录下,并重命名为mysql
mv mysql-5.7.22-linux-glibc2.12-x86_64/ /usr/local/mysql
5、进入 /usr/local/mysql
目录,创建数据存放目录data
ls
cd /usr/local/mysql
mkdir data
6、查看是否存在用户和组,创建用户和组
# 检查是否存在mysql组
grep mysql /etc/group
# 检查是否存在mysql用户
grep mysql/etc/passwd
# 创建组
groupadd mysql
# 创建用户
useradd -g mysql mysql
7、改变mysql目录权限
chown -R mysql.mysql /usr/local/mysql/
8、数据库初始化。得到临时密码,请记住获取到的这个密码,后面登录要用到
。
./bin/mysqld --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --initialize
如图所示,密码在最后面,是字母、数字加字符的形式:e)5+a,_7kCS<
9、修改my.cnf。
vim /etc/my.cnf
添加内容如下,可以直接复制:
[mysqld]
basedir =/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/mysql.sock
character-set-server=utf8
port = 3306
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[client]
socket = /usr/local/mysql/mysql.sock
default-character-set=utf8
# Disabling symbolic-links is recommended to prevent assorted security risks
# symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
# [mysqld_safe]
# log-error=/var/log/mariadb/mariadb.log
# pid-file=/var/run/mariadb/mariadb.pid
#
# include all files from the config directory
#
# !includedir /etc/my.cnf.d
# 保存文件并退出
:wq!
10、创建mysql服务
(1)将mysql.server
启动文件复制到/etc/init.d
目录,
cp -a /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
(2)赋予权限
chmod +x /etc/rc.d/init.d/mysqld
(3)创建mysql服务
chkconfig --add mysqld
(4)检查mysql服务是否生效
chkconfig --list mysqld
11、配置全局环境变量
# 编辑
vim /etc/profile
添加:
export PATH=$PATH:/usr/local/mysql/bin:/usr/local/mysql/lib
export PATH
退出并保存,然后执行下列命令,使之生效
source /etc/profile
12、启动mysql服务
service mysql start # Redirecting to /bin/systemctl start mysql.service
# 查看mysql服务是否启动
service mysql status
13、登录mysql修改密码,密码是刚刚获取的临时密码
mysql -uroot -p
Enter password:输入密码在这里插入图片描述
mysql修改临时密码,设置成你方便记忆的密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'abc12345';
14、进行基本的数据查询操作
show databases;
use mysql;
select host , user from user;
15、设置mysql远程登录
(1)切换数据库,使用mysql用户
use mysql;
(2)修改mysql库中的host
值。
update user set host='%' where user='root' limit 1;
(3)刷新mysql权限
flush privileges;
连接成功!!!
Doris
1、首先检查jdk,如果没有配好jdk,先按照上面的步骤配置好jdk
java -version
2、永久关闭 SELinux 和 swap和防火墙,避免交换内存到虚拟内存时对性能造成影响
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# 永久关闭SELinux
sed -ri 's/.*swap.*/#&/' /etc/fstab
# 永久关闭swap
systemctl stop firewalld
# 关闭防火墙
systemctl disable firewalld
# 禁止防火墙
3、设置系统最大打开文件句柄数
sudo vim /etc/security/limits.conf
复制粘贴下面内容:
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
4、看一下你的电脑是否支持avx2,然后去doris官网下载doris压缩包
cat /proc/cpuinfo
5、 网址:https://doris.apache.org/zh-CN/download/
**
支持avx2下载:apache-doris-2.1.0-bin-x64.tar.gz ( ASC, SHA-512 )
6、 上传到虚拟机上,可以用xftp,我放在/opt/software。
cd /opt/software
# 里面放着我的jdk和doris
7、 解压
tar -zxvf apache-doris-2.1.0-bin-x64.tar.gz
8、 进去里面
cd apache-doris-2.1.0-bin-x64/fe
ls
9、 在conf目录里面配置fe.conf
vim conf/fe.conf
10、 在里面配置地址,ip是虚拟机地址
priority_networks = 192.168.121.160/24
11、退出后,以保护进程的方式启动
./bin/start_be.sh --daemon
12、使用 jps
或者 ps -ef | grep fe
查看进程是否启动成功
13、启动稍等一会儿,然后打开网址测试一下
tail -f /opt/software/apache-doris-2.1.0-bin-x64/fe/log/fe.log
# 查看日志
http:192.168.121.161:8030/login
登录用root账户,没有密码
14、时间同步
yum -y install chrony
15、在所有服务器上启动时间同步
systemctl start chronyd.service
systemctl enabel chronyd.service
reboot
16、重要端口号记录
17、看看自己是否安装了mysql。没有的话可以按照上面的mysql教程安装mysql。
补充:在配置mysql前,启动fe,启动fe,启动fe
./bin/start_fe.sh --daemon
# 查看端口号是否已启动
Jps
# 打开页面看看是否能打开登陆界面了。
18、进入be目录,创建两个文件夹storage1
和storage2
两个文件夹。配置文件中配置存储目录。
# 进入be目录
cd /opt/software/apache-doris-2.1.0-bin-x64/be
# 创建文件夹``storage1``和``storage2``
mkdir -p storage1 storage2
# 配置文件进行配置
vim /conf/be.conf
内容如下:
storage_root_path = /opt/software/apache-doris-2.1.0-bin-x64/be/storage1;/opt/software/apache-doris-2.1.0-bin-x64/be/storage2
19、以上方fe节点端口号为9030登录mysql服务。并修改登录密码。
# -h 后面为当前服务器名称。-P为大写的P。
mysql -uroot -h hadoop1 -P 9030
set password for 'root' = password('abc12345');
# 退出
exit
# 重新登录
mysql -uroot -h hadoop1 -P 9030 -p
Enter password:输入密码
20、用本地客户端连接服务器,重新设置一下端口号为9030.
21、将be节点添加到fe。
alter system add backend "hadoop1:9050";
alter system add backend "hadoop2:9050";
alter system add backend "hadoop3:9050";
22、配置be的ip地址。给另外两台服务器创建stroage1
和stroage2
,与hadoop1
是一模一样的配置方式。配置另外两台服务器的ip地址和存储目录。
vim conf/be.conf
添加内容:
priority_networks = 192.168.121.160/24
storage_root_path = /opt/software/apache-doris-2.1.0-bin-x64/be/storage1,2;/opt/software/apache-doris-2.1.0-bin-x64/be/storage2
23、启动三台服务器的be。
./bin/start_be.sh --daemon
报错:Please set vm.max_map_count to be 2000000 under root using 'sysctl -w vm.max_map_count=2000000'.
解决方法:
执行:sysctl -w vm.max_map_count=2000000
再次执行
24、回到hadoop1服务器的mysql界面,查询fe和be的启动情况。
show proc '/frontends';
show proc '/backends';
alive为false,表名三个节点都没有存活,现在只能看日志了。
报错:若程序需要使用 THP,则建议将 THP 的开关设置为 madvise,在程序中通过 madvise 系统调用来分配 THP, 否则设置成 never 禁用掉是最佳选择
解决:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
Docker
# 安装docker
# 查看所有可以安装的docker版本
yum list docker-ce --showduplicates | sort -r
# 安装最新版
sudo yum install docker-ce -y
# 安装指定版本
sudo yum install xxxxxxxxxx -y
sudo yum install docker-ce-20.10.11.ce -y
# 查看是否安装成功
docker -version #有显示版本等信息就是成功了
# 启动并加入开机启动
sudo systemctl start docker #启动 docker
sudo systemctl enable docker #加入开机自启动
# docker指令
systemctl status docker # 显示docker镜像状态
systemctl start docker # 启动docker
systemctl restart docker # 重启docker
systemctl stop docker # 停止docker
docker images # 查看docker里面的镜像文件
docker ps -a # 查看所有容器
docker ps -a | grep xxx # 搜索带xxx的容器名称
docker ps -s # 查看运行中的容器
docker exec -it 容器id bash # 进入容器实例
docker stop ID #停止容器
rm docker ID/名称 # 删除容器
rm docker -f ID/名称
docker rmi ID # 删除镜像
docker rm $(docker ps -a -q) # 删除所有容器
docker rmi $(docker images -q) # 删除所有镜像
Docker镜像基本操作指令
docker build # 构建镜像
docker push # 推送镜像到服务
docker pull # 从服务拉取镜像
docker images # 查看镜像
docker rmi # 删除镜像
docker save # 将镜像打包成一个压缩包
docker load # 将压缩包解压为镜像
# 卸载docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
docker-ce
# 关不掉镜像时的解决办法
systemctl stop docker.socket
# 设置daemon.json镜像源
{
"registry-mirrors": [
"https://dockerhub.azk8s.cn",
"https://reg-mirror.qiniu.com"
]
}
# 重新加载daemon.json,并重启docker
sudo systemctl daemon-reload
sudo systemctl restart docker
# 容器相关指令
# 创建容器
docker run
# 暂停容器
docker pause
# 恢复运行
docker unpause
# 停止容器
docker stop
# 运行容器
docker start
# 查看所有容器及其状态
docker ps
# 查看容器运行日志
docker logs
# 进入容器执行命令
docker exec
# 删除指定容器
docker rm
# 案例.run :运行 --name:容器名 -p:端口映射 -d:基于什么镜像创建的容器
docker run --name nginxTest some-nginx -p 8080:80 -d nginx
docker run --name redisTest -p 8080:8080 -d redis redis-server --appendonly yes
# 操作数据卷
#创建一个volume
docker volume create volumeName
#显示一个或多个volume的信息
docker inspect volumeName
#列出所有的volume
docker volume ls
#删除未使用的volume
docker volume prune
#删除一个或多个指定的volume
docker volume rm volumeName
# 基于数据卷
docker run --name nginxTest -p 8080:8080 -v html:/usr/share/nginx/hrml -d nginx
# 基于目录 --name:名字 -p :端口号 -e:环境变量
# -v:挂载的目录,conf配置目录,data数据目录 -d:后台运行
# mysql:tag:容器名称+版本
docker run \
--name mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /tmp/mysql/conf/hmy.conf:/etc/mysql/conf.d/hmy.conf
-v /tmp/mysql/data:/var/lib/mysql
-d \
mysql:5.7.25
# 安装DockerCompose
# 安装
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 修改权限
chmod +x /usr/local/bin/docker-compose
# 补全命令
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
# Docker镜像仓库
# 修改/etc/docker/daemon.json
#在里面添加如下内容:
"insecure-registries":["http://192.168.201.136(自己的虚拟机ip地址):8080"]
#重加载
systemctl daemon-reload
#重启docker
systemctl restart docker
# 在tmp目录下创建registry-ui
mkdir /tmp/registry-ui
# 创建文件docker-compose.yml
touch /tmp/registry-ui/docker-compose.yml
# 在文件中输入下面内容
version: '3.0'
services:
registry:
image: registry
volumes:
- ./registry-data:/var/lib/registry
ui:
image: joxit/docker-registry-ui:static
ports:
- 8080:80
environment:
- REGISTRY_TITLE=冬日的暖阳
- REGISTRY_URL=http://registry:5000
depends_on:
- registry
# 启动
docker-compose up -d
# 打开网址
http://虚拟机地址:8080
# 推送、拉取镜像
#将 nginx:latest 重新命名为 192.168.201.136 nginx:1.0
docker tag nginx:latest 192.168.201.136:8080/nginx:1.0
#将192.168.201.136:8080/nginx:1.0 推送到镜像仓库中,仓库位置是192.168.201.136:8080
docker push 192.168.201.136:8080/nginx:1.0
#拉取镜像
docker pull 192.168.201.136:8080/nginx:1.0
Linux常用指令
# 切换管理员root,需要输入密码
su
# 切换非管理员用户
su xxxx
# 在opt路径下创建文件夹software
mkdir /opt/software/
# 显示当前所在路径
pwd
# 查找文件
find / -name *xxxx*
# 移动文件
mv /opt/1.jsp /opt/software/ # 移动opt路径下的1.jsp到software里面
# 创建文件
touch /xx/xx/daemon.json # 在xx/xx/路径下创建daemon.json
# 拷贝文件
cp /opt/1.jsp /opt/software/ # 复制opt路径下的文件,放到software里面
# 修改文件名,这个也是移动文件的方法。原文件名:jdk.1.8.441
mv /opt/jdk.1.8.441 /opt/software/jdk180
# 文件移动了,且名字也改了,当然也可以这样只改名,不移动文件
mv /opt/jdk.1.8.441 /opt/jdk180
# 查看进程
ps -ef | grep 端口|名称
# 杀死进程
kill -9 PID
# 删除文件夹
rm -rf /path/path1/path2
# 解压tar.gz
tar -zxvf xxxxxxxxxxxxxxxxx.tar.gz
# 查看防火墙状态
systemctl status firewalld
# 关闭防火墙
systemctl stop firewalld
# 永久关闭防火墙
systemctl disable firewalld
# 永久关闭selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0 # 临时
# 永久关闭swap
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
swapoff -a # 临时
# 修改主机名
hostnamectl set-hostname your-new-hostname # your-new-hostname为你自己改的新名字。
# 查看虚拟机整体磁盘使用量
df
-a :列出所有的文件系统,包括系统特有的 /proc 等文件系统;
-k :以 KBytes 的容量显示各文件系统;
-m :以 MBytes 的容量显示各文件系统;
-h :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;
-H :以 M=1000K 取代 M=1024K 的进位方式;
-T :显示文件系统类型, 连同该 partition 的 filesystem 名称 (例如 ext3) 也列出;
-i :不用硬盘容量,而以 inode 的数量来显示
Linux白名单配置
# 原配置
# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# 添加白名单后
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
#定义白名单变量名
-N whitelist
#设置白名单ip段
-A whitelist -s xxx.xx.xx.xx -j ACCEPT
-A whitelist -s xxx.xx.xx.xx -j ACCEPT
# 这些 ACCEPT 端口号,公网内网都可访问
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允许接受本机请求之后的返回数据 RELATED,是为FTP设置的
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 13020 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 1000:8000 -j ACCEPT #开放1000到8000之间的所有端口
#下面是 whitelist 端口号,仅限 服务器之间 通过内网 访问
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j whitelist
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j whitelist
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j whitelist
-A INPUT -m state --state NEW -m tcp -p tcp --dport 25 -j whitelist
#为白名单ip开放的端口,结束
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT
Linux服务器在主机重启后,ip重新分配的问题
1、VMware-编辑-虚拟网络编辑器
2、配置 Vmnet8
3、控制面板-网络和Internet-网络和共享中心-更改适配器设置
4、配置IP地址和默认网关,ip地址为刚刚上面记住的ip地址,末位改为1,网关改为2
5、打开虚拟机,执行命令并修改配置
vim /etc/sysconfig/network-scripts/ifcfg-ens33
# 重启网络配置
systemctl restart network
ifconfig
Redis
Redis配置
下载地址:
https://redis.io/download/
1、将下载好的redis拖进 /opt/software目录下
2、使用命令解压
tar -zxvf redis-xxxx.tar.gz
3、进入目录,执行make命令
cd /opt/software/redis.xxxxx
make && make install
4、创建一个新文件夹
mkdir /myredis
5、将配置文件拷贝一份到新文件夹中
cp redis.conf /myredis
6、修改文件名
mv redis.conf redis7.conf
7、配置redis7.conf
默认daemonize no 改为 daemonize yes
默认protected-mode yes 改为 protected-mode no
默认bind 127.0.0.1 改为 直接注释掉(默认bind 127.0.0.1只能本机访问)或改成本机IP地址,否则影响远程IP连接
添加redis密码 改为 requirepass 你自己设置的密码
8、动redis服务,并指定访问的配置文件
redis-server /myredis/redis7.conf
9、启动客户端
redis-cli -a 密码 (-p 6379)
# 或者
redis-cli
auth 密码
10、ping一下是否可以连通redis服务
ping # 会回应 pang
11、退出客户端
quit
12、重新进入客户端,执行第一个命令
set k1 helloworld
get k1
13、关闭redis服务器
# 在客户端里面关闭
shutdown
# 在客户端外面关闭
redis-cli -a abc12345 shutdown
13、卸载redis
# 查看/usr/local/bin目录下和redis相关的文件
ls -l /usr/local/bin/redis-*
# 删除/usr/local/bin目录下和redis相关的文件
rm -rf /usr/local/bin/redis-*
# 14、Redis启动服务报错:bash: redis-server: 未找到命令。
# 产生这个的原因是因为我们输入的命令,系统都会去 `/usr/bin` 目录下寻找。
# 如果这个目录找不到命令,就会提示未找到命令
# 解决思路:将 `redis-server` 命令设置为全局命令,找到我们安装redis-server命令,将它定义为全局命令
ln -s /usr/local/redis/redis-6.2.6/src/redis-server /usr/bin/redis-server
# 15、redis中如果出现中文乱码,可以退出redis,使用下列命令。
redis-cli -a 密码 --raw
redis免配置,在线练习工具
https://try.redis.io/
key相关指令
# 查看当前库所有的key
keys *
# 判断某个key是否存在
exists key
exists key1 key2 key3
# 查看你的key是什么类型
type key
# 删除指定的Key
del key
# unlink key,非阻塞删除,仅仅将keys从keyspace元数据中删除,真正的删除会在后续异步中操作。
unlink key
# ttl key ,查看还有多久过期,-1表示永不过期,-2表示已经过期
ttl key1
# expire key seconds (秒) , 设置过期时间
expire key3 10
# move key db (0~15),一个redis服务默认有16个数据库,默认在下标0号的数据库
move key2 4
# select db (0~15),切换数据库
select 4
# 查看当前数据库的key的数量
dbsize
# flushdb , 清空当前库的key
flushdb
# flushall, 清空所有库的key
flushall
# type key
# 检查key的类型
type key1
#################################
# key区分大小写
# 帮助命令: help @ xx 例如: help @string
String相关指令
# set key value
set k1 v1
set k1 v2 # 覆盖旧的key-value
# setnx key value | set key vlaue nx
setnx k1 v1
setnx k1 v2 # 失败,不会覆盖旧的key-value
# gaterange key start end
# 获取key下标从start到end的字符
set k2 "this is my aiweidong"
gaterange k2 0 3 # "this"
# mset 可以同时设置多个key-value
mset k3 v3 k4 v4
get k3 # v3
get k4 # v4
# setex key value ex seconds | set key value ex second
# 为指定的key设置值及其过期时间。如果Key已经存在,setex命令将会替换旧的值
setex key seconds value
setex k5 10 v5
# get
get k1 # v1
# decr, 对指定的key值,让value减1,如果value不为数字,报错。如果不存在key值,则key的值会被初始化为0
set k5 10
decr k5 # 9
get k5 # 9
desr k6 10
get k6 # -10
# decrby key num , 对指定的key,让value减去指定的数字。如果value不为数字,报错。如果不存在key值,则key的值会被初始化为0
get k5 # 9
decrby k5 4
get k5 # 5
# strlen key , 返回指定key所储存的字符串值的长度。当key不是字符串时,返回错误。
get k2 # "this is my aiweidong"
strlen k2 # 20
# msetnx k1 v1 k2 v2 . 用于给所有key都不存在时,设置一个或多个值。如果有一个key已经存在,就会全部失败。
get k7 # -20
MSETNX k7 v7 k8 v8 k9 v9 # 失败
MSETNX k8 v8 k9 v9
get k8 # v8
get k9 # v9
# incrby key num。给指定key加指定的数字。如果vlaue不为数字,报错。如果key不存在,则key的value会被初始化为0。
set k1 50
get k1 # 50
incrby k1 20
get k1 # 70
# incrbyfloat。增加浮点增量值。
incrby k1 2.5
get k1 # 72.5
# setrange key index str。用str替换index下标后的字符。
set k2 "Hello World"
get k2 # Hello World
setrange k2 6 "Redis"
get k2 # Hello Reids
# psetex key millseconds value。给Key设置存活时间,单位是毫秒
psetex key3 1000 value3 # 给k3设置存活时间为1000毫秒
# append key value。给指定的key追加值,如果key不存在,则改为赋值;如果存在,则在结尾合并。
exists k4 # null
append k4 "huawei"
get k4 # huawei
append k4 "phone"
get k4 # huaweiphone
# getset key value。给key赋值,并返回原先的旧值。
getset key5 value5 # 返回 null
getset key5 5 # 返回value5
# mget key1 key2 key3 ... 。 获取多个key的值
mget k1 k2 k3 k4
/*
1) "72.5"
2) "Hello Reids"
3) (nil)
4) "huawei yylx"
*/
# incr key 。将key中存储的数字值加1。如果key不存在,key的value会初始化为0,再执行incr。不为数字报错
set key5 3
incar key5 # 4
List类型常用命令
# Lpush list v1 v2 v3 | 将一个或多个值插入到列表头部
LPUSH list1 value1 value2 value3
# Lindex list index | 通过索引获取列表中的元素。-1表示最后一个,
# -2表示倒数第二个,以此类推。索引下表超过范围,返回null。
LINDEX list1 -1 # value1
LINDEX list1 -2 # value2
LINDEX list1 0 # value3
LINDEX list1 1 # value2
# Lrange list 0 -1 | 获取列表指定范围内的元素。0 -1 是全部元素
LRANGE list1 0 -1
1) "value3"
2) "value2"
3) "value1"
# Rpush list value1 value2 value3 ... | 将一个或多个值插入到列表的尾部
RPUSH list1 value4 value5
1) "value3"
2) "value2"
3) "value1"
4) "value4"
5) "value5"
# Rpoplpush list1 list2 | 移除列表最后一个元素,将该元素添加到另一个列表并返回
Rpoplpush list1 list2 # value5
Rpoplpush list1 list2 # value4
Lrange list1
1) "value4"
2) "value5"
# BLpop list seconds | 移出并获取列表中的第一个元素,
# 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
BLpop list2 10
1) "list2"
2) "value4"
Lrange list2 0 -1
1) "value5"
BLpop list2 10
1) "list2"
2) "value5"
Lrange list2 0 -1 # (empty array)
BLpop list2 10 #等待10秒后返回
(nil)
(10.02s)
# BRpop list2 10 | 移出并获取列表的最后一个元素,
# 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
Lpush list2 value1 value2
1) "value2"
2) "value1"
BRpop list2
1) "list2"
2) "value1"
BRpop list2
1) "list2"
2) "value2"
BRpop list2
(nil)
(10.08s)
# Brpoplpush list2 list3 timeout | 从列表中弹出一个值,
# 将弹出的元素插入到另一个列表中并返回;如果列表没有值,
# 将阻塞列表直到等待超时或发现可弹出元素为止
Brpoplpush list2 list3 20
# 超时等待20秒
(nil)
(20.06s)
Lrange k2 0 -1
1) "value5"
2) "value4"
3) "value3"
4) "value2"
Brpoplpush k2 list2 20 # 弹出"value2"
Lrange list2 0 -1
1) "value2"
Lrange k2 0 -1
1) "value5"
2) "value4"
3) "value3"
# Lrem key count value | 移除列表元素。返回值是移除的数量。
# count > 0 :从表头开始向表尾搜索,移除列表中与value相等的元素,数量为count。
# count < 0 :从表尾开始向表头搜索,移除列表中与value相等的元素,数量为count的绝对值。
# count = 0 :移除表中所有与value相等的值。
Rpush list3 1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 1
Lrem list3 1 1
Lrange list3 0 -1
1) "2"
2) "3"
3) "4"
4) "5"
5) "6"
6) "7"
7) "8"
8) "9"
9) "8"
10) "7"
11) "6"
12) "5"
13) "4"
14) "3"
15) "2"
16) "1"
Lrem list3 -1 4
Lrange list3 0 -1
1) "2"
2) "3"
3) "4"
4) "5"
5) "6"
6) "7"
7) "8"
8) "9"
9) "8"
10) "7"
11) "6"
12) "5"
13) "3"
14) "2"
15) "1"
Lrem list3 0 2
Lrange list3 0 -1
1) "3"
2) "4"
3) "5"
4) "6"
5) "7"
6) "8"
7) "9"
8) "8"
9) "7"
10) "6"
11) "5"
12) "3"
13) "1"
# Llen key | 返回列表长度
Llen list3 # (integer) 13
# Ltrim list start end | 剪除下标 start 至 end 之外的所有元素,值保留区间内的元素
Rpush list4 "hello" "hello" "foo" "bar"
Ltrim list4 1 -1
Lrange list4 0 -1
1) "hello"
2) "foo"
3) "bar"
# Lpop list (count) | 移除并获取列表中的第一个元素
Lrange list4 0 -1
1) "hello"
2) "foo"
3) "bar"
Lpop list4 # "hello"
Lpop list4 2
1) "foo"
2) "bar"
# LpushX list value1 value2 ... | 将一个或多个元素插入已有的列表最左边,如果列表不存在,操作无效。
LpushX list4 3 3 2 1 # 失败
Rpush list4 3
Lpush list4 3 2 1 # 成功
Lrange list4 0 -1
1) "1"
2) "2"
3) "3"
4) "3"
# RpushX list value1 value2 ... | 将一个或多个元素插入到列表最右边,如果列表不存在,操作无效。
RpushX list7 3 3 2 1 # 失败
RpushX list7 3
RpushX list7 3 2 1 # 成功
Lrange list7 0 -1
1) "3"
2) "3"
3) "2"
4) "1"
# Linsert list before/after listValue insertValue | 在 listValue 前插入元素 insertValue。不存在列表或指定元素不操作,
Rpush list5 "foo" "bar"
Linsert list5 before "bar" "yes"
Lrange list5 0 -1
1) "foo"
2) "yes"
3) "bar"
# Lset list index value | 通过索引设置列表元素的值
Rpush list6 "hello" "hello" "foo" "hello" "bar"
Lset list6 0 "bar"
Lrange list6 0 -1
1) "bar"
2) "hello"
3) "foo"
4) "hello"
哈希(Hash)类型常用命令
# Hmset key field1 value1 field2 value2 ... |
# 可以将多个key-value对设置到哈希表key中,会覆盖原有的值。
Hmset hash1 field1 "foo" field2 "bar"
# Hmget key field | 获取所有给定字段的值
Hmget hash1 field1 field2
1) "foo"
2) "bar"
# Hset key field value | 为hash表key中的字段field的值设为value。
#(Hmset官方已弃用,推荐使用Hset)
Hset hash1 field1 "football" field2 "barbar"
Hmget hash1 field1 field2
1) "football"
2) "barbar"
Hset hash1 field3 "school"
Hmget hash1 field3 # 1) "school"
# Hgetall key | 用于获取哈希表中指定key的所有字段和值
Hgetall key hash1
1) "field1"
2) "football"
3) "field2"
4) "barbar"
5) "field3"
6) "school"
# Hget key field | 获取存储在哈希表中指定字段的值
Hget hash3 field3 # "school"
# Hexists key field | 查看哈希表key中,指定的字段是否存在。存在返回1,不存在返回0
Hexists hash1 field3 # 1
Hexists hash1 field4 # 0
# Hincrby key field num | 为哈希表key中指定字段的整数值加上增量increment。字段和增量都必须为整数。
Hset hash2 field1 20
Hincrby hash2 field1 5 # 25
# Hlen key | 获取哈希表中字段的数量
Hlen hash1 # 3
Hlen hash2 # 2
# Hdel key field1 field2 ... | 删除一个或多个哈希表字段
Hdel hash2 field1 field2
Hlen hash2 # 0
# Hvals key | 获取哈希表中所有的值
Hvals hash1
1) "football"
2) "barbar"
3) "school"
# Hincrbyfloat key field | 为哈希表key中指定字段的浮点数值加上增量increment。
Hset hash3 field1 2.5
Hincrbyfloat hash3 field1 2.5 # 5
Hset hash3 field2 5
Hincrbyfloat hash3 field2 5 # 10
Hincrbyfloat hash3 field2 2.5 # 12.5
Hincrbyfloat hash3 field2 5 # 17.5
# Hkeys key | 获取哈希表中所有的字段
Hkeys hash3
1) "field1"
2) "filed2"
3) "field2"
# Hsetnx key field value | 为哈希表中不存在的字段赋值,如果字段已存在,操作无效。
Hsetnx hash3 field2 "hello" # 操作无效
Hget hash3 field2 # 17.5
Hsetnx hash3 field3 "hello"
Hget hash3 field3 # "hello"
Set类型常用命令
# Sadd key value1 value2... | 向集合中添加一个或多个元素。
Sadd set1 "hello" "foo"\
Sadd set1 "hello"
# Scard key | 返回集合的成员数
Scard set1 # 2
# Smembers key | 返回集合中的所有成员
Smembers set1
1) "hello"
2) "foo"
# Srandmember key [count] | 返回集合中一个或多个随机元素,默认一个,count可决定返回数.
Srandmember set1 # 随机返回一个元素
Srandmember set1 2 # 随机返回两个
# Sinter key1 key2 ... | 返回给定所有集合的交集
Sadd set1 "bar"
Sadd set2 "hello" "world"
Sinter set1 set2 # "hello"
# Srem key1 member1 member2... | 移除集合中一个或多个成员
Sadd set3 "hello" "world" "bar" "hello" "foo"
Srem set3 "bar"
1) "hello"
2) "world"
3) "foo"
Srem set3 "hello" "world"
1) "foo"
# Smove source destination value | 将元素value从source集合移动到destination集合
Smembers set1
1) "hello"
2) "foo"
3) "bar"
Smembers set3
1) "foo"
Smove set1 set3 "bar"
Smembers set1
1) "hello"
2) "foo"
Smembers set3
1) "foo"
2) "bar"
# Sdiff key1 key2 key3... | 返回第一个集合和其他集合之间的差异元素,也可以说是第一个集合独有的元素
Sdiff set1 set3
1) "hello"
# Sinterstore destination key1 key2 ... | 将所有集合的交集给到 destination集合
Sinterstore set4 set1 set3
Smembers set4
1) "foo"
# Sismember key member | 判断member是否是key中的成员
Sismember set4 "foo" # 1
Sismember set4 "bar" # 0
# Smismember key member1 member2... | 检查多个元素是不是某个特定集合的成员
Smismember set1 "hello" "foo" "bar"
1) (integer) 1
2) (integer) 1
3) (integer) 0
Smismember set2 "hello" "world"
1) (integer) 1
2) (integer) 1
Smismember set3 "foo"
1) (integer) 1
# Spop key num | 从集合中删除一个或多个随即元素,默认一个。
Sadd set5 "one" "two" "three" "four"
Spop set5 # "four"
Spop set5 2
1) "one"
2) "two"
Smembers set5
1) "three"
# Sscan key cursor [match patterm] [Count count] |
# cursor - 游标。
# pattern - 匹配的模式。
# count - 指定从数据集里返回多少元素,默认值为 10 。
# scan是以游标为基础,每次使用scan(包括sscan),以游标0开始,然后命令会返回一个新的游标;
# 如果新的游标不是0,表示遍历还没有结束,要使用新的游标作为参数,继续输入获得后面的结果。
Sadd set6 "11" "21" "31" "41" "51" "61" "71" "81" "91"
Sscan set6 0 match "1*"
1) "0"
2) 1) "11"
# Sunion key1 key2 ... || 用于返回所有给定集合的并集
Sunion set1 set3
1) "hello"
2) "foo"
3) "bar"
# Sunionstore key key1 key2... || 将给定集合的并集给到key。
Sunionstore set7 set1 set3
Smembers set7
1) "hello"
2) "foo"
3) "bar"
有序集合Sorted set常用命令
# 1、Zadd key1 score1 value1 score2 value2 ...
# 向有序集合添加一个或多个成员,或者更新已存在成员的分数score。重点是有序的。
# 只添加一个成员
Zadd set1 9 "hello"
# 可以添加多个成员,并且更新其中的某一个成员的分数
Zadd set1 8 "redis" 7 "hello"
# 继续添加多个成员
Zadd set1 6 "footbool" 5 "pingpang"
# 遍历有序集合的所有成员和它们的分数
Zrange set1 0 -1 wihtscores
1) "pingpang"
2) "5"
3) "footbool"
4) "6"
5) "hello"
6) "7"
7) "redis"
8) "8"
# 2、Zrange key start stop [withscores]
# 可以查询带有分数值的有序集合的元素,下标可以为负数。
# 正数
Zrange set1 0 4 withscores
1) "pingpang"
2) "5"
3) "footbool"
4) "6"
5) "hello"
6) "7"
7) "redis"
8) "8"
Zrange set1 0 3 withscores
1) "pingpang"
2) "5"
3) "footbool"
4) "6"
5) "hello"
6) "7"
7) "redis"
8) "8"
# 负数
Zrange set1 -4 -1 withscores
1) "pingpang"
2) "5"
3) "footbool"
4) "6"
5) "hello"
6) "7"
7) "redis"
8) "8"
# 有正有负
Zrange set1 0 -1 withscores
1) "pingpang"
2) "5"
3) "footbool"
4) "6"
5) "hello"
6) "7"
7) "redis"
8) "8"
# 3、Zcount key start stop
# 返回有序集合指定分数区间的的成员数量
Zcount set1 5 9 # 4
Zcount set1 6 7 # 2
# 4、Zrevrange key start stop [withscores]
# 返回有序集合中指定区间内的成员,通过索引,分数从高到低
Zrevrange set1 0 -1 withscores
1) "redis"
2) "8"
3) "hello"
4) "7"
5) "footbool"
6) "6"
7) "pingpang"
8) "5"
# 5、Zrevrangebyscore key max min [wihtscores] [LIMIT offset count]
# 返回有序集合中指定分数区间内的成员,分数从高到低排序
Zadd set2 10086 "yidong" 10000 "dianxin" 10010 "liantong"
Zrevrangebyscore set2 +inf -inf withscores # 由高到低排序
1) "yidong"
2) "10086"
3) "liantong"
4) "10010"
5) "dianxin"
6) "10000"
Zrevrangebyscore set2 18888 10001 withscores # 降序排列分数介于18888到10001之间的成员
1) "yidong"
2) "10086"
3) "liantong"
4) "10010"
# 6、Zremrangebyscore key min max
# 移除有序集合给定的分数区间的所有成员
Zrange set1 0 -1 wihtscores
1) "pingpang"
2) "5"
3) "footbool"
4) "6"
5) "hello"
6) "7"
7) "redis"
8) "8"
Zremrangebyscore set1 0 -1
Zrange set1 0 -1 # empty array
# 7、Zscore key member
# 返回有序集合中,成员的分数值
Zscore set2 yidong # 10086
Zscore set2 dianxin # 10000
Zscore set2 liantong # 10010
# 8、Zrangebylex key min max [LIMIT offset count]
# 通过字典区间返回有序集合的成员
Zadd set1 0 a 0 b 0 c 0 d 0 e 0 f 0 g
Zrange set1 0 -1 withscores
1) "a"
2) "0"
3) "b"
4) "0"
5) "c"
6) "0"
7) "d"
8) "0"
9) "e"
10) "0"
11) "f"
12) "0"
13) "g"
14) "0"
Zrangebylex set1 - [c
1) "a"
2) "b"
3) "c"
Zrangebylex set1 - (c
1) "a"
2) "b"
Zrangebylex set1 [aaa (g
1) "b"
2) "c"
3) "d"
4) "e"
5) "f"
# 9、Zrangebyscore key min max [LIMIT offset count]
# 通过分数返回有序集合指定区间内的成员
Zadd salary 2500 jack 5000 tom 12000 peter
Zrangebyscore salary -inf +inf # 显示整个有序集合
1) "jack"
2) "tom"
3) "peter"
Zrangebyscore salary -inf +inf withscores # 显示有序集合及其分数
1) "jack"
2) "2500"
3) "tom"
4) "5000"
5) "peter"
6) "12000"
Zrangebyscore salary -inf 5000 withscores # 显示工资 <= 5000 的所有成员
1) "jack"
2) "2500"
3) "tom"
4) "5000"
Zrangebyscore salary (5000 14000 withscores # 显示工资 > 5000,<= 14000 的所有成员
1) "peter"
2) "12000"
# 10、Zincrby key increment member
# 有序集合中对指定成员的分数加上增量 increment
Zadd set3 1 "hello" 1 "foo"
Zincrby set3 1 "hello" # 2
Zrange set3 0 -1 withscores
1) "foo"
2) "1"
3) "hello"
4) "2"
# 11、Zrank key member
# 返回有序集合指定成员的索引
Zrank set3 "foo" # 0
Zrank set3 "hello" # 1
# 12、Zinterstore newkey num key1 key2 ...
# 计算给定的一个或多个有序集合的交集并将结果存储在新的集合中,分数默认为交集成员的分数和。
Zadd set4 70 "Li Lei" 70 "Han Meimei" 99.5 "Tom"
Zadd set5 88 "Li Lei" 75 "Han Meimei" 99.5 "Tom"
# 交集
Zinterstore set6 2 set4 set5
Zrange set6 0 -1 withscores
1) "Han Meimei"
2) "145"
3) "Li Lei"
4) "158"
5) "Tom"
6) "199"
# 13、Zrem key member1 member2 ...
# 移除有序集合中一个或多个成员
Zrem set6 "Han Meimei" "Li Lei"
Zrange set6 0 -1 withscores
1) "Tom"
2) "199"
# 14、Zcard key
# 获得有序集合中的一个或多个成员
Zcard set1 # 7
Zcard set2 # 3
Zcard set3 # 2
Zcard set4 # 3
Zcard set5 # 3
Zcard set6 # 1
# 15、Zremrangebyrank key start stop
# 移除有序集合中给定的排名区间的所有成员
Zrange salary 0 -1 withscores
1) "jack"
2) "2500"
3) "tom"
4) "5000"
5) "peter"
6) "12000"
Zremrangebyrank salary 0 1
Zrange salary 0 -1 withscores
1) "peter"
2) "12000"
# 16、Zunionstore destination numkeys key1 key2 ... [WEIGHTS weight1 weight2 ...]
# 计算给定的一个或多个有序集的并集,并存储在新的key中。默认情况下,结果集中某个成员的score值是所有给定集中该成员score值之和。
# WEIGTS为乘法因子,不加默认为1,加了默认和key一一对应,每个给定有序集的所有成员的score值在传递给聚合函数之前都要先乘以该因子。
Zadd set7 1 "one" 2 "two"
Zadd set8 1 "one" 2 "two" 3 "three"
Zunionstore out78 2 set7 set8 weights 2 3
Zrange out78 0 -1 withscores
1) "one"
2) "5"
3) "three"
4) "9"
5) "two"
6) "10"
# 17、Zlexcount key min max
# 在有序集合中计算指定字典区间内的成员数
Zlexcount out78 - + # 3
Zlexcount out78 [one [two # 3
# 18、Zrevrank key member
# 返回有序集合中指定成员的排名,有序集合按分数值递减。排名从0开始。
Zrevrank out78 one # 2
Zrevrank out78 two # 0