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
redis学习笔记——应用场景的更多相关文章
- Redis 学习笔记-应用场景
Redis作缓存系统 Redis可以对每个键设置生存时间 可以限定数据占用的最大内存空间,在数据达到空间限制后可以按照一定规则自动淘汰不需要的键. 设置方法: 修改配置文件的maxmemory参数,限 ...
- Redis学习笔记4-Redis配置详解
在Redis中直接启动redis-server服务时, 采用的是默认的配置文件.采用redis-server xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务.按照本Redi ...
- Redis学习笔记(二)Redis支持的5种数据类型的总结之String和Hash
引言 在Redis学习笔记(一)中我们已经会安装并且简单使用Redis了,接下来我们一起来学习下Redis支持的5大数据类型. 简介 Redis是REmote DIctionary Server(远程 ...
- Redis学习笔记(1)——Redis简介
一.Redis是什么? Remote Dictionary Server(Redis) 是一个开源的使用ANSI C语言编写.遵守BSD协议.支持网络.可基于内存亦可持久化的日志型.Key-Value ...
- Redis学习笔记4-Redis配置具体解释
在Redis中直接启动redis-server服务时, 採用的是默认的配置文件.採用redis-server xxx.conf 这种方式能够依照指定的配置文件来执行Redis服务. 依照本Redi ...
- Redis学习笔记八:集群模式
作者:Grey 原文地址:Redis学习笔记八:集群模式 前面提到的Redis学习笔记七:主从复制和哨兵只能解决Redis的单点压力大和单点故障问题,接下来要讲的Redis Cluster模式,主要是 ...
- redis学习笔记(详细)——高级篇
redis学习笔记(详细)--初级篇 redis学习笔记(详细)--高级篇 redis配置文件介绍 linux环境下配置大于编程 redis 的配置文件位于 Redis 安装目录下,文件名为 redi ...
- redis 学习笔记(6)-cluster集群搭建
上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,得借助一致性hash来自己搞shardi ...
- Redis学习笔记~目录
回到占占推荐博客索引 百度百科 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合). ...
随机推荐
- BZOJ 1800
1800: [Ahoi2009]fly 飞行棋 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1622 Solved: 1293[Submit][St ...
- Selenium2+python自动化22-发送各种类型附件邮件【转载】
前言 最近一些小伙伴,在搞邮箱的事情,小编于是去折腾了一下!总结了一些干货,与大家分享一下!速来,抱大腿,我要开车了! 基本思路就是,使用MIMEMultipart来标示这个邮件是多个部分组成的,然后 ...
- java类型强转
知乎: 首先基本数据类型不是对象,强转改的是值,分为有损和无损,有损会丢失数据细节. 然后对象,只有继承关系的类才能强转,改变的只是引用,而且向上转型是安全的,把你转为人类是安全的,你还是你,只是现在 ...
- JNI基础学习
1.JNI(Java Native Interface): 它允许Java代码和其他语言写的代码进行交互,JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要 ...
- 遇见requestAnimationFrame
今天,在读javascript异步编程的js事件深入理解部分的时候,了解到了requestAnimationFrame 这个api,在这里记录一下. 原文: setTimeout 和 setInter ...
- 【bzoj1335】Radio Transmission
给你一个字符串,它是由某个字符串不断自我连接形成的.但是这个字符串是不确定的,现在只想知道它的最短长度是多少. 因为这个字符串是不断自匹配形成的我们可以很容易的想到,除了第一个字符串外,从第二个字符串 ...
- ASP.NET Core 2.2 基础知识(九) 使用托管服务实现后台任务
在 ASP.NET Core 中,后台任务作为托管服务实现.托管服务是一个类,而且必须实现 IHostedService 接口,该接口定义了两个方法: StartAsync(CancellationT ...
- Combination Sum IV -- LeetCode
Given an integer array with all positive numbers and no duplicates, find the number of possible comb ...
- Problem B: 调用函数,输出100到200之间的所有素数
#include <stdio.h> int isPrime(unsigned int n)//定义素数函数 { int i; || n == ) ; ; i * i <= n; i ...
- canvas的一些问题记录
canvas当被设置width时,原来绘制的内容,将会清空.