Redis
文章平均质量分 91
Lvshen的技术小屋
技术宅
展开
-
我使用延迟队列实现商品的竞拍成交功能
我们平时开发可能要求实现这样的需求:用户可以在有效的时间内进行商品竞拍,当有效时间过了之后,取竞拍价最高的用户成交。我们一般可以使用定时任务每5s定时扫描数据库,获取有效时间大于当前时间的商品列表,然后取每个商品中竞价最高的用户存入商品成交表中。启动系统后我们发现结束时间小于当前时间的商品已经被消费,因为没有人竞拍,而竞拍时间到了,这里显示为流拍UNSETTLE。启动一个常驻线程,扫描延迟队列,获取已到竞拍时间结束的商品,并获取对应商品的竞拍信息,存入用户商品成交表中。为结束时间,即消费的时间。原创 2022-08-20 10:46:28 · 619 阅读 · 0 评论 -
聊聊什么是缓存雪崩和缓存穿透
缓存雪崩假如一个系统,它在高峰期有每秒7000个请求,这时我们使用缓存抗住了这么高的请求。但如果在某个时间点缓存大量失效,或者缓存服务器挂掉了,那么这些请求就会直接作用在普通数据库中(如MySQL)。这么高的请求量,MySQL肯定抗不住,进而挂掉,数据库一挂,也会导致系统挂掉。我们总结缓存雪崩触发的条件:“ 高并发情况下 缓存服务器挂了 大量缓存集中失效 ”导致的后果就是:系统崩溃。解决思路,对数据库增加限流排队访问,假设我们的数据库最多能抗住每秒200原创 2021-03-30 14:45:56 · 351 阅读 · 0 评论 -
Redis是如何持久化到硬盘的
Redis为什么需要持久化我们在项目中或多或少会用到Redis,Redis主要用作缓存数据库。使用Redis可以大大提升我们程序是性能,使用Redis之所以快的原因之一是Redis的数据是存储在内存中,应用程序访问Redis只需要从内存中读取即可。从内存中读取数据确实能提高访问速度,但是当Redis挂了,内存中的数据就会丢失掉,为了防止数据丢失,我们需要将数据持久化到硬盘中。当Redis挂了,数据已经存储到硬盘中了,Redis重启后,硬盘中的数据就会重新加载到内存中。那么,问题来了。原创 2021-03-30 14:37:18 · 1050 阅读 · 0 评论 -
Redis除了做缓存,还能做什么
缓存Redis是什么大家都知道,一个非关系型数据库。大部分情况下我们使用Redis做缓存。使用缓存的情况一般是这样的:Redis缓存“(1)从Redis缓存中获取数据,如果存在数据,直接返回值。(2)如果不存在,执行数据库的查询方法(3)将数据库中的值放入缓存,并返回值”代码如下:当然我们也可以使用Spring的缓存注解@Cacheble。我们要在配置类上面开启缓存注解@EnableCaching,使用如下:有兴趣的童鞋可以看看我写的这篇文章:“利用AO原创 2020-10-28 08:19:08 · 3998 阅读 · 2 评论 -
我做了个签到功能,架构师看了后觉得可以优化下
背景签到功能相信大家都很熟悉了,功能就是用户每天可以签到一次,连续签到固定天数可以获得奖励。这里我把功能简单化:“ 每个用户一天只能签到一次; 连续签到7天送优惠券; ”界面是这样的:签到签到对于引流是一个不错的小工具,下面来看看我是如何做的(这里为了讲解,逻辑变简单了。实际可能要更复杂)。我的设计首先需要一个签到表sign,用于记录签到时间。CREATETABLE`sign`(`id`varchar(255)CHARACTERSE...原创 2020-09-22 07:57:12 · 441 阅读 · 0 评论 -
手写Redis分布式锁
分布式锁使用场景现在的系统都是集群部署,每个服务都不是单节点的了。比如库存服务,可能部署到3台机器上分别命名为节点1,节点2,节点3。库存服务需要扣减库存,扣减库存肯定需要锁吧,如果使用Lock或者synchronized,只能锁住自己的节点。而从前台访问是随机路由到这3台节点的。如果线程一进来使节点1上了锁,当线程二进来可能访问到的是节点2,这时节点2还没有上锁,那么库存就会扣减错误。而库存扣减还是一个核心操作,现在居然有Bug,想想就可怕。这时我们就需要一个全局的锁了。实现全局的锁不一定是R原创 2020-09-07 08:40:54 · 409 阅读 · 0 评论 -
Redis只会用来做缓存?那你应该来看看这篇文章
Redis为什么快?项目中会用到redis,因为redis可做缓存,并发每秒能处理10w条数据。但你知道为什么redis存取那么快么,你可能会说redis基于内存,基于K-V存储,单线程….。等等,为什么单线程反而会快了呢?其实Redis是基于NIO的多路复用模型。Windows环境下是select的多路复用,Linux环境下是epoll的多路复用。可能有人会问,什么是多路复用。多路复用简单来说,Redis将数据的读取交给内核去做多路复用redis会将n个客户端连接放入一个.原创 2020-09-06 22:35:14 · 649 阅读 · 0 评论 -
Redis分布式可重入锁实现
可重入锁一个线程可以多次获取该锁,说明这把锁是可重入的。下面我们来实现Redis分布式可重入锁。我们可以用线程的ThreadLocal变量存储当前持有锁的计数。核心代码下面的代码并不完善,只是提供了一个思路。@Componentpublic class RedisWithReentrantLock { @Autowired private RedisTemplate redisTemplate; private static fina...原创 2020-09-05 08:32:52 · 622 阅读 · 0 评论