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. 嵌入式C语言3.2 关键字---自定义数据类型

    1. struct 结构体 基本语法 struct myabc{ unsigned int a; unsigned int b; unsigned int c; unsigned int d; } 调 ...

  2. BZOJ 1779. [Usaco2010 Hol]Cowwar 奶牛战争

    传送门 考虑构建网络流模型 把一个流量看成一只奶牛的攻击过程,那么答案就是最大流 因为每只奶牛只能操作一波,所以构造分层图,一层相当于一步 第一层就是初始状态,从 $S$ 向所有 $J$ 奶牛连一条流 ...

  3. jQuery封装轮播图插件

    // 布局要求,必须有一个容器,图片和两个按钮,布局方式自定,小圆点样式固定 // <div class="all"> // <img src="img ...

  4. cglib代理与jdk动态代理示例

    先看基于jdk实现的动态代理实现例子 1.先声明一个接口类 public interface UserService{ public String getName(String msg); } 2.实 ...

  5. 【leetcode】207. Course Schedule

    题目如下: There are a total of n courses you have to take, labeled from 0 to n-1. Some courses may have ...

  6. Ubuntu备份与恢复

    在使用Ubuntu之前,相信很多人都有过使用Windows系统的经历.如果你备份过Windows系统,那么你一定记忆犹新:首先需要找到一个备份工具(通常都是私有软件),然后重启电脑进入备份工具提供的软 ...

  7. Steup Factory 操作注册表

    //判断注册表是否存在,不存在就创建 result = Registry.DoesKeyExist(HKEY_CURRENT_USER, "SOFTWARE\\MyTestApp" ...

  8. I2C自编设备驱动设计

    一.自编设备驱动模型 at24.c: static int __init at24_init(void) { io_limit = rounddown_pow_of_two(io_limit); re ...

  9. QT多线程学习

    一.想要使用Qthread必须先创建,继承Qthread的类. #ifndef THREADTEST_H #define THREADTEST_H #include <QThread> # ...

  10. Python每日一题 005

    任一个英文的纯文本文件,统计其中的单词出现的个数. 代码 # coding:utf-8 import re def get_word(filename): fp=open(filename," ...