Redis 小白指南(三)- 事务、过期、消息通知、管道和优化内存空间
Redis 小白指南(三)- 事务、过期、消息通知、管道和优化内存空间
简介
《Redis 小白指南(一)- 简介、安装、GUI 和 C# 驱动介绍》 讲的是 Redis 的介绍,以及如何在 Windows 上安装并使用,一些 GUI 工具和自己简单封装的 RedisHelper。
《Redis 小白指南(二)- 聊聊五大类型:字符串、散列、列表、集合和有序集合》讲的是 Redis 中最核心的内容,最常用的就是和数据类型打交道。
目录
- 事务
- 过期时间
- 消息通知
- 管道
- 优化内存空间
事务
事务是一组命令的集合,事务和命令一样都是 Redis 的最小执行单位。即一个事务中的命令,要么都执行,要么都不执行。可以思考关系型数据库中的事务特性 ACID:
(1)原子性(Atomicity):在事务结束时,其中包含的更新处理要么全部执行,要么完全不执行。
(2)一致性(Consistency):事务中包含的处理,要满足数据库提前设置的约束,也称完整性。
(3)隔离性(lsolation):保证不同事务之前互不干扰的特性。
(4)持久性(Durability):事务一旦结束,DBMS 会保证该时点的数据状态得以保存的特性,也称耐久性。
Redis 可以保证一个事务中的命令依次执行而不会被其它命令插入。如:Client A 需要执行多条指令,同时 Client B 也执行多条指令,因为网络传输或者时间等因素造成指令发送到 Redis 服务器的顺序有先后,即有可能会出现 A 发送的指令和 B 发送的指令形成了交叉,使用事务就可以避免这种情况。
遗憾的是,Redis 不支持回滚。
MULTI //开启事务的指令 EXEC //执行事务,依次执行
当客户端发送了 EXEC 的指令后,即使客户端此时突然断开与服务器的链接,事务中的操作依然会依次执行,因为他们都已经被缓存到 Redis 事务的队列中了。
过期时间
1.设置过期时间意味着一段时间后就会删除 redis 中指定的数据。
2.应用场景:限时优惠活动、缓存、学校成绩排名和游戏积分排名定期刷新。
3.命令:
(1)EXPIRE:
EXPIRE key seconds //seconds 参数表示键的过期时间,单位是秒
(2)TTL:查看剩余时间
TTL key
(3)DEL:删除
DEL key
(4)PERSIST:取消键的过期时间设置(将该键切换成永久性质的)
PERSIST key
消息通知
1.什么情况才会使用呢?
答:比如,我们的网站进行一些比较耗时的操作时,如发送邮件、复杂的数据运算和 IO 日志记录等都可以使用,因为这样可以避免阻塞前端页面的渲染,避免用户进行长时间的等待。一般我们会使用多线程和异步进行处理这种耗时操作的问题。
2.什么是消息通知?
答:你可以理解为常说的消息队列,类似设计模式中的生产/消费模式,一边是生产者(producer),一边是消费者(consumer)。生产者负责把要处理的任务丢到队列里,消费者负责取出队列中的任务进行执行。
3.特点:
松耦合:没有语言限制,开发团队可以分别使用不同的开发语言,双方约定好数据的传输格式即可。
易于扩展:消费者可以有多个,部署在多台服务器上,轻松减轻单台服务器的压力。
不过,从大局来看,企业常采用第三方更为专业的 MQ,如 RabbitMQ 替代 Redis 的消息队列机制。《[.NET] RabbitMQ 的行为艺术》
管道
客户端和 Redis 采用的是 TCP 进行连接。
我们对 Redis 发送一条指令后进行等待,完毕后返回执行结果;接着,发送第二条指令,再次等待 Redis 执行完毕后的执行结果;第三次发送指令 ... ...。
虽然现在的网络带宽已经足够快,不过如果执行的命令过多,性能消耗依然是挺明显的。
管道机制,它把多条命令一次性组合起来发送到 Redis 服务器执行,再返回所有的执行结果,与之前的相比减少了两端网络请求的次数从而提高了性能。
优化内存空间
虽然在现在这个年代,内存条的价格已经非常便宜,但相对于硬盘来说,价格依然非常高昂,进行内存空间成本的控制和资源的有效利用也是一个迫切的主题。
1.精简键名和键值。不过需要自己把握精简的尺度,因为要基于可读性的基础上进行精简,过于精简不易于维护也容易造成命名冲突。
2.选择合适的数据类型进行存储。
3.定时清理(删除)无效的缓存数据,或者设置自动过期时间。
4.配置 Redis 可用的最大空间大小,进行资源的合理分配。
系列
《Redis 小白指南(一)- 简介、安装、GUI 和 C# 驱动介绍》
《Redis 小白指南(二)- 聊聊五大类型:字符串、散列、列表、集合和有序集合》
《Redis 小白指南(三)- 事务、过期、消息通知、管道和优化内存空间》
【博主】反骨仔
【原文】http://www.cnblogs.com/liqingwen/p/6920680.html
【GitHub】https://github.com/liqingwen2015/Wen.Helpers/blob/master/Wen.Helpers.Common/Redis/RedisHelper.cs
【参考】《Redis 入门指南》
Redis 小白指南(三)- 事务、过期、消息通知、管道和优化内存空间的更多相关文章
- Redis系列二之事务及消息通知
一.事务 Redis中的事务是一组命令的集合.一个事务中的命令要么都执行,要么都不执行. 1.事务简介 事务的原理是先将一个事务的命令发送给Redis,然后再让Redis依次执行这些命令.下面看一个示 ...
- Redis 小白指南(一)- 简介、安装、GUI 和 C# 驱动介绍
Redis 小白指南(一)- 简介.安装.GUI 和 C# 驱动介绍 目录 简介 安装 入门指令 GUI 工具 C# 驱动介绍 简介 ANSI C 编写,开源,基于内存,可持久化,一个键值对的数据库, ...
- Redis 小白指南(二)- 基础命令和五大类型:字符串、散列、列表、集合和有序集合
Redis 小白指南(二)- 基础命令和五大类型:字符串.散列.列表.集合和有序集合 引言 目录 基础命令 字符串类型 散列类型 列表类型 集合类型 有序集合类型 基础命令 1.获得符合规则的键名列表 ...
- Redis 小白指南(四)- 数据的持久化保存(草稿)
Redis 小白指南(四)- 数据的持久化保存 简介 因为 redis 将数据保存在内存中,很容易诱发的一个问题就是,程序崩溃或服务器重启等情况如何保证数据的正常存储. 当我们以 redis 作为主数 ...
- Redis 小白指南(二)- 聊聊五大类型:字符串、散列、列表、集合和有序集合
Redis 小白指南(二)- 聊聊五大类型:字符串.散列.列表.集合和有序集合 引言 开篇<Redis 小白指南(一)- 简介.安装.GUI 和 C# 驱动介绍>已经介绍了 Redis 的 ...
- Redis 学习(三) —— 事务、消息发布订阅
一.Redis事务 Redis 提供的事务机制与传统的数据库事务有些不同,传统数据库事务必须维护以下特性:原子性(Atomicity), 一致性(Consistency),隔离性(Isolation) ...
- Redis自学笔记:4.4进阶-消息通知
4.4消息通知 4.4.1任务队列 传递任务的队列.与任务队列进行交互的实体有两类,一类是生产者,一类是消费者. 生产者将需要处理的任务放入任务队列中,二消费者不断从任务队列中读入任务 信息并执行. ...
- spring中订阅redis键值过期消息通知
1.首先启用redis通知功能(ubuntu下操作):编辑/etc/redis/redis.conf文件,添加或启用以下内容(过期通知): notify-keyspace-events Ex 或者登陆 ...
- redis深入学习(三)-----事务、主从复制、jedis
reids事务 概念 可以一次执行多个命令,本质是一组命令的集合.一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞 作用 一个队列中,一次性.顺序性.排他性的执行一系列 ...
随机推荐
- Mybatis(四) 高级映射,一对一,一对多,多对多映射
天气甚好,怎能不学习? 一.单向和双向 包括一对一,一对多,多对多这三种情况,但是每一种又分为单向和双向,在hibernate中我们就详细解析过这单向和双向是啥意思,在这里,在重复一遍,就拿一对多这种 ...
- Java: 隐性赋值(Implicit Assignment)
初学 Java 时,我总是记不住如何区别 i++ 和 ++i.在<算法(第四版)>一书中第16页,作者提到: ** ++i ** is the same as i = i+1, and h ...
- 关于 __proto__和prototype的一些理解
var Person = function(name) {}; Person.prototype.say = function() { console.log("Person say&quo ...
- 关于mysql查询区分大小写
使用查询语句时,携带collate utf8_bin 在SQL语句中使用collate 使用collate子句,能够为一个比较覆盖任何默认校对规则.collate可以用于多种SQL语句中,比如wher ...
- 【转】JDBC学习笔记(3)——复习和练习
转自:http://www.cnblogs.com/ysw-go/ 复习部分 一.获取数据库连接 1)方式一 1 // 获取数据库连接 2 @Test 3 public void testGetCon ...
- Python数据处理——numpy_1
python中数据处理最基础的一个包--numpy.它能很好的进行数据准备,类似与R语言中的数据框(DataFrame)一样.今天,就来从最基础的开始学习. import numpy as npdat ...
- 1.1Hibernate持久化类和Hibernate持久化对象状态
一.持久化对象po类 1.po定义 PO,是Persistent Object的缩写,是持久化类.PO是由PO=POJO+hbm映射配置组成. 2.通俗理解 PO类即持久化类,其实就是一个普通的Jav ...
- 《分布式Java应用之基础与实践》读书笔记三
对于大型分布式Java应用与SOA,我们可以从以下几个方面来分析: 为什么需要SOA SOA是什么 eBay的SOA平台 可实现SOA的方法 为什么需要SOA 第一个现象是系统多元化带来的问题,可 ...
- PHP学习笔记-2
PHP 是一门弱类型语言: 在上面的实例中,我们注意到,不必向 PHP 声明该变量的数据类型.(跟Javascript很像啊!) PHP 会根据变量的值,自动把变量转换为正确的数据类型. 在强类型的编 ...
- Java并发包分析——BlockingQueue
之前因为找实习的缘故,博客1个多月没有写了.找实习的经历总算告一段落,现在重新更新博客,这次的内容是分析Java并发包中的阻塞队列 关于阻塞队列,我之前是一直充满好奇,很好奇这个阻塞是怎么实现.现在我 ...