Redis教程

redis(keys命令,持久化,集群,ssm框架整合jedis)

本文主要是介绍redis(keys命令,持久化,集群,ssm框架整合jedis),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1.设置key的生存周期

  • Redis在实际使用过程中更多的用作缓存,然而缓存的数据一般都是需要设置生存时间的,即:到期后数据销毁
expire key seconds    设置key的生存时间(单位:秒),key在多少秒后会自动删除
ttl key 查看key的生存时间
persist key 消除生存时间
pexpire key milliseconds  生存时间设置单位为:毫秒

2.其他命令

keys 返回满足给定pattern的所有key    keys mylist*  返回所有前置名称为mylist的key
exists key  确认一个key是否存在
del key 删除一个key
rename key newname 重名名key
type key 返回值的类型

3.服务器命令

ping 测试连接是否存活
echo 在命令行打印一些内容
select number 切换数据库(redis默认有16个数据库)
quit 退出连接
dbsize 返回当前数据库中的key数目
info 获取服务器的信息和统计
flushdb 删除当前选择数据库是所有key
flushall 删除所有数据库中的key

4.持久化(RDB快照)(AOF)

  • Redis的高性能是由于其将所有数据都存储在了内存中,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化。

  • Redis支持两种方式的持久化,一种是RDB方式,一种是AOF方式。可以单独使用其中一种或将二者结合使用。

1.RDB持久化

  • RDB方式的持久化是通过快照(snapshotting)完成的,当符合一定条件时Redis会自动将内存中的数据进行快照并持久化到硬盘。

  • RDB是Redis默认采用的持久化方式,在redis.conf配置文件中默认有此下配置:

    save 900 1

    save 300 10

    save 60 10000

  • 在redis.conf中:

    ​ 配置dir指定rdb快照文件的位置

    ​ 配置dbfilename指定rdb快照文件的名称

  • Redis启动后会读取RDB快照文件,将数据从硬盘载入到内存。根据数据量大小与结构和服务器性能不同,这个时间也不同。通常将记录一千万个字符串类型键大小为1GB的快照文件载入到内存中需要花费20~30秒钟。

问题总结:

​ 通过RDB方式实现持久化,一旦Redis异常退出,就会丢失最后一次快照以后更改的所有数据。这就需要开发者根据具体的应用场合,通过组合设置自动快照条件的方式来将可能发生的数据损失控制在能够接受的范围。如果数据很重要以至于无法承受任何损失,则可以考虑使用AOF方式进行持久化。

2.AOF持久化

  • 默认情况下Redis没有开启AOF(append only file)方式的持久化,可以通过appendonly参数开启:

    appendonly yes

  • 开启AOF持久化后每执行一条会更改Redis中的数据的命令,Redis就会将该命令写入硬

    盘中的AOF文件。AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的,默认的文件名是appendonly.aof,可以通过appendfilename参数修改:appendfilename appendonly.aof.

  • 项目当中必须使用rdb,手动开启aof,来保证数据的完整性

    当采用rdb+aof持久化机制的时候,redis服务器在启动之后,会先加载rdb文件,再加载aof文件,所以才保证了数据的完整性

5.redis主从复制

主:主服务器 从:从服务器

主节点主要负责数据写入,从节点负责数据读的请求。主和从之间通过网络连接进行数据的传输

全量复制:第一次同步会进行全量复制,发送rgb文件进行复制

增量复制:之后的每次同步都会根据偏移量,和主机的id值,来进行增量复制

主机挂掉后:从机会根据投票选举算法(paxos:分别选举算法),选出一个新的主节点。

  • 持久化保证了即使redis服务重启也不会丢失数据,因为redis服务重启后会将硬盘上持久化的数据恢复到内存中,当redis服务器的硬盘损坏了可能会导致数据丢失,通过redis的主从复制机制就可以避免这种单点故障

wps2

  • 主redis中的数据有两个副本(replication)即从redis1和从redis2,即使一台redis服务器宕机其它两台redis服务也可以继续提供服务

  • 主redis中的数据和从redis上的数据保持实时同步,当主redis写入数据时通过主从复制机制会复制到两个从redis服务上

  • 只有一个主redis,可以有多个从redis

  • n 主从复制不会阻塞master,在同步数据时,master 可以继续处理client (客户端)请求

  • 一个redis可以即是主又是从
    wps3

  • 主redis中的数据有两个副本(replication)即从redis1和从redis2,即使一台redis服务器宕机其它两台redis服务也可以继续提供服务

  • 主redis中的数据和从redis上的数据保持实时同步,当主redis写入数据时通过主从复制机制会复制到两个从redis服务上

  • 只有一个主redis,可以有多个从redis

  • n 主从复制不会阻塞master,在同步数据时,master 可以继续处理client (客户端)请求

  • 一个redis可以即是主又是从

1.主从配置

  • 主机无需配置

  • 从机修改从redis服务器上的redis.conf文件,添加slaveof 主redisip 主redis端口

wps4

2.主从复制过程

修改从redis服务器上的redis.conf文件,添加*slaveof 主redisip 主redis端口*

wps5-16348809454191

  • 完整复制

1、 slave 服务启动,slave 会建立和master 的连接,发送sync 命令。

2、master启动一个后台进程将数据库快照保存到RDB文件中

注意:此时如果生成RDB文件过程中存在写数据操作会导致RDB文件和当前主redis数据不一致,所以此时master 主进程会开始收集写命令并缓存起来。

3、master 就发送RDB文件给slave

4、slave 将文件保存到磁盘上,然后加载到内存恢复

5、master把缓存的命令转发给slave

注意:后续master 收到的写命令都会通过开始建立的连接发送给slave。

当master 和slave 的连接断开时slave 可以自动重新建立连接。如果master 同时收到多个slave 发来的同步连接命令,只会启动一个进程来写数据库镜像,然后发送给所有slave。

  • 部分复制

img

从机连接主机后,会主动发起 PSYNC 命令,从机会提供 master的runid(机器标识,随机生成的一个串) 和 offset(数据偏移量,如果offset主从不一致则说明数据不同步),主机验证 runid 和 offset 是否有效, runid 相当于主机身份验证码,用来验证从机上一次连接的主机,如果runid验证未通过则,则进行全同步,如果验证通过则说明曾经同步过,根据offset同步部分数据。

Redis主从结构,数据同步的原理(redis主从复制的原理)

Redis主从服务器之间,先进行rdb全量复制,再进行增量复制.

缺点:只有一台主机负责写入,可以应对查询的高并发,无法应对写的高并发,这时候使用cluster集群

6.redis cluster集群

集群是指在多台机器上安装同样的应用,多台机器共同来完成工作

1.redis cluster集群工作原理

整个集群会分配16384个hash槽。

每一个主从都会分配一部分的槽

  • 客户端进行写入操作,写入一个key
  • 客户端进行读写操作的时候,会将key的值crc16算法,之后再对该值对16384取模 slot=crc16(key值)%16384,计算出该key的solt值
  • 找到对应的一对主从,由这对主从负责对该key的管理(读,写)

image-20211021140014593

image-20211021140708757

redis cluster集群的优点

  • 支持高并发写
  • 数据存在副本更安全,数据分片(数据分区间进行保存)
  • 提供了哨兵机制(检测主从之间的连接,一旦发现主节点不可以,会自动切换从节点作为主节点)更安全

2.搭建redis cluster 集群

  1. 创建6个文件目录,用于存放每一个redis实例的配置文件

    /usr/app/redis-cluster/7001/
    ...
    /usr/app/redis-cluster/7006/

  2. 修改每一份配置文件

    bind 192.168.192.3 //绑定服务器IP地址

    port 7001 //绑定端口号,必须修改,以此来区分Redis实例

    daemonize yes //后台运行

    protected-mode no//关闭保护模式

    databases 1//修改数据库个数为1

    pidfile /usr/app/redis-cluster/7001/redis-7001.pid //修改pid进程文件名,以端口号命名

    logfile /usr/app/redis-cluster/7001/redis.log //修改日志文件名称,以端口号为目录来区分

    dir /usr/app/redis-cluster/7001/ //修改数据文件存放地址,以端口号为目录名来区分(默认当前路径可以不修改)

    cluster-enabled yes //启用集群

    cluster-config-file /usr/app/redis-cluster/7001/nodes-7001.conf //配置每个节点的配置文件,同样以端口号为名称

    cluster-node-timeout 15000 //配置集群节点的超时时间,可改可不改

    appendonly yes //启动AOF增量持久化策略

    appendfsync always //发生改变就记录日志

  3. 将/usr/app/redis/bin/redis-cli 与 redis-server 放到 /usr/app/redis-cluster 下

  4. 将当前redis进程删掉

3.环境安装

redis集群管理工具redis-trib.rb依赖ruby环境,首先需要安装ruby环境:

https://jingyan.baidu.com/article/066074d60111e0c3c21cb0ce.html

  • 安装ruby

    yum -y install ruby ruby-devel rubygems rpm-build //使用yum安装ruby

    ruby -v 系统自带的ruby版本为2.0.0

    yum install centos-release-scl-rh 安装yum源

    yum install rh-ruby24 -y 后面是4是需要安装的版本号

    scl enable rh-ruby24 bash 设置开机自启

    ruby -v 查看ruby版本(2.4.6)

  • 安装redis插件

    gem install redis 安装插件

    删除原有的rdb和aof文件(可以不删除)
    查看一下redis进程,保证没有redis实例在运行
    ps -ef |grep redis

  • 启动6台redis实例

    cd /usr/app/redis-cluster 切换到redis-cluster目录

    ./redis-server ./7001/redis.conf

    ./redis-server ./7002/redis.conf

    ./redis-server ./7003/redis.conf

    ./redis-server ./7004/redis.conf

    ./redis-server ./7005/redis.conf

    ./redis-server ./7006/redis.conf

    ps -ef |grep redis 查看是否启动成功

  • 使用脚本redis-trib.rb(放在redis 源文件当中),进行集群

    cd /usr/app/redis-4.0.9/src

    cp redis-trib.rb /usr/app/redis-cluster/

    cd /usr/app/redis-cluster/

    //搭建集群 replicas 1 代表1台主机有一台从机

    ruby redis-trib.rb create --replicas 1 192.168.192.3:7001 192.168.192.3:7002 192.168.192.3:7006 192.168.192.3:7003 192.168.192.3:7004 192.168.192.3:7005

    //连接服务 -c 表示链接的是集群 -h表示ip -p表示连接的端口号

    ./redis-cli -c -h 192.168.192.3 -p 7005

在创建新的key时候,会先将key进行hash算法,得到hash值,然后对16384进行取模,获得需要执行的端口,会进行重定向到指定的端口

cluster info 获取cluster集群的信息(查看是否出错)
cluster nodes 获取节点信息(主从节点)
//java端连接集群方式
HashSet<HostAndPort> set = new HashSet();
set.add(new HostAndPort("192.168.192.3",7001));
set.add(new HostAndPort("192.168.192.3",7002));
set.add(new HostAndPort("192.168.192.3",7003));
set.add(new HostAndPort("192.168.192.3",7004));
set.add(new HostAndPort("192.168.192.3",7005));
set.add(new HostAndPort("192.168.192.3",7006));
JedisCluster jedisCluster = new JedisCluster(set);
System.out.println(jedisCluster.get("test"));
这篇关于redis(keys命令,持久化,集群,ssm框架整合jedis)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!