5种数据结构组成了Redis的基础,其他没有关联特定数据结构的命令也有很多。我们已经看过一些这样的命令:info,select,flushdb,multi,exec,discard,watch,和keys。这一章将看看其他的一些重要命令。
使用期限(Expiration)
    Redis允许你标记一个关键字的使用期限。你可以给与一个Unix时间戳形式(1970 01 01 起)的绝对时间,或者一个基于秒的存活时间。这是一个基于关键字的命令,因此其不在乎关键字表示的是哪种类型的数据结构。
    expire pages:about 30  expire pages:about 1356933600
    第一个命令将会在30秒后删除关键字,包括其关联的值,第二个命令会在2012年12月31日上午12点删除掉关键字。
    这让Redis能成为一个理想的缓冲引擎。通过ttl命令,你可以知道一个关键字还能够存活多久。而通过persist命令,你可以把一个关键字的使用期限删除掉。
    ttl pages:about   persist pages:about
    最后有个特殊的字符串命令,setex 命令让你可以在一个单独的原子命令里设置一个字符串值,同时里指定一个生存期(这比任何事情都要方便)
    setex page:about 30 'hellowolrd'  相当于两个命令结合  set page:about 'helloworld' ; expire page:about 30
发布和订阅
    Redis的列表数据结构有blpop和brpop命令,能从列表里返回且删除第一个(或者最后一个)元素,,或者被堵塞,直到有一个元素可供操作。这可以用来实现一个简单的队列
    此外,Redis对于消息发布和频道订阅有着一流的支持。你可以打开第二个redis-cli窗口,去尝试一下这些功能。在第一个窗口里订阅一个频道(A)
subscribe A 
其将答复你订阅的信息。现在,另一个窗口,发布一条消息到A频道:
publish A '嘿 ,it's A'
 此时,订阅A频道的就会收到 A 频道发布的消息,需要特别夸一下的是,他可以同时订阅多个频道 
subscribe A B C  甚至 pingdao*
很吊!
    监控和延迟日志
一款优秀的调试工具,monitor. monitor命令可以让你查看Redsi在做什么。但是仅限调试和开发使用,别放生产环境,理由:自然是额外开销很多。
和monitor命令一起,Redis拥有一个slowlog命令,这是一个优秀的性能剖析工具。其会记录时间超过一定数量微妙的命令。
config set slowlog-log-slower-than 0
slowlog get slowlog get 10

对于每个被你键入的命令,你应该查看4个参数:

     1.一个自动递增的id 

2.一个Unix时间戳,表示命令开始运行的时间

3.一个微妙级的时间,显示命令运行的总时间

4.该命令以及所带参数

延迟日志保存在内存中, 因此在生产环境中运行(即使有一个低阀值)也应该不是一个问题。默认情况下,它将会追踪最近的1024个日志
 
排序
    Sort 命令是Redis最强大的命令之一。它让你可以在一个列表、集合或者分类集合里对值进行排序(分类集合是通过标记来进行排序,而不是集合里的成员)。
rpush users:leto:guesses 5 9 10 2 4 10 19 2
sort users:leto:guesses
sadd friends:ghanima leto paul chani jessica alia duncan
sort friends:ghanima limit 0 3 desc alpha

上面的命令向我们展示了,如何对已排序的记录进行分页(通过limit),如何返回降序排序的结果(通过desc),以及如何用字典序排序代替数值序排序(通过alpha)。

sort命令的真正力量是其基于引用对象来进行排序的能力。早先的时候,我们说明了列表、集合和分类集合很常被用于引用其他的Redis对象,sort命令能够解引用这些关系,而且通过潜在值来进行排序。例如,假设我们有一个Bug追踪器能让用户看到各类已存在问题。我们可能使用一个集合数据结构去追踪正在被监视的问题:

sadd watch:leto 12339 1382 338 9338

你可能会有强烈的感觉,想要通过id来排序这些问题(默认的排序就是这样的),但是,我们更可能是通过问题的严重性来对这些问题进行排序。为此,我们要告诉Redis将使用什么模式来进行排序。首先,为了可以看到一个有意义的结果,让我们添加多一点数据:

set severity:12339 3
set severity:1382 2
set severity:338 5
set severity:9338 4

要通过问题的严重性来降序排序这些Bug,你可以这样做:

sort watch:leto by severity:* desc

Redis将会用存储在列表(集合或分类集合)中的值去替代模式中的*(通过by)。这会创建出关键字名字,Redis将通过查询其实际值来排序。

在Redis里,虽然你可以有成千上万个关键字,类似上面展示的关系还是会引起一些混乱。幸好,sort命令也可以工作在散列数据结构及其相关域里。相对于拥有大量的高层次关键字,你可以利用散列:

hset bug:12339 severity 3
hset bug:12339 priority 1
hset bug:12339 details "{id: 12339, ....}" hset bug:1382 severity 2
hset bug:1382 priority 2
hset bug:1382 details "{id: 1382, ....}" hset bug:338 severity 5
hset bug:338 priority 3
hset bug:338 details "{id: 338, ....}" hset bug:9338 severity 4
hset bug:9338 priority 2
hset bug:9338 details "{id: 9338, ....}"

所有的事情不仅变得更为容易管理,而且我们能通过severitypriority来进行排序,还可以告诉sort命令具体要检索出哪一个域的数据:

sort watch:leto by bug:*->priority get bug:*->details

相同的值替代出现了,但Redis还能识别->符号,用它来查看散列中指定的域。里面还包括了get参数,这里也会进行值替代和域查看,从而检索出Bug的细节(details域的数据)。

对于太大的集合,sort命令的执行可能会变得很慢。好消息是,sort命令的输出可以被存储起来:

sort watch:leto by bug:*->priority get bug:*->details store watch_by_priority:leto

使用我们已经看过的expiration命令,再结合sort命令的store能力,这是一个美妙的组合。

小结

这一章主要关注那些非特定数据结构关联的命令。和其他事情一样,它们的使用依情况而定。构建一个程序或特性时,可能不会用到使用期限、发布和订阅或者排序等功能。但知道这些功能的存在是很好的。而且,我们也只接触到了一些命令。还有更多的命令,当你消化理解完这本书后,非常值得去浏览一下完整的命令列表

\clearpage

 
 
 
 
 

Redis系统学习 四、超越数据结构的更多相关文章

  1. Redis系统学习 二、数据结构

    一.字符串     1.在Redis里,字符串是最基本的数据结构.当你在思索着关键字-值对时,你就是在死锁着字符串数据结构.不要被名字给搞混了. 常见实例: set users:leto " ...

  2. Redis 系统学习目录

    Redis 系统学习目录 1.redis是什么2.redis的作者何许人也3.谁在使用redis4.学会安装redis5.学会启动redis6.使用redis客户端7.redis数据结构 – 简介8. ...

  3. Redis系统学习 三、使用数据结构

    前言:上一章,简单介绍了5种数据结构,并给出了一些用例.现在是时候来看看一些高级的,但依然很常见的主题和设计模式 一.大O表示法(Big O Notation ) 常用时间复杂度O(1)被认为是最快速 ...

  4. Redis系统学习 五、管理

    在最后一章里,我们将集中谈论Redis运行中的一些管理方面内容.这是一个不完整的Redis管理指南,我们将会回答一些基本的问题,初接触Redis的新用户可能会很感兴趣. 配置(Configuratio ...

  5. Redis系统学习 一、基础知识

    1.数据库 select 1  select 0 2.命令.关键字和值 redis不仅仅是一种简单的关键字-值型存储,从其核心概念来看,Redsi的5种数据结构中的每一个都至少有一个关键字和一个值.在 ...

  6. Scala系统学习(四):Scala变量

    变量是保存存储值的内存位置的名称.这意味着当创建变量时,可以在内存中保留一些空间. 根据变量的数据类型,编译器分配内存并决定可以存储在预留内存中的内容.因此,通过为变量分配不同的数据类型,可以在这些变 ...

  7. Java I/O系统学习四:标准IO

    几乎所有学习Java的同学写的第一个程序都是hello world,使用的也都是System.out.println()这条语句来输出"hello world",我也不例外,当初学 ...

  8. Redis系统学习

    准备写一些关于Redis学习的文章的,发现网上有N多资料有人已经做了总结.查看这些Redis资料,按次序浏览这些Redis资料,相信想学习Redis的同学会很快熟悉: 1.Redis学习手册(目录) ...

  9. Redis基础学习(四)—Redis的持久化

    一.概述      Redis的强大性能很大程度上都是因为数据时存在内存中的,然而当Redis重启时,所有存储在内存中的数据将会丢失,所以我们要将内存中的数据持久化. Redis支持两种数据持久化的方 ...

随机推荐

  1. 各种加密解密函数(URL加密解密、sha1加密解密、des加密解密)

    原文:各种加密解密函数(URL加密解密.sha1加密解密.des加密解密) 普通hash函数如md5.sha1.base64等都是不可逆函数.虽然我们利用php可以利用这些函数写出可逆函数来.但是跨语 ...

  2. SVN提交忽略*.class、.classpath、.mymetadata、.project、.settings、.myeclipse和其他非版本控制文件

    1.忽略*.class 在TortoiseSVN -->setting(设定)--规设置 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHVrZTY ...

  3. Factorization Machines 学习笔记(二)模型方程

      近期学习了一种叫做 Factorization Machines(简称 FM)的算法,它可对随意的实值向量进行预測.其主要长处包含: 1) 可用于高度稀疏数据场景:2) 具有线性的计算复杂度.本文 ...

  4. MVC验证08-jQuery异步验证

    原文:MVC验证08-jQuery异步验证 本文主要体验通过jQuery异步验证. 在很多的教材和案例中,MVC验证都是通过提交表单进行的.通过提交表单,可以很容易获得验证出错信息.因为,无论是客户端 ...

  5. 通过扩展改善ASP.NET MVC的验证机制[使用篇]

    原文:通过扩展改善ASP.NET MVC的验证机制[使用篇] ASP.NET MVC提供一种基于元数据的验证方式是我们可以将相应的验证特性应用到作为Model实体的类型或者属性/字段上,但是这依然具有 ...

  6. Milo的游戏开发的一些链接资料

    http://www.cnblogs.com/miloyip/default.aspx?page=1 http://www.cnblogs.com/miloyip/archive/2010/06/14 ...

  7. lua本学习笔记功能

    Lua本学习笔记功能 1.  函数返回 指定任务的主要功能是完成,在这种情况下,函数被用作调用语句.函数可以计算并返回值,在这种情况下,作为分配值表达式语句使用. 语法: funcationfunc_ ...

  8. intellij idea 13&14 插件推荐及快速上手建议 (已更新!)

    原文:intellij idea 13&14 插件推荐及快速上手建议 (已更新!) 早些年 在外企的时候,公司用的是intellij idea ,当时也是从eclipse.MyEclipse转 ...

  9. 企业部署Windows 8 Store 风格应用

    原文:企业部署Windows 8 Store 风格应用 引言 之前我们都知道可以将应用程序发布到Windows 商店中供用户下载使用.如果我们是企业开发人员,则我们的应用可能属于以下两种类别之一: 1 ...

  10. MVC的TryUpdateModel

    MVC的TryUpdateModel 我们在使用MVC的时候,给model赋值只需要 TryUpdateModel(model) 就搞定了,而在webForm,winForm中,我们要写长长的 xx. ...