【Redis-入门】

Redis

  • 一、认识Redis
    • 1.数据分类
      • 1.关系型数据库
      • 2.NoSql
      • 3.非关系型数据库的特点
      • 4.与关系型数据库的区别
      • 5.什么是Redis
      • 6.Redis的优势
      • 7.谁在用redis
      • 8.怎么学?
      • 9.redis安装
    • 二、Redis数据类型
      • 1.String类型
      • 2.Hash类型
      • 3. list类型
      • 4.zset类型
      • 5.set类型
  • 三、Redis持久化
    • 1.Redis持久化方案
    • 2.RDB持久化
      • 2.1 RDB
      • 2.2执行时机
      • 2.3RDB原理
      • 2.4 总结
    • 3. AOF
      • 4. RDB 和 AOF对比
  • 四、Redis集群
    • 4.1单机安装Redis
    • 4.2 Reids主从
    • 4.3 Redis哨兵
    • 4.4Redis分片
  • 五、原理部分
    • 5.1 主从集群同步原理
      • 1.全量同步
      • 2.增量同步
    • 5.2哨兵集群原理
    • 5.3 分片集群原理

一、认识Redis

1.数据分类

1.关系型数据库

   MySQL  Oracle  SQLServer DB2

2.NoSql

 2.1 键值对
    Redis 
 2.2 列存储数据库
    HBase
  2.3 文档数据库
  MongoDB
2.4 图形数据库
   Neo4j

3.非关系型数据库的特点

 3.1 数据模型简单
 3.2 灵活性更强
 3.3对于数据库的性能要求较高
 3.4对于一些复杂的key比较容易映射

4.与关系型数据库的区别

 4.1 关系型数据库的优点
     易于维护
     使用简单
     复杂操作
 4.2 关系型数据库的缺点
   读写性能差
   固定的表结构
   高并发 硬盘I/O
 4.3 非关系型数据库的优点
     格式灵活
     速度快
     成本低
 4.4非 关系型数据库的缺点
    不提供sql支持
    无事务支持 6.X版本以下

5.什么是Redis

Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、
可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
 单线程
key  value存储
定位: 
    缓存  提高读写速度 减轻对数据库的访问压力

6.Redis的优势

每秒10W读写频率

7.谁在用redis

 新浪微博
 淘宝
 腾讯

8.怎么学?

在线  http://try.redis.io 
htt://www.redis.cn
跟我学

9.redis安装

 windows 中是用 3.X
 linux 中使用6.X
 解压缩即可用

二、Redis数据类型

1.String类型

 java  Map<String,?> 
set   key  value 存入键值对
get key  根据键取出value
incr key  加1
decr key 减1
setex key timeout value 设置过期时间
timeout 单位是秒

应用场景:
分布式session
计数器

2.Hash类型

      java Map<String,Map<String,?>>
      hset key  hashkey hashvalue 存属性
      hget key  hashkey 获取属性值
      hexists key  hashkey 判断是否存在这个属性
      hdel key hashkey 
  使用场景 :
      用户信息管理

3. list类型

    rpush key value 向列表的右边添加数据
    lpush key value   向列表的左边添加数据
    lrange key 0 -1 遍历列表
   lpop key  弹出左边的数据
   rpop key 弹出右边的数据
 使用场景 :
     收藏夹

4.zset类型

    zadd  key score  column 存入分数和名称 
    zrange key 0  -1  遍历 
    zrem key column 移除数据
    zcard key 获取数据个数
  使用场景 :
     排行榜

5.set类型

sadd key value 添加元素
smembers key 遍历集合
srem key value 删除某个元素
使用场景:
   抽奖  去除重复

三、Redis持久化

1.Redis持久化方案

	RDB方案
	AOF方案

2.RDB持久化

2.1 RDB

 Redis Database Backup file Redis数据备份文件 Redis快照

2.2执行时机

 四种情况下执行:
 1.执行save命令
 2.执行bgsave命令
 3.Redis停机
 4.触发Rdb条件
 注意: 
 1.save命令导致主进程执行RDB,这个过程中出现其他的命令都会被阻塞,只有在数据迁移的时候才进行使用.
 2.我们建议使用bgsave  这个命令会独立的开启进程来完成RDB操作,主进程可以继续处理用户的请求,不受影响.
 3.Redis停机之前会自动的执行一次save命令,实现RDB。
 4.触发条件 redis.conf
   save 900 1
   save 300 10
   save 60 10000
5.参数注意
     rdbcompression yes 是否压缩 建议不开启 压缩会消耗cpu 
     dbfilename dump.rdb   rdb文件名
     dir ./ 默认当前目录

2.3RDB原理

    bgsave 开始的收会进行fork 主进程得到子进程,子进程共享主进程的内存。完成fork操作之后读取内存的数据并写入rdb文件.
    本质: 主进程无法直接操作物理内存,它只能操作虚拟内存,所以虚拟内存和物理内存之间就会有一个叫页表的东西,它的主要作用就是完成物理内存和虚拟内存之间的映射关系.
    fork 不是把内存中的数据进行了拷贝,而是拷贝的页表.--> 拿到内存映射关系
    fork采用的是 copy-on-write技术
     主进程进行读取操作访问的是共享内存
     主进程进行写取操作,会拷贝一份数据,执行写操作.

在这里插入图片描述

2.4 总结

       1. rdb 方式bgsave的执行流程?
             fork主进程得到一个子进程,共享内存空间
             子进程读取内存数据并写入rdb文件
             用新的rdb文件替换旧的rdb文件
        2.rdb什么时候执行?save 60  1000代表什么?
           默认是服务停止就执行
           60秒内至少执行了1000次就会触发rdb操作
         3.rdb缺点?
           rdb执行间隔长,两次rdb之间会有数据丢失的风险
           fork 子进程  进行压缩 进行数据写入 需要消耗时间

3. AOF

  Append Only File 追加文件  
    redis每次处理一个命令都会记录在aof文件中,它可以看作是日志。
 AOF文件默认是关闭的
     appendonly no   #是否开启aof 默认是关闭
     appendfilename "appendonly.aof"  #aof文件名称
         #appendfsync always  每写一行命令立即记录
         appendfsync everysec  写命令先写入缓存区,每间隔一秒再从缓冲区写入到aof文件中
          #appendfsync no    由操作决定什么时候写入磁盘中

4. RDB 和 AOF对比

RDBAOF
持久化方式定时对整个内存做快照记录每一次执行的命令
数据完整性不完整,两次备份之间可能会丢失数据相对完整,取决于刷盘策略
文件大小会有压缩,文件体积小记录命令,文件体积大
宕机恢复速度很快
数据恢复优先级低,数据完整性不如aof高,数据完整性更高
资源占用高,大量消耗cpu低,只进行本地IO
使用场景可以容忍分钟级别的数据丢失,追求更快的启动速度对数据安全性要求较高时候使用

四、Redis集群

4.1单机安装Redis

  4.1.1 安装依赖
     yum install -y gcc tcl 
   4.1.2 上传redis-6.2.4.tar.gz压缩包文件到linux的tmp目录下
   4.1.3解压缩
    tar -xvf redis-6.2.4.tar.gz 
    进入redis目录 
    cd  redis-6.2.4
    运行编译命令
    make && make install 
    不报错就是成功了!!!!
    更改redis.conf
    bind 0.0.0.0  允许所有的ip地址进行访问
    database 1 数据库设置为1  数据库共有16个  0--15 
    启动redis
    redis-server  redis.conf

4.2 Reids主从

  4.2.1 主从结构 

在这里插入图片描述
三个实例

IPPORT角色
192.168.142.1287001master
192.168.142.1287002slave
192.168.142.1287003slave
三个实例准备工作
	cd /tmp
	mkdir 7001  7002  7003  
修改redis.conf
  开启RDB
	 save 3600 1
	 save 300 100
	 save 60 10000
关闭AOF 
		appendonly no

将刚刚修改的文件拷贝到 7001   7002   7003 中 
  cp redis-6.2.4/redis.conf 7001
  cp redis-6.2.4/redis.conf 7002
  cp redis-6.2.4/redis.conf 7003
  
修改端口
   sed -i -e  's/6379/7001/g' -e 's/dir .\//dir \/tmp\/7001\//g' 7001/redis.conf
   sed -i -e  's/6379/7002/g' -e 's/dir .\//dir \/tmp\/7002\//g' 7002/redis.conf
	sed -i -e  's/6379/7003/g' -e 's/dir .\//dir \/tmp\/7003\//g' 7003/redis.conf
修改实例ip  
  192.168.142.128[ 这是我的ip ]

  replica-announce-ip 192.168.142.128   --->你们实验这个统一修改ip的命令是否好用

  
   如果上面的批量修改不好用,使用下面的命令分别执行

   sed -i '1a replica-announce-ip 192.168.142.128' 7001/redis.conf
   sed -i '1a replica-announce-ip 192.168.142.128' 7002/redis.conf
   sed -i '1a replica-announce-ip 192.168.142.128' 7003/redis.conf
   
分别启动三个redis 建议开三个窗口  
    redis-server /tmp/7001/redis.conf
    redis-server /tmp/7002/redis.conf
    redis-server /tmp/7003/redis.conf

开启主从 
   连接 7002
   redis-cli -p 7002  
   slaveof 192.168.142.128 7001   -->告诉7002你的主人是7001 


     连接 7003
   redis-cli -p 7003  
   slaveof 192.168.199.128 7001   -->告诉7002你的主人是7001 

   查看集群状态 
       redis-cli -p 7001   连接master  
   info replication

在这里插入图片描述

测试 
   在  7001 上面存数据
   set age 18
          在7002 上获取数据
              get age 能看到18证明主从搭建成功了!
            在7003 上获取数据
                 get age 能看到18证明主从搭建成功了!

4.3 Redis哨兵

sentinel 搭建三个
节点IP端口
s1192.168.142.12827001
s2192.168.142.12827002
s3192.168.142.12827003

准备配置
cd /tmp

mkdir s1 s2 s3
在s1目录创建一个sentinel.conf 内容如下:
port 27001
sentinel announce-ip 192.168.142.128
sentinel monitor mymaster 192.168.142.128 7001 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
dir “/tmp/s1”

在s2目录创建一个sentinel.conf 内容如下:
port 27002
sentinel announce-ip 192.168.142.128
sentinel monitor mymaster 192.168.142.128 7001 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
dir “/tmp/s2”

在s3目录创建一个sentinel.conf 内容如下:
port 27003
sentinel announce-ip 192.168.142.128
sentinel monitor mymaster 192.168.142.128 7001 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
dir “/tmp/s3”

启动实例
redis-sentinel s1/sentinel.conf

redis-sentinel s2/sentinel.conf

redis-sentinel s3/sentinel.conf

让7001 这个直接点 宕机
使用命令:
shutdown
观察日志 7002 7003 两个日志中
显示 MASTER MODE enabled 为新的master
在这里插入图片描述

4.4Redis分片

  小的集群 3个master
  做分片的集群准备
IPPORT角色
192.168.142.1287001master
192.168.142.1287002master
192.168.142.1287003master
192.168.142.1288001slave
192.168.142.1288002slave
192.168.142.1288003slave
配置实例
	cd /tmp
	rm -rf  7001  7002  7003

在tmp下面放一个redis.conf 文件,内容如下:
		 #端口
		port 6379
		#开启集群功能
		cluster-enabled yes
		#集群的名称不需要我们创建由redis自行进行维护
		cluster-config-file /tmp/6379/nodes.conf
		#节点之间心跳的超时时间为5秒 
		cluster-node-timeout 5000
		#持久化目录
		dir /tmp/6379
		#绑定地址
		bind 0.0.0.0
		#redis后台运行
		daemonize yes
		#注册实例ip地址
		replica-announce-ip 192.168.142.128
		#关闭保护模式
		protected-mode no
		#数据库的数量
		databases 1
		#日志 
		logfile /tmp/6379/run.log

修改每个目录下面的 redis.conf 文件
 将文件分别拷贝到 文件夹中 
 echo 7001 7002 7003 8001 8002 8003 | xargs -t -n 1 cp redis.conf

 修改每个目录下面redis.conf  将其中的6379修改为所在目录
  printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t sed -i 's/6379/{}/g' {}/redis.conf

 因为设置了后台启动,所以我们可以一次性启动6个服务 
     printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-server {}/redis.conf

通过ps查看状态
ps -ef | grep redis

 设置主从关系:
redis-cli --cluster create --cluster-replicas 1 192.168.142.128:7001 192.168.142.128:7002 192.168.142.128:7003 192.168.142.128:8001 192.168.142.128:8002 192.168.142.128:8003
 别忘记输入 yes 

查看集群状态
redis-cli -p 7001 cluster nodes

测试 注意了命令有变化

redis-cli -c -p 7001

Last login: Tue Dec 17 15:54:25 2024 from 192.168.142.1
[root@beijingliushao ~]# redis-cli -c -p 7001
127.0.0.1:7001> set age 18
OK
127.0.0.1:7001> set a 1
-> Redirected to slot [15495] located at 192.168.142.128:7003
OK
192.168.142.128:7003> set nums 128
OK
192.168.142.128:7003> set num 126
-> Redirected to slot [2765] located at 192.168.142.128:7001
OK
192.168.142.128:7001>

看到类似于上述的结果,证明分片集群搭建成功!
在这里插入图片描述

五、原理部分

5.1 主从集群同步原理

1.全量同步

    主从第一次会执行全量同步,将master节点的所有数据拷贝给slave节点,流程

在这里插入图片描述

2.增量同步

在这里插入图片描述

5.2哨兵集群原理

sentinel 是基于心跳机制监测服务状态,每间隔1秒向集群中的每个实例发送 ping命令:
主观下线: 如果某个sentinel 节点发现某个节点在规定的时间内没有响应,就认为主观下线.
客观下线: 如果超过半数的sentinel都认为这个实例主观下线,这个实例就客观下线。

集群故障恢复的原理:
一旦master发生故障,sentinel需要在slave中选出一个作为新的master ,选举依据如下:
首先会判断slave节点与master节点断开的时间长短,如果超过指定的值(down-after-secnods*10),会排除该slave节点
接下来会看 参与选举值,值越小优先级越高
如果值一致,offset 值越大,说明数据越新
判断 slave运行的id大小,越小优先级越高

5.3 分片集群原理

使用场景:
1. 海量数据存储
2. 高并发写

  分片集群特征:
   集群中有多个master ,每个master保存的数据不一样
   每个master可以有多个slave节点
   master之间通过 ping命令检测健康状态
   插槽 0--- 16383  总数 16384 
 如何存插槽  
    通过hash运算   借助 对于 16384 进行取余
    
   
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值