数据库简介
一、数据库分类
关系型: mysql oracle sqlserver db2 postgresql
非关系型:redis(缓存) mongodb(列表菜单) Elasticsearch(购物网站搜索引擎)
二、Redis重要特性
1. 速度快(去掉了安全性机制)
c语言写的
代码优雅
单线程架构
2. 支持多种数据结构
字符串,哈希,列表,集合,有序集合
3. 丰富的功能
天然计数器
健过期功能
消息队列(解决上游程序和下游程序的交接问题)
4. 支持客户端语言多
php、java、python
5. 数据持久化
所有的数据都运行在内存中
支持2种格式持久化数据AOF RDB AOF&RDB
6. 自带多种高可用架构
主从(在主上写任何数据,从服务器都会同步数据)
哨兵(监控主服务器,如果主服务器死掉,从服务器变为主服务器)
集群(将主从和哨兵融合,形成6个节点三对主从关系,注意永远是三主三从的结构)
集群功能实现,将访问效率低的一张大表拆成分片分散在每个集群中,从而提高访问效率)
三、redis应用场景
主要负责”热数据“的处理
1. 缓存-键过期时间
把session会话存在redis,过期删除
缓存用户信息,缓存Mysql部分数据,用户先访问redis,redis没有再访问mysql
商城优惠卷过期时间
2. 排行榜-列表&有序集合
热度/点击数排行榜
直播间礼物积分排行
3. 计数器-天然支持计数器
帖子浏览数
视频播放数
评论数
点赞/踩
4. 社交网络-集合
粉丝
共同好友
兴趣爱好
标签
5. 消息队列-发布订阅
配合ELK缓存收集来的日志
安装redis
1. 准备安装和数据目录
1. [root@redis1 ~]# mkdir -p /opt/redis_cluster/redis_6379/{conf,logs,pid} 2. [root@redis1 ~]# mkdir -p /data/soft
2.下载redis安装包
1. [root@redis1 ~]# cd /data/soft 2. [root@redis1 ~]# wget http://download.redis.io/releases/redis-5.0.7.tar.gz
3. 解压redis到/opt/redis_cluster/
1. [root@redis1 soft]# tar zxf redis-5.0.7.tar.gz -C /opt/redis_cluster/ 2. [root@redis1 soft]# ln -s /opt/redis_cluster/redis-5.0.7/ /opt/redis_cluster/redis
4. 切换目录安装redis
1. [root@redis1 soft]# cd /opt/redis_cluster/redis 2. [root@redis1 redis]# make && make install
5.编写配置文件
1. [root@redis1 redis]# cd /opt/redis_cluster/redis_6379/conf/ 2. [root@redis1 conf]# vim 6379.conf 3. bind 127.0.0.1 192.168.1.4 4. port 6379 5. daemonize yes 6. pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid 7. logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log 8. databases 16 9. dbfilename redis.rdb 10. dir /opt/redis_cluster/redis_6379
注释:
databases 16 默认创建16个子数据库
dbfilename 表示持久化保存在硬盘的文件名
6. 启动当前redis服务
[root@redis1 conf]# redis-server 6379.conf
关闭redis服务
redis-cli shutdown
7. 登录redis
[root@redis1 conf]# redis-cli
redis基本命令
1. 全局命令
KEYS * #列出所有键值名,但在企业环境禁止使用
DBSIZE #查看有多少键值数
EXISTS #查看键值是否存在
EXPIRE k2 20 #设置K2过期时间为20秒,20秒后k2自动取消
PERSIST k2 #取消k2的过期时间
TTL k2 #查看k2的生命周期
TYPE #查看数据类型
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 #批量查看键值
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位,其他值删除
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 18866668888 #添加值tel
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 #求并集
redis持久化
1. 当redis重启时,之前的键值将不复存在,这种情况是不行的。此时需要配置持久化功能,当redis重启后,之前的键值还会存在。
RDB:生成时间点快照,保存于硬盘
优点:速度快,适合做备份,能做主从复制,单开子进程进行rdb操作不影响主业务。
缺点:会有部分数据丢失。
AOF:记录所有写操作命令,通过再次执行这些命令还原数据。
优点:最大程度保证数据不丢失。
缺点:日志记录量太大。
2. RDB配置
1. [root@redis1 ~]# redis-cli //登录redis 2. 3. 127.0.0.1:6379> bgsave //rdb保存命令 4. 5. Background saving started 6. 7. 127.0.0.1:6379> exit //退出 8. 9. [root@redis1 ~]# vim /opt/redis_cluster/redis_6379/conf/6379.conf 10. 11. //添加三行内容 12. 13. save 900 1 //在900秒(15分钟)之后,如果至少有1个key发生变化,则dump内存快照 14. 15. save 300 10 //在300秒(5分钟)之后,如果至少有10个key发生变化,则dump内存快照 16. 17. save 60 10000 //在60秒(1分钟)之后,如果至少有10000个key发生变化,则dump内存快照
3. AOF配置
1. [root@redis1 ~]# vim /opt/redis_cluster/redis_6379/conf/6379.conf 2. 3. //添加三行内容 4. 5. appendonly yes //启用AOF持久化 6. 7. appendfilename "redis.aof" //指定AOF文件名 8. 9. appendfsync everysec //每秒同步一次
4. 重启redis
1. [root@redis1 ~]# redis-cli shutdown 2. 3. [root@redis1 ~]# redis-server /opt/redis_cluster/redis_6379/conf/6379.conf
此时可以使用redis基本命令来测试创建一些键值,重启后查看键值应还存在。
redis主从复制
1. 环境如下:主redis1,从redis2。
为解决单点故障把数据复制到一个或多个副本副本服务器(从服务器),实现故障恢复和负载均衡。
2. 开启第二台服务器,安装redis
(1)经过上面的安装,此时需要开启第二台虚拟机,把第一台服务器的redis安装目录,scp到第二台服务器上。
[root@redis1 ~]# scp -rp /opt/redis_cluster/ root@192.168.1.5:/opt
(2)在第二台服务器上,make install安装redis
1. [root@redis2 ~]# cd /opt/redis_cluster/redis 2. 3. [root@redis2 redis]# make install
1. [root@redis2 redis]# vim /opt/redis_cluster/redis_6379/conf/6379.conf 2. //编辑下面两行内容,绑定IP为本机地址(第二台),指定主为第一台(192.168.1.4) 3. 4. bind 127.0.0.1 192.168.1.5 5. slaveof 192.168.1.4 6379
(3)启动服务
[root@redis2 redis]# redis-server /opt/redis_cluster/redis_6379/conf/6379.conf
(4)主服务器上新建键值,测试从服务器自动同步
(5)从服务器在同步过程中,只能复制主数据库的数据,不能手动添加修改数据;如果从服务器非要修改数据,需要断开同步(注意:需要在从服务器上断开)。
[root@redis2 ~]# redis-cli slaveof no one
redis集群
Redis Cluster 是 redis的分布式解决方案,在3.0版本正式推出。
当遇到单机、内存、并发、流量等瓶颈时,可以采用Cluster架构方案达到负载均衡目的。
Redis Cluster之前的分布式方案有两种:
1)客户端分区方案: 优点分区逻辑可控,缺点是需要自己处理数据路由,高可用和故障转移等。
2)代理方案: 优点是简化客户端分布式逻辑和升级维护便利,缺点加重架构部署和性能消耗。
官方提供的 Redis Cluster集群方案,很好的解决了集群方面的问题。
1. 数据分布
分布式数据库首先要解决把整个数据库集按照分区规则映射到多个节点的问题,即把数据集划分到多个节点上,
每个节点负责整体数据的一个子集,需要关注的是数据分片规则,Redis Cluster采用哈希分片规则。
2. 目录规划
# redis安装目录
/opt/redis_cluster/redis_{PORT}/{conf,logs,pid}
# redis数据目录
/data/redis_cluster/redis_{PORT}/redis_{PORT}.rdb
3. 集群拓扑图
4. 手动搭建部署集群
思路:
先部署一台服务器上的2个集群节点,把文件发送到其他主机修改IP地址,启动服务。下面将从新创建两个端口。
群集实施
1. redis1部署
1. [root@redis1 ~]# mkdir -p /opt/redis_cluster/redis_{6380,6381}/{conf,logs,pid} 2. 3. [root@redis1 ~]# mkdir -p /data/redis_cluster/redis_{6380,6381}
安装redis具体步骤参考→安装redis
1. [root@redis1 ~]# vim /opt/redis_cluster/redis_6380/conf/redis_6380.conf 2. bind 192.168.1.4 3. port 6380 4. daemonize yes 5. pidfile "/opt/redis_cluster/redis_6380/pid/redis_6380.pid" 6. logfile "/opt/redis_cluster/redis_6380/logs/redis_6380.log" 7. dbfilename "redis_6380.rdb" 8. dir "/data/redis_cluster/redis_6380/" 9. cluster-enabled yes 10. cluster-config-file nodes_6380.conf 11. cluster-node-timeout 15000 12. [root@redis1 ~]# cd /opt/redis_cluster/ 13. [root@redis1 redis_cluster]# cp redis_6380/conf/redis_6380.conf redis_6381/conf/redis_6381.conf 14. [root@redis1 redis_cluster]# sed -i 's/6380/6381/g' redis_6381/conf/redis_6381.conf 15. [root@redis1 redis_cluster]# redis-server /opt/redis_cluster/redis_6380/conf/redis_6380.conf 16. [root@redis1 redis_cluster]# redis-server /opt/redis_cluster/redis_6381/conf/redis_6381.conf
2. 复制redis1的安装和数据目录到redis2、redis3
1. [root@redis1 ~]# scp -rp /opt/redis_cluster/ root@192.168.1.5:/opt 2. 3. [root@redis1 ~]# scp -rp /opt/redis_cluster/ root@192.168.1.6:/opt
3. redis2操作:
1. [root@redis2 ~]# cd /opt/redis_cluster/redis 2. 3. [root@redis2 redis]# make install 4. 5. [root@redis2 ~]# find /opt/redis_cluster/redis_638* -type f -name "*.conf" | xargs sed -i 's/192.168.1.4/192.168.1.5/g' 6. 7. [root@redis2 ~]# mkdir -p /data/redis_cluster/redis_{6380,6381} 8. 9. [root@redis2 ~]# redis-server /opt/redis_cluster/redis_6380/conf/redis_6380.conf 10. 11. [root@redis2 ~]# redis-server /opt/redis_cluster/redis_6381/conf/redis_6381.conf
4.redis3操作
1. [root@redis3 ~]# cd /opt/redis_cluster/redis 2. 3. [root@redis3 redis]# make install 4. 5. [root@redis3 redis]# find /opt/redis_cluster/redis_638* -type f -name "*.conf" | xargs sed -i 's/192.168.1.4/192.168.1.6/g' 6. 7. [root@redis3 redis]# mkdir -p /data/redis_cluster/redis_{6380,6381} 8. 9. [root@redis3 redis]# redis-server /opt/redis_cluster/redis_6380/conf/redis_6380.conf 10. 11. [root@redis3 redis]# redis-server /opt/redis_cluster/redis_6381/conf/redis_6381.conf
群集搭建完成后,需要加主机及端口号进行登录。
格式如下:redis-cli -h {群集IP} -p {端口号}
配置节点发现
当把所有节点都启动后查看进程会有cluster的字样。
但是登录后执行CLUSTER NODES命令会发现只有每个节点自己的ID,目前集群内的节点。
还没有互相发现,所以搭建redis集群我们第一步要做的就是让集群内的节点互相发现。
在执行节点发现命令之前我们先查看一下集群的数据目录会发现有生成集群的配置文件。
查看后发现只有自己的节点内容,等节点全部发现后会把所发现的节点ID写入这个文件。
集群模式的Redis除了原有的配置文件之外又加了一份集群配置文件。当集群内节点信息发生变化,如添加节点、节点下线、故障转移等,节点会自动保存集群状态到配置文件。需要注意的是,Redis自动维护集群配置文件,不需要手动修改,防止节点重启时产生错乱。
节点发现使用命令: CLUSTER MEET {IP} {PORT}
注意:在集群内任意一台机器执行此命令就可以
1. [root@redis1 ~]# redis-cli -h 192.168.1.4 -p 6380 2. 192.168.1.4:6380> cluster meet 192.168.1.5 6380 3. OK 4. 192.168.1.4:6380> cluster meet 192.168.1.6 6380 5. OK 6. 192.168.1.4:6380> cluster meet 192.168.1.4 6381 7. OK 8. 192.168.1.4:6380> cluster meet 192.168.1.5 6381 9. OK 10. 192.168.1.4:6380> cluster meet 192.168.1.6 6381 11. OK 12. 192.168.1.4:6380> cluster nodes 13. d1830b324dd295d885cba841c6ab5039bc956c44 192.168.1.6:6380@16380 master - 0 1669446325000 0 connected 14. 96f3793810ccb3fdcbf12ebdf872304b245a7dd7 192.168.1.4:6381@16381 master - 0 1669446326273 4 connected 15. 41b0a5c4747d77fa61e52d08a9a649f9c54a7303 192.168.1.5:6381@16381 master - 0 1669446325000 5 connected 16. 10a4845657f28c482673e335ac9606a21139e472 192.168.1.5:6380@16380 master - 0 1669446323000 2 connected 17. 18e929e49358707b01be5b38d6e80318ba7edd21 192.168.1.6:6381@16381 master - 0 1669446325266 3 connected 18. 5bbd0a1e95af121ad09d8b1c90d6c2caa2851ae4 192.168.1.4:6380@16380 myself,master - 0 1669446325000 1 connected
节点都发现完毕后我们再次查看集群配置文件,可以看到发现到的节点的ID也被写入到了集群的配置文件里。此时每个服务器的状态都是master,下面将指定主从关系。