redis概述

缓存是如何实现高性能的
当第一次查询的时候,缓存里面没有数据,回去数据库查,然后存入缓存,当再去查询的时候,或者是查询相同数据的时候,就不用去数据库里面查了,直接去缓存里面找,大大提高了效率,如果这个信息改了的话,我们只需要将缓存里的数据跟数据库里的数据同步一下就行了。

缓存是如何实现高并发的
高峰期的时候有5000个请求,如果缓存里面有数据,就走缓存,比如4000个走缓存,1000个请求走数据库,这就避免了数据库宕机的可能新,缓存是走内存的,不是走磁盘,是可以支持高并发的

redis单线程模型
核心:文件事件处理器
客户端与redis是基于socket进行通信的,当客户端发送set k v请求的时候,会产生AE_READABLE事件,IO多路复用程序会监听这个事件压到队列里面,然后文件事件分派器会找命令请求处理器从socket中读出来key和value,在自己的内存中完成设置

为啥redis单线程模型效率这么高
1.纯内存操作
2.核心是基于非阻塞的io多路复用模型
3.单线程反而避免了多线程频繁的上下文切换问题
io多路复用模型不负责处理,只负责监听socket,有的话就直接压到队列
redis的数据类型以及运用场景
String:做简单的kv缓存
hash:类似map,一般结构化数据,可以把对象缓存再redis
list:可以存储一些列表型的数据结构,还可以通过Irange从某个元素读取多少个元素,实现下拉不分页
set:去重
zset:去重排序,根据分数排序
redis的过期策略
1.设置过期时间(定期删除 惰性删除)
redis内存淘汰机制
如果redis内存占用过多的时候,此时会进行内存淘汰
noeviction:当内存不足以容纳新写入数据时,新写入操作会报错,这个一般没人用吧,实在是太恶心了
allkeys-lru:移除最近最少使用的key,一般就是用这个
allkeys-random:随机移除key
volatile-lru:在设置里过期时间的键空间,移除最近最少使用的key
volatile-random:在设置里过期时间的键空间,随机移除key
volatile-tt:在设置里过期时间的键空间,删除最先过期的key
手写LRU算法
public class LRUCache<K, V> extends LinkedHashMap<K, V> {

private final int CACHE_SIZE;

// 这里就是传递进来最多能缓存多少数据
public LRUCache(int cacheSize) {
    super((int) Math.ceil(cacheSize / 0.75)   1, 0.75f, true); // 这块就是设置一个hashmap的初始大小,同时最后一个true指的是让linkedhashmap按照访问顺序来进行排序,最近访问的放在头,最老访问的就在尾
    CACHE_SIZE = cacheSize;
}

@Override
protected boolean removeEldestEntry(Map.Entry eldest) {
    return size() > CACHE_SIZE; // 这个意思就是说当map中的数据量大于指定的缓存个数的时候,就自动删除最老的数据
}

redis不能支撑高并发的瓶颈
单机在几万
reids持久化
redis持久化的意义,在于故障恢复
redis突然挂了,里面有很重要的数据会丢失,重启之后,要去恢复redis很费劲
想办法从内存持久化到磁盘,然后定期同步和备份到一些云存储服务上去,保证数据不丢失全部

如果不做持久化还有可能出现redis缓存雪崩的问题,当重启redis,然后没有做数据备份,所有的请求都会直接去mysql里面去查,这时候就会出现缓存雪崩的显现,mysql直接就挂了,mysql挂了,就无法找到数据恢复到redis。
redis持久化:RDB
每个几分钟,几小时,几天,生成redis内存中数据的一份完整的快照
redis持久化:AOF

redis缓存雪崩
redis宕机,大量数据访问mysql,数据库扛不住这么大的并发,直接挂掉,那么整个系统也就挂了

如何解决缓存雪崩
事前要保证redis的高可用
先去系统内部缓存ehcache查,没有就去redis查。redis没有就去数据库查,但是去数据库查询之前要用hystrix做限流

缓存穿透

来源:https://www.icode9.com/content-2-879251.html

(0)

相关推荐

  • Redis面试题汇总(附答案),面试突击专用

    本文的面试题如下: Redis 持久化机制 缓存雪崩.缓存穿透.缓存预热.缓存更新.缓存降级等问题 热点数据和冷数据是什么 Memcache与Redis的区别都有哪些? 单线程的redis为什么这么快 ...

  • 生态旅游概述

    生态旅游被广泛定义为到濒危和通常未受干扰的地方进行的低影响旅游.它与传统旅游不同,因为它可以让游客对当地的自然景观和文化特征有所了解,而且经常为保护提供资金,并有利于经常贫困地区的经济发展. 生态旅游 ...

  • 经络穴位解读——手阳明大肠经概述及重要穴位

    经络穴位解读--手阳明大肠经概述及重要穴位 原创牛奶和奶牛2020-11-30 19:20:14 今天我们来解读一下手阳明大肠经.在中医学里,经络是与脏腑相匹配的.同时也是互为表里的关系.例如手太阴肺 ...

  • 区域地理学概述

    区域地理学是地理学研究世界区域的一个分支.一个地区本身被定义为地球表面的一部分,具有一个或多个类似的特征,使其有别于其他地区.区域地理学研究的是与地方的文化.经济.地形.气候.政治和环境因素有关的特定 ...

  • Redis分布式锁升级版RedLock及SpringBoot实现

    分布式锁概览 在多线程的环境下,为了保证一个代码块在同一时间只能由一个线程访问,Java中我们一般可以使用synchronized语法和ReetrantLock去保证,这实际上是本地锁的方式.但是现在 ...

  • 概述蛋白石

    蛋白石因颜色.光泽独特而名.其彩虹般绚丽耀目的光芒多彩似马赛克,充满了神秘性,足其它宝石无可比拟的. 虽然名为蛋白石,却非单一色调,如果仅仅是白色,倒反而没有价值了.透明.红色.黄色色系,在澳洲多为乳 ...

  • 中国历史概述(九十六)——蒙古太宗至宪宗时期的政治经济

    前面几期我们着重从军事征服角度介绍了成吉思汗即位到蒙哥去世前后蒙古的历史.本期我们着重介绍在蒙古太宗窝阔台至宪宗蒙哥时期的政治经济等方面的情况. 成吉思汗的分封 蒙古汗国是成吉思汗在母亲.诸弟帮助下建 ...

  • 中国历史概述(九十四下)——附 蒙古对东北地区的征服

    蒙古对东北地区的征服过程,与金国在东北势力的消亡有关.蒙古在东北的统治前期依靠契丹.女真等族贵族建立的政权作为藩属,到元初逐渐改为直接统治. 蒙古对辽西的战争与东辽国的建立 1211年,蒙古军第一次围 ...

  • 中国历史概述(九十四上)——蒙金战争与金国覆灭

    蒙古对金的战争和最后的完全征服花费了二十多年的时间,这期间由于西征等原因,对金作战并不是一次性完成的.而在这个过程中,金国内部的矛盾和红袄军起义也加速了金的灭亡.本期专述蒙古对金战争与金国灭亡的历史. ...

  • 中国历史概述(九十三)——蒙古对回鹘、西辽、西夏、吐蕃、大理的征服

    蒙古汗国在建立以后,通过数十年的战争,先后收服回鹘.灭西辽.灭西夏.收服吐蕃.灭大理,将西部的辽阔地区纳入版图中.本期主要介绍以上历史内容.关于蒙古三次大规模西征的情况,将在第九十五期作介绍. 回鹘的 ...