• redis小结 1-2


    1.Redis 发布订阅

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

    Redis 客户端可以订阅任意数量的频道。

    下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:

    当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:

     Redis 发布订阅命令

    Psubscribe

    命令订阅一个或多个符合给定模式的频道 PSUBSCRIBE pattern [pattern ...]

    每个模式以 * 作为匹配符,比如 it* 匹配所有以 it 开头的频道( it.news 、 it.blog 、 it.tweets 等等)。 news.* 匹配所有以 news. 开头的频道( news.it 、 news.global.today 等等),诸如此类

     Pubsub

     命令用于查看订阅与发布系统状态,它由数个不同格式的子命令组成 PUBSUB <subcommand> [argument [argument ...]]

    Publish

    命令用于将信息发送到指定的频道 PUBLISH channel message

     Punsubscribe

    命令用于退订所有给定模式的频道 PUNSUBSCRIBE [pattern [pattern ...]]

     Subscribe

    命令用于订阅给定的一个或多个频道的信息 SUBSCRIBE channel [channel ...]

    Unsubscribe

    命令用于退订给定的一个或多个频道的信息 UNSUBSCRIBE channel [channel ...]

    2.Redis 事务

    Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证:

    • 批量操作在发送 EXEC 命令前被放入队列缓存。
    • 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
    • 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。

    一个事务从开始到执行会经历以下三个阶段:

    • 开始事务。
    • 命令入队。
    • 执行事务。

     Multi

    命令用于标记一个事务块的开始。

    事务块内的多条命令会按照先后顺序被放进一个队列当中,最后由 EXEC 命令原子性(atomic)地执行

     Exec

    命令用于执行所有事务块内的命令

    Discard

    命令用于取消事务,放弃执行事务块内的所有命令

    Watch

    命令用于监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断 WATCH key [key ...]

     Redis 脚本

    Redis 脚本使用 Lua 解释器来执行脚本。 Reids 2.6 版本通过内嵌支持 Lua 环境。执行脚本的常用命令为 EVAL

    Eval

    命令使用 Lua 解释器执行脚本 EVAL script numkeys key [key ...] arg [arg ...]

    参数说明:

    • script: 参数是一段 Lua 5.1 脚本程序。脚本不必(也不应该)定义为一个 Lua 函数。
    • numkeys: 用于指定键名参数的个数。
    • key [key ...]: 从 EVAL 的第三个参数开始算起,表示在脚本中所用到的那些 Redis 键(key),这些键名参数可以在 Lua 中通过全局变量 KEYS 数组,用 1 为基址的形式访问( KEYS[1] , KEYS[2] ,以此类推)。
    • arg [arg ...]: 附加参数,在 Lua 中通过全局变量 ARGV 数组访问,访问的形式和 KEYS 变量类似( ARGV[1] 、 ARGV[2] ,诸如此类)

    Evalsha

    命令根据给定的 sha1 校验码,执行缓存在服务器中的脚本

     将脚本缓存到服务器的操作可以通过 SCRIPT LOAD 命令进行

    这个命令的其他地方,比如参数的传入方式,都和 EVAL 命令一样

     参数说明:

    • sha1 : 通过 SCRIPT LOAD 生成的 sha1 校验码。
    • numkeys: 用于指定键名参数的个数。
    • key [key ...]: 从 EVAL 的第三个参数开始算起,表示在脚本中所用到的那些 Redis 键(key),这些键名参数可以在 Lua 中通过全局变量 KEYS 数组,用 1 为基址的形式访问( KEYS[1] , KEYS[2] ,以此类推)。
    • arg [arg ...]: 附加参数,在 Lua 中通过全局变量 ARGV 数组访问,访问的形式和 KEYS 变量类似( ARGV[1] 、 ARGV[2] ,诸如此类)

    Script Exists

    命令用于校验指定的脚本是否已经被保存在缓存当中 EVALSHA sha1 numkeys key [key ...] arg [arg ...]

    Script Flush

    命令用于清除所有 Lua 脚本缓存 SCRIPT FLUSH

    Script kill

    命令用于杀死当前正在运行的 Lua 脚本,当且仅当这个脚本没有执行过任何写操作时,这个命令才生效 SCRIPT KILL

     这个命令主要用于终止运行时间过长的脚本,比如一个因为 BUG 而发生无限循环的脚本

    SCRIPT KILL 执行之后,当前正在运行的脚本会被杀死,执行这个脚本的客户端会从 EVAL 命令的阻塞当中退出,并收到一个错误作为返回值

    Script Load 命令用于将脚本 script 添加到脚本缓存中,但并不立即执行这个脚本。

    EVAL 命令也会将脚本添加到脚本缓存中,但是它会立即对输入的脚本进行求值。

    如果给定的脚本已经在缓存里面了,那么不执行任何操作。

    在脚本被加入到缓存之后,通过 EVALSHA  命令,可以使用脚本的 SHA1 校验和来调用这个脚本。

    脚本可以在缓存中保留无限长的时间,直到执行 SCRIPT FLUSH 为止

    3.Redis 连接

    Redis 连接命令主要是用于连接 redis 服务

    Auth

    命令用于检测给定的密码和配置文件中的密码是否相符

    Echo

    命令用于打印给定的字符串 ECHO message

    Ping

    命令使用客户端向 Redis 服务器发送一个 PING ,如果服务器运作正常的话,会返回一个 PONG 

    通常用于测试与服务器的连接是否仍然生效,或者用于测量延迟值

      Quit

    命令用于关闭与当前客户端与redis服务的连接

    一旦所有等待中的回复(如果有的话)顺利写入到客户端,连接就会被关闭

    Select

    命令用于切换到指定的数据库,数据库索引号 index 用数字值指定,以 0 作为起始索引值

     4.Redis 服务器

    Redis 服务器命令主要是用于管理 redis 服务

    Redis 服务器命令

    Bgrewriteaof

    命令用于异步执行一个 AOF(AppendOnly File) 文件重写操作。重写会创建一个当前 AOF 文件的体积优化版本

    即使 Bgrewriteaof 执行失败,也不会有任何数据丢失,因为旧的 AOF 文件在 Bgrewriteaof 成功之前不会被修改

    注意:从 Redis 2.4 开始, AOF 重写由 Redis 自行触发, BGREWRITEAOF 仅仅用于手动触发重写操作

    Bgsave

    命令用于在后台异步保存当前数据库的数据到磁盘

    BGSAVE 命令执行之后立即返回 OK ,然后 Redis fork 出一个新子进程,原来的 Redis 进程(父进程)继续处理客户端请求,而子进程则负责将数据保存到磁盘,然后退出

    Client Kill

    命令用于关闭客户端连接 CLIENT KILL ip:port

    返回 成功关闭时,返回 OK

     Client List

    命令用于返回所有连接到服务器的客户端信息和统计数据 CLIENT LIST

    Client Getname

    命令用于返回  命令为连接设置的名字。 因为新创建的连接默认是没有名字的, 对于没有名字的连接, CLIENT GETNAME 返回空白回复

    Client Pause

    命令用于阻塞客户端命令一段时间(以毫秒计) CLIENT PAUSE timeout 

    Client Setname

    命令用于指定当前连接的名称

    Client Slots

    命令用于当前的集群状态,以数组形式展示 CLUSTER SLOTS 

    Command

    命令用于返回所有的Redis命令的详细信息,以数组形式展示

    Command Count

    命令用于统计 redis 命令的个数

    Command Getkeys

    命令用于获取所有 key

    Time

    命令用于返回当前服务器时间

    返回 一个包含两个字符串的列表: 第一个字符串是当前时间(以 UNIX 时间戳格式表示),而第二个字符串是当前这一秒钟已经逝去的微秒数

     Command Info

    命令用于获取 redis 命令的描述信息

    Config Get

    命令用于获取 redis 服务的配置参数

    在 Redis 2.4 版本中, 有部分参数没有办法用 CONFIG GET 访问,但是在最新的 Redis 2.6 版本中,所有配置参数都已经可以用 CONFIG GET 访问了

    Config rewrite

    命令对启动 Redis 服务器时所指定的 redis.conf 配置文件进行改写

    CONFIG SET 

    命令可以对服务器的当前配置进行修改, 而修改后的配置可能和 redis.conf 文件中所描述的配置不一样, CONFIG REWRITE 的作用就是通过尽可能少的修改, 将服务器当前所使用的配置记录到 redis.conf 文件中

    Config Resetstat

    命令用于重置 INFO 命令中的某些统计数据,包括:

    • Keyspace hits (键空间命中次数)
    • Keyspace misses (键空间不命中次数)
    • Number of commands processed (执行命令的次数)
    • Number of connections received (连接服务器的次数)
    • Number of expired keys (过期key的数量)
    • Number of rejected connections (被拒绝的连接数量)
    • Latest fork(2) time(最后执行 fork(2) 的时间)
    • The aof_delayed_fsync counter(aof_delayed_fsync 计数器的值)

    Dbsize

    命令用于返回当前数据库的 key 的数量

    Debug Object

    命令是一个调试命令,它不应被客户端所使用

    Debug Segfault

    命令执行一个非法的内存访问从而让 Redis 崩溃,仅在开发时用于 BUG 调试

    Flushall

    命令用于清空整个 Redis 服务器的数据(删除所有数据库的所有 key )

    Info

    命令以一种易于理解和阅读的格式,返回关于 Redis 服务器的各种信息和统计数值

    Lastsave

    命令返回最近一次 Redis 成功将数据保存到磁盘上的时间,以 UNIX 时间戳格式表示

    Monitor

    命令用于实时打印出 Redis 服务器接收到的命令,调试用

     Role

    命令查看主从实例所属的角色,角色有master, slave, sentinel

    Save

    命令执行一个同步保存操作,将当前 Redis 实例的所有数据快照(snapshot)以 RDB 文件的形式保存到硬盘

    Shutdown

    命令执行以下操作:

    • 停止所有客户端
    • 如果有至少一个保存点在等待,执行 SAVE 命令
    • 如果 AOF 选项被打开,更新 AOF 文件
    • 关闭 redis 服务器(server)

    Slaveof

    命令可以将当前服务器转变为指定服务器的从属服务器(slave server)。

    如果当前服务器已经是某个主服务器(master server)的从属服务器,那么执行 SLAVEOF host port 将使当前服务器停止对旧主服务器的同步,丢弃旧数据集,转而开始对新主服务器进行同步。

    另外,对一个从属服务器执行命令 SLAVEOF NO ONE 将使得这个从属服务器关闭复制功能,并从从属服务器转变回主服务器,原来同步所得的数据集不会被丢弃。

    利用『 SLAVEOF NO ONE 不会丢弃同步所得数据集』这个特性,可以在主服务器失败的时候,将从属服务器用作新的主服务器,从而实现无间断运行

    slowlog

    是 Redis 用来记录查询执行时间的日志系统。

    查询执行时间指的是不包括像客户端响应(talking)、发送回复等 IO 操作,而单单是执行一个查询命令所耗费的时间。

    另外,slow log 保存在内存里面,读写速度非常快,因此你可以放心地使用它,不必担心因为开启 slow log 而损害 Redis 的速度

    返回 取决于不同命令,返回不同的值

     Redis 数据备份与恢复

     命令SAVE 将数据进行备份 该命令将在 redis 安装目录中创建dump.rdb文件

    如果需要恢复数据,只需将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可。获取 redis 目录可以使用 CONFIG 命令 CONFIG GET dir

    创建 redis 备份文件也可以使用命令 BGSAVE,该命令在后台执行

    Redis 安全

    可以通过 redis 的配置文件设置密码参数,这样客户端连接到 redis 服务就需要密码验证,这样可以让你的 redis 服务更安全

    CONFIG get requirepass

    获取redis密码是否已设置

    CONFIG set requirepass 

    设置密码

    AUTH password

    设置密码后,客户端连接 redis 服务就需要密码验证,否则无法执行命令

    Redis 性能测试 

    redis-benchmark [option] [option value]

    Redis 客户端连接

    Redis 通过监听一个 TCP 端口或者 Unix socket 的方式来接收来自客户端的连接,当一个连接建立后,Redis 内部会进行以下一些操作:

    • 首先,客户端 socket 会被设置为非阻塞模式,因为 Redis 在网络事件处理上采用的是非阻塞多路复用模型。
    • 然后为这个 socket 设置 TCP_NODELAY 属性,禁用 Nagle 算法
    • 然后创建一个可读的文件事件用于监听这个客户端 socket 的数据发送

    Redis 管道技术

    Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。这意味着通常情况下一个请求会遵循以下步骤:

    • 客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应。
    • 服务端处理命令,并将结果返回给客户端

    Redis 管道技术可以在服务端未响应时,客户端可以继续向服务端发送请求,并最终一次性读取所有服务端的响应

    Redis 分区

    分区是分割数据到多个Redis实例的处理过程,因此每个实例只保存key的一个子集

    分区的优势

    • 通过利用多台计算机内存的和值,允许我们构造更大的数据库
    • 通过多核和多台计算机,允许我们扩展计算能力;通过多台计算机和网络适配器,允许我们扩展网络带宽

    redis的一些特性在分区方面表现的不是很好:

    • 涉及多个key的操作通常是不被支持的。举例来说,当两个set映射到不同的redis实例上时,你就不能对这两个set执行交集操作。
    • 涉及多个key的redis事务不能使用。
    • 当使用分区时,数据处理较为复杂,比如你需要处理多个rdb/aof文件,并且从多个实例和主机备份持久化文件。
    • 增加或删除容量也比较复杂。redis集群大多数支持在运行时增加、删除节点的透明数据平衡的能力,但是类似于客户端分区、代理等其他系统则不支持这项特性。然而,一种叫做presharding的技术对此是有帮助的

    分区类型

    Redis 有两种类型分区。 假设有4个Redis实例 R0,R1,R2,R3,和类似user:1,user:2这样的表示用户的多个key,对既定的key有多种不同方式来选择这个key存放在哪个实例中。也就是说,有不同的系统来映射某个key到某个Redis服务

    范围分区

    最简单的分区方式是按范围分区,就是映射一定范围的对象到特定的Redis实例。

    比如,ID从0到10000的用户会保存到实例R0,ID从10001到 20000的用户会保存到R1,以此类推。

    这种方式是可行的,并且在实际中使用,不足就是要有一个区间范围到实例的映射表。这个表要被管理,同时还需要各 种对象的映射表,通常对Redis来说并非是好的方法

     哈希分区

    另外一种分区方法是hash分区。这对任何key都适用,也无需是object_name:这种形式,像下面描述的一样简单:

    • 用一个hash函数将key转换为一个数字,比如使用crc32 hash函数。对key foobar执行crc32(foobar)会输出类似93024922的整数。
    • 对这个整数取模,将其转化为0-3之间的数字,就可以将这个整数映射到4个Redis实例中的一个了。93024922 % 4 = 2,就是说key foobar应该被存到R2实例中。注意:取模操作是取除的余数,通常在多种编程语言中用%操作符实现
  • 相关阅读:
    Linux学习
    PHP语法笔记
    iOS二次发育(swift)闭包
    iOS二次发育(swift)类
    iOS二次发育(swift)结构体
    iOS二次发育(swift)枚举
    【NOIP2013模拟联考14】隐藏指令
    【NOIP2012模拟8.9】逐个击破
    NOIP2020.9.19模拟patrick
    NOIP2020.9.19模拟 spongebob
  • 原文地址:https://www.cnblogs.com/mike1314/p/8488456.html
Copyright © 2020-2023  润新知