专栏首页每天学JavaRedis入门总结(大神慎入)

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集群,集群的原理是什么?

本文分享自微信公众号 - 每天学Java(gh_fddfb9d03324),作者:每天学Java

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-09-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何合理的在项目中运用Redis

    “ 在昨天推送的文章中,我们能够明显的看到访问Redis存储的数据,比访问MySQL中存储的数据要快很多,但是我们也强调了Redis的一些缺点,那么在实际的项目...

    每天学Java
  • Mysql和Redis查询速度的对比

    “ 在软件系统中,IO速度比内存速度慢,IO读写在很多情况下会是系统的瓶颈,我们也知道Redis的查询速度比直接查数据库要快,因为Redis将数据存在内存中,而...

    每天学Java
  • Linux部署Redis(单机版)

    “ 当数据库数据量过大的时候,大量的IO操作会成为网站性能的瓶颈,而Redis可以大量减少与数据库的交互,提高网站性能。”

    每天学Java
  • Redis 学习笔记6 - 管理Redis

    除了通过 redis.conf 文件对 Redis 进行配置外,我们还可以通过 config set 命令来个别值进行设置

    zhangyunfeiVir
  • 读完这篇文章,就基本搞定了Redis数据库

    简单来说 Redis 就是一个数据库,不过与传统数据库不同的是 Redis 的数据是存在内存中的,所以存写速度非常快,因此 Redis 被广泛应用于缓存方向。

    小老鼠
  • Redis入门

    最近在学Redis,相信大家对Redis这个技术都有所耳闻,前段时间通过搜狗手机助手与合作方流量合作需求的测试过程中需要用到Redis,当时对Red...

    用户5521279
  • 解锁Spring Data Redis的正确使用姿势

    Redis 是一个开源的使用 ANSIC 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从2010年...

    CSDN技术头条
  • 一篇文章了解Redis数据库

    redis是一个key-value存储系统。它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sor...

    逆月翎
  • redis研究

    jeremyxu
  • 【redis从入门到上线(4)】- redis高可用架构横向对比分析

    上篇我们讲解完 Redis Sentinel 原理之后,接下来讲解常用的 Redis 高可用架构。

    一条老狗

扫码关注云+社区

领取腾讯云代金券