您现在的位置是:首页 >其他 >Redis分片集群和亿级访问量数据处理网站首页其他

Redis分片集群和亿级访问量数据处理

喝咖啡学Java 2023-07-13 16:00:02
简介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排序统计

  • ListSet Hash ZSet四种集合中,ListZset是属于有序的集合
  • 一种使用List,通过lpush加入
  • 一种使用Zset,按分数权重处理

2.3二值状态统计

  • 统计疫苗接种人数(没有接种0 接种1)、打卡(没有打卡0 打卡1)、签到。
  • bit 1byte=8bit
  • redis提供一种扩展数据类型 bitmap
  • 可以把bitmap看到是一个bit数组
  • 常用命令:
    • setbit
    • getbit
    • bitcount
  • 统计一下,20221月份的一个上班打卡情况
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提供了HyperLogLoghll
  • 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小结

 

 

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。