Redis——相关算法机制

1.基数统计算法-HyperLogLog

  • 基数:不重复的数据,应用场景比如统计网站的访问次数。常见的大型网站数据访问量。
  • 在实际开发的过程中,需要统计一个大型网站的独立访问次数时,如果使用Redis的集合进行统计,会造成占用空间越来越大,逐渐超出承载的最大空间。因此Redis开发了新的数据类型来做这件事情。
  • HyperLogLog:Redis2.8.9版本添加的数据结构,用于高性能的基数(去重)统计功能,主要缺点就是存在极低的误差率。

特点

  1. 能够使用极少的内存来统计巨量的数据,只需要12k空间就能统计2^64的数据;
  2. 统计存在一定的误差,误差率整体较低,标准为0.81%;
  3. 误差可以被设置辅助计算因子进行降低

基本使用语法:

命令功能用法
pfadd添加元素pfadd key element[element...]
pfcount统计不重复的元素pfcount key[key...]
pfmerge支持合并多个结构pfmerge destkey sourcekey [sourcekey ...]

2.布隆过滤器

  • 利用布隆过滤器可以在海量的数据中查询某个值。传统的查询方式,会占用系统的大量资源。

  • 开启布隆过滤器:在Redis4.0版本之后可以利用模块扩展的方式引入。

  • 下载安装布隆过滤器

git clone https://github.com/RedisLabsModules/redisbloom.git
cd redisbloom
make # 编译redisbloom

编译正常执行之后,会在根目录生成一个redisbloom.so文件
  • 启动验证
    在这里插入图片描述
    如果有命令提示,则表示已经开启了布隆过滤器。

  • 基本命令的使用

命令功能用法
bf.add添加元素
bf.exists判断某个元素是否存在
bf.madd添加多个元素
bf.mexists判断多个元素是否存在
bf.reserve设置布隆过滤器的准确率

3.缓存雪崩&缓存穿透&缓存击穿

3.1缓存雪崩

  • 定义:短时间内,有大量缓存同时过期,导致大量的请求直接查询数据库,从而对数据库造成了巨大得到压力,严重情况下导致数据库宕机的情况就叫做缓存雪崩。

正常情况程序执行流程
在这里插入图片描述
缓存雪崩的执行流程
在这里插入图片描述

3.1.1缓存雪崩解决方案

  1. 随机化过期时间
    为了避免缓存同时过期,可以在设置缓存时添加随机时间,就可以极大的避免大量的缓存同时失效。
  2. 集群服务。多个从Redis.

缓存击穿解决方案: 加锁排队

  • 加锁排队可以起到缓冲的作用,防止大量的请求同时操作数据库,缺点是:增加了系统的响应时间,降低了系统的吞吐量,牺牲了一部分用户体验。

3.2缓存穿透

  • 定义:指在查询数据库和缓存都无数据,因为数据库查询无数据,出于容错考虑,不会将结果保存到缓存中,因此每次请求都会去查询数据库,这种情况就叫做缓存穿透。
  • 缓存穿透执行流程
    在这里插入图片描述
    缓存穿透,会给数据库带来极大的压力。

3.2.1解决方案

  1. 使用过滤器加后台验证
  • 使用过滤器来减少对数据库的请求,例如布隆过滤器。
  1. 缓存空结果
  • 把每次从数据库查询的数据都保存到缓存中,为了提高前台用户的使用体验(解决长时间内查询不到任何信息的情况),可以将空结果缓存的时间设置的短一些。

4.内存淘汰机制与算法

  • Redis内存淘汰机制:当Redis运行内存已经超过Redis设置的最大内存之后,将采用何种策略来删除符合条件的键值对来保障Redis高效运行的一种机制。
  • Redis最大运行内存:Redis运行内存达到某个阀值才会触发内存淘汰机制,这个阈值就是设置的最大运行内存,在配置文件中可以找到maxmemory选项。
  • 内存淘汰机制执行流程
    在这里插入图片描述
  1. 使用config get maxmemory来查看设置项的最大运行内存
127.0.0.1:6379> config get maxmemory
1) "maxmemory"
2) "0"

64位操作系统默认的值是0,表示内存大小没有限制。

  1. 使用config get maxmemory-policy命令来查看当前Redis的内存淘汰策略
127.0.0.1:6379> config get maxmemory-policy
1) "maxmemory-policy"
2) "noeviction"

noeviction类型的内存淘汰机制:表示当运行内存超过最大设置内存时,不淘汰任何数据,但新增操作会报错。

相关内存淘汰策略分类

  1. noeviction(Redis默认):不淘汰任何数据,内存不足时,新增的操作直接报错。
  2. allkeys-lru:淘汰所有键值中最久未使用的键值。(采用的是LRU算法)
  3. allkeys-lfu:淘汰所有键值中最少使用的键值。(采用的是LFU算法)
  4. allkeys-random:随机淘汰任意键值(随机算法)
  5. volatile-lru:淘汰所有设置了过期时间的键值中最久未使用的键值。(LRU算法)
  6. volatile-lfu:淘汰所有设置了过期时间的键值中最少使用的键值。(LFU算法)
  7. volatile-random:随机淘汰设置了过期时间的任意键值。(随机算法)
  8. volatile-ttl:优先淘汰更早过期的键值

修改Redis内存策略的两种方式
1. 使用命令config set maxmemory-policy设置。优点:设置之后立即生效,无需重启。缺点:重启Redis服务之后,设置就会失效。
2. 修改配置文件中的maxmemory-policy设置项。优点:重启Redis服务不会失效。缺点:必须重启服务,设置才能生效。

内存淘汰算法:

  • LRU算法:常见的页面置换算法,选择最近最久未使用的页面予以淘汰。

    1. LRU算法实现:基于链表结构,链表中的元素按照操作顺序从前往后排列,最新操作的键会被移动到表头,当需要内存淘汰时,删除链表尾部的元素即可。
    2. Redis近LRU算法:目的是为了更好的节约内存,主要实现方式是给现有的数据结构添加一个额外的字段,用于记录此键值的最后一次访问时间,Redis内存淘汰时,会使用随机采样的方式来淘汰数据,随机取设定的相应几个值,然后淘汰最久没有使用的那个。
    3. 缺点:对于从前很久没有使用过,但是最久访问过了的键值,就不会被淘汰,即使该键值几乎很少被使用。
  • LFU算法:最不常用的算法根据总访问次数来淘汰数据。核心思想为:如果数据过去被访问多次,将来被访问的频率也更高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值