Redis初探(3)——Redis的数据类型

本文详细介绍了Redis中的五种数据类型:String、List、Set、SortedSet和Hash,并提供了每种类型的常见操作方法及实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

《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 keyset 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
值加nincrby key n
值减ndecrby key n

注意: 如果key值不存在,当作0处理;如果value值无法转换为整型时,会返回错误信息:

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

含义方法
拼接append key

二、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-valuehgetall 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一个或多个fieldhdel key field[field2…]
清空Hashdel 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中所有的fieldhkeys key
获取指定key中所有的valuehvals 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 添加

含义方法
从左端添加多个valuelpush key value[value2…]
从右端添加多个valuerpush 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的存在性
含义方法
从左端添加多个valuelpushx key value[value2…]
从右端添加多个valuerpushx 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元素前插入valuelinsert key before pivot value
在pivot元素后插入valuelinsert 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… ]
获取指定成员的scorezscore key member
获取key中成员个数scard key
获取集合中下标从start到end的成员,[withscores]表明返回的成员包含其scorezrange 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
删除指定keydel key[key2…]
判断key是否存在exists key
为key重命名rename key newKey
设置过期时间(单位s)expire key
获取key剩余的过期时间(单位s)。若没有设置过期时间,返回-1;超时不存在返回-2ttl key
获取key类型,key不存在返回nonetype 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"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值