基于内存操作的Redis数据库--详解

目录

基本概念

基本操作

redis的五个基本类型

Redis-key(不区分大小写)

字符串 string

Redis的特殊类型

geospatial地理空间

 事务

Redis的持久化

RDB(.rdb)

触发机制

优点

 缺点

AOF(.aof)

优点

缺点

Redis发布订阅

相关命令

Redis主从复制

哨兵模式

哨兵在做什么?

Redis缓存穿透和雪崩

缓存穿透

解决办法

缓存击穿

解决办法

缓存雪崩

解决办法


基本概念

Redis是一种支持key-value等多种数据结构的存储系统。可用于缓存,事件发布或订阅,高速队列等场景。支持网络,提供字符串,哈希,列表,队列,集合结构直接存取,基于内存,可持久化。(使用内存存储的非关系型数据库)

默认有16个数据库

核心:单线程操作很快,Redis是将所有数据全部放在内存中的,所以说使用单线程去操作,效率就是最高的,相比于多线程,减少了CPU上下文切换的耗时。对于内存系统来说,没有上下文切换效率就是最高的,多次读写都是在一个CPU上的。

Redis是C语言实现的,官方数据:读:110000/s 写: 80000/s,完全不比同样使用key-value的Memcached差,速度与内存和网络带宽有关

基本操作

select                      切换数据库

dbsize                     查看数据大小

keys *                      查看所有的key值

flushdb   flushall      清空当前数据库和清空所有数据库

基于内存操作的Redis数据库--详解_第1张图片

redis的五个基本类型

Redis-key(不区分大小写)

SET               设置key

GET               查看key的值

EXPIRE         设置过期时间(实时刷新返回量较高的数据)

TTL                查询过期时间

EXISTS          判断当前的key是否存在

KEYS *           查看当前所有的key

DEL KEY        删除当前的key

TYPE              查看key存储的value的类型

字符串 string

列表 list

集合 set

srandmember set value 做抽奖很容易

Redis的特殊类型

geospatial地理空间

 geoadd         添加地理位置

geopos           返回给定名称和经纬度

geodist           返回给定的两个位置之间的距离

geohash          返回一个11个字符的geohash字符串

georadius        以给定的经纬度为中心,寻找某一半径内的元素

 事务

  1. 开启事务···multi
  2. 命令入队···...
  3. 执行事务···exec

Redis的持久化

redis是内存数据库,如果不将内存中的数据保存到磁盘中,一旦服务器进程退出,服务器中的数据库状态就会消失,所以redis提出了持久化功能。

RDB(.rdb)

在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是快照,恢复时将快照文件直接读到内存中。单独创建一个子进程,先将数据写入到一个临时文件中,等到持久化结束,再用这个新的临时文件替换上一次的持久化好的文件。

就是在做文件复制

触发机制

  1. 保存时
  2. flushall
  3. 退出redis

优点

  1. 适合大规模的数据恢复
  2. 对数据的完整性要求不高

 缺点

  1. 需要一定的时间间隔,如果redis宕机,最后一次保存的持久化文件之后的数据都没有了
  2. fork进程的时候,需要占用一定的内存空间

AOF(.aof)

将所有的写操作的命令都记录下来,在回复的时候将所有的命令都执行一遍

也就是保存命令

优点

  1. 每一次修改都会同步,文件的完整性比较好
  2. 每秒同步一次,可能只会丢失1s的数据

缺点

  1. 相对于数据文件,aof远远大于rdb(因为aof要保存整条命令,然后重新运行,rdb只需要保存已经运行好的临时文件)
  2. 修复速度慢
  3. 运行效率慢

Redis发布订阅

类似一种消息队列

  1. 订阅者订阅通道
  2. 发布者发布
  3. 订阅者接收

相关命令

基于内存操作的Redis数据库--详解_第2张图片

Redis主从复制

将一个Redis服务器的数据复制到其他的redis服务器。前面的是主节点,后面的是从节点。

主节点写数据,从节点读数据,从节点每次从主节点处更新所读数据

作用

  1. 数据冗余:实现了数据的热备份
  2. 故障恢复:主节点出现问题,从节点便可转变为服务的提供者,从节点提供主节点的数据备份
  3. 负载均衡读写分离,写场景连接主节点,读场景连接从节点,分担服务器负载
  4. 高可用的基石:是哨兵和集群的实现基础

默认下,每台Redis服务器都是主机,只需要配置从机和从库 

哨兵模式

 自动投票选举主机:当主服务器宕机后,需要把从服务器切换为主服务器,优先考虑哨兵模式,自动版本的从库切换主库模式。

哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个单独的进程,作为进程,他会独立运行。哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。

哨兵在做什么?

  1. 发送命令
  2. 切换主机
  3. 注:多个哨兵监控Redis服务器(怕误判)

Redis缓存穿透和雪崩

缓存穿透

缓存中没有查到,向持久层(数据库)发出查询请求,发送请求的太多了就会给数据库造成很大的压力,这时候就相当于缓存穿透。

解决办法

  1. 布隆过滤器···布隆过滤器是一种数据结构,对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合的则丢弃,从而避免持久层数据库的查询压力
  2. 缓存空对象···当存储层不命中后,及时返回的空对象也将其缓存起来,同时会设置一个过期时间,之后再访问这个数据将会从缓存中获取,保护后端数据源(第二次以及后几次查询时,直接返回第一次保存的查询返回

缓存击穿

一个key非常热点,在不断扛着大量并发,大并发集中对这个点进行访问,在这个key失效的瞬间,持续的大并发穿破缓存,直接请求数据库

解决办法

  1. 热点数据永不过期···不设置过期时间,就不会出现热点key过期后产生的问题
  2. 加互斥锁···使用分布式锁,保证对于每一个key来说同时只有一个线程去查询后端服务,等于把高并发的压力转移给了分布式锁,对于分布式锁的要求比较高

缓存雪崩

指在某一时间段内,缓存集中过期失效,或者Redis宕机,造成数据库的周期性压力波峰

 致命的雪崩是缓存服务器的某个节点宕机或断网,对数据库服务器造成的压力是不可预估的,很有可能就把数据库压宕机

解决办法

  1. Redis高可用···增设几台Redis,搭建缓存服务器集群
  2. 限流降级···加锁或者队列,转移压力
  3. 数据预热···给不同的key设置不同的过期时间,让缓存失效的时间点尽量均匀。

你可能感兴趣的:(Linux,数据库)