企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
> **Redis-常用类型操作命令2(Hash/string)** [TOC] ## 说明 ## **记录以下Redis常用类型的操作命令。** ---------- ## 哈希介绍 ## Redis 哈希(Hash) Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。 Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。 ## Hash ## <h5>HSET(增加键值)</h5> > HSETNX:当且仅当域 field 尚未存在于哈希表的情况下, 将它的值设置为 value 。 > HMSET:同时将多个 field-value (域-值)对设置到哈希表 key 中。 HSET hash field value 将哈希表 hash 中域 field 的值设置为 value 。 将哈希表 hash 中域 field 的值设置为 value 。 如果给定的哈希表并不存在, 那么一个新的哈希表将被创建并执行 HSET 操作。 如果域 field 已经存在于哈希表中, 那么它的旧值将被新值 value 覆盖。 ---------- 127.0.0.1:6379> hset user1 name zhangsan (integer) 1 127.0.0.1:6379> hset user1 age 19 (integer) 1 127.0.0.1:6379> hset user1 sex boy (integer) 1 127.0.0.1:6379> hgetall user1 1) "name" 2) "zhangsan" 3) "age" 4) "19" 5) "sex" 6) "boy" <h5>HGET(得到键值)</h5> > HGETAL:返回哈希表 key 中,所有的域和值。 > HMGET:返回哈希表 key 中,一个或多个给定域的值。 返回哈希表中给定域的值。 HGET 命令在默认情况下返回给定域的值。 如果给定域不存在于哈希表中, 又或者给定的哈希表并不存在, 那么命令返回 nil 。 ---------- 127.0.0.1:6379> hgetall user1 1) "name" 2) "zhangsan" 3) "age" 4) "19" 5) "sex" 6) "boy" 127.0.0.1:6379> hget user name (nil) 127.0.0.1:6379> hget user1 name "zhangsan" 127.0.0.1:6379> hgetall user (empty list or set) 127.0.0.1:6379> <h5>HEXISTS(检验键是否存在)</h5> HEXISTS hash field检查给定域 field 是否存在于哈希表 hash 当中。 返回值 HEXISTS 命令在给定域存在时返回 1 , 在给定域不存在时返回 0 。 ---------- 127.0.0.1:6379> hexists user1 name (integer) 1 127.0.0.1:6379> hexists user1 phone (integer) 0 <h5>HDEL(删除键值)</h5> HDEL key field [field …] 删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。 在Redis2.4以下的版本里, HDEL 每次只能删除单个域,如果你需要在一个原子时间内删除多个域,请将命令包含在 MULTI / EXEC 块内。 返回值:被成功移除的域的数量,不包括被忽略的域。 ---------- 127.0.0.1:6379> hgetall user1 1) "name" 2) "zhangsan" 3) "age" 4) "19" 5) "sex" 6) "boy" 127.0.0.1:6379> hdel user1 name (integer) 1 <h5>HLEN(得到hash长度)</h5> HLEN key:返回哈希表 key 中域的数量。 返回值:哈希表中域的数量。 当 key 不存在时,返回 0 。 ---------- 127.0.0.1:6379> hset user1 name zhangsan (integer) 1 127.0.0.1:6379> hset user1 age 19 (integer) 1 127.0.0.1:6379> hset user1 sex girl (integer) 1 127.0.0.1:6379> hgetall (error) ERR wrong number of arguments for 'hgetall' command 127.0.0.1:6379> hgetall user1 1) "name" 2) "zhangsan" 3) "age" 4) "19" 5) "sex" 6) "girl" 127.0.0.1:6379> hlen user1 (integer) 3 127.0.0.1:6379> <h5>HSTRLEN(返回指定键值的长度)</h5> > 可用版本:>= 3.2.0 HSTRLEN key field 返回哈希表 key 中, 与给定域 field 相关联的值的字符串长度(string length)。 如果给定的键或者域不存在, 那么命令返回 0 。 返回值:一个整数。 ---------- redis> HMSET myhash f1 "HelloWorld" f2 "99" f3 "-256" OK redis> HSTRLEN myhash f1 (integer) 10 redis> HSTRLEN myhash f2 (integer) 2 redis> HSTRLEN myhash f3 (integer) 4 <h5>HSTRLEN(为指定键增加值)</h5> > HINCRBYFLOAT:为哈希表 key 中的域 field 加上浮点数增量 increment 。 为哈希表 key 中的域 field 的值加上增量 increment 。 增量也可以为负数,相当于对给定域进行减法操作。 如果 key 不存在,一个新的哈希表被创建并执行 HINCRBY 命令。 如果域 field 不存在,那么在执行命令前,域的值被初始化为 0 。 对一个储存字符串值的域 field 执行 HINCRBY 命令将造成一个错误。 ---------- 127.0.0.1:6379> hincrby user1 age 1 (integer) 22 127.0.0.1:6379> hincrby user1 age -1 (integer) 21 <h5>HKEYS(返回所有键)</h5> HKEYS key:返回哈希表 key 中的所有域。 返回值:一个包含哈希表中所有域的表。 当 key 不存在时,返回一个空表。 ---------- 127.0.0.1:6379> hkeys user1 1) "name" 2) "age" 3) "sex" 127.0.0.1:6379> hkeys user2 (empty list or set) <h5>HVALS(返回所有值)</h5> HVALS key:返回哈希表 key 中所有域的值。 返回值:一个包含哈希表中所有值的表。 当 key 不存在时,返回一个空表。 ---------- 127.0.0.1:6379> hvals user2 (empty list or set) 127.0.0.1:6379> hvals user1 1) "zhangsan" 2) "21" 3) "girl" ##列表介绍## Redis 列表(List) Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边) 一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。 ##List## <h5>LPUSH(增加元素)</h5> > RPUSH: 将一个或多个值 value 插入到列表 key 的表尾(最右边)。 > RPUSHX:将值 value 插入到列表 key 的表尾,当且仅当 key 存在并且是一个列表。 LPUSH 将一个或多个值 value 插入到列表 key 的表头 如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表头: 比如说,对空列表 mylist 执行命令 LPUSH mylist a b c ,列表的值将是 c b a ,这等同于原子性地执行 LPUSH mylist a 、 LPUSH mylist b 和 LPUSH mylist c 三个命令。 如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。 当 key 存在但不是列表类型时,返回一个错误。 返回值:执行 LPUSH 命令后,列表的长度。 ---------- 127.0.0.1:6379> lpush list 1 (integer) 1 127.0.0.1:6379> lpush list 2 (integer) 2 127.0.0.1:6379> rpush list 3 (integer) 3 127.0.0.1:6379> lrange list -0 -1 1) "2" 2) "1" 3) "3" 127.0.0.1:6379> lpush list 3 (integer) 4 127.0.0.1:6379> lrange list -0 -1 1) "3" 2) "2" 3) "1" 4) "3" <h5>LPOP(移除元素)</h5> > RPOP:移除并返回列表 key 的尾元素。 LPOP key:移除并返回列表 key 的头元素。 返回值:列表的头元素。 当 key 不存在时,返回 nil 。 ---------- 127.0.0.1:6379> lpop list "3" 127.0.0.1:6379> lrange list -0 -1 1) "2" 2) "1" 3) "3" <h5>RPOPLPUSH(左删除右增加)</h5> RPOPLPUSH source destination 命令 RPOPLPUSH 在一个原子时间内,执行以下两个动作: 将列表 source 中的最后一个元素(尾元素)弹出,并返回给客户端。 将 source 弹出的元素插入到列表 destination ,作为 destination 列表的的头元素。 举个例子,你有两个列表 source 和 destination , source 列表有元素 a, b, c , destination 列表有元素 x, y, z ,执行 RPOPLPUSH source destination 之后, source 列表包含元素 a, b , destination 列表包含元素 c, x, y, z ,并且元素 c 会被返回给客户端。 如果 source 不存在,值 nil 被返回,并且不执行其他动作。 如果 source 和 destination 相同,则列表中的表尾元素被移动到表头,并返回该元素,可以把这种特殊情况视作列表的旋转(rotation)操作。 ---------- 127.0.0.1:6379> lrange list 0 -1 1) "2" 2) "1" 3) "3" 127.0.0.1:6379> keys * 1) "list" 2) "user1" 127.0.0.1:6379> RPOPLPUSH list newlist "3" 127.0.0.1:6379> RPOPLPUSH list newlist "1" 127.0.0.1:6379> RPOPLPUSH list newlist "2" 127.0.0.1:6379> RPOPLPUSH list newlist (nil) 127.0.0.1:6379> lrange newlist 0 -1 1) "2" 2) "1" 3) "3" 127.0.0.1:6379> <h5>LREM(删除几个固定元素)</h5> LREM key count value:根据参数 count 的值,移除列表中与参数 value 相等的元素。 count 的值可以是以下几种: count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。 count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。 count = 0 : 移除表中所有与 value 相等的值。 ---------- 127.0.0.1:6379> lpush list zhangsan (integer) 1 127.0.0.1:6379> lpush list lisi (integer) 2 127.0.0.1:6379> lpush list wangwu (integer) 3 127.0.0.1:6379> lpush list lisi (integer) 4 127.0.0.1:6379> lpush list wangwu (integer) 5 127.0.0.1:6379> lrange list 0 -1 1) "wangwu" 2) "lisi" 3) "wangwu" 4) "lisi" 5) "zhangsan" 127.0.0.1:6379> lrem list 1 lisi (integer) 1 127.0.0.1:6379> lrange list 0 -1 1) "wangwu" 2) "wangwu" 3) "lisi" 4) "zhangsan" 127.0.0.1:6379> lrem list 2 wangwu (integer) 2 127.0.0.1:6379> lrange list 0 -1 1) "lisi" 2) "zhangsan" 返回值 被移除元素的数量。 因为不存在的 key 被视作空表(empty list),所以当 key 不存在时, LREM 命令总是返回 0 。 <h5>LLEN(返回长度)</h5> LLEN key 返回列表 key 的长度。 如果 key 不存在,则 key 被解释为一个空列表,返回 0 . 如果 key 不是列表类型,返回一个错误。 ---------- 127.0.0.1:6379> llen list (integer) 2 127.0.0.1:6379> lrange list 0 -1 1) "lisi" <h5>LINDEX(返回指定下标元素)</h5> LINDEX key index:返回列表 key 中,下标为 index 的元素。 下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。 如果 key 不是列表类型,返回一个错误。 返回值:列表中下标为 index 的元素。 如果 index 参数的值不在列表的区间范围内(out of range),返回 nil 。 ---------- 127.0.0.1:6379> lrange list 0 -1 1) "lisi" 2) "zhangsan" 127.0.0.1:6379> lindex list 0 "lisi" 127.0.0.1:6379> lindex list 1 "zhangsan" 127.0.0.1:6379> lindex list 2 (nil) <h5>LINSERT(插入元素)</h5> LINSERT key BEFORE|AFTER pivot value 将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。 当 pivot 不存在于列表 key 时,不执行任何操作。 当 key 不存在时, key 被视为空列表,不执行任何操作。 如果 key 不是列表类型,返回一个错误。 返回值:如果命令执行成功,返回插入操作完成之后,列表的长度。 如果没有找到 pivot ,返回 -1 。 如果 key 不存在或为空列表,返回 0 。 ---------- 127.0.0.1:6379> lrange list 0 -1 1) "lisi" 2) "zhangsan" 127.0.0.1:6379> lrange list 0 -1 1) "lisi" 2) "wangwu" 3) "zhangsan" 127.0.0.1:6379> linsert list before lisi zhaoliu (integer) 4 127.0.0.1:6379> lrange list 0 -1 1) "zhaoliu" 2) "lisi" 3) "wangwu" 4) "zhangsan" <h5>LSET(更改下标元素)</h5> LSET key index value 将列表 key 下标为 index 的元素的值设置为 value 。 当 index 参数超出范围,或对一个空列表( key 不存在)进行 LSET 时,返回一个错误。 ---------- 127.0.0.1:6379> lset list 0 zhangxiaoliu OK 127.0.0.1:6379> lindex list 0 "zhangxiaoliu" <h5>LRANGE(返回范围元素)</h5> LRANGE key start stop:返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定。 下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。 注意LRANGE命令和编程语言区间函数的区别 假如你有一个包含一百个元素的列表,对该列表执行 LRANGE list 0 10 ,结果是一个包含11个元素的列表,这表明 stop 下标也在 LRANGE 命令的取值范围之内(闭区间),这和某些语言的区间函数可能不一致,比如Ruby的 Range.new 、 Array#slice 和Python的 range() 函数。 超出范围的下标 超出范围的下标值不会引起错误。 如果 start 下标比列表的最大下标 end ( LLEN list 减去 1 )还要大,那么 LRANGE 返回一个空列表。 如果 stop 下标比 end 下标还要大,Redis将 stop 的值设置为 end 。 返回值:一个列表,包含指定区间内的元素。 ---------- 127.0.0.1:6379> lrange list 0 1 1) "zhangxiaoliu" 2) "lisi" 127.0.0.1:6379> lrange list 0 4 1) "zhangxiaoliu" 2) "lisi" 3) "wangwu" 4) "zhangsan" 127.0.0.1:6379> lrange list 0 -1 1) "zhangxiaoliu" 2) "lisi" 3) "wangwu" 4) "zhangsan" <h5>LTRIM(删除范围的的元素)</h5> LTRIM key start stop:对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。 举个例子,执行命令 LTRIM list 0 2 ,表示只保留列表 list 的前三个元素,其余元素全部删除。 下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。 当 key 不是列表类型时,返回一个错误。 LTRIM 命令通常和 LPUSH key value [value …] 命令或 RPUSH key value [value …] 命令配合使用,举个例子: LPUSH log newest_log LTRIM log 0 99 这个例子模拟了一个日志程序,每次将最新日志 newest_log 放到 log 列表中,并且只保留最新的 100 项。注意当这样使用 LTRIM 命令时,时间复杂度是O(1),因为平均情况下,每次只有一个元素被移除。 返回值:命令执行成功时,返回 ok 。 ---------- 127.0.0.1:6379> ltrim list 1 2 OK 127.0.0.1:6379> lrange list 0 -1 1) "lisi" 2) "wangwu" <h5>BLPOP</h5> > 详解: http://redisdoc.com/list/blpop.html BLPOP 是列表的阻塞式(blocking)弹出原语。 它是 LPOP key 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BLPOP 命令阻塞,直到等待超时或发现可弹出元素为止。 ## 结尾 ## <p style="background-image: -webkit-linear-gradient(left, #3498db, #f47920 10%, #d71345 20%, #f7acbc 30%,#ffd400 40%, #3498db 50%, #f47920 60%, #d71345 70%, #f7acbc 80%, #ffd400 90%, #3498db);color: transparent;-webkit-text-fill-color: transparent;-webkit-background-clip: text;text-align:center;"> 腹有诗书气自华,最是书香能致远。 </p>