redis是什么

  redis是一种支持key-value等多种数据结构的存储系统,可用于缓存,事件发布,消息队列等场景,支持多种数据类型

string、hash、list、set、zset。而且基于内存,可持久化,并且能够通过sentinel哨兵和自动分区cluster实现高可用。

  补充:redis中list集合是双端循环列表(双向列表),可以当作队列使用,也能当作堆栈使用。

redis的持久化策略

  redis的持久化策略有两种:

    RDB模式:定期将内存中的数据进行持久化,实际上就是为内存做快照,备份速度快,但有可能会丢失少量的数据。

    AOF模式:可以实时备份,安全性更好,但持久化速度较慢,AOF持久化文件的体积很大,数据恢复时需要耗费大量时间。

  RDB模式是默认开启的,若两种模式同时开启优先采用AOF模式。

redis分片技术

  使用分片可以实现内存数据的动态扩容,每台redis节点中尽可能保存1/n的数据量,防止数据丢失。

缺点是若有一台机器宕机,则整个分片将不能正常运行。

  分片中采用的hash一致性算法:

    数据如何保存:

      1.将节点的ip + 算法确定唯一哈希值,之后在内存中确定节点的位置

      2.保存数据时,根据key进行hash运算,确定唯一位置

      3.根据当前key的位置顺时针查找最近的node节点进行挂载

    该算法的特性: 均衡性:引入虚拟节点,让数据均匀分片

           单调性:如果node节点新增,能动态实现数据的迁移

           分散性:数据分布在各个节点(解决方案:一般在进行架构设计时,为了避免数据的分散,会要求使用全部的内存空间)

redis哨兵

  原理:通过哨兵监控主机的状态,获取主机和丛机的信息,通过心跳检测机制,如果3次连接没有响应,则会断定主机宕机,哨兵会从丛机当中选举一台充当主机,

旧的主机修复完成后,会充当丛机等待下次选举。

redis常见名词及解决方案

  脑裂: 因为选举机制投票平票导致出现多台主机称之为脑裂。

  解决方案:增加节点的个数。

  缓存穿透: 缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,我们数据库的 id 都是1开始自增上去的,如发起为id值为 -1 的数据或 id 为特别大不存在的数据。

        这时的用户很可能是攻击者,攻击会导致数据库压力过大,严重会击垮数据库。

  解决方案: 利用互斥锁,缓存失效时,先去获取锁,得到锁之后再去请求数据库,没有得到锁的就休眠一段时间。

        Redis还有一个高级用法布隆过滤器(Bloom Filter)这个也能很好的防止缓存穿透的发生,他的原理也很简单就是利用高效的数据结构和算法快速判断出你这个

       Key是否在数据库中存在,不存在你return就好了,存在你就去查了DB刷新KV再return。

  缓存雪崩:在高并发下,大量的缓存key在同一时间失效,导致大量的请求落到数据库上,如活动系统里面同时进行着非常多的活动,但是在某个时间点所有的活动缓存全部过期。

  解决方案:给缓存失效时间设置加上一个随机值,避免数据集体失效或者做缓存预热。

  缓存击穿:缓存击穿是指一个Key,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个Key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个完好无损的桶上凿开了一个洞。

  解决方案:设置数据永远不过期。或者加上互斥锁就能搞定了,或者做缓存预热。

简单了解Redis的更多相关文章

  1. CentOS6.4 安装OpenResty和Redis 并在Nginx中利用lua简单读取Redis数据

    1.下载OpenResty和Redis OpenResty下载地址:wget http://openresty.org/download/ngx_openresty-1.4.3.6.tar.gz Re ...

  2. 简单的redis缓存操作(get、put)

    简单的redis缓存操作(get.put) 本文介绍简单的redis缓存操作,包括引入jedisjar包.配置redis.RedisDao需要的一些工具.向redis中放数据(put).从redis中 ...

  3. Go语言之从0到1实现一个简单的Redis连接池

    Go语言之从0到1实现一个简单的Redis连接池 前言 最近学习了一些Go语言开发相关内容,但是苦于手头没有可以练手的项目,学的时候理解不清楚,学过容易忘. 结合之前组内分享时学到的Redis相关知识 ...

  4. 自己写了个简单的redis分布式锁【我】

    自己写了个简单的redis分布式锁 [注意:此锁需要在每次使用前都创建对象,也就是要在线程内每次都创建对象后使用] package redis; import java.util.Collection ...

  5. 【spring boot】SpringBoot初学(8)– 简单整合redis

    前言 到目前为止,把项目中需要用到的:properties读取.数据源配置.整合mybatis/JdbcTemplate.AOP.WebService.redis.filter.interceptor ...

  6. SpringBoot简单整合redis

    Jedis和Lettuce Lettuce 和 Jedis 的定位都是Redis的client,所以他们当然可以直接连接redis server. Jedis在实现上是直接连接的redis serve ...

  7. 简单实现Redis缓存中的排序功能

    1.在实现缓存排序功能之前,必须先明白这一功能的合理性.不妨思考一下,既然可以在数据库中排序,为什么还要把排序功能放在缓存中实现呢?这里简单总结了两个原因:首先,排序会增加数据库的负载,难以支撑高并发 ...

  8. 高并发简单解决方案————redis队列缓存+mysql 批量入库(ThinkPhP)

    问题分析 问题一:要求日志最好入库:但是,直接入库mysql确实扛不住,批量入库没有问题,done.[批量入库和直接入库性能差异] 问题二:批量入库就需要有高并发的消息队列,决定采用redis lis ...

  9. 一个简单的Redis结合Spring MVC架构以及实现过程

    为了加快开发人员对公司项目的理解.更加容易入手和对公司项目的整体把控. 整体框架 首先介绍公司项目的整体框架,闲话少说,直接上图 整体性能分析 这就是公司的一个整体的架构,为了开发人员对架构的侧重点的 ...

  10. 做个简单的Redis监控(源码分享)

    Redis监控 Redis 是目前应用广泛的NoSQL,我做的项目中大部分都是与Redis打交道,发现身边的朋友也更多人在用,相对于memcached 来说,它的优势也确实是可圈可点.在随着业务,数据 ...

随机推荐

  1. [BOI 2008]Elect 选举

    题目描述 N个政党要组成一个联合内阁,每个党都有自己的席位数. 现在希望你找出一种方案,你选中的党的席位数要大于总数的一半,并且联合内阁的席位数越多越好. 对于一个联合内阁,如果某个政党退出后,其它党 ...

  2. Cocos2d之FlyBird开发---简介

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. 开发FlyBird其实非常的简单,在游戏的核心部分,我们需要实现的只有: 创建一个物理世界(世界设置重力加速度) 在物理世界中添加一个动态 ...

  3. bash 中的特殊变量

    bash 中的特殊变量 变量 说明 ------------------------------------ $0 当前脚本的文件名 $n 第n个位置参数 $* 传递给脚本或函数的所有参数,$*会将这 ...

  4. CentOS7下Docker与.net Core 2.2

    一.使用 yum 安装(CentOS 7下) Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker . 通过 una ...

  5. echarts学习思路及常用属性记录

         此篇博文分享自己对于入门学习echart的思路及对常见组件的用法记录,如serise.data和坐标轴对应关系,多个坐标轴,多个grid的对齐,tooltip的超出处理,坐标轴/toolti ...

  6. eclipse远程调试Tomcat方法(转)

    转自:http://blog.csdn.net/afgasdg/article/details/9236877 1.Linux中配置tomcat在catalina.sh中添加如下CATALINA_OP ...

  7. Java集合框架是什么?说出一些集合框架的优点?

    每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector.Stack.HashTable和Array. 随着集合的广泛使用,Java1.2提出了囊括所有集合接口.实现和算法的集合框架.在 ...

  8. node快速起web服务器

    首选,安装http-server模块 npm install http-server -g 在需要打开的静态页面的目录下,开启服务即可 http-server

  9. mui-popover显示、隐藏弹出菜单的方法

    一.mui-popover要显示.隐藏弹出菜单,可使用锚点方式. <div id="popover" class="box mui-popover mui-popp ...

  10. 如何在cmd中启动MongoDB服务器和客户端

    1 先将MongoDB的bin路径添加到环境变量中 2 打开cmd输入mongod 开启MongoDB服务器 3 输入mongo开启MongoDB客户端