Redis 数据类型
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
String(字符串)
string 是 redis 最基本的类型,可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。
string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如 jpg 图片或者序列化的对象。
string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。
实例
redis 127.0.0.1:6379> SET name "runoob" OK redis 127.0.0.1:6379> GET name "runoob"
以上实例中使用了 Redis 的 SET 和 GET 命令。键为 name,对应的值为 runoob。
注意:一个键最大能存储512MB。
# 1. 设置指定 key 的值 SET key value ''' redis 127.0.0.1:6379> SET the_key "the_value" OK ''' # 2. 获取指定 key 的值。 GET key ''' 不存在的key返回值为nil redis> GET db (nil) 存在的key返回值为value redis> GET the_key "the_value" ''' # 3. 返回 key 中字符串值的子字符,类似于切片功能 GETRANGE key start end ''' redis 127.0.0.1:6379> SET mykey "This is my test key" OK redis 127.0.0.1:6379> GETRANGE mykey 0 3 "This" redis 127.0.0.1:6379> GETRANGE mykey 0 -1 "This is my test key" ''' # 4. 将给定 key 的值设为 value ,并返回 key 的旧值.当 key 没有旧值时,即 key 不存在时,返回 nil 。 GETSET key value ''' redis> GETSET my_db my_mongodb # 没有旧值,返回 nil (nil) redis> GET my_db "my_mongodb" redis> GETSET my_db my_redis # 返回旧值 mongodb "my_mongodb" redis> GET my_db "my_redis" ''' # 5. 对 key 所储存的字符串值,获取指定偏移量上的位(bit)。 GETBIT key offset ''' # 对不存在的 key 或者不存在的 offset 进行 GETBIT, 返回 0 redis> EXISTS bit (integer) 0 redis> GETBIT bit 10086 (integer) 0 # 对已存在的 offset 进行 GETBIT redis> SETBIT bit 10086 1 (integer) 0 redis> GETBIT bit 10086 (integer) 1 ''' # 6. 获取所有(一个或多个)给定 key 的值。 MGET key1 [key2..] ''' redis 127.0.0.1:6379> SET key1 "hello" OK redis 127.0.0.1:6379> SET key2 "world" OK redis 127.0.0.1:6379> MGET key1 key2 someOtherKey 1) "Hello" 2) "World" 3) (nil) ''' # 7. 对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。 SETBIT key offset value ''' redis> SETBIT bit 10086 1 (integer) 0 redis> GETBIT bit 10086 (integer) 1 redis> GETBIT bit 100 # bit 默认被初始化为 0 (integer) 0 ''' # 8. 将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。 SETEX key seconds value ''' redis 127.0.0.1:6379> SETEX mykey 60 redis OK redis 127.0.0.1:6379> TTL mykey 60 redis 127.0.0.1:6379> GET mykey "redis ''' # 9. 只有在 key 不存在时设置 key 的值。 SETNX key value ''' redis> EXISTS job # job 不存在 (integer) 0 redis> SETNX job "programmer" # job 设置成功 (integer) 1 redis> SETNX job "code-farmer" # 尝试覆盖 job ,失败 (integer) 0 redis> GET job # 没有被覆盖 "programmer" ''' # 10.用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。 SETRANGE key offset value ''' redis 127.0.0.1:6379> SET key1 "Hello World" OK redis 127.0.0.1:6379> SETRANGE key1 6 "Redis" (integer) 11 redis 127.0.0.1:6379> GET key1 "Hello Redis" ''' # 11.返回 key 所储存的字符串值的长度。 STRLEN key ''' # 获取字符串的长度 redis> SET mykey "Hello world" OK redis> STRLEN mykey (integer) 11 # 不存在的 key 长度为 0 redis> STRLEN nonexisting (integer) 0 ''' # 12.同时设置一个或多个 key-value 对。 MSET key value [key value ...] ''' redis 127.0.0.1:6379> MSET key1 "Hello" key2 "World" OK redis 127.0.0.1:6379> GET key1 "Hello" redis 127.0.0.1:6379> GET key2 "World" ''' # 13.同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在才成功。 MSETNX key value [key value ...] ''' # 对不存在的 key 进行 MSETNX redis> MSETNX rmdbs "MySQL" nosql "MongoDB" key-value-store "redis" (integer) 1 redis> MGET rmdbs nosql key-value-store 1) "MySQL" 2) "MongoDB" 3) "redis" # MSET 的给定 key 当中有已存在的 key redis> MSETNX rmdbs "Sqlite" language "python" # rmdbs 键已经存在,操作失败 (integer) 0 redis> EXISTS language # 因为 MSET 是原子性操作,language 没有被设置 (integer) 0 redis> GET rmdbs # rmdbs 也没有被修改 "MySQL" ''' # 14.这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。 PSETEX key milliseconds value ''' redis 127.0.0.1:6379> PSETEX mykey 1000 "Hello" OK redis 127.0.0.1:6379> PTTL mykey 999 redis 127.0.0.1:6379> GET mykey "Hello" ''' # 15.将 key 中储存的数字值增一。 INCR key ''' redis> SET page_view 20 OK redis> INCR page_view (integer) 21 redis> GET page_view # 数字值在 Redis 中以字符串的形式保存 "21" ''' # 16.将 key 所储存的值加上给定的增量值,key为非数字时报错 INCRBY key increment ''' # key 存在且是数字值 redis> SET rank 50 OK redis> INCRBY rank 20 (integer) 70 redis> GET rank "70" # key 不存在时 redis> EXISTS counter (integer) 0 redis> INCRBY counter 30 (integer) 30 redis> GET counter "30" # key 不是数字值时 redis> SET book "long long ago..." OK redis> INCRBY book 200 (error) ERR value is not an integer or out of range ''' # 17将 key 所储存的值加上给定的浮点增量值(increment) 。 INCRBYFLOAT key increment ''' # 值和增量都不是指数符号 redis> SET mykey 10.50 OK redis> INCRBYFLOAT mykey 0.1 "10.6" # 值和增量都是指数符号 redis> SET mykey 314e-2 OK redis> GET mykey # 用 SET 设置的值可以是指数符号 "314e-2" redis> INCRBYFLOAT mykey 0 # 但执行 INCRBYFLOAT 之后格式会被改成非指数符号 "3.14" # 可以对整数类型执行 redis> SET mykey 3 OK redis> INCRBYFLOAT mykey 1.1 "4.1" # 后跟的 0 会被移除 redis> SET mykey 3.0 OK redis> GET mykey # SET 设置的值小数部分可以是 0 "3.0" redis> INCRBYFLOAT mykey 1.000000000000000000000 # 但 INCRBYFLOAT 会将无用的 0 忽略掉,有需要的话,将浮点变为整数 "4" redis> GET mykey "4" ''' # 18.将 key 中储存的数字值减一。 DECR key '''# 对存在的数字值 key 进行 DECR redis> SET failure_times 10 OK redis> DECR failure_times (integer) 9 # 对不存在的 key 值进行 DECR redis> EXISTS count (integer) 0 redis> DECR count (integer) -1 # 对存在但不是数值的 key 进行 DECR redis> SET company YOUR_CODE_SUCKS.LLC OK redis> DECR company (error) ERR value is not an integer or out of range ''' # 19.key 所储存的值减去给定的减量值(decrement) 。 DECRBY key decrement ''' # 对已存在的 key 进行 DECRBY redis> SET count 100 OK redis> DECRBY count 20 (integer) 80 # 对不存在的 key 进行DECRBY redis> EXISTS pages (integer) 0 redis> DECRBY pages 10 (integer) -10 ''' #20.如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾。 APPEND key value ''' # 对不存在的 key 执行 APPEND redis> EXISTS myphone # 确保 myphone 不存在 (integer) 0 redis> APPEND myphone "nokia" # 对不存在的 key 进行 APPEND ,等同于 SET myphone "nokia" (integer) 5 # 字符长度 # 对已存在的字符串进行 APPEND redis> APPEND myphone " - 1110" # 长度从 5 个字符增加到 12 个字符 (integer) 12 redis> GET myphone "nokia - 1110" '''
Hash(哈希)
Redis hash 是一个键值(key=>value)对集合。
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
实例
redis> HMSET myhash field1 "Hello" field2 "World""OK" redis> HGET myhash field1 "Hello" redis> HGET myhash field2 "World"
实例中使用了 Redis HMSET, HGET 命令,HMSET 设置了两个 field=>value 对, HGET 获取对应 field 对应的 value。
每个 hash 可以存储 232 -1 键值对(40多亿)。
# 1. 删除一个或多个哈希表字段 HDEL key field1 [field2] ''' redis 127.0.0.1:6379> HSET myhash field1 "foo" (integer) 1 redis 127.0.0.1:6379> HDEL myhash field1 (integer) 1 redis 127.0.0.1:6379> HDEL myhash field2 (integer) 0 ''' # 2. 查看哈希表 key 中,指定的字段是否存在。 HEXISTS key field ''' redis 127.0.0.1:6379> HSET myhash field1 "foo" (integer) 1 redis 127.0.0.1:6379> HEXISTS myhash field1 (integer) 1 redis 127.0.0.1:6379> HEXISTS myhash field2 (integer) 0 ''' # 3.获取存储在哈希表中指定字段的值。 HGET key field ''' # 字段存在 redis> HSET site redis redis.com (integer) 1 redis> HGET site redis "redis.com" # 字段不存在 redis> HGET site mysql (nil) ''' # 4.获取在哈希表中指定 key 的所有字段和值 HGETALL key ''' redis> HSET myhash field1 "Hello" (integer) 1 redis> HSET myhash field2 "World" (integer) 1 redis> HGETALL myhash 1) "field1" 2) "Hello" 3) "field2" 4) "World" redis> ''' # 5.为哈希表 key 中的指定字段的整数值加上增量 increment 。 HINCRBY key field increment ''' redis> HSET myhash field 5 (integer) 1 redis> HINCRBY myhash field 1 (integer) 6 redis> HINCRBY myhash field -1 (integer) 5 redis> HINCRBY myhash field -10 (integer) -5 redis> ''' # 6.为哈希表 key 中的指定字段的浮点数值加上增量 increment 。 HINCRBYFLOAT key field increment ''' redis> HSET mykey field 10.50 (integer) 1 redis> HINCRBYFLOAT mykey field 0.1 "10.60000000000000001" redis> HINCRBYFLOAT mykey field -5 "5.59999999999999964" redis> HSET mykey field 5.0e3 (integer) 0 redis> HINCRBYFLOAT mykey field 2.0e2 "5200" ''' # 7.获取所有哈希表中的字段 HKEYS key ''' redis 127.0.0.1:6379> HSET myhash field1 "foo" (integer) 1 redis 127.0.0.1:6379> HSET myhash field2 "bar" (integer) 1 redis 127.0.0.1:6379> HKEYS myhash 1) "field1" 2) "field2" ''' # 8.获取哈希表中字段的数量 HLEN key ''' redis 127.0.0.1:6379> HSET myhash field1 "foo" (integer) 1 redis 127.0.0.1:6379> HSET myhash field2 "bar" (integer) 1 redis 127.0.0.1:6379> HLEN myhash (integer) 2 ''' # 9.获取所有给定字段的值 HMGET key field1 [field2] ''' redis 127.0.0.1:6379> HSET myhash field1 "foo" (integer) 1 redis 127.0.0.1:6379> HSET myhash field2 "bar" (integer) 1 redis 127.0.0.1:6379> HMGET myhash field1 field2 nofield 1) "foo" 2) "bar" 3) (nil) ''' # 10.同时将多个 field-value (域-值)对设置到哈希表 key 中。 HMSET key field1 value1 [field2 value2 ] ''' redis 127.0.0.1:6379> HMSET myhash field1 "Hello" field2 "World" OK redis 127.0.0.1:6379> HGET myhash field1 "Hello" redis 127.0.0.1:6379> HGET myhash field2 "World" ''' # 11.将哈希表 key 中的字段 field 的值设为 value 。 HSET key field value ''' redis 127.0.0.1:6379> HSET myhash field1 "foo" OK redis 127.0.0.1:6379> HGET myhash field1 "foo" redis 127.0.0.1:6379> HSET website google "www.g.cn" # 设置一个新域 (integer) 1 redis 127.0.0.1:6379>HSET website google "www.google.com" # 覆盖一个旧域 (integer) 0 ''' # 12.只有在字段 field 不存在时,设置哈希表字段的值。 HSETNX key field value ''' redis 127.0.0.1:6379> HSETNX myhash field1 "foo" (integer) 1 redis 127.0.0.1:6379> HSETNX myhash field1 "bar" (integer) 0 redis 127.0.0.1:6379> HGET myhash field1 "foo" redis 127.0.0.1:6379> HSETNX nosql key-value-store redis (integer) 1 redis 127.0.0.1:6379> HSETNX nosql key-value-store redis # 操作无效, key-value-store 已存在 (integer) 0 ''' # 13.获取哈希表中所有值 HVALS key ''' redis 127.0.0.1:6379> HSET myhash field1 "foo" (integer) 1 redis 127.0.0.1:6379> HSET myhash field2 "bar" (integer) 1 redis 127.0.0.1:6379> HVALS myhash 1) "foo" 2) "bar" # 空哈希表/不存在的key redis 127.0.0.1:6379> EXISTS not_exists (integer) 0 redis 127.0.0.1:6379> HVALS not_exists (empty list or set) ''' # 14.迭代哈希表中的键值对。 HSCAN key cursor [MATCH pattern] [COUNT count]
List(列表)
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
实例
redis 127.0.0.1:6379> lpush runoob redis (integer)1 redis 127.0.0.1:6379> lpush runoob mongodb (integer)2 redis 127.0.0.1:6379> lpush runoob rabitmq (integer)3 redis 127.0.0.1:6379> lrange runoob 0101)"rabitmq"2)"mongodb"3)"redis" redis 127.0.0.1:6379>
列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。
# 1.移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 BLPOP key1 [key2 ] timeout ''' redis 127.0.0.1:6379> BLPOP list1 100 操作会被阻塞,如果指定的列表 key list1 存在数据则会返回第一个元素,否则在等待100秒后会返回 nil 。 (nil) (100.06s) ''' # 2.移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 BRPOP key1 [key2 ] timeout ''' 操作同上 ''' # 3.从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 BRPOPLPUSH source destination timeout ''' # 非空列表 redis> BRPOPLPUSH msg reciver 500 "hello moto" # 弹出元素的值 (3.38s) # 等待时长 redis> LLEN reciver (integer) 1 redis> LRANGE reciver 0 0 1) "hello moto" # 空列表 redis> BRPOPLPUSH msg reciver 1 (nil) (1.34s) ''' # 4.通过索引获取列表中的元素 LINDEX key index ''' redis 127.0.0.1:6379> LPUSH mylist "World" (integer) 1 redis 127.0.0.1:6379> LPUSH mylist "Hello" (integer) 2 redis 127.0.0.1:6379> LINDEX mylist 0 "Hello" redis 127.0.0.1:6379> LINDEX mylist -1 "World" redis 127.0.0.1:6379> LINDEX mylist 3 # index不在 mylist 的区间范围内 (nil) ''' # 5.在列表的元素前或者后插入元素 LINSERT key BEFORE|AFTER pivot value ''' 如果命令执行成功,返回插入操作完成之后,列表的长度。 如果没有找到指定元素 ,返回 -1 。 如果 key 不存在或为空列表,返回 0 。 redis> RPUSH mylist "Hello" (integer) 1 redis> RPUSH mylist "World" (integer) 2 redis> LINSERT mylist BEFORE "World" "There" (integer) 3 redis> LRANGE mylist 0 -1 1) "Hello" 2) "There" 3) "World" ''' # 6.获取列表长度 LLEN key ''' redis 127.0.0.1:6379> RPUSH list1 "foo" (integer) 1 redis 127.0.0.1:6379> RPUSH list1 "bar" (integer) 2 redis 127.0.0.1:6379> LLEN list1 (integer) 2 ''' # 7.移出并获取列表的第一个元素,当列表 key 不存在时,返回 nil 。 LPOP key ''' redis 127.0.0.1:6379> RPUSH list1 "foo" (integer) 1 redis 127.0.0.1:6379> RPUSH list1 "bar" (integer) 2 redis 127.0.0.1:6379> LPOP list1 "foo" ''' # 8.将一个或多个值插入到列表头部 LPUSH key value1 [value2] ''' 执行 LPUSH 命令后,返回值是列表的长度。 127.0.0.1:6379> LPUSH list1 "foo" (integer) 1 127.0.0.1:6379> LPUSH list1 "bar" (integer) 2 127.0.0.1:6379> LRANGE list1 0 -1 1) "bar" 2) "foo" ''' # 9.将一个值插入到已存在的列表头部 LPUSHX key value ''' 127.0.0.1:6379> LPUSH list1 "foo" (integer) 1 127.0.0.1:6379> LPUSHX list1 "bar" (integer) 2 127.0.0.1:6379> LPUSHX list2 "bar" (integer) 0 127.0.0.1:6379> LRANGE list1 0 -1 1) "bar" 2) "foo" ''' # 10.获取列表指定范围内的元素 LRANGE key start stop ''' redis> RPUSH mylist "one" (integer) 1 redis> RPUSH mylist "two" (integer) 2 redis> RPUSH mylist "three" (integer) 3 redis> LRANGE mylist 0 0 1) "one" redis> LRANGE mylist -3 2 1) "one" 2) "two" 3) "three" redis> LRANGE mylist -100 100 1) "one" 2) "two" 3) "three" redis> LRANGE mylist 5 10 (empty list or set) ''' # 11.移除列表元素 LREM key count value ''' redis> RPUSH mylist "hello" (integer) 1 redis> RPUSH mylist "hello" (integer) 2 redis> RPUSH mylist "foo" (integer) 3 redis> RPUSH mylist "hello" (integer) 4 redis> LREM mylist -2 "hello" (integer) 2 redis> LRANGE mylist 0 -1 1) "hello" 2) "foo" ''' # 12.通过索引设置列表元素的值 LSET key index value ''' redis 127.0.0.1:6379> RPUSH mylist "hello" (integer) 1 redis 127.0.0.1:6379> RPUSH mylist "hello" (integer) 2 redis 127.0.0.1:6379> RPUSH mylist "foo" (integer) 3 redis 127.0.0.1:6379> RPUSH mylist "hello" (integer) 4 redis 127.0.0.1:6379> LSET mylist 0 "bar" OK redis 127.0.0.1:6379> LRANGE mylist 0 -1 1: "bar" 2) "hello" 3) "foo" 4) "hello" ''' # 13.对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。 LTRIM key start stop ''' redis 127.0.0.1:6379> RPUSH mylist "hello" (integer) 1 redis 127.0.0.1:6379> RPUSH mylist "hello" (integer) 2 redis 127.0.0.1:6379> RPUSH mylist "foo" (integer) 3 redis 127.0.0.1:6379> RPUSH mylist "bar" (integer) 4 redis 127.0.0.1:6379> LTRIM mylist 1 -1 OK redis 127.0.0.1:6379> LRANGE mylist 0 -1 1) "hello" 2) "foo" 3) "bar" ''' # 14.移除并获取列表最后一个元素 RPOP key ''' redis> RPUSH mylist "one" (integer) 1 redis> RPUSH mylist "two" (integer) 2 redis> RPUSH mylist "three" (integer) 3 redis> RPOP mylist "three" redis> LRANGE mylist 0 -1 1) "one" 2) "two" ''' # 15.移除列表的最后一个元素,并将该元素添加到另一个列表并返回 RPOPLPUSH source destination ''' redis 127.0.0.1:6379> RPUSH mylist "hello" (integer) 1 redis 127.0.0.1:6379> RPUSH mylist "foo" (integer) 2 redis 127.0.0.1:6379> RPUSH mylist "bar" (integer) 3 redis 127.0.0.1:6379> RPOPLPUSH mylist myotherlist "bar" redis 127.0.0.1:6379> LRANGE mylist 0 -1 1) "hello" 2) "foo" ''' # 16在列表中添加一个或多个值 RPUSH key value1 [value2] ''' redis 127.0.0.1:6379> RPUSH mylist "hello" (integer) 1 redis 127.0.0.1:6379> RPUSH mylist "foo" (integer) 2 redis 127.0.0.1:6379> RPUSH mylist "bar" (integer) 3 redis 127.0.0.1:6379> LRANGE mylist 0 -1 1) "hello" 2) "foo" 3) "bar" ''' #17.为已存在的列表添加值 RPUSHX key value ''' redis 127.0.0.1:6379> RPUSH mylist "hello" (integer) 1 redis 127.0.0.1:6379> RPUSH mylist "foo" (integer) 2 redis 127.0.0.1:6379> RPUSHX mylist2 "bar" (integer) 0 redis 127.0.0.1:6379> LRANGE mylist 0 -1 1) "hello" 2) "foo" ''' redis 列表基本操作
Set(集合)
Redis的Set是string类型的无序集合。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
sadd 命令
添加一个 string 元素到 key 对应的 set 集合中,成功返回1,如果元素已经在集合中返回 0,如果 key 对应的 set 不存在则返回错误。
sadd key member
实例
redis 127.0.0.1:6379> sadd runoob redis (integer)1 redis 127.0.0.1:6379> sadd runoob mongodb (integer)1 redis 127.0.0.1:6379> sadd runoob rabitmq (integer)1 redis 127.0.0.1:6379> sadd runoob rabitmq (integer)0 redis 127.0.0.1:6379> smembers runoob 1)"redis"2)"rabitmq"3)"mongodb"
注意:以上实例中 rabitmq 添加了两次,但根据集合内元素的唯一性,第二次插入的元素将被忽略。
集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。
# 1.向集合添加一个或多个成员 SADD key member1 [member2] ''' 返回值:被添加到集合中的新元素的数量,不包括被忽略的元素。 redis 127.0.0.1:6379> SADD myset "hello" (integer) 1 redis 127.0.0.1:6379> SADD myset "foo" (integer) 1 redis 127.0.0.1:6379> SADD myset "hello" (integer) 0 redis 127.0.0.1:6379> SMEMBERS myset 1) "hello" 2) "foo" ''' # 2.获取集合的成员数 SCARD key ''' 返回值:集合的数量。 当集合 key 不存在时,返回 0 。 redis 127.0.0.1:6379> SADD myset "hello" (integer) 1 redis 127.0.0.1:6379> SADD myset "foo" (integer) 1 redis 127.0.0.1:6379> SADD myset "hello" (integer) 0 redis 127.0.0.1:6379> SCARD myset (integer) 2 ''' # 3.返回给定所有集合的差集 SDIFF key1 [key2] ''' 返回值:包含差集成员的列表。 redis> SADD key1 "a" (integer) 1 redis> SADD key1 "b" (integer) 1 redis> SADD key1 "c" (integer) 1 redis> SADD key2 "c" (integer) 1 redis> SADD key2 "d" (integer) 1 redis> SADD key2 "e" (integer) 1 redis> SDIFF key1 key2 1) "a" 2) "b" ''' # 4.返回给定所有集合的差集并存储在 destination 中 SDIFFSTORE destination key1 [key2] ''' 返回值:结果集中的元素数量。 redis 127.0.0.1:6379> SADD myset "hello" (integer) 1 redis 127.0.0.1:6379> SADD myset "foo" (integer) 1 redis 127.0.0.1:6379> SADD myset "bar" (integer) 1 redis 127.0.0.1:6379> SADD myset2 "hello" (integer) 1 redis 127.0.0.1:6379> SADD myset2 "world" (integer) 1 redis 127.0.0.1:6379> SDIFFSTORE destset myset myset2 (integer) 2 redis 127.0.0.1:6379> SMEMBERS destset 1) "foo" 2) "bar" ''' # 5.返回给定所有集合的交集 SINTER key1 [key2] ''' 返回值:交集成员的列表。 redis 127.0.0.1:6379> SADD myset "hello" (integer) 1 redis 127.0.0.1:6379> SADD myset "foo" (integer) 1 redis 127.0.0.1:6379> SADD myset "bar" (integer) 1 redis 127.0.0.1:6379> SADD myset2 "hello" (integer) 1 redis 127.0.0.1:6379> SADD myset2 "world" (integer) 1 redis 127.0.0.1:6379> SINTER myset myset2 "hello" ''' # 6.返回给定所有集合的交集并存储在 destination 中 SINTERSTORE destination key1 [key2] ''' 返回值:返回存储交集的集合的元素数量。 redis 127.0.0.1:6379> SADD myset1 "hello" (integer) 1 redis 127.0.0.1:6379> SADD myset1 "foo" (integer) 1 redis 127.0.0.1:6379> SADD myset1 "bar" (integer) 1 redis 127.0.0.1:6379> SADD myset2 "hello" (integer) 1 redis 127.0.0.1:6379> SADD myset2 "world" (integer) 1 redis 127.0.0.1:6379> SINTERSTORE myset myset1 myset2 (integer) 1 redis 127.0.0.1:6379> SMEMBERS myset "hello" ''' # 7.判断 member 元素是否是集合 key 的成员 SISMEMBER key member ''' 返回值:如果成员元素是集合的成员,返回 1 。 如果成员元素不是集合的成员,或 key 不存在,返回 0 。 redis 127.0.0.1:6379> SADD myset1 "hello" (integer) 1 redis 127.0.0.1:6379> SISMEMBER myset1 "hello" (integer) 1 redis 127.0.0.1:6379> SISMEMBER myset1 "world" (integer) 0 ''' # 8.返回集合中的所有成员 SMEMBERS key ''' 返回值:集合中的所有成员。 redis 127.0.0.1:6379> SADD myset1 "hello" (integer) 1 redis 127.0.0.1:6379> SADD myset1 "world" (integer) 1 redis 127.0.0.1:6379> SMEMBERS myset1 1) "World" 2) "Hello" ''' 返回值:如果成员元素被成功移除,返回 1 。 如果成员元素不是 source 集合的成员,并且没有任何操作对 destination 集合执行,那么返回 0 。 redis 127.0.0.1:6379> SADD myset1 "hello" (integer) 1 redis 127.0.0.1:6379> SADD myset1 "world" (integer) 1 redis 127.0.0.1:6379> SADD myset1 "bar" (integer) 1 redis 127.0.0.1:6379> SADD myset2 "foo" (integer) 1 redis 127.0.0.1:6379> SMOVE myset1 myset2 "bar" (integer) 1 redis 127.0.0.1:6379> SMEMBERS myset1 1) "World" 2) "Hello" redis 127.0.0.1:6379> SMEMBERS myset2 1) "foo" 2) "bar" ''' # 9.将 member 元素从 source 集合移动到 destination 集合 SMOVE source destination member ''' 返回值:如果成员元素被成功移除,返回 1 。 如果成员元素不是 source 集合的成员,并且没有任何操作对 destination 集合执行,那么返回 0 。 redis 127.0.0.1:6379> SADD myset1 "hello" (integer) 1 redis 127.0.0.1:6379> SADD myset1 "world" (integer) 1 redis 127.0.0.1:6379> SADD myset1 "bar" (integer) 1 redis 127.0.0.1:6379> SADD myset2 "foo" (integer) 1 redis 127.0.0.1:6379> SMOVE myset1 myset2 "bar" (integer) 1 redis 127.0.0.1:6379> SMEMBERS myset1 1) "World" 2) "Hello" redis 127.0.0.1:6379> SMEMBERS myset2 1) "foo" 2) "bar" ''' # 10.移除并返回集合中的一个随机元素 SPOP key ''' 返回:被移除的随机元素。 当集合不存在或是空集时,返回 nil 。 redis 127.0.0.1:6379> SADD myset1 "hello" (integer) 1 redis 127.0.0.1:6379> SADD myset1 "world" (integer) 1 redis 127.0.0.1:6379> SADD myset1 "bar" (integer) 1 redis 127.0.0.1:6379> SPOP myset1 "bar" redis 127.0.0.1:6379> SMEMBERS myset1 1) "Hello" 2) "world" ''' # 11.返回集合中一个或多个随机数 SRANDMEMBER key [count] ''' 返回值:只提供集合 key 参数时,返回一个元素;如果集合为空,返回 nil 。 如果提供了 count 参数,那么返回一个数组;如果集合为空,返回空数组。 redis 127.0.0.1:6379> SADD myset1 "hello" (integer) 1 redis 127.0.0.1:6379> SADD myset1 "world" (integer) 1 redis 127.0.0.1:6379> SADD myset1 "bar" (integer) 1 redis 127.0.0.1:6379> SRANDMEMBER myset1 "bar" redis 127.0.0.1:6379> SRANDMEMBER myset1 2 1) "Hello" 2) "world" ''' # 12.移除集合中一个或多个成员 SREM key member1 [member2] ''' 返回值:被成功移除的元素的数量,不包括被忽略的元素。 redis 127.0.0.1:6379> SADD myset1 "hello" (integer) 1 redis 127.0.0.1:6379> SADD myset1 "world" (integer) 1 redis 127.0.0.1:6379> SADD myset1 "bar" (integer) 1 redis 127.0.0.1:6379> SREM myset1 "hello" (integer) 1 redis 127.0.0.1:6379> SREM myset1 "foo" (integer) 0 redis 127.0.0.1:6379> SMEMBERS myset1 1) "bar" 2) "world" ''' # 13.返回所有给定集合的并集 SUNION key1 [key2] ''' 返回值:并集成员的列表。 redis> SADD key1 "a" (integer) 1 redis> SADD key1 "b" (integer) 1 redis> SADD key1 "c" (integer) 1 redis> SADD key2 "c" (integer) 1 redis> SADD key2 "d" (integer) 1 redis> SADD key2 "e" (integer) 1 redis> SUNION key1 key2 1) "a" 2) "c" 3) "b" 4) "e" 5) "d" ''' # 14.所有给定集合的并集存储在 destination 集合中 SUNIONSTORE destination key1 [key2] ''' 返回值:结果集中的元素数量。 redis 127.0.0.1:6379> SADD myset1 "hello" (integer) 1 redis 127.0.0.1:6379> SADD myset1 "world" (integer) 1 redis 127.0.0.1:6379> SADD myset1 "bar" (integer) 1 redis 127.0.0.1:6379> SADD myset2 "hello" (integer) 1 redis 127.0.0.1:6379> SADD myset2 "bar" (integer) 1 redis 127.0.0.1:6379> SUNIONSTORE myset myset1 myset2 (integer) 1 redis 127.0.0.1:6379> SMEMBERS myset 1) "bar" 2) "world" 3) "hello" 4) "foo" ''' # 15.迭代集合中的元素 SSCAN key cursor [MATCH pattern] [COUNT count] ''' 返回值:数组列表。 redis 127.0.0.1:6379> SADD myset1 "hello" (integer) 1 redis 127.0.0.1:6379> SADD myset1 "hi" (integer) 1 redis 127.0.0.1:6379> SADD myset1 "bar" (integer) 1 redis 127.0.0.1:6379> sscan myset1 0 match h* 1) "0" 2) 1) "hello" 2) "h1" '''
zset(sorted set:有序集合)
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。
zadd 命令
添加元素到集合,元素在集合中存在则更新对应score
zadd key score member
实例
redis 127.0.0.1:6379> zadd runoob 0 redis (integer)1 redis 127.0.0.1:6379> zadd runoob 0 mongodb (integer)1 redis 127.0.0.1:6379> zadd runoob 0 rabitmq (integer)1 redis 127.0.0.1:6379> zadd runoob 0 rabitmq (integer)0 redis 127.0.0.1:6379>> ZRANGEBYSCORE runoob 010001)"mongodb"2)"rabitmq"3)"redis"
# 1.向有序集合添加一个或多个成员,或者更新已存在成员的分数 ZADD key score1 member1 [score2 member2] ''' 返回值:被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员。 redis> ZADD myzset 1 "one" (integer) 1 redis> ZADD myzset 1 "uno" (integer) 1 redis> ZADD myzset 2 "two" 3 "three" (integer) 2 redis> ZRANGE myzset 0 -1 WITHSCORES 1) "one" 2) "1" 3) "uno" 4) "1" 5) "two" 6) "2" 7) "three" 8) "3" ''' # 2.获取有序集合的成员数 ZCARD key ''' 返回值:当 key 存在且是有序集类型时,返回有序集的基数。 当 key 不存在时,返回 0 。 redis> ZADD myzset 1 "one" (integer) 1 redis> ZADD myzset 2 "two" (integer) 1 redis> ZCARD myzset (integer) 2 ''' # 3.计算在有序集合中指定区间分数的成员数 ZCOUNT key min max ''' 返回值:分数值在 min 和 max 之间的成员的数量。 redis 127.0.0.1:6379> ZADD myzset 1 "hello" (integer) 1 redis 127.0.0.1:6379> ZADD myzset 1 "foo" (integer) 1 redis 127.0.0.1:6379> ZADD myzset 2 "world" 3 "bar" (integer) 2 redis 127.0.0.1:6379> ZCOUNT myzset 1 3 (integer) 4 ''' # 4.有序集合中对指定成员的分数加上增量 increment ZINCRBY key increment member ''' 返回值:member 成员的新分数值,以字符串形式表示。 redis> ZADD myzset 1 "one" (integer) 1 redis> ZADD myzset 2 "two" (integer) 1 redis> ZINCRBY myzset 2 "one" "3" redis> ZRANGE myzset 0 -1 WITHSCORES 1) "two" 2) "2" 3) "one" 4) "3" ''' # 5.计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中 ZINTERSTORE destination numkeys key [key ...] ''' 返回值:保存到目标结果集的的成员数量。 # 有序集 mid_test redis 127.0.0.1:6379> ZADD mid_test 70 "Li Lei" (integer) 1 redis 127.0.0.1:6379> ZADD mid_test 70 "Han Meimei" (integer) 1 redis 127.0.0.1:6379> ZADD mid_test 99.5 "Tom" (integer) 1 # 另一个有序集 fin_test redis 127.0.0.1:6379> ZADD fin_test 88 "Li Lei" (integer) 1 redis 127.0.0.1:6379> ZADD fin_test 75 "Han Meimei" (integer) 1 redis 127.0.0.1:6379> ZADD fin_test 99.5 "Tom" (integer) 1 # 交集 redis 127.0.0.1:6379> ZINTERSTORE sum_point 2 mid_test fin_test (integer) 3 # 显示有序集内所有成员及其分数值 redis 127.0.0.1:6379> ZRANGE sum_point 0 -1 WITHSCORES 1) "Han Meimei" 2) "145" 3) "Li Lei" 4) "158" 5) "Tom" 6) "199" ''' # 6.在有序集合中计算指定字典区间内成员数量 ZLEXCOUNT key min max ''' 返回值:指定区间内的成员数量。 redis 127.0.0.1:6379> ZADD myzset 0 a 0 b 0 c 0 d 0 e (integer) 5 redis 127.0.0.1:6379> ZADD myzset 0 f 0 g (integer) 2 redis 127.0.0.1:6379> ZLEXCOUNT myzset - + (integer) 7 redis 127.0.0.1:6379> ZLEXCOUNT myzset [b [f (integer) 5 ''' # 7.通过索引区间返回有序集合成指定区间内的成员 ZRANGE key start stop [WITHSCORES] ''' 返回值:指定区间内,带有分数值(可选)的有序集成员的列表。 redis 127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES # 显示整个有序集成员 1) "jack" 2) "3500" 3) "tom" 4) "5000" 5) "boss" 6) "10086" redis 127.0.0.1:6379> ZRANGE salary 1 2 WITHSCORES # 显示有序集下标区间 1 至 2 的成员 1) "tom" 2) "5000" 3) "boss" 4) "10086" redis 127.0.0.1:6379> ZRANGE salary 0 200000 WITHSCORES # 测试 end 下标超出最大下标时的情况 1) "jack" 2) "3500" 3) "tom" 4) "5000" 5) "boss" 6) "10086" redis > ZRANGE salary 200000 3000000 WITHSCORES # 测试当给定区间不存在于有序集时的情况 (empty list or set) ''' # 8.通过字典区间返回有序集合的成员 ZRANGEBYLEX key min max [LIMIT offset count] ''' 返回值:指定区间内的元素列表。 redis 127.0.0.1:6379> ZADD myzset 0 a 0 b 0 c 0 d 0 e 0 f 0 g (integer) 7 redis 127.0.0.1:6379> ZRANGEBYLEX myzset - [c 1) "a" 2) "b" 3) "c" redis 127.0.0.1:6379> ZRANGEBYLEX myzset - (c 1) "a" 2) "b" redis 127.0.0.1:6379> ZRANGEBYLEX myzset [aaa (g 1) "b" 2) "c" 3) "d" 4) "e" 5) "f" ''' # 9.通过分数返回有序集合指定区间内的成员 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] ''' 返回值 指定区间内,带有分数值(可选)的有序集成员的列表。 实例 redis 127.0.0.1:6379> ZADD salary 2500 jack # 测试数据 (integer) 0 redis 127.0.0.1:6379> ZADD salary 5000 tom (integer) 0 redis 127.0.0.1:6379> ZADD salary 12000 peter (integer) 0 redis 127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf # 显示整个有序集 1) "jack" 2) "tom" 3) "peter" redis 127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf WITHSCORES # 显示整个有序集及成员的 score 值 1) "jack" 2) "2500" 3) "tom" 4) "5000" 5) "peter" 6) "12000" redis 127.0.0.1:6379> ZRANGEBYSCORE salary -inf 5000 WITHSCORES # 显示工资 <=5000 的所有成员 1) "jack" 2) "2500" 3) "tom" 4) "5000" redis 127.0.0.1:6379> ZRANGEBYSCORE salary (5000 400000 # 显示工资大于 5000 小于等于 400000 的成员 1) "peter" ''' # 10.返回有序集合中指定成员的索引 ZRANK key member ''' 返回值:如果成员是有序集 key 的成员,返回 member 的排名。 如果成员不是有序集 key 的成员,返回 nil 。 redis 127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES # 显示所有成员及其 score 值 1) "peter" 2) "3500" 3) "tom" 4) "4000" 5) "jack" 6) "5000" redis 127.0.0.1:6379> ZRANK salary tom # 显示 tom 的薪水排名,第二 (integer) 1 ''' # 11.移除有序集合中的一个或多个成员 ZREM key member [member ...] ''' 返回值:被成功移除的成员的数量,不包括被忽略的成员。 # 测试数据 redis 127.0.0.1:6379> ZRANGE page_rank 0 -1 WITHSCORES 1) "bing.com" 2) "8" 3) "baidu.com" 4) "9" 5) "google.com" 6) "10" # 移除单个元素 redis 127.0.0.1:6379> ZREM page_rank google.com (integer) 1 redis 127.0.0.1:6379> ZRANGE page_rank 0 -1 WITHSCORES 1) "bing.com" 2) "8" 3) "baidu.com" 4) "9" # 移除多个元素 redis 127.0.0.1:6379> ZREM page_rank baidu.com bing.com (integer) 2 redis 127.0.0.1:6379> ZRANGE page_rank 0 -1 WITHSCORES (empty list or set) # 移除不存在元素 redis 127.0.0.1:6379> ZREM page_rank non-exists-element (integer) 0 ''' # 12.移除有序集合中给定的字典区间的所有成员 ZREMRANGEBYLEX key min max ''' 返回值:被成功移除的成员的数量,不包括被忽略的成员。 redis 127.0.0.1:6379> ZADD myzset 0 aaaa 0 b 0 c 0 d 0 e (integer) 5 redis 127.0.0.1:6379> ZADD myzset 0 foo 0 zap 0 zip 0 ALPHA 0 alpha (integer) 5 redis 127.0.0.1:6379> ZRANGE myzset 0 -1 1) "ALPHA" 2) "aaaa" 3) "alpha" 4) "b" 5) "c" 6) "d" 7) "e" 8) "foo" 9) "zap" 10) "zip" redis 127.0.0.1:6379> ZREMRANGEBYLEX myzset [alpha [omega (integer) 6 redis 127.0.0.1:6379> ZRANGE myzset 0 -1 1) "ALPHA" 2) "aaaa" 3) "zap" 4) "zip" ''' # 13.移除有序集合中给定的排名区间的所有成员 ZREMRANGEBYRANK key start stop ''' 返回值:被移除成员的数量。 redis 127.0.0.1:6379> ZADD salary 2000 jack (integer) 1 redis 127.0.0.1:6379> ZADD salary 5000 tom (integer) 1 redis 127.0.0.1:6379> ZADD salary 3500 peter (integer) 1 redis 127.0.0.1:6379> ZREMRANGEBYRANK salary 0 1 # 移除下标 0 至 1 区间内的成员 (integer) 2 redis 127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES # 有序集只剩下一个成员 1) "tom" 2) "5000" ''' # 14移除有序集合中给定的分数区间的所有成员 ZREMRANGEBYSCORE key min max ''' 返回值:被移除成员的数量。 redis 127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES # 显示有序集内所有成员及其 score 值 1) "tom" 2) "2000" 3) "peter" 4) "3500" 5) "jack" 6) "5000" redis 127.0.0.1:6379> ZREMRANGEBYSCORE salary 1500 3500 # 移除所有薪水在 1500 到 3500 内的员工 (integer) 2 redis> ZRANGE salary 0 -1 WITHSCORES # 剩下的有序集成员 1) "jack" 2) "5000" ''' # 15. 返回有序集中指定区间内的成员,通过索引,分数从高到底 ZREVRANGE key start stop [WITHSCORES] ''' 返回值:指定区间内,带有分数值(可选)的有序集成员的列表。 redis 127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES # 递增排列 1) "peter" 2) "3500" 3) "tom" 4) "4000" 5) "jack" 6) "5000" redis 127.0.0.1:6379> ZREVRANGE salary 0 -1 WITHSCORES # 递减排列 1) "jack" 2) "5000" 3) "tom" 4) "4000" 5) "peter" 6) "3500" ''' # 16.返回有序集中指定分数区间内的成员,分数从高到低排序 ZREVRANGEBYSCORE key max min [WITHSCORES] ''' 返回值:指定区间内,带有分数值(可选)的有序集成员的列表。 redis 127.0.0.1:6379> ZADD salary 10086 jack (integer) 1 redis > ZADD salary 5000 tom (integer) 1 redis 127.0.0.1:6379> ZADD salary 7500 peter (integer) 1 redis 127.0.0.1:6379> ZADD salary 3500 joe (integer) 1 redis 127.0.0.1:6379> ZREVRANGEBYSCORE salary +inf -inf # 逆序排列所有成员 1) "jack" 2) "peter" 3) "tom" 4) "joe" redis 127.0.0.1:6379> ZREVRANGEBYSCORE salary 10000 2000 # 逆序排列薪水介于 10000 和 2000 之间的成员 1) "peter" 2) "tom" 3) "joe" ''' # 17.返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序 ZREVRANK key member ''' 返回值:如果成员是有序集 key 的成员,返回成员的排名。 如果成员不是有序集 key 的成员,返回 nil 。 redis 127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES # 测试数据 1) "jack" 2) "2000" 3) "peter" 4) "3500" 5) "tom" 6) "5000" redis 127.0.0.1:6379> ZREVRANK salary peter # peter 的工资排第二 (integer) 1 redis 127.0.0.1:6379> ZREVRANK salary tom # tom 的工资最高 (integer) 0 ''' # 18.返回有序集中,成员的分数值 ZSCORE key member ''' 返回值:成员的分数值,以字符串形式表示。 redis 127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES # 测试数据 1) "tom" 2) "2000" 3) "peter" 4) "3500" 5) "jack" 6) "5000" redis 127.0.0.1:6379> ZSCORE salary peter # 注意返回值是字符串 "3500" ''' # 19.计算给定的一个或多个有序集的并集,并存储在新的 key 中 ZUNIONSTORE destination numkeys key [key ...] ''' 返回值:保存到 destination 的结果集的成员数量。 redis 127.0.0.1:6379> ZRANGE programmer 0 -1 WITHSCORES 1) "peter" 2) "2000" 3) "jack" 4) "3500" 5) "tom" 6) "5000" redis 127.0.0.1:6379> ZRANGE manager 0 -1 WITHSCORES 1) "herry" 2) "2000" 3) "mary" 4) "3500" 5) "bob" 6) "4000" redis 127.0.0.1:6379> ZUNIONSTORE salary 2 programmer manager WEIGHTS 1 3 # 公司决定加薪。。。除了程序员。。。 (integer) 6 redis 127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES 1) "peter" 2) "2000" 3) "jack" 4) "3500" 5) "tom" 6) "5000" 7) "herry" 8) "6000" 9) "mary" 10) "10500" 11) "bob" 12) "12000" ''' # 20.迭代有序集合中的元素(包括元素成员和元素分值) ZSCAN key cursor [MATCH pattern] [COUNT count] ''' 返回值: 返回的每个元素都是一个有序集合元素,一个有序集合元素由一个成员(member)和一个分值(score)组成。 '''
其他
获取所有 key
keys *