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在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个完好无损的桶上凿开了一个洞。

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

最新文章

  1. android 在使用ViewAnimationUtils.createCircularReveal()无法兼容低版本的情况下,另行实现圆形scale动画
  2. Java事务处理全解析(一)——Java事务处理的基本问题
  3. [转载]Spring Beans Auto-Wiring
  4. 从零开始学android开发-详细谈谈intent的startActivityForResult()方法
  5. 推荐:室内定位API - indoor Location API
  6. Lucene4.3入门
  7. DevExpress设置默认皮肤及各种皮肤样式
  8. 1.ansible基本参数介绍
  9. 理解、学习与使用 JAVA 中的 OPTIONAL<转>
  10. [Day4]Switch语句、数组、二维数组
  11. SP--report存储过程
  12. JPress的CMS系统在Window下的部署和使用
  13. metasploit 利用MS08-067渗透攻击xp系统全过程
  14. python开发_tkinter_单选菜单_不可用菜单操作
  15. cocos2d-x 3.0 将cpp-tests编译成Android版本号APK文件
  16. 工作总结 public DateTime? CollectionTime 可空类型 Code First
  17. zoj 1760 查找
  18. m2014-c->c模拟java的hashmap容器类
  19. 剑指offer——面试题17:打印从1到最大的n位数
  20. BZOJ1878:[SDOI2009]HH的项链——题解

热门文章

  1. C++学习书籍推荐
  2. Linux.中断处理.入口x86平台entry_32.S
  3. 63.Perfect Squares(完美平方数)
  4. 设计模式--简单工厂(Simple Factory)
  5. Hadoop本地环境安装
  6. β版本apk下载地址及源代码github地址
  7. python安装pika模块rabbitmq
  8. C语句模拟多任务实例
  9. HDU-4609(FFT/NTT)
  10. UNP学习第九章 基本名字与地址转换