设为首页 收藏本站
查看: 737|回复: 0

[经验分享] Redis(二)相关命令

[复制链接]

尚未签到

发表于 2018-11-3 14:22:31 | 显示全部楼层 |阅读模式
  (一)简介
  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键相关的基本命令:
编号命令描述1DEL key此命令删除一个指定键(如果存在)。2DUMP key此命令返回存储在指定键的值的序列化版本。3EXISTS key此命令检查键是否存在。4EXPIRE key seconds设置键在指定时间秒数之后到期/过期。5EXPIREAT key timestamp设置在指定时间戳之后键到期/过期。这里的时间是Unix时间戳格式。6PEXPIRE key milliseconds设置键的到期时间(以毫秒为单位)。7PEXPIREAT key milliseconds-timestamp以Unix时间戳形式来设置键的到期时间(以毫秒为单位)。8KEYS pattern查找与指定模式匹配的所有键。9MOVE key db将键移动到另一个数据库。10PERSIST key删除指定键的过期时间,得永生。11PTTL key获取键的剩余到期时间。12RANDOMKEY从Redis返回一个随机的键。13RENAME key newkey更改键的名称。14PTTL key获取键到期的剩余时间(以毫秒为单位)。15RENAMENX key newkey如果新键不存在,重命名键。16TYPE 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中管理字符串的基本命令:
编号命令描述说明1SET key value此命令设置指定键的值。2GET key获取指定键的值。3GETRANGE key start end获取存储在键上的字符串的子字符串。4GETSET key value设置键的字符串值并返回其旧值。5GETBIT key offset返回在键处存储的字符串值中偏移处的位值。6MGET key1 [key2..]获取所有给定键的值7SETBIT key offset value存储在键上的字符串值中设置或清除偏移处的位8SETEX key seconds value使用键和到期时间来设置值9SETNX key value设置键的值,仅当键不存在时10SETRANGE key offset value在指定偏移处开始的键处覆盖字符串的一部分11STRLEN key获取存储在键中的值的长度12MSET key value [key value …]为多个键分别设置它们的值13MSETNX key value [key value …]为多个键分别设置它们的值,仅当键不存在时14PSETEX key milliseconds value设置键的值和到期时间(以毫秒为单位)15INCR key将键的整数值增加116INCRBY key increment将键的整数值按给定的数值增加17INCRBYFLOAT key increment将键的浮点值按给定的数值增加18DECR key将键的整数值减119DECRBY key decrement按给定数值减少键的整数值20APPEND 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中。
序号命令说明1HDEL key field2 [field2]删除一个或多个哈希字段。2HEXISTS key field判断是否存在散列字段。3HGET key field获取存储在指定键的哈希字段的值。4HGETALL key获取存储在指定键的哈希中的所有字段和值5HINCRBY key field increment将哈希字段的整数值按给定数字增加6HINCRBYFLOAT key field increment将哈希字段的浮点值按给定数值增加7HKEYS key获取哈希中的所有字段8HLEN key获取散列中的字段数量9HMGET key field1 [field2]获取所有给定哈希字段的值10HMSET key field1 value1 [field2 value2 ]为多个哈希字段分别设置它们的值11HSET key field value设置散列字段的字符串值12HSETNX key field value仅当字段不存在时,才设置散列字段的值13HVALS 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列表中。列表常用的基本命令:
序号命令说明1BLPOP key1 [key2 ] timeout删除并获取列表中的第一个元素,或阻塞,直到有一个元素可用2BRPOP key1 [key2 ] timeout删除并获取列表中的最后一个元素,或阻塞,直到有一个元素可用3BRPOPLPUSH source destination timeout从列表中弹出值,将其推送到另一个列表并返回它; 或阻塞,直到一个可用4LINDEX key index通过其索引从列表获取元素5LINSERT key BEFORE/AFTER pivot value在列表中的另一个元素之前或之后插入元素6LLEN key获取列表的长度7LPOP key删除并获取列表中的第一个元素8LPUSH key value1 [value2]将一个或多个值添加到列表9LPUSHX key value仅当列表存在时,才向列表添加值10LRANGE key start stop从列表中获取一系列元素11LREM key count value从列表中删除元素12LSET key index value通过索引在列表中设置元素的值13LTRIM key start stop修剪列表的指定范围14RPOP key删除并获取列表中的最后一个元素15RPOPLPUSH source destination删除列表中的最后一个元素,将其附加到另一个列表并返回16RPUSH key value1 [value2]将一个或多个值附加到列表17RPUSHX 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集合中。
序号命令说明1SADD key member1 [member2]将一个或多个成员添加到集合2SCARD key获取集合中的成员数3SDIFF key1 [key2]减去多个集合4SDIFFSTORE destination key1 [key2]减去多个集并将结果集存储在键中5SINTER key1 [key2]相交多个集合6SINTERSTORE destination key1 [key2]交叉多个集合并将结果集存储在键中7SISMEMBER key member判断确定给定值是否是集合的成员8SMOVE source destination member将成员从一个集合移动到另一个集合9SPOP key从集合中删除并返回随机成员10SRANDMEMBER key [count]从集合中获取一个或多个随机成员11SREM key member1 [member2]从集合中删除一个或多个成员12SUNION key1 [key2]添加多个集合13SUNIONSTORE destination key1 [key2]添加多个集并将结果集存储在键中14SSCAN 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
序号命令说明1PFADD key element [element …]将指定的元素添加到指定的HyperLogLog 中。2PFCOUNT key [key …]返回给定 HyperLogLog 的基数估算值。3PFMERGE 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发布订阅相关的一些基本命令。
序号命令说明1PSUBSCRIBE pattern [pattern …]订阅一个或多个符合给定模式的频道。2PUBSUB subcommand [argument [argument …]]查看订阅与发布系统状态。3PUBLISH channel message将信息发送到指定的频道。4PUNSUBSCRIBE [pattern [pattern …]]退订所有给定模式的频道。5SUBSCRIBE channel [channel …]订阅给定的一个或多个频道的信息。6UNSUBSCRIBE [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相关的基本命令:
序号命令说明1DISCARD丢弃在MULTI之后发出的所有命令2EXEC执行MULTI后发出的所有命令3MULTI标记事务块的开始4UNWATCH取消 WATCH 命令对所有 key 的监视。5WATCH 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脚本相关的一些基本命令。
序号命令说明1EVAL script numkeys key [key …] arg [arg …]执行一个Lua脚本。2EVALSHA sha1 numkeys key [key …] arg [arg …]执行一个Lua脚本。3SCRIPT EXISTS script [script …]检查脚本缓存中是否存在脚本。4SCRIPT FLUSH从脚本缓存中删除所有脚本。5SCRIPT KILL杀死当前正在执行的脚本。6SCRIPT 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连接相关的一些基本命令。
序号命令说明1AUTH password使用给定的密码验证服务器2ECHO message打印给定的字符串信息3PING检查服务器是否正在运行4QUIT关闭当前连接5SELECT 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服务器相关的一些基本命令。
序号命令说明1BGREWRITEAOF异步重写仅追加的文件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提取键给出一个完整的Redis的命令12BGSAVE将数据集异步保存到磁盘13COMMAND INFO command-name [command-name …]获取特定Redis命令详细信息的数组14CONFIG GET parameter获取配置参数的值15CONFIG REWRITE使用内存中配置来重写配置文件16CONFIG SET parameter value将配置参数设置为给定值17CONFIG RESETSTAT重置由INFO返回的统计信息18DBSIZE返回所选数据库中的键数量19DEBUG OBJECT key获取有关键的调试信息20DEBUG SEGFAULT使服务器崩溃21FLUSHALL从所有数据库中删除所有键22FLUSHDB删除当前数据库中的所有键23INFO [section]获取有关服务器的信息和统计信息24LASTSAVE获取上次成功保存到磁盘的UNIX时间戳25MONITOR监听服务器实时接收的所有请求26ROLE返回实例在复制上下文中的角色27SAVE将数据集同步保存到磁盘28SHUTDOWN [NOSAVE] [SAVE]将数据集同步保存到磁盘,然后关闭服务器29SLAVEOF host port使服务器成为另一个实例的从属,或将其提升作为主服务器30SLOWLOG subcommand [argument]管理Redis慢查询日志31SYNC用于复制的命令32TIME返回当前服务器的时间


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-630321-1-1.html 上篇帖子: SylixOS移植Redis库总结 下篇帖子: Redis(三)高级应用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表