- 博客(23)
- 收藏
- 关注
原创 Redis实战篇《黑马点评》9 用户签到、UV统计
把每一个bit位对应当月的每一天,形成映射关系,用0和1标识业务状态,这种思路就成为位图(BitMap)。这样我们就能用极小的空间,来实现大量数据的表示。Redis中是利用String类型数据结构实现BitMap,因此最大上限是512M,转换为bit则是2^32个bit位。用户签到一次,就是一条记录,假如有1000W用户,平均没人每年签到10次,那这张表一年的数据量就有1亿条。那有没有方法能简化一点呢?我们可以使用二进制位来记录每个月的签到情况,签到记录为1,未签到记录为0。BitMap的操作命令有。
2025-03-14 17:56:59
1012
原创 Redis实战篇《黑马点评》8 附近商铺
看样子是ShopController中的方法,那我们现在来修改其代码,除了typeId,分页码,我们还需要其坐标。
2025-03-03 23:48:47
773
原创 Redis实战篇《黑马点评》7 达人探店,好友关注
编写一个通用的实体类,不一定只对blog进行分页查询,这里用泛型做一个通用的分页查询,list是封装返回的结果,minTime是记录的最小时间戳,offset是记录偏移量。这几条记录,假设t2时刻有发布了一条新纪录,那么在t3时刻,我们来读取第二页,此时page = 2,size = 5,那么此时读取的数据是从6开始的,读到的是。假设在t1时刻,我们取读取第一页,此时page = 1,size = 5,那么我们拿到的就是。,那么我们就读到了重复的数据,所以我们要使用Feed流的分页,不能使用传统的分页。
2025-03-03 00:36:15
752
原创 Redis实战篇《黑马点评》6 Redis消息队列
不过需要注意的是,当队列中没有消息时,RPOP和LPOP操作会返回NULL,而不像JVM阻塞队列那样会阻塞,并等待消息,所以我们这里应该使用BRPOP或者BLPOP来实现阻塞效果。注意:当我们指定其实ID为$时,代表只能读取到最新消息,如果当我们在处理一条消息的过程中,又有超过1条以上的消息到达队列,那么下次获取的时候,也只能获取到最新的一条,会出现。在业务开发中,我们可以使用循环调用的XREAD阻塞方式来查询最新消息,从而实现持续监听队列的效果,伪代码如下。读取消息的方式之一:XREAD。
2025-02-27 17:50:25
962
原创 Redis实战篇《黑马点评》5 秒杀优化
如果充足,则在Redis中判断用户是否可以下单,如果set集合中没有该用户的下单数据,则可以下单,并将userId和优惠券存入到Redis中,并且返回0,整个过程需要保证是原子性的,所以我们要用Lua来操作,同时由于我们需要在Redis中查询优惠券信息,所以在我们新增秒杀优惠券的同时,需要将优惠券信息保存到Redis中。在这六个步骤中,有很多操作都是要去操作数据库的,而且还是一个线程串行执行,这样就会导致我们的程序执行很慢,所以我们需要异步程序执行,那么如何加速呢?但是这里还存在两个难点。
2025-02-22 22:30:00
839
原创 Redis实战篇《黑马点评》4 分布式锁
基于SETNX实现的分布式锁存在以下问题重入问题重入问题是指获取锁的线程,可以再次进入到相同的锁的代码块中,可重入锁的意义在于防止死锁,例如在HashTable这样的代码中,它的方法都是使用synchronized修饰的,加入它在一个方法内调用另一个方法,如果此时是不可重入的,那就死锁了。所以可重入锁的主要意义是防止死锁,我们的synchronized和Lock锁都是可重入的不可重试我们编写的分布式锁只能尝试一次,失败了就返回false,没有重试机制。
2025-02-22 17:06:57
975
原创 Redis实战篇《黑马点评》3 优惠券秒杀
失败原因分析:由于我们部署了多个Tomcat,每个Tomcat都有一个属于自己的jvm,那么假设在服务器A的Tomcat内部,有两个线程,即线程1和线程2,这两个线程使用的是同一份代码,那么他们的锁对象是同一个,是可以实现互斥的。但是如果在Tomcat的内部,又有两个线程,但是他们的锁对象虽然写的和服务器A一样,但是锁对象却不是同一个,所以线程3和线程4可以实现互斥,但是却无法和线程1和线程2互斥。1.UUID利用JDK自带的工具类即可生成,生成的是16进制的字符串,无单调递增的特性。
2025-02-18 00:11:54
971
原创 Redis实战篇《黑马点评》2 商户查询缓存
什么是缓存?缓存就像自行车、越野车的避震器举个例子越野车、山地自行车都有避震器,防止车体加速之后因惯性,在U型地形上飞跃硬着陆导致损坏,像个弹簧意义同样,在实际开发中,系统也需要避震器,防止过高的数据量猛冲系统,导致其操作线程无法及时处理信息而瘫痪在实际开发中,对企业来讲,产品口碑、用户评价都是致命的,所以企业非常重视缓存技术缓存(Cache)就是数据交换的缓冲区,俗称的缓存就是缓冲区内的数据,一般从数据库中获取,存储于本地。
2025-02-13 23:51:35
760
原创 Redis实战篇《黑马点评》1 短信登录
短信登录这部分会使用Redis共享session来实现商户查询缓存这部分要理解缓存击穿,缓存穿透,缓存雪崩等问题,对于这些概念的理解不仅仅是停留在概念上,更是能在代码中看到对应的内容优惠券秒杀这部分我们可以学会Redis的计数器功能,结合Lua(之前一直想学Lua然后写饥荒mod)完成高性能的Redis操作,同时学会Redis分布式锁的原理,包括Redis的三种消息队列附近的商户利用Redis的GEOHash(新数据结构,前面没有应用场景就没介绍)来完成对于地理坐标的操作UV统计。
2025-02-10 11:50:13
952
原创 Redis基础篇 3. Redis的Java客户端
RedisTemplate可以接收任意Object作为值写入Redis只不过写入前会把Object序列化为字节形式,默认是采用JDK序列化,得到的结果是这样的可读性差内存占用较大我们可以自定义RedisTemplate的序列化方式,代码如下在包下编写对应的配置类@Bean// 创建RedisTemplate对象// 设置连接工厂// 创建JSON序列化工具// 设置Key的序列化// 设置Value的序列化// 返回。
2025-02-08 10:00:00
765
原创 Redis基础篇 1. 初识redis
Redis是一种键值型的NoSQL数据库,这里有两个关键字其中是指Redis中存储的数据都是以Key-Value键值对的形式存储,而Value的形式多种多样,可以使字符串、数值甚至Json而NoSQL则是相对于传统关系型数据库而言,有很大差异的一种数据库可以翻译做Not Only Sql(不仅仅是SQL),或者是No Sql(非Sql的)数据库。是相对于传统关系型数据库而言,有很大差异的一种特殊的数据库,因此也称之为。传统关系型数据库是结构化数据,每张表在创建的时候都有严格的约束信息,如字段名、字段数据类型
2025-02-06 23:15:23
698
原创 Redis入门
Redis是一个基于内存的key-value结构数据库。基于内存存储,读写性能高适合存储热点数据(热点商品、资讯、新闻)企业应用广泛官网:https://redis.io中文网:https://www.redis.net.cn/Redis存储的是key-value结构的数据,其中key是字符串类型,value有5字符串string哈希hash列表list集合set有序集合。
2024-12-22 15:34:25
285
原创 线程常用方法----守护线程
在Java中,守护线程(Daemon Thread)是一种特殊的线程,它主要用于为其他线程(即用户线程)提供服务。守护线程的最显著特点是,当程序中不存在任何非守护线程时,JVM会退出。换句话说,守护线程的存在不会阻止JVM的终止。一旦JVM中只剩下守护线程,JVM就会退出,程序也随之结束。
2024-08-09 10:11:47
238
原创 jconsole
JConsole是一个基于Java Management Extensions (JMX)的图形用户界面(GUI)工具,它是JDK自带的一款监控和管理工具,用于连接正在运行的Java虚拟机(JVM),并对JVM上的Java应用程序进行监视和管理。
2024-08-05 23:11:46
204
原创 Vector集合
Vector是 Java 中的一个类,它实现了List接口,并且是一种动态数组。与ArrayList类似,Vector也可以动态地增长和缩小,但它在执行线程安全方面有所不同。Vector类中的大多数方法都是同步的,这意味着它适用于多线程环境,但在单线程环境中使用时可能会因为同步而降低性能。
2024-07-31 22:44:15
172
原创 java实训日记Day5
System.out.println(sb1.replace(16,26,"别say了!//Object中的toString方法默认返回调用类的字符串形式。//表示两个引用指向同一个地址。
2024-01-28 21:56:21
811
1
原创 java实训日记Day4
1.准备好基础知识:在面试之前,要对Java语言、数据结构、算法等基础知识进行充分的复习和准备,确保自己能够回答基础问题。2.准备项目经验:准备自己在Java后端开发方面的项目经验,包括项目的技术栈、解决的问题、遇到的挑战以及解决方案等,以便能够在面试中展示自己的实际能力。3.着装得体:在面试之前要确保自己的着装得体,给面试官留下良好的第一印象。4.自信表达:在面试中要自信地表达自己的观点和想法,展示自己的专业能力和解决问题的能力。
2024-01-25 18:40:53
964
原创 java实训日记Day3
System.out.println("长为:"+ length + " 宽为:"+ width +" 面积为:"+getArea() + " 周长为:"+getPer());System.out.println("品牌:"+brand+" 颜色:"+color+" 价格:"+price);System.out.println("姓名:"+name+" 年龄:"+age+" 是否有男朋友:"+bf);* 实现Girl类的定义,特征有姓名,年龄,是否有男朋友,打印所有特征的方法,生成get,set方法。
2024-01-24 19:21:53
1058
1
原创 java实训日记Day2
System.out.println("你已经跑了"+i+"圈,是否要继续跑");System.out.println("输入你的身份信息(军人,学生,普通人):");System.out.println("由于您是学生,享受半价购票");System.out.println("不行了,跑不动了");System.out.println("由于您是军人,享受免票");System.out.println("当月有28天");System.out.println("请输入你的业绩排名:");
2024-01-23 17:40:00
1158
1
原创 java实训日记Day1
Java SE(数组,面向对象(封装继承多态,抽象)接口,异常,多线程(问 的多《并发编程的艺术》),集合IO流(输入/输出)网络编程(AIO,BIO) JVM(java虚拟机《深入理解Java虚拟机》))工作:技术,性格,人情世故。System.out.println("姓名:武亚桢\n"+"学号:2213043326\n"+"座右铭:强者不一定是胜者,但胜者一定是强者!
2024-01-22 18:19:09
480
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人