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 桌面管理器
要在 Ubuntu 上安装 Redis 桌面管理器,只需从https://redisdesktop.com/download下载软件包
打开下载的包并安装。
Redis 桌面管理器将为您提供 UI 来管理您的 Redis 密钥和数据。
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"
在上面的例子中,hash数据类型用于存储包含用户基本信息的用户对象。这里HMSET、HGETALL是 Redis 的命令,而user − 1是关键。
每个哈希最多可以存储 2 个32 – 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 Sets 是一个无序的字符串集合。在 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 Sorted Sets 类似于 Redis Sets,非重复的字符串集合。不同之处在于,Sorted Set 的每个成员都与一个分数相关联,该分数用于从最小到最大分数排序的有序集合。虽然成员是独一无二的,但分数可能会重复。
例子
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是关键。如果键被删除,则命令的输出将为(整数)1,否则为(整数)0。
Redis 键命令
下表列出了一些与键相关的基本命令。
Sr.No | 命令和描述 |
---|---|
1 | DEL key
此命令将删除密钥(如果存在)。 |
2 | DUMP key
此命令返回存储在指定键中的值的序列化版本。 |
3 | EXISTS key
此命令检查密钥是否存在。 |
4 | EXPIRE key 秒 设置密钥在指定时间后的到期时间。 |
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 中管理字符串的一些基本命令。
Sr.No | 命令和描述 |
---|---|
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
将键的整数值加一 |
16 | INCRBY key increment
将键的整数值增加给定的数量 |
17 | INCRBYFLOAT key increment
按给定数量增加键的浮点值 |
18 | DECR key
将键的整数值减一 |
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"
在上面的示例中,我们在名为“tutorialspoint”的哈希中设置了 Redis 教程详细信息(名称、描述、喜欢、访问者)。
Redis 哈希命令
下表列出了一些与哈希相关的基本命令。
Sr.No | 命令和描述 |
---|---|
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 列出命令
下表列出了一些与列表相关的基本命令。
Sr.No | 命令和描述 |
---|---|
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 Sets 是唯一字符串的无序集合。唯一意味着集合不允许在一个键中重复数据。
在 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 设置命令
下表列出了一些与集合相关的基本命令。
Sr.No | 命令和描述 |
---|---|
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 Sorted Sets 类似于 Redis Sets,具有将值存储在集合中的独特特征。不同之处在于,Sorted Set 的每个成员都与一个分数相关联,该分数用于从最小到最大分数排序的有序集合。
在 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 是一种使用随机化的算法,以便仅使用常量和少量内存来提供集合中唯一元素数量的近似值。
HyperLogLog 提供了一个非常好的集合基数近似值,即使使用每个键 12 KB 左右的非常少量的内存,标准误差为 0.81%。您可以计算的项目数量没有限制,除非您接近 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 相关的基本命令。
Sr.No | 命令和描述 |
---|---|
1 | PFADD key element [element …]
将指定的元素添加到指定的 HyperLogLog。 |
2 | PFCOUNT key [key …]
返回 HyperLogLog 在 key(s) 处观察到的集合的近似基数。 |
3 | PFMERGE destkey sourcekey [sourcekey …]
将 N 个不同的 HyperLogLog 合并为一个。 |
Redis – 发布 订阅
Redis Pub/Sub 实现了消息传递系统,其中发送者(在 redis 术语中称为发布者)发送消息,而接收者(订阅者)接收消息。传输消息的链接称为channel。
在 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 发布订阅命令
下表列出了一些与 Redis Pub/Sub 相关的基本命令。
Sr.No | 命令和描述 |
---|---|
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 事务相关的基本命令。
Sr.No | 命令和描述 |
---|---|
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 脚本相关的基本命令。
Sr.No | 命令和描述 |
---|---|
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 连接相关的基本命令。
Sr.No | 命令和描述 |
---|---|
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 服务器相关的基本命令。
Sr.No | 命令和描述 |
---|---|
1 | BGREWRITEAOF
异步重写 append-only 文件 |
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服务器的目录。
保存
要创建 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"
设置密码后,如果有任何客户端在没有身份验证的情况下运行命令,则(错误)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 benchmark 是通过同时运行 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 基准测试中的可用选项列表。
Sr.No | 选项 | 描述 | 默认值 |
---|---|---|---|
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 | -一世 | 空闲模式。只需打开 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
客户端命令
Sr.No | 命令 | 描述 |
---|---|---|
1 | 客户名单 | 返回连接到 Redis 服务器的客户端列表 |
2 | 客户端名称 | 为当前连接分配一个名称 |
3 | 客户名称 | 返回由 CLIENT SETNAME 设置的当前连接的名称 |
4 | 客户暂停 | 这是一个连接控制命令,能够在指定的时间量(以毫秒为单位)暂停所有 Redis 客户端 |
5 | 客户端杀 | 此命令关闭给定的客户端连接。 |
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 Cluster 支持大部分透明的数据重新平衡,能够在运行时添加和删除节点。但是,客户端分区和代理等其他系统不支持此功能。一种称为预分片的技术在这方面有所帮助。
分区类型
Redis 中有两种可用的分区类型。假设我们有四个 Redis 实例,R0、R1、R2、R3 和许多代表用户的键,如 user:1、user:2、…等等。
范围分区
范围分区是通过将对象范围映射到特定 Redis 实例来实现的。假设在我们的示例中,ID 0 到 ID 10000 的用户将进入实例 R0,而 ID 10001 到 ID 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