Redis

redis过期策略和内存淘汰机制

筅森魡賤 提交于 2020-11-08 07:07:13
[toc] 常见的删除策略 1.定时删除:在设置键的过期时间的同时,创建一个timer,让定时器在键的过期时间到达时,立即执行对键的删除操作。(主动删除) 对内存友好,但是对cpu时间不友好,有较多过期键的而情况下,删除过期键会占用相当一部分cpu时间。 2.惰性删除:放任过期键不管,但是每次从键空间中获取键时,都检查取到的键是否过去,如果过期就删除,如果没过期就返回该键。(被动删除) 对cpu时间友好,程序只会在取出键的时候才会对键进行过期检查,这不会在删除其他无关过期键上花费任何cpu时间,但是如果一个键已经过期,而这个键又保留在数据库中,那么只要这个过期键不被删除,他所占用的内存就不会释放,对内存不友好。 3.定期删除:每隔一段时间就对数据库进行一次检查,删除里面的过期键。(主动删除) 采用对内存和cpu时间折中的方法,每个一段时间执行一次删除过期键操作,并通过限制操作执行的时长和频率来减少对cpu时间的影响。难点在于,选择一个好的策略来设置删除操作的时长和执行频率。 redis使用的过期策略:定期删除+惰性删除 定期删除 redis 会将每个设置了过期时间的 key 放入到一个独立的字典中,以后会定期遍历这个字典来删除到期的 key。 Redis 默认会每秒进行十次过期扫描(100ms一次),过期扫描不会遍历过期字典中所有的 key,而是采用了一种简单的贪心策略。

redis 过期淘汰机制

◇◆丶佛笑我妖孽 提交于 2020-11-08 06:44:34
redis是基于内存的,内存都是有限的,如果我们往redis中添加的数据超出了redis的内存范围会怎么样呢? 答案:某些数据将会被删除 那么如何删除呢? 手动设置过期时间:比如使用set key (expire time)设置为1个小时过期,那么1个小时之后get key还能不能得到数据呢? 答案肯定是得不到的了,那就证明数据被删除了吗?显然不是,设置过期时间, redis也只是 ---- 定期删除+惰性删除 简单说:设置了过期的key,redis会定期去检查当前过期的,然后删除,但是不是遍历所有key找出过期的,而是随机抽取,那么这样定期删除肯定就不能保证所有过期的key被删除掉,那内存中就会堆积大量过期的key,当然当我们手动 get key时如果过期了,则redis会删除, 那么如果没有被随机抽取我们也没有手动去操作的过期key,redis如何处理呢—— “淘汰”策略 Redis 有哪几种数据“淘汰”策略? 内存淘汰策略(LRU算法) noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。一般不使用 allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(这个是最常用的) allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key volatile-lru:当内存不足以容纳新写入数据时

redis的过期时间设置和过期删除机制

只愿长相守 提交于 2020-11-08 06:02:10
1.设置过期时间 redis有四种命令可以用于设置键的生存时间和过期时间 EXPIRE <KEY> <TTL> : 将键的生存时间设为 ttl 秒 PEXPIRE <KEY> <TTL> :将键的生存时间设为 ttl 毫秒 EXPIREAT <KEY> <timestamp> :将键的过期时间设为 timestamp 所指定的秒数时间戳 PEXPIREAT <KEY> <timestamp>: 将键的过期时间设为 timestamp 所指定的毫秒数时间戳. 2.保存过期时间 那么redis里面对这些key的过期时间和生存时间的信息是怎么保存的呢?? 答:在数据库结构redisDb中的expires字典中保存了数据库中所有键的过期时间,我们称 expire这个字典 为过期字典。 ( 1 )过期字典是一个指针,指向键空间的某个键对象。 ( 2)过期字典的值是一个longlong类型的整数,这个整数保存了键所指向的数据库键的过期时间–一个毫秒级的 UNIX 时间戳。 3.过期间的删除策略 如果一个键是过期的,那它到了过期时间之后是不是马上就从内存中被被删除呢??如果不是,那过期后到底什么时候被删除呢?? 其实有三种不同的删除策略: (1):立即删除。在设置键的过期时间时,创建一个回调事件,当过期时间达到时,由时间处理器自动执行键的删除操作。 立即删除能保证内存中数据的最大新鲜度

Redis配置文件参数说明

﹥>﹥吖頭↗ 提交于 2020-11-08 04:51:46
# Redis configuration file example # Note on units: when memory size is needed, it is possible to specifiy # it in the usual form of 1k 5GB 4M and so forth: # # 1k => 1000 bytes # 1kb => 1024 bytes # 1m => 1000000 bytes # 1mb => 1024*1024 bytes # 1g => 1000000000 bytes # 1gb => 1024*1024*1024 bytes # # units are case insensitive so 1GB 1Gb 1gB are all the same. # By default Redis does not run as a daemon. Use 'yes' if you need it. # Note that Redis will write a pid file in /var/run/redis.pid when daemonized. daemonize yes # When running daemonized, Redis writes a pid file in /var/run/redis.pid

如何快速获得高并发编程经验?PCC性能挑战赛作品简介及源代码

纵然是瞬间 提交于 2020-11-08 04:50:17
如何快速获得高并发编程经验?PCC性能挑战赛作品简介及源代码 PCC 是 Performance Challenge Championship (性能挑战杯)的缩写,是高可用架构后花园会员在线上组织的一个活动,由于反响热烈,考虑到线下进行可以更好的加深对高并发编程的理解,于是高可用架构在 3 月组织了本次 PCC 活动。 对于工程师来说,参加 PCC 编程挑战赛的部分意义: 体验完成一个技术小目标。高性能系统如何实现应当是每个工程师需要走的路。 学习优秀的架构方法,隔壁老王用的设计思想,可能你坐在办公室永远也无法想到。 有经验评委的点评,了解真实环境的高并发系统的追求目标。 类似主题、有同样级别参赛队员及评委参加的编程活动,可能仅此一次。 比赛方法说明 实现类似 facebook 中的 like 功能,需要: 可以对一个对象(一条feed、文章、或者url)进行 like 操作,禁止 like 两次,第二次 like 返回错误码 有 isLike 接口,返回参数指定的对象有没有被当前用户 like 过 需要看到一个对象的 like 计数 可以看到一个对象的 like 用户列表(类似 QQ 空间); 上述列表加分项:Like优先显示我的好友列表(social list)。 数据量:每天新增的 like 对象数为 1 千万,每秒 like 计数器查询量为 30 万次 / 秒。 比赛盛况

?花费6个月的时间,五面阿里java岗,最后竟然差点倒在最后HR面

情到浓时终转凉″ 提交于 2020-11-08 04:49:18
不知道多少人为了去阿里技术部看看,经历过什么,本人的为了面阿里,前后准备时间和面试一共花费了6个月的时间。 在面试前三面真的有点急促,一周内就面完了三次面试,接着就开始无尽的等待,整整等了三周左右,终于完成了四面和HR面。整个过程还是比较曲折的,技术面试还是挺考察技术深度的。现在已拿到offer。 面试问题如下:一面(主要看基础): 先自我介绍,讲讲自己基础掌握情况,以及项目经历 平时会用到哪些数据结构? 链表和数组的优缺点? 解决hash冲突的方法有哪些? 讲讲自己对HashMap的理解,以及和Weakhashmap的区别? 你刚才讲的是JDK1.7版本的实现,知道JDK1.8做了哪些改动么? 你们在微服务中用RPC通信还是REST? RPC和HTTP的关系是什么? 谈谈什么是HTTP的长连接和短连接? TCP的三次握手和四次挥手,以及为什么要三次握手,而不是二次? TCP 有哪些状态,相应状态的含义? 并发包中锁的实现底层(对AQS的理解)? 乐观锁和悲观锁的理解及如何实现,有哪些实现方式? SynchronizedMap和ConcurrentHashMap有什么区别? 如何使用阻塞队列实现一个生产者和消费者模型? 简述一下Java 垃圾回收机制? 如何判断一个对象是否存活? 什么是tomcat类加载机制? 类加载器双亲委派模型机制? 让你评价一下你自己? 二面

同样是持久化,竟然有这么大的差别!

瘦欲@ 提交于 2020-11-07 19:25:09
Python实战社群 Java实战社群 长按识别下方二维码, 按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群 ▲ 作者丨莱乌 来源丨IT界农民工(ID:kejishuqian) 作为内存数据库,Redis 在数据存储与读取上的速度是毫不逊色的,这点毋庸置疑。但是对于内存来说,断电或遇到故障后数据就会丢失,这却是一个无法回避的问题。令人欣慰的是,基于这样的缺点,Redis 也提供了不同的持久化方案。 各位看官请随小莱接着往下看: - 思维导图 - RDB持久化 对于 Redis 持久化来说,其实就是将存储在内存中的数据写入到磁盘里,只不过写入的方式是有一定策略的。 那么我们先来看下第一种持久化,首先出场的是 RDB。 1、什么是RDB持久化 英文名称是 Redis DataBase,它还有一个常用的名字: 快照持久化 。所谓快照,在这里指的是某一时刻的内存数据,而持久化则是将这一时刻的数据以二进制形式写入到磁盘里。 2、手动触发机制 (1)save 命令 你可能会问了,那我通过什么样的方式来实现持久化呢?不知道你有没有用过 save 这个命令,在 Redis 里担任的角色是用来手动触发持久化的。也就是说在 Redis 客户端操作 save 命令就可以将内存数据写入到磁盘里。 不过你可千万不要好奇,生产环境要是这么玩儿的话,数据量少还行

Redis入门指南(附网盘下载链接)

若如初见. 提交于 2020-11-07 15:39:47
https://pan.baidu.com/s/1SMHpPN6YdGHoxpArUd0f7Q#list/path=%2F 提取码:4lcx Redis如今已经成为Web开发社区中最火热的内存数据库之一,而它的诞生距现在不过才4年。随着Web 2.0的蓬勃发展,网站数据快速增长,对高性能读写的需求也越来越多,再加上半结构化的数据比重逐渐变大,人们对早已被铺天盖地地运用着的关系数据库能否适应现今的存储需求产生了疑问。而Redis的迅猛发展,为这个领域注入了全新的思维。 Redis 凭借其全面的功能得到越来越多的公司的青睐,从初创企业到新浪微博这样拥有着几百台Redis服务器的大公司,都能看到Redis的身影。Redis也是一个名副其实的多面手,无论是存储、队列还是缓存系统,都有它的用武之地。 本书将从Redis的历史讲起,结合基础与实践,带领读者一步步进入Redis的世界。 目标读者 本书假定读者是Redis的新手,甚至可能连Redis是什么都没听说过。本书将会详细地介绍Redis是什么以及为什么要使用Redis,旨在能够让读者从零开始逐步晋升为一个优秀的Redis开发者。 本书还包含了很多Redis实践方面的知识,对于有经验的Redis开发者,大可以直接跳过已经掌握的内容,只阅读感兴趣的部分。每章的引言都简要介绍了本章要讲解的内容,供读者参考。

分布式锁之redisson

倾然丶 夕夏残阳落幕 提交于 2020-11-07 13:05:03
redisson是redis官网推荐的java语言实现分布式锁的项目。当然,redisson远不止分布式锁,还包括其他一些分布式结构。详情请移步:https://github.com/mrniko/redisson/wiki   redisson支持4种链接redis的方式:    Cluster (集群)    Sentinel servers (哨兵)    Master/Slave servers (主从)    Single server (单机)   下面通过简单的案例使用redisson的lock。   1、RedissonManager类,管理redisson的初始化等操作。 public class RedissonManager { private static final String RAtomicName = "genId_"; private static Config config = new Config(); private static Redisson redisson = null; public static void init(){ try { config.useClusterServers() //这是用的集群server .setScanInterval(2000) //设置集群状态扫描时间