Redis入门总结

Redis的安装

到项目集成的两篇文章中,我们已经简单的了解到何如去用Redis的,再然后通过Redis和Mysql的查询性能对比和项目中如何合理运用Redis这两篇文章,又大致的明白为什么我们要用Redis以及Redis存在的一些问题。那么今天我想说一说我对Redis的一个感悟吧。能力有限,欢迎批评(反正关注后才能留言批评)。

01

基础部分

基础总结一:为什么要使用Redis:

因为从Redis中取数据要比从Mysql中快,那它为什么快呢?还不是因为它把数据存在内存当中,而MySQL把数据存在硬盘当中。不知道小伙伴对于数据存在内存中和存在硬盘中的区别是否清楚,这里我就解释一下:如果Redis没做持久化策略,那么服务重启数据就没了,但是MySQL重启数据是不会丢失的,也正是因为Mysql将数据存在硬盘中(Mysql也可以启用缓存),所以我们的查询会去执行IO操作,先从硬盘中读取数据,放入内存中,然后返回给用户,这也就是为什么Mysql慢而Redis快的问题了。

但是在现在的版本中,Redis可以持久化(AOF和RDB两种方式)Mysql也可以使用缓存,两种工具都是在逐渐的变得更加全能,说不好谁可以完全代替谁,因为Mysql缓存做不到Redis那样高效,而Redis持久化也没有Mysql那样可靠。

基础总结二:怎么去用Redis(关于Redis的数据类型就不说了)

怎么用Redis呢?首先当然是安装了,安装之后就要配置了(是否开启保护模式,要不要设置密码),配置之后就是用Java去连接了,连接上之后才是重头戏:什么数据放在缓存中(这个问题前面文章谈过,这里就不说了),放在缓存中之后我们再要做什么呢?首先缓存的数据肯定会有一定的时效性,过一段时间可能就会过时,这个时候我们就要更新缓存数据了,那么这个更新就要有一些讲究了:是先更新数据库再更新缓存,是先更新缓存再更新数据库,还是在缓存失效后再去更新缓存?我个人倾向于第三种,首先我们要给key设置过期失效,然后在数据库更新数据后,看情况是否对缓存数据进行更新。但是设置过期时间是一定要去做的,因为在某些极限的情况下,数据库更新而不会更新缓存。那存不存在有些数据是不是没有时效性的,一直都需要存在缓存中的呢?我觉得这个问题就要看需求,如果你需求决定某些数据永久存在,那么我们就可以不设置过期时间。在保证了Redis的时效性之后,我们就要想一想可用性了,因为数据我们已经存储到Redis中,也设置了失效,这一定程度上保证了数据一致性,满足数据一致性之后我们现在就要考虑取数据了,如果缓存中有,就从缓存中取,如果缓存中没有,就从数据库中取,如果都没有那可能就是恶意攻击了。

基础总结三:突发情况怎么处理

上面两点总结基本上都是一些常规处理问题的思路,但是我们在实际项目中总会遇到一些突发的情况,比如:比如有人直接在连接工具改数据库数据,比如有人恶意访问一些缓存和数据库都没有的数据,比如Redis炸了,又比如服务器炸了。这些问题,我们在开发阶段最好都要考虑的,这里只提供思路供大家参考。

1.有人直接操作数据库,没有走我们的业务逻辑:其一,我们要控制数据库的操作权限,不允许直接对数据库执行update和delete操作。其二,不能保证上一条的情况下,对与缓存中的键设置过期时间,此时即使发生有人直接操作数据库,key过期后会从数据库查询然后进行更新。

2.恶意访问一些缓存和数据库都没有的数据:在上一篇文章中,我们其实已经说过应对方法,将访问的数据以空值存储起来,设置过期时间,保证下次访问不会去增加数据库的压力。当然如果再高级一点的话,我们缓存起来的空值,被人连续访问,最好发个短信告警,获取IP进行拦截,这样还可以减轻服务器的压力。

3.Redis崩溃了或者服务器崩溃了:起来的针对Redis来说,服务器崩溃了和Redis崩溃了都差不多。这种情况单机下,如果发生了,其实毫无办法。我们要在开始前就要准备,因为软件和硬件发生故障的概念还是有的,我们在之前就要做好预防:首先是持久化策略,保证数据不会全部丢失。在服务挂掉之后,重启恢复数据:如果只配置AOF,重启时加载AOF文件恢复数据;如果同时 配置了RDB和AOF,启动是只加载AOF文件恢复数据;如果只配置RDB,启动是将加载dump文件恢复数据。最好是实现集群:要在各种软件和硬件的故障情况下仍然能够提供服务。一般来说有两种解决思路,一种是每一个节点互相之间都会进行数据交互以及监控,出现故障的时候,各个节点都可以做协调任务。另一种就是增加一个协调组件来对集群进行实时监控以及故障处理。

说到这里大致说完我对Redis的理解了,有很多地方都没有总结到:比如会请求超时,主从同步等等,这篇文章能做的就是提供思路以及让大家明白如何处理一些简单的问题。更加深层次的东西,还是需要个人在实际运用中去发现和总结了。

那么今天小程序更新的题库是什么呢?

今天小程序更新的题目是:

1.知道Redis分布式锁

2.假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如果将它们全部找出来?

3.使用过Redis做异步队列么,你是怎么用的?

4.如果有大量的key需要设置同一时间过期,一般需要注意什么?

5.是否使用过Redis集群,集群的原理是什么?

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180919G1R4MD00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券