在《Redis初探(1)——Redis的安装》中,我们说过,Redis支持以下五种数据类型,本章进行详解:
- String类型
- List类型
- Set类型
- SortedSet类型
- Hash类型
存储极限 | 大小 |
---|
String类型的value大小 | 512M |
Hash类型key的键值对个数 | 4294967295 |
List类型key个数 | 4294967295 |
Set/SortedSet类型key个数 | 4294967295 |
一、String(字符串)类型
在前面两章中,我们存储的都是String类型。该类型增加和删除一个键值对十分简单,如下:
含义 | 方法 |
---|
获取值 | get key |
添加一个键值对 | set key value |
获取并重置一个键值对 | getset key value |
删除一个键值对 | del key |
前面两个我们之前都使用过了,getset key value
有点陌生,它是先获取key的value,然后将该key修改为输入的value,相当于将get key
和 set key value
这两步合为了一步,看看下面这个例子你就明白了:
127.0.0.1:6379> getset age 10
"20"
127.0.0.1:6379> get age
"10"
删除一个键值对也很简单,如下:
127.0.0.1:6379> del age
(integer) 1
127.0.0.1:6379> get age
(nil)
字符串也可以进行数值操作(Redis内部自动将value转换为数值型),方法如下:
含义 | 方法 |
---|
值加一 | incr key |
值减一 | decr key |
值加n | incrby key n |
值减n | decrby key n |
注意: 如果key值不存在,当作0处理;如果value值无法转换为整型时,会返回错误信息:


介绍一下字符串拼接方法,如下:

二、Hash(散列)类型
散列,即Hash,Redis中的Hash类型可以看成Map集合。Hash类型的每一个key的value对应于一个Map,该Map包含多个键值对的数据,如下图所示:

2.1 赋值
含义 | 方法 |
---|
为指定key设置一个键值对 | hset key field value |
为指定key设置多个键值对 | hmset key field value[field2 value2…] |
127.0.0.1:6379> hset myHash name jitwxs
(integer) 1
127.0.0.1:6379> hmset myHash age 20 sex male
(integer) 2
127.0.0.1:6379>
2.2 取值
含义 | 方法 |
---|
返回指定key中field的值 | hget key field |
返回指定key中多个field的值 | hmget key filed[field2…] |
返回指定key中所有field-value | hgetall key |
127.0.0.1:6379> hget myHash name
"jitwxs"
127.0.0.1:6379> hmget myHash age sex
1) "20"
2) "male"
127.0.0.1:6379> hgetall myHash
1) "name"
2) "jitwxs"
3) "age"
4) "20"
5) "sex"
6) "male"
2.3 删除
含义 | 方法 |
---|
删除指定key一个或多个field | hdel key field[field2…] |
清空Hash | del key |
127.0.0.1:6379> hdel myHash name
(integer) 1
127.0.0.1:6379> hdel myHash age sex
(integer) 2
127.0.0.1:6379> hmset myHash name jitwxs age 20 sex male
OK
127.0.0.1:6379> del myHash
(integer) 1
127.0.0.1:6379> hgetall myHash
(empty list or set)
2.4 扩展命令
含义 | 方法 |
---|
判断指定key中field是否存在 | hexists key field |
返回指定key中field的数量 | hlen key |
获取指定key中所有的field | hkeys key |
获取指定key中所有的value | hvals key |
127.0.0.1:6379> hmset myHash name jitwxs age 20 sex male
OK
127.0.0.1:6379> hexists myHash name
(integer) 1
127.0.0.1:6379> hexists myHash unknown
(integer) 0
127.0.0.1:6379> hlen myHash
(integer) 3
127.0.0.1:6379> hkeys myHash
1) "name"
2) "age"
3) "sex"
127.0.0.1:6379> hvals myHash
1) "jitwxs"
2) "20"
3) "male"
三、List类型
Redis 的 List 类型有点像 Java 中的 LinkList,内部实现是一个双向链表
,双向链表的知识点参考文章:数据结构 第二章 线性表。
3.1 添加
含义 | 方法 |
---|
从左端添加多个value | lpush key value[value2…] |
从右端添加多个value | rpush key value[value2…] |
注: 如果key不存在会先创建key,然后添加。
127.0.0.1:6379> lpush myList a b c
(integer) 3
127.0.0.1:6379> lrange myList 0 -1
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> rpush myList2 1 2 3
(integer) 3
127.0.0.1:6379> lrange myList2 0 -1
1) "1"
2) "2"
3) "3"
3.2 查看
含义 | 方法 |
---|
获取list从start到end的值 | lrange key start end |
获取list中元素数量 | llen key |
因为 List 内部是一个双向链表,因此链表首元素下标为0,尾元素下标为-1,因此查看所有元素即:lrange key 0 -1
。
3.3 删除
含义 | 方法 |
---|
返回并弹出左端元素 | lpop key |
返回并弹出右端元素 | rpop key |
注: 如果key不存在,返回nil。
127.0.0.1:6379> lpush myList a b c
(integer) 3
127.0.0.1:6379> lrange myList 0 -1
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> lpop myList
"c"
127.0.0.1:6379> rpop myList
"a"
3.4 扩展命令
3.4.1 添加前检查key的存在性
含义 | 方法 |
---|
从左端添加多个value | lpushx key value[value2…] |
从右端添加多个value | rpushx key value[value2…] |
这两个方法加了x
的和之前不加x
的不同之处是:如果key不存在,将不进行插入。
127.0.0.1:6379> del myList
(integer) 1
127.0.0.1:6379> lpushx myList a b c
(integer) 0
127.0.0.1:6379> lrange myList 0 -1
(empty list or set)
3.4.2 根据value删除
含义 | 方法 |
---|
删除count个值为value的元素。 | lrem key count value |
若count>0,则从左到右删除:
127.0.0.1:6379> rpush myList 1 2 1 3 5 1
(integer) 6
127.0.0.1:6379> lrange myList 0 -1
1) "1"
2) "2"
3) "1"
4) "3"
5) "5"
6) "1"
127.0.0.1:6379> lrem myList 2 1
(integer) 2
127.0.0.1:6379> lrange myList 0 -1
1) "2"
2) "3"
3) "5"
4) "1"
若count<0,则从右向左删除:
127.0.0.1:6379> rpush myList 1 2 1 3 5 1
(integer) 6
127.0.0.1:6379> lrange myList 0 -1
1) "1"
2) "2"
3) "1"
4) "3"
5) "5"
6) "1"
127.0.0.1:6379> lrem myList -2 1
(integer) 2
127.0.0.1:6379> lrange myList 0 -1
1) "1"
2) "2"
3) "3"
4) "5"
若count=0,删除所有:
127.0.0.1:6379> rpush myList 1 2 1 3 5 1
(integer) 6
127.0.0.1:6379> lrange myList 0 -1
1) "1"
2) "2"
3) "1"
4) "3"
5) "5"
6) "1"
127.0.0.1:6379> lrem myList 0 1
(integer) 3
127.0.0.1:6379> lrange myList 0 -1
1) "2"
2) "3"
3) "5"
3.4.3 根据下标设置value
含义 | 方法 |
---|
设置下标为index的元素值。0代表最左边元素,-1代表最右边元素,下标不存在时抛出异常。 | lset key index value |
127.0.0.1:6379> rpush myList 1 2 3
(integer) 3
127.0.0.1:6379> lset myList 1 5
OK
127.0.0.1:6379> lrange myList 0 -1
1) "1"
2) "5"
3) "3"
127.0.0.1:6379> lset myList 3 5
(error) ERR index out of range
3.4.4 相对于某元素插入value
含义 | 方法 |
---|
在pivot元素前插入value | linsert key before pivot value |
在pivot元素后插入value | linsert key after pivot value |
注:如果pivot不存在,不插入。
127.0.0.1:6379> rpush myList 1 2 3
(integer) 3
127.0.0.1:6379> linsert myList before 2 a
(integer) 4
127.0.0.1:6379> linsert myList after 2 b
(integer) 5
127.0.0.1:6379> lrange myList 0 -1
1) "1"
2) "a"
3) "2"
4) "b"
5) "3"
3.4.5 将链表A右边元素移出并添加到链表B左边
含义 | 方法 |
---|
将链表A右边元素移出并添加到链表B左边 | rpoplpush listA listB |
127.0.0.1:6379> rpush myListA 1 2 3
(integer) 3
127.0.0.1:6379> rpush myListB a b c
(integer) 3
127.0.0.1:6379> rpoplpush myListA myListB
"3"
127.0.0.1:6379> lrange myListA 0 -1
1) "1"
2) "2"
127.0.0.1:6379> lrange myListB 0 -1
1) "3"
2) "a"
3) "b"
4) "c"
127.0.0.1:6379> rpoplpush myListA myListA
"2"
127.0.0.1:6379> lrange myListA 0 -1
1) "2"
2) "1"
四、Set类型
Redis的Set类型和Java中的Set类型一样,它具有两个重要的特点:无序性
和唯一性
,具体不再赘述。
4.1 基本操作
含义 | 方法 |
---|
向set中添加成员,如果成员已存在,不再添加 | sadd key member[member2…] |
向set中删除成员 | srem key member[member2…] |
获取set中所有成员 | smembers key |
判断指定成员是否存在于set中 | sismember key member |
127.0.0.1:6379> sadd mySet 1 2 3
(integer) 3
127.0.0.1:6379> smembers mySet
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> srem mySet 2 3 5
(integer) 2
127.0.0.1:6379> smembers mySet
1) "1"
127.0.0.1:6379> sismember mySet 1
(integer) 1
127.0.0.1:6379> sismember mySet 2
(integer) 0
4.2 集合操作
含义 | 方法 |
---|
集合的差集 | sdiff key1 key2[key3…] |
集合的交集 | sinter key1 key2[key3…] |
集合的并集 | sunion key1 key2[key3…] |
127.0.0.1:6379> sadd mySet1 a b c 1
(integer) 4
127.0.0.1:6379> sadd mySet2 1 2 3 b
(integer) 4
127.0.0.1:6379> sdiff mySet1 mySet2
1) "a"
2) "c"
127.0.0.1:6379> sdiff mySet2 mySet1
1) "2"
2) "3"
127.0.0.1:6379> sinter mySet1 mySet2
1) "1"
2) "b"
127.0.0.1:6379> sunion mySet1 mySet2
1) "c"
2) "1"
3) "b"
4) "2"
5) "a"
6) "3"
4.3 扩展命令
含义 | 方法 |
---|
求set中成员数量 | scard key |
随即返回一个成员 | srandmember key |
将多个集合的差集存储在desc中 | sdiffstore desc key1 key2[key3…] |
将多个集合的交集存储在desc中 | sinterstore desc key1 key2[key3…] |
将多个集合的并集存储在desc中 | sunionstore desc key1 key2[key3…] |
127.0.0.1:6379> smembers mySet1
1) "a"
2) "c"
3) "1"
4) "b"
127.0.0.1:6379> smembers mySet2
1) "3"
2) "b"
3) "2"
4) "1"
127.0.0.1:6379> scard mySet1
(integer) 4
127.0.0.1:6379> srandmember mySet1
"c"
127.0.0.1:6379> sdiffstore mySet3 mySet1 mySet2
(integer) 2
127.0.0.1:6379> smembers mySet3
1) "a"
2) "c"
五、SortedSet类型
SortedSet和Set的区别是,SortedSet中每一个成员都有一个score(分数)
与之关联,Redis通过score来为集合中的元素进行排序(默认为升序)。
5.1 添加/获取元素
含义 | 方法 |
---|
添加成员。如果成员存在,会用新的score替代原有的score,返回值是新加入到集合中的成员个数 | zadd key score member[score2 member2… ] |
获取指定成员的score | zscore key member |
获取key中成员个数 | scard key |
获取集合中下标从start到end的成员,[withscores]表明返回的成员包含其score | zrange key start end[withscores] |
上面方法的反转 | zrevrange key start end[withscores] |
127.0.0.1:6379> zadd mySort 82 wangnima 100 cat 33 dog 43 jitwxs 80 zhouyang 60 liuchang
(integer) 6
127.0.0.1:6379> zscore mySort jitwxs
"100"
127.0.0.1:6379> zcard mySort
(integer) 6
127.0.0.1:6379> zrange mySort 0 -1
1) "dog"
2) "liuchang"
3) "zhouyang"
4) "wangnima"
5) "cat"
6) "jitwxs"
127.0.0.1:6379> zrange mySort 0 -1 withscores
1) "dog"
2) "33"
3) "liuchang"
4) "60"
5) "zhouyang"
6) "80"
7) "wangnima"
8) "82"
9) "cat"
10) "100"
11) "jitwxs"
12) "100"
127.0.0.1:6379> zrevrange mySort 0 -1 withscores
1) "jitwxs"
2) "100"
3) "cat"
4) "100"
5) "wangnima"
6) "82"
7) "zhouyang"
8) "80"
9) "liuchang"
10) "60"
11) "dog"
12) "33"
5.2 删除元素
含义 | 方法 |
---|
删除成员 | zrem key member[member2…] |
按照下标范围删除成员 | zremrangebyrank key start stop |
按照score范围删除成员 | zremrangebyscore key min max |
127.0.0.1:6379> zrem mySort wangnima
(integer) 1
127.0.0.1:6379> zcard mySort
(integer) 5
127.0.0.1:6379> zrange mySort 0 -1
1) "dog"
2) "liuchang"
3) "zhouyang"
4) "cat"
5) "jitwxs"
127.0.0.1:6379> zremrangebyrank mySort 0 2
(integer) 3
127.0.0.1:6379> zrange mySort 0 -1
1) "cat"
2) "jitwxs"
127.0.0.1:6379> zrange mySort 0 -1 withscores
1) "dog"
2) "33"
3) "jitwxs"
4) "43"
5) "liuchang"
6) "60"
7) "zhouyang"
8) "80"
9) "wangnima"
10) "82"
11) "cat"
12) "100"
127.0.0.1:6379> zremrangebyscore mySort 50 85
(integer) 3
127.0.0.1:6379> zrange mySort 0 -1 withscores
1) "dog"
2) "33"
3) "jitwxs"
4) "43"
5) "cat"
6) "100"
5.3 扩展方法
含义 | 方法 |
---|
返回score在[min,max]的成员并按照score排序。[withscores]:显示score;[limit offset count]:从offst开始返回count个成员 | zrangebyscore key min max[withscores][limit offset count] |
设置指定成员增加的分数,返回值是修改后的分数 | zincrby key increment member |
获取分树在[min,max]的成员数量 | zcount key min max |
返回成员在集合中的排名(升序) | zrank key member |
返回成员在集合中的排名(降序) | zrevrank key member |
127.0.0.1:6379> zrange mySort 0 -1 withscores
1) "dog"
2) "33"
3) "jitwxs"
4) "43"
5) "liuchang"
6) "60"
7) "zhouyang"
8) "80"
9) "wangnima"
10) "82"
11) "cat"
12) "100"
127.0.0.1:6379> zrangebyscore mySort 30 86 limit 2 3
1) "liuchang"
2) "zhouyang"
3) "wangnima"
127.0.0.1:6379> zcount mySort 0 60
(integer) 3
127.0.0.1:6379> zincrby mySort 17 jitwxs
"60"
127.0.0.1:6379> zrank mySort jitwxs
(integer) 1
127.0.0.1:6379> zrevrank mySort jitwxs
(integer) 4
六、key的通用命令
含义 | 方法 |
---|
获取所有于pattern匹配的key。*:任意一个或多个字符,?:任意一个字符 | keys pattern |
删除指定key | del key[key2…] |
判断key是否存在 | exists key |
为key重命名 | rename key newKey |
设置过期时间(单位s) | expire key |
获取key剩余的过期时间(单位s)。若没有设置过期时间,返回-1;超时不存在返回-2 | ttl key |
获取key类型,key不存在返回none | type key |
注:如果你设置了一个key的过期时间,如果又不想让它过期,可以执行命令persist key
127.0.0.1:6379> keys *
1) "unknown"
2) "mySet2"
3) "float_num"
4) "myListB"
5) "mySet3"
6) "userName"
7) "myListA"
8) "int_num"
9) "mySort"
10) "mySet1"
127.0.0.1:6379> del unknown
(integer) 1
127.0.0.1:6379> type myListA
list
127.0.0.1:6379> rename myListA myList
OK
127.0.0.1:6379> exists myListA
(integer) 0
127.0.0.1:6379> ttl mySort
(integer) -1
127.0.0.1:6379> expire mySort 30
(integer) 1
127.0.0.1:6379> ttl mySort
(integer) -2
127.0.0.1:6379> keys *
1) "mySet2"
2) "myList"
3) "float_num"
4) "myListB"
5) "mySet3"
6) "userName"
7) "int_num"
8) "mySet1"