您现在的位置是:首页 >其他 >Redis分片集群和亿级访问量数据处理网站首页其他
Redis分片集群和亿级访问量数据处理
简介Redis分片集群和亿级访问量数据处理
一、redis分片集群
1.简介
- 业务场景,需要存储50G的数据。对于内存和硬盘配置不足,选用两种方式
- 一种:纵向扩展:加内存,加硬盘,提高CPU。简单、直接。RDB存储效率要考虑。成本要考虑。
- 二种:横向扩展:加实例。
2.配置
- 步骤1:创建一个mycluster目录,复制redis.conf文件
mkdir mycluster
cp /opt/redis-6.2.6/redis.conf redis.conf
- 将后台启动打开
- 步骤2:创建一个redis6379.conf
include redis.conf
pidfile "/var/run/redis_6379.pid"
port 6379
dbfilename "dump6379.rdb"
#打开集群模式
cluster-enabled yes
#设定节点配置文件
cluster-config-file nodes-6379.conf
#设定节点失联时间,超过,会自动进行主从切换
cluster-node-timeout 15000
- 步骤3:根据6379的配置文件,再配置5个不同的端口
:%S/原内容/要替换的内容
:%s/6379/6380
- 步骤4:修改redis.conf配置文件,将bind ip地址加入
打开bind 127.0.0.1
加入 192.168.44.4
- 步骤5 启动六个服务,保证六个服务启动成功
- 步骤6 将六个服务合成一个集群
redis-cli --cluster create --cluster-replicas 1 192.168.245.129:6379
192.168.245.129:6380 192.168.245.129:6381 192.168.245.129:6579
192.168.245.129:6580 192.168.245.129:6581
3.Hash Slot
3.1简介
- 在使用redis cluster方案中,一个分片集群有16384个哈希槽。
- 根据键值对的key,按照CRC16算法计算一个16bit的值。再用这个值对16384取模运算,得到的数代表对应编号的hash slot
3.2部署方案
- cluster create命令创建集群时,redis会自动把这些hash slot平均分布在集群实例上。如果集群中有N个实例(主库),每个实例上分配到的hash slot就是16384/N
- 使用cluster addslos 手工分配哈希槽。
4.集群中的数据操作
- 步骤1:使用集群方式启动redis的命令行,加 -c参数
redis-cli -c -p 6379
- 步骤2:向redis中设置一个键值对,key会经过运算后,得到相应的hash slot进行存储
set k1 v1
set k2 v2
get k1
get k2
- 步骤3:测试向集群中加入多个key-value,由于在不同的hash slot,此时会报错
mset k3 v3 k4 v4 k5 v5
- 要通过{}来定义组的概念,使用key中{}内相同内容的键值对放在一个slot中
mset name{user:001} zhangsan age{user:001} 18 gender{user:001} man
- 步骤4:获取key中的值
get k1
get name{user:001}
5.常用命令
- cluster nodes:显示集群节点的配置信息
- cluster keyslot < key>:获取key的哈希槽
- cluster countkeysinslot < slot>:返回当前哈希槽中key的数量(仅查询当前redis实例)
- cluster getkeysinslot < slot>< count>:返回当前槽中指定的count数量的key
6.故障演示
- 步骤1:将6379宕机,以集群方式登录6380
127.0.0.1:6379>shutdown
exit
redis-cli -c -p 6380
- 步骤2:使用cluster nodes查看节点状态,6379的从机6581变成了主机
- 步骤3: 把6379再次启动,启动后,6379变成了6581的从机
- 如果有一段hash slot的主从节点都宕机,redis是否继续工作?
- 通过下面配置,默认是yes,如果主从都挂掉,整个集群就都挂掉
- 如果是no,就表示该hash slot数据全部都不能使用,也无法存储
cluster-require-full-coverage yes
二、亿级访问量数据处理
1.场景描述
手机
APP
用户登录信息,一天用户登录
ID
或设备
ID
电商或者美团平台,一个商品对应的评论
文章对应的评论
APP
上有打卡信息
网站上访问量统计
统计新增用户第二天还留存
商品评论的排序
月活统计
统计独立访客
(Unique Vistitor UV)
量
2.集合的统计模式
四种统计模式:聚合统计、排序统计、二值状态统计、基数统计
2.1聚合统计
- 多个集合的交集、差集、并集
- set集合,来存储所有登录系统的用户 user:id
- set集合,来存储当日新增用户信息 user:id :20230503
- 假设系统是2023年5月3日上线,统计当天用户
- sadd user:id :20230503 1001 1002 1003 1004 1005
- 统计总用户量
- sunionstore user:id user:id user:id :20230503
- 第2天5月4日上线用户
- sadd user:id :20230504 1001 1003 1006 1007
- 统计当日新增用户
- sdiffstore user:new user:id :20230504 user:id
- 统计第一天登录,第二天还在的用户
- sinterstore user:save user:id :20230503 user:id :20230504
- 统计第一天登录,第二天流失的用户
- sdiffstore user:rem user:id : 20230503 user:id :20230504
2.2排序统计
- List、Set 、Hash 、ZSet四种集合中,List和Zset是属于有序的集合
- 一种使用List,通过lpush加入
- 一种使用Zset,按分数权重处理
2.3二值状态统计
- 统计疫苗接种人数(没有接种0 接种1)、打卡(没有打卡0 打卡1)、签到。
- bit位 1byte=8bit
- redis提供一种扩展数据类型 bitmap。
- 可以把bitmap看到是一个bit数组
- 常用命令:
- setbit
- getbit
- bitcount
- 统计一下,2022年1月份的一个上班打卡情况
setbit user:sign:202201 0 1
setbit user:sign:202201 2 1
setbit user:sign:202201 3 1
getbit user:sign:202201 0 //1
getbit user:sign:202201 1 //0
bitcount user:sign:202201 //4
- 统计1亿个用户,10天签到情况
- bitop
- 操作
setbit user:sign:1222 0 1
..........
bitop and signmap user:sign:1222 user:sign:1223 user:sign:1224
2.4基数统计
- 统计一个集合中不重复的元素个数,例如统计网页的UV
- 第一种,使用set或者hash来完成统计
- sadd page1:uv u1001 u1002 u1003
- scard page1:uv
- 存在的问题:如果数据量非常大,且页面多,访问人数非常多,造成内存紧张
- 第二种,Redis提供了HyperLogLog(hll)
- HyperLogLog是用于统计基数的一种数据集合类型。优点在于当集合元素非常多,使用hll所需要的空间是固定且很小,使用12kb内存,可以存储2^64个元素的基数。缺点在于统计规则是基于概率完成的。会有0.81%左右的误差。如果统计1000万次,实际上可以是1100万 或900万人。
- 命令
pfadd page1:uv u1001 u1002 u1003
pfcount page1:uv
pfadd page2:uv u1001 u1004
pfmerge page:uv page1:uv page2:uv
pfcount page:uv
2.5小结
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。