1.关系型与非关系型
关系型:mysql oracle
非关系型:redis mongo ES
2.Redis重要特性
1.速度快:c语言编写的、代码优雅、单线程架构
2.支持多种数据语言结构:字符串、哈希、列表、集合、有序集合、地理位置
3.丰富功能:天然计数器、键过期功能、消息队列
4.支持客户端语言多:php、java、pythom
5.数据持久化:所有的数据都运行在内存中、支持2种格式的持久化数据A0F、RDB、混合模式:AOF&RDB
6.自带多种高可用架构:主从、哨兵、集群
3.Redis应用场景
1.缓存-键过期时间:
把session会话存在redis,过期删除
缓存用户信息,缓存Mysql部分数据,用户先访问redis,redis没有再访问mysql,然后回写给redis
商城优惠卷过期时间2.排行榜-列表&有序集合:
热度/点击数排行榜
直播间礼物积分排行3.计数器-天然支持计数器:
帖子浏览数
视频播放数
评论数
点赞/踩4.社交网络-集合:
粉丝
共同好友
兴趣爱好
标签5.消息队列-发布订阅:
配合ELK缓存收集来的日志
4.Redis安装部署
官方:https://redis.io/
国内网站:http://www.redis.cn/(速度快)版本选择:
2.x : 很老,淘汰
3.x : redis-cluster(出现集群功能)
4.x : 混合持久化
5.x : 新增加了流处理类型,最新稳定版
#规划目录
/data/soft 下载目录
/opt/redis_6379/{conf,logs,pid} 安装目录,日志目录,pid目录,配置目录 # redis默认端口为6379
/data/redis_6379/ 数据目录
--------------------------------------------------------------------------------------------
mkdir /data/soft -p
mkdir /opt/redis_6379/{conf,logs,pid} -p
mkdir /data/redis_6379 -p
cd /data/soft/
wget http://download.redis.io/releases/redis-5.0.8.tar.gz
tar xf redis-5.0.8.tar.gz -C /opt/
cd /opt/
ln -s redis-5.0.8/ /opt/redis
cd redis
make
echo $?
make install
#安装完成后尝试redis+tab键是否命令可以自动补全
#配置文件
cat >/opt/redis_6379/conf/redis_6379.conf<< EOF
daemonize yes
bind 127.0.0.1 10.0.0.51
port 6379
pidfile /opt/redis_6379/pid/redis_6379.pid
logfile /opt/redis_6379/logs/redis_6379.log
EOF
#daemonize yes 后台启动默认为no
#启动命令
redis-server /opt/redis_6379/conf/redis_6379.conf
#检查
ps -ef|grep redis
netstat -lntup|grep 6379
#连接redis终端
[root@db01 ~]# redis-cli
127.0.0.1:6379>
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379>
#关闭命令
- kill
- pkill
- redis-cli
>SHUTDOWN
- redis-cli shutdown
5.Redis全局命令
全局命令是指对所有数据类型都通用的命令
redis数据格式:
key:value
键:值
- 写入数据(单、多)
#单条数据写入
127.0.0.1:6379> set k1 v1
OK
k1:键
v1:值
#多条数据写入(一对式。一个key跟一个值)
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"
- 查看key的值(单、多)
127.0.0.1:6379> get k1
"v1"
#只需输入key名称得值
#多条key名称同时查值
127.0.0.1:6379> mget k1 k2 k3
1) "v1"
2) "v2"
3) "v3"
- 查看所有的key(危险命令!禁止企业中使用)
127.0.0.1:6379> keys *
1) "k1"
#企业中数据大时,容易卡死服务器
- 查看总共有多少个key(键)
127.0.0.1:6379> dbsize
(integer) 4
#当前总共有4个数量key
- 查看某个Key是否存在
127.0.0.1:6379> exists k1
(integer) 1
127.0.0.1:6379> exists k2
(integer) 1
127.0.0.1:6379> exists k5
(integer) 0
127.0.0.1:6379> exists k1 k2 k5
(integer) 2
#状态码:
0 表示这个key不存在
1 表示这个key存在
N 表示存在N个key(可多key查询)
- .删除key
127.0.0.1:6379> del k4
(integer) 1
127.0.0.1:6379> del k5
(integer) 0
#状态码:
0 表示这个key不存在
1 表示这个key存在,并且删除成功了
N 表示N个key存在,并且删除成功了N个key(可多key 删除)
- 设置键过期
#设置过期时间(秒为单位)
EXPIRE k1 10
#状态码:
0 这个key不存在
1 这个key存在,并且设置过期时间成功
- 查询和取消键过期
查看keys是否过期
TTL k1
状态码:
-1 这个key存在,并且没有设定存活周期,永不过期
-2 这个key不存在
N 这个key存在,并且在N秒后过期
取消过期时间:
第一种方法:
PERSIST k1
第二种方法:(重新写入原数据方式,取消key过期)
set k1 v1
结论:
过期后的key会被直接删除
6.天然计数器
#每次加1
127.0.0.1:6379> set k1 1
OK
127.0.0.1:6379> TYPE k1
string
127.0.0.1:6379> incr k1
(integer) 2
127.0.0.1:6379> incr k1
(integer) 3
127.0.0.1:6379> incr k1
(integer) 4
127.0.0.1:6379> get k1
"4"
#加N(输入想要的数字)
127.0.0.1:6379> INCRBY k1 100
(integer) 104
127.0.0.1:6379> get k1
"104"
----------------------------------------------------------------
#减1:
127.0.0.1:6379> get k1
"104"
127.0.0.1:6379> INCRBY k1 -1
(integer) 103
127.0.0.1:6379> get k1
"103"
#减N(输入想要减去的数字)
127.0.0.1:6379> get k1
"103"
127.0.0.1:6379> INCRBY k1 -99
(integer) 4
127.0.0.1:6379> get k1
"4"
7.列表操作
- 插入列表
LPUSH:从列表左侧插入数据
RPUSH:从列表右侧插入数据
例如:
lpush list1 a
rpush list1 b
#无论是从左或是从右,都是按照顺序一个数据一个数据的插入列表中
- 查看列表内容的长度
LLEN list1
- 查看列表内容
LRANGE list1 0 -1 # 查看所有内容
LRANGE list1 0 -2 # 0:代表第一个值,0-2:代表第1-3的值,显示
LRANGE list1 0 -0 # 只显示单条数据。这里指只显示第一个值
- 删除列表元素
LPOP: 从列表左边删除一个元素
RPOP: 从列表右边删除一个元素
例:
LPOP list1 #list1列表的名称
RPOP list1
#只支持按照从左或从右的顺序,一个值,一个值的删除。
- 删除整个列表
del list1
#删除整个list1列表以及中的数据
8.hash操作
- 创建一个Hash数据
HMSET user:1 name bobo job IT age 28
HMSET user:2 name json job py age 29
HMSET user:3 name hao job bug age 19
- 查看Hash里指定的值
#mysql操作:
select name from user where id =1 ;
#Hash操作:
HMGET user:1 name # 单个key
HMGET user:1 name job age # 多个key
4.查看Hash里所有的值
- 查看Hash所有的值
mysql操作:
select * from user where id =1 ;
Hash操作:
HGETALL user:1
9.集合操作set
集合不允许出现重复的值,自动去重
- 创建集合
sadd set1 1 2 3
sadd set2 1 3 5 7
- 查看集合成员
smembers set1
smembers set2
- 查看集合的交集
127.0.0.1:6379> sinter set1 set2
1) "1"
2) "3"
- 查看集合的并集
127.0.0.1:6379> sunion set1 set2
1) "1"
2) "2"
3) "3"
4) "5"
5) "7"
- 查看集合的差集(前面减去后面)
127.0.0.1:6379> sdiff set1 set2
1) "2"
127.0.0.1:6379> sdiff set2 set1
1) "5"
2) "7"
- 删除一个成员
srem set1 1
10.有序集合操作
- 添加成员
#有序集合是在集合基础上,加入分数制。
zadd sz3100 json
zadd sz3 90 bobo
zadd SZ3 99 xiaocancan
zadd SZ3 98 bughao
- 计算成员个数
zcard sz3
- 计算某个成员分数
127.0.0.1:6379> zscore sz3 json
"100"
- 按照降序查看成员名次
zrank sz3 json
zrank sz3 bobo
- 按照升序查看成员名次
zrevrank sz3 json
zrevrank sz3 bobo
- .删除成员
zrem sz3 json
- 增加成员分数
zincrby sz3 2 xiaocancan
zscore sz3 xiaocancan
- 返回指定排名范围的成员
zrange sz3 0 3
zrange sz3 0 3 withscores #显示详细信息
- 返回指定分数范围的成员
zrangebyscore sz3 95 100
zrangebyscore sz3 95 100 withscores #显示详细信息
- 返回指定分数范围的成员的个数
zcount sz3 90 110
11.Redis数据持久化
Redis自带两种方式提供数据持久化:
RDB和AOF介绍:
RDB:类似于快照的形式,当前内存里的状态持久化到硬盘里
优点:压缩格式/恢复速度快
缺点:不是实时的,可能会丢失数据,操作比较重AOF:类似于mysql的binlog,可以设置为每秒/每次操作以追加的形式持久化
优点:安全,最多损失1秒的数据,可读
缺点:文件比较大,恢复速度慢
- 配置RDB(类似全备)
#在配置文件中加入
vim /opt/redis_6379/conf/redis_6379.conf
save 900 1 # 15分钟内发生一个key改变保存一次rdb
save 300 10 # 5分钟内发生十个key改变保存一次rdb
save 60 10000 # 1分钟内发生一万个key改变保存一次rdb
dbfilename redis.rdb # 指定rdb文件名
dir /data/redis_6379/ # 指定保存的路径
#手动保存bgsave命令
127.0.0.1:6379> bgsave
Background saving started
#RDB总结:
1.没有配置save参数时,shutdown不会持久化保存
2.没有配置save参数时,可以手动执行bgsave触发持久化
3.在配置了save参数后,shutdown,kill,pkill都会自动触发bgsave
4.恢复的时候,rdb文件名要和配置文件里写的一样。
5.RDB高版本兼容低版本,低版本不兼容高版本
- 配置AOF(实时备份)
#在配置文件中加入
vim /opt/redis_6379/conf/redis_6379.conf
appendonly yes # 系统默认为关闭状态
appendfilename "redis.aof" # 定义aof的文件名
appendfsync everysec # 备份规则,实时备份,系统默认
-----------------------------------------------------------------------------------------
# 手动执行保存命令技巧:BGREWRITEAOF # 压缩aof文件的大小
# 5.0以上的redis默认开启混合模式:aof-use-rdb-preamble yes
#AOF总结:
#AOF存在重写机制:当数据操作有del某条数据类似操作,之前写入的数据将不再写入磁盘持久化
#当aof和rdb同时存在时,重启redis会优先读取aof的内容
如何选择rdb还是aof
#Redis持久化优化:
1.开启混合模式
2.开启aof
3.不开启rdb
4.rdb采用定时任务的方式定时备份
#aof文件故障模拟实验结论
1.aof文件损坏之后,使用修复工具,一刀流,从aof文件出错的地方开始到最后全部删掉
2.任何操作之前,先备份数据
3.aof备份一般情况最多损失1秒的数据
#实验:如果设置了过期时间,恢复数据会如何处理
1.aof文件会记录下过期的时间
2.恢复的时候会去对比记录的过期时间和当前时间,如果超过了,就删除key
3.key的过期时间不受备份恢复影响
12Redis用户认证
- 配置文件
vim /opt/redis_6379/conf/redis_6379.conf
requirepass 123 #ccookzhang:密码
----------------------------------------------------------------------
#使用密码登录
#方式一:
[root@db01 ~]# redis-cli
127.0.0.1:6379> AUTH 123
OK
127.0.0.1:6379> set k1 v1
OK
#方式二:
redis-cli -a 123 get k1
#为什么redis的密码认证这么简单?
1.redis一般都部署在内网环境,默认是比较安全的环境
2.有同学担心密码写在配置文件里,开发不允许登陆到Linux服务器上,但是可以连接到redis,设个密码安全些
13.禁用或重命名危险命令
#禁用危险命令
vim /opt/redis_6379/conf/redis_6379.conf
rename-command CONFIG "" #127.0.0.1:6379> CONFIG GET * 获取所有redis服务配置信息
rename-command KEYS ""
rename-command SHUTDOWN ""
rename-command FLUSHALL "" # 清空所有数据
rename-command DEL ""
rename-command FLUSHDB ""
#shutdown禁用了 让后用kill?(可以自己定义新的对于暗号命令)
vim /opt/redis_6379/conf/redis_6379.conf
rename-command SHUTDOWN "555"
14.Redis主从复制
- 快速部署第二台服务器
# 从已经部署好的db01服务器上直接拉取程序文件
rsync -avz 10.0.0.51:/opt/* /opt/
mkdir /data/redis_6379/ -p
cd /opt/redis
make install # 需要重新安装下命令
sed -i 's#51#52#g' /opt/redis_6379/conf/redis_6379.conf
redis-server /opt/redis_6379/conf/redis_6379.conf
-------------------------------------------------------------------------------
#db01 maste 服务器模拟环境,写入测试数据
for i in {1..1000};do redis-cli -h 10.0.0.51 set k${i} ${i};done
-----------------------------------------------------------------------------------------
#配置主从复制
#方法1:(临时生效)
redis-cli -h 10.0.0.52 slaveof 10.0.0.51 6379
#方法2:(永久生效,但是部署哨兵后)
写进配置文件
vim /opt/redis_6379/conf/redis_6379.conf
slaveof 10.0.0.51 6379
15.Redis配置systemctl方式启动
#1.创建用户并更改目录授权
useradd redis -M -s /sbin/nologin
chown -R redis:redis /opt/redis*
chown -R redis:redis /data/redis*
#2.编写systemd启动文件
vim /usr/lib/systemd/system/redis.service
[Unit]
Description=Redis persistent key-value database
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
ExecStart=/usr/local/bin/redis-server /opt/redis_6379/conf/redis_6379.conf --supervised systemd
ExecStop=/usr/local/bin/redis-cli shutdown
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target
#3.启动
systemctl daemon-reload
systemctl start redis
16.主从复制的流程
#简单流程
1.从节点发送同步请求到主节点
2.主节点接收到从节点的请求之后,做了如下操作
- 立即执行bgsave将当前内存里的数据持久化到磁盘上
- 持久化完成之后,将rdb文件发送给从节点
3.从节点从主节点接收到rdb文件之后,做了如下操作
- 清空自己的数据(如果做从节点的机器有数据一点要先备份好,同步开启会同步master节点的rdb和aof文件,自己原本数据将无法恢复)
- 载入从主节点接收的rdb文件到自己的内存里
4.后面的操作就是和主节点实时的了
5.故障时从节点无法自行修复,需要手动关闭主从复制
命令:SLAVEOF no one
- 主从复制注意
6.主从复制注意
1.从节点只读不可写
2.从节点不会自动故障转移,它会一直同步主
10.0.0.52:6379> set k1 v1
(error) READONLY You can't write against a read only slave.
3.主从复制故障转移需要人工介入
修改代码指向REDIS的IP地址
从节点需要执行SLAVEOF no one
4.从节点会清空自己原有的数据,如果同步的对象写错了,就会导致数据丢失
5.从库和主库后续的同步依靠的是redis的协议,而不是RDB文件,RDB文件只是第一次建立同步时使用。
6.从库也可以正常的持久化文件7.安全的操作
无论是同步,无论是主节点还是从节点,请先备份一下数据