前言
在当今的软件开发中,数据存储与操作是至关重要的一部分。为了满足日益增长的数据需求和对性能的追求,出现了许多不同类型的数据库。其中,Redis 作为一种基于内存且高性能的键值存储数据库,因其快速的读取速度、丰富的数据结构和灵活的应用场景而备受推崇。
本文将深入探讨 Redis 数据库中常用的数据类型(如字符串、哈希、列表、集合、有序集合)及其对应的常用 API。我们将详细介绍每种数据类型的特点、使用场景以及相应的 API 操作,旨在帮助读者更好地理解并灵活运用 Redis 数据库,从而提升数据存储与处理的效率和性能。
一、Redis 中常用的五种数据类型
字符串(String):字符串是 Redis 最基本的数据类型,它可以存储任意类型的数据,例如文本、数字或序列化的对象等。Redis 提供了丰富的 API 操作,如设置/获取值、追加、获取子串等。
哈希(Hash):哈希类型是一种键值对的集合,类似于关联数组或字典。每个哈希可以存储多个字段和与之相关联的值,常用于存储对象的属性。Redis 提供了对哈希的各种操作,如设置/获取字段值、获取所有字段、删除字段等。
列表(List):列表是一系列按照插入顺序排列的元素集合,可以在列表的两端进行快速的插入和删除操作。它常被用作队列、栈或消息发布与订阅等场景。Redis 提供了对列表的操作,如在头部/尾部插入元素、获取范围内的元素、删除指定元素等。
集合(Set):集合是一组无序且唯一的元素集合,不允许重复的成员存在。集合常用于存储一些独立的元素,如用户标签、好友列表等。Redis 提供了对集合的操作,如添加/移除元素、求交集/并集、判断元素是否存在等。
有序集合(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,即相当于 SET key value。返回值是追加后字符串的总长度。
*语法:append key value*
12、获取字符串长度(STRLEN)
STRLEN命令返回键值的长度,如果键不存在则返回0。
三、hash(哈希)
hash是一个string类型的field和value的映射表,而field只能是String类型,hash特别适合用于存储对象。
1、hset HSET一次只能设置一个字段值。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、hget HGET一次只能获取一个字段值。
语法: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、lrange LRANGE命令是列表类型最常用的命令之一,用于获取列表中的某一片段,将返回start到stop之间的所有元素(包含两端的元素),索引从0开始。索引可以是负数,如:-1代表最后边的一个元素。
*语法:LRANGE key start stop*
4、lpop LPOP命令从列表左边弹出一个元素,会分两步完成:第一步是将列表左边的元素从列表中移除。第二步是返回被移除的元素值。
*语法:LPOP key*
5、rpop RPOP命令从列表右边弹出一个元素,步骤与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是一种快速、开源的内存数据库,具有以下几个优点和好处:
高性能:Redis的数据存储在内存中,读写速度非常快。它支持多种数据结构,如字符串、哈希、列表、集合、有序集合等,使得它可以满足各种场景下的高性能需求。
持久化:Redis支持数据持久化,可以将数据以文件的形式保存到硬盘上。这样即使Redis服务重启或崩溃,数据也可以恢复。
缓存:Redis常用于作为缓存层,将热点数据存储在内存中,以提供快速访问。使用Redis作为缓存可以大幅提升系统的读取速度和性能。
发布/订阅:Redis支持发布/订阅模式,可以方便地实现消息的发布和订阅机制。这对于实时消息推送、事件通知等场景非常有用。
分布式锁:Redis提供了原子操作和分布式锁的支持,可以实现分布式环境下的锁机制,避免资源竞争和并发问题。
高可用性:Redis支持主从复制和哨兵模式,可以实现高可用性和自动故障转移。当主节点发生故障时,自动选举新的主节点,保证系统的可用性。
多语言支持:Redis提供了多种编程语言的客户端库,如Java、Python、C#等,使得开发人员可以方便地在各种语言环境下使用Redis。
总的来说,Redis以其高性能、灵活的数据结构和丰富的功能特性,在缓存、数据存储、消息队列等多个领域都有广泛的应用。它可以提升系统性能、增加系统可靠性,并且非常适合处理大规模的实时数据。
八、总结
Redis 常用的五大类型已经讲完了,没有很多理论的知识,都是一些命令,要全部记住也有点难,做好笔记,要用的时候找来用就行了。