Redis知识
1.数据库分类
- 关系型: mysql、oracle、sqlserver、db2、postgresql
- 非关系型:redis、mongo、ES
2.Redis重要性
(1)速度快
c语言写的
代码优雅
单线程架构
(2)支持多种数据结构
字符串,哈希,列表,集合,有序集合
(3)丰富的功能
天然计数器
健过期功能
消息队列
(4)支持客户端语言多
php,java,python
(5)数据持久化
所有的数据都运行在内存中
支持2种格式持久化数据AOF RDB AOF&RDB
(6)自带多种高可用架构
主从
哨兵
集群
3.Redis应用场景
(1)缓存-键过期时间
把session会话存在redis,过期删除
缓存用户信息,缓存Mysql部分数据,用户先访问redis,redis没有再访问mysql,然后回写给redis
商城优惠卷过期时间
(2)排行榜-列表&有序集合
热度/点击数排行榜
直播间礼物积分排行
(3)计数器-天然支持计数器
帖子浏览数
视频播放数
评论数
点赞/踩
(4)社交网络-集合
粉丝
共同好友
兴趣爱好
标签
(5)消息队列-发布订阅
配合ELK缓存收集来的日志
环境
主机IP | 主机名 |
---|---|
192.168.1.20 | redis-主 |
192.168.1.19 | redis-从 |
Redis安装
1.创建安装和数据目录
[root@redis-1 ~]# mkdir -p /data/soft
[root@redis-1 ~]# mkdir -p /opt/redis_cluster/redis_6379/{conf,logs,pid}
2.下载redis安装包
[root@redis-1 ~]# cd /data/soft/
[root@redis-1 soft]# wget http://download.redis.io/releases/redis-5.0.7.tar.gz
--2020-07-27 14:02:06-- http://download.redis.io/releases/redis-5.0.7.tar.gz
正在解析主机 download.redis.io (download.redis.io)... 45.60.125.1
正在连接 download.redis.io (download.redis.io)|45.60.125.1|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:1984203 (1.9M) [application/octet-stream]
正在保存至: “redis-5.0.7.tar.gz”
100%[==================>] 1,984,203 22.5KB/s 用时 95s
2020-07-27 14:03:41 (20.4 KB/s) - 已保存 “redis-5.0.7.tar.gz” [1984203/1984203])
3.解压redis到数据目录
[root@redis-1 soft]# tar xf redis-5.0.7.tar.gz -C /opt/redis_cluster/
[root@redis-1 soft]# ln -s /opt/redis_cluster/redis-5.0.7/ /opt/redis_cluster/redis //创建软连接
4.编译安装redis
[root@redis-1 soft]# cd /opt/redis_cluster/redis
[root@redis-1 redis]# make && make install
cd src && make all
make[1]: 进入目录“/opt/redis_cluster/redis-5.0.7/src”
CC Makefile.dep
make[1]: 离开目录“/opt/redis_cluster/redis-5.0.7/src”
make[1]: 进入目录“/opt/redis_cluster/redis-5.0.7/src”
.......
5.编写配置文件
[root@redis-1 redis]# vim /opt/redis_cluster/redis_6379/conf/6379.conf
bind 127.0.0.1 192.168.1.20
#填写本机的IP
port 6379
daemonize yes
pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid
logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log
databases 16
dbfilename redis.rdb
dir /opt/redis_cluster/redis_6379
[root@redis-1 redis]# redis-server /opt/redis_cluster/redis_6379/conf/6379.conf // 启动服务
[root@redis-1 redis]# netstat -anpt | grep redis //查看端口
tcp 0 0 192.168.1.20:6379 0.0.0.0:* LISTEN 60980/redis-server
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 60980/redis-server
Redis基本命令
进入redis命令行
[root@redis-1 ~]# redis-cli
127.0.0.1:6379>
1.全局命令
命令 | 解释 |
---|---|
MSET k1 1 k2 2 k3 3 | 批量创建键值 |
KEYS * | 列出所有键值名,但在企业环境禁止使用 |
DBSIZE | 查看有多少键值数 |
EXISTS | 查看键值是否存在 |
EXPIRE k2 20 | 设置K2过期时间为20秒,20秒后k2自动取消 |
PERSIST k2 | 取消k2的过期时间 |
TTL k2 | 查看k2的生命周期 |
TYPE | 查看数据类型 |
127.0.0.1:6379> MSET k1 1 k2 2 k3 3 k4 4
OK
127.0.0.1:6379> KEYS *
1) "k4"
2) "k2"
3) "k3"
4) "k1"
127.0.0.1:6379> EXISTS k1
(integer) 1
127.0.0.1:6379> EXISTS k2
(integer) 1
127.0.0.1:6379> EXPIRE k2 20
(integer) 1
127.0.0.1:6379> PERSIST k2
(integer) 1
127.0.0.1:6379> TTL k2
(integer) -1
127.0.0.1:6379> TYPE k2
string
2.字符串类型(string)
命令 | 解释 |
---|---|
SET k3 3 | 创建键值 |
GET k3 | 查看键值 |
DEL k2 | 删除键值 |
INCR k3 | 键值k3为整数,递增加1 |
INCRBY k3 10 | 递增k3的量值10 |
MSET k4 v4 k5 v5 k6 v6 k7 v7 | 批量创建键值 |
MGET k4 k5 k6 k7 | 批量查看键值 |
127.0.0.1:6379> SET k3 3
OK
127.0.0.1:6379> GET k3
"3"
127.0.0.1:6379> DEL k3
(integer) 1
127.0.0.1:6379> INCR k3
(integer) 1
127.0.0.1:6379> INCRBY k3 10
(integer) 11
127.0.0.1:6379> MSET k1 2 k3 4 k5 6
OK
127.0.0.1:6379> MGET k1 k3 k5
1) "2"
2) "4"
3) "6"
3.列表(list)
命令 | 解释 |
---|---|
RPUSH list1 1 2 3 4 | 创建列表list1,值为1 2 3 4 |
RPUSH list1 5 6 7 8 | 在list1右侧添加5 6 7 8 |
LPUSH list1 0 | 在list1左侧添加0 |
LRANGE list1 0 -1 | 查看list1所有值 |
RPOP list1 | 删除右侧最后一个值 |
LPOP list1 | 删除左侧第一个值 |
LTRIM list1 0 2 | 仅保留前3位,其他值删除 |
127.0.0.1:6379> RPUSH list1 1 2 3 4
(integer) 4
127.0.0.1:6379> RPUSH list1 5 6 7 8
(integer) 8
127.0.0.1:6379> LPUSH list1 0
(integer) 9
127.0.0.1:6379> LRANGE list1 0 -1
1) "0"
2) "1"
3) "2"
4) "3"
5) "4"
6) "5"
7) "6"
8) "7"
9) "8"
127.0.0.1:6379> RPOP list1
"8"
127.0.0.1:6379> LPOP list1
"0"
127.0.0.1:6379> LTRIM list1 0 2
OK
127.0.0.1:6379> LRANGE list1 0 -1
1) "1"
2) "2"
3) "3"
4.哈希(hash)
命令 | 解释 |
---|---|
HMSET user:1000 username zhangsan age 17 job it | 创建hash键值user:1000 |
HGET user:1000 username | 查看键值中username参数 |
HGET user:1000 age | 查看键值中age参数 |
HGET user:1000 job | 查看键值中job参数 |
HMSET user:1000 tel 123456789 | 添加值tel |
127.0.0.1:6379> HMSET user:1000 username zhangsan age 17 job it
OK
127.0.0.1:6379> HGET user:1000 username
"zhangsan"
127.0.0.1:6379> HGET user:1000 age
"17"
127.0.0.1:6379> HGET user:1000 job
"it"
127.0.0.1:6379> hmset user:1000 tel 123456789
OK
127.0.0.1:6379> HGET user:1000 tel
"123456789"
5.集合(set)
命令 | 解释 |
---|---|
SADD set1 1 2 3 | 创建集合set1 |
SMEMBERS set1 | 查看集合set1 |
SADD set1 1 4 | 为集合set1添加值1 4 ,但集合特性是去除重复,所以1无法再添加 |
SREM set1 1 4 | 删除集合的值1 4 |
sadd set2 1 4 5 | 创建第二个集合set2 |
SDIFF set1 set2 | 求差集 |
SINTER set1 set2 | 求合集(交集) |
SUNION set1 set2 | 求并集 |
127.0.0.1:6379> SMEMBERS set1
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> SADD set 1 4
(integer) 2
127.0.0.1:6379> SREM set1 1 4
(integer) 1
127.0.0.1:6379> SADD set2 1 4 5
(integer) 2
127.0.0.1:6379> sdiff set1 set2
1) "2"
2) "3"
127.0.0.1:6379> sdiff set2 set1
1) "1"
2) "4"
3) "5"
127.0.0.1:6379> sinter set1 set2
(empty list or set)
127.0.0.1:6379> sunion set1 set2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
Redis持久化
- RDB:生成时间点快照,保存于硬盘
- 优点:速度快,适合做备份,能做主从复制,单开子进程进行rdb操作不影响主业务
- 缺点:会有部分数据丢失
- AOF:记录所有写操作命令,通过再次执行这些命令还原数据
- 优点:最大程度保证数据不丢失
- 缺点:日志记录量太大
1.RDB配置
[root@redis-1 ~]# redis-cli
127.0.0.1:6379> bgsave //RDB保存
Background saving started
127.0.0.1:6379> exit
[root@redis-1 ~]# vim /opt/redis_cluster/redis_6379/conf/6379.conf
最后添加:
save 900 1
#在900秒(15分钟)之后,如果至少有1个key发生变化,则dump内存快照。
save 330 10
#在300秒(5分钟)之后,如果至少有10个key发生变化,则dump内存快照。
save 60 10000
#在60秒(1分钟)之后,如果至少有10000个key发生变化,则dump内存快照
2.AOF配置
[root@redis-1 ~]# vim /opt/redis_cluster/redis_6379/conf/6379.conf
最后添加:
appendonly yes
#启用AOF持久化
appendfilename "redis.aof"
#指定AOF文件名
appendfsync everysec
#每秒同步一次
3.重启redis服务
[root@redis-1 ~]# redis-cli shutdown //关闭redis
[root@redis-1 ~]# redis-server /opt/redis_cluster/redis_6379/conf/6379.conf //开启redis
模拟实战:redis主从复制
redis主从复制的特点:
为解决单点故障把数据复制到一个或多个副本服务器(从服务器),实现故障恢复和负载均衡。
1.安装两台redis服务器
(1)第一台已安装好,把第一台的redis安装目录数据scp到第二台上。
[root@redis-1 ~]# scp -rp /opt/redis_cluster/ root@192.168.1.103:/opt
(2)在第二台服务器上,编译安装redis
[root@redis-2 ~]# cd /opt/redis_cluster/redis
[root@redis-2 redis]# make && make install
cd src && make all
make[1]: 进入目录“/opt/redis_cluster/redis/src”
Hint: It's a good idea to run 'make test' ;)
make[1]: 离开目录“/opt/redis_cluster/redis/src”
cd src && make install
make[1]: 进入目录“/opt/redis_cluster/redis/src”
Hint: It's a good idea to run 'make test' ;)
INSTALL install
INSTALL install
INSTALL install
INSTALL install
INSTALL install
make[1]: 离开目录“/opt/redis_cluster/redis/src”
(3)更改配置文件,启动服务
[root@redis-2 redis]# vim /opt/redis_cluster/redis_6379/conf/6379.conf
bind 127.0.0.1 192.168.1.19
#添写本机IP(从服务器)
slaveof 192.168.1.20 6379
#添加主服务器IP和端口
......
[root@redis-2 redis]# redis-server /opt/redis_cluster/redis_6379/conf/6379.conf
[root@redis-2 redis]# netstat -anpt | grep redis
tcp 0 0 192.168.1.19:6379 0.0.0.0:* LISTEN 76323/redis-server
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 76323/redis-server
tcp 0 0 192.168.1.19:59726 192.168.1.20:6379 ESTABLISHED 76323/redis-server
2.测试主从复制
(1)主服务器上新建键值,测试从服务器自动同步
主服务器:
[root@redis-1 ~]# redis-cli
127.0.0.1:6379> SET k8 8
OK
127.0.0.1:6379> GET k8
"8"
从服务器:
[root@redis-2 ~]# redis-cli
127.0.0.1:6379> GET k8
"8"
(2)从服务器在同步过程中,只能复制主数据库的数据,不能手动添加修改数据;如果从服务器非要修改数据,需要断开同步。
[root@redis-2 ~]# redis-cli //登录
127.0.0.1:6379> GET k8 //查看同步的键值
"8"
127.0.0.1:6379> set k7 1 //创建 失败
(error) READONLY You can't write against a read only replica.
127.0.0.1:6379> exit //退出
[root@redis-2 ~]# redis-cli slaveof no one //断开同步
OK
[root@redis-2 ~]# redis-cli //登录redis
127.0.0.1:6379> SET k7 1 //创建键值 k7
OK
127.0.0.1:6379> GET k7 //查看键值k7
"1"
127.0.0.1:6379> exit //退出
[root@redis-2 ~]# redis-cli slaveof 192.168.1.20 6379 //重新连接主服务器
OK
[root@redis-2 ~]# redis-cli //登录redis
127.0.0.1:6379> GET k7 //查看键值 k7 查看不到
(nil)