IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 每日访问量统计的一种实现 -> 正文阅读

[大数据]每日访问量统计的一种实现

设计需求是记录数据集的每日访问量,可以进行趋势查看。

最简单的就是直接每次操作记录日志,然后在查询时直接根据日志使用sql实时统计。这种方案很简单,不需要另外考虑存储结构,只要查询语句写好即可。但是对于数据量稍微大一些的场景,这种方式的效率将会非常差。
因此这里考虑将每日访问量在数据库中存储下来,然后查询的时候能直接查即可。

思路就是设计表将数据集、日期共同作为复合主键,存储访问量数据。
由于在这个表中设计每人访问加1,直接更新这个表的话代价会比较大

sql表结构

CREATE TABLE `g_dataset_visit_count` (
  `dataset_id` bigint(11) NOT NULL COMMENT '数据集id',
  `v_date` datetime NOT NULL COMMENT '日期',
  `v_count` int(255) DEFAULT NULL COMMENT '访问量',
  `type` tinyint(4) DEFAULT NULL COMMENT '类型:1、数据页访问;2、接口查询',
  PRIMARY KEY (`dataset_id`,`v_date`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

使用redis进行计数

	@Resource
	StringRedisTemplate stringRedisTemplate;
	@Autowired
	DatasetProjectMapper datasetProjectMapper;
	
	/**
	 * 更新访问量:即时更新数据集表的访问量,更新redis中存储的当前访问量;然后在定时器中每晚更新日期访问表中的量
	 */
	public void visitDataset(Long datasetId, int Source) {
		// 更新数据集表的数量
		String redisKey = "dset_v_" + datasetId;
		stringRedisTemplate.opsForValue().increment(redisKey);
		// 给哪个数据集的哪个字段加1
		datasetProjectMapper.pageVisitIncre(datasetId, Source);
	}

定时任务持久化

@Component
@EnableScheduling
public class DatasetVisitInitJob {

	@Resource
	StringRedisTemplate stringRedisTemplate;
	@Autowired
	DatasetProjectMapper datasetProjectMapper;
	@Autowired
	DatasetVisitCountMapper datasetVisitCountMapper;
	
	@Scheduled(cron = "0 30 23 * * ?")
	public void createHyperLog() {
	    // 先更新日期;然后重新写入
		// 查出所有数据集的id,遍历查找当前访问量,按当前日期插入数据库
		List<Long> ids = datasetProjectMapper.getIds();
		LocalDate now = LocalDate.now();
		for (Long item : ids) {
			// 查redis,并按当前日期插入
			String redisKey = "dset_v_" + item;
			Object rv = stringRedisTemplate.opsForValue().get(redisKey);
//			if (rv == null) {
//				redisTemplate.opsForValue().set(redisKey, 0);
//			}
			DatasetVisitCount dvc = new DatasetVisitCount();
			try {				
				dvc.setVCount(Integer.parseInt(rv.toString()));
			} catch (Exception e) {
				dvc.setVCount(0);
			}
			dvc.setDatasetId(item);
			dvc.setVDate(now);
			dvc.setType(1);
			datasetVisitCountMapper.insert(dvc);
			Object c = stringRedisTemplate.opsForValue().getAndSet(redisKey, "0");
		}
	}
}

以上由于时间问题暂未处理失败补偿

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 13:08:12  更:2022-03-06 13:11:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:55:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码