前言

在当今的软件开发中,数据存储与操作是至关重要的一部分。为了满足日益增长的数据需求和对性能的追求,出现了许多不同类型的数据库。其中,Redis 作为一种基于内存且高性能的键值存储数据库,因其快速的读取速度、丰富的数据结构和灵活的应用场景而备受推崇。

本文将深入探讨 Redis 数据库中常用的数据类型(如字符串、哈希、列表、集合、有序集合)及其对应的常用 API。我们将详细介绍每种数据类型的特点、使用场景以及相应的 API 操作,旨在帮助读者更好地理解并灵活运用 Redis 数据库,从而提升数据存储与处理的效率和性能。

一、Redis 中常用的五种数据类型

  1. 字符串(String):字符串是 Redis 最基本的数据类型,它可以存储任意类型的数据,例如文本、数字或序列化的对象等。Redis 提供了丰富的 API 操作,如设置/获取值、追加、获取子串等。

  2. 哈希(Hash):哈希类型是一种键值对的集合,类似于关联数组或字典。每个哈希可以存储多个字段和与之相关联的值,常用于存储对象的属性。Redis 提供了对哈希的各种操作,如设置/获取字段值、获取所有字段、删除字段等。

  3. 列表(List):列表是一系列按照插入顺序排列的元素集合,可以在列表的两端进行快速的插入和删除操作。它常被用作队列、栈或消息发布与订阅等场景。Redis 提供了对列表的操作,如在头部/尾部插入元素、获取范围内的元素、删除指定元素等。

  4. 集合(Set):集合是一组无序且唯一的元素集合,不允许重复的成员存在。集合常用于存储一些独立的元素,如用户标签、好友列表等。Redis 提供了对集合的操作,如添加/移除元素、求交集/并集、判断元素是否存在等。

  5. 有序集合(Sorted Set):有序集合是一种类似于集合的数据结构,每个元素都关联着一个分数(score),通过分数对元素进行排序。有序集合常用于需要排序的场景,如排行榜、计分系统等。Redis 提供了对有序集合的操作,如添加/移除元素、根据分数范围获取元素、获取元素的排名等。

这五种数据类型提供了丰富的功能和灵活的应用场景,使得 Redis 成为一种强大的数据存储工具。在具体的应用中,可以根据需求选择合适的数据类型,从而高效地存储和操作数据。

我们来一个一个的试一下吧。

二、String (字符串 )

String 是 redis 最基本的类型,一个 key 对应一个 value。它是二进制安全的,可以包含任何数据,如jpg图片或者序列化的对象。

1、set:赋值操作。
*语法:set key value*

在可视化工具里面查看:

2、get 取值操作
语法:get key

3、getset 取值后重新赋值
*语法:getset key value*
4、mset 同时设置多个键值
*语法:mset key value [key value ...]*
5、mget 同时获取多个键值
*语法:mget key [key ...]*

6、del 删除一个或多个键值
*语法:del key [key ...]*
7、incr当存储的字符串是整数时,让当前键值递增,并返回递增或增加后的值。
*语法:incr key* 

8、incrby当存储的字符串是整数时,让当前键值增加指定的数值,并返回递增或增加后的值。
语法:incrby key increment*

刚刚我们递增后的值是2,所以递增2后,值为:4。

9、decr让当前键值递减,并返回递减或减少后的值。
*语法:decr key*

10、decrby让当前键值减少指定的数值,并返回递减或减少后的值。
*语法:decrby key decrement*

11、append向键值的末尾追加value。如果键不存在则将该键的值设置为value,即相当于 SETkey value。返回值是追加后字符串的总长度。
*语法:append key value*

12、获取字符串长度(STRLEN)

STRLEN命令返回键值的长度,如果键不存在则返回0。

三、hash(哈希)

hash是一个string类型的field和value的映射表,而field只能是String类型,hash特别适合用于存储对象。

1、hsetHSET一次只能设置一个字段值。HSET命令不区分插入和更新操作,当执行插入操作时HSET命令返回1,当执行更新操作时返回0。
*语法:HSET key field value*

在 ARDM 里面查看:

2、hsetnx当字段不存在时赋值,类似HSET。区别在于如果字段存在,该命令不执行任何操作。

例如:hsetnx user name qiu

说明:如果user中不存在name字段则设置name的值为qiu,否则不做任何操作。

*语法:HSETNX key field value*

3、hgetHGET一次只能获取一个字段值。
语法:HGET key field

4、hgetall获取所有字段值。
语法:HGETALL key

5、hdel可以删除一个或多个字段,返回值是被删除的字段个数。
语法:HDEL key field [field...]

6、hincrby为某个字段增加数值。
语法:HINCRBY key field increment

7、hexists判断字段是否存在,存在则返回1,否则返回0。
语法:HEXISTS key field

8、hkeys获取所有的字段名。
语法:HKEYS key

9、hvals获取所有字段的值。
*语法:HVALS key*

10、hlen获取字段数量。
语法:HLEN key

四、list(列表)

Redis的list是采用来链表来存储的,所以对于Redis的list数据类型的操作,是操作list的两端数据来操作的。

1、lpush向列表左边添加元素。
*语法:LPUSH key value [value ...]*

2、rpush向列表右边添加元素。
*语法:RPUSH key value [value ...]*

3、lrangeLRANGE命令是列表类型最常用的命令之一,用于获取列表中的某一片段,将返回start到stop之间的所有元素(包含两端的元素),索引从0开始。索引可以是负数,如:-1代表最后边的一个元素。
*语法:LRANGE key start stop*

4、lpopLPOP命令从列表左边弹出一个元素,会分两步完成:第一步是将列表左边的元素从列表中移除。第二步是返回被移除的元素值。
*语法:LPOP key*

5、rpopRPOP命令从列表右边弹出一个元素,步骤与LPOP类似,第一步是将列表右边的元素从列表中移除。第二步是返回被移除的元素值。
*语法:RPOP key*
6、llen获取列表中元素的个数
*语法:LLEN key*

7、lrem
语法:LREM key count value

LREM命令会删除列表中前count个值为value的元素,返回实际删除的元素个数。根据count值的不同,该命令的执行方式会有所不同:

当count>0时, LREM会从列表左边开始删除。

当count<0时, LREM会从列表右边开始删除。

当count=0时,LREM删除所有值为value的元素。

8、lindex获得指定索引的元素值。
语法:LINDEX key index

9、lset设置指定索引的元素值。
语法:LSET key index value

10、ltrim只保留列表的指定片段
语法:LTRIM key start stop

11、linsert
语法:LINSERT key BEFORE|AFTER pivot value

LINSERT首先会在列表中从左到右查找值为pivot的元素,然后根据第二个参数是BEFORE还是AFTER来决定将value插入到该元素的前面还是后面。

12、rpoplpush将一个列表的最后一个元素转移到另一个列表的最前面
语法:RPOPLPUSH source destination

五、set(集合)

Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

1、sadd增加一个或多个元素。
*语法:SADD key member [member ...]*

2、srem移除一个或多个元素。
语法:SREM key member [member ...]

3、smembers获得集合中的所有元素。
语法:SMEMBERS key

4、sismember判断元素是否存在集合中。存在返回1,否则返回0。
语法:SISMEMBER key member

5、sdiff查找属于集合A并且不属于集合B的元素。(差集运算)
语法:SDIFF key [key ...]

6、sinter查找属于集合A且属于集合B的元素。(交集运算)
语法:SINTER key [key ...]

7、sunion查找属于集合A或者属于集合B的元素。(合并运算)
语法:SUNION key [key ...]

8、scard获取集合中元素的个数。
语法:SCARD key

9、spop
语法:SPOP key [count]

从集合中弹出一个或多个元素,由count指定。如果不指定count,默认弹出一个。由于集合是无序的,所有SPOP命令会从集合中随机选择一个元素弹出。

六、zset(有序集合)

zset又称sorted set,称之为有序集合,可排序的,但是唯一。和set的不同之处在于zset会给集合中的元素添加一个分数,然后通过这个分数进行排序。

1、zadd

语法:ZADD key score member [score member ...]

向有序集合中加入一个或多个元素和该元素的分数,如果该元素已经存在则会用新的分数替换原有的分数。返回值是新加入到集合中的元素个数,不包含之前已经存在的元素。

2、zscore获取元素的分数。
语法:ZSCORE key member

3、zrem移除有序集合中的一个或多个成员,不存在的成员将被忽略。
语法:ZREM key member [member ...]

4、zrange
语法:ZRANGE key start stop [WITHSCORES]

按照元素分数从小到大的顺序返回索引从start到stop之间的所有元素(包含两端的元素)。如果需要获得元素的分数可以在命令尾部加上WITHSCORES参数。

5、zrevrange
语法:ZREVRANGE key start stop [WITHSCORES]

按照元素分数从大到小的顺序返回索引从start到stop之间的所有元素(包含两端的元素)。如果需要获得元素的分数的可以在命令尾部加上WITHSCORES参数。

6、zrank获取元素排名(从小到大)。
语法:ZRANK key member

7、zrevrank获取元素排名(从大到小)。
语法:ZREVRANK key member

8、zrangebyscore获得指定分数范围的元素。
语法:ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

9、zincrby增加某个元素的分数,并返回更改后的分数。
语法:ZINCRBY key increment member

10、zcard获取集合元素的数量。
语法:ZCARD key

11、zcount获取指定分数范围内的元素个数。
语法:ZCOUNT key min max

12、ZREMRANGEBYRANK按照排名范围删除元素。
语法:ZREMRANGEBYRANK key start stop

13、ZREMRANGEBYSCORE按照分数范围删除元素。
语法:ZREMRANGEBYSCORE key min max

七、使用 redis 的好处

Redis是一种快速、开源的内存数据库,具有以下几个优点和好处:

  1. 高性能:Redis的数据存储在内存中,读写速度非常快。它支持多种数据结构,如字符串、哈希、列表、集合、有序集合等,使得它可以满足各种场景下的高性能需求。

  2. 持久化:Redis支持数据持久化,可以将数据以文件的形式保存到硬盘上。这样即使Redis服务重启或崩溃,数据也可以恢复。

  3. 缓存:Redis常用于作为缓存层,将热点数据存储在内存中,以提供快速访问。使用Redis作为缓存可以大幅提升系统的读取速度和性能。

  4. 发布/订阅:Redis支持发布/订阅模式,可以方便地实现消息的发布和订阅机制。这对于实时消息推送、事件通知等场景非常有用。

  5. 分布式锁:Redis提供了原子操作和分布式锁的支持,可以实现分布式环境下的锁机制,避免资源竞争和并发问题。

  6. 高可用性:Redis支持主从复制和哨兵模式,可以实现高可用性和自动故障转移。当主节点发生故障时,自动选举新的主节点,保证系统的可用性。

  7. 多语言支持:Redis提供了多种编程语言的客户端库,如Java、Python、C#等,使得开发人员可以方便地在各种语言环境下使用Redis。

总的来说,Redis以其高性能、灵活的数据结构和丰富的功能特性,在缓存、数据存储、消息队列等多个领域都有广泛的应用。它可以提升系统性能、增加系统可靠性,并且非常适合处理大规模的实时数据。

八、总结

Redis 常用的五大类型已经讲完了,没有很多理论的知识,都是一些命令,要全部记住也有点难,做好笔记,要用的时候找来用就行了。