每日一问:集合元素如何保证不变性

        HashMap<String, String> map = new HashMap<>();
        map.put("1","2");
        Map<String, String> stringMap = Collections.unmodifiableMap(map);
        System.out.println(stringMap.get("1"));
        stringMap.put("1","3");
     Collections.unmodifiableMap():能够保证集合中元素不变性,今天被面试问到了,没答出来。

35b79736beb746ebbe065609eb69825f.png

 

```markdown ## 题目重述 **业务场景3:** 公司推广新网站,需统计以下指标: - **PV**:页面访量,每次刷新+1,用 `INCR` 实现累加; - **UV**:独立访客数,基于 Cookie 区分用户,同用户多次访只计次,使用 Set 去重; - **IP**:独立 IP 访数,相同 IP 多次访只计次,使用 Set 存储去重。 要求使用 Redis 实现日维度的 PV、UV、IP 统计,数据结构简洁,标识符简短。 --- ## 给出答案(答案为带注释的代码块) ```redis # 模拟当天日期:20250405 SET date 20250405 # PV:每日访量,每次访 +1 # 示例:用户c1、c2、c3等访(含刷新) INCR pv:20250405 # 每次页面加载执行次,结果自动累加 # UV:基于Cookie识别用户,每个Cookie唯标识个用户 # 用户c1第次访,添加到UV集合 SADD uv:20250405 c1 # 用户c2访 SADD uv:20250405 c2 # 用户c1再次访(不新增UV) SADD uv:20250405 c1 # 无效插入,Set自动去重 # IP:基于IP地址统计独立IP访 SADD ip:20250405 192.168.1.1 SADD ip:20250405 192.168.1.2 SADD ip:20250405 192.168.1.1 # 已存在,不重复计入 # 查询当天PV总数 GET pv:20250405 # 查询当天UV总数(即不同Cookie数量) SCARD uv:20250405 # 查询当天IP总数(即不同IP数量) SCARD ip:20250405 # 查看所有独立访客的Cookie SMEMBERS uv:20250405 # 查看所有独立IP SMEMBERS ip:20250405 ``` --- ## 代码解析 1. **PV 使用 String 类型 + INCR**:每访次自增1,适合高频写入; 2. **UV 使用 Set 存储 Cookie ID(如c1, c2)**:利用 Set 的唯保证用户只计次; 3. **IP 使用 Set 存储 IP 地址**:即使多人共享同IP(如公司网络),也仅计次; 4. 所有键按日划分(`:20250405`),便于每日清空或归档; 5. `SCARD` 获取集合元素个数,即 UV 和 IP 总数,时间复杂度为 $O(1)$。 该方案完全匹配图片中展示的思路:通过 Set 去重 + String 自增实现三大核心指标统计。 --- ## 知识点(列出该代码中遇到的知识点) 1. **INCR 原子自增操作** 对String值进行线程安全的+1操作,适用于PV高并发计数。 2. **Set集合自动去重特性** 插入重复元素时自动忽略,适用于UV和IP的去重统计。 3. **SCARD 获取集合基数** 返回Set中唯元素个数,用于快速获取UV和IP总量。 ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值