吃透Redis系列:琳琅满目的数据类型(上篇)

欢迎关注微信公众号:互联网全栈架构

Redis提供了丰富的数据类型,包括了五种基本数据类型和五种扩展数据类型(非官方分类,仅个人总结,方便记忆):

ad1a26cc8f8fff9a2a299cb0e4ed5b49.png

本文介绍5种基本数据类型,在列出常用的命令之外,还附以实例操作和适用场景说明,方便大家参考阅读。后续文章会介绍另外5种扩展数据类型,敬请期待。

1

String

String是最基本的也是最常用的数据类型,它是一个key-value键值对的结构,key是键,字符串类型,而value是对应的值,可以是字符串,也可以是二进制数据,包括序列化对象、图片等。

字符串类型的应用非常广泛,包括缓存、计数器、分布式锁、Session共享等场景。

下面我们来看看String的一些常用操作:

#设置键值对,如果key不存在,则新增

SET key value

#设置key的过期时间

SET key value EX [过期时间]

SETEX key [过期时间] value

#获取key对应的value

GET key

#判断key是否存在

EXISTS key

#删除key

DEL key

#获取key对应的过期时间

TTL key

#将key中存储的数字加1

INCR key

#将key中存储的数字减1

DECR key

记得很早以前去面试,面试官问了一个关于redis key过期的小问题:如果设置了一个key的过期时间,过一段时间再重新设置这个key的值,那么它的过期时间会变吗?我们来试验一下:

127.0.0.1:6379> SET hello world EX 30
OK
127.0.0.1:6379> TTL hello
(integer) 15
127.0.0.1:6379> SET hello ok
OK
127.0.0.1:6379> TTL hello
(integer) -1

可以看出,如果重新设置key的值(不指定过期时间),那么这个key的过期时间就变成了永不过期。

2

List

List字符串列表,按照插入的顺序进行排序,可以从头部或者尾部向List添加元素。List主要用于消息队列,或者一些需要实现队列或者栈结构的场景。

List的一些常用操作如下:

#在列表最左边(头部)添加一些新元素

LPUSH key element [element ...]

#在列表最右边(尾部)添加一些新元素

RPUSH key element [element ...]

#从头部移除一个或者多个元素

LPOP key [count]

#从尾部移除一个或者多个元素

RPOP key [count]

#返回列表的长度

LLEN key

#获取指定范围的值

LRANGE key start stop

#在某个值的前/后插入新值

LINSERT key <BEFORE | AFTER> pivot element

#删除指定数量的某个元素

LREM key count element

演示一下常用的一些操作,先在列表中插入一些元素,然后再删除,最后确认删除成功:

127.0.0.1:6379> LPUSH mylist "order:0001" "order:0002" "order:0003"
(integer) 3
127.0.0.1:6379> LRANGE mylist 0 3
1) "order:0003"
2) "order:0002"
3) "order:0001"
127.0.0.1:6379> LREM mylist 1 "order:0003"
(integer) 1
127.0.0.1:6379> LRANGE mylist 0 3
1) "order:0002"
2) "order:0001"
127.0.0.1:6379>

3

Hash

Hash用于存储键值对,类似于Java中的HashMap,它非常适用于将一些相关的数据存储在一起,比如一个学生,他有姓名、年龄、身高等信息,类似这样的场景,可以把数据存储在redis的Hash中。

Hash的一些常用操作如下:

#设置一个或者多个字段的值

HSET key field value [field value ...]

#返回对应字段的值

HGET key field

#返回多个字段对应的值

HMGET key field [field ...]

#返回所有的字段和值

HGETALL key

#判断一个字段是否存在

HEXISTS key field

#删除一个或者多字段及其对应的值

HDEL key field [field ...]

#返回Hash中所有的key

HKEYS key

#返回Hash中所有的value

HVALS key

看一下简单的实例,对一个用户的基本信息进行操作:

127.0.0.1:6379> HSET user-info "name" "Tom" "age" "32" "height" "178"
(integer) 3
127.0.0.1:6379> HGET user-info height
"178"
127.0.0.1:6379> HMGET user-info name age
1) "Tom"
2) "32"
127.0.0.1:6379> HGETALL user-info
1) "name"
2) "Tom"
3) "age"
4) "32"
5) "height"
6) "178"
127.0.0.1:6379> HDEL user-info height
(integer) 1
127.0.0.1:6379> HEXISTS user-info height
(integer) 0
127.0.0.1:6379> HKEYS user-info
1) "name"
2) "age"
127.0.0.1:6379> HVALS user-info
1) "Tom"
2) "32"

4

Set

Set提供了与List类似的列表功能,但它可以自动去重,也就是说元素具有唯一性,另外,Set还提供了很多集合操作的功能,像多个集合之间的并集、交集和差集等运算。

Set很适合以下一些场景:比如交友软件中,找到两位用户的共同好友;电商平台中,用户浏览过的商品(需要去重)等。

Set的常见命令:

#添加一个或者多个元素到集合中

SADD key member [member ...]

#取出所有的元素

SMEMBERS key

#判断集合中是否存在某个值

SISMEMBER key member

#返回集合中元素的个数

SCARD key

#返回多个集合的交集

SINTER key [key ...]

#返回多个集合的并集

SUNION key [key ...]

#返回多个集合的差集

SDIFF key [key ...]

示例:

127.0.0.1:6379> SADD key1 "a" "b" "c" "d"
(integer) 4
127.0.0.1:6379> SMEMBERS key1
1) "c"
2) "d"
3) "b"
4) "a"
127.0.0.1:6379> SCARD key1
(integer) 4
127.0.0.1:6379> SMEMBERS key1
1) "c"
2) "d"
3) "b"
4) "a"
127.0.0.1:6379> SADD key2 "c" "d"
(integer) 2
127.0.0.1:6379> SINTER key1 key2
1) "c"
2) "d"

5

Sorted Set

Sorted Set为有序集合,元素类型为String,元素具有唯一性,每个元素都会关联一个分数,这个分数被用来按照从低到高的方式排序。集合中的成员是唯一的,但分数可以重复,此时就按照字符串的字典顺序排列。

它的应用也很广泛,比如在线游戏中的排行榜,按照分数进行排序就很方便;也可以使用它来进行限流,防止对于API的过度请求。

Sorted Set的常见命令:

#添加一个或者多个元素

ZADD key score member [score member...]

#返回指定索引范围的元素(升序),降序为ZREVRANGE

ZRANGE key start stop

#返回指定score范围的元素(升序),降序为ZREVRANGEBYSCORE

ZRANGEBYSCORE key min max

#为指定元素加上指定的数量

ZINCRBY key increment member

#删除有序集合中的一个或者多个元素

ZREM key member [member ...]

#返回指定score范围的元素个数

ZCOUNT key min max

#返回某个元素在集合中的排名(升序),降序是ZREVRANK

ZRANK key member

#返回某个元素的分数

ZSCORE key member

有序集合常用操作的演示:

127.0.0.1:6379> ZADD mygame 10 "John" 12 "Tom" 8 "Tony" 7 "Hank"
(integer) 4
127.0.0.1:6379> ZRANGE mygame 0 -1
1) "Hank"
2) "Tony"
3) "John"
4) "Tom"
127.0.0.1:6379> ZRANGEBYSCORE mygame 10 15
1) "John"
2) "Tom"
127.0.0.1:6379> ZINCRBY mygame 8 "Hank"
"15"
127.0.0.1:6379> ZSCORE mygame "Hank"
"15"
127.0.0.1:6379> ZRANK mygame "John"
(integer) 1

6

总结

Redis提供了5种基本数据类型,功能非常强大,涵盖面也比较广,可以适用于很多的实际场景,而Memcached仅提供了简单的key-value,相比之下,Redis就强大得多。另外,Redis还提供了其他扩展的5种数据类型,我们会在后续的文章中进行介绍,敬请关注。谢谢!

推荐阅读:

离大谱,MySQL竟然无视空格的存在!

吃透Redis系列:总体介绍

高频面试题:合并两个List并去重

彻底搞懂MySQL的执行计划

数据同步的利器:Canal

拒绝空谈:实例演示MySQL事务隔离级别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值