Redis高级主题
Redis高级主题
持久化
Redis 支持持久化, 其持久化数据有两种方式. 两种可以同时使用. 如果同时使用, Reids 在重启时将使用 AOF 方式来还原数据.
RDB
按照一定策略定时同步内存的数据到磁盘.文件名 dump.rdb
snapshot: 快照复制. Redis在指定情况下触发快照: (1) 按配置的规则;(2) save 或 bgsave 命令执行;(3) flushall 命令; (4)执行复制
配置的规则:
save seconds exchange当在 seconds 指定的时间内, key 的数量更改大于 exchange 时发生快照.save 或 bgsave 命令: 执行快照同步操作, 注意
save这个操作会暂时阻塞客户端请求.bgsave则不会阻塞flushall: 清除内存所有数据, 只要规则不为空, redis就会执行快照
执行复制:
快照原理
fork 复制一份当前进程的副本, 这个进程是子进程, 负责同步持久化到磁盘. 而父进程负责处理客户端请求.
快照的优缺点:
- 缺点: 可能会丢失数据, 在下一次快照前宕机
- 优点: 最大化Redis的性能, 父子进程职责分离
AOF
保存命令到磁盘, 也就是持久化日志.
配置:
appendonly yes启动aof. 默认的文件名是appendonly.aof.- 配置
auto-aof-rewrite-percentage 100当 aof 文件与上一次文件的大小相比, 超过配置的百分比就进行重写 配置
auto-aof-rewrite-min-size 64m限制允许重写最小 aof 文件大小, 即小于64m时不重写aof 重写原理: aof 重写是安全的. 相当于同时将命令追加到现有的aof文件, 同时写入新的 aof 临时文件, 临时文件最终将覆盖原 aof 文件.
同步磁盘数据: aof机制会将命令记录到aof文件, 但实际是同步到操作系统的缓存区, 最终由操作系统同步到磁盘. 可以通过下面配置修改策略
appendsync always每次执行写入就同步, 安全但影响性能appendsync everysec每一秒执行appendsync no不执行同步, 由操作系统去执行, 效率高但不安全aof 文件损坏后的修复, 使用
redis-check-aof-fix
集群
master/slave 复制
主从方式, 从是只读的, slave也可以有自己的slave.
slave节点上配置
slaveof masterip masterport配置
slave-serve-stale-data no可以用来保证数据同步后再做其他操作命令
info replication可以查看信息.实现原理:
- slave 连接到 master 后, 会向 master 发送
SYNC命令. - master 收到命令后, 会做两件事(1) 执行bgsave;(2)master 将收到的修改命令存入缓冲区, 再将命令传输给slave
- slave 连接到 master 后, 会向 master 发送
复制方式:
- 基于rdb文件复制
- 无硬盘复制 配置
rpli-diskless-sync yes - 增量复制 PSYNC master run id. offset
命令
replconf listening-port 6379可以用来查看复制过程缺点: 无法做master选举
sentinale 哨兵模式
- 监控
- master选举
- 配置文件为
sentinel.conf 配置节点:
sentinel monitor mymaster 192,168,11,111 6379 2最后的2为投票数是高可用方案, 但不是高性能方案
集群
原理
Reids有slot槽的概念: redis中有16384个. 根据key的 CRC16 算法, 取得的结果与槽数取模.落入的槽的索引是固定的. 然后根据节点数将槽的范围确定到每个节点上.
当节点新增和删除时, 节点的槽范围发生变化, 数据迁移需要人工干预.
三方方案
- redis shardding : jedis支持
- codis : 代理, 分片和数据迁移自动化
- twemproxy :
缓存穿透问题
- 数据库中不存在的对象查询后也缓存.
if(objJson!=null){
redisService.expire("key",timeout:3*60);
} else {
redisService.expire("key",timeout:5); //5秒内不查询数据库
}
synchronized方法, 不理想, 排队影响性能.- 同步块, 需要双重判定, 否则阻塞的线程均会查询数据库, 代码如下
String value = redisService.get("key");
if(value==null){
synchronized(lock){
value = redisService.get("key"); //多线程再次查询,防止数据库多次查询
if(value==null){
value = dao.get();
redisService.set("key",value);
if(objJson!=null){
redisService.expire("key",timeout:3*60);
} else {
redisService.expire("key",timeout:5); //5秒内不查询数据库
}
}
}
}
使用
ReentrantLock的tryLock(),else中线程等待一段时间, 这样不阻塞进程- 使用分布式锁
if(redisService.setNx("key")==true){
//查询数据库
}
- 不设超时时间或设置一个较长的超时时间, 然后判断当前时间是否超过缓存时间, 结合分布式锁, 超过则刷新缓存. 此解决方法可能会发生少量数据不一致的情况.
采用何种策略需要结合实际需求, 是保证可用, 还是保证一致性? 对于一致性要求不高的场景, 可能最后一种方案可以彻底解决击穿问题. 对于一致性要求较高的场景, 使用同步/锁的方式会更好.
Redis高级主题的更多相关文章
- 分布式系列十二: Redis高级主题
持久化 Redis 支持持久化, 其持久化数据有两种方式. 两种可以同时使用. 如果同时使用, Reids 在重启时将使用 AOF 方式来还原数据. RDB 按照一定策略定时同步内存的数据到磁盘.文件 ...
- redis 高级特性 不要太好用
Redis高级特性及应用场景 redis中键的生存时间(expire) redis中可以使用expire命令设置一个键的生存时间,到时间后redis会自动删除它. 过期时间可以设置为秒或者毫秒精度. ...
- Redis高级特性及应用场景
Redis高级特性及应用场景 redis中键的生存时间(expire) redis中可以使用expire命令设置一个键的生存时间,到时间后redis会自动删除它. 过期时间可以设置为秒或者毫秒精度. ...
- 分布式缓存技术redis学习系列(四)——redis高级应用(集群搭建、集群分区原理、集群操作)
本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...
- NoSQL之Redis高级实用命令详解--安全和主从复制
Android IOS JavaScript HTML5 CSS jQuery Python PHP NodeJS Java Spring MySQL MongoDB Redis NOSQL Vim ...
- 分布式缓存技术redis学习(四)——redis高级应用(集群搭建、集群分区原理、集群操作)
本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...
- Python:高级主题之(属性取值和赋值过程、属性描述符、装饰器)
Python:高级主题之(属性取值和赋值过程.属性描述符.装饰器) 背景 学习了Javascript才知道原来属性的取值和赋值操作访问的“位置”可能不同.还有词法作用域这个东西,这也是我学习任何一门语 ...
- Mego开发文档 - 建模高级主题
建模高级主题 在建模过程中我们还有许多其他情况,这里列出本框架中的有用特性来用于解决此类问题. 函数映射 我们可以将指定的CLR函数映射到数据库中的系统函数或自定义函数,该特性用于补充框架中未提供的数 ...
- 3.Redis高级功能
3.Redis高级功能3.1 慢查询分析3.1.1 慢查询的两个配置参数3.1.2 最佳实践3.1.3 单线程架构3.2 Redis Shell3.2.1 redis-cli 详解3.2.2 redi ...
随机推荐
- C# 数据类型转化为byte数组
short数据与byte数组互转 public byte[] ShortToByte(short value) { return BitConverter.GetBytes(value); } pub ...
- 设置Portainer管理Docker并且开启https(简单方法)
1. 序言 Portainer是一个十分好用的docker图形化管理界面,可以很方便的查看容器状态,错误log等等. 2. 安装 安装portainer是十分简单的,只需要执行docker pull ...
- java服务宕机原因查询
背景 在java服务项目上线之后经常会出现宕机的情况 常见原因 内存溢出 1.查到服务进程号 [root@wms ~]# ps -ef|grep java root 6399 6069 0 08:57 ...
- 顺序表应用8:最大子段和之动态规划法(SDUT 3665)
Problem Description 给定n(1<=n<=100000)个整数(可能为负数)组成的序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a ...
- AcWing:146. 序列(小根堆 + 数学归纳 + 贪心)
给定m个序列,每个包含n个非负整数. 现在我们可以从每个序列中选择一个数字以形成具有m个整数的序列. 很明显,我们一共可以得到nmnm个这种序列, 然后我们可以计算每个序列中的数字之和,并得到nmnm ...
- Zjoi2010排列计数Perm
这东西还是挺有思想的,道听途说一些东西,问问DuanYue同志,然后自己打表画树推了推,就搞出来了. 首先根据p i>p i/2(向下取整)这种形式,如果线段树学的好的人,一定能看出来,这是在唯 ...
- Java - 单链表
链表是一种常见的基础数据结构,是一种有序的列表,但不会按照线性顺序存储数据,而是在每一个节点里存储下一个节点的指针(next).链表适合插入.删除,不宜过长,否则会导致遍历性能下降. 以节点方式存储: ...
- HailStone序列
目前HailStone序列还未被证明是否有穷,所以它未必是一个算法. * HailStone序列* n=1时,返回1:* n>1时且为偶数时,{n} ∪ {n/2}* n>1时且为奇数时, ...
- 石川es6课程---12、Promise
石川es6课程---12.Promise 一.总结 一句话总结: 用同步的方式来书写异步代码,让异步书写变的特别简单 用同步的方式来书写异步代码Promise 让异步操作写起来,像在写同步操作的流程, ...
- leetcode-hard-array- 227. Basic Calculator II
mycode 29.58% class Solution(object): def calculate(self, s): """ :type s: str :rtyp ...