Redis module bloom filter 安装
redis加载RedisBloom整体流程
- 确认 RedisServer 版本。
- 根据 RedisServer 版本选取对应版本的 RedisBloom 。
- 修改 redis.conf 启用 bloom filter module 。
- 重启 RedisServer 加载 bloom filter module 。
(1) 确认RedisServer版本
[weikeqin@localhost redis (6.0 =) ]$ ./src/redis-server -v
Redis server v=6.0.20 sha=de0d9632:0 malloc=jemalloc-5.1.0 bits=64 build=db68ee83ba489356
[weikeqin@localhost redis (6.0 =) ]$
[weikeqin@localhost redis (6.0 =) ]$ pwd
/Users/weikeqin/WorkSpaces/middleware/redis
[weikeqin@localhost redis (6.0 =) ]$
可以看到 redis-server 版本是 6.0.20
Redis bloom-filter 在千万数据场景应用
在网页爬虫、垃圾邮件检测、用户频控 等 元素是否存在于某个集合中的判断时,为了节省内存,往往会考虑使用 布隆过滤器。
我们遇到了一个类似的场景,比如 用户是否存在集合中。
最开始用户数少的时候,使用 Redis string对象,set biz:uid true
来标识用户存在集合中。
查询时根据 get biz:uid
来判断结果为空识别使用是否在集合中。
随着数据量增大到千万级,忽然有一天下午,Redis内存使用率报警,超过60%,几个小时后,Redis内存写满。出现大量报错。
后来通过计算,发现 redis string 的内存利用率太低,大概只有 5% 左右,想找一个节省内存的办法。
Redis info 命令
Redis内存优化-怎么用缓存支持千亿级数据
Redis内存分配器
像大家原来使用纸币,平时用的纸币只有 1元 5元 10元 20元 50元 100元,为什么没有 1.5元 3元 ?
因为有了 3元 人们使用不方便,也不方便管理。
(1) Redis内存分配器
Redis在内存使用时也是类似纸币,为了方便管理,Redis在分配内存时按照设计的大小分配。
(1.1) 为什么要设置内存分配器
举个简单的例子,你找妈妈要零花钱,你想要1.5元,但是她没有1.5元,给了个你5元。
- 内存分配器的目标主要有2个:
1.1 减少内存碎片,包括内部碎片和外部碎片:
内部碎片:分配出去的但没有使用到的内存,比如需要 32 字节,分配了 40 字节,多余的 8 字节就是内部碎片。
外部碎片:大小不合适导致无法分配出去的内存,比如一直申请 16 字节的内存,但是内存分配器中保存着部分 8 字节的内存,一直分配不出去。 - 提高性能:
- 1 单线程性能
- 2 多线程性能
Redis AOF 重写
# Redis配置文件
# 启用AOF持久化
appendonly yes
# 当AOF文件增长 100% 时重写AOF文件
auto-aof-rewrite-percentage 100
# 当AOF文件大于 64M 时重写AOF文件
auto-aof-rewrite-min-size 64mb
Redis 序列化协议 RESP
(1) RESP协议是什么
Redis Serialization Protocol
(RESP
)是Redis客户端
和服务器
之间使用的通信协议。
它是一种简单、高效的文本协议,易于实现和解析。
(1.1) 协议定义
以下是一个简单的RESP协议示例:
redis-client 发给 redis-server 的数据。
// querybuf = "*6\r\n$3\r\nset\r\n$19\r\n9223372036854775806\r\n$1\r\n1\r\n$2\r\nex\r\n$5\r\n86400\r\n$2\r\nnx\r\n"
*6
$3
set
$19
9223372036854775806
$1
1
$2
ex
$5
86400
$2
nx
这个示例对应的redis命令 set 9223372036854775806 1 ex 86400 nx