- 1、缓存
- 2、数据共享分布式(Session)
- 3、分布式锁
- 4、全局ID
- 5、计数器
- 6、 限流
- 7、 位统计
- 统计
- 统计月,先合并
- BitMap 底层采用字符串实现,Redis 中字符串的最大长度是 512M
- bitmap 占用空间
- 用户签到场景
- key 设计 方案
- 按年 统计
- 根据日期 offset = (今天是一年中的第几天) % (今年的天数),key = 用户id:年份
- 按月统计
- 根据日期 offset = (今天是这个月的第几天) % (当月天数),key = 用户id:年月
- 用户id 递增
- 根据 用户id offset = 用户id , key = 年月日
- bitmap 命令认识
- 用户2月17号签到
- 检查2月17号是否签到
- 统计2月份的签到次数
- 获取2月份前28天的签到数据
- 获取2月份首次签到的日期
- 使用命令 SRANDMEMBER 随机返回集合中的元素
- 可以重复抽
- 不重复则使用命令
- 用户使用两个集合保存 关注者名单和 正在关注用户名单
- 格式
- 添加 当前用户 userId 关注用户 userId2
- userId2 关注 当前用户 userId
- 取消关注
- 获取关注者名单数量
- 判断是否为 正在关注用户名单
- 返回 正在关注用户名单
- 返回 关注者名单
- userId 关注的人也关注了 userId2 (取交集):
- 用户1 可能认识的人
- 用户2 可能认识的人
1、缓存
2、数据共享分布式(Session)
3、分布式锁
-
4、全局ID
5、计数器
例如:文章的阅读量、微博点赞数、允许一定的延迟,先写入Redis再定时同步到数据库
6、 限流
以访问者的ip和其他信息作为key,访问一次增加一次计数,超过次数则返回false
使用Redisson 定义的限流器
@GetMapping("/send")
public void send(String mobile) throws InterruptedException {
//初始化限流器
RRateLimiter rateLimiter = this.redissonClient.getRateLimiter("limit:sms:"+mobile);
//初始化设置频率
//30秒内颁发一个令牌
rateLimiter.trySetRate(RateType.OVERALL,1,30, RateIntervalUnit.SECONDS);
if(rateLimiter.tryAcquire()){
System.out.println("发送短信"+ DateUtil.formatDateTime(new Date())+" "+mobile);
TimeUnit.SECONDS.sleep(5);
}
System.err.println("正在发送短信,不要重复发送!");
}
7、 位统计
- HyperLogLog ```shell PFADD hzeyun:dau:yyyyMMdd user_id1
统计
PFCOUNT hzeyun:dau:yyyyMMdd1
统计月,先合并
PFMERGE hzeyun:mau:yyyyMM hzeyun:dau:yyyyMMdd1 hzeyun:uv:yyyyMMdd2
可应用场景
- 统计注册 IP 数
- 统计每日访问 IP 数
- 统计页面实时 UV 数
- 统计在线用户数
- 统计用户每天搜索不同词条的个数
去重 ```
bigmap ```shell
BitMap 底层采用字符串实现,Redis 中字符串的最大长度是 512M
bitmap 占用空间
(8 1024 1024 * 512) -1 = 2^32 - 1
用户签到场景
key 设计 方案
按年 统计
根据日期 offset = (今天是一年中的第几天) % (今年的天数),key = 用户id:年份
按月统计
根据日期 offset = (今天是这个月的第几天) % (当月天数),key = 用户id:年月
用户id 递增
根据 用户id offset = 用户id , key = 年月日
bitmap 命令认识
SETBIT 对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。 >= 2.2.0 O(1) GETBIT 对 key 所储存的字符串值,获取指定偏移量上的位(bit)。 >= 2.2.0 O(1) BITCOUNT 计算给定字符串中,被设置为 1 的比特位的数量。 >= 2.6.0 O(N) BITPOS 返回位图中第一个值为 bit 的二进制位的位置。 >= 2.8.7 O(N) BITOP 对一个或多个保存二进制位的字符串 key 进行位元操作。 >= 2.6.0 O(N) BITFIELD BITFIELD 命令可以在一次调用中同时对多个位范围进行操作。 >= 3.2.0 O(1)
用户2月17号签到
SETBIT u:sign:1000:2019 16 1 # 偏移量是从0开始,所以要把17减1
检查2月17号是否签到
GETBIT u:sign:1000:201902 16 # 偏移量是从0开始,所以要把17减1
统计2月份的签到次数
BITCOUNT u:sign:1000:201902
获取2月份前28天的签到数据
BITFIELD u:sign:1000:201902 get u28 0
获取2月份首次签到的日期
BITPOS u:sign:1000:201902 1 # 返回的首次签到的偏移量,加上1即为当月的某一天
<a name="rIOJB"></a>
####
<a name="fWtl6"></a>
#### 8、购物车
- 使用 Hash 数据结构保存
```shell
* 添加商品 -> hset cart:1001 10088 1
* 增加数量 -> hincrby cart:1001 10088 1
* 商品总数 -> hlen cart:1001
* 删除商品 -> hdel cart:1001 10088
* 获取购物车所有商品 -> hgetall cart:1001
9、用户消息时间线timeline
不重复则使用命令
spop myset
<a name="v0RLG"></a>
#### 12、点赞、签到、打卡、投票
- 点赞 - 使用 集合
```shell
# 点赞: 点赞成功返回 True, 已点赞返回 False
sdd articleId userId == 1
# 取消点赞
SREM articleId userId
# 检查用户是否已点赞
SISMEMBER articleId userId
#获取所有点赞的用户
SMEMBERS articleId
#返回已点赞用户数
SCARD articleId
13、商品标签
set
#添加产品标签
SADD productId::tags "大内存" "高像素"
14、商品筛选
// 获取差集
sdiff set1 set2
// 获取交集(intersection )
sinter set1 set2
// 获取并集
sunion set1 set2
15、用户关注、社交关系、商品推荐
使用数据结构-集合 ```shell
用户使用两个集合保存 关注者名单和 正在关注用户名单
格式
添加 当前用户 userId 关注用户 userId2
sadd userId:following userId2
userId2 关注 当前用户 userId
sadd userId:follower userId2
取消关注
SREM userId:following userId2
获取关注者名单数量
SCARD userId:follower
判断是否为 正在关注用户名单
返回 正在关注用户名单
SMEMBERS userId:following
返回 关注者名单
SMEMBERS userId:follower
userId 关注的人也关注了 userId2 (取交集):
sinter userId:following userId2:follower
用户1 可能认识的人
sdiff userId2:following userId:following
用户2 可能认识的人
sdiff userId:following userId2:following
follow 关注 fans 粉丝 相互关注: sadd 1:follow 2 sadd 2:fans 1 sadd 1:fans 2 sadd 2:follow 1 我关注的人也关注了他(取交集): sinter 1:follow 2:fans 可能认识的人: 用户1可能认识的人(差集):sdiff 2:follow 1:follow 用户2可能认识的人:sdiff 1:follow 2:follow
<a name="aRH79"></a>
#### 16、排行榜
- 使用数据结构 - 有序集合
```shell
# 添加排行榜
ZADD myzset 1 "one"
# 获取排行榜分数
ZSCORE myzset "one"
# 移除排行榜
ZREM myzset "one"
# 增加分数
ZINCRBY myzset 2 "one"
#降低分数
ZINCRBY myzset -2 "one"
#获取排名: 从 0 开始
ZREVRANK myzset "one"
# 获取排名前三
ZREVRANGE myzset 0 2
参考
- https://segmentfault.com/a/1190000019477128
- https://www.cnblogs.com/54chensongxia/p/13794391.html
- https://segmentfault.com/a/1190000008188655
- https://z.itpub.net/article/detail/289AA4B183485DD04CCB92DA14E625E2
- https://xie.infoq.cn/article/85bb5725442408acf968455ba
[