Redis命令
1. 引言
最近看了别人以前项目中关于Redis的操作,发现很丰富。我用过的Redis存数据基本都是存String和list类型,对象全都序列化,存String类型。现在回想起来真是简单粗暴。有2个实际业务,数据库存着一些结构化图片,有以下的结构,比如天气是晴天的图片,天气是雨天的图片,天气是阴天的图片,地点是杭州的图片,地点是上海的图片等。我现在要找晴天and杭州的照片,或者要找晴天or雨天and上海的照片。结构化标签有上千种,我不可能每一个sql语句都要查询一遍吧,于是我导师告诉我,可以用Redis的set的并交集来处理。另一个业务是我要统计当天有多少人登陆,起初我想登陆一次就数据库次数加一,因为是集群环境下,这样会很容易出现数据不一致问题。于是我看了别人以前写的代码,登陆一次就存在redis的zset中,设置序号是当前时间戳。然后我统计时用zset的zrange统计就可以。仔细一琢磨,redis基本操作我都不会,还是回去去看API吧!
2. String类型
SET key value //设置指定 key 的值 GET key //获取指定 key 的值 GETRANGE key start end //返回 key 中字符串值的子字符 GETSET key value //将给定 key 的值设为 value ,并返回 key 的旧值(old value) MGET key1 [key2..] //获取所有(一个或多个)给定 key 的值 SETEX key seconds value //将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位) SETNX key value //只有在 key 不存在时设置 key 的值(0表示添加失败,1表示添加成功) STRLEN key //返回 key 所储存的字符串值的长度 MSET key value [key value ...] //同时设置一个或多个 key-value 对 MSETNX key value [key value ...] //同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在才能设置成功 PSETEX key milliseconds value //这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位 INCR key //将 key 中储存的数字值增一(如果value不是数字,就会报错) INCRBY key increment //将 key 所储存的值加上给定的增量值(如果value不是数字,就会报错) INCRBYFLOAT key increment //将 key 所储存的值加上给定的浮点增量值(increment可以是0.5这种小数类型) DECR key //将 key 中储存的数字值减一 DECRBY key decrement //key 所储存的值减去给定的减量值(decrement) APPEND key value //如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾
3. Hash类型
HDEL key field1 [field2] //删除一个或多个哈希表字段 HEXISTS key field //查看哈希表 key 中,指定的字段是否存在 HGET key field //获取存储在哈希表中指定字段的值 HGETALL key //获取在哈希表中指定 key 的所有字段和值 HINCRBY key field increment //为哈希表 key 中的指定字段的整数值加上增量 increment HINCRBYFLOAT key field increment //为哈希表 key 中的指定字段的浮点数值加上增量 increment HKEYS key //获取所有哈希表中的字段 HLEN key //获取哈希表中字段的数量 HMGET key field1 [field2] //获取所有给定字段的值 HMSET key field1 value1 [field2 value2 ] //同时将多个 field-value (域-值)对设置到哈希表 key 中 HSET key field value //将哈希表 key 中的字段 field 的值设为 value HSETNX key field value //只有在字段 field 不存在时,设置哈希表字段的值 HVALS key //获取哈希表中所有值 HSCAN key cursor [MATCH pattern] [COUNT count] //迭代哈希表中的键值对
补充:对于hscan操作,相当于模糊查询。当我们需要遍历Redis所有key或者指定模式的key时,首先想到的是KEYS命令,但是如果redis数据非常大,并且key也非常多的情况下,查询的时候很可能会很慢,造成整个redis阻塞。cursor代表游标,命令返回值也会返回一个游标,当服务器向用户返回值为 0 的游标时, 表示迭代已结束。不过hscan的COUNT我在测试时无效,指定2行非得给我返回多于2行数据,据说因为数据过少问题引起的。
4. List类型
BLPOP key1 [key2 ] timeout //移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 BRPOP key1 [key2 ] timeout //移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 BRPOPLPUSH source destination timeout //从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 LINDEX key index //通过索引获取列表中的元素 LINSERT key BEFORE|AFTER pivot value //在列表的元素前或者后插入元素 LLEN key //获取列表长度 LPOP key //移出并获取列表的第一个元素 LPUSH key value1 [value2] //将一个或多个值插入到列表头部 LPUSHX key value //将一个值插入到已存在的列表头部(返回0代表此列表不存在,插入失败) LRANGE key start stop //获取列表指定范围内的元素 LREM key count value //移除列表元素 #根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素。 #COUNT 的值可以是以下几种: #count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。 #count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。 #count = 0 : 移除表中所有与 VALUE 相等的值 LSET key index value //通过索引设置列表元素的值 LTRIM key start stop //对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除 RPOP key //移除列表的最后一个元素,返回值为移除的元素 RPOPLPUSH source destination //移除列表的最后一个元素,并将该元素添加到另一个列表并返回 RPUSH key value1 [value2] //在列表中添加一个或多个值 RPUSHX key value //为已存在的列表添加值
5. Set类型
SADD key member1 [member2] //向集合添加一个或多个成员 SCARD key //获取集合的成员数 SDIFF key1 [key2] //返回给定所有集合的差集 #key1 集合中有1,2,3,4,5,6 #key2 集合中有4,5,6,7,8,9 #则SDIFF key1 key2 返回结果为1,2,3 SDIFFSTORE destination key1 [key2] //返回给定所有集合的差集并存储在 destination 中 SINTER key1 [key2] //返回给定所有集合的交集 #key1 集合中有1,2,3,4,5,6 #key2 集合中有4,5,6,7,8,9 #则SINTER key1 key2 返回结果为4,5,6 SINTERSTORE destination key1 [key2] //返回给定所有集合的交集并存储在 destination 中 SISMEMBER key member //判断 member 元素是否是集合 key 的成员 SMEMBERS key //返回集合中的所有成员 SMOVE source destination member //将 member 元素从 source 集合移动到 destination 集合 SPOP key //移除并返回集合中的一个随机元素 SRANDMEMBER key [count] //返回集合中一个或多个随机数 SREM key member1 [member2] //移除集合中一个或多个成员 SUNION key1 [key2] //返回所有给定集合的并集 SUNIONSTORE destination key1 [key2] //所有给定集合的并集存储在 destination 集合中
6. SortedSet类型
ZADD key score1 member1 [score2 member2] //向有序集合添加一个或多个成员,或者更新已存在成员的分数 ZCARD key //获取有序集合的成员数 ZCOUNT key min max //计算在有序集合中指定区间分数的成员数 ZINCRBY key increment member //有序集合中对指定成员的分数加上增量 increment ZINTERSTORE destination numkeys key [key ...] //计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中 #交集后的成员分数等于交集前2分数之和 ZRANGE key start stop [WITHSCORES] //通过索引区间返回有序集合指定区间内的成员 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] //通过分数返回有序集合指定区间内的成员 ZRANK key member //返回有序集合中指定成员的索引 ZREM key member [member ...] //移除有序集合中的一个或多个成员 ZREMRANGEBYRANK key start stop //移除有序集合中给定的排名区间的所有成员 ZREMRANGEBYSCORE key min max //移除有序集合中给定的分数区间的所有成员 ZREVRANGE key start stop [WITHSCORES] //返回有序集中指定区间内的成员,通过索引,分数从高到低 ZREVRANGEBYSCORE key max min [WITHSCORES] //返回有序集中指定分数区间内的成员,分数从高到低排序 ZSCORE key member //返回有序集中,成员的分数值 ZUNIONSTORE destination numkeys key [key ...] //计算给定的一个或多个有序集的并集,并存储在新的 key 中 #有两个概念需要区分,一个是序列(即索引),相当于list中的序列;另一个是分数,是有序集合独有的,使用者在存数据时可以指定该对象的分数值。
7. 总结
以前很不屑去看这些基础API,自己去实践了一把,发现自己没有掌握的操作还有很多;掌握基本的API是学习一门技术的前提;个人觉得上述基本操作熟悉即可,能够知道有这个操作存在,在正式开发环境中,可以对于这些类型能够有清晰的认识,能灵活运用各个场景,提高自己开发效率;