1. 首页 > 科技 >

redis客户端有哪些 redis常用客户端

redis集群方案有哪些

rdbcompression yes

Redis数据量日益增大,而且使用的公司越来越多,不仅用于做缓存,同时趋向于存储这块,这样必促使集群的发展,各个公司也在收集适合自己的集群方案,目前行业用的比较多的是下面几种集群架构,大部分都是采用分片技术,解决单实例内存增大带来的一系列问题。

redis客户端有哪些 redis常用客户端redis客户端有哪些 redis常用客户端


。有很多返回整型的Redis命令,比如: INCR 、 LLEN 以及 LASTSAVE 。返回的整型数据范围为有符号的64位整数。

本篇文章简单介绍五种方案:

cluster方案

twemproxy方案

哨兵模式

codis

cluser方案

从redis 3.0版本开始支持redis-cluster集群,redis-cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他节点连接。redis-cluster是一种服务端分片技术。

redis-cluster架构图

redis-cluster特点:

每个节点都和n-1个节点通信,这被称为集群总线(cluster bus)。它们使用特殊的端口号,即对外服务端口号加10000。所以要维护好这个集群的每个节点信息,不然会导致整个集群不可用,其内部采用特殊的二进制协议优化传输速度和带宽。

redis-cluster把所有的物理节点映射到[0,16383]slot(槽)上,cluster负责维护node--slot--value。

集群预分好16384个桶,当需要在redis集群中插入数据时,根据CRC16(KEY) mod 16384的值,决定将一个key放到哪个桶中。

redis-trib.rb脚本(rub语言)为集群的管理工具,比如自动添加节点,规划槽位,迁移数据等一系列作。

整个cluster被看做是一个整体,客户端可连接任意一个节点进行作,当客户端作的key没有分配在该节点上时,redis会返回转向指令,指向正确的节点。

为了增加集群的可访问性,的方案是将node配置成主从结构,即一个主节点,挂n个sle从节点。如果主节点失效,redis cluster会根据选举算法从sle节点中选择一个上升为节点,整个集群继续对外提供服务。

twemproxy方案

twemproxy架构图:

Redis中间件twemproxy是一种利用中间件做分片的技术。twemproxy处于客户端和的中间,将客户端发来的请求,进行一定的处理后(sharding),再转发给后端真正的redis。也就是说,客户端不直接访问redis,而是通过twemproxy中间件间接访问。降低了客户端直连后端的连接数量,并且支持集群水平扩展。

twemproxy中间件的内部处理是无状态的,它本身可以很轻松地集群,这样可以避免单点压力或故障。

twemproxy又称nutcracker,起源于推特系统中redis、memcached集群的轻量级。

Github源码地址(

从上面架构图看到twemproxy是一个单点,很容易对其造成很大的压力,所以通常会结合keepalived来实现twemproy的高可用。这时,通常只有一台twemproxy在工作,另外一台处于备机,当一台挂掉以后,vip自动漂移,备机接替工作。关于keepalived的用法可自行网上查阅资料。

哨兵模式

Sentinel哨兵

Sentinel(哨兵)是Redis的高可用性解决方案:由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主以及这些主下的所有从,并在被监视的主进入下线状态时,自动将下线主属下的某个从升级为新的主。

例如:

在1掉线后:

升级2为新的主:

if (StringUtils.isBlank(topic)){Sentinel的工作方式

如果一个实例距离一次有效回复PING命令的时间超过down-after-milliseconds选项所指定的值,则这个实例会被Sentinel标记为主观下线。

在一般情况下,每个Sentinel会以每10秒一次的频率向它所知的所有Master、Sle发送INFO命令。

当Master被Sentinel标记为客观下线时,Sentinel向下线的Master的所有Sle发送INFO命令的频率会从10秒一次改为每秒一次。

codis

codis是一个分布式的Redis解决方案,由豌豆荚开源,对于上层的应用来说,连接codis proxy和连接原生的redis server没什么明显的区别,上层应用可以像使用单机的redis一样使用,codis底层会处理请求的转发,不停机的数据迁移等工作,所有后边的事情,对于前面的客户端来说是透明的,可以简单的认为后边连接的是一个内存无限大的redis服务。

分区的逻辑在客户端实现,由客户端自己选择请求到哪个节点。方案可参考一致性哈希,这种方案通常适用于用户对客户端的行为有完全控制能力的场景。

总结:没有的方案,只有最合适的方案。

更多Redis相关技术文章,请访问Redis教程栏目进行学习!

Redis模拟多个redis客户端实现功能

转发更佳

1.

1、String【字符串作接口】:

开启redis,我的redis在D盘因此cmd重复开启多个redis客户端

D:

cd D:\Redis

redis-cli.exe -h 127.0.0.1 -p 6379

2.

模拟频道

subscribe channe1 [channel ....] 某一频道

subscribe ja

3.

再开一个redis客户端模拟发布消息

cd D:\Redis

redis-cli.exe -h 127.0.0.1 -p 6379

publish ja woyongyuanaija

此时可以看到两个了频道的客户端均能收到消息

在jedis封装好的方法中很jedis.close();明显的就可以看到对应的类

点进去看JedisPubSub类的源码

新建一个类去继承JedisPubSub类 重写onMessage方法 输出两个参数

再新建一个项目 去发布消息 可以看到了的可以收到消息。

redis的基本数据结构有哪些,都有什么应用

,这被称作 NULL Bulk String ,当回复NULL Bulk String时,客户端库的API不应该返回空的字符串,而是返回nil对象。

Redis五种基本数据结构:

Stri验证 RDB 文件是否被加载ng——字符串

List——列表(链表)

Hash——哈希(字典)

Set——

Sorted Set——有序 Redis五种数据结构作接口详情:

可以是字符串,整数或者浮点数,对整个字符串或者字符串中的一部分执行作,对整个整数或者浮点执行自增(increment)或者自减(decrement)作。

2、list【列表作接口】:

一个链表,链表上的每个节点都包含了一个字符串,虫链表的两端分别表示有回复,但长度为0。推入或者弹出元素,根据偏移量对链表进行修剪(trim),读取单个或者多个元素,根据值查找或者移除元素。

3、hash【字典作接口】:

包含键值对无序散列表,添加,获取,移除当键值对,获取所有键值对。

4、set【】:

包含字符串的无序收集器(unordered collection)、并且被包含的每个字符串都是的。添加,获取,移除单个元素,检查一个元素是否存在于中,计算交集,并集,集,从里面随机获取元素。

5、zset【无序】:

字符串成员(member)与浮点数分值(score)之间的有序映射,元素的排列顺序由分值的大小决定。添加,获取,删除单个元素,根据分值范围(range)或者成员来获取元素。

redis客户端作redis是阻塞的吗

}p:2ublic static void main(String[] args) {

首先,客户端 socket 会被设置为非阻塞模式,因为 Redis 在网络处理上采用的是非阻塞多路复用模型。

然后为这个so客户端实现可能会针对不同的错误返回不同类型的异常,或者通过直接将错误名称作为字符串提供给调用者来提供捕获错误的通用方法。cket 设置 TCP_NODELAY 属性,禁用 Nagle 算法

然后创建一个 readable 的文件用于这个客户端 socket 的数据发送!

redis发布什么用

每个软件的常规作有两种,一种是使用,另一种就是调优,对于 Redis 来说也是一样。关于 Redis 调优的问题一般会出现在 Redis 面试的后期,以此来考察面试者对于 Redis 的实际应用掌握,以及对于 Redis 高性能的追求与理解,因此本文就来重点的聊一聊关于 Redis 调优的相关问题。

Redis 发布(pub/sub)是一种消息通信模式:发送者(pub)发送消息,者(sub)接收消息。

若没有足够数量的Sentinel同意Master已经下线,Master的客观下线状态就会被移除。若Master重新向Sentinel的PING命令返回有效值,Master的主观下线状态就会被移除。

Redis 客户端可以任意数量的频道。 (学习:Redis视频教程)

Redis提供了发布功能,可以用于消息的传输,Redis的发布机制包括三个部分,发布者,者和Channel。

发布者和者都是Redis客户端,Channel则为Redis端,发布者将消息发送到某个的频道,了这个频道的者就能接收到这条消息。Redis的这种发布机制与基于主题的发布类似,Channel相当于主题。

1,引入Jedis

redis.clients

jedis

2.9.0

2,具体实现代码

package com.hcmony.sword.redis;

import org.apachemons.lang3.StringUtils;

import redis.clients.jedis.Jedis;

import redis.clients.jedis.JedisPool;

import redis.clients.jedis.JedisPubSub;

/

Shenjue.ja基本描述

@author hcmony

@since V1.0.0, 2019/05/06 20:07

/

public class RedisMQ {

private static final String TOPIC="TOPIC";

public RedisMQ(JedisPool jedisPool) {

this.jedisPool = jedisPool;

}/

发布消息

@param topic

@param messge

/

Jedis jedis = null;

topic=TOPIC;

}try {

jedis.publish(topic,messge);

}finalRedis有特定的错误类型,与Simple Strings相似,不同的是个字符是减号 - 而不是加号 + ,二者真正不同的是,客户端将错误视为异常,而构成Error类型的字符串就是错误消息本身。ly {

if (null != jedis) {

}/

消息

@param topic

@param jedisPubSub

/

public void subscribe(String topic,JedisPubSub jedisPubSub){

Jedis jedis = null;

topic=TOPIC;

}try {

jedis.subscribe(jedisPubSub,topic);

}finally {

if (null != jedis) {

//默认连接本地redis,

// loclhost:6379

JedisPool jedisPool = new JedisPool();

RedisMQ publish = new RedisMQ(jedisPool);

new Thread(new Runnable() {

@Override

public void run() {

publish.subscribe("PID",new MyjedisPubSub());

}}).start();

for (int i=0;i<100;i++){

public static class MyjedisPubSub extends JedisPubSub {

@Override

public void onMessage(String channel, String message) {

System.out.println("-------channel is "+channel+" message is "+message);

}更多Redis相关技术文章,请访问Redis数据库使用入门教程栏目进行学习!

异步ja redis客户端有什么用

jedis = jedisPool.getResource();

1.支持异步调用,在getA之后不用等结果,能继续getB,getC,等等。等要做的redis作都做完了,再来检查结果。

可以看到是一个抽象类 方法空实现 那就根据方法名来试一下吧

2.单连接,支持断线重连。客户端和任意一个redis只建立一个连接。因为是异步调用,没必要建立更多连接。

它的默认值是 yes 表示开启 RDB 文件压缩,Redis 会采用 LZF 算法进行压缩。如果不想消耗 CPU 性能来进行文件压缩的话,可以设置为关闭此功能,这样的缺点是需要更多的磁盘空间来保存文件。

3.底层支持pipeline,无论是异步调用,还是阻塞调用,底层使用的都有概率使用到pipeline。对pipeline的支持是在通信层做的,所以无论哪种调用都是隐性的使用pipeline。但是,连续的异步作,本线程内的作就有可能使用pipeline。而同步调用,则一般是线程之间的作使用pipeline。更重要的是,这一切都是在底层完成的,我们在调用redis api的时候根本不用管这些,只管调用即可。只不过是建议采用连续的异步作,因为这样效率。

4.支持shard模式。采用一致性算法的分片。

5.shard模式下仍然支持pipeline。因为对pipeline的支持是做在通信层的,所以,在任何模式下都支持pipeline。

玩转Redis的高可用(主从、哨兵、集群)

节点的fail是通过集群中超过半数的节点检测失效时才生效。

Redis 提供了 Redis 提供了(replication)功能,当一台 redis 数据库中的数据发生了变化,这个变化会被自动地同步到其他的 redis 机器上去。

Redis 多机器部署时,这些机器节点会被分成两类,一类是主节点( 节点),一类是从节点(sle 节点)。一般 主节点可以进行读、写作 ,而 从节点只能进行读作 。一个主节点可以有多个从节点,但是一个从节点只会有一个主节点,也就是所谓的 一主多从结构 。

· 支持主从,主机会自动将数据同步到从机,可以进行读写分离;

· Master 是以非阻塞的方式为主 Sles 提供服务。所以在 Master-Sle 同步期间,客户端仍然可以提交查询或修改请求;

· Sle 同样是以非阻塞的方式完成数据同步。在同步期间,如果有客户端提交查询请求,Redis 则返回同步之前的数据。

· Redis 不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的 IP 才能恢复;

· 主机宕机,宕机前有部分数据未能及时同步到从机,切换 IP 后面还会引入数据不一致的问题,降低了系统的可用性;

· Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂;

· Redis 的主节点和从节点中的数据是一样的,降低的内存的可用性

实际生产中,我们优先考虑哨兵模式。这种模式下, 宕机,哨兵会自动选举 并将其他的 sle 指向新的 。

在主从模式下,redis 同时提供了哨兵命令 redis-sentinel ,哨兵是一个的进程,作为进程,它会运行。其原理是哨兵进程向所有的 redis 机器人发送命令,等待 Redis 响应,从而运行的多个 Redis 实例。一般为了便于决策选举,使用 奇数个哨兵 。多个哨兵构成一个哨兵集群,哨兵直接也会相互通信,检查哨兵是否正常运行,同时发现 战机哨兵之间会进行决策选举新的

哨兵模式的作用:

· 通过发送命令,让 Redis 返回其运行状态,包括主和从;

· 然而一个哨兵进程对 Redis 进行,也可能会出现问题,为此,我们可以使用多个哨兵进行。各个哨兵之间还会进行,这样就形成了多种哨兵模式。

哨兵很像 kafka 集群中的 zookeeper 的功能。

· 哨兵模式是基于主从模式的,所有主从的优点,哨兵模式都具有。

· 主从可以自动切换,系统更健壮,可用性更高。

· 具有主从模式的缺点,每台机器上的数据是一样的,内存的可用性较低。

· Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。

Redis 集群模式本身没有使用一致性 hash 算法,而是使用 slots 插槽 。

Redis 哨兵模式基本已经可以实现高可用,读写分离 ,但是在这种模式下每台 Redis 都存储相同的数据,很浪费内存,所以在 redis3.0 上加入了 Cluster 集群模式,实现了 Redis 的分布式存储,对数据进行分片,也就是说每台 Redis 节点上存储不同的内容;每个节点都会通过集群总线(cluster bus),与其他的节点进行通信。 通讯时使用特殊的端口号,即对外服务端口号加 10000。例如如果某个 node 的端口号是 6379,那么它与其它 nodes 通信的端口号是 16379。nodes 之间的通信采用特殊的二进制协议。

对客户端来说,整个 cluster 被看做是一个整体,客户端可以连接任意一个 node 进行作,就像作单一 Redis 实例一样, 当客户端作的时候 key 没有分配到该 node 上时,Redis 会返回转向指令,指向正确的 node,这有点儿像浏览器页面的 302 redirect 跳转。

根据,集群部署至少要 3 台以上的 节点,使用 3 主 3 从六个节点的模式。

在 Redis 的每一个节点上,都有这么两个东西, 一个是插槽(slot),它的的取值范围是:0-16383, 可以从上面 redis-trib.rb 执行的结果看到这 16383 个 slot 在三个 上的分布。还有一个就是 cluster,可以理解为是一个集群管理的插件,类似的哨兵。

当我们的存取的 Key 到达的时候,Redis 会根据 crc16 的算法对计算后得出一个结果,然后把结果和 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取作。

为了保证高可用, redis-cluster 集群引入了主从模式 ,一个主节点对应一个或者多个从节点。当其它主节点 ping 主节点 1 时,如果半数以上的主节点与 1 通信超时,那么认为 1 宕机了,就会启用 1 的从节点 sle 1,将 sle 1 变成主节点继续提供服务。

如果 1 和它的从节点 sle 1 都宕机了,整个集群就会进入 fail 状态,因为集群的 slot 映射不完整。 如果集群超过半数以上的 挂掉,无论是否有 sle,集群都会进入 fail 状态。

redis-cluster 采用去中心化的思想 ,没有中心节点的说法,客户端与 Redis 节点直连,不需要中间层,客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。

对 redis 集群的扩容就是向集群中添加机器,缩容就是从集群中删除机器,并重新将 16383 个 slots 分配到集群中的节点上(数据迁移)。

扩缩容也是使用集群管理工具 redi哨兵模式: 节点挂掉后,哨兵进程会主动选举新的 ,可用性高,但是每个节点存储的数据是一样的,浪费内存空间。数据量不是很多,集群规模不是很大,需要自动容错容灾的时候使用。s-tri.rb。

扩容时,先使用 redis-tri.rb add-node 将新的机器加到集群中,这是新机器虽然已经在集群中了,但是没有分配 slots,依然是不起做用的。在使用 redis-tri.rb reshard 进行分片重哈希(数据迁移),将旧节点上的 slots 分配到新节点上后,新节点才能起作用。

缩容时,先要使用 redis-tri.rb reshard 移除的机器上的 slots,然后使用 redis-tri.rb add-del 移除机器。

采用去中心化思想,数据按照 slot 存储分布在多个节点,节点间数据共享,可动态调整数据分布;

可扩展性:可线性扩展到 1000 多个节点,节点可动态添加或删除;

高可用性:部分节点不可用时,集群仍可用。通过增加 Sle 做 standby 数据副本,能够实现故障自动 failover,节点之间通过 gossip 协议交换状态信息,用投票机制完成 Sle 到 Master 的角色提升;

降低运维成本,提高系统的扩展性和可用性。

1.Redis Cluster 是无中心节点的集群架构,依靠 Goss 协议(谣言传播)协同自动化修复集群的状态。但 GosSIp 有消息延时和消息冗余的问题,在集群节点数量过多的时候,节点之间需要不断进行 PING/PANG 通讯,不必须要的流量占用了大量的网络资源。虽然 Reds4.0 对此进行了优化,但这个问题仍然存在。

2.数据迁移问题

Redis Cluster 可以进行节点的动态扩容缩容,这一过程,在目前实现中,还处于半自动状态,需要人工介入。在扩缩容的时候,需要进行数据迁移。

而 Redis 为了保证迁移的一致性,迁移所有作都是同步作 ,执行迁移时,两端的 Redis 均会进入时长不等的阻塞状态,对于小 Key,该时间可以忽略不计,但如果一旦 Key 的内存使用过大,的时候会接触发集群内的故障转移,造成不必要的切换。

主从模式: 节点挂掉后,需要手动指定新的 ,可用性不高,基本不用。

集群模式:数据量比较大,QPS 要求较高的时候使用。 Redis Cluster 是 Redis 3.0 以后才正式推出,时间较晚,目前能证明在大规模生产环境下成功的案例还不是很多,需要时间检验。

redis支持的数据类型有哪些

publish.publish("PID","messge"+i);

redis支持的数据类型有String、Hash、List、Spublic void publish(String topic ,String messge){et、Zset。

2、Hash(哈希类型):类似于如果一个Master被标记为主观下线,则正在监视这个Master的所有Sentinel要以每秒一次的频率确认Master的确进入了主观下线状态。一个数组,其中每个元素都是一个field和value的键值对,可以对整个哈希表或单个元素进行增删查改等作。

3、List(列表类型):一个链表,链表中的每个节点都包含一个字符串,可以对链表头尾进行pop、push等作。

4、Set(类型):一个类似于列表的无序,支持添加、删除、查找等作,中每个元素都是的。

Redis的功能

这是一个高性能的key—value数据库,redis的出现,很大程度上,是补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它一共提供了很多客户端,如Ja,C/C++,C#,PHP,JaScript,Perl,Object-C,Python等,使用很方便。

Redis支持主从同步,数据可以从主向任意数量的从上同步,从可以是关联其他从的主。这使得Redis可执行单层树,存盘可以有意无意的对数据进行写作。由于完全实现了发布/机制,使得从数据库在任何地方同步树时,可一个频道并接收主完整的消息发布记录,同步对读取作的可扩展性和数据冗余很有帮助。

Redis持久化的几种方式——RDB深入解析

点击上方“Ja中文社群”,选择“设为星标”

终身学习者,以编程为乐!

Redis 的读写都是在内存中,所以它的性能较高,但在内存中的数据会随着的重启而丢失,为了保证数据不丢失,我们需要将内存中的数据存储到磁盘,以便 Redis 重启时能够从磁盘中恢复原有的数据,而整个过程就叫做 Redis 持久化。 Redis 持久化也是 Redis 和 Memcached 的主要区别之一,因为 Memcached 不具备持久化功能。

1.持久化的几种方式

Redis 持久化拥有以下三种方式:

快照方式(RDB, Redis DataBase)将某一个时刻的内存数据,以二进制的方式写入磁盘;

文件追加方式(AOF, Append Only File),记录所有的作命令,并以文本的形式追加到文件中;

混合持久化方式,Redis 4.0 之后新增的方式,混合持久化是结合了 RDB 和 AOF 的优点,在写入的时候,先把当前的数据以 RDB 的形式写入文件的开头,再将后续的作命令以 AOF 的格式存入文件,这样既能保证 Redis 重启时的速度,又能简单数据丢失的风险。

因为每种持久化方案,都有特定的使用场景,让我们先从 RDB 持久化说起吧。

2.RDB

RDB(Redis DataBase)是将某一个时刻的内存快照(Snapshot),以二进制的方式写入磁盘的过程。

3.持久化触发

RDB 的持久化触发方式有两类:一类是手动触发,另一类是自动触发。

1)手动触发

手动触发持久化的作有两个:se 和 bgse ,它们主要区别体现在:是否阻塞 Redis 主线程的执行。

① se 命令

在客户端中执行 se 命令,就会触发 Redis 的持久化,但同时也是使 Redis 处于阻塞状态,直到 RDB 持久化完成,才会响应其他客户端发来的命令,所以在生产环境一定要慎用。

se 命令使用如下: 从可以看出,当执行完 se 命令之后,持久化文件 dump.rdb 的修改时间就变了,这就表示 se 成功的触发了 RDB 持久化。se 命令执行流程,如下图所示:

② bgse 命令

bgse(background se)既后台保存的意思, 它和 se 命令的区别就是 bgse 会 fork() 一个子进程来执行持久化,整个过程中只有在 fork() 子进程时有短暂的阻塞,当子进程被创建之后,Redis 的主进程就可以响应其他客户端的请求了,相对于整个流程都阻塞的 se 命令来说,显然 bgse 命令更适合我们使用。bgse 命令使用,如下图所示: bgse 执行流程,如下图所示:

2)自动触发

① se m n

se m n 是指在 m 秒内,如果有 n 个键发生改变,则自动触发持久化。参数 m 和 n 可以在 Redis 的配置文件中找到,例如, se601 则表明在 60 秒内,至少有一个键发生改变,就会触发 RDB 持久化。自动触发持久化,本质是 Redis 通过判断,如果满足设置的触发条件,自动执行一次 bgse 命令。注意:当设置多个 se m)结尾。 n 命令时,满足任意一个条件都会触发持久化。例如,我们设置了以下两个 se m n 命令:

se 60 10

se 600 1

当 60s 内如果有 10 次 Redis 键值发生改变,就会触发持久化;如果 60s 内 Redis 的键值改变次数少于 10 次,那么 Redis 就会判断 600s 内,Redis 的键值是否至少被修改了一次,如果满足则会触发持久化。

② flushall

flushall 命令用于清空 Redis 数据库,在生产环境下一定慎用,当 Redis 执行了 flushall 命令之后,则会触发自动持久化,把 RDB 文件清空。执行结果如下图所示: ③ 主从同步触发

在 Redis 主从中,当从节点执行全量作时,主节点会执行 bgse 命令,并将 RDB 文件发送给从节点,该过程会自动触发 Redis 持久化。

4.配置说明

合理的设置 RDB 的配置,可以保障 Redis 高效且稳定的运行,下面一起来看 RDB 的配置项都有哪些?

RDB 配置参数可以在 Redis 的配置文件中找见,具体内容如下:

# RDB 保存客户端与redis节点直连,不需要连接集群所有的节点,连接集群中任何一个可用节点即可。的条件

se

9001

se

30010

se

6010000

# bgse 失败之后,是否停止持久化数据到磁盘,yes 表示停止持久化,no 表示忽略错误继续写文件。

stop-writes-on-bgse-error yes

# RDB 文件压缩

# 写入文件和读取文件时是否开启 RDB 文件检查,检查是否有无损坏,如果在启动是检查发现损坏,则停止启动。

rdbchecksum yes

# RDB 文件名

dbfilename

dump

.rdb

# RDB 文件目录

dir ./

其中比较重要的参数如下列表:

① se 参数

它是用来配置触发 RDB 持久化条件的参数,满足保存条件时将会把数据持久化到硬盘。默认配置说明如下:

se 900 1:表示 900 秒内如果至少有 1 个 key 值变化,则把数据持久化到硬盘;

se 300 10:表示 300 秒内如果至少有 10 个 key 值变化,则把数据持久化到硬盘;

se 60 10000:表示 60 秒内如果至少有 10000 个 key 值变化,则把数据持久化到硬盘。

③ rdbchecksum 参数

它的默认值为 yes 表示写入文件和读取文件时是否开启 RDB 文件检查,检查是否有无损坏,如果在启动是检查发现损坏,则停止启动。

5.配置查询

Redis 中可以使用命令查询当前配置参数。查询命令的格式为:configgetxxx ,例如,想要获取 RDB 文件的存储名称设置,可以使用 configgetdbfilename ,执行效果如下图所示: 查询 RDB 的文件目录,可使用命令 configgetdir ,执行效果如下图所示:

6.配置设置

设置 RDB 的配置,可以通过以下两种方式:

手动5、Zset(有序类型):也是一个无序,与set不同的是每个元素都会关联一个分数,分数可以让中的元素按照一定规则排序,可以对中元素的分数进行增减等作。修改 Redis 配置文件;

使用命令行设置,例如,使用 configsetdir"/usr/data" 就是用于修改 RDB 的存储目录。

注意:手动修改 Redis 配置文件的方式是全局生效的,即重启 Redis 设置参数也不会丢失,而使用命令修改的方式,在 Redis 重启之后就会丢失。但手动修改 Redis 配置文件,想要立即生效需要重启 Redis ,而命令的方式则不需要重启 Redis 。

小贴士:Redis 的配置文件位于 Redis 安装目录的根路径下,默认名称为 redis.conf。

7.RDB 文件恢复

当 Redis 启动时,如果 Redis 根目录存在 RDB 文件 dump.rdb,Redis 就会自动加载 RDB 文件恢复持久化数据。如果根目录没有 dump.rdb 文件,请先将 dump.rdb 文件移动到 Redis 的根目录。

Redis 在启动时有日志信息,会显示是否加载了 RDB 文件,我们执行 Redis 启动命令:src/redis-server redis.conf ,如下图所示: 从日志上可以看出, Redis 服务在启动时已经正常加载了 RDB 文件。

小贴士:Redis 在载入 RDB 文件期间,会一直处于阻塞状态,直到载入工作完成为止。

8.RDB 优缺点

1)RDB 优点

RDB 的内容为二进制的数据,占用内存更小,更紧凑,更适合做为备份文件;

RDB 对灾难恢复非常有用,它是一个紧凑的文件,可以更快的传输到远程进行 Redis 服务恢复;

RDB 可以更大程度的提高 Redis 的运行速度,因为每次持久化时 Redis 主进程都会 fork() 一个子进程,进行数据持久化到磁盘,Redis 主进程并不会执行磁盘 I/O 等作;

与 AOF 格式的文件相比,RDB 文件可以更快的重启。

2)RDB 缺点

因为 RDB 只能保存某个时间间隔的数据,如果中途 Redis 服务被意外终止了,则会丢失一段时间内的 Redis 数据;

RDB 需要经常 fork() 才能使用子进程将其持久化在磁盘上。如果数据集很大,fork() 可能很耗时,并且如果数据集很大且 CPU 性能不佳,则可能导致 Redis 停止为客户端服务几毫秒甚至一秒钟。

9.禁用持久化

禁用持久化可以提高 Redis 的执行效率,如果对数据丢失不敏感的情况下,可以在连接客户端的情况下,执行 configsetse"" 命令即可禁用 Redis 的持久化,如下图所示: 10.小结

通过本文我们可以得知,RDB 持久化分为手动触发和自动触发两种方式,它的优点是存储文件小,Redis 启动时恢复数据比较快,缺点是有丢失数据的风险。RDB 文件的恢复也很简单,只需要把 RDB 文件放到 Redis 的根目录,在 Redis 启动时就会自动加载并恢复数据。

11.思考题

如果 Redis CPU 占用过高,可能是什么原因导致的?

欢迎各位读者在评论区,写下自己的。

【END】

关注下方二维码,更多精彩内容 老王著

稀罕作者

Redis持久化的几种方式——RDB深入解析

标签:创建读取文件选择手动err注意验证备份文件编程

redisclient命令行在那里打

如果想要传输二d:进制安全的字符串,请使用Bulk Strings替代。

客户端信息。Redis是Redis客户端的GUI工具,命令行可以在客户端信息打。redis是典型的一对多的应用程序一个可以与多个客户端连接。

3.”:”号开头表示一个整数回复。 如”:0\r\n”

Redis系列篇之SPEC协议

}}

Redis客户端使用被称为 RESP(Redis序列化协议) 的协议与Redis进行通讯。虽然该协议是专门为Redis设计的,但它同样可以被用于其他客户端/的软件项目。

1、String(字符串类型):可以是普通字符串,也可以是整数或浮点数值。可以设置过期时间;可以对字符串进行append、get、set、incr、decr等作。

RESP 是以下几点的折中方案:

RESP 可以序列化诸如整型、字符串和数组等不同的数据类型,还有一个特定的错误类型。请求以字符串数组的形式由客户端发送到Redis,字符串数组表示需要执行的命令。Redis用特定于命令的数据类型回复。

RESP 是二进制安全的,不需要处理从一个进程传输到另一个进程的批量数据,因为它使用长度前缀来传输批量数据。

注意: 这里描述的协议仅用于客户端/通信,Redis集群使用不同的二进制协议在节点之间交换信息。

客户端通过创建端口号为6379的TCP来连接Redis。

虽然 RESP 在技术上是非TCP特定的,但该协议仅用于Redis上下文的(或者等效的面向流的连接,如Unix套接字)TCP连接。

Redis接收由不同参数组成的命令。一旦命令被接收,将会被执行并且发送一个回复给客户端。

这可能是最简单的模型,然而,有两个例外:

除了这两种例外,Redis协议是一种简单的请求-应答协议。

Redis RESP 协议在v1.2版本中介绍,但是到v2.0才变为与通信的标准。

RESP 协议支持以下数据类型: Simple Strings(简单字符串),Errors(错误),Integers(整型),Bulk Strings(批量字符串)以及Arrays(数组)。

Redis通过以下方式将 RESP 用作请求-应答协议:

在 RESP 中,个字节决定了数据类型:

在 RESP 中,协议不同部分总是以

(CRLF)结尾。

RESP 使用特殊的组合表示空的Bulk Strings或者空的Arrays: $-1

表示空的Bulk Strings, -1

表示空的Arrays,需要注意的是: $0

与 0

Simple Strings(简单字符串)的编码方式为:一个 + 号在最前面,后面跟着一个不能包含CR或者LF字符的字符串(即不允许换行符),并且以CRLF(

当Redis以简单字符串回复时,客户端库应该返回 + 号后面个字符后面的所有字符串(不包括CRLF字节)。

错误类型的基本格式为:

-Error message

只有当发生错误时才会回复错误,比如你想要在错误的数据类型上执行命令,或者命令根本不存在。客户端收到Error回复时应该抛出异常。

下面是错误回复的例子:

- 号到后面个空格或者新行的个单词表示返回的错误类型,这只是Redis使用的约定,而不是 RESP 错误格式的一部分。

比如, ERR 是一般错误,但是 WRONGTYPE 是一个更具体的错误,暗示客户端尝试执行应对错误类型的作。这被称为 错误前缀 ,是一种允许客户端了解返回的错误类型而无需检查确切错误消息的方法。

但是不应将此类功能视为至关重要,因为它很少有用,并且有限的客户端实现可能会简单地返回通用错误条件,例如false

这种类型只是一个以CRLF结尾的字符串,表示一个整数,前缀为 : ,比如: :0

和 :1000

整型回复同样可以用来表示true或者false,比如 EXISTS 或者 SISMEMBER 将会返回1表示true,0表示false。

其他返回整型的命令: SETNX 、 DEL 、 EXISTS 、 INCR 、 INCRBY 、 DECR 、 DECRBY 、 DBSIZE 、 LASTSAVE 、 RENAMENX 、 MOVE 、 LLEN 、 SADD 、 SREM 、 SISMEMBER 、 SCARD 。

Bulk Strings被用来表示单个的长度512MB的二进制安全字符串。

Bulk Strings编码方式为:

所以,字符串 hello 被编码为: $5

hello

一个空字符串被编码为: $0

RESP Bulk Strings也可用特殊格式表示不存在(NULL),在这种格式中,长度为-1,没有数据: $-1

客户端使用RESP Arrays发送命令到。同样,某些返回元素给客户端的命令使用RESP数组作为回复,比如: LRANGE 命令。RESP Arrays以下面的格式发送:

所以,空数组编码为: 0

包含"hello"和"world"两个元素的RESP数组被编码为: 2

$5

hello

$5

world

如你所见, CRLF 前缀后面,组成数组的其他数据类型只是一个接一个的连接起来,比如一个由3个整型构成的Array编码结果为: 3

:1

:3

Array可以包含不同的数据类型,比如一个有4个整型和一个批量字符串组成的Array编码为:(为了直观,以换行的形式展现)

行 5Simple Strings(简单字符串)以最小的开销传输非二进制安全的字符串。例如:很多Redis命令执行成功后的回复只是 OK , RESP 简单字符串将以5个字节编码: +OK

为了表示后面还有5个回复,然后再读取后面的5个数组元素。

值为NULL的数组也存在(通常使用NULL Bulk String,由于历史原因,NULL存在两种格式)。比如 BLPOP 超时时将会返回一个长度为-1的NULL Array: -1

上面的编码结果包含两个元素的数组,个元素由(1,2,3)构成的子数组,第二个元素由一个Bulk String(+Hello)和一个Error(-World)组成的数组。

一个Array的单个元素可能为NULL。这在Redis回复中用来表示这些元素丢失而不是空字符串。当 SORT 命令使用 GET pattern 子命令并且key缺失时,将会发生这种情况。一个包含NULL元素的数组回复为:

上面的编码解析结果为:["hello", nil, "world"]

可以根据上面几部分的介绍来编写Redis客户端,同时进一步了解客户端和之间的交互是如何工作的。

所以,一种典型的交互场景可能如下:

为了获取存储在 mylist 中的列表的长度,客户端发送命令 LLEN mylist 到,然后回复客户端一个整型回复:

protocol-spec

Redis系列篇之SPEC协议

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 12345678@qq.com 举报,一经查实,本站将立刻删除。

联系我们

工作日:9:30-18:30,节假日休息