设为首页 收藏本站
查看: 1110|回复: 0

[经验分享] Redis官方文档(3)——从入门到精通(上)

[复制链接]

尚未签到

发表于 2016-12-21 08:18:47 | 显示全部楼层 |阅读模式
Redis3官方文档(3)
——从入门到精通(上)


    Redis不是一个无格式(plain)的键值存储,而是一个支持各种不同类型值的数据结构服务器。这就是说,传统键值存储是关联字符串值到字符串键,但是Redis的值不仅仅局限于简单字符串,还可以持有更复杂的数据结构。下面列的是Redis支持的所有数据结构,后面将逐一介绍:

  • 二进制安全(binary-safe)的字符串。
  • 列表:按照插入顺序排序的字符串元素(element)的集合(collection)。通常是链表。
  • 集合:唯一的,无序的字符串元素集合。
  • 有序集合:和集合类似,但是每个字符串元素关联了一个称为分数(score)的浮点数。元素总是按照分数排序,所以可以检索一个范围的元素(例如,给我前10,或者后10个元素)。
  • 哈希:由字段(field)及其关联的值组成的映射。字段和值都是字符串类型。这非常类似于Ruby或Python中的哈希/散列。
  • 位数组(位图):使用特殊的命令,把字符串当做位数组来处理:你可以设置或者清除单个位值,统计全部置位为1的位个数,寻找第一个复位或者置位的位,等等。
  • 超重对数(HyperLogLog):这是一个用于估算集合的基数 (cardinality,也称势,译者注)的概率性数据结构。不要害怕,它比看起来要简单,稍后为你揭晓。

    理解这些数据结构是如何工作的,以及从命令参考手册中选择什么命令来解决实际问题,并不总是一件繁琐的事情,本文档就是学习Redis数据结构及其最常用模式的速成班。
    后面的所有例子我们都是使用redis-cli工具,这是一个简单而又方便的命令行工具,用于发送命令给Redis服务器。
    Redis键(Keys)
    Redis键是二进制安全的,这意味着你可以使用任何二进制序列作为键,从像”foo”这样的字符串到一个JPEG文件的内容。空字符串也是合法的键。
    关于键的其他一些规则:

  • 不要使用太长的键,例如,不要使用一个1024字节的键,不仅是因为内存占用,而且在数据集中查找键时需要多次耗时的键比较。即使手头需要匹配一个很大值的存在性,对其进行哈希(例如使用SHA1)是个不错的主意,尤其是从内存和带宽的角度。
  • 不要使用太短的键。用”u1000flw”取代”user:1000:followers”作为键并没有什么实际意义,后者更具有可读性,相对于键对象本身以及值对象来说,增加的空间微乎其微。然而不可否认,短的键会消耗少的内存,你的任务就是要找到平衡点。
  • 坚持一种模式(schema)。例如,”object-type:id”就不错,就像”user:1000”。点或者横线常用来连接多单词字段,如”comment:1234:reply.to”,或者”comment:1234:reply-to”。
  • 键的最大大小是512MB。

    Redis字符串(Strings)
    Redis字符串是可以关联给redis键的最简单值类型。字符串是Memcached的唯一数据类型,所以新手使用起来也是很自然的。
    由于Redis的键也是字符串,当我们使用字符串作为值的时候,我们是将一个字符串映射给另一个字符串。字符串数据类型适用于很多场景,例如,缓存HTML片段或者页面。
    让我们用redis-cli来玩玩字符串类型(接下来的例子都是使用redis-cli)。
> set mykey somevalue
OK
> get mykey
"somevalue"
    你可以看到,我们使用SET和GET命令设置和检索字符串值。注意,如果键已经存在,SET会替换掉该键已经存在的值,哪怕这个键关联的是一个非字符串类型的值。SET执行的是赋值操作。
    值可以是任何类型的字符串(包括二进制数据),例如,你可以存储一个JPEG图像。值不能大于512MB。
    SET命令还有一些以额外的参数形式提供有意思的选项。例如,如果我要求如果键存在(或刚好相反)则执行失败,也就是说健存在才成功:
> set mykey newval nx
(nil)
> set mykey newval xx
OK
    尽管字符串是Redis最基本的值类型,你仍可以执行很多有趣的操作。例如,原子性增长:
> set counter 100
OK
> incr counter
(integer) 101
> incr counter
(integer) 102
> incrby counter 50
(integer) 152
    INCR命令将字符串值解析为整数,并增加一,最后赋值后作为新值。还有一些类似的命令INCRBY,DECR和DECRBY。它们以略微不同的方式执行,但其内部都是一样的命令。
    为什么说INCR命令是原子的?因为即使多个 客户端对同一个键发送INCR命令也不会造成竞争条件(race condition)。例如,一定不会发生客户端1和客户端2同时读到”10”,都增加到11,然后设置新值为11。最后的结果将会一直是12,读-增加-写操作在执行时,其他客户端此时不会执行相关命令。
    有许多操作字符串的命令。例如,GETSET命令给键设置一个新值,同时返回旧值。你可以使用这个命令,例如,如果你有一个系统,每当收到一个访问请求就使用INRC来增加一个键。你想每隔一个小时收集一次这个信息,而不想漏掉任何一个增长。你可以使用GETSET,将新值赋值为0,人后读取其旧值。
    在一个命令中一次设置或者检索多个键有利于减少延迟。为此有了MSET和MGET命令:
> mset a 10 b 20 c 30
OK
> mget a b c
1) "10"
2) "20"
3) "30"
    当使用MSET时,Redis返回一个值数组。
    改变和查询键空间(key space)
    有一些命令并不定义在特定的类型上,但是对键空间的交互很有用,因此他们能作用在任意键上。
    例如,EXISTS命令返回1或者0,来表示键在数据库中是否存在。另外,DEL命令删除键及其关联的值,无论值是什么。
> set mykey hello
OK
> exists mykey
(integer) 1
> del mykey
(integer) 1
> exists mykey
(integer) 0
    从上面的例子中我们还可以看到,DEL命令本身也会返回1或者0,无论键是(存在)否(不存在)删除。
    有许多键空间相关的命令,但是上面两个命令与TYPE命令关系紧密,TYPE命令返回某个键的值的类型。
> set mykey x
OK
> type mykey
string
> del mykey
(integer) 1
> type mykey
none

    Redis过期(expires):有限生存时间的键
    在我们继续更复杂的数据结构之前,我们先抛出一个与类型无关的特性, 称为Redis过期 。你可以给键设置超时,也就是一个有限的生存时间。当生存时间到了,键就会自动被销毁,就像用户调用DEL命令一样。
    快速过一下Redis过期的信息:

  • 过期时间可以设置为秒或者毫秒精度。
  • 过期时间分辨率总是1毫秒。
  • 过期信息被复制和持久化到磁盘,当Redis停止时时间仍然在计算(也就是说Redis保存了过期时间)。

    设置过期非常简单:
> set key some-value
OK
> expire key 5
(integer) 1
> get key (immediately)
"some-value"
> get key (after some time)
(nil)
    键在两次GET调用期间消失了,因为第二次调用推迟了超过5秒。在上面的例子中,我们使用EXPIRE命令设置过期(也可以为一个已经设置过期时间的键设置不同的过期时间,就像PERSIST命令可以删除过期时间使键永远存在)。当然我们也可以使用其他Redis命令来创建带过期时间的键。例如使用SET选项:
> set key 100 ex 10
OK
> ttl key
(integer) 9
    上面的例子中设置10秒过期的键,值为字符串100。然后使用TTL命令检查键的生存剩余时间。
    为了使用毫秒来设置和检查过期,请查看PEXPIRE和PTTL命令,以及SET命令的全部选项。
===============================================================================
    大家好,我是阮威。华中科技大学,计算机软件专业硕士。毕业后加入腾讯,先后在腾讯电子商务部和无线游戏产品部工作,现供职于欢聚时代基础产品部。IT男,至今。对技术有强烈的热情,对技术以外的事物热情更高。
    我的座右铭是“呼喊移动人的移动连接,践行自由人的自由联合”。欢迎大家收听我的公众账号。
DSC0000.jpg

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-317104-1-1.html 上篇帖子: 基于Nginx分布式Tomcat+Redis 实现Session共享 for window 下篇帖子: php_memcache.dll + php_redis.dll for php5.4.7 下载
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表