Redis学习笔记(个人向)

Redis学习笔记(个人向)


1. 概述

  • 是一个高性能的 key-value 数据库;
  • 其具有以下三个特点:
    1. Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
    2. Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储(丰富的存储数据结构)。
    3. Redis支持数据备份,即master-slave模式的数据备份。
  • Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTIEXEC指令包起来;
  • Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。当然,这样Redis可以做很多内部复杂性很强的事情,因为相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单计组内容+数据结构);
  • 由于在磁盘格式方面是紧凑地以追加的方式产生的,因为Redis并不需要进行随机访问;

2. 安装和配置

  • 详细看Redis 下载安装和Redis 配置即可;

3. 数据类型

  • Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合);

3.1 String

  • 是redis最基本的类型,是一个类似于键值对的结构,一个key对应一个value;
  • string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象;
  • string类型的值最大能存储 512MB;

关于各数据类型的常用命令放在另外的文档中,此处略。

3.2 Hash

  • 是一个键值(key=>value)对集合,即哈希表;
  • Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象;
  • 每个hash表可以存储 2 32 − 1 2^{32} -1 2321 键值对(40多亿);
  • 对于Hash的初值设置,我们可以使用HGETHMSET命令,其中前者获取
    对应field对应的value,后者设置了field=>value对的值;
    //赋值
    HMSET Hashname fieldname1 value1 fieldname2 value2,……  
    
    //获取键名为fieldname(k)的值
    HGET Hashname fieldname(k)  
    

3.3 List

  • 是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边),也就是只能头插或者尾插
  • 每个列表最多可存储 2 32 − 1 2^{32} - 1 2321元素 (4294967295, 每个列表可存储40多亿);

3.5 Set

  • string类型的无序集合;
  • 通过哈希表实现,添加,删除,查找的复杂度都是 O(1);
  • 当然,由于集合的元素唯一性,重复插入元素会被忽略,并返回0;
  • 下面引入sadd命令:
    sadd setname value1,value2,···
    //成功返回1,失败返回0
    

3.6 Zset

  • zsetset一样也是string类型元素的集合,且不允许重复的成员;
  • 不同的是每个元素都会关联一个double类型的分数(score。redis通过分数来为集合中的成员进行从小到大的排
  • zset的成员是唯一的,但分数(score)可以重复,但分数也重复时,按照元素值的字典顺序进行二次排序,字典顺序就是字符串的自然顺序;
  • 在这里引入zadd命令,格式为:
    zadd keyname score1 membername1 score2 membername2 ··· 
    //keyname就是zset的名字
    

4. 命令

  • 用于在 redis 服务上执行操作;
  • 要在 redis 服务上执行命令需要一个 redis 客户端。Redis 客户端在我们之前下载的的 redis 的安装包中;
  • 常见的命令形式见于另一处文档,此处只叙述如何启动服务器:
    //基本语法,用于启动客户端  
    $ redis-cli  
    
    //接下来我们检查服务器是否在运行,当输出是PONG时正常。  
    PING
    
    //在远程的redis上执行命令,同样使用redis-cli  
    redis-cli -h <主机地址> -p <端口码数> -a <账户密码>
    

5. 键/Key

  • 用于管理和使用key;
  • 基本语法格式为:COMMAND KEY_NAME (KEY_VALUE);
序号命令描述
1DEL key该命令用于在 key 存在时删除 key。
2DUMP KEY序列化给定 key,并返回序列化的值。
3EXISTS key检查给定 key 是否存在。
4EXPIRE key seconds为给定 key 设置过期时间,以秒计。
5EXPIREAT key timestampEXPIREAT 的作用和 EXPIRE 类似,都用于为 key 设置过期时间。不同在于 EXPIREAT 命令接受的时间戳是 UNIX 时间(unix timestamp)。
6PEXPIRE key milliseconds设置 key 的过期时间以毫秒计。
7PEXPIREAT key milliseconds-timestamp设置 key 过期时间的时间戳(以 UNIX 时间戳,unix timestamp 格式)以毫秒计。
8KEYS pattern查找符合给定模式(pattern)的 key。
9MOVE key db将当前数据库的 key 移动到指定的数据库 db 当中。
10PERSIST key移除 key 的过期时间,key 将持久保持。
11PTTL key以毫秒为单位返回 key 的剩余过期时间。
12TTL key以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。
13RANDOMKEY从当前数据库中随机返回一个 key。
14RENAME key newkey重命名 key 为 newkey。
15RENAMENX key newkey仅当 newkey 不存在时,将 key 改名为 newkey。
16SCAN cursor [MATCH pattern] [COUNT count]迭代当前数据库中的 key 集。
17TYPE key返回 key 所存储的值的类型。

6. String

  • 主要命令参见 Redis 字符串(String);
  • 或者我们可以阅读 官方档案;

7. Hash表

  • 主要命令参见Redis 哈希(Hash);

8. List

参见Redis 列表(List);

9. Set

参见Redis 集合(Set);

10. Zset

参见Redis 有序集合;

11. HyperLogLog*

  • 这是在2.8.9版本中新增加的结构,用来做基数统计的算法(即一个数据集中的唯一元素的个数是多少);
  • 特点是:
    1. 在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的
    2. 只会根据输入元素来计算基数,而不会储存输入元素本身,所以无法存储并返回具体的各个元素信息
    3. HyperLogLog 基于概率算法,它提供的是近似的基数估算,但误差非常小(标准误差约为 0.81%);
    4. HyperLogLog 允许将多个集合的基数估算合并为一个估算值,这使得它非常适合分布式基数估算

常见的命令形式:

  1. PFADD - 向 HyperLogLog 集合添加元素:

    • 命令格式:PFADD key element [element …]
    • 功能:将一个或多个元素添加到指定的 HyperLogLog 键中。如果元素已经存在,则不会重复添加。
    • 返回值:返回 1 如果至少有一个元素被添加,否则返回 0。
  2. PFCOUNT - 计算 HyperLogLog 集合的基数:

    1. 命令格式:PFCOUNT key [key …]
    2. 功能:返回给定 HyperLogLog 键的基数估算值。如果有多个键,返回这些键的并集的基数估算值。
    3. 返回值:返回估算的基数。
  3. PFMERGE - 合并多个 HyperLogLog 集合:

    1. 命令格式:PFMERGE destkey sourcekey [sourcekey …]
    2. 功能:将一个或多个 HyperLogLog 键合并到一个目标 HyperLogLog 键中。合并后的 HyperLogLog 键将包含所有输入键的元素。
    3. 返回值:总是返回 OK。

12. 发布订阅模式

  • 是一种消息通信模式,其中消息的发送者(发布者)不会将消息直接发送给特定的接收者(订阅者),而是将消息发布到一个频道(Channel),订阅了该频道的客户端都能接收到发布的消息。;
  • 非常适合实现消息队列、实时通知、聊天室等功能
  • 以下是 Redis 发布订阅的一些关键概念和命令:
    1. 频道(Channel):是发布订阅中消息发布的目的地,订阅者订阅频道以接收消息。

    2. 模式(Pattern):在发布订阅中,可以使用模式匹配来订阅一组频道,这使得消息的过滤和分发更加灵活

    3. 发布者(Publisher):向频道发送消息的客户端。

    4. 订阅者(Subscriber):订阅一个或多个频道,接收频道上的消息。

    5. 消息(Message):在频道上发送的数据,可以是任何字符串

  • 发布订阅的特点:
    1. 消息的无持久性:发布订阅的消息不是持久化的,一旦订阅者断开连接,将无法收到之前的消息。
    2. 实时性:发布订阅支持实时消息传递,适合需要快速响应的应用场景。
    3. 广播:发布的消息会被发送给所有订阅该频道的订阅者
    4. 模式匹配:通过模式订阅,可以实现更灵活的消息分发机制。
  • 发布订阅的命令:
    1. PUBLISH <channel> <message>: 将消息发送到指定的频道,返回值是接收到消息的订阅者数量;
    2. SUBSCRIBE <channel_1> [<channel_2> ...]订阅一个或多个频道,接收这些频道上的消息。当服务器进入订阅模式后,开始接收被订阅频道的消息;
    3. UNSUBSCRIBE [<channel_1> [<channel_2> ...]]退出订阅模式,或取消订阅一个或多个频道,不再接受来自频道的信息;
    4. PSUBSCRIBE pattern_1 [pattern_2 ...]订阅与模式匹配的频道,接受匹配模式的频道信息(类似于接收广播信号);
    5. PUNSUBSCRIBE [pattern [pattern ...]]取消模式订阅,或退出模式订阅模式;
    6. PUBSUB <subcommand> [argument [argument ...]]:用于查看订阅与发布系统状态,它由数个不同格式的子命令组成,将返回由活跃频道组成的列表;
  • 总结

    发布订阅模式在需要实现一对多或多对多通信的场景中非常有用,例如社交网络的通知系统、实时数据推送服务等。然而,由于消息的无持久性,它不适合需要保证消息可靠性传递的场景。

13. 事务

  • 是一个用于将多个命令打包在一起执行的功能,它可以确保这些命令要么全部执行,要么全部不执行,从而保持操作的原子性单个 Redis 事务内命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务间的执行并不是原子性的);

  • Redis事务并不提供传统数据库事务的所有特性,如回滚到事务开始前的状态;

  • 事务具有以下三个特点:

    1. 批量操作在发送 EXEC 命令前被放入队列缓存;
    2. 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行(因为是队列的结构);
    3. 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中类原子性,且插入到末尾不会影响开头的输出);
  • 事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做;

  • 由上面可知,一个事务会经历以下三个阶段:

    1. 开始事务;
    2. 事务中的命令入队;
    3. 执行事务;
    //一个典型的例子  
    redis 127.0.0.1:6379> MULTI
    OK
    
    redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"
    QUEUED
    
    redis 127.0.0.1:6379> GET book-name
    QUEUED
    
    redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series"
    QUEUED
    
    redis 127.0.0.1:6379> SMEMBERS tag
    QUEUED
    
    redis 127.0.0.1:6379> EXEC
    4) OK
    5) "Mastering C++ in 21 days"
    6) (integer) 3
    7) 1) "Mastering Series"
       1) "C++"
       2) "Programming"
    
  • 根据事务的发展阶段,有以下的命令形式:

    1. 事务开始于 MULTI 命令,这个命令会告诉 Redis 接下来的操作应该被视为一个事务的一部分;
    2. MULTI 命令之后,你可以发送任意数量的命令,这些命令将不会被立即执行,而是放入一个队列中等待。当命令在队列中,redis也会在执行前进行语法检查,如果有语法错误,EXEC 将返回失败;
    3. 使用 EXEC 命令执行事务EXEC命令会触发之前用MULTI开始的事务,并执行所有入队的命令。如果事务过程中发生错误,Redis 会返回null作为事务的结果,并且 EXEC命令将返回空数组;
    4. 如果你不想执行事务队列中的命令,可以使用 DISCARD 命令来取消事务
    5. Redis 提供了 WATCH [key1][key2,···]命令来监控一个或多个键,当然也可以用UNWATCH取消,如果在执行 EXEC 之前这些键被其他客户端改变,则事务将不会执行;
  • 事务的用例

    1. 【计数器】:用于实现原子递增或递减操作。
    2. 【用户会话】:同时更新多个字段。
    3. 【缓存更新】:在更新数据库的同时更新缓存;

14. 脚本

  • Redis使用Lua解释器来执行脚本,从2.6版本开始内嵌支持;

  • 执行脚本的常用命令是:EVAL;

  • 常用脚本命令如下:

    序号命令及描述
    1EVAL script numkeys key[key ...] arg[arg...]
    执行 Lua 脚本。
    2(未提供描述,可能是遗漏)
    3EVALSHA sha1 numkeys key[key ...] arg[arg...]
    执行 Lua 脚本。
    4SCRIPT EXISTS script[script ...]
    查看指定的脚本是否已经被保存在缓存当中。
    5SCRIPT FLUSH
    从脚本缓存中移除所有脚本。
    6SCRIPT KILL
    杀死当前正在运行的 Lua 脚本。
    7SCRIPT LOAD script
    将脚本 script 添加到脚本缓存中,但并不立即执行这个脚本。

15. 连接

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

  • 以下为常用的连接命令:

    序号命令及描述
    1AUTH password
    验证密码是否正确
    2ECHO message
    打印字符串
    3PING
    查看服务是否运行
    4QUIT
    关闭当前连接
    5SELECT index
    切换到指定的数据库

16. 服务器

  • 服务器命令主要是用于管理 redis 服务;
  • 常见的服务器命令如下:
序号命令及描述
1BGREWRITEAOF
异步执行一个 AOF(Append Only File)文件重写操作
2BGSAVE
在后台异步保存当前数据库的数据到磁盘
3CLIENT KILL [ip:port] [ID client-id]
关闭客户端连接
4CLIENT LIST
获取连接到服务器的客户端连接列表
5CLIENT GETNAME
获取连接的名称
6CLIENT PAUSE timeout
在指定时间内暂停运行来自客户端的命令
7CLIENT SETNAME connection-name
设置当前连接的名称
8CLUSTER SLOTS
获取集群节点的映射插槽
9COMMAND
获取Redis命令详情数组
10COMMAND COUNT
获取Redis命令总数
11COMMAND GETKEYS
获取给定命令的所有键
12TIME
返回当前服务器时间
13COMMAND INFO command-name [command-name ...]
获取指定Redis命令描述的数组
14CONFIG GET parameter
获取指定配置参数的值
15CONFIG REWRITE
对启动 Redis 服务器时所指定的 redis.conf 配置文件进行改写
16CONFIG SET parameter value
修改 Redis 配置参数,无需重启
17CONFIG RESETSTAT
重置 INFO 命令中的某些统计数据
18DBSIZE
返回当前数据库的 key 的数量
19DEBUG OBJECT key
获取 key 的调试信息
20DEBUG SEGFAULT
让 Redis 服务崩溃
21FLUSHALL
删除所有数据库的所有 key
22FLUSHDB
删除当前数据库的所有 key
23INFO [section]
获取 Redis 服务器的各种信息和统计数值
24LASTSAVE
返回最近一次 Redis 成功将数据保存到磁盘上的时间,以 UNIX 时间格式表示
25MONITOR
实时打印出 Redis 服务器接收到的命令,调试用
26ROLE
返回主从实例所属的角色
27SAVE
同步保存数据到硬盘
28SHUTDOWN [NOSAVE].[SAVE]
异步保存数据到硬盘,并关闭服务器
29SLAVEOF host_port
将当前服务器转变为指定服务器的从属服务器(slave server)
30SLOWLOG subcommand [argument]
管理 Redis 的慢日志
31SYNC
用于复制功能(replication)的内部命令

17. GEO

  • 主要用于存储地理位置信息,并对存储的信息进行操作;

  • 首先是 geoadd 命令,用于添加地理位置的坐标。语法格式如下:

    GEOADD key longitude latitude member [longitude latitude member ...]
    
    //一个实例:
    redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
    
    (integer) 2
    
  • 然后是 geopos 方法,用于从给定的 key 里返回所有指定名称(member)的位置(经度和纬度),不存在的返回nil。其语法格式为:

    GEOPOS key member [member ...]
    
  • 之后是 geolist 方法,用于返回两个给定位置之间的距离。可以在最后指定距离单位,如:m/米、km/千米、mi/英里、ft/英尺,其具体语法格式为:

    GEODIST key member1 member2 [m|km|ft|mi]
    
  • georadiusgeoradiusbymember 都能找出与中心的距离不超过给定最大距离的元素,前者是给定经纬度为中心;后者是选择给定的键值元素位置为中心。两者的具体语法格式是:

    GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
    GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]  
    
    //参数说明:  
    m :米,默认单位。
    km :千米。
    mi :英里。
    ft :英尺。
    WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。
    WITHCOORD: 将位置元素的经度和维度也一并返回。
    WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。
    COUNT 限定返回的记录数。
    ASC: 查找结果根据距离从近到远排序。
    DESC: 查找结果根据从远到近排序。
    
    //一个实例:  
    redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
    
    (integer) 2
    
    redis> GEORADIUS Sicily 15 37 200 km WITHDIST
    
    1) 1) "Palermo"
    
       2) "190.4424"
    
    2) 1) "Catania"
    
       2) "56.4413"
    
    redis> GEORADIUS Sicily 15 37 200 km WITHCOORD
    
    1) 1) "Palermo"
    
       2) 1) "13.36138933897018433"
    
          2) "38.11555639549629859"
    
    2) 1) "Catania"
    
       2) 1) "15.08726745843887329"
    
          2) "37.50266842333162032"
    
    redis> GEORADIUS Sicily 15 37 200 km WITHDIST WITHCOORD
    
    1) 1) "Palermo"
    
       2) "190.4424"
    
       3) 1) "13.36138933897018433"
    
          2) "38.11555639549629859"
    
    2) 1) "Catania"
    
       2) "56.4413"
    
       3) 1) "15.08726745843887329"
    
          2) "37.50266842333162032"
    
    redis> 
    
  • 最后是 geohash 。它用于保存地理位置的坐标,可以一次获取一个乃至多个位置元素的值。其具体语法格式如下:

    GEOHASH key member [member ...]
    

18. Stream

  • 是 Redis 5.0 版本新增加的数据结构;

  • 主要用于消息队列(MQ,Message Queue),它是针对发布订阅(pub/sub)消息无法持久化(网络断开、Redis宕机等会导致消息被丢弃)的缺点,开发出的能提供高性能的、持久化的、有序的消息传递的机制。它可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失;

  • Redis Stream的结构主体是一个消息链表,将所有加入的消息痘串起来,每个消息都有一个唯一的 ID 和对应的内容
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 以下是Streams的主要特性:

    1. 消息流(Stream)
      • Redis Stream 是一个有序的、持久化的消息流。;
      • 消息以时间顺序追加到流中,并且每个消息都有一个唯一的ID;
      • 消息可以按照发布者-订阅者模式进行分发
    2. 消息
      • 消息由一个包含键值对的条目组成;
      • 消息条目(Entry) 由一个唯一的 ID 和一个字段-值对的集合组成;
      • 消息流中的每个消息都有一个自增的唯一 ID,这个 ID 在消息流中是全局唯一的;
    3. 消费者组(Consumer Group)
      • 消费者组是一组逻辑上关联的消费者(消费者消费信息);
      • 消费者组可以共同消费一个消息流中的消息,每个消息条目只会被消费者组中的一个消费者消费;
      • 消费者组可以实现消息的负载均衡和高可用性;
  • 以下介绍信息流信息信息条目之间的关系:

    1. 一个信息流可以包含多个信息(Message);
    2. 每个信息(Message)由一个或多个信息条目(Entry)组成,其中信息所谓唯一的ID是信息中最后一个信息条目的ID
    3. 每个信息条目都有一个唯一的ID,用于标识和区分不同的信息条目
  • 每个 Stream 都有唯一的名称,它就是 Redis 的 key,我们可以向其中添加新的信息条目,并从中读取和处理信息。它由我们在首次使用xadd命令追加消息的时候自动创建

    1. 消息队列相关命令:

      • XADD - 添加消息到尾部
      • XTRIM - 对流进行修剪,限制长度
      • XDEL - 删除消息
      • XLEN - 获取流包含的元素数量,即消息长度
      • XRANGE - 获取消息列表,会自动过滤已经删除的消息
      • XREVRANGE - 反向获取消息列表,ID 从大到小
      • XREAD - 以阻塞或非阻塞方式获取消息列表;
    2. 消费者组相关命令:

      • XGROUP CREATE - 创建消费者组
      • XREADGROUP GROUP - 读取消费者组中的消息
      • XACK - 将消息标记为“已处理”
      • XGROUP SETID - 为消费者组设置新的最后递送消息ID
      • XGROUP DELCONSUMER - 删除消费者
      • XGROUP DESTROY - 删除消费者组
      • XPENDING - 显示待处理消息的相关信息
      • XCLAIM - 转移消息的归属权
      • XINFO - 查看流和消费者组的相关信息
      • XINFO GROUPS - 打印消费者组的信息
      • XINFO STREAM - 打印流信息
  • 以下具体语法介绍,详见于Redis Stream方法一文;

  • 一个实例:

//使用XADD创建消息队列,这里“*”的意思是生成唯一的ID
redis> XADD mystream * name Sara surname OConnor

"1601372323627-0"

redis> XADD mystream * field1 value1 field2 value2 field3 value3

"1601372323627-1"

redis> XLEN mystream

(integer) 2

//XRANGE中的“-”和“+”代表从最早的消息开始,和从最新的消息开始。连着写代表获取全部的信息。
//当然你也可以指定从新到旧读取的信息数,即使用COUNT <数字>;
//又或者使用消息的ID指定范围。
redis> XRANGE mystream - +

1) 1) "1601372323627-0"

   2) 1) "name"

      2) "Sara"

      3) "surname"

      4) "OConnor"

2) 1) "1601372323627-1"

   2) 1) "field1"

      2) "value1"

      3) "field2"

      4) "value2"

      5) "field3"

      6) "value3"

redis> 

19. 数据备份和数据恢复

  • Redis 的 SAVE 命令用于创建当前数据库的备份,该命令将在 redis 安装目录中创建 dump.rdb 文件;
  • 如果需要恢复数据,只需将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可
  • 获取 redis 目录可以使用 CONFIG 命令,查找redis的安装位置可以使用CONFIG GET dir
  • 除此以外,redis还可以使用 BGSAVEBackground saving)命令,它可以在后台执行备份任务

20. 安全

  • 可以通过 redis 的配置文件设置密码参数,这样客户端连接到 redis 服务就需要密码验证,这样可以让你的 redis 服务更安全;
  • 可以使用CONFIG get requirepass查看是否设置了密码验证。当输出的参数显示是空的,则说明当前无需通过密码验证就可以连接到 redis 服务;
  • 你可以通过设置 set requirepass <密码> 的方式来设置密码验证;
  • 当你需要登录时,可以使用 AUTH <密码> 进行登录;

21. 性能测试

  • 是通过同时执行多个命令实现的;
  • 测试使用redis-benchmark这个自带的实用工具进行;
  • 基本命令如下:
    redis-benchmark [option] [option value]
    //该命令是在 redis 的目录下执行的,而不是 redis 客户端的内部指令。
    
  • 关于测试的详细内容,我在另一份文档中呈现;

22. 客户端连接

  • Redis 与客户端之间的连接是通过网络协议实现的。Redis 使用自己的轻量级协议,称为 RESP(REdis Serialization Protocol),来与客户端进行通信;
  • Redis 采用经典的客户端-服务器架构,其中服务器负责处理客户端的请求,并返回响应、客户端可以是任何支持Redis协议的应用程序或库,用于向 Redis 服务器发送命令并接收响应:

连接过程

  • Redis 服务器监听一个特定的 TCP 端口(默认是6379)或者Unix socket 的方式,等待客户端连接;客户端通过 TCP/IP 协议连接到 Redis 服务器的指定端口。客户端与 Redis 服务器之间建立 TCP 连接后,可以开始发送命令和接收响应。此时,客户端 socket 会被设置为非阻塞模式因为 Redis 在网络事件处理上采用的是非阻塞多路复用模型)。然后,为这个 socket 设置TCP_NODELAY属性,禁用Nagle算法。最后创建一个可读的文件事件用于监听这个客户端 socket 的数据发送;

RESP协议

  • 是 Redis 用于客户端-服务器通信的协议。它简单、高效,支持多种数据类型;
  • 它的主要特性有:
    1. 简单字符串以 + 开头,例如:+OK\r\n;
    2. 错误消息以 - 开头,例如:-Error message\r\n;
    3. 整数以 : 开头,例如::1000\r\n;
    4. 批量字符串以 $ 开头,例如:$6\r\nfoobar\r\n;
    5. 数组:以 * 开头,例如:*2\r\n$3\r\nfoo\r\n$3\r\nbar\r\n

命令执行流程

  1. 客户端发送命令: 客户端通过 TCP 连接发送命令给 Redis 服务器。命令是按 RESP 协议格式化的,例如:SET key value\r\n
  2. 服务器解析命令: Redis 服务器接收到命令后,解析并执行相应的操作;
  3. 服务器返回响应: 命令执行完毕后,Redis 服务器通过 TCP 连接将结果按 RESP 格式返回给客户端;

连接方式

  • 持久连接: 客户端与 Redis 服务器之间的连接在多次请求间保持打开状态。适用于需要频繁与 Redis 交互的应用;
  • 短连接: 每次请求后客户端关闭连接。这种方式适用于偶尔与 Redis 交互的应用;

连接管理

  • 连接池: 一些 Redis 客户端库实现了连接池,管理多个连接以提高性能和并发性;
  • 超时设置: 可以配置客户端和服务器的连接超时,以防止长时间的空闲连接占用资源;
  • 最大连接数:在 Redis2.4 中,最大连接数是被直接硬编码在代码里面的,而在 Redis2.6 版本中这个值变成可配置的。maxclients 的默认值是 10000,你也可以在 redis.conf 中对这个值进行修改,如redis-server --maxclients <想要的值>

关于客户端连接,有一些命令:

客户端命令

S.N.命令描述
1CLIENT LIST返回连接到 redis 服务的客户端列表
2CLIENT SETNAME设置当前连接的名称
3CLIENT GETNAME获取通过 CLIENT SETNAME 命令设置的服务名称
4CLIENT PAUSE挂起客户端连接,指定挂起的时间以毫秒计
5CLIENT KILL关闭客户端连接

23. 管道命令

  • 详见于专门的笔记,此处略;

24. 分区

  • 分区是分割数据到多个Redis实例的处理过程,因此每个实例只保存key的一个子集(云计算实现的关键技术);
  • 分区具有以下优势:
    1. 通过利用多台计算机内存的和值,允许我们构造更大的数据库;
    2. 通过多核和多台计算机,允许我们扩展计算能力;通过多台计算机和网络适配器,允许我们扩展网络带宽;
  • 分区具有一些不足:
    1. 多个key的操作通常是不被支持的。举例来说,当两个set映射到不同的redis实例上时,你就不能对这两个set执行交集操作;
    2. 涉及多个key的redis事务不能使用;
    3. 当使用分区时,数据处理较为复杂,比如你需要处理多个rdb/aof文件,并且从多个实例和主机备份持久化文件;
    4. 增加或删除容量也比较复杂。redis集群大多数支持在运行时增加、删除节点的透明数据平衡的能力,但是类似于客户端分区、代理等其他系统则不支持这项特性。然而,一种叫做 presharding 的技术对此是有帮助的。
  • Redis 有两种类型分区:
    1. 范围分区
      • 最简单的分区方式是按范围(ID)分区,就是映射一定范围的对象到特定的Redis实例;
      • 这种方式是可行的,并且在实际中使用。不足就是要有一个区间范围到实例的映射表。这个表要被管理,同时还需要各 种对象的映射表,通常对Redis来说并非是好的方法;
    2. 哈希分区
      • 另外一种分区方法是hash分区。这对任何key都适用,也无需是object_name:这种形式;
      • 其具体做法类似于:
        1. 用一个hash函数将key转换为一个数字,比如使用crc32 hash函数。对key foobar执行crc32(foobar)会输出类似93024922的整数;
        2. 对这个整数取模,将其转化为0-3之间的数字,就可以将这个整数映射到4个Redis实例中的一个了。93024922 % 4 = 2,就是说key foobar应该被存到R2实例中。注意:取模操作是取除的余数,通常在多种编程语言中用%操作符实现;
          `** 的技术对此是有帮助的。
  • Redis 有两种类型分区:
    1. 范围分区
      • 最简单的分区方式是按范围(ID)分区,就是映射一定范围的对象到特定的Redis实例;
      • 这种方式是可行的,并且在实际中使用。不足就是要有一个区间范围到实例的映射表。这个表要被管理,同时还需要各 种对象的映射表,通常对Redis来说并非是好的方法;
    2. 哈希分区
      • 另外一种分区方法是hash分区。这对任何key都适用,也无需是object_name:这种形式;
      • 其具体做法类似于:
        1. 用一个hash函数将key转换为一个数字,比如使用crc32 hash函数。对key foobar执行crc32(foobar)会输出类似93024922的整数;
        2. 对这个整数取模,将其转化为0-3之间的数字,就可以将这个整数映射到4个Redis实例中的一个了。93024922 % 4 = 2,就是说key foobar应该被存到R2实例中。注意:取模操作是取除的余数,通常在多种编程语言中用%操作符实现;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/795927.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【密码学基础】基于LWE(Learning with Errors)的全同态加密方案

学习资源&#xff1a; 全同态加密I&#xff1a;理论与基础&#xff08;上海交通大学 郁昱老师&#xff09; 全同态加密II&#xff1a;全同态加密的理论与构造&#xff08;Xiang Xie老师&#xff09; 现在第二代&#xff08;如BGV和BFV&#xff09;和第三代全同态加密方案都是基…

基于R语言的水文、水环境模型优化技术及快速率定方法与多模型案例

在水利、环境、生态、机械以及航天等领域中&#xff0c;数学模型已经成为一种常用的技术手段。同时&#xff0c;为了提高模型的性能&#xff0c;减小模型误用带来的风险&#xff1b;模型的优化技术也被广泛用于模型的使用过程。模型参数的快速优化技术不但涉及到优化本身而且涉…

单元测试Mockito笔记

文章目录 单元测试Mockito1. 入门1.1 什么是Mockito1.2 优势1.3 原理 2. 使用2.0 环境准备2.1 Mock1) Mock对象创建2) 配置Mock对象的行为(打桩)3) 验证方法调用4) 参数匹配5) 静态方法 2.2 常用注解1) Mock2) BeforeEach 与 BeforeAfter3) InjectMocks4) Spy5) Captor6) RunWi…

window下tqdm进度条

原代码是linux下运行&#xff0c;修改后可在window下运行。 #ifndef TQDM_H #define TQDM_H#include <chrono> #include <ctime> #include <numeric> #include <ios> #include <string> #include <cstdlib> #include <iostream> #i…

MacOS 通过Docker安装宝塔面板搭建PHP开发环境

1、docker拉取ubuntu系统 docker pull ubuntu2、运行容器 docker run -i -t -d --name bt -p 20:20 -p 21:21 -p 80:80 -p 443:443 -p 888:888 -p 8888:8888 -p 3306:3306 -p 6379:6379 --privilegedtrue -v /Users/oi/Sites:/www/wwwroot ubuntu-v 后的 /Users/oi/Sites 代表…

分布式系统—Ceph块存储系统(RBD接口)

目录 一、服务端操作 1 创建一个名为 rbd-xy101 的专门用于 RBD 的存储池 2 将存储池转换为 RBD 模式 3 初始化存储池 4 创建镜像 5 管理镜像 6.Linux客户端使用 在管理节点创建并授权一个用户可访问指定的 RBD 存储池 ​编辑修改RBD镜像特性&#xff0c;CentOS7默认情…

fastadmin 如何通过权限组来控制列的显示与隐藏

方法1 以版本控制&#xff08;application/admin/controller/Version.php&#xff09;为例子 需求 就是在有时候&#xff0c;有些列不想让这个权限组的人看到&#xff0c;只给制定的权限组的人看 1.给权限组创建一个字段 ALTER TABLE lt_auth_group ADD COLUMN isBoothView T…

RMAN备份与还原

进入 rman 工具 rman target / 查看 rman 配置 rman> show all; 修改rman 配置 数据库全备 rman> run {allocate channel c1 type disk;allocate channel c2 type disk;backup incremental level 0 database format /home/oracle/backup/full_%d_%s_%t.bak;sql alte…

连接与隔离:Facebook在全球化背景下的影响力

在当今全球化的背景下&#xff0c;Facebook作为全球最大的社交网络平台&#xff0c;不仅连接了世界各地的人们&#xff0c;还在全球社会、经济和文化中发挥着深远的影响。本文将深入探讨Facebook在全球化进程中的作用&#xff0c;以及其对个体和社会之间连接与隔离的双重影响。…

C/C++ 进阶(7)模拟实现map/set

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a;C 一、简介 map和set都是关联性容器&#xff0c;底层都是用红黑树写的。 特点&#xff1a;存的Key值都是唯一的&#xff0c;不重复。 map存的是键值对&#xff08;Key—Value&#xff09;。 set存的是键…

我的世界1.21多种服务端开服教程,原版/Forge/Fabric/Paper/Mohist...,Minecraft开服教程

Minecraft&#xff08;MC&#xff09;1.21版多种服务端开服教程&#xff0c;我的世界1.21服务器搭建教程&#xff0c;MC原版/Forge/Fabric/Paper/Mohist服务端搭建教程&#xff0c;我的世界MOD/插件服开服教程。 本教程使用 Linux系统MCSManager 面板来搭建Minecraft服务器。 …

每天一个数据分析题(四百二十七)- 方差分析

下面是一个方差分析表&#xff1a; 表中A&#xff0c;B&#xff0c;C&#xff0c;D&#xff0c;E五个单元格内的数据分别是&#xff08; &#xff09;。 A. 40&#xff0c;5&#xff0c;35&#xff0c;60&#xff0c;1.71 B. 40&#xff0c;5&#xff0c;35&#xff0c;60&a…

ES 慢上游响应问题优化在用户体验场景中的实践

在抖音亿级日活流量的情况下&#xff0c;每天收到的用户反馈也是大量的&#xff0c;而用户反馈对于产品的发展与未来是至关重要的&#xff0c;因此用户体验管理平台&#xff08;简称VoC&#xff09;就应运而生&#xff0c;VoC 平台旨在通过技术平台化的方式&#xff0c;结合反馈…

Spring系统学习 - Spring事务的概念

提到事务&#xff0c;这个我们应该比较熟悉了&#xff0c;在数据库学习的过程中&#xff0c;我们或多或少接触过了事务&#xff0c;当然你可能没有用到&#xff0c;也可能用到了&#xff0c;这篇博客我们将围绕Spring的相关事务的概念进行&#xff0c;了解Spring中的事务和事务…

ChatGPT Mac App 发布!

2024 年 6 月&#xff0c;OpenAI 的大语言模型 ChatGPT 的 Mac 客户端与 ChatGPT-4o 一起发布了。ChatGPT Mac 户端可以让用户直接在 Mac 电脑上使用 ChatGPT 进行对话。它提供了一个简单易用的用户界面&#xff0c;用户可以在其中输入文本或语音指令&#xff0c;并接收模型生成…

JavaDS —— 栈 Stack 和 队列 Queue

栈的概念 栈是一种先进后出的线性表&#xff0c;只允许在固定的一端进行插入和删除操作。 进行插入和删除操作的一端被称为栈顶&#xff0c;另一端被称为栈底 栈的插入操作叫做进栈/压栈/入栈 栈的删除操作叫做出栈 现实生活中栈的例子&#xff1a; 栈的模拟实现 下面是Jav…

对照ui图进行大屏幕适配,echerts适配

1.先找到ui图&#xff0c;我这边是1920*1080的屏幕进行的设计 2.在界面找到跟样式的字体大小&#xff0c;进行设置&#xff0c;一般ui设置字体大小便可 3.在js中写入原生js代码 function adapter() {//获取布局视口宽度&#xff0c;布局视口设备横向独立像素值const dpWidth…

在 PostgreSQL 里如何处理数据的归档和清理策略的优化?

文章目录 在 PostgreSQL 中处理数据归档和清理策略的优化一、理解数据归档和清理的重要性二、确定归档和清理的标准三、PostgreSQL 中的数据归档方法&#xff08;一&#xff09;使用分区表&#xff08;二&#xff09;导出数据 四、PostgreSQL 中的数据清理方法&#xff08;一&a…

web3.0的业务场景分析

Web3.0作为互联网的下一个阶段&#xff0c;其核心特点是去中心化、自治、安全和透明。相比于Web2.0&#xff0c;Web3.0将用户数据的所有权和控制权归还给用户&#xff0c;并通过区块链技术等手段确保数据的安全和透明。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发…

Uniapp鸿蒙项目实战

Uniapp鸿蒙项目实战 24.7.6 Dcloud发布了uniapp兼容鸿蒙的文档&#xff1a;Uniapp开发鸿蒙应用 在实际使用中发现一些问题&#xff0c;开贴记录一下 设备准备 windows电脑准备&#xff08;家庭版不行&#xff0c;教育版、企业版、专业版也可以&#xff0c;不像uniapp说的只有…