详谈Redis - 非关系型(内存)数据库

213 阅读4分钟

什么是Redis?

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

Redis是一个高性能的开源的Key-Value数据库,个人理解它有如下几点好处

  • 可持久化并且支持集群,可以将内存中的数据保存在磁盘中,哪怕Redis服务挂了重启数据也不会丢失。
  • 性能极高,Redis读的速度是110000次/s,写的速度是81000次/s。
  • Redis相比关系型数据库来说也是有事务的。
  • 丰富的数据存储格式:Redis支持的数据类型有String、Hash、List、Set、Sorted Set
  • 支持消息队列

为什么要使用Redis?

这也是很多开发者在面试中经常被问到的一个问题,非常简单,那无疑就是它快。但是并不是所有场景下它都适用,下面为大家解释一下!

Redis能做什么?

作为内存数据库,查询效率非常快,可以说是它为关系型数据库建起了一道壁垒,减少了一些关系型数据库的访问压力。那么Redis一般在哪些场景下使用呢?下面为大家举几种常见的例子。

  • 缓存数据加载,例如一些热搜排行榜数据便可以使用Redis
  • 电商常见的秒杀,也可以使用Redis
  • 一些网站的点赞、阅读等等,可以先将数据存取到Redis再同步到数据库

什么场景下最好不要使用Redis?

  • 如数据量太大,存放在缓存中会非常损耗资源。
  • 如访问频率不高,存放在Redsi那就是浪费资源,所以说在考虑使用的时候一定要先看适不适合用。
  • 数据经常变化不适用,需要在数据各种变动的时候去维护这个Key

上面讲的也不是非常的全面,如果感兴趣可以自己再去查阅书籍,结合平时在项目中的一些感受,去选择使用Redis

如何安装Redis?

使用Docker安装Redis

由于笔者有过Docker基础,在本文中就使用Docker安装。

docker run -d --name redis-dev -p6379:6379 -v /d/dockerdata/redis/data:/data redis --appendonly yes
  • -p 映射端口,前面的 6379 是外部 redis 端口,后面的 6379 是容器内部的 redis 端口
  • -name 容器对应的名称
  • --appendonly yes 开启 AOF 持久化

Windows安装

Redis下载地址 | 直接下载,解压之后使用命令行指定对应文件夹输入如下命令即可运行。

redis-server.exe redis.windows.conf

image.png

使用Redis遇到的一些问题

这个问题可以说是中级软件工程师高频面试题,如果单纯只是拿他当工具,没遇到问题就不去考虑,那将毫无意义。虽然说一些类型的项目用户量比较少,可能不会出现一下情况,但是也可以了解了解,万一面试遇到了呢。Redis主要出现的问题有如下几个。

缓存雪崩

缓存雪崩是指在某一时间Redis服务挂掉了,或者说大量Key由于设置时间都一样,在同一时间失效,导致数据库压力骤增,可能会导致系统崩溃。

  • 解决方法
    • 可以在原有缓存时间基础上加上一个随机值,防止缓存同一时间失效。
    • 加互斥锁,当热点key过期后,只有第一个请求能获取锁并阻塞,此时该请求查询数据库,并将查询结果写入redis后释放锁。

缓存击穿

缓存击穿是指某一些访问量较大的热点数据存放在缓存里,由于访问量较大,缓存未命中导致服务器宕机。

  • 解决方法
    • 设置缓存永不过期,或者使用一些服务给热点数据续期。
    • 也可以使用上方的互斥锁

缓存穿透

缓存穿透指访问数据既不在Redis中,也不再数据库里,服务无法将数据更新到缓存中,导致缓存和数据库压力都增大。

  • 解决办法
    • 缓存空值,如果数据库不存在的时候,将空值存入Key中
    • 入口增加校验,对于一些非法参数直接将其过滤掉
    • 使用布隆过滤器(还没有太深的使用这个东西,感兴趣可以去研究研究)

总结

在平时的工作中使用缓存的场景还是非常之多的,大家在用的同事也需要去考虑一些极端情况该如何处理,这样就不会导致生产环境出现问题,客户炸锅的情况。本文如果描述的有错误的地方,还请大家指出,我会及时更新此文,谢谢。