Redis中5种数据结构的使用场景介绍_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.设置和获取字符串的某一段内容
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 会发现并拒绝执行。

时间: 2024-09-01 15:04:57

Redis中5种数据结构的使用场景介绍_Redis的相关文章

Redis中5种数据结构的使用场景介绍

这篇文章主要介绍了Redis中5种数据结构的使用场景介绍,本文对Redis中的5种数据类型String.Hash.List.Set.Sorted Set做了讲解,需要的朋友可以参考下. 一.redis 数据结构使用场景 原来看过 redisbook 这本书,对 redis 的基本功能都已经熟悉了,从上周开始看 redis 的源码.目前目标是吃透 redis 的数据结构.我们都知道,在 redis 中一共有5种数据结构,那每种数据结构的使用场景都是什么呢? String--字符串 Hash--字典

Redis 的几种数据结构&五种数据类型对象

先看几种数据结构 通过分析底层的数据结构,学习如何根据场景选型和设计  1,简单动态字符串     redis使用的字符串SDS有别于C语言中的字符串    a, 结构       free字段为已分配但未使用的空间     len为已使用的空间(不计入'\0')     buf为char数组     b, 与C字符串区别         redis的字符环结构可以理解为将C字符串封装了一层,通过加入的属性字段降低字符串操作的复杂度,提高安全性.         通过len属性可以在常数复杂度获

redis中5种数据类型介绍

redis和memcached两种缓存,个人觉得redis更好用,因为它不仅提供了丰富的数据类型,还能保证数据的持久性,下面就来简单的介绍一下redis中常用的几种数据类型. 1. 字符串类型(string) 这是redis中最基本的类型,也是最常用的类型,跟memcached一样,即一个key对应一个值这种.操作也很简单,常用操作命令有get.set.del等. 2. 链表类型(list) 链表类型有点类似于编程语言中的数组一样,可以用一个key存一组数据进去.其实list类型就是一个双向链表

redis中使用redis-dump导出、导入、还原数据实例

redis的备份和还原,借助了第三方的工具,redis-dump 1.安装redis-dump 复制代码代码如下: [root@localhost tank]# yum install ruby rubygems ruby-devel   //安装rubygems 以及相关包   [root@localhost tank]# gem sources -a http://ruby.taobao.org/   //源,加入淘宝,外面的源不能访问   http://ruby.taobao.org/ a

ASP中五种连接数据库的方法

连接数据库 ASP中五种连接数据库的方法 简介 介绍ASP连接sql,连接access,等数据库的方法! 正文 ASP中五种连接数据库的方法 第一种 - 这种方法用在ACCESS中最多 strconn = "DRIVER=Microsoft Access Driver (*.mdb);DBQ=" & Server.MapPath("aspfree.mdb") set conn = server.createobject("adodb.connect

高并发系统中队列术的哪些应用场景

队列在数据结构中是一种线性表,从一端插入数据,然后从另一端删除数据.本文目的不是讲解各种队列算法,而是在应用层面讲述使用队列能解决哪些场景问题. 在我开发过的系统中,不是所有的业务都必须实时处理.不是所有的请求都必须实时反馈结果给用户.不是所有的请求/处理都必须100%处理成功.不知道谁依赖"我"的处理结果.不关心其他系统如何处理后续业务.不需要强一致性,只需保证最终一致性即可.想要保证数据处理的有序性;此时你应该考虑使用队列来解决这些问题.在实际开发时我们经常使用队列进行异步处理.系

redis中的list,hash,set,zset的内存占用或效率的大概次序是怎么样的?

问题描述 redis中的list,hash,set,zset的内存占用或效率的大概次序是怎么样的? 用一个键来存储一堆值,如果list,hash,set,zset业务都可以实现,从内存效率上来看,大概的顺序是怎么样的? 解决方案 set hash list zset 不需要顺序 就用set把. 解决方案二: list是有序的,set是无序的,后者性能更高,前者适合实现堆栈.队列这些需要顺序的结构.这里说的序是指插入序,不是排序.zset是有序列表,这里的有序是排序,不是插入序.hash适合检索信

redis中list类型详解及常用命令

redis中的list类型有点类似于编程语言中的数组,list类型如下图所示,实际上是一种双向链表结构,通过lpush.lpop.rpush.rpop这几个命令来控制链表中数据出入,所以list类型可以用作栈,也可以用作队列一样. redis链表list类型 从元素插入和删除的效率来看,如果从链表的两头插入或删除元素,会非常的高效,即使链表中已经存储了上百万条的记录,也可以在很短的时间内完成.然而需要说明的是,如果元素插入或删除操作是作用于链表中间,那将会是非常低效的.相信对于有良好数据结构基础

Redis中的动态字符串学习教程_Redis

sds 的用途Sds 在 Redis 中的主要作用有以下两个: 实现字符串对象(StringObject): 在 Redis 程序内部用作 char* 类型的替代品: 以下两个小节分别对这两种用途进行介绍. 实现字符串对象 Redis 是一个键值对数据库(key-value DB), 数据库的值可以是字符串.集合.列表等多种类型的对象, 而数据库的键则总是字符串对象. 对于那些包含字符串值的字符串对象来说, 每个字符串对象都包含一个 sds 值. "包含字符串值的字符串对象",这种说法