一.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. egg源码浅析一npm init egg --type=simple

    要egg文档最开始的时候,有这样的几条命令: 我们推荐直接使用脚手架,只需几条简单指令,即可快速生成项目: $ mkdir egg-example && cd egg-example ...

  2. Jmeter设置字体大小

    Jmeter5.0原配置字体很小,需要更改其配置 在apache-jmeter-5.0/bin/下的jmeter.properties文件中添加如下内容: jmeter.hidpi.mode=true ...

  3. mysql数据库指定ip远程访问

    1.登录 mysql -u root -p 之后输入密码进行登陆 2.权限设置及说明 2.1添加远程ip访问权限 GRANT ALL PRIVILEGES ON *.* TO 'root'@'192. ...

  4. Java NIO学习笔记九 NIO与IO对比

    Java NIO与IO Java nio 和io 到底有什么区别,以及什么时候使用nio和io,本文做一个比较. Java NIO和IO之间的主要区别 下表总结了Java NIO和IO之间的主要区别, ...

  5. C2B电商三种主要模式的分析_数据分析师

    C2B电商三种主要模式的分析_数据分析师 在过去的一年中电商领域血雨腥风,尤其是天猫.京东.苏宁.当当.易讯等B2C电商打得不亦乐乎.而随着B2C领域竞争进入白热化阶段,C2B模式也在天猫" ...

  6. const成员变量

    #include <iostream> using namespace std; class A { public: A(int size) : SIZE(size) {}; privat ...

  7. React Native解决安卓图片被挤压

    Bug如下图所示: iOS显示正常,而安卓出现图片被挤压上去. 最后的解决方法: 比如你的 图片 是 750 x 513 那么 你设置样式的时候 width 为 屏幕的宽 ,高度为 屏幕的 宽 / ( ...

  8. Java内部类(1):概述

    > 将一个类的定义放在另一个类的定义内部,这就是内部类. > 使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内 ...

  9. koa2中间件

    在我看来,前端框架的中间件的思想来源于传统后端的切面编程(AOP)思想,比如我们常见的身份校验(JWT). axios的拦截器也是基于这种程序设计模式的. 在koa中,实际上是由一个数组对象来保存所有 ...

  10. MongoDB导入文件夹(内含json和bson文件)

    1. 使用mongo命令将数据库删除: mongo命令: use db_name; db.dropDatabase() 2. 导入(指定文件夹)数据: linux命令: mongorestore -d ...