在Redis中能实现的功能、常见应用介绍
Redis  /  管理员 发布于 6个月前   205
Redis的数据是存在内存中的。它的读写速度非常快,每秒可以处理超过 10 万次读写操作。
因此 redis 被广泛应用于缓存,另外,Redis 也经常用来做分布式锁、计数器、排行榜等。
Redis 的常见应用
1. 缓存
这是 Redis 应用最广泛地方,基本所有的 Web 应用都会使用 Redis 作为缓存,
来降低数据源压力,提高响应速度。
2. 计数器
Redis 天然支持计数功能,而且计数性能非常好,可以用来记录浏览量、点赞量等等。
3. 排行榜
Redis 提供了列表和有序集合数据结构,合理地使用这些数据结构可以很方便地构建各种排行榜系统。
4. 社交网络
赞 / 踩、粉丝、共同好友 / 喜好、推送、下拉刷新。
5. 消息队列
Redis 提供了发布订阅功能和阻塞队列的功能,可以满足一般消息队列功能。
6. 分布式锁
分布式环境下,利用 Redis 实现分布式锁,也是 Redis 常见的应用。
7. 位操作
用于数据量上亿的场景下,例如几亿用户系统的签到,去重登录次数统计,某用户是否在线状态等等。
这里要用到位操作 —— 使用 setbit、getbit、bitcount 命令。
原理是:
edis 内构建一个足够长的数组,每个数组元素只能是 0 和 1 两个值,
然后这个数组的下标 index 用来表示用户 id(必须是数字哈),
那么很显然,这个几亿长的大数组就能通过下标和元素值(0 和 1)来构建一个记忆系统。
Redis过期策略和内存淘汰策略
Redis 过期策略
我们在 set key 的时候,可以给它设置一个过期时间,比如 expire key 60。
指定这 key60s 后过期,60s 后,redis 是如何处理的?
我们先来介绍几种过期策略:
定时过期
每个设置过期时间的 key 都需要创建一个定时器,到过期时间就会立即对 key 进行清除。
该策略可以立即清除过期的数据,对内存很友好;
但是会占用大量的 CPU 资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。
惰性过期
只有当访问一个 key 时,才会判断该 key 是否已过期,过期则清除。
该策略可以最大化地节省 CPU 资源,却对内存非常不友好。
极端情况可能出现大量的过期 key 没有再次被访问,从而不会被清除,占用大量内存。
定期过期
每隔一定的时间,会扫描一定数量的数据库的 expires 字典中一定数量的 key,并清除其中已过期的 key。
该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,
可以在不同情况下使得 CPU 和内存资源达到最优的平衡效果。
expires 字典会保存所有设置了过期时间的 key 的过期时间数据,其中:
key 是指向键空间中的某个键的指针。
value 是该键的毫秒精度的 UNIX 时间戳表示的过期时间。
键空间是指该 Redis 集群中保存的所有键。
Redis中同时使用了惰性过期和定期过期两种过期策略。
假设 Redis 当前存放 30 万个 key,并且都设置了过期时间,
如果你每隔 100ms 就去检查这全部的 key,CPU 负载会特别高,最后可能会挂掉。
因此,redis 采取的是定期过期,每隔 100ms 就随机抽取一定数量的 key 来检查和删除的。
但是呢,最后可能会有很多已经过期的 key 没被删除。
这时候,redis 采用惰性删除。在你获取某个 key 的时候,redis 会检查一下,
这个 key 如果设置了过期时间并且已经过期了,此时就会删除。
如果定期删除漏掉了很多过期的 key,然后也没走惰性删除。
就会有很多过期 key 积在内存内存,直接会导致内存爆的。
或者有些时候,业务量大起来了,redis 的 key 被大量使用,内存直接不够了,
运维小哥哥也忘记加大内存了。
难道 redis 直接这样挂掉?
不会的!Redis 用 8 种内存淘汰策略保护自己~
Redis内存淘汰策略
volatile-lru:
当内存不足以容纳新写入数据时,
从设置了过期时间的 key 中使用 LRU(最近最少使用)算法进行淘汰。
allkeys-lru:
当内存不足以容纳新写入数据时,从所有 key 中使用 LRU(最近最少使用)算法进行淘汰。
volatile-lfu:
4.0 版本新增,当内存不足以容纳新写入数据时,在过期的 key 中,使用 LFU 算法进行删除 key。
allkeys-lfu:
4.0 版本新增,当内存不足以容纳新写入数据时,从所有 key 中使用 LFU 算法进行淘汰。
volatile-random:
当内存不足以容纳新写入数据时,从设置了过期时间的 key 中,随机淘汰数据。
allkeys-random:
当内存不足以容纳新写入数据时,从所有 key 中随机淘汰数据。
volatile-ttl:
当内存不足以容纳新写入数据时,在设置了过期时间的 key 中,
根据过期时间进行淘汰,越早过期的优先被淘汰。
noeviction:
默认策略,当内存不足以容纳新写入数据时,新写入操作会报错。
123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..路人 在
php中使用hyperf框架调用讯飞星火大模型实现国内版chatgpt功能示例中评论 教程很详细,如果加个前端chatgpt对话页面就完美了..Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号