当前位置: 首页 > news >正文

福永网站制作网络定制剧

福永网站制作,网络定制剧,小程序视频网站开发,怎样安全做黑色彩票网站目录标题 过期删除策略如何设置过期时间查看key过期时间取消key过期时间如果判定key已过期过期删除策略定时删除惰性删除定期删除 Redis过期删除策略Redis如何实现定期删除第一种版本第二种版本 内存淘汰策略如何设置Redis最大运行内存第一种版本第二种版本 Redis内存淘汰策略不… 目录标题 过期删除策略如何设置过期时间查看key过期时间取消key过期时间如果判定key已过期过期删除策略定时删除惰性删除定期删除 Redis过期删除策略Redis如何实现定期删除第一种版本第二种版本 内存淘汰策略如何设置Redis最大运行内存第一种版本第二种版本 Redis内存淘汰策略不进行数据淘汰的策略进行数据淘汰的策略查看当前内存淘汰策略修改内存淘汰策略 LRU和LFU算法的区别Redis如何实现LRU算法第一种版本第二种版本 Redis如何实现LFU算法 过期删除策略 如何设置过期时间 设置 key 过期时间的命令一共有 4 个 expire key n设置 key 在 n 秒后过期比如 expire key 100 表示设置 key 在 100 秒后过期pexpire key n设置 key 在 n 毫秒后过期比如 pexpire key2 100000 表示设置 key2 在 100000 毫秒100 秒后过期。expireat key n设置 key 在某个时间戳精确到秒之后过期比如 expireat key3 1655654400 表示 key3 在时间戳 1655654400 后过期精确到秒pexpireat key n设置 key 在某个时间戳精确到毫秒之后过期比如 pexpireat key4 1655654400000 表示 key4 在时间戳 1655654400000 后过期精确到毫秒 当然在设置字符串时也可以同时对 key 设置过期时间共有 3 种命令 set key value ex n 设置键值对的时候同时指定过期时间精确到秒set key value px n 设置键值对的时候同时指定过期时间精确到毫秒setex key n valule 设置键值对的时候同时指定过期时间精确到秒。 查看key过期时间 若查询结果为-1则表示永不过期 ttl key取消key过期时间 persist key如果判定key已过期 每当我们对一个 key 设置了过期时间时Redis 会把该 key 带上过期时间存储到一个过期字典expires dict中也就是说「过期字典」保存了数据库中所有 key 的过期时间。过期字典存储在 redisDb 结构中如下 typedef struct redisDb {dict *dict; /* 数据库键空间存放着所有的键值对 */dict *expires; /* 键的过期时间 */.... } redisDb;过期字典数据结构结构如下 过期字典的 key 是一个指针指向某个键对象过期字典的 value 是一个 long long 类型的整数这个整数保存了 key 的过期时间 字典实际上是哈希表哈希表的最大好处就是让我们可以用 O(1) 的时间复杂度来快速查找。当我们查询一个 key 时Redis 首先检查该 key 是否存在于过期字典中 如果不在则正常读取键值如果存在则会获取该 key 的过期时间然后与当前系统时间进行比对如果比系统时间大那就没有过期否则判定该 key 已过期。 过期删除策略 定时删除 定时删除策略的做法是在设置 key 的过期时间时同时创建一个定时事件当时间到达时由事件处理器自动执行 key 的删除操作。定时删除策略的优点 可以保证过期 key 会被尽快删除也就是内存可以被尽快地释放。因此定时删除对内存是最友好的。 定时删除策略的缺点 在过期 key 比较多的情况下删除过期 key 可能会占用相当一部分 CPU 时间在内存不紧张但 CPU 时间紧张的情况下将 CPU 时间用于删除和当前任务无关的过期键上无疑会对服务器的响应时间和吞吐量造成影响。所以定时删除策略对 CPU 不友好。 惰性删除 惰性删除策略的做法是不主动删除过期键每次从数据库访问 key 时都检测 key 是否过期如果过期则删除该 key。 惰性删除策略的优点 因为每次访问时才会检查 key 是否过期所以此策略只会使用很少的系统资源因此惰性删除策略对 CPU 时间最友好。 惰性删除策略的缺点 如果一个 key 已经过期而这个 key 又仍然保留在数据库中那么只要这个过期 key 一直没有被访问它所占用的内存就不会释放造成了一定的内存空间浪费。所以惰性删除策略对内存不友好。 定期删除 定期删除策略的做法是每隔一段时间「随机」从数据库中取出一定数量的 key 进行检查并删除其中的过期key。 定期删除策略的优点 通过限制删除操作执行的时长和频率来减少删除操作对 CPU 的影响同时也能删除一部分过期的数据减少了过期键对空间的无效占用。 定期删除策略的缺点 内存清理方面没有定时删除效果好同时没有惰性删除使用的系统资源少。难以确定删除操作执行的时长和频率。如果执行的太频繁定期删除策略变得和定时删除策略一样对CPU不友好如果执行的太少那又和惰性删除一样了过期 key 占用的内存不会及时得到释放。 Redis过期删除策略 Redis 选择「惰性删除定期删除」这两种策略配和使用以求在合理使用 CPU 时间和避免内存浪费之间取得平衡。 Redis如何实现定期删除 第一种版本 1、这个间隔检查的时间是多长呢 在 Redis 中默认每秒进行 10 次过期检查一次数据库此配置可通过 Redis 的配置文件 redis.conf 进行配置配置键为 hz 它的默认值是 hz 10。特别强调下每次检查数据库并不是遍历过期字典中的所有 key而是从数据库中随机抽取一定数量的 key 进行过期检查。 2、随机抽查的数量是多少呢 我查了下源码定期删除的实现在 expire.c 文件下的 activeExpireCycle 函数中其中随机抽查的数量由 ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP 定义的它是写死在代码中的数值是 20。也就是说数据库每轮抽查时会随机选择 20 个 key 判断是否过期。接下来详细说说 Redis 的定期删除的流程 从过期字典中随机抽取 20 个 key检查这 20 个 key 是否过期并删除已过期的 key如果本轮检查的已过期 key 的数量超过 5 个20/4也就是「已过期 key 的数量」占比「随机抽取 key 的数量」大于 25%则继续重复步骤 1如果已过期的 key 比例小于 25%则停止继续删除过期 key然后等待下一轮再检查。 可以看到定期删除是一个循环的流程。那 Redis 为了保证定期删除不会出现循环过度导致线程卡死现象为此增加了定期删除循环流程的时间上限默认不会超过 25ms。 第二种版本 Redis 维护了一个字典结构用于存储键和键的过期时间。字典中的每个键都会关联一个过期时间过期时间存储在键的值中。Redis 使用一个全局变量 hz 来表示每秒执行的定时器触发次数。默认情况下hz 的值为 10即每秒触发定时器 10 次。每当定时器触发时Redis 会随机选择一部分键进行检查。检查的键数量由配置参数 hz 决定。对于每个被检查的键Redis 会检查键的过期时间是否小于当前时间。如果是则将该键标记为过期。定期删除的过程并不会立即删除过期键。而是将过期键添加到一个待删除的链表中。当执行写操作如 GET、SET时Redis 会先检查待删除链表中的键是否过期。如果过期则将其从数据结构中删除并释放相关资源。 内存淘汰策略 过期删除策略是删除已过期的 key而当 Redis 的运行内存已经超过 Redis 设置的最大内存之后则会使用内存淘汰策略删除符合条件的 key以此来保障 Redis 高效的运行。 如何设置Redis最大运行内存 第一种版本 在配置文件 redis.conf 中可以通过参数 maxmemory bytes 来设定最大运行内存只有在 Redis 的运行内存达到了我们设置的最大运行内存才会触发内存淘汰策略。 不同位数的操作系统maxmemory 的默认值是不同的 在 64 位操作系统中maxmemory 的默认值是 0表示没有内存大小限制那么不管用户存放多少数据到 Redis 中Redis 也不会对可用内存进行检查直到 Redis 实例因内存不足而崩溃也无作为。在 32 位操作系统中maxmemory 的默认值是 3G因为 32 位的机器最大只支持 4GB 的内存而系统本身就需要一定的内存资源来支持运行所以 32 位操作系统限制最大 3 GB 的可用内存是非常合理的这样可以避免因为内存不足而导致 Redis 实例崩溃。 第二种版本 在 Redis 中可以通过配置文件或在启动 Redis 时使用命令行参数来设置最大运行内存。 通过配置文件设置最大运行内存 找到 Redis 的配置文件 redis.conf。在配置文件中找到 maxmemory 参数。将 maxmemory 的值设置为期望的最大运行内存大小单位可以是字节例如 maxmemory 1gb或以其他更友好的格式表示例如 maxmemory 2GB。保存配置文件并重新启动 Redis。 通过命令行参数设置最大运行内存 在启动 Redis 时使用 --maxmemory 参数指定最大运行内存的大小。例如 redis-server --maxmemory 1gb。启动 Redis 时还可以使用其他相关参数如 --maxmemory-policy 来指定内存达到上限后的策略。 需要注意的是Redis 的最大运行内存设置的是 Redis 实例可使用的最大内存大小但实际的内存使用情况可能会略微超过该值因为 Redis 还需要一些内存来存储数据结构和执行内部操作。在实际应用中应根据可用的硬件资源、数据量和性能需求来设置最大运行内存。过小的内存限制可能导致数据被淘汰或频繁的内存回收操作而过大的内存限制可能浪费资源并导致 Redis 运行不稳定。因此需要根据实际情况进行适当的调优。 Redis内存淘汰策略 不进行数据淘汰的策略 noevictionRedis3.0之后默认的内存淘汰策略 它表示当运行内存超过最大设置内存时不淘汰任何数据这时如果有新的数据写入则会触发 OOM但是如果没用数据写入的话只是单纯的查询或者删除操作的话还是可以正常工作。 进行数据淘汰的策略 针对「进行数据淘汰」这一类策略又可以细分为「在设置了过期时间的数据中进行淘汰」和「在所有数据范围内进行淘汰」这两类策略。在设置了过期时间的数据中进行淘汰 volatile-random随机淘汰设置了过期时间的任意键值volatile-ttl优先淘汰更早过期的键值。volatile-lruRedis3.0 之前默认的内存淘汰策略淘汰所有设置了过期时间的键值中最久未使用的键值volatile-lfuRedis 4.0 后新增的内存淘汰策略淘汰所有设置了过期时间的键值中最少使用的键值 在所有数据范围内进行淘汰 allkeys-random随机淘汰任意键值;allkeys-lru淘汰整个键值中最久未使用的键值allkeys-lfuRedis 4.0 后新增的内存淘汰策略淘汰整个键值中最少使用的键值。 查看当前内存淘汰策略 可以使用 config get maxmemory-policy 命令来查看当前 Redis 的内存淘汰策略命令如下 127.0.0.1:6379 config get maxmemory-policy 1) maxmemory-policy 2) noeviction可以看出当前 Redis 使用的是 noeviction 类型的内存淘汰策略它是 Redis 3.0 之后默认使用的内存淘汰策略表示当运行内存超过最大设置内存时不淘汰任何数据但新增操作会报错。 修改内存淘汰策略 设置内存淘汰策略有两种方法 方式一通过“config set maxmemory-policy 策略”命令设置。它的优点是设置之后立即生效不需要重启 Redis 服务缺点是重启 Redis 之后设置就会失效。方式二通过修改 Redis 配置文件修改设置“maxmemory-policy 策略”它的优点是重启 Redis 服务后配置不会丢失缺点是必须重启 Redis 服务设置才能生效。 LRU和LFU算法的区别 在 Redis 中LRULeast Recently Used最近最少使用和 LFULeast Frequently Used最不经常使用是两种常用的缓存淘汰算法用于在内存不足时选择合适的键进行淘汰。 下面是 LRU 和 LFU 算法的区别 LRU最近最少使用算法 基本原理根据键的访问时间来选择淘汰的键。当内存不足时选择最长时间没有被访问的键进行淘汰。实现方式Redis 使用近似 LRU 算法Approximated LRU通过维护一个近似 LRU 的数据结构来追踪键的访问顺序。优点简单易懂适用于访问模式较为均匀的场景。缺点不能准确地追踪访问频率对于访问模式不均匀的场景可能会导致缓存命中率下降。 LFU最不经常使用算法 基本原理根据键的访问频率来选择淘汰的键。当内存不足时选择访问频率最低的键进行淘汰。实现方式Redis 使用 LFU 算法来追踪键的访问频率。每个键维护一个访问计数器每次访问加一当内存不足时选择计数器最低的键进行淘汰。优点适用于访问模式不均匀的场景能够较好地适应热点数据的访问需求。缺点实现复杂度较高需要维护额外的数据结构来追踪访问频率。 需要注意的是Redis 在实现 LRU 和 LFU 算法时可能会使用不同的近似方法或优化策略以平衡性能和准确性。在实际应用中可以根据访问模式和缓存需求来选择合适的算法。有时也可以结合两种算法根据具体的业务场景以及性能需求来进行淘汰策略的选择。 Redis如何实现LRU算法 第一种版本 Redis 使用近似 LRULeast Recently Used最近最少使用算法来实现缓存淘汰策略。虽然不是严格的 LRU 算法但它在实践中表现良好并且具有较低的复杂度。Redis 中的 LRU 算法的实现基于以下原理 Redis 维护一个有序的 LRU 数据结构通常是一个双向链表。每个键都有一个额外的字段用于记录最近访问的时间戳或计数器。当有新的键被访问时Redis 将该键移动到链表的头部表示最近被访问。当需要淘汰键时Redis 会从链表的尾部选择最久未被访问的键进行淘汰。 通过上述步骤Redis 保持了键的访问顺序并且可以从链表的尾部选择最久未被访问的键进行淘汰。这种近似 LRU 算法能够在大多数情况下有效地淘汰长时间未被访问的键以腾出空间。 需要注意的是Redis 的近似 LRU 算法并不是严格按照 LRU 的定义实现的。在实际中为了减少复杂度和内存消耗Redis 使用了一些近似算法和优化策略。例如Redis 可能仅在特定的访问事件或条件下更新访问时间戳或者限制链表的长度。这些优化可以提高性能和效率但可能会导致略微的不准确性。 需要注意的是Redis 的 LRU 算法是在内存中执行的当内存不足时才会触发淘汰。如果需要持久化数据可以考虑使用 Redis 的持久化机制如 RDB 或 AOF来保存数据以防止数据丢失。 总体而言Redis 的近似 LRU 算法在大多数情况下能够很好地满足缓存淘汰的需求并提供了良好的性能和可靠性。 第二种版本 Redis 实现的是一种近似 LRU 算法目的是为了更好的节约内存它的实现方式是在 Redis 的对象结构体中添加一个额外的字段用于记录此数据的最后一次访问时间。当 Redis 进行内存淘汰时会使用随机采样的方式来淘汰数据它是随机取 5 个值此值可配置然后淘汰最久没有使用的那个。Redis 实现的 LRU 算法的优点 不用为所有的数据维护一个大链表节省了空间占用不用在每次数据访问时都移动链表项提升了缓存的性能 但是 LRU 算法有一个问题无法解决缓存污染问题比如应用一次读取了大量的数据而这些数据只会被读取这一次那么这些数据会留存在 Redis 缓存中很长一段时间造成缓存污染。 Redis如何实现LFU算法 Redis 在版本 4.0 及之后的版本中引入了对 LFULeast Frequently Used最不经常使用算法的支持以实现缓存淘汰策略。Redis 中的 LFU 算法的实现基于以下原理 Redis 维护一个全局的 LFU 数据结构用于存储所有键的访问频率信息。对每个键Redis 使用一个计数器来记录其访问频率。每次访问一个键时Redis 会将该键的计数器加一。当需要淘汰键时Redis 会选择访问频率最低的键进行淘汰。 通过上述步骤Redis 能够追踪和更新每个键的访问频率并选择访问频率最低的键进行淘汰。这种 LFU 算法能够在缓存中保留经常被访问的热点数据以提高缓存命中率。 需要注意的是Redis 的 LFU 算法是一个近似算法实际上它使用了一个叫做 “LFU-Tiny” 的实现。这种实现方式通过将计数器分为多个时间窗口以降低计数器的复杂度和内存消耗。在使用 LFU 算法时可以通过以下命令来启用 LFU 算法的淘汰策略 CONFIG SET maxmemory-policy LFU这将设置 Redis 的最大内存策略为 LFU。需要注意的是由于 LFU 算法需要维护频率计数器和全局数据结构可能会导致一些额外的性能开销。因此在选择使用 LFU 算法时需要根据实际场景和需求权衡性能和准确性。总体而言Redis 的 LFU 算法在大多数场景下能够提供良好的缓存淘汰效果并提高缓存命中率。
http://www.w-s-a.com/news/817808/

相关文章:

  • 设计网站主页要多少钱赣州制作网站百度
  • 什么叫高端网站定制网站收录大幅度下降
  • 汝城县网站建设公司aspx网站实例
  • 专业微网站营销diywap手机微网站内容管理系统
  • 盗版做的最好的网站温州logo设计公司
  • 网站建设 中山南充微网站建设
  • 企业网站更新什么内容免费设计软件下载
  • 夏天做哪些网站能致富做网站怎么每天更新内容
  • 个人网站的设计与开发网站建设流程中哪些部分比较重要
  • 招聘网站如何建设中国计算机网络公司排名
  • 工信部网站备案规定厦门在线制作网站
  • 商丘网站公司智联招聘手机app下载
  • 江西专业南昌网站建设中国专业的网站建设
  • 物流企业网站建设方案招标网站有哪些
  • 网站建设服务中企动力建筑工程网络进度计划备注填写范例
  • 电子商务网站开发与建设试卷php网站开发专业
  • 运城网站制作路90江苏省网站备案系统
  • 唐山做企业网站实体门店管理系统
  • 网站优化推广教程深圳网站建设世纪前线
  • 网站建设专家哪家好兰州网络推广执行
  • 广东住房和城乡建设厅网站王芃增加网站收录
  • 北京网站建设手机app电子商务网红营销的劣势
  • 网站 营销型wordpress获取4条文章标题
  • 浦东区建设工程监督网站建立全国统一的突发事件信息系统
  • 做网站需要基础吗重庆市造价信息网
  • 我要建设公司网站大连培训网站建设
  • 网站建设校长信箱设计方案小程序报价开发
  • 电子网站建设ppt模板营销策划方案怎么写?
  • 什么网站收录排名最高济南能源建设网站
  • 深圳移动网站建设公司价格桂林做网站哪家公司好