redis学习笔记——应用场景

最近在看redis入门指南,现在就自己的学习情况说说自己的理解。

字符串类型(String)

字符串类型是Redis中最基本的类型,能存储任意形式的字符串,包括二进制数据。如一张照片也可以用字符串类型存储。注意字符串类型键允许存储的数据最大容量是512M。

Strings 数据结构是简单的key-value类型,value其实不仅是String,也可以是数字。除了get、set、incr、decr 等操作外,Redis还提供了下面一些操作:

获取字符串长度;
往字符串append内容;
设置和获取字符串的某一段内容;
设置及获取字符串的某一位(bit);
批量设置一系列字符串的内容;

所以字符串类型用来保存字符串和计数都是非常方便的。就拿一篇博客来说:实现文章访问量的统计、生成自增ID、被评论多少次,转发多少次,赞多少次,被浏览多少次,有多少个好友等等同时包括存储文章的内容都只需要使用字符串类型便可以实现。

散列类型(hash)

散列就是hash,散列类型用于存储比如用户的昵称、年龄、性别、积分等是非常方便的,都能实现只有O(1)的复杂度。同时对这些内容的修改也会非常方便。

就比如:关系数据库中如果要存储汽车对象,存储结构如下表所示:

如果想为 ID 为 1 的汽车增加生产日期属性,就需要把数据表更改为如下表所示的结构:

对于 ID 为 2 和 3 的两条记录而言 date 字段是冗余的。可想而知当不同的记录需要不同的属性时,表的字段数量会越来越多以至于难以维护。

但是在redis中就没有这样的情况。当然redis在我看来也会形成很大的浪费,就像上面的例子:如果汽车的数量太多的话,那每一辆车都有一个color、name、price这些字符需要去保存,虽然后面有精简键名的方法那也是很浪费啊。

其实还有一个疑问:redis上面列举的例子都是一层关系模型,那多层的时候redis是将多层进行分解吗?

列表类型(list)

list是用链表实现的,而且是双向链表。这样的话很显而易见的就是在两端插入和删除是非常方便的O(1),所以list提供的操作基本操作lpush、rpush、lpop、rpop。

同时不难看出list很容易实现栈和队列。

基于上面的这些原因:list主要运用于取最新N个数据的操作,如社交网站上的新鲜事,最新的新闻,最新更新的博客这些使用list实现可以事半功倍。

有个问题一直想不清楚:书上说列表是有序的字符串列表,所谓的有序难道是push 时间的先后吗??

集合类型

集合我们首先应该注意到的是:存储不重复的键,注意不重复也就是唯一的意思。

我们也应该注意到集合是用值为空的散列表实现的,呵呵,那么其实他实现不重复的原理其实就是使用了散列表(hash)的键值(key)唯一的特性。

既然他是一种特殊形式的散列表,那么散列表快速访问——O(1)的特性同样存在与集合之中。所以访问集合的时间复杂度就是O(1)咯。

好了我们来看看集合主要用在一些什么地方呢?

uniq的特性——Uniq操作,获取某段时间所有数据排重值;

简单粗暴的并交叉操作——比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis为集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中;

有序集合

有序集合是按照某种分数的高低来排序。

有序集合是利用散列表和跳跃表来实现的。

主要运用:比如一个存储全班同学成绩的Sorted Sets,其集合value可以是同学的学号,而score就可以是其考试得分,这样在数据插入集合的时候,就已经进行了天然的排序。这就是:排行榜应用,取TOP N操作。

另外还可以用Sorted Sets来做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务,让重要的任务优先执行。这就是传说中的:构建有优先级的队列系统。

需要精准设定过期时间的应用——如你可以把上面说到的sorted set的score值设置成过期时间的时间戳,那么就可以简单地通过过期时间排序,定时清除过期数据了,不仅是清除Redis中的过期数据,你完全可以把Redis里这个过期时间当成是对数据库中数据的索引,用Redis来找出哪些数据需要过期删除,然后再精准地从数据库中删除相应的记录。

其他的

Pub/Sub构建实时消息系统——Redis的Pub/Sub系统可以构建实时的消息系统,比如很多用Pub/Sub构建的实时聊天系统的例子,我觉得qq消息里面@all就可以用这个实现;

其他的比较高大上的运用的话你不妨参考:http://www.csdn.net/article/1970-01-01/2817107

转载于:https://www.cnblogs.com/lukexwang/p/4690109.html

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

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

相关文章

Unity的Cover flow的实现包(2个)

苹果的mac机上预览图片,有一个所谓的cover flow的效果,这里收集到两个,两个实现效果略有不同。 1、老外的实现 https://github.com/rakkarage/Unity3D-CoverFlow 这个焦点图片在到最后位置前会模拟一个抖动效果 2、国人的实现 http://game.ce…

卸载全部appx应用(包括应用商店)

在PowerShell中粘贴: Get-AppXPackage | Remove-AppxPackage 转载于:https://www.cnblogs.com/Bob-wei/p/4691854.html

求两个整数数组乘积最小值

输入: 三行: 第一行:n,表示数组的个数 第二行:数组a各个元素的值 第三行:数组b各个元素的值输出: 式子:a[0]*b[0]a[1]*b[1]...a[n-1]*b[n-1];的最小值 其中数组a中元素顺序可以调整…

Xcode快捷键整理

做iOS开发,避免不了的就是要和Xcode打交道,如果对Xcode的快捷方式熟练的话,这样会对我们项目开发速度有很大的提高。也是对你能力的一种提升,下面就是Abel整理的一些资料,希望有一些帮助: 1、文件类 新建项…

Perl语言编程学习笔记2

1. Perl中变量的常用表示 ${var} 相当于 $var $Dog::days 在Dog包里面的变量$days $#days days 的最后一个索引 $days->[2] $days 引用的数组的的第3个元素 $days[0][2] 多维数组 $days{200}{Feb} 多维哈希 $days{2000,"Feb"} 多维哈希仿真 emulation days[…

关于跨平台下end-of-line问题

因为项目需要,同时开发了Linux/Windows版本的程序,后面在实际测试过程中,发现两个版本之间的体现出来的行为有些不一致,大致情况如下: 1、Linux下代码能编译通过,Windows下编译通过 2、Linux下程序功能正常…

QImage与Mat之间的相互转换

Mat转QImage Mat matimread("c:/dev/test.jpg"); cvtColor(mat, mat, CV_BGR2RGB); QImage image(mat.data, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);Qt与OpenCv之间传输数据时,QImage::Format_RGB888是最兼容的模式. OpenCv 加载BGR格式…

Graphviz从入门到不精通

1、安装Graphviz (windows 版本,后面说linux下的安装) 1.1)下载安装文件 从graphviz官网下载 http://www.graphviz.org/Download.php 或者从我的百度网盘下载 http://pan.baidu.com/s/1i3mzunV 下载后双击安装,跟着提示…

条款32: 尽可能地推迟变量的定义

// 此函数太早定义了变量"encrypted" string encryptPassword(const string& password) {string encrypted;//默认构造函数初始化if (password.length() < MINIMUM_PASSWORD_LENGTH) {throw logic_error("Password is too short");}进行必要的操作&…

xilinx-arm-linux交叉编译链安装

1、下载交叉编译链 xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin&#xff0c;直接搜这个&#xff0c;网上有资源。 2、安装依赖库 sudo apt-get install lib32ncurses5 lib32z1 3、修改shell sudo dpkg-reconfigure -plow dash&#xff0c;在出现的界面中选no 4、安装 ./xi…

第一章 1.6 HTML5 的新功能(二)

1.6.4 使用 Selectors API 简化选取操作 除了语义化元素外&#xff0c;HTML5 还引入了一种用于查找页面 DOM 元素的快捷方式。 1-3 列出表了在 HTML5 出现之前&#xff0c;用来在页面中查找特定元素的函数。 函数描述示例getElementById()根据指定的id特性值查找并返回元素<…

Mercurial hg web server的配置

在windows下安装tortoisehg-1.0.3-hg-1.5.3-x64.exe的版本控制工具后&#xff0c;克隆建立中心库后&#xff0c;启动web server&#xff0c;其他分库可以连接中心库进行pull但无法push。 这个可能是tortoisehg工具的问题&#xff0c;需要手工在.hg/hgrc文件中加入以下内容才可以…

dorado开发模式下实现动态查询

使用dorado开发模式,我们可以实现以下开发技巧 开发技巧1.实现动态查询功能: 1. 查询按钮的onClick事件中写入: datasetEmployee.parameters().setValue(“employee_id”, editor_employee_id.value); datasetEmployee.parameters().setValue(“employee_name”, editor_employ…

港澳通行证办理手续

港澳通行证办理手续&#xff1a; 一、办理前准备 1、 户口本 原件复印件。 2、 身份证 (一张纸&#xff0c;正反面)原件复印件。 3、 两张两寸白底免冠照片。 二、办理地点 1、户口所在地公安局 出入境管理处&#xff08;科&#xff09;。 三、办理时 1、排队、填写 【往来港澳…

undefined reference to `cv::VideoCapture::VideoCapture()'

缺少库&#xff0c;添加相应库就行&#xff0c;我的Qt Create中做的是&#xff1a; LIBS -L/home/mima111/opencv345/lib -lopencv_imgcodecs -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_videoio 实际上添加-lopencv_videoio就行

HDU2602 (0-1背包)

Bone Collector Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 39259 Accepted Submission(s): 16261 Problem DescriptionMany years ago , in Teddy’s hometown there was a man who was called “Bone Col…

博客3万访问量了……

博客有3万访问量了呢。自从第一次用了赠送的1500的流量券&#xff0c;粉丝了从零突破了&#xff0c;到现在有150个粉丝了。 之前预想的写博客的初衷&#xff0c;也是记录自己的学习过程&#xff0c;毕竟好记忆不如烂笔头&#xff0c;记录下来就是长长久久的&#xff0c;随时可以…

Mint17 一些安装备忘

1&#xff0c;中文输入法&#xff1a; sudo apt-add-repository ppa:fcitx-team/dailybuild-fcitx-master sudo apt-get update sudo apt-get upgrade sudo apt-get remove ^ibus* sudo apt-get remove ^fcitx* sudo apt-get install fcitx fcitx-bin fcitx-config-common fcit…

error: ‘CV_BGR2RGB’ was not declared in this scope

缺少库&#xff0c;添加相应库就行&#xff0c;ubuntu中Qt Create设置如下 LIBS -L/home/mima111/opencv345/lib -lopencv_imgcodecs -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_videoio 实际只要添加-lopencv_imgproc就行&#xff0c;CV_BGR2RGB变量存储在该…

Struts学习之手动验证

* 首先要从页面中获取对应的标签name属性的值&#xff0c;在动作类action中声明同名的属性&#xff0c;提供get和set方法 * 要继承ActionSupport类或者实现Validateable接口 * 重写Validateable接口的validate()方法 * 前提是&#xff1a;要保证setUsername()、va…