Redis6
NoSQL技术
为什么引入NoSQL
网站开发技术分为功能型技术(java,mysql),扩展型技术(包括Spring和Mybatis等开发框架能够提升整个系统的可扩展性)和性能型技术(ElstackSearch,NoSQL,RocketMQ) 。也就是说Redis属于性能型技术,主要用于解决分布式信息存储。
什么是NoSQL
NoSQL指的是Not Only SQL(不仅仅是关系型的数据库),也就是非关系型的数据库可以是像Redis一样的key - value键值对的方式存储数据信息。
列举几种常用的NoSQL数据库
?
MemCache
Redis
MongoDB
不同NoSQL之间的区别
这里主要介绍的是memCache和Redis的区别: ①Redis比memCache支持的数据类型更多。 ②Redis使用的是单线程+多路复用技术,memCache使用的是多线程加锁的机制 ③持久化机制,memCache不支持持久化机制,Redis支持RDB和AOF两种持久化机制
使用场景
推荐
推荐使用Redis的使用场景其实可以归结为三高: 高数据量,高并发,高扩展性
不推荐
在对事务很依赖或者需要结构化的存储和查询数据的场景不推荐使用NoSQL
什么是Redis
Redis(Remote Dicitionary Server远程字典服务),其实就是一款基于key - value键值对形式存储数据的数据库,他是用C语言编写的支持网络,支持在内存中运行并且有持久化机制的数据库
Redis的安装和启动
安装
①Redis官方其实只支持Linux版本,但是微软提供了一款windows下的Redis。我们基于Linux安装。首先得去下载tar.gz包 ②使用-zxvf 解压包 ③编译使用make命令 思运行使用make install
启动
前台启动
直接运行redis安装目录下的redis-server
后台启动
①首先修改redis的配置文件将deamonize修改为yes表示支持后台启动 ②启动时带上配置文件的地址: redis-server /etc/redis.conf
Redis为什么这么快
①运行在内存中数据结构简单类似于一个Hash表读取和存储数据只需要O(1)的时间复杂度 ②采用的IO模式是单线程+多路复用的机制,这样避免了多线程之间切换的损耗。通过轮训客户端IO处理,并且使用的是非阻塞IO
redis的默认启动端口号
根据Merz的9键输入法6379
redis的使用场景
redis主要用于分布式微服务的公用信息存储和管理。主要的使用分为作为计数器,作为缓存(缓存热点数据,缓存token甚至缓存整个页面),还可以使用Redis左一个分布式锁做分布式全局事务。另外redis中支持的set类型还可以用于求存储数据的交际并集或者随机抽奖。zset可用于作为一个排行榜
数据类型介绍
Redis是一个key - value类型的数据库其中key的数据类型就是一个字符串作为唯一识别一个value的标记。节介绍的数据类型主要是vakue相关的数据类型。而这些数据类型根据使用的频率分类又可以分为五大常用的出局类型和不常用的数据类型。
五大基本数据类型
String
底层数据结构
String数据类型的底层使用的是一个具有类似于ArrayList一样动态扩容功能的字符串。它的特点就是二进制安全并且最大的空间为512M
使用场景
字符串可用于缓存,缓存session,计数器等等
list
底层数据结构
list数据类型底层的数据结构quickList,当数据量较小的时候其实是一个ZipList类似于数组,当元素变多的时候其实相当于将多个数组使用前后指针连接起来构成一个quickList。其本质上是一个shuangxiang链表。
使用场景
存储粉丝列表,评论列表s
hash
底层数据结构
hash表的底层数据结构如果在数据量很少的情况下会使用一个zipLIst,当数据量增加之后会使用HashTable
使用场景
存储一个对象
set
底层 数据结构
它是一种无序不重复的集合,底层实现类似于HashSet和HashMAp一样,是一个hash表,并且值都指向同一个内部定义好的值。
使用场景
求交集,并集,抽奖
zset
底层数据结构
zset底层的树结构是跳表和hash表实现,hash结构用于关联值和评分,而跳表结构通过score将值进行一个排序,使得我们能够快速检索到数据s
使用场景
排名
其余类型
BitMaps
BitMaps可以理解为是一个以二进制位作为单位的一个字符串,通过给指定偏移量的位设置0或者1来表示该位的状态,最大的优点就是节省空间。作用就是可以用于记录用户是否进行过某种行为,例如登录或者购买某种商品这个时候我们可以使用用户id作为偏移量
HyperLogLog
HyperLogLog类型主要用于左基数统计的(基数:独立不重复的元素的个数),其实在MySql中可以使用Distinct关键字左基数统计,在Redis中可以使用Hash,Set,BitMaps做基数统计。但是这些结构统计基数所需要的内存空间太多了,HyperLogLog使用精度来换取速度,它并不统计数据本身而只是统计一个具体的基数但是优点在于统计的速度快。s
Geographic
Geographic类型主要用于存储的地理信息也就是地球上某个点的精度和纬度它可以通过经度和纬度来计算两点之间的距离。
Redis的基本使用
redis默认有16个存储数据的数据库我们可以使用select来选择使用哪一个库
对redis数据库的操作
对于key的常见操作
对于不同数据类型的常见操作
配置文件
发布和订阅
发布和订阅是一种信息通信的方式,信息的发布方通过在某个频道上发布数据,信息的订阅方则是监听这个频道上的数据,当这个频道上有数据是进行拉取。
是什么
发布和订阅是一种信息通信的方式,信息的发布方通过在某个频道上发布数据,信息的订阅方则是监听这个频道上的数据,当这个频道上有数据是进行拉取。
如何实现
①信息的发布 publish channel “message” ②信息的订阅: subscrib channel
Redis事务操作
事务操作的两个流程
事务的执行流程我们大体上可以分为组队阶段和执行阶段,但是在组队和执行之前为了保证事务执行过程当中数据不被其他执行修改我们可以使用watch来监听事务中所用到的keys
组队操作
组队操作使用multi命令操作,组队阶段其实就是将这个事务中需要执行的命令按照顺序添加到一个队列当中,如果组队阶段中发生了错误整个组队就会失败。当让我们也可以手动使用discard命令取消组队操作
执行操作
事务执行阶段就是将之前组队的命令按照顺序执行,当组队阶段中出现了错误所有之前执行的命令会成功,不会回滚,而错误之后的命令不会被执行
事务执行之前
事务在执行之前我们应该对事务中所操作的keys进行监听,当事务执行之前,发现监听的key被其他的指令所修改事务执行就会失败。
事务是什么
事务其实就是多条redis指令的一个集合,事务是一个单独的隔离操作,事务中的所有命令都会被序列会后按照顺序执行,事务执行的过程当中不会被其他的指令所打断。
事务的特性
①事务是一个单独的隔离操作,执行事务过程当中不会被其他指令锁打断 ②事务不支持原则性,就是执行过程当值出现错误,不会回滚 ③事务没有隔离级别的概念
Redis中的持久化机制
Redis中的持久化机制分为RDB和
RDB
RDB是什么
RDB(Redis Database)是Redis中的一种持久化机制,就是将指定时间介个之内的数据快照存储到磁盘上。
RDB的原理
RDB的原理其实就是在进行持久化操作的时候创建一个fork子进程,将当前的数据快照存储到一块数据缓冲区中,当数据缓冲区同步完毕之后在通过刷盘机制给他同步到dump.rdb文件中。
配置
配置文件中可以指定配置文件的位置,当前同步的数据是否完整,当前的硬盘是否可以写入,以及保存的两种模式save可以设置多少时间之内key发生变化再保存bgsave表示自动的持久化策略
使用场景
适合
RDB适合使用在大规模数据恢复但是不注重数据的完整性的场景,它消耗的空间少,时间快但是容易发生数据的丢失。
不适合
RDB不适合使用在对数据的准确性要求高的场景之下因为它在最后一次持久化的时候可能会丢失数据
AOF
?
是什么
AOF(Append Only File)以日志文件追加的形式将客户端发送来的命令追加到日志文件中。
过程
客户端每次发送命令会被追加到AOF的缓冲区
缓冲区根据设置的频率进行刷盘
频率一共有三个值: no:不刷盘,由操作系统来决定何时同步 always:每次都刷盘 second:每秒刷盘一次
重写修复
重写
####### 是什么
AOF需要记录的是客户端的写操作所以文件会很大,当文件到达128M的时候后会促发一个重写的操作压缩文件。将多条指令压缩成一条这样就可以减少文件的大小
####### 流程
流程大致上了RDB文件刷盘的流程差不多会创建一个子进程先存储到缓冲区再同步到磁盘上。但是Redis4.0之后在重写之前会先将RDB文件先获取过来作为AOF文件的头再重写压缩
修复
AOF文件可以自动检测文件是否损坏并且提供了自动修复的命令
恢复
优缺点
优点
数据的准确性高
缺点
文件大同步慢,如果每一次都同步性能就会很差
Redis集群
主从
什么是主从:主机更新数据之后根据配置和策略将数据同步到从机上 好处: 读写分离: 写到主机上读取从机上去读这样降低主机的压力 容灾: 主机宕机之后从机变为主机继续服务
常用的策略
一主多从
配置一台主机多台从机服务,当主机宕机之后重启后还是主机从机不变。当从机宕机之后重启之后会变为主机需要重新slave of
反客为主
当主机宕机之后我们可以手动配置新的主机,原来的主机重启之后还是主机
薪火相传
可以配置一主多从,从机下面再挂着从机
怎么配置
①先创建一个所有redis1的公共配置文件 ②闯将各个redis的各自配置文件引入公共配置,配置私有的配置包括主机端口持久化文件的位置 ③启动所有主机使用slave of 指定主机
原理
初次的复制: ①slave启动给主机发送sync指令 ②主机收到指令之后查看磁盘存储进程将其存储文件发送给从机 ③从机收到文件之后同步到内存 以后: 主机修改数据治好后发送命令给从机一起修改
哨兵模式
是什么
通过监听主机的状态,如果主机发生宕机了就从从机中选举产生新的主机。主机重启之后自动俯首称臣
实现
选举机制: 有那么多从机如何确定那一台从机作为主机,首先根据优先级(配置文件中配置越小越优先),再根据偏移量作为选举如果便宜量一样我们就使用runidxuanju
集群配置
为什么引入集群
如果Redis中只有一台主机服务那么没有办法扩容并且没办法分担并发写操作
集群是什么
集群就是配置多台主机一起服务来对redis扩容和并发写操作的分摊。配置了集群之后集群中即使有主机不能服务了其他的主机依然可以继续服务。
插槽
插槽是集群中重要的概念,我们存储的key-value一定属于某一个插槽。redis默认有16384个插槽由集群中的主机平均分配在我们调用redis存储数据的时候集群会将数据平均分配给多台主机。
Redis作为缓存的几个问题
缓存过期淘汰策略
缓存的过期策略
Redis是一个Key-Value类型的数据库,我们可以给每一个key指定过期的时间。那么我们如何清理这一些过期的key我们就称之为内存的过期策略。常见的过期策略有定时过期,惰性过期,定期过期三种
定期过期
定期过期策略其实是前两种策略的一个折中的方案就是定期时间去扫描内存中的key将过期的key淘汰。这样可以平衡cpu和内存的压力。
定时过期
就是按照我们的key所设定的时间来定时对过期的key进行清理,这样对内存石峰友好只保存所有还没有过期的数据,但是对cpu不友好每当有一个key过期就得处理
惰性过期
惰性过期的意思就是说只有当用户调用这个key的时候才判断这个key是否过期然后执行缓存刷新,这样对cpu友好只有当真正使用到某个key时才去处理,但是对内存不友好,内存中会存储大量已经过期的数据
缓存的淘汰策略
Redis达到最大内存还会使用的缓存淘汰策略一共有八种分别为 Volatile LRU all LRU Volatile LRU all LRU Volatile Random all Random Volatile ttl no eviction
缓存击穿
是什么
服务器压力增大了,Redis的命中率降低了一直访问数据库。引起这一问题的原因是有人一直访问无效的数据Redis无法缓存。
怎么解决
?
缓存空数据
设置访问的白名单
设置访问黑名单
使用布隆过滤器
缓存穿透
是什么
服务器压力突然增大了Redis使用正常,也不存在大量大key过期。原因就是redis中的某个key过期了但是大量的并发都在访问它。
怎么解决
缓存预热
实时调整
锁
缓存雪崩
是什么
服务器压力变大了,缓存中大量的key一起过期,导致大量的并发打到数据库上,使得服务器奔溃。 d
怎么解决
设置热点数据用不失效
将key的失效时间尽可能分开避免同一时间过多的key失效
构建多级缓存机制
数据库和缓存不一致的问题
是什么
缓存不一致问题指的是数据库中的数据和缓存中的数据版本不一致。
原因
原因很简单,就是发出的指令不一定最先执行。两个线程A写B读,A先发出,B卡在中间执行。比如说A要写就得删除缓存和修改数据库,但是只要A执行一步之后B就开始执行。A再执行就会造成缓存的不一致。
解决
归根是因为分布式微服务机构的底层数据库操作是并发的。 解决的方式就是修改数据库连接池,让数据对应连接这样就能够保证对指定数据的修改是串行执行的。
|