Redis学习:一、知识地图
开篇
为整合redis相关知识,本系列文章根据个人视角的理解对redis主要的内容作一个螺旋式的渐进阐述。首先简单介绍redis与其主要的内容,然后根据其各个部分再分别进行深入的探讨,以达到费曼方法,螺旋递进,逼近式学习的目的。
Redis简介
Redis是一个非关系型数据库,属于NoSQL。正是因为其抛弃了关系型数据库中一定的业务逻辑关系(主键外键),精简为key-value一种结构,所以大大提升了读写速度,因为其运行在内存中,往往被用作服务器与数据库中间的缓存,以极大提升软件读取数据的性能,以应对用户操作量增长所带来的的数据库IO性能压力。同时也可以做数据的持久化,防止内存中数据断电丢失。以此缓解甚至解决实际业务需求的读写压力。
数据类型
Redis以key-value的方式来存储值,但这并不意味着其数据结构单一。Redis提供了比较丰富的数据类型面对不同的数据存储需求。Redis基本数据类型分为以下五种
- String
- Hash
- List
- Set
- Zset(sorted set)
除了以上五种基本数据类型意外,Redis还提供了三种更加复杂的数据类型,以更加有效地面对的丰富的业务需求。
- Bitmaps(针对位记录用户是否访问)
- HyperLogLog(基数操作,去重的高性能结构)
- Geospatial(经纬度)
Redis-Jedis
Jedis是java用来操作redis数据库的一个工具包,可以用来操作指定服务器中Redis数据库服务的数据,对以上的各种数据类型的存储信息进行CRUD操作或完成更加复杂的业务需求。
整合Springboot
Redis可以与当前主流的流行框架Springboot做整合,在Springboot中做Redis相关操作。
Redis事务
Redis中也有事务的概念,但是和mysql的事务概念有很大的不同之处,Reids事务的主要功能就是串联多个需要一起完成的操作,防止别的命令插队。按我现在的理解,redis的事务以操作的时间线分为两个部分
- 开始为命令组队
- 执行命令队列
在命令行界面中,输入multi命令以后,再输入的命令都会进入命令队列中,只要输入exec后,Redis会将之前组队的命令依次执行。
Redis的事务与mysql的事务最大的不同就在于,redis的组队操作中如果有错误,那么整个队列都会被取消(类似mysql事务回滚),但是在执行阶段中,如果某个命令出现了错误(比如集合中存入相同的keyvalue),那么错误的不会执行,正确的命令都会被执行(不会回滚)
Redis并发
Redis的事务支持悲观锁与乐观锁操作,可以为并发相关场景(比如乐观锁解决超卖问题)提供更好的解决方案。
同时Redis支持LUA脚本(Redis2.6以上版本),LUA脚本可以解决Redis超卖问题,争抢问题 (库存遗留)。
Redis持久化
持久化是指将本来存在内存中的redis数据内容存到磁盘中,以达到持久存储。Redis支持两种持久化策略一种是RDB,一种是AOF。
RDB
RDB按照时间的方式将Redis进行备份,但是缺点是容易丢数据。
AOF
默认不开启,以日志的方式记录每个写操作,将Redis每个写指令记录下来,只追加文件不改写文件。说白了就是之前写啥全都记下来,重启或者丢失了就再像丢之前那样运行一遍,数据就又都回来了。
Redis主从复制
Redis主从复制可以实现读写分离,扩展性能,荣在快速恢复的作用。其中主为master,从为slave。可以一主一从,也可以一主多从。其中常用的方式是一主二仆,薪火相传,反客为主。其中反客为主也可以设置为哨兵模式,即master挂了之后slave自动顶上。
Redis集群
Redis可以设置集群模式,由于redis主从结构发生更替的时候,需要改变ip和端口号,比较麻烦,所以在redis3.0以后,提供了无中心化集群配置。 集群会启动N个Rrdis节点,每个节点存储1/N的总数据。即便集群的一部分节点失效或者无法通讯,集群也可以继续处理命令请求。增加了服务的健壮性。
Redis应用问题
缓存穿透
从Redis缓存中查没有的数据,即key对应的value值不存在,所以不断从数据库中查询,但是也查询不到,又无法为此建立缓存,所以一直消耗数据库的IO性能,导致服务挂掉。
为此也有一些解决方案,比如对空值缓存;设置可访问名单(白名单)采用布隆过滤器;进行实时监控。
缓存击穿
刚才的缓存穿透是查没有的数据导致绕过缓存一直去数据库中取,消耗数据库IO性能。缓存击穿是指Redis中的某个缓存的key过期了,刚刚过期了这个key,结果有大量的请求来访问这个刚刚在缓存里过期的数据,发现没有,结果去数据库中取,一下子数据库顶不住,炸了。
缓存雪崩
缓存雪崩就是缓存击穿的多个版,缓存击穿对应访问一个key过期;缓存雪崩指访问多个key,都过期了,那就更严重,所以直接雪崩,把数据库干挂掉。
分布式锁
由于随着扩展,逐渐向着集群的方式演变,所以原来的对于单机部署的数据库/服务器的上锁的方式已经不适用。
单纯的java API不能提供为分布式集群服务上锁的能力。
所以需要一种跨JVM的互斥机制来控制共享资源的访问,这就是分布式锁要解决的问题!
分布式锁的主流方案有
- 基于数据库实现分布式锁
- 基于缓存(Redis等 ) 性能Redis最高
- 基于Zookeeper 可靠性最高
本文作者:逐东
本文链接:https://www.cnblogs.com/vuds/articles/15973156.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步