介绍

Redis是一个开源的内存中键值数据存储。它最受追捧的功能之一是的支持:任何Redis服务器都可以将其数到任意数量的副本中,从而实现高读取可伸缩性和强大的数据冗余。此外,Redis旨在允许许多客户端(默认情况下最多10000个)连接数据并与数据交互,因此对于许多用户需要访问同一数据集的情况而言,它是一个不错的选择。

本教程介绍了用于管理Redis客户端和副本的命令。

如何使用本指南

本指南以备有完整示例的备忘单形式编写。我们鼓励您跳至与您要完成的任务相关的任何部分。

本指南中显示的命令已在运行Redis版本的Ubuntu 18.04服务器上进行了测试 4.0.9。要设置类似的环境,您可以按照我们的指南如何在Ubuntu 18.04上安装和保护Redis的步骤1进行操作。我们将通过使用Redis命令行界面运行它们来演示这些命令的行为。请注意,如果您使用其他Redis界面(例如Redli),则某些命令的确切输出可能会有所不同。redis-cli

另外,您可以提供一个托管的Redis数据库实例来测试这些命令,但是请注意,根据数据库提供者所允许的控制级别,本指南中的某些命令可能无法按所述方式工作。要配置DigitalOcean托管数据库,请遵循我们的托管数据库产品文档。然后,您必须 安装Redli  设置TLS隧道才能通过TLS连接到托管数据库。

注意: Redis项目在其文档和各种命令中使用术语“主”和“从”来标中的不同角色,尽管该项目的参与者正在采取措施在不引起兼容性问题的情况下更改此语言。 。DigitalOcean通常更喜欢使用替代术语“主要”和“副本”。

本指南将在可能的情况下默认为“主要”和“副本”,但请注意,在某些情况下,不可避免地会出现“主”和“从”这两个术语。

管理副本

Redis最具特色的功能之一是其内置功能。使时,Redis创建主实例的精确副本。这些辅助实例在它们的连接断开时会随时重新连接到主要实例,并且始终旨在保留主要实例的精确副本。

如果不确定当前连接的Redis实例是主实例还是副本,则可以通过运行以下role命令进行检查:

  * role 

如果您使用Redis Sentinel,则此命令将返回masterslave,或者可能返回。sentinel

要将Redis实例动态指定为另一个实例的副本,请运行replicaof命令。此命令将预期的主服务器的主机名或IP地址和端口作为参数:

  * replicaof hostname_or_IP port 

如果服务器已经是另一台主服务器的副本,它将停旧服务器,并立即开始与新服务器同步。它还将丢弃旧数据集。

要将副本提升回主副本,请运行以下replicaof命令:

  * replicaof no one 

这将阻止实主服务器,但不会丢弃的数据集。在原始主数据库失败的情况下,此语法很有用。在replicaof no one发生故障的主数据库的副本上运行后,以前的副本可以用作新的主数据库,并拥有自己的副本作为故障保护。

注意:在版本5.0.0之前,Redis包括此命令的一个版本slaveof

管理客户

一个客户是任何机器或软件连接到服务器才能访问服务。Redis附带了一些命令,可帮助跟踪和管理客户端连接。

client list命令返回一组有关当前客户端连接的可读信息:

  * client list 


Output

"id=18165 addr=[2001:db8:0:0::12]:47460 fd=7 name=jerry age=72756 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=ping id=18166 addr=[2001:db8:0:1::12]:47466 fd=8 name= age=72755 idle=5 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=info id=19381 addr=[2001:db8:0:2::12]:54910 fd=9 name= age=9 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 obl=0 oll=0 omem=0 events=r cmd=client " 

以下是每个字段的含义:

  • id:唯一的64位客户端ID
  • name:客户端连接的名称,由先前的client setname命令定义
  • addr:客户端连接的地址和端口
  • fd:与客户端所连接的套接字相对应的文件描述符
  • age:客户端连接的总时长,以秒为单位
  • flags:一组一个或多个单字符标志,它们提供有关客户端的更详细的详细信息;有关更多详细信息,请参见client list命令文档
  • db:客户端连接到的当前数据库ID号(可以从015
  • sub:客户端订阅的频道数
  • psub:客户端的模式匹配订阅数
  • mutli:客户端已在事务中排队的命令数(将显示-1客户端是否尚未开始事务或0是否仅已开始事务且未排队任何命令)
  • qbuf:客户端的查询缓冲区长度,0表示它没有待处理的查询
  • qbuf-free:客户端查询缓冲区中的可用空间量,0表示查询缓冲区已满
  • obl:客户端的输出缓冲区长度
  • oll:客户端的输出列表的长度,当客户端的缓冲区已满时,将在其中排队答复
  • omem:客户端的输出缓冲区使用的内存
  • events:客户端的文件描述符事件,可以是r“可读”,w“可写”或两者兼有
  • cmd:客户端运行的最后一条命令

设置客户端名称对于调试使用Redis的任何应用程序中的连接泄漏都很有用。每个新连接都将在开始时没有分配的名称,但是client setname可用于为当前客户端连接创建一个新连接。尽管Redis通常将字符串长度限制为512 MB,但是对客户端名称的长度没有限制。但是请注意,客户端名称不能包含空格:

  * client setname elaine 

要检索客户端连接的名称,请使用以下client getname命令:

  * client getname 


Output

"elaine" 

要获取客户端的连接ID,请使用以下client id命令:

  * client id 


Output

(integer) "19492" 

Redis客户端ID永远不会重复,并且会单调递增。这意味着,如果一个客户端的ID大于另一个客户端,则它是在以后的时间建立的。

阻止客户端并关闭客户端连接

系统通常被描述为_同步_或_异步_。在同中,每当客户端添加或更改数据时,客户端都必须从一定数量的副本中收到某种确认,以使更改注册为已提交。这有助于防止节点发生数据冲突,但这要付出一定的等待时间,因为客户端必须等待执行另一项操作,直到它从一定数量的副本中收到回音。

另一方面,在异中,一旦将数据写入本地存储,客户端就会看到确认操作已完成的确认。但是,这与副本实际写入数据之间可能会有时滞。如果其中一个副本在写入更改之前失败,则该写入将永远丢失。因此,尽管异允许客户端继续执行操作而没有等待副本引起的延迟,但它可能导致节点之间的数据冲突,并且可能需要数据库管理员方面的额外工作来解决这些冲突。

由于专注于性能和低延迟,Redis默认情况下实现异。但是,您可以使用该wait命令模拟同。wait在指定的时间段(以毫秒为单位)内阻止当前客户端连接,直到所有先前的写命令成功传输并被指定数量的副本接受为止。此命令使用以下语法:

  * wait number_of_replicas number_of_milliseconds 

例如,如果要在30毫秒的超时时间内至少3个副本注册所有先前的写入操作之前阻止客户端连接,则wait语法应如下所示:

  * wait 3 30 

wait命令返回一个整数,该整数表示已确认写入命令的副本数,即使并非每个副本都这样做:

Output

2 

要取消阻止以前通过waitbrpop,或)xread命令阻止的客户端连接,可以client unblock使用以下语法运行命令:

  * client unblock client_id 

要暂时挂起当前连接到Redis服务器的每个客户端,可以使用以下client pause命令。这在需要以受控方式更改Redis设置的情况下很有用。例如,如果要将一个副本提升为主实例,则可以事先暂停每个客户端,以便升级副本并使客户端作为新的主实例连接到该副本,而不会丢失任何写操作。

client pause命令要求您指定要挂起客户端的时间(以毫秒为单位)。下面的示例将所有客户端暂停一秒钟:

  * client pause 1000 

client kill语法使您可以基于多个不同的过滤器关闭单个连接或一组特定的连接。语法如下所示:

  * client kill filter_1 value_1 ... filter_n value_n 

在Redis 2.8.12和更高版本中,可以使用以下过滤器:

  • addr:允许您从指定的IP地址和端口关闭客户端连接
  • client-id:允许您根据其唯一ID字段关闭客户端连接
  • type:关闭一个给定类型,它可以是每一个客户端normalmasterslave,或pubsub
  • skipme:此过滤器的值选项为yesno
    • 如果no指定了if ,则调用该client kill命令的客户端不会被跳过,并且如果其他过滤器适用于该客户端,它将被杀死
    • 如果yes指定,则将跳过运行该命令的客户端,而kill命令将对该客户端无效。skipme始终yes默认为

结论

本指南详细介绍了许多用于管理Redis客户端和副本的命令。如果您想在本指南中概述其他相关的命令,参数或过程,请在下面的注释中提出疑问或提出建议。

介绍

Redis是一个开源的内存中键值数据存储。甲_键值_数据存储是一种类型的NoSQL数据库,其中_密钥_作为其相关联的唯一标识符_值_。任何给定的Redis实例都包括许多_数据库_,每个_数据库_都可以保存许多不同的密钥,这些密钥具有各种_数据类型_。在本教程中,我们将介绍如何选择数据库,在数据库之间移动密钥以及管理和删除密钥。

如何使用本指南

本指南以备有完整示例的备忘单形式编写。我们鼓励您跳至与您要完成的任务相关的任何部分。

本指南中显示的命令已在运行Redis版本的Ubuntu 18.04服务器上进行了测试 4.0.9。要设置类似的环境,您可以按照我们的指南如何在Ubuntu 18.04上安装和保护Redis的步骤1进行操作。我们将通过使用Redis命令行界面运行它们来演示这些命令的行为。请注意,如果您使用其他Redis界面(例如Redli),则某些命令的确切输出可能会有所不同。redis-cli

另外,您可以提供一个托管的Redis数据库实例来测试这些命令,但是请注意,根据数据库提供者所允许的控制级别,本指南中的某些命令可能无法按所述方式工作。要配置DigitalOcean托管数据库,请遵循我们的托管数据库产品文档。然后,您必须 安装Redli  设置TLS隧道才能通过TLS连接到托管数据库。

管理数据库

开箱即用的Redis实例支持16个逻辑数据库。这些数据库实际上彼此隔离,当您在一个数据库中运行命令时,它不会影响Redis实例中其他数据库中存储的任何数据。

Redis数据库从编号015,默认情况下,0当您连接到Redis实例时,您将连接到数据库。但是,您可以select在连接后通过以下命令更改正在使用的数据库:

  * select 15 

如果您选择了以外的其他数据库0,则会在redis-cli提示中反映出来:

  *  

要将一个数据库中保存的所有数据与另一个数据库中保存的数据交换,请使用swapdb命令。下面的例子将交换数据库中保存的数据6与数据库8,并连接到任何数据库的任何客户将能够立即看到变化:

  * swapdb 6 8 

swapdb``OK如果交换成功,将返回。

如果要将密钥移到其他Redis实例,可以运行migrate。此命令确保在从源实例删除密钥之前,该密钥存在于目标实例上。运行时migrate,命令必须按以下顺序包含以下元素:

  • 目标数据库的主机名或IP地址
  • 目标数据库的端口号
  • 您要迁移的密钥的名称
  • 您要在目标实例上存储密钥的数据库号
  • 超时(以毫秒为单位),用于定义两台计算机之间的最大空闲通信时间。请注意,这不是操作的时间限制,只是操作应始终在定义的时间长度内取得一定程度的进展

为了显示:

  * migrate 203.0.113.0 6379 key_1 7 8000 

此外,migrate允许在超时参数后添加以下选项:

  • COPY:指定不应从源实例中删除密钥
  • REPLACE:指定如果目标上已经存在密钥,则该migrate操作应删除并替换它
  • KEYS:您可以输入一个空字符串(""),而不是提供要迁移的特定密钥,然后使用keys命令中的语法来迁移与模式匹配的任何密钥。有关keys工作原理的更多信息,请参见我们的有关如何在Redis中解决问题的教程。

管理金钥

有许多Redis命令可用于管理密钥,而不管它们所保存的数据类型是什么。在本节中,我们将介绍其中的一些。

rename将重命名指定的密钥。如果成功,它将返回OK

  * rename old_key new_key 

您可以用来randomkey从当前选定的数据库中返回一个随机密钥:

  * randomkey 


Output

"any_key" 

使用type来确定给定密钥持有什么类型的数据。这条命令的输出可以是stringlisthashsetzset,或stream

  * type key_1 


Output

"string" 

如果指定的键不存在,type将返回none

您可以使用以下move命令将单个密钥移动到Redis实例中的另一个数据库。move接受键的名称以及要将键移动到的数据库作为参数。例如,要将密钥移动key_1到database 8,您将运行以下命令:

  * move key_1 8 

move``OK如果成功移动钥匙,将返回。

删除金钥

要删除任何数据类型del的一个或多个键,请使用命令后跟要删除的一个或多个键:

  * del key_1 key_2 

如果此命令成功删除密钥,它将返回(integer) 1。否则,它将返回(integer) 0

unlink命令执行与相似的功能del,不同之处在于,del当服务器回收密钥占用的内存时,该块会阻止客户端。如果要删除的密钥与一个小对象相关联,则del回收内存所花费的时间将非常小,并且阻塞时间甚至可能不会很明显。

但是,例如,如果您要删除的键与许多对象相关联(例如具有数千或数百万个字段的哈希),则可能会带来不便。删除这样的密钥可能会花费相当长的时间,并且在将其从服务器内存中完全删除之前,您将无法执行任何其他操作。

unlink但是,首先要确定重新分配密钥占用的内存的成本。如果太小,则立即unlink起到del与按键相同的作用,同时也会阻塞客户端。但是,如果为密钥分配内存的成本很高,unlink则将通过创建另一个线程_异步_删除密钥,并在后台增量回收内存而不阻塞客户端:

  * unlink key_1 

由于它是在后台运行的,因此通常建议您使用它unlink从服务器上删除密钥,以减少客户机上的错误,尽管del在许多情况下也足够了。

警告:以下两个命令被认为是危险的。该flushdbflushall命令将不可逆转地删除一个数据库中的所有键和所有键在Redis的服务器上的每个数据库,分别。我们建议仅在绝对确定要删除数据库或服务器中的所有键时才运行这些命令。

您可能希望将这些命令重命名为偶然运行的可能性较低的名称。

要删除所选数据库中的所有密钥,请使用以下flushdb命令:

  * flushdb 

要删除Redis服务器上每个数据库(包括当前选择的数据库)中的所有密钥,请运行flushall

  * flushall 

双方flushdbflushall接受async选项,它允许你删除一个数据库或异步集群中的所有数据库的所有按键。这使它们的功能类似于unlink命令,并且它们将创建一个新线程以在后台逐步释放内存。

备份数据库

要创建当前所选数据库的备份,可以使用以下save命令:

  * save 

这会将当前数据集的快照导出为.rdb文件,这是一个数据库转储文件,以内部压缩的序列化格式保存数据。

save同步运行,将阻止连接到数据库的所有其他客户端。因此,save命令文档建议几乎不要在生产环境中运行此命令。相反,它建议使用该bgsave命令。这告诉Redis派生数据库:父进程将继续为客户端提供服务,而子进程在退出之前保存数据库:

  * bgsave 

请注意,如果客户端在执行bgsave操作时添加或修改数据,则这些更改将不会捕获到快照中。

如果对数据库进行了最少的更改,您还可以编辑Redis配置文件以使Redis在一定时间后自动保存快照(称为_快照_或_RDB_模式)。这称为_保存点_。默认情况下,redis.conf文件中启用了以下保存点设置:

/etc/redis/redis.conf

. . . save 900 1 save 300 10 save 60 10000 . . . dbfilename "nextfile.rdb" . . .

使用这些设置,dbfilename如果更改了至少1个键,Redis将每900秒将数据库的快照导出到该参数定义的文件中;如果更改了至少10个键,则每300秒将数据库快照导出一次;如果更改了至少10000个键,则每60秒将数据库快照导出一次。被改变了。

您可以使用该shutdown命令备份Redis数据,然后关闭连接。save如果配置了至少一个保存点,此命令将阻止每个连接到数据库的客户端,然后执行操作,这意味着它将.rdb在不阻止客户端进行任何更改的情况下,将当前状态的数据库导出到文件中。

此外,shutdown如果启用了_仅附加模式_,该命令将在退出前刷新对Redis的仅附加文件的更改。该只追加文件模式(AOF)涉及在结尾的文件在服务器上创建一个日志每次写操作的.aof每个快照之后。可以在同一服务器上启用AOF和RDB模式,并且使用两种持久性方法都是备份数据的有效方法。

简而言之,该shutdown命令实质上是一个阻塞save命令,该命令还会刷新对仅附加文件的所有最新更改,并关闭与Redis实例的连接:

警告:shutdown命令被认为是危险的。通过阻止Redis服务器的客户端,可以使数据对依赖它的用户和应用程序不可用。我们建议仅在测试Redis的行为或绝对确定要阻止所有Redis服务器的客户端时才运行此命令。

实际上,将这个命令重命名为偶然运行的可能性较小的命令可能符合您的利益。

  * shutdown 

如果您尚未配置任何保存点,但仍希望Redis执行save操作,请将该save选项附加到`shutdown命令:

  * shutdown save 

如果您已经配置了至少一个保存点,但是您想在不执行保存的情况下关闭Redis服务器,则可以将nosave参数添加到命令中:

  * shutdown nosave 

请注意,仅附加文件会随着时间的增长而变得很长,但是您可以配置Redis通过编辑文件来基于某些变量重写redis.conf文件。您还可以通过运行以下bgrewriteaof命令指示Redis重写仅附加文件:

  * bgrewriteaof 

bgrewriteaof将创建使数据库恢复到当前状态所需的最短命令集。顾名思义,该命令将在后台运行。但是,如果另一个持久性命令已经在后台进程中运行,则该命令必须在Redis执行之前完成bgrewriteaof

结论

本指南详细介绍了许多用于管理数据库和密钥的命令。如果您想在本指南中看到其他相关的命令,参数或过程,请在下面的评论中提出疑问或提出建议。

介绍

Redis是一个开源的内存中键值数据存储。无论您是在本地安装Redis还是使用远程实例,都需要连接到它才能执行大多数操作。在本教程中,我们将介绍如何从命令行连接到Redis,如何验证和测试您的连接以及如何关闭Redis连接。

如何使用本指南

本指南以备有完整示例的备忘单形式编写。我们鼓励您跳至与您要完成的任务相关的任何部分。

本指南中显示的命令已在运行Redis版本的Ubuntu 18.04服务器上进行了测试 4.0.9。要设置类似的环境,您可以按照我们的指南如何在Ubuntu 18.04上安装和保护Redis的步骤1进行操作。我们将通过使用Redis命令行界面运行它们来演示这些命令的行为。请注意,如果您使用其他Redis界面(例如Redli),则某些命令的确切输出可能会有所不同。redis-cli

另外,您可以提供一个托管的Redis数据库实例来测试这些命令,但是请注意,根据数据库提供者所允许的控制级别,本指南中的某些命令可能无法按所述方式工作。要配置DigitalOcean托管数据库,请遵循我们的托管数据库产品文档。然后,您必须 安装Redli  设置TLS隧道才能通过TLS连接到托管数据库。

连接到Redis

如果已redis-server 在本地安装,则可以使用以下redis-cli命令连接到Redis实例:

  * redis-cli 

这将带您进入redis-cli的_交互模式_,该_模式_为您提供一个read-eval-print循环(REPL),您可以在其中运行Redis的内置命令并接收答复。

在交互模式下,命令行提示符将更改以反映您的连接。在本示例以及本指南中的其他示例中,提示指示与本地托管的Redis实例的连接(127.0.0.1),并通过Redis的默认端口(6379)进行访问:

  *  

在交互模式下运行Redis命令的替代方法是将它们作为redis-cli命令的参数运行,如下所示:

  * redis-cli redis_command 

如果要连接到远程Redis数据存储,则可以分别使用-h-p标志指定其主机和端口号。另外,如果您已将Redis数据库配置为要求输入密码,则可以在-a其后加上该标志并进行身份验证:

  * redis-cli -h host -p port_number -a password 

如果您设置了Redis密码,则即使客户端未-aredis-cli命令中包含该标志,客户端也可以连接到Redis 。但是,他们将无法添加,更改或查询数据,除非他们进行身份验证。要在连接后进行身份验证,请使用auth命令和密码:

  * auth password 

如果传递给的密码auth有效,则命令将返回OK。否则,它将返回错误。

如果您正在使用托管Redis数据库,则云提供商可能会给您提供一个以URI开头redis://rediss://可用于访问数据存储的URI 。如果连接字符串以开头redis://,则可以将其作为redis-cli连接参数。

但是,如果您有一个以开头的连接字符串,则rediss://意味着您的托管数据库需要通过TLS / SSL进行连接。redis-cli不支持TLS连接,因此您需要使用支持rediss协议的其他工具才能与URI连接。对于需要通过TLS建立连接的DigitalOcean托管数据库,我们建议使用Redli访问Redis实例。

使用以下语法通过Redli连接到数据库。请注意,此示例包括--tls选项(该选项指定应通过TLS建立连接)和-u标志(该标志声明以下参数将是连接URI):

  * redli --tls -u rediss://connection_URI 

如果您尝试连接到不可用的实例,redis-cli将进入_断开连接模式_。提示将反映以下内容:

  *  

每次在断开连接状态下运行命令时,Redis都会尝试重新建立连接。

测试连接

ping命令对于测试与数据库的连接是否有效非常有用。请注意,这是Redis特定的命令,与ping网络实用程序不同。但是,两者共享相似的功能,因为它们都用于检查两台计算机之间的连接。

如果连接建立并且不包含任何参数,则ping命令将返回PONG

  * ping 

Output

PONG 

如果为ping命令提供参数,它将返回该参数,而不是PONG连接成功:

  * ping "hello Redis!" 

Output

"hello Redis!" 

如果ping以断开连接模式运行或其他任何命令,则将看到类似以下的输出:

  * ping 

Output

Could not connect to Redis at host:port: Connection refused 

请注意,pingRedis在内部也使用它来测量延迟

与Redis断开连接

要与Redis实例断开连接,请使用以下quit命令:

  * quit 

运行exit也会退出连接:

  * exit 

两者quitexit都会关闭连接,但是只有在所有未决答复都已写到客户端后,才可以。

结论

本指南详细介绍了用于建立,测试和关闭与Redis服务器的连接的许多命令。如果您想在本指南中看到其他相关的命令,参数或过程,请在下面的评论中提出疑问或提出建议。

为什么

俊瑶先森为什么翻译这本书?

用了7年redis,为什么要重新梳理了。因为发现了很多盲区。将在这次完整梳理。

关于这本书

Redis是一个开源的内存键值数据存储,以其灵活性、性能和广泛的语言支持。NoSQL数据库,Redis不使用结构化查询语言(也称为SQL)来存储、操作和检索数据。Redis自带一套用于管理和访问数据的命令。本书的章节涵盖了广泛的Redis命令,但是它们通常专注于连接到Redis数据库,管理各种数据类型,以及故障排除和调试问题,以及还有一些更具体的功能。

本书的章节涵盖了广泛的Redis命令,但是它们通常专注于连接到Redis数据库,管理各种数据类型,以及故障排除和调试问题,以及还有一些更具体的功能。我们鼓励你跳到无论哪一章与你要完成的任务相关。

本书的动机

每个可用的Redis命令都在官方的Redis命令文档,以及其他许多印刷和在线资源。然而,许多资源倾向于各自独立互相指挥,不把他们绑在一起。

这本书旨在提供一个平易近人的介绍Redis通过概述键值存储的许多命令,读者可以可以学习它们的模式和语法,从而建立起读者的逐渐理解。这本书涵盖了从连接到对于Redis数据存储,对于管理各种Redis数据类型,错误排除,等等。

学习目标和成果

本书的目标是为那些有兴趣开始使用Redis或一般键值存储的用户提供Redis的简介。对于经验丰富的用户,这本书可以作为有用的资料集备忘单和深入参考。每章都是独立的,可以独立于其他人。通过阅读并关注伴随着每一章,您将熟悉Redis的许多内容。最广泛使用的命令,它将在您开始构建利用其功能和速度的应用程序时为您提供帮助。

如何使用这本书

本书各章均以备忘单形式编写,且内容齐全例子。我们鼓励您跳至与您要完成的任务。本书中显示的命令已在Ubuntu 18.04上进行了测试运行Redis版本4.0.9的服务器。要设置类似的环境,您可以可以按照关于如何安装和保护Redis的指南中的步骤1进行操作。Ubuntu 18.04。我们将通过以下方式演示这些命令的行为使用Redis命令行界面redis-cli运行它们。注意如果您使用其他Redis界面(例如Redli),某些命令的确切输出可能会有所不同。或者,您可以将托管Redis数据库实例设置为探索Redis的功能。但是,取决于控制级别在数据库提供商允许的情况下,本指南中的某些命令可能不会按照说明进行工作。将此书与DigitalOcean Managed一起使用数据库,请遵循我们的托管数据库产品文档。然后,您必须安装Redli或设置TLS隧道才能连接到TLS上的托管数据库。

原著:how to manage a redis database
翻译: 俊瑶先森

工具及规范

uPic 图床配置及安装

1.mac用户直接下载安装包运行安装
https://github.com/gee1k/uPic/releases
3DsQWM

2.偏好设置中设置图床
ACkWHA
nnVASV
3.配置剪贴板上传快捷键

建议配置快捷键为 shift+command + c 与复制快捷键 command + c 快速组合
一般剪贴板上传就解决了99%的需求

GchLGT

AntDocs of VuePress配置及安装

文档:https://antdocs.seeyoz.cn/guide/using-vuepress-creator.html

使用

  • 示例:如何快速插入图片,例如桌面有一张图片。

1.打开图片,按command + c 将图片复制到剪贴板。
2.shift+command + c 上传
3.command + v 粘贴 图片链接

influxdb备忘

influxdb的两个http端口:8083和8086

  • port 8083:管理页面端口,访问localhost:8083可以进入你本机的influxdb管理页面;
  • port 8086:http连接influxdb client端口,一般使用该端口往本机的influxdb读写数据。

在1.3以后,8083端口被弃用,admin模块也失效,但是可以使用 Chronograf 专用的开源web应用,方便的可视化监控数据,与grafana等可视化工具功能相同。

名词解释

  • database:数据库;
  • measurement:数据库中的表;
  • points:表里面的一行数据。

influxDB中独有的一些概念
Point由时间戳(time)、数据(field)和标签(tags)组成。

  • time:每条数据记录的时间,也是数据库自动生成的主索引;
  • fields:各种记录的值;
  • tags:各种有索引的属性。

docker创建

1.3后无admin界面,官方推荐使用chronograf ui管理

docker

1
2
3
4
5
$ docker run -p 8086:8086 -p 8083:8083 \
-e INFLUXDB_DB=db0 -e INFLUXDB_ADMIN_ENABLED=true \
-e INFLUXDB_ADMIN_USER=admin -e INFLUXDB_ADMIN_PASSWORD=supersecretpassword \
-e INFLUXDB_USER=telegraf -e INFLUXDB_USER_PASSWORD=secretpassword \
-v $PWD:/var/lib/influxdb

docker-compose

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
version: "3.3"

services:
influxdb:
image: "influxdb"
container_name: "influxdb"
environment:
- TZ=Asia/Shanghai
- INFLUXDB_DB=testDb
- INFLUXDB_ADMIN_USER=admin
- INFLUXDB_ADMIN_PASSWORD=admin
- INFLUXDB_HTTP_AUTH_ENABLED=true
- INFLUXDB_ADMIN_ENABLED=true
- INFLUXDB_USER=bulolo
- INFLUXDB_USER_PASSWORD=hjyhjy0927
ports:
- "8086:8086"
volumes:
- "./data/influxdb:/var/lib/influxdb"

chronograf:
image: chronograf:latest
ports:
- '8888:8888'
volumes:
- ./data/chronograf:/var/lib/chronograf
depends_on:
- influxdb
environment:
- INFLUXDB_URL=http://influxdb:8086

简单命令示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
influx -username 'admin' -password 'admin'  登录
precision rfc3339 --把时间戳转化为方便阅读的时间格式
SHOW USERS --显示用户
CREATE USER "username" WITH PASSWORD 'password' WITH ALL PRIVILEGES --创建管理员权限的用户
DROP USER "username" --删除用户
CREATE DATABASE mydb --创建数据库
SHOW DATABASES --展示所有数据库
SHOW RETENTION POLICIES ON mydb --查看保留策略
USE mydb --使用数据库

DROP DATABASE mydb --删除数据库
SHOW MEASUREMENTS --查询当前数据库中含有的表
SHOW CONTINUOUS QUERIES --查看连续执行命令
SHOW FIELD KEYS FROM mytable --查看当前数据库下的mytable表的字段
SHOW SERIES FROM mytable --查看key数据
SHOW TAG KEYS FROM mytable --查看key中tag key值
SELECT * FROM mytable --查询当前数据库下mytable表的记录
INSERT cpu,host=serverA,region=us_west value=0.64 --在cpu表中插入相关的数据
SELECT * FROM cpu ORDER BY DESC LIMIT 3 --查询cpu表下最近的三条数据
DROP MEASUREMENT mytable --删除表
precision rfc3339 --把时间戳转化为方便阅读的时间格式


授权语法

创建用户:CREATE USER <username> WITH PASSWORD ‘<password>‘
授权权限:GRANT [READ,WRITE,ALL] ON <database_name> TO <username>
创建并授权:CREATE USER <username> WITH PASSWORD ‘<password>‘ WITH ALL PRIVILEGES
取消授权:REVOKE ALL PRIVILEGES FROM <username>
修改密码:SET PASSWORD FOR <username> = ‘<password>‘
删除用户:DROP USER <username>

集成到ChirpStack

到Applications-某个应用-INTEGRATIONS,增加InfluxDB
s5nzE3
这里有个坑,记得将influxdb的docker的网络加入到ChirpStack,并且以[http://]+[influxDB容器名称]:8086/write 来填写API endpoint.
例如:

1
http://influxdb:8086/write

indexfuxDB数据说明

所有 measurements 名称都是将 object 的几个元素用下划线来连接下来。其中的 Payload 数据是以 device_frmpayload_data 做前缀,同时要求 Payload 存入 InfluxDB 之前需要保证为 JSON 格式, 键为:object。也就是要开启 ChirpStack 编解码函数功能

Payload 示例:

1
2
3
4
5
6
7
8
9
10
11
12
{
"object": {
"DeviceType": "4A",
"Mulitplier1": "00",
"ReportType": "02",
"Version": "01",
"a_current": 257,
"b_current": 0,
"battery": 36,
"c_current": 0
}
}

其实也就是编解码函数解析出来的object字段。

例如:DeviceType最终 measurements 名称将为device_frmpayload_data_DeviceType

sr6WEE

每个 measurements 都有如下的 tag:

1
2
3
4
application_name
device_name
dev_eui
f_port (LoRaWAN port used for uplink)
Ium28Z

ChirpStack 还支持几类数据的记录:
Device uplink meta-data,为了监控扩频因子、信道等数据,每个上行数据都会记录到名为 device_uplink 的 measurement。 其中的 value 固定为 1。

备忘进度。待输出详细文章

day1: 2020.10.21

lora基础概念入门
从头部署ChirpStack,并完成接入网关及3个lora设备。

网关ISM频段标准:

EU868和EU433主要是欧洲标准,
US915是美国标准,
CN779、CN470是中国标准,
AU915主要是澳大利亚标注,
AS923主要是亚洲其余国家标准,
KR923主要是韩国标准,
IN865主要是印度标准,
RU864主要是俄罗斯标准。

节点的入网/激活

每个要接入LoRaWAN网络的节点,必须经过入网/激活的过程,节点入网的目的是获得云端分配的DevAddr、AppSKey、NwkSEncKey等通信必须的信息,入网方式分以下两种。

OTAA(Over-The-Air Activation)空中激活

OTAA中,节点的AppSKey和NwkSEncKey信息是临时从云端获取的,节点中需要提前烧录NwkKey和Appkey、JoinEUI等信息,节点向云端发送Join-request message请求,云端返回Join-accept message,节点提取Join-accept message中的DevAddr,JoinNonce等信息,并自己计算生成AppSKey和NwkSEncKey等信息。

ABP (Activation By Personalization)人工激活

ABP中,节点需要的DevAddr、AppSKey、NwkSEncKey等信息,不是从云端获取的,而是提前在云端配置好,并烧录到节点固件中,节点使用这些信息可以直接和云端通信,省去了OTAA中的Join-request流程。

ChirpStack 编解码函数功能

在 Device Profile 中有一个 codec 模块。

  • Custom JavaScript codec functions 即JS 编解码函数
Decode解析数据

启动 Decode 之后的数据,多了一个 object 对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function toHexString(bytes) {
return bytes.map(function(byte) {
return ("00" + (byte & 0xFF).toString(16)).slice(-2)
}).join('').toUpperCase()
}

function Decode(fPort, bytes, variables) {
var hex = toHexString(bytes)
return {
"Version": hex.substring(0, 2),
"DeviceType": hex.substring(2, 4),
"ReportType": hex.substring(4, 6),
"battery": parseInt(hex.substring(6, 8), 16),
"a_current": parseInt(hex.substring(8, 12), 16),
"b_current": parseInt(hex.substring(12, 16), 16),
"c_current": parseInt(hex.substring(16, 20), 16),
"Mulitplier1": hex.substring(20, 22),
}
}
1
2
3
function Encode(fPort, obj, variables) {
return [];
}

day2: 2020.10.22

通过mqtt打通ChirpStack上下行数据,操作lora设备。

ChirpStack中的mqtt主题示例:

ApplicationID和 DevEUI 可以直接从订阅主题中获得

Events

application/[ApplicationID]/device/[DevEUI]/event/[EventType]

application/[ApplicationID]/device/[DevEUI]/command/down

day3: 2020.10.23

熟悉lora设备的指令操作解析
主要有2种方式,一种是从上面讲的mqtt中进行publish,
另外一种是从ChirpStrack进行上行数据查看及下发数据

下发数据:
9k6kPm
查看上行数据
EWBRYB

待评估处理:

1.调研lora采用的时序数据库,通过美观的方式展现lora的数据

ChirpStack 在应用集成中配置将数据的收发存储到 InfluxDB,再通过 Granfana 进行可视化观察。

时序数据库 InfluxDB集成
Grafana

2.调研lora的监控及报警

Prometheus

3.chripstack整合平台的可行性

评估chripstack的开放api接口的操作能力

4.对硬件实际测试效果

对实际lora设备进行测试,评估lora实际运用的效果

简单记录下这个过程。最后再输出完整过程。

发现 9.23

偶然机会,我到专壹自习室进行了体验,发现专壹自习室内的是由全自动化的设备进行无人化运营的。勾起了我的兴趣。打算把家里改造成智能化
以此记录整个俊瑶的智能家的始末。

cgUJfv

调研-立项-立flag 9.25

再次调研专壹自习室、考拉自习室、一隅自习室。立项,我要把家里改造成智能家居,并确认一下自己提出的几个要求

1.尽可能能接入各个厂商的设备
2.网关协议尽可能的自主可控
3.外网可控。

立个最终效果flag,以此作为目标

o80tAU 1q64kZ QxC8wg

技术初步调研及尝试

首先买个小米多模网关。结论-坑,只兼容小米的部分zigbee设备,对别的设备不兼容。放弃
WzSFZr

技术最终选型

  1. home assistant+群晖(树莓派也可)vuMYFd WfX0H5
  2. zigbee2mqtt9gQejz 3.网关板子 有线版 mFPTeZ 无线版 mFWj6b

初步原理:将所有设备连如网关,再由网关上云,通过云来控制网关下发控制子设备。

进度:

1.接入米家台灯

发现家里的小米台灯是yeelight,立刻接入尝试。

2.接入智能插座wifi版+智能插座蓝牙网关版

pTP7Zz

3.接入人体红外

5P5g7Z

4.接入落地灯

HjxUy6

5.接入慧作吸顶风扇灯 ✖️2

6I5MiW

6.接入无线开关六键版

jAVKcO
0%