18 redis
使用版本:6.2.7
1 redis安装实验:
1)安装gcc语言解析器
[root@localhost ~]# yum -y install gcc
2)上传软件解压,进入
[root@localhost ~]# ls
anaconda-ks.cfg ifcfg-ens33 redis-6.2.7.tar.gz
[root@localhost ~]# tar -xf redis-6.2.7.tar.gz
[root@localhost ~]# cd redis-6.2.7/
3)编译、安装
[root@localhost redis-6.2.7]# make
[root@localhost redis-6.2.7]# make PREFIX=/usr/local/redis/ install
4)配置
[root@localhost redis]# mkdir data logs conf #创建redis软件运行时需要的目录
[root@localhost redis]# cp -a /root/redis-6.2.7/redis.conf /usr/local/redis/conf/ #生成主配置文件
[root@localhost redis]# ln -s /usr/local/redis/bin/* /usr/local/bin/ #命令创建软链接,方便管理
[root@localhost redis]# vim /usr/local/redis/conf/redis.conf #修改主配置文件
bind 0.0.0.0 #允许登录的地址(所有)
daemonize yes #允许后台运行
pidfile "/usr/local/redis/logs/redis.pid" #软件运行时的pid文件存放位置
logfile "/usr/local/redis/log/redis.log" #日志存放位置
dbfilename "redis.rdb" #数据库文件名
dir "/usr/local/redis/data/" #数据存放目录
appendonly yes #声明启用 .aof 文件
appendfilename "redis.aof"
注意: 区别
*.rdb: 触发式保存 (不可读)
*.aof:每秒都保存 (可读)
5)启动、登录
[root@localhost ~]# redis-server /usr/local/redis/conf/redis.conf #启动
[root@localhost ~]# redis-cli #登录
127.0.0.1:6379> set name yq #创建键值对
OK
127.0.0.1:6379> get name #查看
"yq"
127.0.0.1:6379> save #强制将内存中数据保存到磁盘
OK
2 redis 数据持久化文件:
(日志文件,data目录下): *.rdb 、 *.aof
3 客户端连接:
客户端也需要安装redis、但是不需要配置目录、配置文件
命令:redis-cli
选项: -h IP #指定ip连接
-p 6379 #指定端口连接
-a 密码 #指定密码连接
-n 库名 #指定库名连接
--raw #支持存储中文
#202客户端:解压,进入,编译,安装
[root@localhost ~]# tar -xf redis-6.2.7.tar.gz
[root@localhost ~]# cd redis-6.2.7/
[root@localhost redis-6.2.7]# make && make PREFIX=/usr/local/redis/ install
[root@localhost ~]# ln -s /usr/local/redis/bin/* /usr/local/bin/ #创建软链接,方便调用命令
[root@localhost ~]# redis-cli -h 192.168.18.201 -p 6379 #进入201的redis
192.168.18.201:6379> keys *
(empty array)
#201服务端终止redis服务
[root@localhost ~]# redis-cli shutdown #或者 pkill redis
4 redis常用命令(5个数据类型)
| 动作\类型 | string | hash | list | set | zset |
|---|---|---|---|---|---|
| 创建 | set 创一个 mset 批量创 setnx 判断式创建 setex 期限式创建 | hset | lpush 下到上 rpush 上到下 | sadd | zadd |
| 删除 | del | hdel | lpop 上到下 rpop 下到上 | srem 指定删 spop 随即删 | zrem |
| 查看 | get 查一个 mget 批量查 | hget 查一个 hmget 查多个 hgetall 查所有 | lrange | smembers | zrange |
| 其他 | incrby 增减 | scard 查个数 sinter 交 sunion 并 sdiff 差(补) | zcard |
1)string类型
最简单的类型,一个key对应一个value,二进制型,可以包含任何数据
[root@localhost ~]# redis-cli
-----------------------------------------------------------------------------------------------------
#(1)set 创建键值对: name(key)、 yq(value)
127.0.0.1:6379> set name yq
OK
------------------------------------------------------------------------------------------------------
#(2)setnx 创建键值对,若已存在的key则不创建(返回0),若不存在则创建(返回1)
# setex 创建有有效期的键值对 (keys:xbz)(有效期:5)(value:laowang)
127.0.0.1:6379> setnx user yq1
(integer) 1
127.0.0.1:6379> setnx name yq1
(integer) 0
ttl key值 #查看键值对有效期
返回结果:
> = 0 #代表剩余有效期
-2 #代表键值对已经失效,已被删除
-1 #代表键值对永不自动失效
------------------------------------------------------------------------------------------------------
127.0.0.1:6379> setex xbz 5 laowang
OK
127.0.0.1:6379> ttl xbz #ttl key值 (查看键值对有效期)
(integer) 2
127.0.0.1:6379> ttl xbz
(integer) 0
127.0.0.1:6379> ttl xbz
(integer) -2
------------------------------------------------------------------------------------------------------
#(3)get 获取key的string值,若没有值,则返回nil
127.0.0.1:6379> get name
"yq"
127.0.0.1:6379> get user
"yq1"
127.0.0.1:6379> get xbz
(nil)
------------------------------------------------------------------------------------------------------
#(4)mset 批量创建键值对
# mget 批量查看键值对
127.0.0.1:6379> mset a1 zhangsan a2 lisi a3 laowang
OK
127.0.0.1:6379> mget a1 a2 a3
1) "zhangsan"
2) "lisi"
3) "laowang"
------------------------------------------------------------------------------------------------------
#(5)incrby 给键值对设置增、减,并返回结果(仅数字型键值对可以)
127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> get age
"18"
127.0.0.1:6379> incrby age 1 #给age设置增1
(integer) 19
127.0.0.1:6379> incrby age -1 #给age设置减1
(integer) 18
------------------------------------------------------------------------------------------------------
#(6)del 删除已经创建的key
127.0.0.1:6379> keys *
1) "name"
2) "a3"
3) "a1"
4) "user"
5) "age"
6) "a2"
127.0.0.1:6379> del a1 a2 a3 #删除a1、a2、a3 key
(integer) 3
127.0.0.1:6379> keys *
1) "name"
2) "user"
3) "age"
2)hash类型
string类型的字段与值的映射表

------------------------------------------------------------------------------------------------------
#(1)type 查看key的键值对类型
hset 创建hash类型的键值对
127.0.0.1:6379> hset lw name laowang age 38 #创建hash类型的键值对
(integer) 2
127.0.0.1:6379> type lw
hash
127.0.0.1:6379> type name
string
------------------------------------------------------------------------------------------------------
#(2)hget 指定字段查看
hmget 指定多字段查看
hgetall 查看所有
127.0.0.1:6379> hget lw name
"laowang"
127.0.0.1:6379> hmget lw name age
1) "laowang"
2) "38"
------------------------------------------------------------------------------------------------------
127.0.0.1:6379> hset 张三的信息 姓名 张三 年龄 18 性别 男 身高 178 体重 120
5
127.0.0.1:6379> hgetall 张三的信息
姓名
张三
年龄
18
性别
男
身高
178
体重
120
------------------------------------------------------------------------------------------------------
#(3)hdel 删除表中某个字段
127.0.0.1:6379> hdel lw age #删除一个字段
(integer) 1
127.0.0.1:6379> hget lw age
(nil)
127.0.0.1:6379> hset lw age 38
(integer) 1
127.0.0.1:6379> hdel lw name age #删除多个字段
(integer) 2
3)list类型
链表结构,主要功能是push、pop、获取一个范围内的所有值等等
push:写入
pop:取出
与hash类型的对应:
hash: key 字段
list: 链表 元素

------------------------------------------------------------------------------------------------------
#(1)lpush (从下向上)创建、添加
rpush (从上向下)创建、添加
lrange 查看,0 -1 从头到尾查看(-1 0 不识别)
127.0.0.1:6379> lpush zhangsan zhangsan 18 china beijing #lpush创建zhangsan链表的元素(从下向上)
(integer) 4
127.0.0.1:6379> lrange zhangsan 0 -1
1) "beijing"
2) "china"
3) "18"
4) "zhangsan"
127.0.0.1:6379> lpush zhangsan zhangsan xxhf 2206 #lpush添加zhangsan链表的元素
(integer) 7
127.0.0.1:6379> lrange zhangsan 0 -1
1) "2206"
2) "xxhf"
3) "zhangsan"
4) "beijing"
5) "china"
6) "18"
7) "zhangsan"
127.0.0.1:6379> rpush lisi slisi 20 china beijing #rpush创建lisi链表的元素(从上向下)
(integer) 4
127.0.0.1:6379> lrange lisi 0 -1
1) "slisi"
2) "20"
3) "china"
4) "beijing"
127.0.0.1:6379> rpush lisi xxhf 2206 #rpush添加lisi链表的元素
(integer) 6
127.0.0.1:6379> lrange lisi 0 -1
1) "slisi"
2) "20"
3) "china"
4) "beijing"
5) "xxhf"
6) "2206"
------------------------------------------------------------------------------------------------------
#(3)lpop (从上向下)删除
rpop (从上向下)删除
127.0.0.1:6379> lrange lisi 0 -1 127.0.0.1:6379> lrange zhangsan 0 -1
1) "slisi" 1) "2206"
2) "20" 2) "xxhf"
3) "china" 3) "zhangsan"
4) "beijing" 4) "beijing"
5) "xxhf" 5) "china"
6) "2206" 6) "18"
7) "zhangsan"
127.0.0.1:6379> lpop zhangsan #从上往下删zhangsan链表的元素
"2206"
127.0.0.1:6379> lpop zhangsan
"xxhf"
127.0.0.1:6379> lpop zhangsan
"zhangsan"
127.0.0.1:6379> rpop zhangsan #从下往上删zhangsan链表的元素
"zhangsan"
127.0.0.1:6379> rpop lisi #从下往上删lisi链表的元素
"2206"
127.0.0.1:6379> rpop lisi
"xxhf"
4)set类型:无序集合
交、并、差可实现好友推荐
合集:取所有,重复的多次列出
并集:取所有,重复的仅列出一次

------------------------------------------------------------------------------------------------------
#(1)sadd 添加一个或多个元素到集合中
127.0.0.1:6379> sadd num1 1 2 3 4
(integer) 4
127.0.0.1:6379> sadd num1 5 6
(integer)
#(2)smembers 查看集合中所有元素
127.0.0.1:6379> smembers num1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
------------------------------------------------------------------------------------------------------
#(3)srem 从集合中删除指定一个或多个元素
127.0.0.1:6379> srem num1 1 #删一个
(integer) 1
127.0.0.1:6379> smembers num1
1) "2"
2) "3"
3) "4"
4) "5"
5) "6"
127.0.0.1:6379> srem num1 3 4 #删多个
(integer) 2
127.0.0.1:6379> smembers num1
1) "2"
2) "5"
3) "6"
------------------------------------------------------------------------------------------------------
#(4)spop 随机删除集合中的一个元素
127.0.0.1:6379> sadd num2 1 2 3 4 5 6
(integer) 6
127.0.0.1:6379> smembers num2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
127.0.0.1:6379> spop num2
"2"
127.0.0.1:6379> spop num2
"6"
127.0.0.1:6379> spop num2
"5"
------------------------------------------------------------------------------------------------------
#(5)scard 统计集合中的数量
127.0.0.1:6379> scard num1
(integer) 2
127.0.0.1:6379> scard num2
(integer) 2
------------------------------------------------------------------------------------------------------
#(6)sdiff num1 num2 两集合的差,以num1为主
sinter num1 num2 两集合的交
sunion num1 num2 两集合的并
127.0.0.1:6379> sadd num1 1 3 4 5
(integer) 4
127.0.0.1:6379> sadd num2 2 3 4 6
(integer) 4
127.0.0.1:6379> smembers num1
1) "1"
2) "3"
3) "4"
4) "5"
127.0.0.1:6379> smembers num2
1) "2"
2) "3"
3) "4"
4) "6"
127.0.0.1:6379> sdiff num1 num2 #以num1为全集,求num2的补集
1) "1"
2) "5"
127.0.0.1:6379> sinter num1 num2 #求num1 num2的交集
1) "3"
2) "4"
127.0.0.1:6379> sunion num1 num2 #求num1 num2的并集
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
------------------------------------------------------------------------------------------------------
#(7)sdiffstore 集合的差,并保存返回结果
sinterstore 集合的交,并保存返回结果
sunionstore 集合的并,并保存返回结果
127.0.0.1:6379> sdiffstore chaji num1 num2 #集合的差,并保存返回结果为chaji
(integer) 2
127.0.0.1:6379> sinterstore jiaoji num1 num2 #集合的交,并保存返回结果jiaoji
(integer) 2
127.0.0.1:6379> sunionstore bingji num1 num2 #集合的并,并保存返回结果bingji
(integer) 6
127.0.0.1:6379> smembers chaji
1) "1"
2) "5"
127.0.0.1:6379> smembers jiaoji
1) "3"
2) "4"
127.0.0.1:6379> smembers bingji
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
5)zset类型
zset是set的一个升级版本,它在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。可以理解为有两列的mysql表,一列存的value,一列存的顺序。操作中key理解为zset的名字。

------------------------------------------------------------------------------------------------------
#zadd 创建、追加
#zrange 查看
#zrem 删除指定值
#zcard 统计个数
127.0.0.1:6379> zadd userlist 0 cuihuichao 0 renzepeng 1 jiaoming 1 zhanglimin 2 hubo 2 liuchuan 2 wangyang #创建
(integer) 7
127.0.0.1:6379> zadd userlist 0 zhangsan #追加
127.0.0.1:6379> zrange userlist 0 -1 #不带分数查看
1) "cuihuichao"
2) "renzepeng"
3) "zhangsan"
4) "jiaoming"
5) "zhanglimin"
6) "hubo"
7) "liuchuan"
8) "wangyang"
127.0.0.1:6379> zrange userlist 0 -1 withscores #带分数查看
1) "cuihuichao"
2) "0"
3) "renzepeng"
4) "0"
5) "zhangsan"
6) "0"
7) "jiaoming"
8) "1"
9) "zhanglimin"
10) "1"
11) "hubo"
12) "2"
13) "liuchuan"
14) "2"
15) "wangyang"
16) "2"
6)其他命令
| keys | exists | del | expire |
| ttl | select | move | type |
| dbsize | save | info | config get |
| flushdb | flushall |
1.keys #查看键值对,支持通配符
127.0.0.1:6379> keys *
1) "userlist"
2) "zhangsan"
3) "userlost"
127.0.0.1:6379> keys user*
1) "userlist"
2) "userlost"
2.exists #确认键是否存在(类似setnx) 存在返回1,不存在返回0
127.0.0.1:6379> keys *
1) "userlist"
2) "zhangsan"
3) "userlost"
127.0.0.1:6379> exists zhangsan
(integer) 1
127.0.0.1:6379> exists lisi
(integer) 0
3.del #删除
127.0.0.1:6379> del zhangsan
(integer) 1
127.0.0.1:6379> del userlist userlost
(integer) 2
4.expire #设置键的过期时间(已存在的)
5.ttl #以秒为单位,查看键的剩余有效期
127.0.0.1:6379> keys *
1) "age"
127.0.0.1:6379> expire age 10
(integer) 1
127.0.0.1:6379> ttl age
(integer) -2
127.0.0.1:6379> keys *
(empty array)
6.select #选择一个库(select 0 表示选择第一个库)
127.0.0.1:6379> keys *
1) "zhangsan"
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> keys *
1) "lisi"
7.move #移动键值对到库
127.0.0.1:6379[1]> move lisi 15
(integer) 1
127.0.0.1:6379[1]> keys *
(empty array)
127.0.0.1:6379[1]> select 15
OK
127.0.0.1:6379[15]> keys *
1) "lisi"
8.type #查看键值对类型
127.0.0.1:6379> keys *
1) "xiaoming"
2) "lisi"
3) "laowang"
4) "zhangsan"
5) "xiaoli"
6) "laosong"
127.0.0.1:6379> type zhangsan
string
127.0.0.1:6379> type lisi
hash
127.0.0.1:6379> type laowang
list
127.0.0.1:6379> type laosong
list
127.0.0.1:6379> type xiaoming
set
127.0.0.1:6379> type xiaoli
zset
9.dbsize #查看当前库中的键数量
127.0.0.1:6379> dbsize
(integer) 6
10.save #保存所有数据到磁盘
11.info #获取服务器信息
127.0.0.1:6379> info #查看所有信息
127.0.0.1:6379> info server #查看服务端信息
127.0.0.1:6379> info clients #查看客户端信息
127.0.0.1:6379> info cpu #查看cpu信息
[root@localhost ~]# redis-cli info #查看所有信息
[root@localhost ~]# redis-cli info server #查看服务端信息
[root@localhost ~]# redis-cli info clients #查看客户端信息
[root@localhost ~]# redis-cli info cpu #查看cpu信息
12.config get #查看配置文件参数
127.0.0.1:6379> config get bind
1) "bind"
2) "0.0.0.0"
[root@localhost ~]# redis-cli config get bind
1) "bind"
2) "0.0.0.0"
13.flushdb #删除当前库的所有数据
127.0.0.1:6379> keys *
1) "xiaoming"
2) "lisi"
3) "laowang"
4) "zhangsan"
5) "xiaoli"
6) "laosong"
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> keys *
(empty array)
14.flushall #删除所有库中数据
127.0.0.1:6379> flushall
OK
**注意防止误删除:**需要有记录非删除日志的机制存在
5 redis 高效应用
实验:redis不同版本的升级点
环境部署:
7-1:安装7.0.4
7-2:安装6.2.7
7-3:安装4.0.9
步骤:三台机器分别编译、安装不同版本redis
创建需要的目录 data、logs、conf
分别生成配置文件:(复制到 /usr/local/redis/conf 目录下)
修改配置文件:bind、 daemonize、 pidfile、 logfile、 dbfilename、dir、 appendonly
监听的本机网卡、启用后台运行、pid文件、日志文件、 rdb文件、 数据存放目录、 aof文件
测试:对比不同版本配置文件的变化
1)3到4的变化(replication模块)
由以前的replicaof——》slaveof
2)6到7的变化(appendonly模块)
新增变化:将aof文件分成几个文件,在dir定义的目录下新建一个目录保存aof的多个文件
**注意:**可以去官网上查看版本变化日志,安装教程
1)密码防护
1、修改配置文件(requirepass)
2、重启redis
3、客户端登录验证
#服务端202设置密码
[root@localhost redis]# vim /usr/local/redis/conf/redis.conf
requirepass 123456
[root@localhost redis]# redis-cli shutdown
[root@localhost redis]# redis-server /usr/local/redis/conf/redis.conf
#客户端201验证
[root@localhost ~]# redis-cli -h 192.168.18.202 -a 123456 -p 6379
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.18.202:6379> keys *
(empty array)
2)主从同步
因为新版本兼容旧版本:采用6版本做主,7版本做从
步骤:
1、主不变
2、从修改配置文件
replicaof 主IP 端口
masterauth 密码
3、从 重启redis、检查replication信息
[root@localhost ~]# vim /usr/local/redis/conf/redis.conf
replicaof 192.168.18.202 6379
masterauth 123456
[root@localhost ~]# redis-cli shutdown #关闭
[root@localhost ~]# redis-server /usr/local/redis/conf/redis.conf #启动
[root@localhost ~]# redis-cli info replication #从检查replication信息为slave、指向主为202、端口6379
# Replication
role:slave
master_host:192.168.18.202
master_port:6379
。。。。
#主服务器检查replication信息
[root@localhost redis]# redis-cli -a 123456 info replication #如果设置了密码,需要加上密码选项才能查看
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# Replication
role:master
connected_slaves:1 #一个从已经连接
slave0:ip=192.168.18.201,port=6379,state=online,offset=140,lag=0 #从的IP、端口、等
master_failover_state:no-failover
master_replid:dea03446ca3435a0faf11ab6de18a313407000b3
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:140
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:140
3)数据持久化
1、snapshotting(快照)--默认设置,会生成 *.rdb文件
900s 有一个变化则save
300s 有10个变化则save
60s 有一万个变化则save
注意:一定要修改 dir 选项,指定 *.rdb、 *.aof 文件的保存位置,一般在 /usr/local/redis/data/ 目录下
2、appendonly file(aof)
默认每秒都保存
appendonly yes #默认不使用AOF持久化(450行)将no改成yes。
# appendfsync always #默认有写操作,就马上写入磁盘。效率最慢,但是最安全
appendfsync everysec #默认,每秒钟写入磁盘一次。
# appendfsync no