点关注,不迷路;持续更新Java相关技术及资讯!!!

一、Redis的单线程和高性能

Redis 单线程为什么还能这么快?

因为它所有的数据都在内存中,所有的运算都是内存级别的运算(纳秒),而且单线程避免了多线程的切换(上下文切换)性能损耗问题。正因为 Redis 是单线程,所以要小心使用 Redis 指令,对于那些耗时的指令(比如keys),一定要谨慎使用,一不小心就可能会导致 Redis 卡顿。

Redis 单线程如何处理那么多的并发客户端连接?

Redis的IO多路复用:redis利用epoll来实现IO多路复用,将连接信息和事件放到队列中,依次放到文件事件分派器,事件分派器将事件分发给事件处理器。

Nginx也是采用IO多路复用原理解决C10K问题。

持久化

RDB快照(snapshot)

在默认情况下, Redis 将内存数据库快照保存在名字为dump.rdb的二进制文件中。

你可以对 Redis 进行设置, 让它在N秒内数据集至少有M个改动这一条件被满足时, 自动保存一次数据集。

比如说, 以下设置会让 Redis 在满足60秒内有至少有1000个键被改动”这一条件时, 自动保存一次数据集:

save 60 1000

redis.conf文件里面有默认的3种情况,3种是或的关系

AOF(append-only file)

快照功能并不是非常耐久(durable): 如果 Redis 因为某些原因而造成故障停机, 那么服务器将丢失最近写入、且仍未保存到快照中的那些数据。从 1.1 版本开始, Redis 增加了一种完全耐久的持久化方式: AOF 持久化,将修改的每一条指令记录进文件

你可以通过修改配置文件来打开 AOF 功能:

appendonly yes

开启后,每当 Redis 执行一个改变数据集的命令时(比如SET), 这个命令就会被追加到 AOF 文件的末尾。

这样的话, 当 Redis 重新启时, 程序就可以通过重新执行 AOF 文件中的命令来达到重建数据集的目的。

你可以配置 Redis 多久才将数据fsync到磁盘一次

有三个选项:

每次有新命令追加到 AOF 文件时就执行一次fsync:非常慢,也非常安全。

每秒fsync一次:足够快(和使用 RDB 持久化差不多),并且在故障时只会丢失 1 秒钟的数据。

从不fsync:将数据交给操作系统来处理。更快,也更不安全的选择。

推荐(并且也是默认)的措施为每秒fsync一次, 这种fsync策略可以兼顾速度和安全性。

RDB 和 AOF ,我应该用哪一个?

如果你非常关心你的数据, 但仍然可以承受数分钟以内的数据丢失, 那么你可以只使用 RDB 持久化。

有很多用户都只使用 AOF 持久化, 但我们并不推荐这种方式: 因为定时生成 RDB 快照(snapshot)非常便于进行数据库备份, 并且 RDB 恢复数据集的速度也要比 AOF 恢复的速度要快。

Redis 4.0 混合持久化

重启 Redis 时,我们很少使用 rdb 来恢复内存状态,因为会丢失大量数据。我们通常使用 AOF 日志重放,但是重放 AOF 日志性能相对 rdb 来说要慢很多,这样在 Redis 实例很大的情况下,启动需要花费很长的时间。 Redis 4.0 为了解决这个问题,带来了一个新的持久化选项——混合持久化。

AOF在重写(aof文件里可能有太多没用指令,所以aof会定期根据内存的最新数据生成aof文件)时将重写这一刻之前的内存rdb快照文件的内容和增量的 AOF修改内存数据的命令日志文件存在一起,都写入新的aof文件,新的文件一开始不叫appendonly.aof,等到重写完新的AOF文件才会进行改名,原子的覆盖原有的AOF文件,完成新旧两个AOF文件的替换;

aof 根据配置规则在后台自动重写,也可以人为执行命令bgrewriteaof重写AOF。 于是在 Redis 重启的时候,可以先加载 rdb 的内容,然后再重放增量 AOF 日志就可以完全替代之前的 AOF 全量文件重放,重启效率因此大幅得到提升。

开启混合持久化:

aof-use-rdb-preamble yes

混合持久化aof文件结构

缓存淘汰策略(解决数据热点问题):

当 Redis 内存超出物理内存限制时,内存的数据会开始和磁盘产生频繁的交换 (swap)。交换会让 Redis 的性能急剧下降,对于访问量比较频繁的 Redis 来说,这样龟速的存取效率基本上等于不可用。

在生产环境中我们是不允许 Redis 出现交换行为的,为了限制最大使用内存,Redis 提供了配置参数 maxmemory 来限制内存超出期望大小。

当实际内存超出 maxmemory 时,Redis 提供了几种可选策略 (maxmemory-policy) 来让用户自己决定该如何腾出新的空间以继续提供读写服务。

noeviction:

不会继续服务写请求 (DEL 请求可以继续服务),读请求可以继续进行。这样可以保证不会丢失数据,但是会让线上的业务不能持续进行。这是默认的淘汰策略。

volatile-lru:

尝试淘汰设置了过期时间的 key,最少使用的 key 优先被淘汰。没有设置过期时间的 key 不会被淘汰,这样可以保证需要持久化的数据不会突然丢失。

volatile-ttl:

跟上面一样,除了淘汰的策略不是 LRU,而是 key 的剩余寿命 ttl 的值,ttl 越小越优先被淘汰。

volatile-random:

跟上面一样,不过淘汰的 key 是过期 key 集合中随机的 key。

allkeys-lru:

区别于 volatile-lru,这个策略要淘汰的 key 对象是全体的 key 集合,而不只是过期的 key 集合。这意味着没有设置过期时间的 key 也会被淘汰。

allkeys-random跟上面一样,不过淘汰的策略是随机的 key。

volatile-xxx :

策略只会针对带过期时间的 key 进行淘汰,allkeys-xxx 策略会对所有的 key 进行淘汰。如果你只是拿 Redis 做缓存,那应该使用 allkeys-xxx,客户端写缓存时不必携带过期时间。如果你还想同时使用 Redis 的持久化功能,那就使用 volatile-xxx 策略,这样可以保留没有设置过期时间的 key,它们是永久的 key 不会被 LRU 算法淘汰。

本文到这里就结束了,喜欢的朋友可以帮忙转发和关注一下,感谢支持!

为了感谢大家对我的支持,为此,整理出了一份最新的Java免费资料。让你用最短的时间,获得最大的收获。小编整理的资料如下免费送给每一位学习Java的朋友!

这份知识尤其适合:

1.近期想跳槽,要面试的Java程序员,查漏补缺,以便尽快弥补短板;

2.想了解“一线互联网公司”最新招聘需求/技术要求,对比找出自身的长处和弱点所在,评估自己在现有市场上的竞争力如何;

3.还没形成系统的Java知识体系,缺乏清晰的提升方向和学习路径的程序员。

4.想去一线互联网公司缺乏信心

有需要的朋友们可以以下两种方式领取:

  • 关注、转发、评论后:私信小编发送“源码”(免费获取)(私信不要多字,不要少字,不要错字)
  • 关注公众号:Java大型网站架构(免费获取)

java redis设置过期时间_Redis的一些核心原理相关推荐

  1. java redis set 过期时间_redis分布式锁自动延长过期时间

    分布式系统概念与设计(原书第5版) 93.8元 包邮 (需用券) 去购买 > 背景项目组已经有个分布式锁注解(参考前文<记一次分布式锁注解化>),但是在设置锁过期时间时,需要去预估业 ...

  2. redis设置过期时间与直接detele key有什么区别

    redis设置过期时间与直接detele key有什么区别 Redis 中设置过期时间和直接删除 key 有以下几点区别: 效率:当使用 key 的过期时间时,Redis 会在 key 过期时自动删除 ...

  3. c# redis 如何设置过期时间_Redis Hash存储token、及设置过期时间

    相信大家在很多业务场景都会遇到对数据设置过期时间,如安全认证token.短信验证码等.一般我们的解决有几种:存redis.存数据库.实时计算(如JWT),不管使用哪种方式,需求就是过期了对数据的清理. ...

  4. c# redis hashid如何设置过期时间_Redis数据库实现原理(划重点)

    Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中,db数组的每一项都是一个redis.h/redisDb结构,每个redisDb结构代表一个数据库, ...

  5. java如何保证redis设置过期时间的原子性_2020年4月Redis面试题和答案整理

    点关注,不迷路:持续更新Java相关技术及资讯!!! 关注.转发.评论头条号每天分享java 知识,私信回复"源码" 赠送Spring源码分析.Dubbo.Redis.Netty. ...

  6. java如何保证redis设置过期时间的原子性_分布式锁用 Redis 还是 Zookeeper

    在讨论这个问题之前,我们先来看一个业务场景: 系统A是一个电商系统,目前是一台机器部署,系统中有一个用户下订单的接口,但是用户下订单之前一定要去检查一下库存,确保库存足够了才会给用户下单. 由于系统有 ...

  7. c# redis hashid如何设置过期时间_Redis中Key过期策略amp;淘汰机制

    1. Redis中设置Key过期时间 我们有两种方式设置过期时间 1.1 设置多久后过期 设置一个 key 10s 过期,可以这样 127.0.0.1:6379> SET key value E ...

  8. c# redis 如何设置过期时间_Redis 过期时间与内存管理

    http://www.redis.cn/commands/expire.html http://www.redis.cn/topics/lru-cache.html 内存管理 当 Redis 作为缓存 ...

  9. redis如何设置定时过期_redis补充6之Redis 设置过期时间

    一般情况下,我们设置保存的缓存数据的时候都会设置一个过期时间. Redis 中有个设置时间过期的功能,即对存储在 Redis 数据库中的值可以设置一个过期时间.作为一个缓存数据库,这是非常实用的.如我 ...

最新文章

  1. BZOJ4690 Never Wait for Weights(并查集)
  2. 运行war包的命令及linux下实时查看日志
  3. 设计模式:组合模式(Composite)
  4. HashMap面试指南
  5. cvpr2020 人脸检测与识别_CVPR 2020 | 元学习人脸识别框架详解
  6. stretchblt 模糊_微软开源持续开发模糊测试工具OneFuzz
  7. MFC动态链接库和WIN32动态链接库 及区别
  8. 内网穿透的一种方式——基于ngrok的小米球
  9. Cocos2d-X开发中国象棋《八》走棋
  10. PreparedStatement类详解以及案例
  11. 学以致用——Java源码——抛双骰儿游戏综合评估(游戏步数与胜率的关系,公平性,平均步数等)(Game of Craps Evaluation)
  12. IDEA统计自己写了多少行Java代码,看看自己的辛劳成果吧
  13. 关于HTML5页面与手机虚拟键盘的回车的处理
  14. 迁移网易博客到csdn
  15. 毕业了,等待我们的是什么?
  16. Ubuntu 22.04 LTS 是史诗级的版本?
  17. 数睿数据与沙特领先的云平台厂商Virtual Vision达成战略合作!
  18. java 使用 Amazon SES 发送电子邮件
  19. Element-ui源码分析之滚动条— el-scrollbar
  20. 【前端项目问题】draw抽屉的实现(Vue3)

热门文章

  1. 循序渐进 OSPF的详细剖析(三)
  2. jQuery在绑定事件时如何传入参数
  3. object dection资源
  4. 当析构函数遇到多线程──C++ 中线程安全的对象回调
  5. 基于Python的频谱分析(一)
  6. Hadoop集群的安全模式
  7. java诡异的String.split()方法
  8. Visual Studio 2012 调试程序加载缓慢,提示正在下载符号
  9. Cannot read property 'nodeType' of null; audio元素默认样式下载按钮
  10. 同一label显示不同字体