redis的五种数据结构及使⽤场景
⼀、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.设置和获取字符串的某⼀段内容
redis支持的五种数据类型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 会发现并拒绝执⾏。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论