滴水恩情 发表于 2024-12-25 13:14:33

【Redis-入门】

一、认识Redis

1.数据分类

1.关系型数据库

   MySQLOracleSQLServer 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。
单线程
keyvalue存储
定位:
    缓存提高读写速度 减轻对数据库的访问压力
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类型

javaMap<String,?>
set   keyvalue 存入键值对
get key根据键取出value
incr key加1
decr key 减1
setex key timeout value 设置过期时间
timeout 单位是秒
应用场景:
分布式session
计数器
2.Hash类型

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

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

    zaddkey scorecolumn 存入分数和名称
    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技术
   主进程进行读取操作访问的是共享内存
   主进程进行写取操作,会拷贝一份数据,执行写操作.
https://i-blog.csdnimg.cn/direct/02a07e65ee32471c8c3653ed8f577e02.png#pic_center
2.4 总结

       1. rdb 方式bgsave的执行流程?
             fork主进程得到一个子进程,共享内存空间
             子进程读取内存数据并写入rdb文件
             用新的rdb文件替换旧的rdb文件
      2.rdb什么时候执行?save 601000代表什么?
         默认是服务停止就执行
         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目录
    cdredis-6.2.4
    运行编译命令
    make && make install
    不报错就是成功了!!!!
    更改redis.conf
    bind 0.0.0.0允许所有的ip地址进行访问
    database 1 数据库设置为1数据库共有16个0--15
    启动redis
    redis-serverredis.conf
4.2 Reids主从

4.2.1 主从结构
https://i-blog.csdnimg.cn/direct/2cba7f40755842c2b8a59f57beac9727.png#pic_center
三个实例
IPPORT脚色192.168.142.1287001master192.168.142.1287002slave192.168.142.1287003slave 三个实例准备工作
        cd /tmp
        mkdir 700170027003
修改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
https://i-blog.csdnimg.cn/direct/96e920959f414f88a231b307ffdb905f.png#pic_center
测试
   在7001 上面存数据
   set age 18
          在7002 上获取数据
            get age 能看到18证明主从搭建成功了!
            在7003 上获取数据
               get age 能看到18证明主从搭建成功了!
4.3 Redis哨兵

sentinel 搭建三个
节点IP端口s1192.168.142.12827001s2192.168.142.12827002s3192.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
https://i-blog.csdnimg.cn/direct/ad6d340279394f379efd2b858c1eb302.jpg
4.4Redis分片

小的集群 3个master
做分片的集群准备
IPPORT脚色192.168.142.1287001master192.168.142.1287002master192.168.142.1287003master192.168.142.1288001slave192.168.142.1288002slave192.168.142.1288003slave 配置实例
        cd /tmp
        rm -rf700170027003

在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
# 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 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 located at 192.168.142.128:7001
OK
192.168.142.128:7001>
看到类似于上述的结果,证明分片集群搭建成功!
https://i-blog.csdnimg.cn/direct/5a5d0e7d4c44482ea6cacfb33a14a79a.jpg
五、原理部分

5.1 主从集群同步原理

1.全量同步

    主从第一次会执行全量同步,将master节点的所有数据拷贝给slave节点,流程
https://i-blog.csdnimg.cn/direct/7edf08576d1544569f7b119de8c15941.png#pic_center
2.增量同步

https://i-blog.csdnimg.cn/direct/ff81ba6312bf4387ac258047ec05f441.png#pic_center
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 进行取余
   
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【Redis-入门】