Redis学习之 基本数据结构

1. Redis基本数据结构

Redis是一个高性能的键值存储系统,支持多种数据结构,比如:字符串、列表、集合、散列表、有序集合等。Redis的基本数据结构都是存储在内存中的,因此读写速度非常快,而且支持数据持久化,可以做到数据的持久存储和快速读取。

1.1 字符串

字符串是Redis最基本的数据结构,它可以存储任意类型的数据,比如数字、文本等。在Redis中,字符串类型的操作是比较完善的,支持获取字符串的长度、设置过期时间、对字符串进行加减操作、对字符串进行位运算等。以下是一些常见的字符串操作命令:

SET key value               # 设置key对应的值为value

GET key # 获取key对应的值

MGET key1 key2 ... # 获取多个key对应的值

INCR key # key对应的值加1,如果key不存在,则首先设置为0再加1

DECR key # key对应的值减1,如果key不存在,则首先设置为0再减1

INCRBY key increment # key对应的值增加increment

DECRBY key decrement # key对应的值减少decrement

EXPIRE key seconds # 设置key的过期时间为seconds秒,到期后会自动删除

1.2 列表

列表是一种有序的字符串列表,可以存储多个字符串,支持在列表的两端进行添加、删除、修改等操作。Redis的列表类型特别适合用来实现队列、栈等数据结构。以下是一些常见的列表操作命令:

LPUSH key value1 [value2 ...]        # 在key对应的列表左侧插入一个或多个元素

RPUSH key value1 [value2 ...] # 在key对应的列表右侧插入一个或多个元素

LPOP key # 移除并返回key对应的列表的左侧第一个元素

RPOP key # 移除并返回key对应的列表的右侧第一个元素

LINDEX key index # 获取key对应的列表中索引为index的元素

LLEN key # 获取key对应的列表长度

LINSERT key BEFORE/AFTER pivot value # 在key对应的列表中,找到值为pivot的元素,再在它前面或后面插入一个新元素value。

1.3 集合

集合是一种无序的字符串集合,可以存储多个字符串,但是每个字符串只能出现一次。Redis的集合类型支持求交集、并集、差集等操作,还支持随机取出集合中的元素等操作。以下是一些常见的集合操作命令:

SADD key member1 [member2 ...]        # 将member1、member2等加入到key对应的集合中

SREM key member1 [member2 ...] # 将member1、member2等从key对应的集合中移除

SISMEMBER key member # 判断member是否在key对应的集合中

SMEMBERS key # 返回key对应的集合中所有的成员

SINTER key1 key2 [key3 ...] # 返回key1、key2等对应的集合的交集

SUNION key1 key2 [key3 ...] # 返回key1、key2等对应的集合的并集

SDIFF key1 key2 [key3 ...] # 返回key1对应的集合中,不在key2、key3等对应的集合中的元素

SRANDMEMBER key [count] # 随机返回key对应的集合中的一个或多个元素

1.4 散列表

散列表是一种键值对存储结构,也就是我们常说的哈希表,可以用来存储对象类型的数据。Redis的散列表类型基于哈希表实现,所以具有快速查找、添加、删除等操作的特点。以下是一些常见的散列表操作命令:

HSET key field value                    # 设置key对应的散列表的field字段的值为value

HGET key field # 获取key对应的散列表中field字段的值

HGETALL key # 获取key对应的散列表中所有的键值对(field和value)

HEXISTS key field # 判断key对应的散列表中是否存在field字段

HDEL key field1 [field2 ...] # 删除key对应的散列表中field1、field2等字段

HINCRBY key field increment # 将key对应的散列表中field字段的值增加increment

HKEYS key # 获取key对应的散列表中所有的字段

1.5 有序集合

有序集合是一种有序的字符串列表,可以存储多个字符串及其对应的分值,分值可以用来排序。Redis的有序集合类型支持根据分值区间查找元素、获取成员排名、获取成员分值等操作,也支持根据索引范围或分值范围进行排序。以下是一些常见的有序集合操作命令:

ZADD key score1 member1 [score2 member2 ...]        # 将member1、member2等加入到key对应的有序集合中,并且给每个成员设置对应的分值

ZREM key member1 [member2 ...] # 将member1、member2等从key对应的有序集合中移除

ZSCORE key member # 获取key对应的有序集合中member成员的分值

ZRANK key member # 获取key对应的有序集合中member成员的排名(从0开始)

ZREVRANK key member # 获取key对应的有序集合中member成员的倒数排名

ZRANGE key start stop [WITHSCORES] # 获取key对应的有序集合中排名在[start, stop]范围内的成员列表

ZREVRANGE key start stop [WITHSCORES] # 获取key对应的有序集合中倒数排名在[start, stop]范围内的成员列表

2. Redis数据类型的性能比较

Redis支持多种数据结构,对于不同的业务场景,选择合适的数据结构是提高Redis性能的关键。以下是不同数据类型的常见操作与性能比较:

数据类型 读取操作 写入操作 删除操作
字符串 O(1) O(1) O(1)
列表 O(n) O(1) O(n)
集合 O(n) O(1) O(n)
散列表 O(1) O(1) O(1)
有序集合 O(log n) O(log n) O(log n)

因为列表和集合的读写操作都是O(n)的复杂度,所以如果有大量的读取或写入操作,最好不要使用列表或集合。相比之下,因为散列表和有序集合的读写操作都是O(1)或O(log n)的,所以适合于频繁的读写操作。

3. Redis数据结构的应用场景举例

3.1 缓存

Redis最常见的应用就是作为缓存系统,用来加速读取数据和减轻后端数据库的压力。在缓存中,字符串类型的键值对是最常见的存储方式。可以将热点数据缓存在Redis中,提高访问速度。比如,网站中的新闻、评论等数据可以存储在Redis中,每次访问时先从Redis中读取,如果Redis中没有,则读取后端数据库并写入Redis缓存。

3.2 计数器

Redis可以用作分布式计数器,因为它支持原子加减操作,可以保证多个客户端同时执行加减操作时结果是准确的。可以用Redis的字符串类型来存储计数器的值,使用INCRBY命令递增计数器的值。

3.3 最新消息排行榜

Redis的有序集合类型可以很方便地实现最新消息排行榜,因为它支持按照分值进行排序。可以将每篇新闻的发布时间作为分值,文章ID作为成员,将所有新闻加入到有序集合中。每次需要获取最新的新闻时,可以使用ZREVRANGE命令按照分值逆序获取前N篇最新的新闻。

3.4 实时消息推送

Redis的订阅/发布机制可以用来实现实时消息推送功能,比如聊天室、推送等。当有新消息时,服务端可以使用PUBLISH命令将消息发送给指定的频道。客户端可以订阅这个频道,当有新消息时,Redis会将新消息发送给所有订阅该频道的客户端。

3.5 分布式锁

Redis可以用作分布式锁,因为它支持原子性操作和过期时间控制。可以利用Redis的字符串类型的SET命令来实现分布式锁,将锁的名称作为键名,锁的值作为键值,设置过期时间来保证锁的自动释放。当多个客户端同时尝试获取锁时,只有一个客户端能够成功取得锁,其他客户端会根据设置的最大等待时间等待锁的释放。

4. 总结

Redis是一个非常方便的高性能的键值存储系统,支持多种数据结构,比如字符串、列表、集合、散列表、有序集合等,适合处理不同类型的业务场景。在实际开发中,需要根据具体的业务需求选择合适的数据结构,并结合Redis其他的高级应用(比如发布/订阅、事务、脚本等)来提高系统的性能和可靠性。

数据库标签