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. HDU 5183 Negative and Positive (NP) (手写哈希)

    题目链接:HDU 5183 Problem Description When given an array \((a_0,a_1,a_2,⋯a_{n−1})\) and an integer \(K\ ...

  2. android ndk 编译 libevent

    1. 下载 libevent 2.1.8 版本 https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/ ...

  3. Selenium:多窗口切换(获取窗口句柄handle)

    我们在操作网页的时候,点击有些页面的链接,会重新打开一个窗口,我们要在新页面上操作,就得切换窗口 比如在百度首页的登录框点击注册,会重新打开一个注册的新页面,要在新页面注册,就得先切进新页面 那我们怎 ...

  4. 2018-8-10-git-push-错误-hook-declined-

    title author date CreateTime categories git push 错误 hook declined lindexi 2018-08-10 19:16:52 +0800 ...

  5. smb.conf - Samba组件的配置文件

    总览 SYNOPSIS smb.conf是Samba组件的配置文件,包含Samba程序运行时的配置信息.smb.conf被设计成可由swat (8)程序来配置和管理.本文件包含了关于smb.conf的 ...

  6. 【转】Java里如何实现线程间通信

    正常情况下,每个子线程完成各自的任务就可以结束了.不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间通信了. 本文涉及到的知识点:thread.join(), object.w ...

  7. 静态部署TOMCAT

    常见部署方式:静态部署和容器化部署 一.下载tomcat安装包 下载地址:https://tomcat.apache.org/download-90.cgi 图上是显示最新版本,而我下载的是9.0.8 ...

  8. 从Linux传输apk包到Windows系统,一周的心路历程,累

    1.在Windows服务器上打开一个cmd窗口,执行脚本,只适用于Windows系统 --NO String cmd = "cmd.exe /c adb -s f223413 install ...

  9. BZOJ5205 [CodePlus 2018 3 月赛]白金元首与莫斯科

    传送门 emm在雅礼集训的时候听到的一道题 上来就觉得是插头dp 最后果然是轮廓线状压233 我们简化一下题意. 有一个n*m的网格,每个格子是空地或障碍物,询问把每一个空地看成障碍物的情况下,用1* ...

  10. leetcode-166周赛-5280-用户分组

    题目描述: 自己的提交: class Solution: def groupThePeople(self, groupSizes: List[int]) -> List[List[int]]: ...