Redis详解

写在开始:一个搬砖程序员的随缘记录

一、Redis介绍

Redis是一个高性能的key-value非关系型数据库

二、Redis特点

1、Redis支持数据的持久化,可以将内存中的数据保存到磁盘中,重启的时候可以再次加载使用
2、Redis不仅仅支持简单的key-value数据类型,同时还提供了String、List、Set、Hash、zset等数据结构的存储
3、Redis支持数据的备份,即master-slave模式的数据备份
4、性能极高,redis能读的速度是110000次/s,写的速度是81000次/s
5、原子性,redis所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。 6、丰富的特性,设置key有效期等特性

三、Redis作用

可以减轻数据的压力,查询内存比查询数据库效率高

Redis应用

token生成、session生成、分布式锁、自增id、验证码

比较重要的3个可执行文件

Redis-server:Redis服务器程序。
Redis-cli:Redis客服端程序,它是一个命令行操作工具。
Redis-benchmark:Redis性能测试工具,测试Redis在你的系统及配置下的读写性能。

四、Redis的数据类型及每种数据类型的使用场景

1、String

最常规的set/get操作,value可以是String也可以是数字。一般做一些复杂的计数功能的缓存

2、hash

这里value存放的是结构化的对象,比较方便的就是操作其中的某个字段。比如做单点登录

3、list

使用list的数据结构,可以做简单的消息队列的功能。

4、set

因为set堆放的是一堆不重复值的集合。所以可以做全局去重的功能。

5、sorted set

Sorted set多了一个权重参数score进行排列,集合中的元素能够按score进行排列。可以做排行榜,top n操作。

五、Redis的过期策略以及内存淘汰机制

分析

这个问题其实相当重要,到底redis有没有用到家,这个问题可以看出来。比如你redis只能存5G的数据,但你写了10G的数据。那会删除5G,这5G数据是怎么删除的?还有你的数据设置了过期时间,但是时间到了,内存暂用率还是比较高,原因是什么?

解答
Redis采用的是定期删除+惰性删除策略

为什么不使用定时删除策略?
定时删除,用一个定时器来监控key,过期则删除。虽然内存及时释放,但是十分消耗CPU资源,在大并发请求下,CPU要将时间应用在处理请求上,而不是删除key,因此没有采用此策略。

定期删除+惰性删除策略是怎么工作的?

定期删除,redis默认每隔100ms检查,是否有过期的key,有过期的key则进行删除。需要注意的是,redis不是每隔100ms将所有的key都检查一遍,而是随机抽查进行检查。因此,只采取定期删除策略会导致很多key到了过期时间没有进行删除。于是惰性删除派上了用场。惰性删除是指在你获取某个key的时候,redis会检查一下,这个key如果设置了过期时间是否过期了?如果过期了则进行删除。
采用了定期删除+惰性删除策略就不会有问题了吗?
答案是否定的,如果定期删除没有检测到key,并且也没有及时去请求key,也就是说惰性删除没有生效。这样redis的内存会越来越搞。那么就应该采用redis的淘汰机制。

redis淘汰机制
在redis.conf中有一行配置
#maxmemory-policy allkeys-lru

参数及效果如下:

1、noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。应该没人用吧
2、allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。推荐使用。
3、allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。应该也没人用吧,你不删最少使用Key,去随机删。
4、volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。这种情况一般是把redis既当缓存,又做持久化存储的时候才用。不推荐
5、volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。依然不推荐
6、volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。不推荐
ps:如果没有设置 expire 的key, 不满足先决条件(prerequisites); 那么 volatile-lru,
volatile-random 和 volatile-ttl 策略的行为, 和 noeviction(不删除) 基本上一致。

六、redis和数据库双写一致性问题

分析:

数据一致性问题是分布式的常见问题。一致性可分为强制一致性和最终一致性。数据库和缓存双写,就必然会产生数据不一致的情况。如果是对数据要求强一致性,就不能放缓存。我们所做的一切,都只能保证最终一致性,另外。我们所做的方案从根本上说,只能降低数据不一致发生的概率,无法完全避免。因此,有强一致性要求的,不能放缓存。

解答:

首先,采取正确的更新策略,先更新数据库,再删缓存。其次,因为可能存在缓存删除失败的情况,提供一个补偿措施即可。例如用消息队列。

七、缓存穿透、缓存击穿和缓存雪崩

1、缓存穿透

描述:

缓存穿透是指缓存和数据库中都没有数据,而用户不断的请求数据。如发起id为-1或者id为特别大的不存在的数据。这时请求者很可能是攻击者。这样会导致数据库压力很大。

解决方案:

1、接口层增加校验。校验id不能小于1.小于1的直接拦截
2、在缓存中没拿到,在数据库中也没有拿到,可以把key-value设置key-null,设定一个过期时间,比如30s,这样也可以防止一直请求数据库,导致数据库的压力过大

2、缓存击穿
描述:

缓存击穿是指缓存中没有数据,数据库有数据。一般是缓存的数据过期、这种是由于并发用户太多。同时缓存里面没有拿到数据。又同时去数据库拿数据,导致数据库的压力过大

解决方案:

1、设置热点数据永不过期
2、加互斥锁。当缓存中没有数据,第一个进入的进程会去数据库拿数据,并上锁。锁没有释放之前,其他进程会进行等待一段时间。再重新去缓存中拿取数据。这样就能防止都去数据库拿去数据。

3、缓存雪崩
描述:

缓存雪崩是指缓存中大批量数据都到了过期时间。而查询数据量大。引起数据库down机,和缓存穿透不同的是,缓存击穿是一条数据,而缓存雪崩是多条数据。

解决方案:

1、设置数据的过期随机,防止多条数据同一时间到期 2、设置热点数据永不过期
3、双缓存。我们有两个缓存,缓存A和缓存B。缓存A的过期时间为20分钟,缓存B不设置过期时间。自己做缓存预热操作。

Over

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值