Redis应用场景(转)

(来源:http://www.cnblogs.com/shanyou/archive/2012/09/04/2670972.html)

Redis常用数据类型

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

  • String
  • Hash
  • List
  • Set
  • Sorted set

在具体描述这几种数据类型之前,我们先通过一张图了解下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不同数据类型提供一个统一的管理接口,实际作者也提供了多种方法帮助我们尽量节省内存使用,我们随后会具体讨论。

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

  • String

    常用命令:

    set,get,decr,incr,mget 等。

    应用场景:

    String是最常用的一种数据类型,普通的key/value存储都可以归为此类,这里就不所做解释了。

    实现方式:

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

  • Hash

    常用命令:

    hget,hset,hgetall 等。

    应用场景:

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

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

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

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

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

    也就是说,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结构来实现,比较好理解,这里不再重复。

    实现方式:

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

  • Set

    常用命令:

    sadd,spop,smembers,sunion 等。

    应用场景:

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

    实现方式:

    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来存储,这样获取时就是自动按时间排好序的。

实现方式:

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

 

    • Redis作者谈Redis应用场景
    • 为什么使用 Redis及其产品定位
    • Redis内存使用优化与存储
    • Redis复制与可扩展集群搭建
    • 现实世界中的 Redis
    • Redis 介绍2——常见基本类型
    • Redis消息通知系统的实现
    • Redis VS Oracle 
      Advance Queue性能对比 (一)
    • Redis VS Oracle Advance Queue性能对比 (二)
    • Redis 实践笔记
    • Redis使用总结之与Memcached异同

转载于:https://www.cnblogs.com/xujiming/p/5451603.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/490808.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

word删除页眉下面的横线

首先点击插入>页眉,输入页眉后,选中页眉内容: 点击“设计”栏: 点击页面边框: 然后按如下设置即可消除页眉下面的横线

TensorFlow 多任务学习

多任务学习 多任务学习,顾名思义,就是多个任务模型同时执行,进行模型的训练,利用模型的共性部分来简化多任务的模型,实现模型之间的融合与参数共享,可以在一定程度上优化模型的运算,提高计算机…

【工业互联网】全球工业互联网十大最具成长性技术展望(2019-2020年)

来源:中国工业互联网研究院来源:中国工业互联网研究院全球工业互联网十大最具成长性技术展望(2019-2020年)工业互联网工业互联网是第四次工业革命的重要基石,在世界范围已步入发展快车道,正处于面临重大突破…

win10调节屏幕亮度_自动调节电脑屏幕亮度软件,保护你的眼睛

本文共514个字,预计用时2分钟小伙伴们,今天给大家分享一个小软件,名字叫做 EyeCareApp,中文名:护眼软件EyeCareApp是一款能够调节屏幕亮度的软件,它可以调整屏幕亮度,滤除蓝光,有效减…

国家计划统筹布局哪些人工智能创新平台?

来源:智造智库建设布局人工智能创新平台,是强化对人工智能研发应用的基础支撑。未来,国家层面计划大力促进各类通用软件和技术平台的开源开放,且按照军民深度融合的要求和相关规定,推进军民共享共用。人工智能开源软硬…

install package vif包_2019-10-03【百宝箱】如何使用wireshark实时远程抓取openwrt路由器包...

前言经常遇到问题的时候需要抓取wifi数据包,常用的做法有三种:1、使用 专用网卡omnipeekwindows软件抓包2、使用 macbook pro的airtool软件抓包3、在路由器上使用tcpdump除了omnipeek 其他都不能实时操作。如何结合openwrt来达到远程实时抓包呢&#xff…

CNN中的卷积操作与权值共享

CNN中非常有特点的地方就在于它的局部连接和权值共享,通过卷积操作实现局部连接,这个局部区域的大小就是滤波器filter,避免了全连接中参数过多造成无法计算的情况,再通过参数共享来缩减实际参数的数量,为实现多层网络提…

python根据矩阵数值大小涂上不同深浅颜色

绘制矩阵颜色图 import matplotlib.pyplot as pltplt.matshow(np.random.rand(5,5), cmapplt.get_cmap(Greens), alpha0.5) # , alpha0.3 plt.show()

20150210--Smarty1-02

20150210--Smarty1-02 三、设计篇 1、Smarty注释 基本语法: {*注释内容*} 示例代码: 2、Smarty中的变量 1)从PHP中分配的变量(普通的变量、数组、对象) 基本语法: $smarty->assign(); 示例代码: demo02.php demo02.html 运行效…

python 绘制时频图 plt.specgram

时频图以横轴为时间,纵轴为频率,用颜色表示幅值。在一幅图中表示信号的频率、幅度随时间的变化 matplotlib.pyplot.specgram(x, NFFTNone, FsNone, FcNone, detrendNone, windowNone, noverlapNone, cmapNone, xextentNone, pad_toNone, sidesNone, s…

华为鸿蒙系统四大特性:基于微内核,面向全场景,分布式架构

来源:今日头条8月9日,在广东东莞召开的华为开发者大会上,华为正式发布了自研操作系统:鸿蒙OS。据华为消费者业务CEO、华为技术有限公司常务董事余承东介绍,鸿蒙OS是基于微内核的面向全场景的分布式操作系统。随着华为全…

VM虚拟机中 localhost login_UTM 2.0 虚拟机来了,解决上网和无声音问题

今天主要讲一下UTM虚拟机,如果你对UTM这款APP不太熟悉,我在这里大致讲一下,这款应用工具,它可以安装在 iPad 和 iPhone 上刷入电脑系统,举例子:在UTM中刷入win7系统。甚至还能刷入 Android 安卓系统&#x…

搅动世界的两大因素

原创:张晓峰提要:移动互联、云计算、大数据、人工智能等技术因素逐步成为新基础设施,而泛连接、泛共享、泛融合与泛协同为代表的非技术因素正在重构这个世界。二者叠加融汇、相因相生。每个人都渐进或主动或被动地“被”函数化、数字化、孪生…

amigo幸运字符什么意思_转载 | 史上最全 python 字符串操作指南

点击蓝字关注,创智助你长姿势【本文已由 清风Python 授权转载(原创)作者:王翔,转载请联系出处】字符串的定义完了,估计很多人看到这个标题就要关网页了,稍等不妨再往下看看?python 定义字符、字符串没有 j…

在物理学的语言里,“生命”是什么?

转自:Darthusian“想象一种语言就像想象一种形式的生命。”--- 路德维希.维特根斯坦,《哲学研究》当今世界人们使用大约6,800种不同的语言。不是每个词都能在不同的语言之间完美地翻译,意义有时会落入语义的裂缝。例如,日语词wabi…

HTML5中的时间类型,另外EL表达式的时间值来读取时间,并且还可以更改时间

HTML5规范里只规定date新型input输入类型,并没有规定日历弹出框的实现和样式。所以,各浏览器根据自己的设计实现日历。目前只有谷歌浏览器完全实现日历功能。相信这种局面很快就会结束,所有的浏览器最终都将会提供原生的日历组件。 如果你使用…

支付接口申请_2020新版去水印小程序搭建教程(附源码+对接支付)

可以设置小程序跳转,引流也不错支持小程序后台流量主激励视频广告用户下载一次观看一次视频广告,收入非常可观支持小程序后台流量主banner广告支持全网短视频解析,苹果安卓通用支持后台无限生成卡密支持自定义文字广告支持图片广告支持小程序…

python 绘制功率谱密度图 plt.psd

功率谱密度图以横轴为频率,纵轴为功率密度,表示信号功率密度随着频率的变化情况 python绘制功率谱密度: matplotlib.pyplot.psd(x, NFFT256, Fs2, Fc0, detrendmlab.detrend_none,windowmlab.window_hanning, noverlap0, pad_toNone,sidesd…

概述自动机器学习(AutoML)

来源:混沌巡洋舰华为年薪百万招聘的机器学习博士,其中一个的研究方向就是AutoML,今天借着最新的综述,来对AutoML进行简要的概述。机器学习是让算法自动的从数据中找出一组规则,从而提取数据中对分类/聚类/决策有帮助的特征&#x…

python assert 与 slice

assert: assert 断言的作用:assert是断言的意思,python assert 断言语句格式及用法很简单。assert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达式为假,用来测试表达式,如果表达式的返回值为假…