redis入门指南(三)—— 事务、过期时间、SORT命令、消息通知与管道
写在前面
学习《redis入门指南》笔记,结合实践,只记录重要,明确,属于新知的相关内容。
事务
1、redis中的事务由一组命令的集合组成,要么都执行,要么都不执行,同时redis的事务还可以保证事务内的命令会依次执行不被其他命令插入。
2、命令MULTI开启事务,之后发送一些列需要执行的指令,最后发送EXEC执行事务,一旦成功发送EXEC,所有的命令就一定会被执行。
3、当redis事务中的命令发生了语法错误时,执行EXEC后就会直接返回错误,其中语法正确的命令也不会执行。
4、当redis事务中的命令发生了运行错误时,比如使用散列类型的命令操作集合类型,这种错误在语法检查阶段无法发现,出现运行错误的命令,在返回内容中将有错误信息,其他命令依然会正常执行。
5、redis事务没有关系数据库事务提供的回滚功能。
6、WATCH命令可以监控一个或多个键,一旦其中有一个键被修改,那之后的一个事务就不会执行,监控一直持续到事务执行(即EXEC)之前,因为事务中的命令会在EXEC之后执行,所以这个事务中可以修改刚才WATCH监控的键。
7、执行EXEC之后会取消对所有键的监控,也可以通过UNWATCH来取消监控。
过期时间
8、设置过期时间
EXPIRE key seconds
redis可以为每一个顶层数据结构(5种)的键设置过期时间,过期后将自动删除,过期时间为秒,表示还剩多少时间就会删除这个键。返回1表示设置成功,0失败。
9、查看剩余过期时间
TTL key
当键不存在时返回-2,没有过期时间返回-1。
10、取消过期时间
PERSIST key
除此之外,使用SET或GETSET(先设置新的值,在返回旧的值)为键赋值,也会清除过期时间,需要再次设置,其他对键值操作的命令不会对过期时间产生影响。
11、PEXPIRE key millisecond
以毫秒为单位设置过期时间
12、以UNIX时间设置过期时间
EXPIREAT key seconds
PEXPIREAT key millisecond
13、如果WATCH命令监控了一个有过期时间的键,该键时间到期自动删除不会被WATCH认为该键被改变。
14、过期时间这一特性使redis可以当作缓存使用,当缓存的数量越多,达到redis最大可用内存大小(通过配置文件的maxmemory修改),将会根据maxmemory-policy参数指定的策略进行删除,直到占用的内存小于限制。
redis支持的淘汰键的规则
规则 | 说明 |
volatile-lru | 使用LRU算法删除一个键(只对设置了过期时间的键) |
allkeys-lru | 使用LRU算法删除一个键 |
volatile-random | 随机删除一个键(只对设置了过期时间的键) |
allkeys-random | 随机删除一个键 |
volatile-ttl | 删除过期时间最近的一个键 |
noeviction | 删除过期时间最近的一个键 |
LRU(Least Recently Used)算法即”最近最少使用“,其认为最近最少使用的键在未来一段时间内也不会被用到。
排序 SORT
15、对集合,列表,有序集合排序
SORT key [ALPHA] [DESC] [LIMIT offset count]
对有序集合进行排序时,会忽略元素的分数,默认情况下,SORT命令会尝试将所有元素转换成双精度浮点数进行排序,转换失败则排序失败。ALPHA参数用于指明使用字典顺序排序;DESC参数指明按照从大到小排序,因为默认是从小到大;LIMIT参数用来返回指定范围的结果,这两个参数的用法与SQL一致。
16、by参考键
BY
参考键可以是字符串类型或散列类型(表示为键名->字段名)的某一个字段,如果SORT命令提供了by参数,那么它将不再按照元素自身的值进行排序,而是用每个元素的值替换参考键中第一个" * "并获取其值,当作排序的依据,如:
SORT sortbylist BY itemscore:* (sortbylist为list类型,itemscore:*为字符串类型)
SORT posts BY post:*->time (posts为集合类型,post:*->time是散列类型的一个字段)
当参考键不包含" * "时,将不会执行排序操作;当参考键的值相同时,会根据元素本身做比较;当参考键不存在时,参考键的值默认为0;当参考键为散列类型时," * "只能出现在" -> "之前,否则" * "将不会被替换,会被认为是一个字段名,即常量。
17、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。
18、store参数
STORE
默认情况SORT会直接返回排序结果,使用STORE参数将会把排序结果存储到一个列表类型的键中,如果该键存在则会覆盖,如:
SORT posts BY post:*->time DESC GET post:*->title GET # STORE result
19、sort的性能
SORT 命令复杂度为O(n+mlog(m)),n表示待排序的键中元素的数量,m代表要返回的元素的数量。减少排序的样本数量(n),使用LIMIT减少获取排序结果的数量(m),使用STORE将结果缓存都可以提高sort的性能。
消息通知
20、以阻塞方式获取列表中的值
BLPOP listkey timeout
BRPOP listkey timeout
当列表为空时,这个连接将会阻塞,imeout参数为超时时间,超出此时间仍没有元素则返回nil,为0表示立刻返回;当获得元素后,返回两个值,分别是键名和元素值。
可用于实现简单消息队列。
21、优先队列的实现
BLPOP key [key ...] timeout
BRPOP key [key ...] timeout
阻塞方式获取队列中的元素完整命令如上所述,可以弹出多个键中的元素,如果每一个键都没有元素则返回nil,否则,会按照键从左到右的顺序弹出一个元素。
22、“发布订阅”模式
此模式中有发布者和订阅者两种角色,发布者可以往指定频道发布消息,所有订阅此频道的订阅者都会收到消息。
23、发布消息
PUBLISH channel message
返回值为收到消息的订阅者数量,消息不会被缓存,新的订阅者收不到旧的消息。
24、订阅频道
SUBSCRIBE channel [channel ...]
可以同时订阅多个频道,执行订阅命令后会进入订阅模式,此模式下只能执行属于“发布/订阅”模式下的4个命令(SUBSCRIBE 、UNSUBSCRIBE、PSUBSCRIBE 、PUNSUBSCRIBE )。
订阅状态的客户端只会收到3种命令,每种命令都有3个值,第一个值是消息类型,根据类型的不同,第二三个值意义也不同。
a、subsrcibe 订阅成功的反馈,参数分别是订阅成功的频道名和订阅当前频道的客户端数量。
b、message 收到订阅消息,参数为产生消息的频道和消息内容。
c、unsubscirbe 成功取消某个订阅频道,参数为频道名和当前客户端订阅的频道数量,当此值为0时,客户端会退出订阅状态。
25、取消订阅与按照规则订阅
UNSUBSCRIBE [channel ...]
PSUBSCRIBE
UNPSUBSCRIBE
取消订阅的命令如果不带参数,会取消所有订阅的频道;按规则订阅支持订阅名称符合glob风格通配符格式的频道;按规则取消用法类似。
按规则订阅时会出现重复订阅一个频道的情况,也会重复收到消息,重复消息(第二条开始)的消息类型为pmessage,发布者也会收到有多个客户端收到消息的回复;取消订阅时,通过普通订阅和按规则订阅的频道不会互相影响(不会出现互相取消的情况),同时在取消按规则订阅时,不再执行通配展开,而是字符串匹配,只会取消按规则订阅时的原字符串对应的频道。
管道
26、redis-cli与redis-server使用TCP连接,发送命令和发送命令的执行结果都需要玩咯传输,这两个部分的耗时称为往返延时。
27、一般情况下,往返延时的数量级上相当于redis执行一个简单命令的执行时间。
28、redis底层通信协议对管道(pipeline)提供了支持,通过管道一次性可以发送多条命令并执行完后一次性将结果返回。
redis入门指南(三)—— 事务、过期时间、SORT命令、消息通知与管道的更多相关文章
- Redis 小白指南(三)- 事务、过期、消息通知、管道和优化内存空间
Redis 小白指南(三)- 事务.过期.消息通知.管道和优化内存空间 简介 <Redis 小白指南(一)- 简介.安装.GUI 和 C# 驱动介绍> 讲的是 Redis 的介绍,以及如何 ...
- Redis入门指南之三(入门)
本节主要介绍Redis的5种数据类型,同时使用Python API来操作Redis,其中python版本为3.5, redis版本为4.0.2. redis-py 的API的使用可以分类为: (1)连 ...
- 《Redis入门指南》笔记
第1章 简介 1.1 历史与发展 2008年 意大利创业公司创始人因对mysql性能不满意,于是他决定开发redis. 2009年 redis初版由他一个人开发完成.redis是"remot ...
- redis入门指南(五)—— 复制与哨兵
写在前面 学习<redis入门指南>笔记,结合实践,只记录重要,明确,属于新知的相关内容. 一.复制 1.在复制中,数据库分为两类,一类主数据库,一类从数据库,主库用来读写,从库用来读,主 ...
- redis入门指南(六)—— 集群
写在前面 学习<redis入门指南>笔记,结合实践,只记录重要,明确,属于新知的相关内容. 配置集群 1.配置集群,集群解决了单点故障以及单台机器内存上限的问题,使用集群时,只需要将配置文 ...
- redis入门指南(四)—— redis如何节省空间
写在前面 学习<redis入门指南>笔记,结合实践,只记录重要,明确,属于新知的相关内容. 节省空间 1.redis对于它所支持的五种数据类型,每种都提供了两种及以上的编码方式去存储(具体 ...
- redis入门指南(七)—— 安全、协议、管理工具及命令属性
写在前面 学习<redis入门指南>笔记,结合实践,只记录重要,明确,属于新知的相关内容. 安全 1.可以使用bind参数绑定一个地址,使redis只接受这个地址的连接. 2.使用requ ...
- redis中的key设置过期时间
EXPIRE key seconds 为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除. 在 Redis 中,带有生存时间的 key 被称为『易失的 ...
- Redis入门指南之一(简介)
1. 简介 Redis是一个开源的.高性能的.基于键值对的缓存与存储系统,通过提供多种键值数据类型来适应不同的场景下的缓存与存储需求.同时Redis的诸多高级功能使其可以胜任消息队列.任务队列等不同的 ...
随机推荐
- 在Xcode11上开发“面向低于iOS13版本的App”时的一些注意点
相关知识: https://blog.csdn.net/BUG_delete/article/details/103699563 'AppDelegate' is only available in ...
- 关于微信小程序的文档-手撸
学习小程序的人如果有vue基础的话应该有很好的帮助作用.没有也关系,反正很简单. 首先理解一个完整的小程序app都有什么页面: pages页面放置所有的页面文件. 一个完整的小程序页面文件包括: in ...
- SpringColud Eureka的服务注册与发现
一.Eureka简介 本文中所有代码都会上传到git上,请放心浏览 项目git地址:https://github.com/839022478/Spring-Cloud 在传统应用中,组件之间的调用,通 ...
- 并发系列(一)——线程池源码(ThreadPoolExecutor类)简析
前言 本文主要是结合源码去线程池执行任务的过程,基于JDK 11,整个过程基本与JDK 8相同. 个人水平有限,文中若有表达有误的,欢迎大伙留言指出,谢谢了! 一.线程池简介 1.1 使用线程池的优点 ...
- show and hide. xp扩展名
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v HideFileExt ...
- opencv视频教程分享
opencv视频教程分享-在线与网盘 https://pan.baidu.com/s/1oAcctlS 密码:i5rd 链接:https://pan.baidu.com/s/1kVJ3iSJ 密码: ...
- SourceTree使用详解(连接远程仓库,克隆,拉取,提交,推送,新建/切换/合并分支,冲突解决)
前言: 俗话说的好工欲善其事必先利其器,Git分布式版本控制系统是我们日常开发中不可或缺的.目前市面上比较流行的Git可视化管理工具有SourceTree.Github Desktop.Tortois ...
- ps学习。
ps软件及教程,这些东西,你应该要花一辈子来消化.
- 如何使用PL/SQL工具批量导出表、存储过程、序列
PLSQL作为Oracle数据库进行操作常用工具,可以很方便的对表以及数据进行处理.工作中如果遇到数据库转移,需要将老数据库中的建表.建序列和存储过程语句导出,然后导入到新的数据库中这样序列号会自动, ...
- HDU 2157 How many ways?【矩阵快速幂】
题目 春天到了, HDU校园里开满了花, 姹紫嫣红, 非常美丽. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这迷人的校园, 葱头决定, 每次上课都走不同的路线 ...