Redis

Redis

1.缓存机制原理说明

缓存机制:
缓存中的数据,一定是数据库中的数据,使用缓存主要的目的就是降低用户访问物理设备的频次.
如果数据库记录更新,则缓存应该同步更新.

1.缓存的数据结构 K-V结构进行数据保存
2. 开发语言选择 C语言程序
3. 缓存数据的运行环境在内存中, 断电即擦除. 将内存数据进行持久化操作.
4. 如果不停的添加缓存的记录肯定会造成内存溢出. 定期优化缓存机制.
1.LRU算法 2.LFU算法 3.Random 4.TTL
5. 缓存也需要实现高可用机制.搭建缓存集群.

2. Redis介绍

1. 官网介绍

URL地址: http://www.redis.cn
Redis 是一个开源(BSD许可)的 内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。

效率: 读: 11.2万次/秒 写: 8.6万次/秒 平均:10万次/秒 口诀: 1-5-8

2. 知识拓展

1.数据库:
1.关系型数据库 mysql数据库/oracle数据 2维表 行/列
2.非关系型数据库 mongodb/hbase/Redis 1维表
2. 中间件:
50万次/秒 吞吐量

3. Linux上安装Redis

1. 上传安装包

2. 解压redis

说明: tar -xvf redis-5.0.4.tar.gz 解压完成之后删除安装包/ 修改文件名称

3. 安装redis

说明: 在redis根目录中执行如下命令
命令: 1. make
2.make install //c语言转换

4. 进制换算

1k => 1000 bytes
1kb => 1024 bytes
1m => 1000000 bytes
1mb => 10241024 bytes
1g => 1000000000 bytes
1gb => 10241024*1024 bytes

5. 修改Redis配置

配置文件 vim redis.conf
set un 展现行号

1.修改IP绑定 #bing 127.0.0.1
2.关闭保护模式 protected-mode no
3 开启后端运行 demonize yes

4 服务器命令

启动  redis-server  redis.conf
进入客户端  redis-cli  –p  6379  (redis-cli)
退出客户端  exit/quit/ctrl+c
查看状态 ps –ef | grep redis
关闭 redis-cli  –p  6379  shutdown   (redis-cli  shutdown)
	客户端Redis命令(String)  节选
		set        添加key-value                  
		 get     根据key获取value
  		strlen      根据key获取value长度          
  		exist	判断key是否存在
del        删除redis中key                 
keys    用于查询符合条件的key
		mset      赋值多个key-value                
		mget    获取多个key值
		append      dui某个key值进行拼接添加    
		 type     检查某个key的值进行追加
		flushall     清空单个数据库                
		 flushdb   清空所有数据库
		select      切换redis数据库               
		  incr     自动加一
decr        自动减一                      
 incrby    指定增加值
		decrby      指定数值减                     
		expire     指定key的生效时间  单位秒
		pexpire      指定key的生效时间  单位毫秒    t
		tl    检查key的剩余时间  -2 数据不存在  -1数据永不超时
		persist       撤销key的失效时间(persist  key)

5.idea AOP缓存的实现

6.关于Redis持久化机制

  业务需求:说明: Redis中将数据都保存到了内存中,但是内存的特点断电及擦除. 为了保证redis中的缓存数据不丢失,则需要将内存数据定期进行持久化操作.
持久化: 将内存数据,写到磁盘中.

1. RDB模式

  1. 关于RDB模式说明
    特点:
    1.RDB模式是Redis默认的持久化规则.
    2.RDB模式记录的是Redis内存数据快照(只保留最新数据)
    3.RDB模式定期持久化(时间可调) 可能会导致数据丢失.
    4.RDB模式备份效率是最高的.
    5.RDB模式备份阻塞式的 在备份时不允许其他用户操作. 保证数据安全性. save
    命令:
    1.主动备份 save 会阻塞用户操作
    2.后台备份 bgsave 异步的方式进行持久化操作 不会阻塞.
  2. 持久化文件名称设定和文件存储目录
    默认的条件下,持久化文件名称 dump.rdb
    ./ 代表当前文件目录. 意义使用绝对路径的写法.
  3. RDB模式配置
    1.save 900 1 900秒内,用户执行了一次更新操作时,那么就持久化一次
    2.save 300 10 300秒内,用户执行了10次更新操作. 那么就持久化一次
    3.save 60 10000 60秒内,用户执行了10000次的更新操作,则持久化一次.
    4.save 1 1 1秒内 1次更新 持久化一次!! 性能特别低.

2. AOF模式

1.开启AOF模式
  默认条件下AOF模式 默认关闭的. 配置文件中 appendonly yes
2 AOF模式特点
  说明: 当开启AOF策略之后,redis持久化以AOF为主.
特点:
1.AOF文件默认关闭的,需要手动开启
2.AOF文件记录的是用户的操作过程.则可以实现实时持久化操作.(几乎不丢数据)
3.AOF文件做追加的操作,所有持久化文件较大.
4.AOF持久化时,采用异步的方式进行.
5 AOF文件需要定期清理.
3.AOF持久化原则(配置文件)

appendfsync always 用户执行一次操作,持久化一次
appendfsync everysec 每秒持久化一次
appendfsync no 不主动持久化

3. 关于AOF与RDB如何选择

   业务:

1.如果用户追求速度,允许少量的数据丢失 首选RDB模式. 快
2.如果用户追求数据的安全性. 首选AOF模式.

面试题:
如果你在redis中执行了flushAll命令,如何挽救??
答案:
  1.只开启RDB 关闭现有redis,查看RDB文件是否被覆盖,若没有重启redis即可
  2.开启AOP 关闭redis,修改AOF文件中,删除flushAll的命令.重启redis即可.
注意事项: 一般条件下 Redis会开启AOF与RDB 2种模式,通过save操作执行rdb持久化操作
常规用法: 一般会配置redis主从结构 主机开启RDB模式 从机开启AOF模式

4. 单线程Redis为什么快?

1).redis运行环境在内存中,纯内存操作.
2).单线程操作 避免频繁的上下文切换. 避免了开关链接的开销.
3).采用了非阻塞I/O(BIO|NIO) 多路复用的机制(动态感知).

7. 关于Redis内存优化策略

1. 业务场景

  如果频繁使用redis,不停的向其中保存数据,并且不做删除操作,则内存必然溢出. 能否优化内存策略.
能否自动的删除不用的数据,让redis中保留热点数据!!!.

2. LRU算法

  LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面(数据)予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t,当须淘汰一个页面时,选择现有页面中其 t 值最大的,即最近最少使用的页面予以淘汰。
计算维度: 自上一次以来所经历的时间T.
说明:LRU算法是内存优化中最好用的算法

3. LFU算法

  LFU(least frequently used (LFU) page-replacement algorithm)。即最不经常使用页置换算法,要求在页置换时置换引用计数最小的页,因为经常使用的页应该有一个较大的引用次数。但是有些页在开始时使用次数很多,但以后就不再使用,这类页将会长时间留在内存中,因此可以将引用计数寄存器定时右移一位,形成指数衰减的平均使用次数。
维度: 引用次数
常识: 计算机左移 扩大倍数
计算机右移 缩小倍数

4. 随机算法

随机删除数据.

5. TTL算法

说明:将剩余存活时间排序,将马上要被删除的数据,提前删除.

6. Redis默认的内存优化策略

说明1: Redis中采用的策略定期删除+惰性删除策略
说明2:
1.定期删除: redis默认每隔100ms 检查是否有过期的key, 检查时随机的方式进行检查.(不是检查所有的数据,因为效率太低.)
  问题: 由于数据众多,可能抽取时没有被选中.可能出现 该数据已经到了超时时间,但是redis并没有马上删除数据.
2. 惰性策略: 当用户获取key的时候,首先检查数据是否已经过了超时时间. 如果已经超时,则删除数据.
  问题: 由于数据众多, 用户不可能将所有的内存数据都get一遍.必然会出现 需要删除的数据一直保留在内存中的现象.占用内存资源.
3.可以采用上述的内存优化手段,主动的删除.

内存优化算法说明:
1.volatile-lru 在设定超时时间的数据 采用LRU算法进行优化
2.allkeys-lru 在所有的数据采用LRU算法进行优化
3.volatile-lfu 在设定了超时时间的数据中采用LFU算法优化
4.allkeys-lfu 在所有的数据中采用LFU算法进行优化
5.volatile-random 在设定了超时时间的数据 采用随机算法
6.allkeys-random 所有数据采用 随机算法
7.volatile-ttl 设定超时时间的TTl算法
8.noeviction 不主动删除数据,如果内存溢出则报错返回.

8. 缓存穿透,缓存击穿,缓存雪崩

1. 缓存穿透

  说明: 在高并发的条件下,用户频繁访问一个不存在的数据.导致大量的请求直接发往数据库.导致服务器宕机.
解决方案:

  1. 只要能够保障用户访问的数据 数据库中一定存在. 布隆过滤器
  2. IP限流 黑名单. 微服务中可以通过API网关进行控制

2. 缓存击穿

  说明: 在高并发条件下 用户频繁访问一个热点数据. 但是该热点数据在缓存中失效.导致用户直接访问数据库.
俗语: 称它病,要它命

3. 缓存雪崩

  说明: 在高并发的条件下, 有大量的缓存数据失效了. 导致redis缓存服务器命中率太低.从而导致用户直接访问数据库.
主要问题: 热点数据失效.
解决方案:
1.为热点数据设定超时时间时 采用随机数. 10秒+随机数 保障数据不会同时失效.
2.设定多级缓存

布隆过滤器(*)

9.Redis分片机制

9.1 分片机制

  说明: 如果有海量的内存数据需要保存,但是都把数据保存到1个redis中,查询的效率太低.如果这台redis服务器宕机,.则整个缓存将不能使用.
解决方案: 采用redis分片机制。

9.2 准备配置文件

复制配置文件redis.conf 到新创建shards文件夹下 并改名6379.conf/6380.conf/6381.conf

9.3修改端口号

在配置文件中分别将三个改成对应的端口号

9.4启动三台redis

在shards目录下redis-server 6379.conf。。。启动三台redis

10一致性hash算法

10.1介绍

  一致性哈希算法在1997年由麻省理工学院提出,是一种特殊的哈希算法,目的是解决分布式缓存的问题。 在移除或者添加一个服务器时,能够尽可能小地改变已存在的服务请求与处理请求服务器之间的映射关系。一致性哈希解决了简单哈希算法在分布式哈希表( Distributed Hash Table,DHT) 中存在的动态伸缩等问题 。
核心知识:

  1. 一致性hash解决了数据与节点的映射关系(数据归谁管理)
  2. 节点增加/减少时,数据可以弹性伸缩.

10.2 一致性hash算法原理

范围:8位16进制数组成 2^32 节点=hash(IP:PORT) 顺时针排列
如果数据相同,则hash结果必然相同.

10.3 特性:平衡性

  说明: 平衡性是指hash的结果应该平均分配到各个节点,这样从算法上解决了负载均衡问题
解决策略: 引入虚拟节点 :为数据少的节点争夺数据

10.4 特性:单调性

  单调性是指在新增或者删减节点时,不影响系统正常运行 。
说明: 无论节点增/减,数据都能找到与之匹配的node进行数据的挂载

10.5 特性:分散性

  分散性是指数据应该分散地存放在分布式集群中的各个节点(节点自己可以有备份),不必每个节点都存储所有的数据 。
谚语: 鸡蛋不要放到一个篮子里.

10.6 springboot整合Redis分片

11 Redis哨兵机制

11.1 关于Redis分片特点

  Redis分片可以实现内存数据的扩容,但是如果节点宕机则直接影响程序的运行。
问题关键: 如果节点宕机,需要实现高可用.

11.2 Redis数据同步配置

11.2.1 复制目录

说明: 将shards目录复制 并且改名为sentinel

11.2.2 启动3台redis

说明: 1.删除原有的持久化文件(.rdb .aof)
2.启动3台redis

11.2.3 主从结构搭建

命令1.: slaveof host(192.168.129.129) port(6379)
命令说明: 在从机中执行上述命令 挂载的是主机的地址.

命令2: info replication
命令说明:查看状态信息 role:slave 自己是从机,挂载主机信息 role:master 状态信息是主机,自己所有从机的信息

11.3 Redis 哨兵实现

11.3.1 哨兵原理

说明:
1.当哨兵启动时,会链接redis主节点,获取所有节点的相关信息.
2.当哨兵通过心跳检测机制 PING -PONG 命令校验服务器是否正常.
3.如果哨兵连续3次发现服务器没有响应,则断定当前主机宕机.
4.之后由哨兵采用随机算法挑选其中的一个从机当选主机.并且其他的节点当做新主机的从.

11.3.2 配置哨兵服务

(1)复制文件

cp sentinel.conf sentinel/

(2)关闭保护模式
protected-mode no (17)

(3)开启后台运行
daemonize yes (26)

(4)哨兵监控
sentinel monitor mymaster 192.126.126.129 6379 1

(5) 修改宕机时间
sentinel down-after-milliseconds mymaster 10000

11.3.3哨兵命令

1.启动 redis-sentinel sentinel.conf
2.关闭哨兵 ps -ef |grep redis kill -9 PID号

11.3.4 哨兵高可用测试

1).关闭6379主机,检查从机是否当选主机
2).检查从机的配置文件 是否以后关联了主机
如果搭建错误,.则需要删除最后一条主从关系.,之后重启服务器.重新搭建.

11.4 springboot整合哨兵

11.5关于Redis分片/哨兵总结

1.分片作用: 扩大内存实现海量数据数据的存储. 缺点: 没有实现高可用
2.哨兵作用: 实现了节点的高可用. 缺点: 1.哨兵不能实现扩容 2.哨兵本身没有高可用
想法: 能否有一种机制 既可以实现内存扩容,又可以实现高可用(不需要第三方)

12 Redis集群搭建

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值