一、redis 数据结构使用场景
原来看过 redisbook 这本书,对 redis 的基本功能都已经熟悉了,从上周开始看 redis 的源码。目前目标是吃透 redis 的数据结构。我们都知道,在 redis 中一共有5种数据结构,那每种数据结构的使用场景都是什么呢?
String——字符串
Hash——字典
List——列表
Set——集合
Sorted Set——有序集合
下面我们就来简单说明一下它们各自的使用场景:
1. String——字符串
String 数据结构是简单的 key-value 类型,value 不仅可以是 String,也可以是数字(当数字类型用 Long 可以表示的时候encoding 就是整型,其他都存储在 sdshdr 当做字符串)。使用 Strings 类型,可以完全实现目前 Memcached 的功能,并且效率更高。还可以享受 Redis 的定时持久化(可以选择 RDB 模式或者 AOF 模式),操作日志及 Replication 等功能。除了提供与 Memcached 一样的 get、set、incr、decr 等操作外,Redis 还提供了下面一些操作:
1.LEN niushuai:O(1)获取字符串长度
2.APPEND niushuai redis:往字符串 append 内容,而且采用智能分配内存(每次2倍)
3.设置和获取字符串的某一段内容
4.设置及获取字符串的某一位(bit)
5.批量设置一系列字符串的内容
6.原子计数器
7.GETSET 命令的妙用,请于清空旧值的同时设置一个新值,配合原子计数器使用
2. Hash——字典
在 Memcached 中,我们经常将一些结构化的信息打包成 hashmap,在客户端序列化后存储为一个字符串的值(一般是 JSON 格式),比如用户的昵称、年龄、性别、积分等。这时候在需要修改其中某一项时,通常需要将字符串(JSON)取出来,然后进行反序列化,修改某一项的值,再序列化成字符串(JSON)存储回去。简单修改一个属性就干这么多事情,消耗必定是很大的,也不适用于一些可能并发操作的场合(比如两个并发的操作都需要修改积分)。而 Redis 的 Hash 结构可以使你像在数据库中 Update 一个属性一样只修改某一项属性值。
存储、读取、修改用户属性
3. List——列表
List 说白了就是链表(redis 使用双端链表实现的 List),相信学过数据结构知识的人都应该能理解其结构。使用 List 结构,我们可以轻松地实现最新消息排行等功能(比如新浪微博的 TimeLine )。List 的另一个应用就是消息队列,可以利用 List 的 *PUSH 操作,将任务存在 List 中,然后工作线程再用 POP 操作将任务取出进行执行。Redis 还提供了操作 List 中某一段元素的 API,你可以直接查询,删除 List 中某一段的元素。
1.微博 TimeLine
2.消息队列
4. Set——集合
Set 就是一个集合,集合的概念就是一堆不重复值的组合。利用 Redis 提供的 Set 数据结构,可以存储一些集合性的数据。比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。因为 Redis 非常人性化的为集合提供了求交集、并集、差集等操作,那么就可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。
1.共同好友、二度好友
2.利用唯一性,可以统计访问网站的所有独立 IP
3.好友推荐的时候,根据 tag 求交集,大于某个 threshold 就可以推荐
5. Sorted Set——有序集合
和Sets相比,Sorted Sets是将 Set 中的元素增加了一个权重参数 score,使得集合中的元素能够按 score 进行有序排列,比如一个存储全班同学成绩的 Sorted Sets,其集合 value 可以是同学的学号,而 score 就可以是其考试得分,这样在数据插入集合的时候,就已经进行了天然的排序。另外还可以用 Sorted Sets 来做带权重的队列,比如普通消息的 score 为1,重要消息的 score 为2,然后工作线程可以选择按 score 的倒序来获取工作任务。让重要的任务优先执行。
1.带有权重的元素,比如一个游戏的用户得分排行榜
2.比较复杂的数据结构,一般用到的场景不算太多
二、redis 其他功能使用场景
1. 订阅-发布系统
Pub/Sub 从字面上理解就是发布(Publish)与订阅(Subscribe),在 Redis 中,你可以设定对某一个 key 值进行消息发布及消息订阅,当一个 key 值上进行了消息发布后,所有订阅它的客户端都会收到相应的消息。这一功能最明显的用法就是用作实时消息系统,比如普通的即时聊天,群聊等功能。
2. 事务——Transactions
谁说 NoSQL 都不支持事务,虽然 Redis 的 Transactions 提供的并不是严格的 ACID 的事务(比如一串用 EXEC 提交执行的命令,在执行中服务器宕机,那么会有一部分命令执行了,剩下的没执行),但是这个 Transactions 还是提供了基本的命令打包执行的功能(在服务器不出问题的情况下,可以保证一连串的命令是顺序在一起执行的,中间有会有其它客户端命令插进来执行)。Redis 还提供了一个 Watch 功能,你可以对一个 key 进行 Watch,然后再执行 Transactions,在这过程中,如果这个 Watched 的值进行了修改,那么这个 Transactions 会发现并拒绝执行。
相关推荐
Redis的这些数据结构设计考虑了内存效率、查询速度和数据操作的便利性。压缩列表和散列表等自定义数据结构是Redis能够高效运作的关键。在实际应用中,Redis广泛用于缓存、消息队列、计数器等多种场景,其高性能和...
### Redis使用场景与内部数据结构详解 #### 一、Redis使用场景 Redis 是一款非常流行的开源内存数据库系统,因其高性能和灵活性而被广泛应用于多种场景之中。以下是一些常见的使用场景: 1. **缓存**: - **本地...
在实践使用中,Redis的这些基础数据结构可以单独使用,也可以组合使用,通过不同的数据结构组合,可以构建复杂的业务场景,如使用string存储简单的key-value数据,使用list实现队列,使用set做去重、交集操作,使用...
Redis排序集合与使用场景 Redis持久化策略与RDB Redis持久化策略与AOF Redis主从复制与集群配置 Redis事务与Lua脚本 Redis性能优化与监控 Redis内存管理与优化 Redis高可用与故障转移 Redis地理空间索引与应用 Redis...
Redis的强大之处在于其灵活多样的数据结构以及高效的命令执行能力,这使得它能够在多种应用场景中发挥重要作用。无论是用于实时系统开发还是构建高效的缓存系统,Redis都展现出了巨大的潜力。通过本文的介绍,相信...
Redis,全称Remote Dictionary Server,是一款高性能的键值对存储系统,被广泛应用于缓存、数据库、消息中间件等...在实际应用中,应根据具体需求选择合适的数据结构,合理配置持久化方式,以及优化Redis的各项设置。
以下将详细介绍Redis中的主要数据结构及其应用。 1. 字符串(String) Redis中的字符串是最基本的数据类型,可以存储任何可打印的字符序列,包括整数和浮点数。它支持设置、获取、增加、减少等操作,是实现计数器...
Redis是一种高性能的键值存储系统,提供了多种数据结构的支持,使得它在不同的应用场景下都能够表现出色。接下来,我们将详细介绍Redis中的主要数据类型及其应用场景。 #### String 字符串 - **简介**:字符串是...
这些数据类型的实现基于Redis内部的数据结构,如redisObject是所有数据对象的基础类型,具有类型、编码以及数据指针属性。例如,List类型可以通过双向链表或压缩列表来实现,而Set和Sorted Set类型分别通过哈希表和...
Redis,作为一种内存数据库,因其高性能、灵活性和丰富的数据结构,被广泛应用于各种场景。然而,正确选择使用场景至关重要,以避免不必要的资源浪费和系统压力。本文将深入探讨Redis的适用范围,帮助开发者避免误用...
使用场景及目标:本资源适用于想要理解Redis数据结构优化手段及其高级特性的技术人员。有助于更好地进行故障排除和优化Redis应用程序。 使用说明:阅读此内容是为了获得对Redis设计及其实现的理解,从而提高解决实际...
在描述中提到的场景,我们首次加载数据是从数据库中获取,而后续的请求则从Redis这样的缓存系统中获取,这是一种典型的缓存策略。 首先,让我们详细了解一下数据库。数据库是存储和管理数据的系统,如MySQL、Oracle...
7. Redis 对象和数据结构:Redis 提供的列表、哈希、集合和有序集合等对象,根据数据规模和特性,可能使用不同的底层实现,如ziplist适用于小数据量场景,而大列表可能使用链表或跳跃表,哈希可能用字典,有序集合...
Redis是一种高性能的键值对数据存储系统,常用于缓存、消息队列、计数器等多种场景。作为新手,理解其基本概念、安装部署、数据类型以及操作命令是入门的关键。 首先,我们要了解Redis的基本概念。Redis是Remote ...
标题中提及的Redis适用场景涉及了Redis作为内存数据结构存储的多种用途,这表明Redis不仅是一个快速的键值存储数据库,也是一个多功能的数据库系统,能够满足各种不同的应用场景需求。下面,我们就对这些场景逐个...
StackExchange.Redis支持多种Redis数据结构: - 字符串(Strings):基本的键值对存储。 - 哈希(Hashes):存储键值对的集合,键是字段,值是字段值。 - 列表(Lists):有序的元素集合,支持两端插入和弹出。 ...
在手册中,你会了解到Redis支持的基本数据结构,如字符串(Strings)、哈希(Hashes)、列表(Lists)、集合(Sets)和有序集合(Sorted Sets)。这些数据结构使得Redis在处理各种场景时具有高度灵活性。此外,手册还涵盖了...
本文将详细介绍 Redis 中的数据结构和对象系统,帮助你更好地理解和利用 Redis。 1. 数据结构 1.1. 简单动态字符串(SDS) SDS 是 Redis 为字符串定制的一种数据结构,它在 C 语言的 char * 基础上增加了长度...