Redis(十二)拓展:Redis的面试题整理和解答
概述 什么是Redis Redis(Remote Dictionary Server) 是一个使用 C 语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)的键值对数据库。 Redis 可以存储键和五种不同类型的值之间的映射。键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。 与传统数据库不同的是 Redis 的数据是存在内存中的,所以读写速度非常快,因此 redis 被广泛应用于缓存方向,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。另外,Redis 也经常用来做分布式锁。除此之外,Redis 支持事务 、持久化、LUA脚本、LRU驱动事件、多种集群方案。 Redis有哪些优缺点 优点 读写性能优异, Redis能读的速度是110000次/s,写的速度是81000次/s。 支持数据持久化,支持AOF和RDB两种持久化方式。 支持事务,Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。 数据结构丰富,除了支持string类型的value外还支持hash、set、zset、li ...
Redis(十一)进阶:Redis缓存穿透、击穿和雪崩的理解和学习
Redis的缓存穿透 1、概念: 用户需要查询一个数据,但是redis中没有(比如说mysql中id=-1的数),直接去请求MySQL,当很多用户同时请求并且都么有命中!于是都去请求了持久层的数据库,那么这样会给持久层数据库带来非常大的压力。一般出现这样的情况都不是正常用户,基本上都是恶意用户! 2、解决方案 ①布隆过滤器: 布隆过滤器是一种数据结构,对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合则 丢弃,从而避免了对底层存储系统的查询压力; ②缓存空对象: 当存储层查不到,即使是空值,我们也将其存储起来并且在Redis中设置一个过期时间,之后再访问这个数据将会从Redis中访问,保护了持久层的数据库! ③存在的问题: 1)如果空值能够被缓存起来,这就意味着缓存需要更多的空间存储更多的键,因为这当中可能会有很多的空值的键; 2)即使对空值设置了过期时间,还是会存在缓存层和存储层的数据会有一段时间窗口的不一致,这对于需要保持一致性的业务会有影响。 注意:缓存穿透前提是:Redis和MySQL中都没有,然后不停的直接请求MySQL。 Redis的缓存击穿 1 ...
Redis(十)进阶:Redis集群之哨兵模式的学习和理解
前言 在Redis集群中我们讲到了,主机断开后,我们得手动设置另一个从机变成主机!这是不智能的!在实际工作中,我们都是用哨兵模式来自动切换主机。通俗点讲,就是自己去选择‘大哥’! 概述 主从切换技术的方法是:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。这不是一种推荐的方式,更多时候,我们优先考虑 哨兵模式 。Redis从2.8开始正式提供了Sentinel(哨兵) 架构来解决这个问题。 谋朝篡位 的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库。 哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的 进程 ,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。 配置哨兵 1、添加哨兵配置文件 sentinel.conf 内容如下: 12# sentinel monitor 被监控的名称 host port 1 (代表自动投票选举大哥!)sentinel monitor myredis 127.0.0.1 ...
Redis(九)进阶:Redis集群之如何配置主从复制模式?
前言 默认情况下,每台Redis服务器都是主节点; 由于个人服务器性能原因,以下的所有操作都是单机集群的概念!在实际工作中并不会这样配置,而是使用哨兵模式来监控!这篇文章的意义主要就是为了让大家了解主从复制这个概念! 概念 主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master/leader),后者称为从节点(slave/follower);数据的复制是单向的,只能由主节点到从节点。Master以写为主,Slave 以读为主。 主要作用: ①数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。 ②故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。 ③负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。 ④高可用(集群)基石:除了上述作用以外,主从复制还是哨兵和集 ...
Redis(八)进阶:Redis如何实现发布订阅功能?
前言 Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接受消息。 Redis客户端可以订阅任意数量的频道! 实现方式: ①命令: 这些命令被广泛用于构建即时通信应用,比如网络聊天室(chatroom)和实时广播、实时提醒等。 ②发布订阅的实现: 1、订阅端: 1234567891011121314127.0.0.1:6379> pingPONG127.0.0.1:6379> SUBSCRIBE dingdada #订阅名字为 dingdada 的频道Reading messages... (press Ctrl-C to quit)1) "subscribe"2) "dingdada"3) (integer) 1#等待推送的信息1) "message" #消息2) "dingdada" #来自哪个频道的消息3) "hello world\xef\xbc\x81" # 消息的具体内容1) "messag ...
Redis(七)进阶:Redis持久化之RDB和AOF
前言 Redis 是内存数据库,如果不将内存中的数据库状态保存到磁盘,那么一旦服务器进程退出,服务器中的数据库状态也会消失。所以 Redis 提供了持久化功能 ! RDB(Redis DataBase) ①首先我们进入服务器找到dump.rdb文件: ②测试触发rdb操作:vim打开redis.conf配置文件 为了方便测试,我们将其改为 : 1save 60 5 #意思是在60秒内进行了5次操作,即写入rdb文件中进行持久化保存 如下图所示: ③触发机制: 1、save的规则满足的情况下,会自动触发rdb规则,测试如下: 先手动删除dump.rdb文件,实验触发规则! 在Redis中操作5次命令! 查看是否生成dump.rdb文件! 2、执行flushall命令,也会触发rdb规则 再次删除dump.rdb文件! 执行flushall操作命令! 正常生成成功! 3、退出Redis,也会触发rdb规则 删除: 退出: 生成成功! ④恢复rdb文件 1、只需将备份的rdb文件放在我们的redis启动目录即可,Redis启动的时候会自动检查dump.rdb文件 ...
Redis(六)进阶:Redis的配置文件详解
前言 前面的学习我们只是知道了如何使用Redis ,但是我们作为开发人员,我们不仅要知其然,还要知其所以然,所以我们得从根本上理解,我们必须将Redis.conf(windows版叫redis.windows.conf)文件仔细的学习一下,提升自我!放飞自我! 在实际工作中:一些小小的配置,可以让你脱颖而出! 单位:Redis配置对大小写不敏感! 注意这里:任何写法都可,不区分大小写。 units are case insensitive so 1GB 1Gb 1gB are all the same. 包含:搭建Redis集群时,可以使用includes包含其他配置文件 网络: 解释如下所示: 123bind 127.0.0.1 # 绑定的ip protected-mode yes # 保护模式 port 6379 # 端口设置 通用GENERAL 12345678910111213daemonize yes # 以守护进程的方式运行,默认是 no,我们需要自己开启为yes! pidfile /var/run/redis_6379.pid # 如果以后台的方式 ...
Redis(五)整合:SpringBoot如何整合Redis?
前言 Spring作为当前最火的一个框架,既然我们学习了Redis,我们肯定是要在实际项目中使用,那么肯定首选整合SpringBoot啦! 首先简单介绍下SpringBoot对Jedis的支持吧,在1.×版本的时候,SpringBoot的底层还是使用Jedis来连接Redis的,但是在2.×版本后,就换成了Lettuce。两者的区别如下: Jedis: 采用的直连,多个线程操作的话,是不安全的,如果想要避免不安全的,使用 jedis pool 连接池! 更像 BIO 模式! Lettuce: 采用netty,实例可以再多个线程中进行共享,不存在线程不安全的情况!可以减少线程数据了,更像 NIO 模式! 如果你不太了解spring框架的话,建议可以先去看一下B站大神狂神说Java系列的教学视频,我当初就是看到他的。 引用站外地址 狂神说Java系列 https://space.bilibili.com/95256449/channel/seriesdetail?sid=393820 ...
Redis(四)整合:Redis在Jedis中如何使用和操作?
前言 Jedis是Redis官方推荐的Java连接开发工具! 虽然现在的SpringBoot2.×版本已经将Jedis换成了Lettuce,但是我觉得还是有必要了解一下Jedis的使用! 如何在java项目中整合Jedis并且连接Redis数据库? ①创建一个Maven项目 ②导入Jedis和fastjson依赖,耐心等待下载完成! 123456789101112<!--导入jedis的包--><dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>4.3.1</version></dependency><!--fastjson--><dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson& ...
Redis(三)基础:Redis中的事务和乐观锁如何实现?
前言 事务 ①原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。 ②一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。 ③隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。 ④持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。 在Redis事务没有没有隔离级别的概念! 在Redis单条命令式保证原子性的,但是事务不保证原子性! 乐观锁 ①当程序中可能出现并发的情况时,就需要保证在并发情况下数据的准确性,以此确保当前用户和其他用户一起操作时,所得到的结果和他单独操作时的结果是一样的。 ②没有做好并发控制,就可能导致脏读、幻读和不可重复读等问题。 在Redis是可以实现乐观锁的! Redis如何实现事务? ①正常执行事务 1 ...
Redis(二)基础:三大特殊数据类型的学习和理解
在上一篇文章中我们讲了五大基本类型,他们是最常用的,而且百分之九十的程序员对于Redis只限于了解String这种最常用的。但是我个人认为,既然Redis官方提供了其他的数据类型,肯定是有相应的考量的,在某些特殊的业务场景中,这些特殊的类型还是能够给我们多一种解决思路!那么,这个学习就是值得的!!!接下来我们就来讲一讲三大特殊类型。 Geospatial: 地理位置 城市经纬度查询: 引用站外地址 经纬度查询 https://jingweidu.bmcx.com 注意点1:两极无法直接添加,我们一般会下载城市数据,直接通过java程序一次性导入! 注意点2:有效的经度从-180度到180度。 注意点3:有效的纬度从-85.05112878度到85.05112878度。 注意点4:m 为米。km 为千米。mi 为英里。ft 为英尺。 ①geoadd(添加)、geopos(查看)、geodist(计算距离)操作 123456 ...
Redis(一)入门:五大数据类型的学习和理解
概述 Redis是什么? Redis(Remote Dictionary Server ),即远程字典服务 ! 是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。 免费和开源!是当下最热门的 NoSQL 技术之一!也被人们称之为结构化数据库! Redis能干嘛? 1、内存存储、持久化,内存中是断电即失、所以说持久化很重要(rdb、aof) 2、效率高,可以用于高速缓存 3、发布订阅系统 4、地图信息分析 5、计时器、计数器(浏览量!) 6、… Redis的基本了解 首先我们可以看下官方文档是如何介绍Redis的: ①、英文文档 点击跳转. ②、中文文档 点击跳转. Redis-Key 简单介绍一下Redis中对Key的操作命令。希望大家可以跟着注释敲一遍,简单记一下,都是最常用的命令! 12345678910111213141516171819202122 ...