学习《redis入门指南》笔记,结合实践,只记录重要,明确,属于新知的相关内容。redis
一、redis中的事务由一组命令的集合组成,要么都执行,要么都不执行,同时redis的事务还能够保证事务内的命令会依次执行不被其余命令插入。算法
二、命令MULTI开启事务,以后发送一些列须要执行的指令,最后发送EXEC执行事务,一旦成功发送EXEC,全部的命令就必定会被执行。数据库
三、当redis事务中的命令发生了语法错误时,执行EXEC后就会直接返回错误,其中语法正确的命令也不会执行。缓存
四、当redis事务中的命令发生了运行错误时,好比使用散列类型的命令操做集合类型,这种错误在语法检查阶段没法发现,出现运行错误的命令,在返回内容中将有错误信息,其余命令依然会正常执行。数据结构
五、redis事务没有关系数据库事务提供的回滚功能。dom
六、WATCH命令能够监控一个或多个键,一旦其中有一个键被修改,那以后的一个事务就不会执行,监控一直持续到事务执行(即EXEC)以前,由于事务中的命令会在EXEC以后执行,因此这个事务中能够修改刚才WATCH监控的键。post
七、执行EXEC以后会取消对全部键的监控,也能够经过UNWATCH来取消监控。性能
八、设置过时时间学习
EXPIRE key secondsserver
redis能够为每个顶层数据结构(5种)的键设置过时时间,过时后将自动删除,过时时间为秒,表示还剩多少时间就会删除这个键。返回1表示设置成功,0失败。
九、查看剩余过时时间
TTL key
当键不存在时返回-2,没有过时时间返回-1。
十、取消过时时间
PERSIST key
除此以外,使用SET或GETSET(先设置新的值,在返回旧的值)为键赋值,也会清除过时时间,须要再次设置,其余对键值操做的命令不会对过时时间产生影响。
十一、PEXPIRE key millisecond
以毫秒为单位设置过时时间
十二、以UNIX时间设置过时时间
EXPIREAT key seconds
PEXPIREAT key millisecond
1三、若是WATCH命令监控了一个有过时时间的键,该键时间到期自动删除不会被WATCH认为该键被改变。
1四、过时时间这一特性使redis能够看成缓存使用,当缓存的数量越多,达到redis最大可用内存大小(经过配置文件的maxmemory修改),将会根据maxmemory-policy参数指定的策略进行删除,直到占用的内存小于限制。
redis支持的淘汰键的规则
规则 | 说明 |
volatile-lru | 使用LRU算法删除一个键(只对设置了过时时间的键) |
allkeys-lru | 使用LRU算法删除一个键 |
volatile-random | 随机删除一个键(只对设置了过时时间的键) |
allkeys-random | 随机删除一个键 |
volatile-ttl | 删除过时时间最近的一个键 |
noeviction | 删除过时时间最近的一个键 |
LRU(Least Recently Used)算法即”最近最少使用“,其认为最近最少使用的键在将来一段时间内也不会被用到。
1五、对集合,列表,有序集合排序
SORT key [ALPHA] [DESC] [LIMIT offset count]
对有序集合进行排序时,会忽略元素的分数,默认状况下,SORT命令会尝试将全部元素转换成双精度浮点数进行排序,转换失败则排序失败。ALPHA参数用于指明使用字典顺序排序;DESC参数指明按照从大到小排序,由于默认是从小到大;LIMIT参数用来返回指定范围的结果,这两个参数的用法与SQL一致。
1六、by参考键
BY
参考键能够是字符串类型或散列类型(表示为键名->字段名)的某一个字段,若是SORT命令提供了by参数,那么它将再也不按照元素自身的值进行排序,而是用每一个元素的值替换参考键中第一个" * "并获取其值,看成排序的依据,如:
SORT sortbylist BY itemscore:* (sortbylist为list类型,itemscore:*为字符串类型)
SORT posts BY post:*->time (posts为集合类型,post:*->time是散列类型的一个字段)
当参考键不包含" * "时,将不会执行排序操做;当参考键的值相同时,会根据元素自己作比较;当参考键不存在时,参考键的值默认为0;当参考键为散列类型时," * "只能出如今" -> "以前,不然" * "将不会被替换,会被认为是一个字段名,即常量。
1七、get参数
GET
它的做用是使SORT命令返回的结果不是元素自身的值,而是由GET指定的值,如:
SORT posts BY post:*->time DESC GET post:*->title GET post:*->time
SORT posts BY post:*->time DESC GET post:*->title GET #
一个SORT命令只能由一个BY参数,但能够由多个GET参数,GET #会返回元素自己,当GET的键不存在时会返回nil。
1八、store参数
STORE
默认状况SORT会直接返回排序结果,使用STORE参数将会把排序结果存储到一个列表类型的键中,若是该键存在则会覆盖,如:
SORT posts BY post:*->time DESC GET post:*->title GET # STORE result
1九、sort的性能
SORT 命令复杂度为O(n+mlog(m)),n表示待排序的键中元素的数量,m表明要返回的元素的数量。减小排序的样本数量(n),使用LIMIT减小获取排序结果的数量(m),使用STORE将结果缓存均可以提升sort的性能。
20、以阻塞方式获取列表中的值
BLPOP listkey timeout
BRPOP listkey timeout
当列表为空时,这个链接将会阻塞,imeout参数为超时时间,超出此时间仍没有元素则返回nil,为0表示马上返回;当得到元素后,返回两个值,分别是键名和元素值。
可用于实现简单消息队列。
2一、优先队列的实现
BLPOP key [key ...] timeout
BRPOP key [key ...] timeout
阻塞方式获取队列中的元素完整命令如上所述,能够弹出多个键中的元素,若是每个键都没有元素则返回nil,不然,会按照键从左到右的顺序弹出一个元素。
2二、“发布订阅”模式
此模式中有发布者和订阅者两种角色,发布者能够往指定频道发布消息,全部订阅此频道的订阅者都会收到消息。
2三、发布消息
PUBLISH channel message
返回值为收到消息的订阅者数量,消息不会被缓存,新的订阅者收不到旧的消息。
2四、订阅频道
SUBSCRIBE channel [channel ...]
能够同时订阅多个频道,执行订阅命令后会进入订阅模式,此模式下只能执行属于“发布/订阅”模式下的4个命令(SUBSCRIBE 、UNSUBSCRIBE、PSUBSCRIBE 、PUNSUBSCRIBE )。
订阅状态的客户端只会收到3种命令,每种命令都有3个值,第一个值是消息类型,根据类型的不一样,第二三个值意义也不一样。
a、subsrcibe 订阅成功的反馈,参数分别是订阅成功的频道名和订阅当前频道的客户端数量。
b、message 收到订阅消息,参数为产生消息的频道和消息内容。
c、unsubscirbe 成功取消某个订阅频道,参数为频道名和当前客户端订阅的频道数量,当此值为0时,客户端会退出订阅状态。
2五、取消订阅与按照规则订阅
UNSUBSCRIBE [channel ...]
PSUBSCRIBE
UNPSUBSCRIBE
取消订阅的命令若是不带参数,会取消全部订阅的频道;按规则订阅支持订阅名称符合glob风格通配符格式的频道;按规则取消用法相似。
按规则订阅时会出现重复订阅一个频道的状况,也会重复收到消息,重复消息(第二条开始)的消息类型为pmessage,发布者也会收到有多个客户端收到消息的回复;取消订阅时,经过普通订阅和按规则订阅的频道不会互相影响(不会出现互相取消的状况),同时在取消按规则订阅时,再也不执行通配展开,而是字符串匹配,只会取消按规则订阅时的原字符串对应的频道。
2六、redis-cli与redis-server使用TCP链接,发送命令和发送命令的执行结果都须要玩咯传输,这两个部分的耗时称为往返延时。
2七、通常状况下,往返延时的数量级上至关于redis执行一个简单命令的执行时间。
2八、redis底层通讯协议对管道(pipeline)提供了支持,经过管道一次性能够发送多条命令并执行完后一次性将结果返回。