- Redis 基础
- Redis - 首页
- Redis - 概述
- Redis - 环境
- Redis - 配置
- Redis - 数据类型
- Redis 命令
- Redis - 命令
- Redis - 键
- Redis - 字符串
- Redis - 哈希
- Redis - 列表
- Redis - 集合
- Redis - 有序集合
- Redis - HyperLogLog
- Redis - 发布订阅
- Redis - 事务
- Redis - 脚本
- Redis - 连接
- Redis - 服务器
- Redis 高级
- Redis - 备份
- Redis - 安全
- Redis - 基准测试
- Redis - 客户端连接
- Redis - 管道
- Redis - 分区
- Redis - Java
- Redis - Php
- Redis 有用资源
- Redis - 快速指南
- Redis - 有用资源
- Redis - 讨论
Redis - 快速指南
Redis - 概述
Redis 是一个开源的、高级的键值存储,是构建高性能、可扩展 Web 应用程序的理想解决方案。
Redis 有三个主要特点使其与众不同。
Redis 将其数据库完全存储在内存中,仅使用磁盘进行持久化。
与许多键值数据存储相比,Redis 具有相对丰富的 数据类型。
Redis 可以将数据复制到任意数量的从服务器。
Redis 优势
以下是 Redis 的一些优势。
异常快速 - Redis 非常快,每秒可以执行大约 110000 次 SET 操作,大约 81000 次 GET 操作。
支持丰富的数据类型 - Redis 原生支持开发人员已经了解的大多数数据类型,例如列表、集合、有序集合和哈希。这使得解决各种问题变得容易,因为我们知道哪个问题可以通过哪种数据类型更好地处理。
操作是原子性的 - 所有 Redis 操作都是原子性的,这确保了如果两个客户端同时访问,Redis 服务器将接收更新后的值。
多功能工具 - Redis 是一个多功能工具,可用于多种用例,例如缓存、消息队列(Redis 原生支持发布/订阅)、应用程序中的任何短期数据,例如 Web 应用程序会话、网页点击次数等。
Redis 与其他键值存储的比较
Redis 是键值数据库中不同的发展路径,其中值可以包含更复杂的数据类型,并在这些数据类型上定义原子操作。
Redis 是一个内存数据库,但也是一个持久化到磁盘的数据库,因此它代表了一种不同的权衡,其中通过限制无法大于内存的数据集来实现非常高的写入和读取速度。
内存数据库的另一个优点是,与磁盘上的相同数据结构相比,复杂数据结构的内存表示更容易操作。因此,Redis 可以用很少的内部复杂性完成很多事情。
Redis - 环境
在本章中,您将学习 Redis 的环境设置。
在 Ubuntu 上安装 Redis
要在 Ubuntu 上安装 Redis,请转到终端并键入以下命令:
$sudo apt-get update $sudo apt-get install redis-server
这将在您的机器上安装 Redis。
启动 Redis
$redis-server
检查 Redis 是否正在工作
$redis-cli
这将打开一个 redis 提示符。
redis 127.0.0.1:6379>
在上面的提示符中,127.0.0.1 是您机器的 IP 地址,6379 是 Redis 服务器正在运行的端口。现在键入以下 PING 命令。
redis 127.0.0.1:6379> ping PONG
这表明 Redis 已成功安装在您的机器上。
在 Ubuntu 上安装 Redis Desktop Manager
要在 Ubuntu 上安装 Redis 桌面管理器,只需从 https://redisdesktop.com/download 下载软件包即可
打开下载的软件包并安装它。
Redis 桌面管理器将为您提供管理 Redis 键和数据的 UI。
Redis - 配置
在 Redis 中,在 Redis 的根目录下有一个配置文件(redis.conf)。虽然您可以通过 Redis CONFIG 命令获取和设置所有 Redis 配置。
语法
以下是 Redis CONFIG 命令的基本语法。
redis 127.0.0.1:6379> CONFIG GET CONFIG_SETTING_NAME
示例
redis 127.0.0.1:6379> CONFIG GET loglevel 1) "loglevel" 2) "notice"
要获取所有配置设置,请在 CONFIG_SETTING_NAME 处使用 *
示例
redis 127.0.0.1:6379> CONFIG GET * 1) "dbfilename" 2) "dump.rdb" 3) "requirepass" 4) "" 5) "masterauth" 6) "" 7) "unixsocket" 8) "" 9) "logfile" 10) "" 11) "pidfile" 12) "/var/run/redis.pid" 13) "maxmemory" 14) "0" 15) "maxmemory-samples" 16) "3" 17) "timeout" 18) "0" 19) "tcp-keepalive" 20) "0" 21) "auto-aof-rewrite-percentage" 22) "100" 23) "auto-aof-rewrite-min-size" 24) "67108864" 25) "hash-max-ziplist-entries" 26) "512" 27) "hash-max-ziplist-value" 28) "64" 29) "list-max-ziplist-entries" 30) "512" 31) "list-max-ziplist-value" 32) "64" 33) "set-max-intset-entries" 34) "512" 35) "zset-max-ziplist-entries" 36) "128" 37) "zset-max-ziplist-value" 38) "64" 39) "hll-sparse-max-bytes" 40) "3000" 41) "lua-time-limit" 42) "5000" 43) "slowlog-log-slower-than" 44) "10000" 45) "latency-monitor-threshold" 46) "0" 47) "slowlog-max-len" 48) "128" 49) "port" 50) "6379" 51) "tcp-backlog" 52) "511" 53) "databases" 54) "16" 55) "repl-ping-slave-period" 56) "10" 57) "repl-timeout" 58) "60" 59) "repl-backlog-size" 60) "1048576" 61) "repl-backlog-ttl" 62) "3600" 63) "maxclients" 64) "4064" 65) "watchdog-period" 66) "0" 67) "slave-priority" 68) "100" 69) "min-slaves-to-write" 70) "0" 71) "min-slaves-max-lag" 72) "10" 73) "hz" 74) "10" 75) "no-appendfsync-on-rewrite" 76) "no" 77) "slave-serve-stale-data" 78) "yes" 79) "slave-read-only" 80) "yes" 81) "stop-writes-on-bgsave-error" 82) "yes" 83) "daemonize" 84) "no" 85) "rdbcompression" 86) "yes" 87) "rdbchecksum" 88) "yes" 89) "activerehashing" 90) "yes" 91) "repl-disable-tcp-nodelay" 92) "no" 93) "aof-rewrite-incremental-fsync" 94) "yes" 95) "appendonly" 96) "no" 97) "dir" 98) "/home/deepak/Downloads/redis-2.8.13/src" 99) "maxmemory-policy" 100) "volatile-lru" 101) "appendfsync" 102) "everysec" 103) "save" 104) "3600 1 300 100 60 10000" 105) "loglevel" 106) "notice" 107) "client-output-buffer-limit" 108) "normal 0 0 0 slave 268435456 67108864 60 pubsub 33554432 8388608 60" 109) "unixsocketperm" 110) "0" 111) "slaveof" 112) "" 113) "notify-keyspace-events" 114) "" 115) "bind" 116) ""
编辑配置
要更新配置,您可以直接编辑 redis.conf 文件,也可以通过 CONFIG set 命令更新配置。
语法
以下是 CONFIG SET 命令的基本语法。
redis 127.0.0.1:6379> CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE
示例
redis 127.0.0.1:6379> CONFIG SET loglevel "notice" OK redis 127.0.0.1:6379> CONFIG GET loglevel 1) "loglevel" 2) "notice"
Redis - 数据类型
Redis 支持 5 种数据类型。
字符串
Redis 字符串是一系列字节。Redis 中的字符串是二进制安全的,这意味着它们具有已知的长度,而不是由任何特殊的终止字符确定的。因此,您可以在一个字符串中存储多达 512 兆字节的内容。
示例
redis 127.0.0.1:6379> SET name "tutorialspoint" OK redis 127.0.0.1:6379> GET name "tutorialspoint"
在上面的示例中,SET 和 GET 是 Redis 命令,name 是 Redis 中使用的键,tutorialspoint 是存储在 Redis 中的字符串值。
注意 - 字符串值的最大长度为 512 兆字节。
哈希
Redis 哈希是键值对的集合。Redis 哈希是在字符串字段和字符串值之间映射。因此,它们用于表示对象。
示例
redis 127.0.0.1:6379> HMSET user:1 username tutorialspoint password tutorialspoint points 200 OK redis 127.0.0.1:6379> HGETALL user:1 1) "username" 2) "tutorialspoint" 3) "password" 4) "tutorialspoint" 5) "points" 6) "200"
在上面的示例中,哈希数据类型用于存储包含用户基本信息的用户信息对象。这里 HMSET, HGETALL 是 Redis 的命令,而 user - 1 是键。
每个哈希可以存储多达 232 - 1 个字段值对(超过 40 亿个)。
列表
Redis 列表只是字符串列表,按插入顺序排序。您可以将元素添加到 Redis 列表的头部或尾部。
示例
redis 127.0.0.1:6379> lpush tutoriallist redis (integer) 1 redis 127.0.0.1:6379> lpush tutoriallist mongodb (integer) 2 redis 127.0.0.1:6379> lpush tutoriallist rabitmq (integer) 3 redis 127.0.0.1:6379> lrange tutoriallist 0 10 1) "rabitmq" 2) "mongodb" 3) "redis"
列表的最大长度为 232 - 1 个元素(4294967295,每个列表超过 40 亿个元素)。
集合
Redis 集合是字符串的无序集合。在 Redis 中,您可以添加、删除和测试成员的存在性,时间复杂度为 O(1)。
示例
redis 127.0.0.1:6379> sadd tutoriallist redis (integer) 1 redis 127.0.0.1:6379> sadd tutoriallist mongodb (integer) 1 redis 127.0.0.1:6379> sadd tutoriallist rabitmq (integer) 1 redis 127.0.0.1:6379> sadd tutoriallist rabitmq (integer) 0 redis 127.0.0.1:6379> smembers tutoriallist 1) "rabitmq" 2) "mongodb" 3) "redis"
注意 - 在上面的示例中,rabitmq 添加了两次,但是由于集合的唯一属性,它只添加了一次。
集合中成员的最大数量为 232 - 1(4294967295,每个集合超过 40 亿个成员)。
有序集合
Redis 有序集合类似于 Redis 集合,是字符串的非重复集合。不同之处在于,有序集合的每个成员都与一个分数相关联,该分数用于按顺序排列有序集合,从小到大的分数。虽然成员是唯一的,但分数可以重复。
示例
redis 127.0.0.1:6379> zadd tutoriallist 0 redis (integer) 1 redis 127.0.0.1:6379> zadd tutoriallist 0 mongodb (integer) 1 redis 127.0.0.1:6379> zadd tutoriallist 0 rabitmq (integer) 1 redis 127.0.0.1:6379> zadd tutoriallist 0 rabitmq (integer) 0 redis 127.0.0.1:6379> ZRANGEBYSCORE tutoriallist 0 1000 1) "redis" 2) "mongodb" 3) "rabitmq"
Redis - 命令
Redis 命令用于对 Redis 服务器执行一些操作。
要在 Redis 服务器上运行命令,您需要一个 Redis 客户端。Redis 客户端在 Redis 软件包中可用,我们之前已经安装了它。
语法
以下是 Redis 客户端的基本语法。
$redis-cli
示例
以下示例说明了如何启动 Redis 客户端。
要启动 Redis 客户端,请打开终端并键入命令 redis-cli。这将连接到您的本地服务器,现在您可以运行任何命令。
$redis-cli redis 127.0.0.1:6379> redis 127.0.0.1:6379> PING PONG
在上面的示例中,我们连接到在本地机器上运行的 Redis 服务器并执行命令 PING,该命令检查服务器是否正在运行。
在远程服务器上运行命令
要在 Redis 远程服务器上运行命令,您需要使用相同的客户端 redis-cli 连接到服务器
语法
$ redis-cli -h host -p port -a password
示例
以下示例显示了如何连接到 Redis 远程服务器,该服务器在主机 127.0.0.1 上运行,端口为 6379,并且密码为 mypass。
$redis-cli -h 127.0.0.1 -p 6379 -a "mypass" redis 127.0.0.1:6379> redis 127.0.0.1:6379> PING PONG
Redis - 键
Redis 键命令用于管理 Redis 中的键。以下是使用 redis 键命令的语法。
语法
redis 127.0.0.1:6379> COMMAND KEY_NAME
示例
redis 127.0.0.1:6379> SET tutorialspoint redis OK redis 127.0.0.1:6379> DEL tutorialspoint (integer) 1
在上面的示例中,DEL 是命令,而 tutorialspoint 是键。如果键被删除,则命令的输出将为 (integer) 1,否则将为 (integer) 0。
Redis 键命令
下表列出了一些与键相关的基本命令。
序号 | 命令和描述 |
---|---|
1 | DEL key
此命令删除键(如果存在)。 |
2 | DUMP key
此命令返回存储在指定键处的值的序列化版本。 |
3 | EXISTS key
此命令检查键是否存在。 |
4 | EXPIRE key seconds 在指定时间后设置键的过期时间。 |
5 | EXPIREAT key timestamp
在指定时间后设置键的过期时间。这里时间采用 Unix 时间戳格式。 |
6 | PEXPIRE key milliseconds
以毫秒为单位设置键的过期时间。 |
7 | PEXPIREAT key milliseconds-timestamp
以毫秒为单位设置键的过期时间,以 Unix 时间戳指定。 |
8 | KEYS pattern
查找与指定模式匹配的所有键。 |
9 | MOVE key db
将键移动到另一个数据库。 |
10 | PERSIST key
删除键的过期时间。 |
11 | PTTL key
以毫秒为单位获取键过期时间的剩余时间。 |
12 | TTL key
获取键过期时间的剩余时间。 |
13 | RANDOMKEY
从 Redis 返回一个随机键。 |
14 | RENAME key newkey
更改键名。 |
15 | RENAMENX key newkey
重命名键(如果新键不存在)。 |
16 | TYPE key
返回存储在键中的值的类型。 |
Redis - 字符串
Redis 字符串命令用于管理 Redis 中的字符串值。以下是使用 Redis 字符串命令的语法。
语法
redis 127.0.0.1:6379> COMMAND KEY_NAME
示例
redis 127.0.0.1:6379> SET tutorialspoint redis OK redis 127.0.0.1:6379> GET tutorialspoint "redis"
在上面的示例中,SET 和 GET 是命令,而 tutorialspoint 是键。
Redis 字符串命令
下表列出了一些管理 Redis 中字符串的基本命令。
序号 | 命令和描述 |
---|---|
1 | SET key value
此命令设置指定键的值。 |
2 | GET key
获取键的值。 |
3 | GETRANGE key start end
获取存储在键中的字符串的子字符串。 |
4 | GETSET key value
设置键的字符串值并返回其旧值。 |
5 | GETBIT key offset
返回存储在键中的字符串值中偏移量处的比特值。 |
6 | MGET key1 [key2..]
获取所有给定键的值 |
7 | SETBIT key offset value
设置或清除存储在键中的字符串值中偏移量处的比特位 |
8 | SETEX key seconds value
设置键的值及其过期时间 |
9 | SETNX key value
仅当键不存在时设置键的值 |
10 | SETRANGE key offset value
覆盖存储在键中的字符串从指定偏移量开始的部分 |
11 | STRLEN key
获取存储在键中的值的长度 |
12 | MSET key value [key value ...]
将多个键设置为多个值 |
13 | MSETNX key value [key value ...]
仅当所有键都不存在时,将多个键设置为多个值 |
14 | PSETEX key milliseconds value
设置键的值和以毫秒为单位的过期时间 |
15 | INCR key
将键的整数值加1 |
16 | INCRBY key increment
将键的整数值增加指定数量 |
17 | INCRBYFLOAT key increment
将键的浮点值增加指定数量 |
18 | DECR key
将键的整数值减1 |
19 | DECRBY key decrement
将键的整数值减少指定数量 |
20 | APPEND key value
将值追加到键 |
Redis - 哈希
Redis 哈希是字符串字段和字符串值之间的映射。因此,它们是表示对象的完美数据类型。
在 Redis 中,每个哈希可以存储超过 40 亿个字段-值对。
示例
redis 127.0.0.1:6379> HMSET tutorialspoint name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000 OK redis 127.0.0.1:6379> HGETALL tutorialspoint 1) "name" 2) "redis tutorial" 3) "description" 4) "redis basic commands for caching" 5) "likes" 6) "20" 7) "visitors" 8) "23000"
在上面的示例中,我们已将 Redis 教程详细信息(名称、描述、喜欢、访问者)设置为名为“tutorialspoint”的哈希中。
Redis 哈希命令
下表列出了一些与哈希相关的基本命令。
序号 | 命令和描述 |
---|---|
1 | HDEL key field2 [field2]
删除一个或多个哈希字段。 |
2 | HEXISTS key field
确定哈希字段是否存在。 |
3 | HGET key field
获取存储在指定键处的哈希字段的值。 |
4 | HGETALL key
获取存储在指定键处的哈希中的所有字段和值 |
5 | HINCRBY key field increment
将哈希字段的整数值增加指定数量 |
6 | HINCRBYFLOAT key field increment
将哈希字段的浮点值增加指定数量 |
7 | HKEYS key
获取哈希中的所有字段 |
8 | HLEN key
获取哈希中字段的数量 |
9 | HMGET key field1 [field2]
获取所有给定哈希字段的值 |
10 | HMSET key field1 value1 [field2 value2 ]
将多个哈希字段设置为多个值 |
11 | HSET key field value
设置哈希字段的字符串值 |
12 | HSETNX key field value
仅当字段不存在时设置哈希字段的值 |
13 | HVALS key
获取哈希中的所有值 |
14 | HSCAN key cursor [MATCH pattern] [COUNT count]
增量迭代哈希字段和关联的值 |
Redis - 列表
Redis 列表只是字符串列表,按插入顺序排序。您可以在 Redis 列表的头部或尾部添加元素。
列表的最大长度为 232 - 1 个元素(4294967295,每个列表超过 40 亿个元素)。
示例
redis 127.0.0.1:6379> LPUSH tutorials redis (integer) 1 redis 127.0.0.1:6379> LPUSH tutorials mongodb (integer) 2 redis 127.0.0.1:6379> LPUSH tutorials mysql (integer) 3 redis 127.0.0.1:6379> LRANGE tutorials 0 10 1) "mysql" 2) "mongodb" 3) "redis"
在上面的示例中,三个值由命令LPUSH插入到名为“tutorials”的 Redis 列表中。
Redis 列表命令
下表列出了一些与列表相关的基本命令。
序号 | 命令和描述 |
---|---|
1 | BLPOP key1 [key2 ] timeout
移除并获取列表中的第一个元素,或者阻塞直到有元素可用 |
2 | BRPOP key1 [key2 ] timeout
移除并获取列表中的最后一个元素,或者阻塞直到有元素可用 |
3 | BRPOPLPUSH source destination timeout
从列表中弹出值,将其推送到另一个列表并返回它;或者阻塞直到有元素可用 |
4 | LINDEX key index
根据索引获取列表中的元素 |
5 | LINSERT key BEFORE|AFTER pivot value
在列表中的另一个元素之前或之后插入元素 |
6 | LLEN key
获取列表的长度 |
7 | LPOP key
移除并获取列表中的第一个元素 |
8 | LPUSH key value1 [value2]
在列表的开头添加一个或多个值 |
9 | LPUSHX key value
仅当列表存在时,在列表的开头添加值 |
10 | LRANGE key start stop
获取列表中的一段元素 |
11 | LREM key count value
从列表中移除元素 |
12 | LSET key index value
根据索引设置列表中元素的值 |
13 | LTRIM key start stop
将列表修剪到指定范围 |
14 | RPOP key
移除并获取列表中的最后一个元素 |
15 | RPOPLPUSH source destination
移除列表中的最后一个元素,将其追加到另一个列表并返回它 |
16 | RPUSH key value1 [value2]
在列表的末尾添加一个或多个值 |
17 | RPUSHX key value
仅当列表存在时,在列表的末尾添加值 |
Redis - 集合
Redis 集合是唯一字符串的无序集合。唯一意味着集合不允许在键中重复数据。
在 Redis 集合中,添加、删除和测试成员是否存在的时间复杂度为 O(1)(无论集合中包含多少元素,时间都是恒定的)。列表的最大长度为 232 - 1 个元素(4294967295,每个集合超过 40 亿个元素)。
示例
redis 127.0.0.1:6379> SADD tutorials redis (integer) 1 redis 127.0.0.1:6379> SADD tutorials mongodb (integer) 1 redis 127.0.0.1:6379> SADD tutorials mysql (integer) 1 redis 127.0.0.1:6379> SADD tutorials mysql (integer) 0 redis 127.0.0.1:6379> SMEMBERS tutorials 1) "mysql" 2) "mongodb" 3) "redis"
在上面的示例中,三个值由命令SADD插入到名为“tutorials”的 Redis 集合中。
Redis 集合命令
下表列出了一些与集合相关的基本命令。
序号 | 命令和描述 |
---|---|
1 | SADD key member1 [member2]
向集合中添加一个或多个成员 |
2 | SCARD key
获取集合中成员的数量 |
3 | SDIFF key1 [key2]
多个集合的差集 |
4 | SDIFFSTORE destination key1 [key2]
多个集合的差集,并将结果集合存储到一个键中 |
5 | SINTER key1 [key2]
多个集合的交集 |
6 | SINTERSTORE destination key1 [key2]
多个集合的交集,并将结果集合存储到一个键中 |
7 | SISMEMBER key member
确定给定值是否是集合的成员 |
8 | SMEMBERS key
获取集合中的所有成员 |
9 | SMOVE source destination member
将成员从一个集合移动到另一个集合 |
10 | SPOP key
移除并返回集合中的一个随机成员 |
11 | SRANDMEMBER key [count]
获取集合中的一个或多个随机成员 |
12 | SREM key member1 [member2]
从集合中移除一个或多个成员 |
13 | SUNION key1 [key2]
多个集合的并集 |
14 | SUNIONSTORE destination key1 [key2]
多个集合的并集,并将结果集合存储到一个键中 |
15 | SSCAN key cursor [MATCH pattern] [COUNT count]
增量迭代集合元素 |
Redis - 有序集合
Redis 有序集合类似于 Redis 集合,具有存储在集合中的值的唯一特性。不同之处在于,有序集合的每个成员都与一个分数相关联,该分数用于按顺序对有序集合进行排序,从小到大的分数。
在 Redis 有序集合中,添加、删除和测试成员是否存在的时间复杂度为 O(1)(无论集合中包含多少元素,时间都是恒定的)。列表的最大长度为 232 - 1 个元素(4294967295,每个集合超过 40 亿个元素)。
示例
redis 127.0.0.1:6379> ZADD tutorials 1 redis (integer) 1 redis 127.0.0.1:6379> ZADD tutorials 2 mongodb (integer) 1 redis 127.0.0.1:6379> ZADD tutorials 3 mysql (integer) 1 redis 127.0.0.1:6379> ZADD tutorials 3 mysql (integer) 0 redis 127.0.0.1:6379> ZADD tutorials 4 mysql (integer) 0 redis 127.0.0.1:6379> ZRANGE tutorials 0 10 WITHSCORES 1) "redis" 2) "1" 3) "mongodb" 4) "2" 5) "mysql" 6) "4"
在上面的示例中,三个值及其分数由命令ZADD插入到名为“tutorials”的 Redis 有序集合中。
Redis 有序集合命令
下表列出了一些与有序集合相关的基本命令。
Redis - HyperLogLog
Redis HyperLogLog 是一种算法,它使用随机化来提供集合中唯一元素数量的近似值,仅使用恒定且少量内存。
即使使用非常少的内存(每个键约 12 千字节,标准误差为 0.81%),HyperLogLog 也可以提供集合基数的非常好的近似值。您可以计数的项目数量没有限制,除非您接近 264 个项目。
示例
以下示例说明了 Redis HyperLogLog 的工作原理。
redis 127.0.0.1:6379> PFADD tutorials "redis" 1) (integer) 1 redis 127.0.0.1:6379> PFADD tutorials "mongodb" 1) (integer) 1 redis 127.0.0.1:6379> PFADD tutorials "mysql" 1) (integer) 1 redis 127.0.0.1:6379> PFCOUNT tutorials (integer) 3
Redis HyperLogLog 命令
下表列出了一些与 Redis HyperLogLog 相关的基本命令。
序号 | 命令和描述 |
---|---|
1 | PFADD key element [element ...]
将指定的元素添加到指定的 HyperLogLog 中。 |
2 | PFCOUNT key [key ...]
返回 HyperLogLog 在键处观察到的集合的近似基数。 |
3 | PFMERGE destkey sourcekey [sourcekey ...]
将 N 个不同的 HyperLogLog 合并到一个中。 |
Redis - 发布订阅
Redis 发布/订阅实现了消息系统,其中发送者(在 redis 术语中称为发布者)发送消息,而接收者(订阅者)接收消息。消息传递的链接称为通道。
在 Redis 中,客户端可以订阅任意数量的通道。
示例
以下示例解释了发布订阅的概念是如何工作的。在以下示例中,一个客户端订阅了一个名为“redisChat”的频道。
redis 127.0.0.1:6379> SUBSCRIBE redisChat Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "redisChat" 3) (integer) 1
现在,两个客户端正在同一个名为“redisChat”的频道上发布消息,而上面订阅的客户端正在接收消息。
redis 127.0.0.1:6379> PUBLISH redisChat "Redis is a great caching technique" (integer) 1 redis 127.0.0.1:6379> PUBLISH redisChat "Learn redis by tutorials point" (integer) 1 1) "message" 2) "redisChat" 3) "Redis is a great caching technique" 1) "message" 2) "redisChat" 3) "Learn redis by tutorials point"
Redis PubSub 命令
下表列出了一些与 Redis Pub/Sub 相关的基本命令。
序号 | 命令和描述 |
---|---|
1 | PSUBSCRIBE pattern [pattern ...]
订阅与给定模式匹配的频道。 |
2 | PUBSUB subcommand [argument [argument ...]]
告知 Pub/Sub 系统的状态。例如,哪些客户端在服务器上处于活动状态。 |
3 | PUBLISH channel message
向频道发布消息。 |
4 | PUNSUBSCRIBE [pattern [pattern ...]]
停止监听发布到与给定模式匹配的频道的消息。 |
5 | SUBSCRIBE channel [channel ...]
监听发布到给定频道的消息。 |
6 | UNSUBSCRIBE [channel [channel ...]]
停止监听发布到给定频道的消息。 |
Redis - 事务
Redis 事务允许在一个步骤中执行一组命令。以下是事务的两个属性。
事务中的所有命令都按顺序作为一个独立的操作执行。另一个客户端发出的请求不可能在 Redis 事务执行的中间被处理。
Redis 事务也是原子的。原子性意味着要么所有命令都被处理,要么都不被处理。
示例
Redis 事务由命令 **MULTI** 启动,然后您需要传递一个应该在事务中执行的命令列表,之后整个事务由 **EXEC** 命令执行。
redis 127.0.0.1:6379> MULTI OK List of commands here redis 127.0.0.1:6379> EXEC
示例
以下示例说明了如何启动和执行 Redis 事务。
redis 127.0.0.1:6379> MULTI OK redis 127.0.0.1:6379> SET tutorial redis QUEUED redis 127.0.0.1:6379> GET tutorial QUEUED redis 127.0.0.1:6379> INCR visitors QUEUED redis 127.0.0.1:6379> EXEC 1) OK 2) "redis" 3) (integer) 1
Redis 事务命令
下表显示了一些与 Redis 事务相关的基本命令。
序号 | 命令和描述 |
---|---|
1 | DISCARD
丢弃在 MULTI 之后发出的所有命令 |
2 | EXEC
执行在 MULTI 之后发出的所有命令 |
3 | MULTI
标记事务块的开始 |
4 | UNWATCH
忘记所有被监视的键 |
5 | WATCH key [key ...]
监视给定的键以确定 MULTI/EXEC 块的执行 |
Redis - 脚本
Redis 脚本用于使用 Lua 解释器评估脚本。它从 2.6.0 版开始内置于 Redis 中。用于脚本的命令是 **EVAL** 命令。
语法
以下是 **EVAL** 命令的基本语法。
redis 127.0.0.1:6379> EVAL script numkeys key [key ...] arg [arg ...]
示例
以下示例说明了 Redis 脚本是如何工作的。
redis 127.0.0.1:6379> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second 1) "key1" 2) "key2" 3) "first" 4) "second"
Redis 脚本命令
下表列出了一些与 Redis 脚本相关的基本命令。
序号 | 命令和描述 |
---|---|
1 | EVAL script numkeys key [key ...] arg [arg ...]
执行 Lua 脚本。 |
2 | EVALSHA sha1 numkeys key [key ...] arg [arg ...]
执行 Lua 脚本。 |
3 | SCRIPT EXISTS script [script ...]
检查脚本在脚本缓存中是否存在。 |
4 | SCRIPT FLUSH
从脚本缓存中删除所有脚本。 |
5 | SCRIPT KILL
杀死当前正在执行的脚本。 |
6 | SCRIPT LOAD script
将指定的 Lua 脚本加载到脚本缓存中。 |
Redis - 连接
Redis 连接命令基本上用于管理客户端与 Redis 服务器的连接。
示例
以下示例说明了客户端如何向 Redis 服务器进行身份验证以及如何检查服务器是否正在运行。
redis 127.0.0.1:6379> AUTH "password" OK redis 127.0.0.1:6379> PING PONG
Redis 连接命令
下表列出了一些与 Redis 连接相关的基本命令。
序号 | 命令和描述 |
---|---|
1 | AUTH password
使用给定的密码对服务器进行身份验证 |
2 | ECHO message
打印给定的字符串 |
3 | PING
检查服务器是否正在运行 |
4 | QUIT
关闭当前连接 |
5 | SELECT index
更改当前连接所选的数据库 |
Redis - 服务器
Redis 服务器命令基本上用于管理 Redis 服务器。
示例
以下示例说明了我们如何获取有关服务器的所有统计信息和信息。
redis 127.0.0.1:6379> INFO # Server redis_version:2.8.13 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:c2238b38b1edb0e2 redis_mode:standalone os:Linux 3.5.0-48-generic x86_64 arch_bits:64 multiplexing_api:epoll gcc_version:4.7.2 process_id:3856 run_id:0e61abd297771de3fe812a3c21027732ac9f41fe tcp_port:6379 uptime_in_seconds:11554 uptime_in_days:0 hz:10 lru_clock:16651447 config_file: # Clients connected_clients:1 client_longest_output_list:0 client_biggest_input_buf:0 blocked_clients:0 # Memory used_memory:589016 used_memory_human:575.21K used_memory_rss:2461696 used_memory_peak:667312 used_memory_peak_human:651.67K used_memory_lua:33792 mem_fragmentation_ratio:4.18 mem_allocator:jemalloc-3.6.0 # Persistence loading:0 rdb_changes_since_last_save:3 rdb_bgsave_in_progress:0 rdb_last_save_time:1409158561 rdb_last_bgsave_status:ok rdb_last_bgsave_time_sec:0 rdb_current_bgsave_time_sec:-1 aof_enabled:0 aof_rewrite_in_progress:0 aof_rewrite_scheduled:0 aof_last_rewrite_time_sec:-1 aof_current_rewrite_time_sec:-1 aof_last_bgrewrite_status:ok aof_last_write_status:ok # Stats total_connections_received:24 total_commands_processed:294 instantaneous_ops_per_sec:0 rejected_connections:0 sync_full:0 sync_partial_ok:0 sync_partial_err:0 expired_keys:0 evicted_keys:0 keyspace_hits:41 keyspace_misses:82 pubsub_channels:0 pubsub_patterns:0 latest_fork_usec:264 # Replication role:master connected_slaves:0 master_repl_offset:0 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 # CPU used_cpu_sys:10.49 used_cpu_user:4.96 used_cpu_sys_children:0.00 used_cpu_user_children:0.01 # Keyspace db0:keys = 94,expires = 1,avg_ttl = 41638810 db1:keys = 1,expires = 0,avg_ttl = 0 db3:keys = 1,expires = 0,avg_ttl = 0
Redis 服务器命令
下表列出了一些与 Redis 服务器相关的基本命令。
序号 | 命令和描述 |
---|---|
1 | BGREWRITEAOF
异步重写追加仅文件 |
2 | BGSAVE
异步将数据集保存到磁盘 |
3 | CLIENT KILL [ip:port] [ID client-id]
杀死客户端的连接 |
4 | CLIENT LIST
获取客户端连接到服务器的列表 |
5 | CLIENT GETNAME
获取当前连接的名称 |
6 | CLIENT PAUSE timeout
停止处理来自客户端的命令,持续指定时间 |
7 | CLIENT SETNAME connection-name
设置当前连接名称 |
8 | CLUSTER SLOTS
获取集群槽到节点映射的数组 |
9 | COMMAND
获取 Redis 命令详细信息的数组 |
10 | COMMAND COUNT
获取 Redis 命令的总数 |
11 | COMMAND GETKEYS
根据完整的 Redis 命令提取键 |
12 | BGSAVE
异步将数据集保存到磁盘 |
13 | COMMAND INFO command-name [command-name ...]
获取特定 Redis 命令详细信息的数组 |
14 | CONFIG GET parameter
获取配置参数的值 |
15 | CONFIG REWRITE
使用内存中的配置重写配置文件 |
16 | CONFIG SET parameter value
将配置参数设置为给定值 |
17 | CONFIG RESETSTAT
重置 INFO 返回的统计信息 |
18 | DBSIZE
返回所选数据库中的键的数量 |
19 | DEBUG OBJECT key
获取有关键的调试信息 |
20 | DEBUG SEGFAULT
使服务器崩溃 |
21 | FLUSHALL
从所有数据库中删除所有键 |
22 | FLUSHDB
从当前数据库中删除所有键 |
23 | INFO [section]
获取有关服务器的信息和统计信息 |
24 | LASTSAVE
获取上次成功保存到磁盘的 UNIX 时间戳 |
25 | MONITOR
实时监听服务器接收到的所有请求 |
26 | ROLE
返回实例在复制上下文中的角色 |
27 | SAVE
同步将数据集保存到磁盘 |
28 | SHUTDOWN [NOSAVE] [SAVE]
同步将数据集保存到磁盘,然后关闭服务器 |
29 | SLAVEOF host port
使服务器成为另一个实例的从属服务器,或将其提升为主服务器 |
30 | SLOWLOG subcommand [argument]
管理 Redis 慢查询日志 |
31 | SYNC
用于复制的命令 |
32 | TIME
返回当前服务器时间 |
Redis - 备份
Redis **SAVE** 命令用于创建当前 Redis 数据库的备份。
语法
以下是 redis **SAVE** 命令的基本语法。
127.0.0.1:6379> SAVE
示例
以下示例创建当前数据库的备份。
127.0.0.1:6379> SAVE OK
此命令将在您的 Redis 目录中创建一个 **dump.rdb** 文件。
恢复 Redis 数据
要恢复 Redis 数据,请将 Redis 备份文件 (dump.rdb) 移动到您的 Redis 目录并启动服务器。要获取您的 Redis 目录,请使用 Redis 的 **CONFIG** 命令,如下所示。
127.0.0.1:6379> CONFIG get dir 1) "dir" 2) "/user/tutorialspoint/redis-2.8.13/src"
在上述命令的输出中,** /user/tutorialspoint/redis-2.8.13/src ** 是 Redis 服务器安装的目录。
Bgsave
要创建 Redis 备份,还可以使用备用命令 **BGSAVE**。此命令将启动备份过程并在后台运行。
示例
127.0.0.1:6379> BGSAVE Background saving started
Redis - 安全
Redis 数据库可以被保护,以便任何建立连接的客户端都需要在执行命令之前进行身份验证。要保护 Redis,您需要在配置文件中设置密码。
示例
以下示例显示了保护 Redis 实例的步骤。
127.0.0.1:6379> CONFIG get requirepass 1) "requirepass" 2) ""
默认情况下,此属性为空,这意味着未为此实例设置密码。您可以通过执行以下命令来更改此属性。
127.0.0.1:6379> CONFIG set requirepass "tutorialspoint" OK 127.0.0.1:6379> CONFIG get requirepass 1) "requirepass" 2) "tutorialspoint"
设置密码后,如果任何客户端在未进行身份验证的情况下运行命令,则会返回 **(error) NOAUTH Authentication required.** 错误。因此,客户端需要使用 **AUTH** 命令进行身份验证。
语法
以下是 **AUTH** 命令的基本语法。
127.0.0.1:6379> AUTH password
示例
127.0.0.1:6379> AUTH "tutorialspoint" OK 127.0.0.1:6379> SET mykey "Test value" OK 127.0.0.1:6379> GET mykey "Test value"
Redis - 基准测试
Redis 基准测试是用于通过同时运行 n 个命令来检查 Redis 性能的实用程序。
语法
以下是 Redis 基准测试的基本语法。
redis-benchmark [option] [option value]
示例
以下示例通过调用 100000 个命令来检查 Redis。
redis-benchmark -n 100000 PING_INLINE: 141043.72 requests per second PING_BULK: 142857.14 requests per second SET: 141442.72 requests per second GET: 145348.83 requests per second INCR: 137362.64 requests per second LPUSH: 145348.83 requests per second LPOP: 146198.83 requests per second SADD: 146198.83 requests per second SPOP: 149253.73 requests per second LPUSH (needed to benchmark LRANGE): 148588.42 requests per second LRANGE_100 (first 100 elements): 58411.21 requests per second LRANGE_300 (first 300 elements): 21195.42 requests per second LRANGE_500 (first 450 elements): 14539.11 requests per second LRANGE_600 (first 600 elements): 10504.20 requests per second MSET (10 keys): 93283.58 requests per second
以下是 Redis 基准测试中可用选项的列表。
序号 | 选项 | 描述 | 默认值 |
---|---|---|---|
1 | -h | 指定服务器主机名 | 127.0.0.1 |
2 | -p | 指定服务器端口 | 6379 |
3 | -s | 指定服务器套接字 | |
4 | -c | 指定并行连接数 | 50 |
5 | -n | 指定请求总数 | 10000 |
6 | -d | 指定 SET/GET 值的数据大小(以字节为单位) | 2 |
7 | -k | 1=保持活动,0=重新连接 | 1 |
8 | -r | 对 SET/GET/INCR 使用随机键,对 SADD 使用随机值 | |
9 | -p | 管道 <numreq> 个请求 | 1 |
10 | -h | 指定服务器主机名 | |
11 | -q | 强制 Redis 静默。仅显示查询/秒值 | |
12 | --csv | 以 CSV 格式输出 | |
13 | -l | 生成循环,永远运行测试 | |
14 | -t | 仅运行以逗号分隔的测试列表 | |
15 | -I | 空闲模式。只打开 N 个空闲连接并等待 |
示例
以下示例显示了 Redis 基准测试实用程序中的多个用法选项。
redis-benchmark -h 127.0.0.1 -p 6379 -t set,lpush -n 100000 -q SET: 146198.83 requests per second LPUSH: 145560.41 requests per second
Redis - 客户端连接
Redis 在配置的监听 TCP 端口和启用的 Unix 套接字上接受客户端的连接。当接受新的客户端连接时,将执行以下操作:
客户端套接字被置于非阻塞状态,因为 Redis 使用多路复用和非阻塞 I/O。
TCP_NODELAY 选项被设置以确保我们的连接没有延迟。
创建可读文件事件,以便 Redis 能够在套接字上可读新数据时立即收集客户端查询。
最大客户端数
在 Redis 配置 (redis.conf) 中,有一个名为 **maxclients** 的属性,它描述了可以连接到 Redis 的最大客户端数。
以下是命令的基本语法。
config get maxclients 1) "maxclients" 2) "10000"
默认情况下,此属性设置为 10000(取决于操作系统的最大文件描述符限制),但您可以更改此属性。
示例
在以下示例中,我们在启动服务器时将最大客户端数设置为 100000。
redis-server --maxclients 100000
客户端命令
序号 | 命令 | 描述 |
---|---|---|
1 | CLIENT LIST | 返回连接到 Redis 服务器的客户端列表 |
2 | CLIENT SETNAME | 为当前连接分配一个名称 |
3 | CLIENT GETNAME | 返回当前连接的名称,该名称由 CLIENT SETNAME 设置。 |
4 | CLIENT PAUSE | 这是一个连接控制命令,可以暂停所有 Redis 客户端指定的时间(以毫秒为单位)。 |
5 | CLIENT KILL | 此命令关闭给定的客户端连接。 |
Redis - 管道
Redis 是一个 TCP 服务器,支持请求/响应协议。在 Redis 中,请求通过以下步骤完成:
客户端向服务器发送查询,并通常以阻塞方式从套接字读取服务器响应。
服务器处理命令并将响应发送回客户端。
流水线的含义
流水线的基本含义是,客户端可以向服务器发送多个请求,而无需等待回复,最后一步读取所有回复。
示例
要检查 Redis 流水线,只需启动 Redis 实例并在终端中键入以下命令。
$(echo -en "PING\r\n SET tutorial redis\r\nGET tutorial\r\nINCR visitor\r\nINCR visitor\r\nINCR visitor\r\n"; sleep 10) | nc localhost 6379 +PONG +OK redis :1 :2 :3
在上面的示例中,我们将使用 **PING** 命令检查 Redis 连接。我们设置了一个名为 **tutorial** 的字符串,其值为 **redis**。稍后,我们获取该键的值并三次递增访问者数量。在结果中,我们可以看到所有命令都一次提交给 Redis,Redis 一步输出所有命令的结果。
流水线的优势
此技术的优势在于协议性能得到了极大的提升。流水线带来的加速效果从本地连接的五倍到慢速互联网连接的至少一百倍不等。
Redis - 分区
分区是指将数据拆分为多个 Redis 实例的过程,以便每个实例仅包含键的子集。
分区的优势
它允许使用许多计算机内存总和来创建更大的数据库。如果没有分区,则受限于单个计算机可以支持的内存量。
它允许将计算能力扩展到多个核心和多台计算机,并将网络带宽扩展到多台计算机和网络适配器。
分区的缺点
通常不支持涉及多个键的操作。例如,如果两个集合存储在映射到不同 Redis 实例的键中,则无法执行这两个集合的交集。
无法使用涉及多个键的 Redis 事务。
分区粒度是键,因此无法对具有单个巨大键(例如非常大的有序集合)的数据集进行分片。
使用分区时,数据处理会变得更加复杂。例如,您必须处理多个 RDB/AOF 文件,并且要获取数据的备份,您需要聚合来自多个实例和主机的持久性文件。
添加和删除容量可能很复杂。例如,Redis 集群主要支持数据透明重新平衡,并能够在运行时添加和删除节点。但是,其他系统(如客户端分区和代理)不支持此功能。一种称为 **预分片** 的技术在这方面有所帮助。
分区的类型
Redis 中提供了两种分区类型。假设我们有四个 Redis 实例 R0、R1、R2、R3 以及许多表示用户的键,如 user:1、user:2 等。
范围分区
范围分区是通过将对象的范围映射到特定的 Redis 实例来实现的。假设在我们的示例中,ID 为 0 到 10000 的用户将进入实例 R0,而 ID 为 10001 到 20000 的用户将进入实例 R1,依此类推。
哈希分区
在这种类型的分区中,使用哈希函数(例如模数函数)将键转换为数字,然后将数据存储在不同的 Redis 实例中。
Redis - Java
在 Java 程序中开始使用 Redis 之前,您需要确保机器上已安装 Redis Java 驱动程序和 Java。您可以查看我们的 Java 教程,了解如何在机器上安装 Java。
安装
现在,让我们看看如何设置 Redis Java 驱动程序。
您需要从路径 下载 jedis.jar 下载 jar 包。请确保下载最新版本。
您需要将 **jedis.jar** 包含到您的类路径中。
连接到 Redis 服务器
import redis.clients.jedis.Jedis; public class RedisJava { public static void main(String[] args) { //Connecting to Redis server on localhost Jedis jedis = new Jedis("localhost"); System.out.println("Connection to server sucessfully"); //check whether server is running or not System.out.println("Server is running: "+jedis.ping()); } }
现在,让我们编译并运行上述程序以测试与 Redis 服务器的连接。您可以根据需要更改路径。我们假设当前版本的 **jedis.jar** 位于当前路径中。
$javac RedisJava.java $java RedisJava Connection to server sucessfully Server is running: PONG
Redis Java 字符串示例
import redis.clients.jedis.Jedis; public class RedisStringJava { public static void main(String[] args) { //Connecting to Redis server on localhost Jedis jedis = new Jedis("localhost"); System.out.println("Connection to server sucessfully"); //set the data in redis string jedis.set("tutorial-name", "Redis tutorial"); // Get the stored data and print it System.out.println("Stored string in redis:: "+ jedis.get("tutorialname")); } }
现在,让我们编译并运行上述程序。
$javac RedisStringJava.java $java RedisStringJava Connection to server sucessfully Stored string in redis:: Redis tutorial
Redis Java 列表示例
import redis.clients.jedis.Jedis; public class RedisListJava { public static void main(String[] args) { //Connecting to Redis server on localhost Jedis jedis = new Jedis("localhost"); System.out.println("Connection to server sucessfully"); //store data in redis list jedis.lpush("tutorial-list", "Redis"); jedis.lpush("tutorial-list", "Mongodb"); jedis.lpush("tutorial-list", "Mysql"); // Get the stored data and print it List<String> list = jedis.lrange("tutorial-list", 0 ,5); for(int i = 0; i<list.size(); i++) { System.out.println("Stored string in redis:: "+list.get(i)); } } }
现在,让我们编译并运行上述程序。
$javac RedisListJava.java $java RedisListJava Connection to server sucessfully Stored string in redis:: Redis Stored string in redis:: Mongodb Stored string in redis:: Mysql
Redis Java 键示例
import redis.clients.jedis.Jedis; public class RedisKeyJava { public static void main(String[] args) { //Connecting to Redis server on localhost Jedis jedis = new Jedis("localhost"); System.out.println("Connection to server sucessfully"); //store data in redis list // Get the stored data and print it List<String> list = jedis.keys("*"); for(int i = 0; i<list.size(); i++) { System.out.println("List of stored keys:: "+list.get(i)); } } }
现在,让我们编译并运行上述程序。
$javac RedisKeyJava.java $java RedisKeyJava Connection to server sucessfully List of stored keys:: tutorial-name List of stored keys:: tutorial-list
Redis - PHP
在 PHP 程序中开始使用 Redis 之前,您需要确保机器上已安装 Redis PHP 驱动程序和 PHP。您可以查看 PHP 教程,了解如何在机器上安装 PHP。
安装
现在,让我们检查如何设置 Redis PHP 驱动程序。
您需要从 github 仓库 https://github.com/nicolasff/phpredis 下载 phpredis。下载完成后,将文件解压到 phpredis 目录。在 Ubuntu 上,安装以下扩展。
cd phpredis sudo phpize sudo ./configure sudo make sudo make install
现在,将“modules”文件夹的内容复制并粘贴到 PHP 扩展目录中,并在 **php.ini** 中添加以下行。
extension = redis.so
现在,您的 Redis PHP 安装已完成。
连接到 Redis 服务器
<?php //Connecting to Redis server on localhost $redis = new Redis(); $redis->connect('127.0.0.1', 6379); echo "Connection to server sucessfully"; //check whether server is running or not echo "Server is running: ".$redis->ping(); ?>
程序执行后,将产生以下结果。
Connection to server sucessfully Server is running: PONG
Redis PHP 字符串示例
<?php //Connecting to Redis server on localhost $redis = new Redis(); $redis->connect('127.0.0.1', 6379); echo "Connection to server sucessfully"; //set the data in redis string $redis->set("tutorial-name", "Redis tutorial"); // Get the stored data and print it echo "Stored string in redis:: " .$redis→get("tutorial-name"); ?>
执行上述程序后,将产生以下结果。
Connection to server sucessfully Stored string in redis:: Redis tutorial
Redis php 列表示例
<?php //Connecting to Redis server on localhost $redis = new Redis(); $redis->connect('127.0.0.1', 6379); echo "Connection to server sucessfully"; //store data in redis list $redis->lpush("tutorial-list", "Redis"); $redis->lpush("tutorial-list", "Mongodb"); $redis->lpush("tutorial-list", "Mysql"); // Get the stored data and print it $arList = $redis->lrange("tutorial-list", 0 ,5); echo "Stored string in redis:: "; print_r($arList); ?>
执行上述程序后,将产生以下结果。
Connection to server sucessfully Stored string in redis:: Redis Mongodb Mysql
Redis PHP 键示例
<?php //Connecting to Redis server on localhost $redis = new Redis(); $redis->connect('127.0.0.1', 6379); echo "Connection to server sucessfully"; // Get the stored keys and print it $arList = $redis->keys("*"); echo "Stored keys in redis:: " print_r($arList); ?>
程序执行后,将产生以下结果。
Connection to server sucessfully Stored string in redis:: tutorial-name tutorial-list