Redis 常识

目录

1  含义

2 redis的过期策略-数据到期时,对到期数据的处理

3数据淘汰策略-数据放不下时,淘汰其他数据的策略

4redis的持久化机制

5 缓存穿透 雪崩 击穿


1  含义

是一个基于内存的又可以持久化的key-value类型的数据库,与mysql不同的是,它存储在内存之中,读取速度非常快,

2 redis的过期策略-数据到期时,对到期数据的处理

设置过期时间命令:

 Expire time key time  time是以秒为单位的

 Setex (String key,int seconds ,String value ) 这是字符串类型独有的设置方式

 备注:如果不设置,则默认是永不过期的,如果设置了用persist  key 来改变为永不过期

过期策略

 1 定时删除

    当key到达设置的过期时间之后,redis就会把对应的key和value删除;

   优点是节省内存可以快速的把过期数据删除

   缺点是 cpu资源占有太高,当key设置的很多的时候,资源分配的就很多。

  2惰性删除

   数据过期不立刻删除,而是在获取key的时候判断key是否过期,过去在删除

   优点是节省cpu资源

  2定期删除

  通过定时任务,随机删除,这个任务是通过时间来进行资源分配,如一秒抽出0.1秒执行删除任务,删除任务就是随机获取一定数量的设置了过期时间的key,判断是否过期,过期就删除。

redis现在采用的过期策略是:

  惰性删除和定期删除两种结合的方式

3数据淘汰策略-数据放不下时,淘汰其他数据的策略

  maxmemory-policy  使用这个命令配置淘汰策略

config get  maxmemeory-policy 

config set maxmemory-policy  xxx

涉及的算法

lru算法

最近最少使用,思想就是最近被访问过,将来被访问的记录高

lfu算法

最不经常使用,根据最近的访问频率判断,多次被访问表示将来被访问的几率也很高

fifo

先进先出

内存中数据淘汰测

volatile-lru  设置了过期时间的采用lru算法淘汰

allkeys-lru  所有key使用lru算法淘汰

volatiel-lfu  设置了过期时间的采用lfu算法淘汰

allkeys-lfu  所有key采用lfu算法进行淘汰

volatile-random 设置了过期时间的随机进行淘汰

allkeys-random 所有key采用随机的方式进行淘汰

volatile-ttl  设置了过期时间的key采用先进先出的方式淘汰,最早到期的现淘汰

no-eviction  当内存到达峰值的试试,所有申请内存的操作都会报错(set  push),只有get可以正常使用,--redis默认的就是这个策略

4redis的持久化机制

rdb和aof

rdb 是指在在一定时间内通过快照的方式把内存中的数据写到磁盘之中,快照文件命名为dump.rdb,当服务重启的是会从改文件中加数据放到缓存之中,会以一定时间内有一定的数据修改触发写入操作( 触发策略是可以写在配置文件中的),也可以手动触发用save或者bgsave(异步)的方式触发

vim $REDIS_HOME/bin/redis.conf  查看配置文件

save 900  1  意思是900秒内有一次修改就触发快照操作

配置触发策略命令  save <:changes>

优点:

缺点:

 aof

每一次请求的写命令都会被追加到aof的缓冲区之中,

aof缓冲区根据aof的持久化策略(always、everysec、no)同步到磁盘的aof文件之中

当aof的文件大小超过重写策略或者手动重写时,会对aof文件进行rewrite重写,压缩aof文件大小

当服务重启的时候会重新加载aof文件中的写操作命令。

重写指的是:文件重写指的是把redis进行内的数据转化为写命令同步到aof文件的过程

相关命令:
#开启AOF持久化
appendonly yes
 
#AOF文件名
appendfilename "appendonly.aof"
 
#AOF文件存储路径 与RDB是同一个参数
dir "/opt/app/redis6/data"
 
#AOF策略,一般都是选择第一种[always:每个命令都记录],[everysec:每秒记录一次],[no:看机器的心情高兴了就记录]
appendfsync always
#appendfsync everysec
# appendfsync no
 
 
#aof文件大小比起上次重写时的大小,增长100%(配置可以大于100%)时,触发重写。[假如上次重写后大小为10MB,当AOF文件达到20MB时也会再次触发重写,以此类推]
auto-aof-rewrite-percentage 100 
 

5 缓存穿透 雪崩 击穿
 

缓存穿透

是指客户端请求的数据在缓存和数据库中都不存在,这种缓存永不生效,请求直接到数据库,当

不断发送请求的时候,很容易将数据库打崩。

发生情况:

业务员误操作,导致缓存和数据库数据都被删除

黑客的恶意攻击

解决办法:

1 对空值进行缓存  如果查询一个结果返回为空null,不管是否存在,对这值进行null值缓存或者一个默认值,注意要把过期时间设置的很短

2 布隆过滤器,查询布隆过滤器判断key是否存在(返回存在不一定存在,返回不存在一定不存在)

3设置可以访问的白名单, 限制一些非法请求的访问

缓存击穿:

是指一客户端请求的数据在缓存中没有但是在数据库中有,热点key在某个时间段内过期,而这个是有有大量的对这个key的并发请求过来,大量数据直接查询到数据库导致数据库崩溃。

解决办法:

 1预先设置热点数据,提前存入缓存,加大热点数据的过期时间或者设置为永不过去

2 采用分布式锁

缓存雪崩

  是指缓存中的key同一时间大量过期或者请求在缓存充处理不了(redis服务器挂掉),导致大量数据请求直接操作到数据库

发生情况:

   1缓存中大量key同时过期,到时缓存中处理不了,直接到数据库导致数据库崩溃,

   2 redis服务器重启挂机了,到时请求在缓存中处理不了

解决办法

1 差异化设置过期时间,尽量不让key在同一时间大量过期

2服务降级,允许核心业务直接访问数据库操作,非核心业务返回一个设定的返回值信息

3 服务熔断,暂定对数据的访问,直接返回错误

 请求限流,避免大量的数据有可能直接请求到数据库,只允许小部分到数据库访问,其他数据在访问入口直接拒绝


你可能感兴趣的:(java,redis)