iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >redis 五种类型介绍
  • 879
分享到

redis 五种类型介绍

2024-04-02 19:04:59 879人浏览 薄情痞子
摘要

1.  Redis最适合所有数据in-momory的场景,虽然Redis也提供持久化功能,但实际更多的是一个disk-backed的功能,跟传统意义上的持久化有比较大的差别,那么可能大家就会有疑问

1.  Redis最适合所有数据in-momory的场景,虽然Redis也提供持久化功能,但实际更多的是一个disk-backed的功能,跟传统意义上的持久化有比较大的差别,那么可能大家就会有疑问,似乎Redis更像一个加强版的Memcached,那么何时使用Memcached,何时使用Redis呢?

       如果简单地比较Redis与Memcached的区别,大多数都会得到以下观点:

     1 、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
     2 、Redis支持数据的备份,即master-slave模式的数据备份。
     3 、Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用

2.  Redis常用数据类型

Redis最为常用的数据类型主要有以下:

  • String

  • Hash

  • List

  • Set

  • Sorted set

  • pub/sub

  • Transactions

在具体描述这几种数据类型之前,我们先通过一张图了解下Redis内部内存管理中是如何描述这些不同数据类型的:

redis 五种类型介绍

首先Redis内部使用一个redisObject对象来表示所有的key和value,redisObject最主要的信息如上图所示:

         type代表一个value对象具体是何种数据类型,

         encoding是不同数据类型在redis内部的存储方式,

         比如:type=string代表value存储的是一个普通字符串,那么对应的encoding可以是raw或者是int,如果是int则代表实际 redis内部是按数值型类存储和表示这个字符串的,当然前提是这个字符串本身可以用数值表示,比如:"123" "456"这样的字符串。

       这里需要特殊说明一下vm字段,只有打开了Redis的虚拟内存功能,此字段才会真正的分配内存,该功能默认是关闭状态的,该功能会在后面具体描述。通 过上图我们可以发现Redis使用redisObject来表示所有的key/value数据是比较浪费内存的,当然这些内存管理成本的付出主要也是为了 给Redis不同数据类型提供一个统一的管理接口,实际作者也提供了多种方法帮助我们尽量节省内存使用,我们随后会具体讨论。

3.  各种数据类型应用和实现方式

下面我们先来逐一的分析下这7种数据类型的使用和内部实现方式:

  • String:

Strings 数据结构是简单的key-value类型,value其实不仅是String,也可以是数字.

常用命令:  set,get,decr,incr,mget 等。

 

应用场景:String是最常用的一种数据类型,普通的key/ value 存储都可以归为此类.即可以完全实现目前 Memcached 的功能,并且效率更高。还可以享受Redis的定时持久化,操作日志及 Replication等功能。除了提供与 Memcached 一样的get、set、incr、decr 等操作外,Redis还提供了下面一些操作:

    • 获取字符串长度

    • 往字符串append内容

    • 设置和获取字符串的某一段内容

    • 设置及获取字符串的某一位(bit)

    • 批量设置一系列字符串的内容

实现方式:String在redis内部存储默认就是一个字符串,被redisObject所引用,当遇到incr,decr等操作时会转成数值型进行计算,此时redisObject的encoding字段为int。


  • Hash

常用命令:hget,hset,hgetall 等。

应用场景:在Memcached中,我们经常将一些结构化的信息打包成HashMap,在客户端序列化后存储为一个字符串的值,比如用户的昵称、年龄、性别、积分等,这时候在需要修改其中某一项时,通常需要将所有值取出反序列化后,修改某一项的值,再序列化存储回去。这样不仅增大了开销,也不适用于一些可能并发操作的场合(比如两个并发的操作都需要修改积分)。而Redis的Hash结构可以使你像在数据库中Update一个属性一样只修改某一项属性值。

        我们简单举个实例来描述下Hash的应用场景,比如我们要存储一个用户信息对象数据,包含以下信息:

用户ID为查找的key,存储的value用户对象包含姓名,年龄,生日等信息,如果用普通的key/value结构来存储,主要有以下2种存储方式:

redis 五种类型介绍

第一种方式将用户ID作为查找key,把其他信息封装成一个对象以序列化的方式存储,这种方式的缺点是,增加了序列化/反序列化的开销,并且在需要修改其中一项信息时,需要把整个对象取回,并且修改操作需要对并发进行保护,引入CAS等复杂问题。

redis 五种类型介绍

第二种方法是这个用户信息对象有多少成员就存成多少个key-value对儿,用用户ID+对应属性的名称作为唯一标识来取得对应属性的值,虽然省去了序列化开销和并发问题,但是用户ID为重复存储,如果存在大量这样的数据,内存浪费还是非常可观的。

那么Redis提供的Hash很好的解决了这个问题,Redis的Hash实际是内部存储的Value为一个HashMap,并提供了直接存取这个Map成员的接口,如下图:

redis 五种类型介绍

也 就是说,Key仍然是用户ID, value是一个Map,这个Map的key是成员的属性名,value是属性值,这样对数据的修改和存取都可以直接通过其内部Map的 Key(Redis里称内部Map的key为field), 也就是通过 key(用户ID) + field(属性标签) 就可以操作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题。很好的解决了问题。

这 里同时需要注意,Redis提供了接口(hgetall)可以直接取到全部的属性数据,但是如果内部Map的成员很多,那么涉及到遍历整个内部Map的操 作,由于Redis单线程模型的缘故,这个遍历操作可能会比较耗时,而另其它客户端的请求完全不响应,这点需要格外注意。

实现方式:

上 面已经说到Redis Hash对应Value内部实际就是一个HashMap,实际这里会有2种不同实现,这个Hash的成员比较少时Redis为了节省内存会采用类似一维数 组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的value redisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。

  • List

常用命令:lpush,rpush,lpop,rpop,lrange等。

应用场景:

Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如twitter的关注列表,粉丝列表等都可以用Redis的list结构来实现。

Lists 就是链表,相信略有数据结构知识的人都应该能理解其结构。使用Lists结构,我们可以轻松地实现最新消息排行等功能。Lists的另一个应用就是消息队列
可以利用Lists的PUSH操作,将任务存在Lists中,然后工作线程再用POP操作将任务取出进行执行。Redis还提供了操作Lists中某一段的api,你可以直接查询,删除Lists中某一段的元素。

实现方式:

Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。

  • Set

常用命令:

sadd,spop,smembers,suNIOn 等。

应用场景:

Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set 是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。

Sets 集合的概念就是一堆不重复值的组合。利用Redis提供的Sets数据结构,可以存储一些集合性的数据,比如在微博应用中,可以将一个用户所有的关注人存 在一个集合中,将其所有粉丝存在一个集合。Redis还为集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功 能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。

实现方式:

set 的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。

  • Sorted Set

常用命令:

zadd,zrange,zrem,zcard等

使用场景:

Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。当你需要一个有序的并且不重复的集合列表,那么 可以选择sorted set数据结构,比如twitter 的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。

另外还可以用Sorted Sets来做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。

实现方式:

Redis sorted set的内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的 是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。

  • Pub/Sub

Pub/Sub 从字面上理解就是发布(Publish)与订阅(Subscribe),在Redis中,你可以设定对某一个key值进行消息发布及消息订阅,当一个 key值上进行了消息发布后,所有订阅它的客户端都会收到相应的消息。这一功能最明显的用法就是用作实时消息系统,比如普通的即时聊天,群聊等功能。

  • Transactions

谁 说NoSQL都不支持事务,虽然Redis的Transactions提供的并不是严格的ACID的事务(比如一串用EXEC提交执行的命令,在执行中服 务器宕机,那么会有一部分命令执行了,剩下的没执行),但是这个Transactions还是提供了基本的命令打包执行的功能(在服务器不出问题的情况 下,可以保证一连串的命令是顺序在一起执行的,中间有会有其它客户端命令插进来执行)。Redis还提供了一个Watch功能,你可以对一个key进行 Watch,然后再执行Transactions,在这过程中,如果这个Watched的值进行了修改,那么这个Transactions会发现并拒绝执 行。

转至:Http://www.360doc.com/content/16/0719/16/35210735_576795164.shtml

您可能感兴趣的文档:

--结束END--

本文标题: redis 五种类型介绍

本文链接: https://www.lsjlt.com/news/40598.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Redis五种基本数据类型
    五种基本数据类型 redis无论什么数据类型,在数据库中都是以key-value形式保存,并且所有的key(键)都是字符串,所以讨论基础数据结构都是讨论的value值的数据类型 主要包括常见的5...
    99+
    2023-08-31
    redis 缓存 java
  • Redis五种数据类型详解
    目录什么是 Redis前置知识String介绍常用命令使用场景底层实现SDS 结构体List介绍常用命令使用场景底层实现ZipListQuickListHash介绍常用命令使用场景底层实现DictDict 的 rehas...
    99+
    2023-04-25
    Redis数据类型 Redis数据类型用法
  • redis五种数据类型区别大吗
    redis 提供五种基本数据类型:字符串(无结构二进制字符串)、哈希(键值对集合)、列表(有序元素序列)、集合(无重复元素集合)、有序集合(带分数有序元素集合)。它们在数据结构、操作、内...
    99+
    2024-04-20
    redis 键值对
  • python五大标准数据类型的介绍
    这篇文章主要介绍“python五大标准数据类型的介绍”,在日常操作中,相信很多人在python五大标准数据类型的介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python五大标准数据类型的介绍”的疑惑有所...
    99+
    2023-06-02
  • Python模块的几种类型介绍
    这篇文章主要介绍“Python模块的几种类型介绍”,在日常操作中,相信很多人在Python模块的几种类型介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python模块的几种类型介绍”的疑惑有所帮助!接下来...
    99+
    2023-06-17
  • Redis的五种数据类型实例分析
    本篇内容主要讲解“Redis的五种数据类型实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Redis的五种数据类型实例分析”吧!1.Redis的5种数据类...
    99+
    2024-04-02
  • redis的五种数据类型使用方法
    redis 提供五种数据类型:字符串:存储单个字符串值。哈希表:存储键值对,用于对象或映射。列表:存储有序元素序列,用于数组或队列。集合:存储不重复元素,用于唯一值或标签。有序集合:存储...
    99+
    2024-04-19
    redis 键值对
  • redis数据类型strings的详细介绍
    本篇内容主要讲解“redis数据类型strings的详细介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“redis数据类型strings的详细介绍”吧!1.&...
    99+
    2024-04-02
  • redis的五种数据类型有哪些组成
    redis 提供五种基本数据类型:字符串、哈希、列表、集合和有序集合,用于存储各种类型的数据。这些类型包括字符串文本、键值对集合、有序元素集合、唯一值集合和按分数排序的元素集合。 Re...
    99+
    2024-04-08
    键值对
  • redis的五种数据类型有哪些特点
    redis 提供了五种数据类型:字符串(存储文本或数字)、列表(链表结构,支持插入和删除)、散列(键值对存储)、集合(无序集合,不允许重复元素)和有序集合(有序集合,支持排序和范围查询)...
    99+
    2024-04-08
    键值对
  • redis的五种数据类型命令有哪些
    redis 支持五种基本数据类型命令:字符串(set/get/incr/decr/append/strlen)散列(hset/hget/hdel/hlen/hgetall)列表(lpus...
    99+
    2024-04-08
    键值对
  • Java线程的五种状态介绍
    目录1. 线程的5种状态2. Java线程的6种状态3. Java线程状态的转换1. 线程的5种状态 从操作系统层面上,任何线程一般都具有五种状态,即创建、就绪、运行、阻塞、终止。 ...
    99+
    2024-04-02
  • Python各种类型装饰器详细介绍
    目录装饰器说明装饰器分类最简单的装饰器用于修改对象的装饰器用于模拟对象的装饰器--函数装饰器用于模拟对象的装饰器--类方法装饰器用于模拟对象的装饰器--类装饰器特殊应用的装饰器类实现...
    99+
    2024-04-02
  • go语言的10种数据类型介绍
    今天小编给大家分享的是go语言的10种数据类型介绍,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。go语言的数据类型有:1、布尔型,值只可以是常量true或false;2、数字类型,支...
    99+
    2023-07-04
  • 数据类型介绍
    目录 什么是数据类型?(掌握) 为何对数据分类?(掌握) 不同数据类型(掌握) 首先让我们回顾变量是什么:变量用来记录世...
    99+
    2023-01-31
    数据类型
  • redis的五大数据类型
    redis的五大数据类型分别是:1. 字符串;2. 哈希;3. 列表;4. 集合;5. 有序集合,每个数据类型都有其独特的功能和操作。 Redis 的五大数据类型 Redis 是一种 ...
    99+
    2024-04-19
    redis 键值对
  • C++中的四种强制类型转换介绍
    这篇文章主要讲解了“C++中的四种强制类型转换介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++中的四种强制类型转换介绍”吧!在了解c++的强制类形转换的时候,先看看在c语言中是怎么进...
    99+
    2023-06-20
  • redis的五种数据类型使用在什么场景
    redis 提供五种基本数据类型,分别适用于以下场景:字符串:缓存查询结果、计数器、队列。列表:待办事项列表、购物车,fifo/lifo 队列。集合:关注者、标签,集合操作。哈希表:对象...
    99+
    2024-04-19
    redis 键值对
  • redis的用途和常用的数据类型介绍
    本篇文章和大家了解一下redis的用途和常用的数据类型介绍。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。首先我们来简单介绍下redis。Redis是一个高性能的key-value数据库。...
    99+
    2024-04-02
  • TypeScript基础类型介绍
    目录1.基础类型 2.对象类型 2.1数组 2.2元组 2.3对象 3.类型推断 3.1类型联合中的类型推断 3.2上下文类型 4.类型断言 TS 的静态类型可以人为的分为两类: 基...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作