查看“Redis:数据类型”的源代码
←
Redis:数据类型
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
[[category:Redis]] == 关于 == Redis 以 key-value 存储数据,“key”为 String,其“'''数据类型'''”是指“'''value 的类型'''”; Redis 支持五种数据类型: : {| class="wikitable" ! 数据类型 !! 说明 |- | string || 字符串类型 |- | hash || 哈希类型 |- | list || 列表类型 |- | set || 集合类型 |- | zset(sorted set) || 有序集合类型 |} == Redis 的 5 种数据类型 == === string === 字符串类型:字符串类型是Redis中最基本的数据类型; : [[File:Redis-string.png|300px]] * 它能存储任何形式的字符串,包括二进制数据,序列化后的数据,JSON化的对象甚至是一张图片。 {| class="wikitable" ! 命令 !! 说明 |- | '''append''' <key> <value> || 如果 key 存在且是字符串, 则将 value 追加到 key 原来旧值的末尾; * 如果 key 不存在,就简单地将给定 key 设为 value ,就像执行 SET key value 一样; |- | '''strlen''' <key> || 返回 key 所储存的字符串值的长度; |- | '''get''' <key> || 获取 key 中设置的字符串值; |- | '''set''' <key> <value> || 将字符串值 value 设置到 key 中; |- | '''mget''' <key> [<key>] || 获取所有(一个或多个)给定 key 的值 |- | '''mset''' <key> <value> [<key> <value>] || 同时设置一个或多个 key-value 对 |- | '''setnx''' <key> <value> || setnx 是“set '''if not exists'''”的简写,如果key不存在,则设置值,存在则不设置值; |- | '''msetnx''' <key> <value> [<key> <value>] || 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在时才能设置成功,否则只要有一个key存在都会失败 |- | '''getbit''' <key> offset || 对 key 所储存的字符串值,获取指定偏移量上的位(bit)。 |- | '''setbit''' <key> offset <value> || 对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。 |- | '''getrange''' <key> <start> <end> || 获取 key 中字符串值从 start 开始 到 end 结束 的子字符串; |- | '''setrange''' <key> <offset> <value> || 从指定的位置开始将 key 的值替换为新的字符串; |- | '''setex''' <key> <seconds> <value> || “'''set expire'''”的简写,设置 key 的值 ,并将 key 的生存时间设为 seconds (以秒为单位) ; |- | '''psetex''' <key> milliseconds <value> || 这个命令和 setex 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 setex 命令那样,以秒为单位。 |- | '''getset''' <key> <value> || 设置 key 的值为 value ,并返回 key 的旧值; |- | '''incr''' <key> || 将 key 中储存的数字值加 1; * 如果 key 不存在,则 key 的值先被初始化为 0 再执行 INCR 操作; * (只能对数字类型的数据操作,否则:“'''(error) ERR value is not an integer or out of range'''”); |- | '''decr''' <key> || 将 key 中储存的数字值减 1; * (同上); |- | '''incrby''' <key> <increment> || 将 key 所储存的值加上增量值; * 如果 key 不存在,则 key 的值先被初始化为 0 再执行 INCRBY 命令; |- | '''decrby''' <key> <decrement> || 将 key 所储存的值减去减量值; * 如果 key 不存在,则 key 的值先被初始化为 0 再执行 DECRBY 命令; |- | '''incrbyfloat''' <key> <increment> || 为 key 中所储存的值加上浮点数增量 increment; * 如果 key 不存在,那么 incrbyfloat 会先将 key 的值设为 0 ,再执行加法操作。 * 当以下任意一个条件发生时,返回一个错误: *# key 的值不是字符串类型(因为 Redis 中的数字和浮点数都以字符串的形式保存,所以它们都属于字符串类型) *# key 当前的值或者给定的增量 increment 不能解释(parse)为双精度浮点数(double precision floating point number) |- | '''bitcount''' <key> <start> <end> || 计算给定字符串中,被设置为 1 的比特位的数量; * start 和 end 参数的设置和 GETRANGE 命令类似,都可以使用负数值:比如 -1 表示最后一个位,而 -2 表示倒数第二个位,以此类推。 * 不存在的 key 被当成是空字符串来处理,因此对一个不存在的 key 进行 BITCOUNT 操作,结果为 0 。 |- | '''bitop''' <operation> <destkey> <key> [<key> ...] || 对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上; * operation 可以是 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种: *# BITOP AND destkey key [key ...] ,对一个或多个 key 求逻辑并,并将结果保存到 destkey 。 *# BITOP OR destkey key [key ...] ,对一个或多个 key 求逻辑或,并将结果保存到 destkey 。 *# BITOP XOR destkey key [key ...] ,对一个或多个 key 求逻辑异或,并将结果保存到 destkey 。 *# BITOP NOT destkey key ,对给定 key 求逻辑非,并将结果保存到 destkey 。 ** 除了 NOT 操作之外,其他操作都可以接受一个或多个 key 作为输入。 * 当 BITOP 处理不同长度的字符串时,较短的那个字符串所缺少的部分会被看作 0 。 * 空的 key 也被看作是包含 0 的字符串序列。 |} === hash === 哈希类型:是一个string类型的field和value的映射表; : [[File:Redis-hash.png|400px]] * hash特别适合用于'''存储对象'''。 * 每个 hash 可以存储 2^32 - 1 (40多亿)个键值对。 (命令前加了“'''h'''”,对“key”及“'''field'''(域)”和“value”操作) {| class="wikitable" ! 命令 !! 说明 |- | '''hget''' <key> <field> || 获取哈希表 key 中给定域 field 的值 |- | '''hgetall''' <key> || 获取哈希表 key 中所有的域和值 |- | '''hset''' <key> <field> <value> || 将哈希表 key 中的域 field 的值设为 value |- | '''hsetnx''' <key> <field> <value> || 将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在的时候才设置,否则不设置 |- | '''hmset''' <key> <field> <value> [<field> <value>] || 同时将多个 field-value (域-值)对设置到哈希表 key 中 |- | '''hmget''' <key> <field> [<field>] || 获取哈希表 key 中一个或多个给定域的值 |- | '''hkeys''' <key> || 查看哈希表 key 中的所有 field 域 |- | '''hvals''' <key> || 查看哈希表 key 中所有域的值 |- | '''hexists''' <key> <field> || 查看哈希表 key 中,给定域 field 是否存在 |- | '''hlen''' <key> || 获取哈希表 key 中域 field 的个数 |- | '''hdel''' <key> <field> [<field>] || 删除哈希表 key 中的一个或多个指定域 field |- | '''hincrby''' <key> <field> <increment> || 为哈希表 key 中的域 field 的值加上增量 increment |- | '''hincrbyfloat''' <key> <field> <increment> || 为哈希表 key 中的域 field 加上浮点数增量 increment |- | '''hscan''' <key> cursor [MATCH pattern] [COUNT count] || 迭代哈希表中的键值对【???】 * 参考“Key(键)”命令中的“scan” |} === list === 列表类型:简单的字符串列表,按照'''插入顺序'''排序。 : [[File:Redis-list.png|400px]] * 可以添加一个元素导列表的头部(左边)或者尾部(右边);【???】 * 一个列表最多可以包含 2^32 - 1 (40多亿)个元素。 (命令前加了“'''l'''”,,对“key”和“value”操作,对元素进行类似于队列的操作) {| class="wikitable" ! 命令 !! 说明 |- | '''lpush''' <key> <value> [<value>] || 将一个或多个值 value 插入到列表 key 的'''表头'''(最左边) |- | '''rpush''' <key> <value> [<value>] || 将一个或多个值 value 插入到列表 key 的'''表尾'''(最右边) |- | '''lpushx''' <key> <value> || 将一个值插入到已存在的列表头部,当且仅当 key 存在并且是一个列表 * 和 LPUSH 命令相反,当 key 不存在时, LPUSHX 命令什么也不做。 |- | '''rpushx''' <key> <value> || 为已存在的列表添加值,当且仅当 key 存在并且是一个列表 * 和 RPUSH 命令相反,当 key 不存在时, RPUSHX 命令什么也不做。 |- | '''lpop''' <key> || 从左边获取列表 key 的一个元素,并将该元素移除 |- | '''rpop''' <key> || 从右边获取列表 key 的一个元素,并将该元素移除 |- | '''blpop''' <key> [<key>] timeout || 移出并获取列表的第一个元素,如果列表没有元素会'''阻塞'''列表直到等待超时或发现可弹出元素为止。 * 当给定多个 key 参数时,按参数 key 的先后顺序依次检查各个列表,弹出第一个非空列表的'''头'''元素。 |- | '''brpop''' <key> [<key>] timeout || 移出并获取列表的最后一个元素,如果列表没有元素会'''阻塞'''列表直到等待超时或发现可弹出元素为止。 * 当给定多个 key 参数时,按参数 key 的先后顺序依次检查各个列表,弹出第一个非空列表的'''尾'''元素。 |- | '''rpoplpush''' <nowiki><source> <destination></nowiki> || 将列表 source 中的最后一个元素(尾元素)弹出插入到目标列表(destination),作为目标列表的的头元素 |- | '''brpoplpush''' <nowiki><source> <destination></nowiki> timeout || 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会'''阻塞'''列表直到等待超时或发现可弹出元素为止。 |- | '''llen''' <key> || 获取列表 key 的长度 |- | '''lindex''' <key> <index> || 获取列表 key 中下标为指定 index 的元素 |- | '''lset''' <key> <index> <value> || 将列表 key 下标为 index 的元素的值设置为 value |- | '''linsert''' <key> <nowiki>BEFORE|AFTER</nowiki> <pivot> <value> || 将值 value 插入到列表 key 当中位于值 pivot 之前或之后的位置 |- | '''lrange''' <key> <start> <stop> || 获取列表 key 中指定区间内的元素 * 0 表示列表的第一个元素,以 1 表示列表的第二个元素, -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。 |- | '''lrem''' <key> <count> <value> || 从左到右删除列表中指定个数(count)的“与指定value值相等的”value |- | '''ltrim''' <key> <start> <stop> || 删除指定区域外的元素,比如“LTRIM list 0 2” ,表示只保留列表 list 的前三个元素,其余元素全部删除 |} === set === 集合类型:string类型的无序集合,集合成员是唯一的,即集合中'''不能出现重复的数据'''; : [[File:Redis-set.png|400px]] * Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。 * 集合中最大的成员数为 2^32 - 1 (40多亿)。 (命令前加了“'''s'''”,对“key”和“'''member'''”操作) {| class="wikitable" ! 命令 !! 说明 |- | '''sadd''' <key> <member> [<member>] || 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将不会再加入 |- | '''srem''' <key> <member> [<member>] || 删除集合 key 中的一个或多个 member 元素 |- | '''spop''' <key> [count] || 随机从集合中删除一个元素 |- | '''smove''' <nowiki><source> <destination></nowiki> <member> || 将 member 元素从一个集合移动到另一个集合 |- | '''scard''' <key> || 获取集合里面的元素个数 |- | '''smembers''' <key> || 获取集合 key 中的所有成员元素 |- | '''sismember''' <key> <member> || 判断 member 元素是否是集合 key 的成员 |- | '''srandmember''' <key> [count]|| 随机返回集合中的一个元素 |- | '''sdiff''' <key> [<key>] || 返回第一个集合与其他集合之间的差异。 |- | '''sdiffstore''' <destination> <key> [<key>] || 返回给定所有集合的差集并存储在 destination 中 |- | '''sinter''' <key> [<key>] || 返回给定所有集合的交集 |- | '''sinterstore''' <destination> <key> [<key>] || 返回给定所有集合的交集并存储在 destination 中 |- | '''sunion''' <key> [key2] || 返回所有给定集合的并集 |- | '''sunionstore''' <destination> <key> [<key>] || 所有给定集合的并集存储在 destination 集合中 |- | '''sscan''' <key> cursor [MATCH pattern] [COUNT count] || 迭代集合中的元素【???】 |} === zset(sorted set)=== 有序集合类型:(有序的set)不同的是 zset 的每个元素都会关联一个分数(分数可以重复),redis 通过分数来为集合中的成员进行从小到大的排序。 : [[File:Redis-zset.png|400px]] * 有序集合的成员是唯一的,但分数(score)却可以重复。 * 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。 集合中最大的成员数为 2^32 - 1 (40多亿)。 (命令前加了“'''z'''”,对“key”及“'''member'''”和“'''score'''”操作) {| class="wikitable" ! 命令 !! 说明 |- | '''zadd''' <key> <nowiki>[NX|XX] [CH] [INCR]</nowiki> <score> <member> [<score> <member>] || 将一个或多个 member 元素及其 score 值加入到有序集合 key 中 |- | '''zscore''' <key> <member> || 返回有序集中,成员的分数值 |- | '''zincrby''' <key> <increment> <member> || 有序集合中对指定成员的分数加上增量 increment |- | '''zcard''' <key> || 获取有序集合的成员数 |- | '''zcount''' <key> <min> <max> || 计算在有序集合中指定'''分数区间'''的成员数 |- | '''zlexcount''' <key> <min> <max> || 计算在有序集合中指定'''字典区间'''的成员数 |- | '''zrank''' <key> <member> || 返回有序集合中指定成员的'''索引''' |- | '''zrevrank''' <key> <member> || 返回有序集合中指定成员的'''索引'''【rev:有序集成员按分数值递减(从大到小)排序】 |- | '''zrange''' <key> <start> <stop> [WITHSCORES] || 返回有序集中指定'''索引区间'''内的成员 |- | '''zrevrange''' <key> <start> <stop> [WITHSCORES] || 返回有序集中指定'''索引区间'''内的成员【rev:有序集成员按分数值递减(从大到小)排序】 |- | '''zrangebylex''' <key> <min> <max> [LIMIT offset count] || 返回有序集中指定'''字典区间'''内的成员 |- | '''zrangebyscore''' <key> <min> <max> [WITHSCORES] [LIMIT offset count] || 返回有序集中指定'''分数区间'''内的成员 |- | '''zrevrangebyscore''' <key> <min> <max> [WITHSCORES] [LIMIT offset count] || 返回有序集中指定'''分数区间'''内的成员【rev:有序集成员按分数值递减(从大到小)排序】 |- | '''zrem''' <key> <member> [<member>] || '''移除'''有序集合 key 中的一个或多个成员 |- | '''zremrangebylex''' <key> <min> <max> || '''移除'''有序集合中给定的'''字典区间'''的所有成员 |- | '''zremrangebyrank''' <key> <start> <stop> || '''移除'''有序集合中给定的'''排名区间'''的所有成员 |- | '''zremrangebyscore''' <key> <min> <max> || '''移除'''有序集合中给定的'''分数区间'''的所有成员 |- | '''zinterstore''' <destination> numkeys <key> [<key>] || 计算给定的一个或多个有序集的'''交集''',并存储在新的 key 中 |- | '''zunionstore''' <destination> numkeys <key> [<key>] || 计算给定的一个或多个有序集的'''并集''',并存储在新的 key 中 |- | '''zscan''' <key> cursor [MATCH pattern] [COUNT count] || '''迭代'''有序集合中的元素(包括元素成员和元素分值)【???】 |} == 单个“Key”和“Value”数据大小 == # Key 的大小上限为 '''512 M'''。 #* 建议 key 的大小不超过 '''1 KB''',这样既节约存储空间,也利于Redis进行检索。 # String 类型的 value 值上限为 '''512 M'''。 # 集合、链表、哈希等 key 类型,单个元素的 value 上限为 '''512 M'''。 #* 事实上,集合、链表、哈希都可以看成由String类型的key按照一定的映射关系组合而成。 '''512 M'''、'''512 M'''、'''512 M'''!并非“1 G”。
返回至“
Redis:数据类型
”。
导航菜单
个人工具
登录
命名空间
页面
讨论
大陆简体
已展开
已折叠
查看
阅读
查看源代码
查看历史
更多
已展开
已折叠
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
笔记
服务器
数据库
后端
前端
工具
《To do list》
日常
阅读
电影
摄影
其他
Software
Windows
WIKIOE
所有分类
所有页面
侧边栏
站点日志
工具
链入页面
相关更改
特殊页面
页面信息