一.Redis效率高的原因

  众所周知,Redis常用来做缓存,从而提高项目QPS(每秒查询率)。QPS = 并发量 / 平均响应时间

  然而其效率高的原因包含但不仅限于如下几点:

    1.Redis基于内存,绝大部分操作都是直接对内存的操作,执行效率高。官方提供的数据是可以达到100000+的QPS

    2.数据结构简单,因此对数据的操作也简单

    3.采用单线程处理请求,将多个请求串行处理,避免线程创建销毁的开销和线程上下文切换的开销

    4.采用I/O多路复用,且是非阻塞IO

二.通过Redis实现分布式锁

  1.通过使用setnx key value方式:

    如果key不存在,则创建并赋值,如果key存在,则设置失败,因此可以保证数据的安全性。可以通过expire来设置该key的生存时间,当超过生存时间后该key和value会被删除。

    附:该方式设置成功返回1,失败返回0,时间复杂度为O(1),缺点是每次操作都需要setnx和expire两个步骤,原子性得不到满足,在setnx之后和expire之前的过程中甚至可能出现死锁等情况。

  2.通过set key value ex px nx/xx方式:

    ex和px是过期时间,单位是秒和毫秒。nx是当key不存在的时候进行设置操作,而xx是当key存在的时候进行设置操作。该方法保证了原子性,提高了安全性,但多个对象同时过期的时候可能会造成短暂的卡顿,可以给每个key加上一个随机值来解决该卡顿问题。

三.通过Redis实现异步队列

  1.生产者消费者模式

    使用List作为队列,通过rpush将消息加入队列,通过lpop将消息从队列中取出(先进先出),从而实现异步队列。通常将rpush看做生产者,将lpop看做消费者,当消费者获得数据后,数据将消失。

    该方式的缺点是:可能队列中没有消息,却lpop数据,并且生产者和消费者的关系是一对一的,一个生产者生产的数据只能被一个消费者消费。

  2.发布订阅模式

    发布者:publish key value

    订阅者:subscribe key

    该方式的缺点是:消息发布是无状态的,无法保证数据可达,对于发布者来说,消息发布就等同于消息丢失,无法确认订阅者是否收到消息。例如:在发布者发布消息的时候,订阅者下线了,重新上线的订阅者无法接受到发布者刚才发布的消息。

四.Redis持久化方式

  Redis默认开启了RDB存储方式进行持久化,以一个dump.rdb文件存。

    1.RDB持久化:

      它开启持久化条件是在一定时间内,key和value达到一定的存储次数,可以在redis.conf中的save中设置,如下图

      

      附:如果在配置文件中将stop-writes-on-bgsave-error设置为yes,那么当备份进程出错时,就会停止接收写入操作,以此保证持久化数据一致

    2.AOF持久化

      开启:在Redis.conf文件中,将appendonly设置为yes

    3.RDB-AOF混合模式

      使用BGSAVE做镜像全量持久化,AOF做增量持久化

关于Redis的其他介绍可以参考我的上一篇文章https://www.cnblogs.com/ywb-articles/p/10660071.html

如果想深入了解Redis,可以参考官方文档http://redisdoc.com/index.html

Redis总结2的更多相关文章

  1. 使用redis构建可靠分布式锁

    关于分布式锁的概念,具体实现方式,直接参阅下面两个帖子,这里就不多介绍了. 分布式锁的多种实现方式 分布式锁总结 对于分布式锁的几种实现方式的优劣,这里再列举下 1. 数据库实现方式 优点:易理解 缺 ...

  2. Ignite性能测试以及对redis的对比

    测试方法 为了对Ignite做一个基本了解,做了一个性能测试,测试方法也比较简单主要是针对client模式,因为这种方法和使用redis的方式特别像.测试方法很简单主要是下面几点: 不作参数优化,默认 ...

  3. mac osx 安装redis扩展

    1 php -v查看php版本 2 brew search php|grep redis 搜索对应的redis   ps:如果没有brew 就根据http://brew.sh安装 3 brew ins ...

  4. Redis/HBase/Tair比较

    KV系统对比表 对比维度 Redis Redis Cluster Medis Hbase Tair 访问模式    支持Value大小 理论上不超过1GB(建议不超过1MB) 理论上可配置(默认配置1 ...

  5. Redis数据库

    Redis是k-v型数据库的典范,设计思想及数据结构实现都值得学习. 1.数据类型 value支持五种数据类型:1.字符串(strings)2.字符串列表(lists)3.字符串集合(sets)4.有 ...

  6. redis 学习笔记(2)

    redis-cluster 简介 redis-cluster是一个分布式.容错的redis实现,redis-cluster通过将各个单独的redis实例通过特定的协议连接到一起实现了分布式.集群化的目 ...

  7. redis 学习笔记(1)

    redis持久化 snapshot数据快照(rdb) 这是一种定时将redis内存中的数据写入磁盘文件的一种方案,这样保留这一时刻redis中的数据镜像,用于意外回滚.redis的snapshot的格 ...

  8. python+uwsgi导致redis无法长链接引起性能下降问题记录

    今天在部署python代码到预生产环境时,web站老是出现redis链接未初始化,无法连接到服务的提示,比对了一下开发环境与测试环境代码,完全一致,然后就是查看各种日志,排查了半天也没有查明是什么原因 ...

  9. nginx+iis+redis+Task.MainForm构建分布式架构 之 (redis存储分布式共享的session及共享session运作流程)

    本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,上一篇分享文章制作是在windows上使用的nginx,一般正式发布的时候是在linux来配 ...

  10. windows+nginx+iis+redis+Task.MainForm构建分布式架构 之 (nginx+iis构建服务集群)

    本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,由标题就能看出此内容不是一篇分享文章能说完的,所以我打算分几篇分享文章来讲解,一步一步实现分 ...

随机推荐

  1. mybatis工作流程

    1)通过Reader对象读取src目录下的mybatis.xml配置文件(该文本的位置和名字可任意) 2)通过SqlSessionFactoryBuilder对象创建SqlSessionFactory ...

  2. 为什么HashMap继承了AbstractMap还要实现Map?

    前言 之前看源码一直忽略了这个现象,按理说HashMap的父类AbstractMap已经实现了Map,它为什么还要实现一次呢?遂上网查了一下,背后原因让人大跌眼镜. 原因 这是类库设计者的拼写错误,其 ...

  3. 前端构建工具gulp使用 (转)

    http://www.cnblogs.com/starof/p/5194622.html 前端自动化流程工具,用来合并文件,压缩等. Gulp官网 http://gulpjs.com/ Gulp中文网 ...

  4. 安装k8s-1master多node节点

    卸载比较新的18.3版本,安装17.03版本 删除旧版本 sudo yum remove docker \ docker-client \ docker-client-latest \ docker- ...

  5. Oracle11gR2之ORA-01034、ORA-27101、ORA-00119、 ORA-00132

    昨天安装的oracel,今天用navicat连接oracel出现以下错误: ORA-01034: ORACLE not available ORA-27101: shared memory realm ...

  6. 【JVM学习笔记】字节码文件结构实例

    上一篇笔记的内容大部分没有实际动手操作,因此决定完成这个完整的练习并记录下来. 另注,idea环境下有jclasslib插件用于更好的查看类似于javap结果的内容. 源代码如下: package c ...

  7. .NET中的简单的并行

    https://www.cnblogs.com/hdwgxz/p/6129419.html https://www.cnblogs.com/hueychan/p/10575907.html

  8. vue-wechat-title动态修改title

    在使用Vue制作项目的过程中,发现title没有变化 所以使用vue-wechat-title插件动态修改tilte 一.安装 npm vue-wechat-title --save 二.引入和使用 ...

  9. Docker踩坑小记

    Docker是一个开放平台用于快速开发.分发和部署应用程序.   Docker是一种容器管理技术.   解决头疼问题原则:回归最简单的方式来.确保最初级的方案没有错误. 安装 docker安装很简单, ...

  10. THUSC2016

    补退选 Luogu LOJ BZOJ 比较裸. 建一棵Trie树,记录一下每个节点的\(sum\)表示经过该点的字符串个数,每次暴力插入.删除. 同时每个节点维护一个vector,记录一下这个点的\( ...