最近在看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学习笔记——应用场景的更多相关文章

  1. Redis 学习笔记-应用场景

    Redis作缓存系统 Redis可以对每个键设置生存时间 可以限定数据占用的最大内存空间,在数据达到空间限制后可以按照一定规则自动淘汰不需要的键. 设置方法: 修改配置文件的maxmemory参数,限 ...

  2. Redis学习笔记4-Redis配置详解

    在Redis中直接启动redis-server服务时, 采用的是默认的配置文件.采用redis-server   xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务.按照本Redi ...

  3. Redis学习笔记(二)Redis支持的5种数据类型的总结之String和Hash

    引言 在Redis学习笔记(一)中我们已经会安装并且简单使用Redis了,接下来我们一起来学习下Redis支持的5大数据类型. 简介 Redis是REmote DIctionary Server(远程 ...

  4. Redis学习笔记(1)——Redis简介

    一.Redis是什么? Remote Dictionary Server(Redis) 是一个开源的使用ANSI C语言编写.遵守BSD协议.支持网络.可基于内存亦可持久化的日志型.Key-Value ...

  5. Redis学习笔记4-Redis配置具体解释

    在Redis中直接启动redis-server服务时, 採用的是默认的配置文件.採用redis-server   xxx.conf 这种方式能够依照指定的配置文件来执行Redis服务. 依照本Redi ...

  6. Redis学习笔记八:集群模式

    作者:Grey 原文地址:Redis学习笔记八:集群模式 前面提到的Redis学习笔记七:主从复制和哨兵只能解决Redis的单点压力大和单点故障问题,接下来要讲的Redis Cluster模式,主要是 ...

  7. redis学习笔记(详细)——高级篇

    redis学习笔记(详细)--初级篇 redis学习笔记(详细)--高级篇 redis配置文件介绍 linux环境下配置大于编程 redis 的配置文件位于 Redis 安装目录下,文件名为 redi ...

  8. redis 学习笔记(6)-cluster集群搭建

    上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,得借助一致性hash来自己搞shardi ...

  9. Redis学习笔记~目录

    回到占占推荐博客索引 百度百科 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合). ...

随机推荐

  1. Mac-item+zsh

    $brew cask install iterm2 $ sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/m ...

  2. [ 总结 ] Linux 下文件描述符

    1.概述: 文件描述符是内核为了高效管理已被打开的文件所创建的索引.是一个非负整数,用于代指被打开的文件.所有通过I/O操作的系统调用都通过文件描述符. 文件描述符用以表明每一个被进程所打开的文件和s ...

  3. 【Android开发日记】之入门篇(十三)——Android的控件解析

    Android的控件都派生自android.view.View类,在android.widget包中定义了大量的系统控件供开发者使用,开发者也可以从View类及其子类中,派生出自定义的控件. 一.An ...

  4. TimeUnit 笔记

    TimeUnit笔记 1.TimeUnit 简介 TimeUnit是java.util.concurrent包下的一个枚举类,其主要封装了时间单位之间的转换以及基于时间上对线程的基本操作(sleep, ...

  5. JAVA的线程学习、并发线程的学习

    http://blog.csdn.net/column/details/multithreading.html http://blog.csdn.net/fhd001/article/details/ ...

  6. ubuntu14.04 安装 pyv8

    1. $sudo pip install -v pyv8 Error: pip unicodedecodeerror ‘ascii’ codec can’t decode byte 0xe2 in p ...

  7. HDU 1233.还是畅通工程-最小生成树(Prime)

    还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  8. Codeforces #432 Div2 D

    #432 Div2 D 题意 给出一些数字,如果这些数字的的 \(gcd\) 不为1则称这些数字 \(good\). 可以有两种操作: 花费 x 删掉一个数 花费 y 将一个数加 1 问使这些数 \( ...

  9. 折半搜索+状态压缩【P3067】 [USACO12OPEN]平衡的奶牛群Balanced Cow S…

    Description 给n个数,从中任意选出一些数,使这些数能分成和相等的两组. 求有多少种选数的方案. Input 第\(1\)行:一个整数\(N\) 第\(2\)到\(N+1\)行,包含一个整数 ...

  10. ( 转 ) 优秀REST风格 API的设计原则

    设计优秀的REST风格API非常困难!API是服务提供方和使用方之间的契约,打破该契约将会给服务端开发人员招来非常大的麻烦,这些麻烦来自于使用API的开发人员,因为对API的改动会导致他们的移动app ...