首页 » SEO优化 » php新闻提醒红点技巧_面试推荐新闻去重Redis缓存穿透你知道怎么处理吗

php新闻提醒红点技巧_面试推荐新闻去重Redis缓存穿透你知道怎么处理吗

访客 2024-12-13 0

扫一扫用手机浏览

文章目录 [+]

位图

在我们开拓的过程中,会碰着 bool 型数据须要存取,比如用户一年的签到记录,签了是 1,没签是 0,要记录 365 天。
如果利用普通的 key/value,每个用户要记录 365个,当用户上亿的时候,须要的存储空间是惊人的。
为理解决这个问题,Redis 供应了位图数据构造,这样每天的签到记录只霸占一位,365 天便是 365 个位,46 个字节 (一个字节有8位) 就可以完备容纳的下,这就大大节约了存储空间。

  位图不是分外的数据构造,它的内容实在便是普通的字符串,也便是 byte 数组。
我们可以利用普通的 get/set 直接获取和设置全体位图的内容,也可以利用位图操作 getbit/setbit 等将 byte 数组算作「位数组」来处理。

php新闻提醒红点技巧_面试推荐新闻去重Redis缓存穿透你知道怎么处理吗

位图的用法如下:(1个字节( b ) = 8位( bit ) = 0.001 千字节( kb ))

php新闻提醒红点技巧_面试推荐新闻去重Redis缓存穿透你知道怎么处理吗
(图片来自网络侵删)

# 指定字符串偏移位的值127.0.0.1:6237> setbit key offset value 127.0.0.1:6237> setbit mybit 0 1127.0.0.1:6237> setbit mybit 1 1127.0.0.1:6237> setbit mybit 5 1127.0.0.1:6237> setbit mybit 10 1# 获取指定偏移量上的位 ,当 offset 比字符串值的长度大,或者 key 不存在时,返回 0 127.0.0.1:6237> getbit key offset# 统计字符串被设置为1的 bit 数127.0.0.1:6237> bitcount key [start end]127.0.0.1:6237> bitcount mybit(integer) 4127.0.0.1:6237> bitcount mybit 1 5(integer) 1

位图的适用场景有:统计每天生动用户数、统计用户签到记录、用户在线状态等。

用户签到场景: 每天的日期字符串作为一个key,用户Id作为offset,统计每天用户的签到情形,总的用户签到数。

生动用户数统计: 用户日活、月活、留存率等均可以用redis位数组来存储,还是以每天的日期作为key,用户生动了就写入offset为用户id的位值1。

用户是否在线以及总在线人数统计: 利用一个位数组,用户的id映射偏移量,在线标识为1,下线标识为0,即可实现用户高下线查询和总在线人数的统计

APP内用户的全局提示小红点: 现在大多数的APP里都有站内信的功能,当有的时候,则提示一个小红点,代表用户有新的。

布隆过滤器

布隆过滤器是一种数据构造,是由一串很长的二进制向量组成,可以将其算作一个二进制数组,里面存放的不是0便是1(初始默认值都是0)。
这是一种比较奥妙的概率型数据构造,它可以见告你某种东西一定不存在或者可能存在。

布隆过滤器相对付 Set、Map 等数据构造来说,它可以更高效地插入和查询,并且占用空间更少。
但是布隆过滤器也有缺点,便是判断某种东西是否存在时,可能会被误判。
但是只要参数设置的合理,它的精确度也可以掌握得相瞄准确,只会有小小的误判概率。

在 Redis 中布隆过滤器命令如下:

bf.add:添加元素到布隆过滤器中,类似于凑集的 sadd 命令,不过 bf.add 命令只能一次添加一个元素,如果想一次添加多个元素,可以利用 bf.madd 命令。
bf.exists:判断某个元素是否在过滤器中,类似于凑集的 sismember 命令,不过 bf.exists 命令只能一次查询一个元素,如果想一次查询多个元素,可以利用 bf.mexists 命令。

127.0.0.1:6237> bf.add cacheKey fans1(integer) 1127.0.0.1:6237> bf.add cacheKey fans2(integer) 1127.0.0.1:6237> bf.add cacheKey fans3(integer) 1127.0.0.1:6237> bf.exists cacheKey fans1(integer) 1127.0.0.1:6237> bf.exists cacheKey fans2(integer) 1127.0.0.1:6237> bf.exists cacheKey fans3(integer) 1127.0.0.1:6237> bf.exists cacheKey fans4(integer) 0127.0.0.1:6237> bf.madd cacheKey fans4 fans5 fans61) (integer) 12) (integer) 13) (integer) 1127.0.0.1:6237> bf.mexists cacheKey fans4 fans5 fans6 fans71) (integer) 12) (integer) 13) (integer) 14) (integer) 0

布隆过滤器的利用场景有:推举新闻去除重复内容、Redis缓存穿透等。

把稳:Redis 官方供应的布隆过滤器到了 Redis 4.0 供应了插件功能之后才正式登场。
布隆过滤器作为一个插件加载到 Redis Server 中,给 Redis 供应了强大的布隆去重功能。

HyperLogLog

在我们做站点流量统计的时候一样平常会统计页面UV(独立访客:unique visitor)和PV(即页面浏览量:page view),那么我们最常见的处理办法便是用户点击一次就插入一条数据到数据库,统计的时候通过查询表来达到统计流量的效果。

那么我们如果是通过redis来处理,我们可以利用string类型然后自增计数即可达到统计PV,统计UV可以利用set,每个用户id是唯一的可以放到这个凑集里,统计的时候只须要实行scard获取凑集大小即可。

这两种办法都是可以实现站点的流量统计,但是如果说当站点流量非常大每天几千万次的访问量,那么数据库可能就要分表分库了,redis添加足够多的数据后内存花费也是非常惊人的,总的来说这样做是不划算的,那么我们的redis有一种专门处理这样数据的算法,HyperLogLog。

HyperLogLog 供应了两个指令 pfadd 和 pfcount,根据字面意思很好理解,一个是增加计数,一个是获取计数。
pfadd和set凑集的sadd的用法是一样的,pfcount和scard的用法是一样的,直接获取计数值。

HyperLogLog还供应一个合并的指令pfmerge,用于将两个pf累加形成一个新的pf,如果说我们须要将每个页面的流量合并,那么我们这个指令大有用处。

# pfadd key element [element ...] # pfadd 添加数据 user是key值,942292735是用户ID127.0.0.1:6237> pfadd user 942292735 (integer) 1127.0.0.1:6237> pfadd user 952193465 (integer) 1# pfcount key [key ...]# pfcount 查询数据 user是查询的key值,可以支持多个127.0.0.1:6237> pfcount user (integer) 2127.0.0.1:6237> pfmerge newUser user1 user2OK

如果想获取 PHP源码剖析、ThinkPHP源码剖析、Golang等视频教程,可以关注并私信我。

标签:

相关文章

php搭配ajax技巧_PHPAJAX 与 PHP

AJAX PHP 实例下面的实例将演示当用户在输入框中键入字符时,网页如何与 Web 做事器进行通信:实例考试测验在输入框中输入一...

SEO优化 2024-12-14 阅读0 评论0