redis的主从复制、事务等

Redis笔记:

Redis的五大数据类型:string,Hash,list,set,zset

String:是二进制安全的,意思是redis的string可以包含任何数据类型,比如jpg图片和序列化对象等。一个redis字符串value最多可以是512M

Hash:类似java里面的Map,kv模式不变,v 变成一个键值对形式

List:列表,底层时链表结构

Set:无序无重复,底层用HashTable实现

Zset:有序集合。

Redis的常用命令:

Redis默认有16个库,

select 下标:可以将数据存储到某个库中,也可以进行切换,下标从零开始,eg,select 7

Keys * :显示库中所有的键

Keys k?:?代表一个占位符,此命令表示显示键的第一位时k,第二位任意的所有的键

DBSIZE:显示库中键的数量

Set命令:

格式:set 键 值

Set name xuwenchan

Get 命令

格式: get 键

Eg:get name

FLUSHDB:清空该库中所有的键值对

FLUSHALL:清空所有库中的键值对。16 个库中值全删。

Exists 键:判断某个键是否存在

Move 键 库号:将某个键移到某个库中 eg:move k1 2将k1移动到三号库中

Expire 键 秒数:位给定的key设置过期时间

Ttl 键 :查看还有多少秒过期,-1表示永不过期,-2表示以过期,过期之后就从内存中移除

Type 键:查看key是什么类型

Redis的redis.conf配置文件的常用配置:

下面是redis.conf文件中的一部分的:

Include:可以在这里引入一个或者多个配置文件,分模块开发

格式:include 路径

General部分:(通用常见的标准化配置)

 

 

 

默认的是511

当客户端在一段时间内没有进行任何操作,为了减轻服务器的压力,可以暂时的将对该用户的服务关闭掉,0表示永不关闭,秒为单位

检测是否能够响应,0表示不对其进行检测,60表示每60秒检测一次

 

 

Redis的持久化操作:redis的持久化操作有两种方式,一种是rdb,另一种是aof的方式,

所谓rdb,就是在指定的时间内将内存中的数据集写入内存,对精度要求不高时可以采用rdb方式

什么是fork:

 

Rdb保存的就是dump.rdb文件

配置位置:redis.config文件中

Save 时间 改变

多少时间内有多少次改变就会触发,将内存中的数据保存到硬盘中去

 

Redis如何进行数据恢复?

 

 

 

 

Redis的持久化之aof

通过aof的方式,redis会记录你的所有操作命令在appendonly.aof文件中

Aof保存的是appendonly.aof文件

配置位置:APPEND ONLY MODE

默认的是关掉的,即 appendonly no

如果使用我们要进行开启 即:appendonly yes

Redis可以同时采用rdb和aof模式,rdb和aof可以同时使用,

如果同时使用先加载的时aof模式

使用redis-check-aof --fix appendonly.aof命令,当由于在记录操作命令时候,由于一些不可抗拒的原因造成文件记录失败,通过

此命令可以将appendonly.aof文件中不符合redis命令的信息删除,

从而时redis恢复正常,当redis重新启动的时候会重新读取appendonly.aof文件中的信息

 

 

Redis的rewrite机制:

  1. rewrite是什么?

(2)重写原理

(3)触发机制

Redis会记录上次重写时的aof大小,默认配置是当aof文件大小是上次

Rewrite后大小的一倍且文件大于64M时触发

 

Redis的事务

是什么?

可以一次执行多个命令,本质是一组命令的集合,一个事务中所有的命令都会序列化,按顺序的串行化执行,执行而不会其他命令插入,不许加塞。

能干吗?

一个队列中,一次性,顺序性,排他性的执行一系列命令

Redis事务的常用命令

了解两个命令:

Redis-server /myredis/redis_aof.conf

Redis-cli -p 6379

MULTI:定义一个事务的开始,通常会返回一个ok,下面就是按照redis的命令规范输入一些命令,会返回一个queued,这是一个入队的操作,

Eg:

MULTI

ok

Set k1 v1

queued

Set k2 v2

queued

Set k3 v3

Queued

Exec

Exec:是对事务块中的内容进行提交,相当于commit

放弃事务:

MULTI

OK

SET K1 V1

QUEUED

SET K2 V2

QUEUED

DISCARD

OK

DISCARD:放弃事务

全体连坐:(当一个命令出错之后,提交时事务失败)

MULTI

OK

SET K1 V1

QUEUED

SET K2 V2

QUEUED

GETSET K3 V3(错误的命令)

Error

EXEC(因为事务块中间有命令错误,所以造成此次事务失败)

WATCH监控

 

悲观锁会在每个记录的后面有一个版本号(version)通过判断版本号来实现乐观锁

Watch:

Eg:

Set balance 100

Set dabt 0

Watch balance (开始监听balance,可以理解为记录了balance的值)

MULTI

OK

Decrby balance 20

queued

Incrby dabt 20

Queued

Exec

如果在提交事务之前,通过另外一个线程去修改了balance的值,原来是80,如果数值变化之后再去通过EXEC去提交该事务,就会报错

 

Redis的发布和订阅机制:

是什么?

是进程间的一种消息通讯模式,发布者(pub)发出消息,订阅者(sub)接收消息

命令

  1. 可以一次性订阅多个:subscribe c1 c2 c3
  2. 发布消息 publish c2 hello redis
  3. 订阅多个,通配符*,psubscribe new*
  4. 收取消息,publish new1 redis2018

Redis的主从复制:

什么是redis的主从复制?

也即是我们常说的主从复制,主机数据更新后根据配置和策略自动同步到备机的master/slaver机制,master以写为主,slaver以读为主。

能干什么?

读写分离,容灾恢复。

怎么玩?

 

 

第一种形式(一主二仆)

Info replication:

Slaveof 127.0.0.1 6379:从库去复制主库,只需使用该命令,进行匹配,就能使用redis的语法去得到主库里面的数据

第一种情况:(当主机下线之后)

当主机由于某种原因下线之后, 可以使用备机,但备机里面的数据只有主机下线之前的数据,备机也不会自动成为主机,在主机重新上线备机不下线的情况,备机可以自动重新连接主机,又可以从主机更新数据,并可以访问到主机里面的最近数据。

第二种情况(备机下线,主机不下线)

这种情况,只有通过备机重新上线并重新连接主机时才能访问到主机里面的数据。重新连接主机有两种形式

  1. 命令:slaveof 127.0.0.1 6379(主机的ip及端口)
  2. 通过配置文件中的形式,具体配置如下:

(二)薪火相传

  • 反客为主

使用命令:slaveof no one

解释:当主机下线之后,在备机中输入slaveof no one命令,使备机成为主机

复制原理:

 

哨兵模式:

什么是哨兵模式:

反客为主的自动版本,能够把后台监控主机是否故障,如果故障根据投票数自动将从库转变为主库

怎么玩?

 

 

Sentinel.conf文件的书写

Eg:sentinel monitor host79 127.0.0.1 6379 1

Redis-sentinel是一个命令 后面跟的时sentinel.conf的路径

如果原来的master重新上线,将作为slaver重新连接在主机下面

常用命令

 

 

事务:

Watch

 

主从复制

Public class JedisPoolUtil{

 Private static volatile JedisPool jedisPool=null;

 Private JedisPoolUtil();

 Public static JedisPool getJedisPoolInstance(){

If(jedisPool==null){

  Synchronized(JedisPoolUtil.class){

    If(jedisPool==null){

      JedisPoolConfig poolConfig=new JedisPoolConfig();

      poolConfig.setMaxActive(1000);

      poolConfig.setMaxIdle(32);

      poolConfig.setMaxWait(100*1000);

      poolConfig.setTestOnBorrow(true);

jedisPool=new JedisPool(poolConfig,”127.0.0.1”,6379);

}

}

}

 

Return jedisPool;

}

  Public static void release(JedisPool jedisPool,Jedis jedis){

If(jedis==null){

  jedisPool.returnResourceObject(jedis);

}

}

 

 

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(redis的主从复制、事务等)