(一)简介
Redis 命令用于在 redis 服务上执行操作。
要在 redis 服务上执行命令需要一个 redis 客户端。Redis 客户端在我们之前下载的的 redis 的安装包中。Redis 客户端的基本语法为:redis-cli
[root@localhost ~]# /usr/local/redis-3.2.9/src/redis-cli 127.0.0.1:6379> ping PONG 127.0.0.1:6379>
远程登录为:
[root@localhost ~]# /usr/local/redis-3.2.9/src/redis-cli -h 127.0.0.1 -p 6379 -a "redis123456" 127.0.0.1:6379> ping PONG 127.0.0.1:6379>
(二)命令的详解
(1)Redis键(key)。redis键命令用于管理redis的键
语法:127.0.0.1:6379> COMMAND KEY_NAME
实例如下:
127.0.0.1:6379> set foo redis OK 127.0.0.1:6379> get foo "redis" 127.0.0.1:6379> del foo (integer) 1 127.0.0.1:6379> get foo (nil)
在上边的实例中set 是一个命令,foo是一个键,get foo是获取这个键,del foo是删除这个键,如果删除成功后会输出 (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 | RANDOMKEY | 从Redis返回一个随机的键。 |
13 | RENAME key newkey | 更改键的名称。 |
14 | PTTL key | 获取键到期的剩余时间(以毫秒为单位)。 |
15 | RENAMENX key newkey | 如果新键不存在,重命名键。 |
16 | TYPE key | 返回存储在键中的值的数据类型。 |
(2)redis字符串(string)。redis字符串数据类型的相关命令是用于管理redis字符串值。语法:
redis 127.0.0.1:6379> COMMAND KEY_NAME
实例:
127.0.0.1:6379> set country china OK 127.0.0.1:6379> get country "china"
在上边的例子中,set和get是redis中的命令,而country是键的名称。下表列出了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 | 将指定值附加到键 |
(3)Redis 哈希(Hash)。Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。
127.0.0.1:6379> HMSET myhash id "1" name "arvin" sex "man" address "china" OK 127.0.0.1:6379> hgetall myhash 1) "id" 2) "1" 3) "name" 4) "arvin" 5) "sex" 6) "man" 7) "address" 8) "china" 127.0.0.1:6379> hkeys myhash 1) "id" 2) "name" 3) "sex" 4) "address" 127.0.0.1:6379> hvals myhash 1) "1" 2) "arvin" 3) "man" 4) "china"
在上面的例子中设置了redis的一些描述信息(id,name sex address)到哈希表myhash中。
序号 | 命令 | 说明 |
---|---|---|
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 | 获取哈希中的所有值 |
(4)redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。
127.0.0.1:6379> LPUSH database mysql (integer) 1 127.0.0.1:6379> LPUSH database oracle (integer) 2 127.0.0.1:6379> LPUSH database sql server (integer) 4 127.0.0.1:6379> LPUSH database db2 (integer) 5 127.0.0.1:6379> lrange database 0 4 1) "db2" 2) "server" 3) "sql" 4) "oracle" 5) "mysql"
已上列子通过LPUSH将四个值插入到名称为database的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 | 仅当列表存在时才将值附加到列表 |
(5)Redis集合set。Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
127.0.0.1:6379> SADD myset "redis" (integer) 1 127.0.0.1:6379> SADD myset "mysql" (integer) 1 127.0.0.1:6379> SADD myset "mongodb" (integer) 1 127.0.0.1:6379> SADD myset "mysql" (integer) 0 127.0.0.1:6379> SMEMBERS MYSET (empty list or set) 127.0.0.1:6379> SMEMBERS myset 1) "mongodb" 2) "mysql" 3) "redis"
以上示例通过sadd将三个值插入到myset的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 | SMOVE source destination member | 将成员从一个集合移动到另一个集合 |
9 | SPOP key | 从集合中删除并返回随机成员 |
10 | SRANDMEMBER key [count] | 从集合中获取一个或多个随机成员 |
11 | SREM key member1 [member2] | 从集合中删除一个或多个成员 |
12 | SUNION key1 [key2] | 添加多个集合 |
13 | SUNIONSTORE destination key1 [key2] | 添加多个集并将结果集存储在键中 |
14 | SSCAN key cursor [MATCH pattern] [COUNT count] | 递增地迭代集合中的元素 |
(6)Redis有序集合(sorted set)和集合一样也是string字符型元素的集合,且不允许有重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
127.0.0.1:6379> zadd mysorted 1 redis (integer) 1 127.0.0.1:6379> zadd mysorted 3 mongodb (integer) 1 127.0.0.1:6379> zadd mysorted 2 mysql (integer) 1 127.0.0.1:6379> zadd mysorted 4 mysql (integer) 0 127.0.0.1:6379> zadd mysorted 6 mysql (integer) 0 127.0.0.1:6379> zrange mysorted 0 10 1) "redis" 2) "mongodb" 3) "mysql" 127.0.0.1:6379> zrange mysorted 0 10 withscores 1) "redis" 2) "1" 3) "mongodb" 4) "3" 5) "mysql" 6) "6"
(7)Redis HyperLogLog是用来做基数统计的算法,以少量内存提供集合中唯一元素数量的近似值。HyperLogLog 可以接受多个元素作为输入,并给出输入元素的基数估算值:
基数:集合中不同元素的数量。比如 {‘apple’, ‘banana’, ‘cherry’, ‘banana’, ‘apple’} 的基数就是 3 。
估算值:算法给出的基数并不是精确的,可能会比实际稍微多一些或者稍微少一些,但会控制在合理的范围之内。
HyperLogLog 的优点是,即使输入元素的数量或者体积非常非常大,计算基数所需的空间总是固定的、并且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以
HyperLogLog 不能像集合那样,返回输入的各个元素。
127.0.0.1:6379> pfadd qaz "redis" (integer) 1 127.0.0.1:6379> pfadd qaz "mysql" (integer) 1 127.0.0.1:6379> pfadd qaz "mongodb" (integer) 1 127.0.0.1:6379> pfcount qaz (integer) 3
序号 | 命令 | 说明 |
---|---|---|
1 | PFADD key element [element …] | 将指定的元素添加到指定的HyperLogLog 中。 |
2 | PFCOUNT key [key …] | 返回给定 HyperLogLog 的基数估算值。 |
3 | PFMERGE destkey sourcekey [sourcekey …] | 将多个 HyperLogLog 合并为一个 HyperLogLog |
(8)redis发布订阅。
Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
Redis 发布订阅(pub/sub)实现了消息系统,发送者(在redis术语中称为发布者)在接收者(订阅者)接收消息时发送消息。传送消息的链路称为信道。
在Redis中,客户端可以订阅任意数量的信道
首先在一个客户端输入subscribe redischat,等待另一个客户端输入,显示如下:
127.0.0.1:6379> subscribe redischat Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "redischat" 3) (integer) 1 1) "message" 2) "redischat" 3) "hello everyont" 1) "message" 2) "redischat" 3) "redis is very great caching technique"
重新开个客户端输入如下:
127.0.0.1:6379> publish redischat "hello everyont" (integer) 1 127.0.0.1:6379> publish redischat "redis is very great caching technique" (integer) 1 127.0.0.1:6379> publish redischat "learn redis by lqb" (integer) 1 127.0.0.1:6379> publish redischat "learn redis by lqb" (integer) 1
下表列出了与Redis发布订阅相关的一些基本命令。
序号 | 命令 | 说明 |
---|---|---|
1 | PSUBSCRIBE pattern [pattern …] | 订阅一个或多个符合给定模式的频道。 |
2 | PUBSUB subcommand [argument [argument …]] | 查看订阅与发布系统状态。 |
3 | PUBLISH channel message | 将信息发送到指定的频道。 |
4 | PUNSUBSCRIBE [pattern [pattern …]] | 退订所有给定模式的频道。 |
5 | SUBSCRIBE channel [channel …] | 订阅给定的一个或多个频道的信息。 |
6 | UNSUBSCRIBE [channel [channel …]] | 退订给定的频道。 |
(9)Redis事物。Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证:
事务中的所有命令作为单个隔离操作并按顺序执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
Redis事务也是原子的。原子意味着要么处理所有命令,要么都不处理。
一个事务从开始到执行会经历以下三个阶段:
开始事务。
命令入队。
执行事务。
实例:Redis事务由命令MULTI命令启动,然后需要传递一个应该在事务中执行的命令列表,然后整个事务由EXEC命令执行。
127.0.0.1:6379> multi OK 127.0.0.1:6379> set foo "this is test page" QUEUED 127.0.0.1:6379> get book-name QUEUED 127.0.0.1:6379> sadd tag "c++ is very good programming" QUEUED 127.0.0.1:6379> smembers tag QUEUED 127.0.0.1:6379> exec 1) OK 2) (nil) 3) (integer) 1 4) 1) "c++ is very good programming" 127.0.0.1:6379> multi OK 127.0.0.1:6379> set mykey "redis" QUEUED 127.0.0.1:6379> get mykey QUEUED 127.0.0.1:6379> incr visitors QUEUED 127.0.0.1:6379> exec 1) OK 2) "redis" 3) (integer) 1
与redis相关的基本命令:
序号 | 命令 | 说明 |
---|---|---|
1 | DISCARD | 丢弃在MULTI之后发出的所有命令 |
2 | EXEC | 执行MULTI后发出的所有命令 |
3 | MULTI | 标记事务块的开始 |
4 | UNWATCH | 取消 WATCH 命令对所有 key 的监视。 |
5 | WATCH key [key …] | 监视给定的键以确定MULTI / EXEC块的执行 |
(10)redis脚本。Redis脚本使用 Lua 解释器来执行脚本。 Reids 2.6 版本通过内嵌支持 Lua 环境。执行脚本的常用命令为 EVAL
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脚本相关的一些基本命令。
序号 | 命令 | 说明 |
---|---|---|
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脚本加载到脚本缓存中。 |
(11)Redis连接。Redis中的连接命令基本上是用于管理与Redis服务器的客户端连接。
redis 127.0.0.1:6379> AUTH "password" OK redis 127.0.0.1:6379> PING PONG
下表列出了与Redis连接相关的一些基本命令。
序号 | 命令 | 说明 |
---|---|---|
1 | AUTH password | 使用给定的密码验证服务器 |
2 | ECHO message | 打印给定的字符串信息 |
3 | PING | 检查服务器是否正在运行 |
4 | QUIT | 关闭当前连接 |
5 | SELECT index | 更改当前连接的所选数据库 |
(12)Redis 服务器,Redis 服务器命令主要是用于管理 redis 服务
127.0.0.1:6379> info # Server redis_version:3.2.9 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:2f58f346024ca4bb redis_mode:standalone os:Linux 3.10.0-327.el7.x86_64 x86_64 arch_bits:64 multiplexing_api:epoll gcc_version:4.8.5 process_id:2329 run_id:bf5c0b97691ac975438fb6a954b13ed9a9d564ba tcp_port:6379 uptime_in_seconds:97760 uptime_in_days:1 hz:10 lru_clock:4162916 executable:/usr/local/redis-3.2.9/src/redis-server config_file: # Clients connected_clients:2 client_longest_output_list:0 client_biggest_input_buf:0 blocked_clients:0 # Memory used_memory:913168 used_memory_human:891.77K used_memory_rss:2727936 used_memory_rss_human:2.60M used_memory_peak:913168 used_memory_peak_human:891.77K total_system_memory:3968024576 total_system_memory_human:3.70G used_memory_lua:40960 used_memory_lua_human:40.00K maxmemory:0 maxmemory_human:0B maxmemory_policy:noeviction mem_fragmentation_ratio:2.99 mem_allocator:libc # Persistence loading:0 rdb_changes_since_last_save:0 rdb_bgsave_in_progress:0 rdb_last_save_time:1497328628 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:6 total_commands_processed:180 instantaneous_ops_per_sec:0 total_net_input_bytes:7123 total_net_output_bytes:35960048 instantaneous_input_kbps:0.00 instantaneous_output_kbps:0.00 rejected_connections:171 sync_full:0 sync_partial_ok:0 sync_partial_err:0 expired_keys:0 evicted_keys:0 keyspace_hits:70 keyspace_misses:13 pubsub_channels:1 pubsub_patterns:0 latest_fork_usec:113 migrate_cached_sockets:0 # 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:33.59 used_cpu_user:14.42 used_cpu_sys_children:0.01 used_cpu_user_children:0.00 # Cluster cluster_enabled:0 # Keyspace db0:keys=20,expires=0,avg_ttl=0
下表列出了与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 | 返回当前服务器的时间 |