目录

什么是Redis

Redis存储数据的方式有一共五种,分别是String、哈希、list、set、sorted set

Redis数据的过期处理

Redis两种持久化方式

缓存穿透、缓存雪崩的产生原因和解决方案

Redis适用的场景

Redis支持的Java客户端


什么是Redis

 

全称Remote Dictionary Server。Redis本质上是一个Key-Value类型的内存数据库,类似的还有memcached(还可以缓存图片视频),整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。

Redis存储数据的方式有一共五种,分别是String、哈希、list、set、sorted set

 

1>String

用字符串设置key,value可以为字符串也可以为数字。

2>哈希

hash特别适合用于存储对象,所以哈希的key可以是用户的cook,然后存储用户对象,来模拟session的作用。

3>list

Redis列表是简单的字符串列表,按照插入顺序排序。先进先出的原则,可以进行队列的相关功能。

4>set

Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

5>sorted set

Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

有序集合的成员是唯一的,但分数(score)却可以重复。

Redis数据的过期处理

 

redis对设置日期的数据有删除机制的,要不然你的redis在不断的使用过程中会越来越慢。

是不是时间一到就立刻删除呢?

1、立刻删除:

存储数据时设置的日期,会有一个计时器去监管key的,到时间就会删除key,释放内存,但是在大量并发请求下,cpu要全用在处理请求上,所以不能使用时间一到立即删除这一策略。

2、惰性删除:

键过期了就过期了,不管。每次从dict字典中按key取值时,先检查此key是否已经过期,如果过期了就删除它,并返回null,如果没过期,就返回键值。

3、定时删除:

定时的意思是说每隔一段时间,对expires字典进行检查,删除里面的过期键。

分析:

第一种立刻删除对cpu非常不友好,但是效果是最好的,他保证了数据的实时性。

第二种惰性删除是当查询key时再去检查并删除的,这很大程度上释放了cpu,但是明显的是这种方法对内存要求比较高,也就是用内存换性能。

第三种则是对前两者的特征中和了,每隔一段时间删除一次,减少了cpu的工作频率,也缓解了内存的浪费。

所以这里采用定时删除+惰性删除的策略

但是,但是

但是这种策略就完美了吗?

不是的,当一个key过期后过了好久都没去请求,那么惰性删除也没生效,这里就会用到redis的内存淘汰机制

六种机制,用到最多的就是allkeys-lru,可以在redis.conf文件中进行相应的配置。

1)noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。

2)allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(LRU)。

3)allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。

4)volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key(LRU)。

5)volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。

6)volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,快过期的key优先移除(TTL,Time to Live)。

Redis两种持久化方式

 

持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。

Redis默认的持久化方式是RDB,另一种是AOF

1)RDB(Redis DataBase):

主要函数

rdbSave:生成RDB文件,把数据从内存中存入磁盘中RDB文件中

rdbLoad:从磁盘RDB文件中加载到内存中

2)AOF(Append only file):

主要函数

flushAppendOnlyFile 函数的功能:aof的写入和保存

写入》》WRITE:根据条件,将 aof_buf 中的缓存写入到 AOF 文件

保存》》SAVE:根据条件,调用 fsync 或 fdatasync 函数,将 AOF 文件保存到磁盘中。

比较

1、AOF文件比RDB更新频率高,优先使用AOF还原数据。

2、AOF比RDB更安全也更大

3、RDB性能比AOF好

4、如果两个都配了优先加载AOF

 

磁盘文件存储结构:内容是redis通讯协议(RESP:Redis Serialization Protocol)格式的命令文本存储。

redis通讯协议(RESP):其实就是redis序列化协议

特点是实现简单、快速解析、可读性好

For Simple Strings the first byte of the reply is "+" 回复

For Errors the first byte of the reply is "-" 错误

For Integers the first byte of the reply is ":" 整数

For Bulk Strings the first byte of the reply is "$" 字符串

For Arrays the first byte of the reply is "*" 数组

 

 

缓存穿透、缓存雪崩的产生原因和解决方案

1)缓存穿透

一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB)。一些恶意的请求会故意查询不存在的key,请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透。

1:对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存。

2:对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤。

2)缓存雪崩

当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,会给后端系统带来很大压力。导致系统崩溃。

1:在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。

2:做二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期

3:不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。

 

Redis适用的场景

 

1)会话缓存(Session)

由于Redis提供持久化功能,对于用户的相关信息token可以实时存储和校验,实现了Session的作用

2)排行榜

Redis的存储结构中Set和Sorted Set对数据的排序非常方便

3)消息队列

list 和 set 使得Redis能作为一个很好的消息队列平台来使用,rpush生产消息,lpop消费消息。当lpop没有消息的时候,要适当sleep一会再重试,生产者消费者但是在消费者下线的情况下,生产的消息会丢失,得使用专业的消息队列如rabbitmq等。

4)全页缓存(FPC)

把整个页面缓存到磁盘中,当访问网页时,如果已经缓存了,就直接从缓存中调,否则再去后台请求,想象一下这样是不是快多了。

5)发布/订阅

发布和订阅就像班长和普通同学一样,当导员发布消息给班长,班长就会发给本班各位同学。


Redis支持的Java客户端

 

Redisson、Jedis、lettuce等等,官方推荐使用Redisson。

Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持;

Redisson实现了分布式和可扩展的Java数据结构,和Jedis相比,功能较为简单,不支持字符串操作,不支持排序、事务、管道、分区等Redis特性。Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。