
Redis
文章平均质量分 70
1886i
尽人事听天命
展开
-
【Solution】商品秒杀之Redis缓存与MQ异步优化以及超卖一人一单等问题的解决
主要有三张表:用户表、商品表、订单表,将上述sql脚本执行一遍即可。原创 2023-10-19 22:38:30 · 898 阅读 · 0 评论 -
【Redis】多级缓存之缓存数据同步策略与Canal
Canal是基于MySQL的主从同步实现的,MySQL的主从同步原理如下:主节点会将变更的数据写入二进制日志文件,而从节点会将主节点的二进制日志文件拷贝到他的中继日志,然后重放日志里的事件将数据的变更进行同步,Canal就是将之间伪装成一个MySQL的从节点,从而监听主节点日志的变化,再将变更的信息通知给客户端,完成数据同步。修改数据库时发送事件通知,,相关的服务监听到后修改缓存数据,这种方式耦合度低,可同时通知多个缓存服务,但是时效性一般,存在中间不一致状态,适用于时效性要求一般,有多个服务需要同步。原创 2023-06-26 15:38:27 · 1414 阅读 · 0 评论 -
【Redis】多级缓存之OpenResty:nginx查询Tomcat与Redis以及nginx本地缓存
OpenResty是一个基于nginx的高性能Web平台,他用于方便的搭建能够处理高并发、扩展性极高的动态Web应用、Web服务和动态网关。他具备以下特点:1.具备nginx的完整功能 2.基于Lua语言进行扩展,集成了大量精良的Lua库、第三方模块 3.允许使用Lua自定义业务逻辑、自定义库。原创 2023-06-25 17:20:17 · 1432 阅读 · 0 评论 -
【Redis】Lua的基础入门与使用
他是一种轻量小巧的脚本语言,是一门用c语言编写的用c语言解析执行的高级语言。lua运行时把lua脚本编译成字节码,调用c函数来解析这些字节码。它支持面向对象、继承、闭包、协程,GC。他是一门用c语言编写的用c语言解析执行的高级语言。lua运行时把lua脚本编译成字节码,调用c函数来解析这些字节码。它支持面向对象、继承、闭包、协程,GC。原创 2023-06-23 16:06:07 · 1145 阅读 · 0 评论 -
【Redis】JVM进程缓存之Caffeine
缓存在日常开发中启着至关重要的作用,由于是存储在内存中的,数据的读取速度是非常快的,能大量的减少对数据库的访问次数,减少数据库的压力。我们把缓存分为两类,一种是分布式缓存,如Redis,还有一种就是本地缓存如HashMap、GuauaCahche等。原创 2023-06-20 21:10:52 · 925 阅读 · 0 评论 -
【Redis】多级缓存
多级缓存就是充分利用请求处理的每个环节,分别添加缓存,减轻Tomcat的压力提升性能,首先我们可以先从浏览器客户端进行缓存查询,如果没有则去nginx查询nginx的本地缓存,如果没有则通过Lua脚本编程去查询Redis,如果redis也未命中时则请求到达Tomcat服务器查询进程缓存,如果没有则最后查询数据库,此时大多数的压力都给到了nginx我们需要在nginx内部编程,所以此时我们可以将nginx部署成集群,准备一个单独的nginx做反向代理,代理到多个做缓存的nginx上。原创 2023-06-20 17:37:12 · 592 阅读 · 0 评论 -
【小说】Web小说在线阅读系统的实现
获取链接。原创 2023-06-14 21:07:44 · 1096 阅读 · 2 评论 -
【Reids】搭建主从集群以及主从数据同步原理
单节点的Redis并发能力存在上限,要提高并发能力就需要搭建主从集群,实现读写的分离,下面是Redis主从集群读写分离的整体架构。客户端所有的读操作都会去从节点,而所有的写操作都会去主节点。原创 2023-06-11 17:15:25 · 1220 阅读 · 1 评论 -
【Redis】Redis持久化机制RDB与AOF
RDB全称为Redis Database Backup File(Redis数据备份文件),也叫做Redis数据快照。简单的来说就是把某一时刻Redis内存里的数据都记录到磁盘中,当Redis实例故障重启后,从磁盘读取快照文件恢复数据。原创 2023-06-09 23:30:36 · 1287 阅读 · 6 评论 -
【Token】使用HandlerInterceptor拦截器解决Vue项目中跨域时预请求问题
在项目中使用token取代session实现登录鉴权时,Vue中每次请求都会带有携带token的请求头,此时前端会发送两次请求,在跨域请求中,浏览器会首先发送一个预检请求(Preflight Request)来检查服务器是否允许跨域请求。预检请求是一个 OPTIONS 请求,其中包含一个头部信息,用于列出实际请求中会包含的请求头。服务器需要正确响应预检请求,并在响应中包含头部信息,以允许实际请求中包含列出的请求头。原创 2023-06-05 15:20:11 · 1164 阅读 · 0 评论 -
【Redis】HyperLogLog数据类型与UV统计的实现
Redis中HyperLogLog是基于String结构实现的,单个HHL内存永远小于16kb内存占用极低,但是作为代价,其测量结果是概率性的,有小于0.81%的误差。比如我们统计某一文章或视频浏览量时可以使用UV统计,我们可以基于redis中的上述结构进行统计,当用户访问时我们获取用户id存入该数据结构,如果用户再次访问时,该用户id第二次插入时,只会统计一次。是指的通过互联网访问这个页面的自然人,1天内同一个用户多次访问该网站,只会记录一次。向指定的key中插入数据,如果重复则插入失败。原创 2023-06-02 21:33:52 · 576 阅读 · 0 评论 -
【Redis】GEO数据类型之附近的店铺实现
指定圆心、半径、找到该圆内包含的所有member,并按照与圆心之间的距离排序后返回。在指定的范围内搜索member,并按照与指定点之间的距离进行排序后返回,这个范围可以是矩形也可以是圆形。向redis中添加一个地理空间信息,其中包含经度、维度、值(member)与第六个相同,不过该命令可以将结果存储到一个指定的key中。将指定member的坐标转为hash字符串形式并返回。计算两个指定点之间的距离并返回。返回指定member的左边。原创 2023-06-01 01:09:42 · 1110 阅读 · 0 评论 -
【Redis】BitMap数据类型与用户签到功能的实现
一个月最多有31天,而bitMap有31位,我们可以将当前签到用户的id与当前时间年份+月份作为key,以BitMap为数据结构进行存储用户该月是否签到每一位表示一天,0与1表示是否签到,当用户点击签到请求时,服务器获取当前的时间与当前签到用户的id,以id+当前年月时间作为key,将当前的日作为下标,在BitMap中指定下标位存储1,比如当前签到用户是张三id=1,则key= “sign:1:2020-01”作为key,今天是1月11,则将这个key的第11位的也就是10下标的值修改为1即可表示签到。原创 2023-06-01 01:42:52 · 1103 阅读 · 0 评论 -
【Redis】共同关注列表与基于Feed流的关注消息滚动分页推送的实现
当登录的用户点击共同关注时,需要展示当前页面的用户与登录用户直接的共同关注,此时我们可以在数据库中维护一张关注表里面记录了关注者与被关注者的id,我们可以直接拿着该用户id去查询登录他关注了哪些人,同样拿着当前访问主页用户的id去查询该用户的关注然后求交集即可,那么问题来了如何求交集呢?我们可以通过Redis中的set数据结构的求交集命令来处理。原创 2023-05-28 14:47:04 · 1177 阅读 · 0 评论 -
【Redis】Redis实现点赞、点赞排行榜
在我们的项目中我们有时候会碰到这样的需求,比如实现一个博客系统,当用户访问到这篇博客时可以进行点赞,那么这个功能如何去实现呢,我们可以在数据库中维护一张点赞表,当用户刚进入这个博客页面时拿着这个博客的id发起请求查询这张点赞表,看是否存在点赞记录,如果存在返回前端,前端获取到后将点赞按钮高亮色展示,当用户再次点击时则发起取消点赞请求将数据库中点赞数-1且删除点赞记录,如果没有点过赞则发起点赞请求操作数据库使得点赞数+1以及插入一条点赞记录,上述流程基本全是数据库操作,我们可以通过redis来对该功能进行优化原创 2023-05-20 22:51:53 · 1641 阅读 · 1 评论 -
【Redis】SpringAOP+Redis的TTL实现接口规定时间内限流
首先我们需要使用SpringAOP对该接口进行拦截,请求到访问该接口时被改拦截器拦截,我们可以定义一个拦截器类实现 HandlerInterceptor 这个类并重写prehandle方法,该方法如果返回true则会继续访问目标接口,如果返回false则不进行继续访问,在该方法里我们先需要先获取用户IP,获取到用户IP后构建redis的key,然后通过setnx命令存入这个key并设置过期时间,如果存入成功则返回true,存入失败则说明以及被存入了,说明接口在过期时间内被访问过,此时拒绝继续访问该接口。原创 2023-05-20 01:21:19 · 205 阅读 · 0 评论 -
【Redis】电商项目秒杀问题之下单接口优化:Redis缓存、MQ以及lua脚本优化高并发背景下的秒杀下单问题
【Redis】电商项目秒杀问题之超卖问题与一人一单问题_1373i的博客-优快云博客在之前的文章里解决了电商项目项目超卖与一人一单的一些线程安全问题,之前的操作大体流程是:下单请求到达服务器,服务器会先查询库存是否足够,如果足够则继续判断用户是否已经下过单,如果没有下过单则去进行后续扣减库存生成订单这些操作我,完成后返回给客户端。如果在高并发情况下该接口的性能是相对较低的,因为上述操作有许多数据库的读写操作,只有等这些操作完成后我们才能返回响应,那么怎么去优化响应速度呢?原创 2023-05-19 23:32:30 · 2081 阅读 · 3 评论 -
【Redis】Redisson入门以及Redisson可重入锁的lua脚本实现
在之前的文章里我们通过redis中的setn实现了一个简单的分布式锁以及解决了误删、原子性等问题,但他依旧存在不足。我们在项目中一般使用比较成熟的分布式锁,Redisson是一个在redis基础上实现的Java驻内存数据网格,他不仅提供了一系列分布式的常用Java对象,他还提供了许多分布式服务,就比如分布式锁,Redisson中的分布式锁则不存在上述的问题,我们在项目中完全可使用。原创 2023-05-16 18:51:23 · 2224 阅读 · 1 评论 -
【Redis】实现及优化分布式锁:实现、解决误删锁问题以及lua脚本确保redis操作原子性
后续我们使用分布式锁会使用比较成熟的存在的组件t=N3I4Lua 教程 | 菜鸟教程 (runoob.com)https://www.runoob.com/lua/lua-tutorial.html。原创 2023-05-11 23:26:18 · 3173 阅读 · 8 评论 -
【Redis】电商项目秒杀问题之超卖问题与一人一单问题
在如双11等购物需求剧增的背景下,一个物品库存里有100件但是由于并发等问题可能会导致该物品被卖出超过100件。这就是超卖问题,他是由于库存量被高并发请求而产生的线程安全问题。原创 2023-05-10 19:46:54 · 4319 阅读 · 5 评论 -
【Redis】电商项目秒杀问题之全局唯一ID
它是一种在分布式系统下用来生成全局唯一ID的工具,它具有唯一性,高可用,高性能,递增性,安全性。如果我们使用数据库中的自增主键则不能保证安全性。如在订单系统中,我们在数据库中有订单表,如果在该订单表中使用数据库的自增主键,它的id规律性太明显且受单表数量的限制,如果订单数量日益增多,后续添加新的订单表时,他的主键又会重新开始。原创 2023-05-07 20:56:45 · 169 阅读 · 0 评论 -
【Redis】封装Redis缓存工具解决缓存穿透与缓存击穿问题
难点:在重建缓存时,我们需要去查询数据库,而查询数据库不同的reids缓存重建所需要查询的数据库表可能不同,其方法也可能不同。方法2:将任意Java对象序列化为json并存储在String的指定key中,并可以设置逻辑过期时间,用户处理缓存击穿问题。方法3:根据指定的key进行查询缓存,并反序列化为指定类型,利用缓存空值的办法解决缓存穿透问题。方法4:根据指定的key进行查询缓存,并反序列化为指定类型,需要利用逻辑过期解决缓存击穿问题。此处使用到的互斥锁加锁解锁方法,在前面的文章有提及。原创 2023-05-06 22:15:41 · 1749 阅读 · 1 评论 -
【Redis】Java通过redis实现简单的互斥锁
书接上回,上一篇博客里了解了缓存击穿的问题,其中解决的一个办法就是给缓存重建部分加互斥锁,此处我们不是使用Java中的synchronized,而是通过redis中String类型里的setnx来实现一个互斥锁,setnx命令是指插入一个键值对,如果存在则失败,如果不存在则成功。原创 2023-05-05 16:38:02 · 706 阅读 · 0 评论 -
【Redis】Redis缓存雪崩、缓存穿透、缓存击穿(热key问题)
我们在存入这个热key在存入的时候给他加一个逻辑过期的时间字段,该字段记录过期时间,每次获取的时候查看该key是否逻辑过期,如果过期此时需要重建该缓存,此时就可以开启一个线程异步的去重建,然后返回逻辑过期的数据,当重建缓存的异步线程没有执行完时,此时另一个线程来访问,发现过期尝试重建时,没有拿到锁,于是它将逻辑过期的旧数据返回。当请求穿过缓存请求数据库时,由于数据库中没有数据,所以此时我们将null进行返回并缓存,下次请求时从缓存中直接获取到null。原创 2023-05-05 15:42:09 · 967 阅读 · 0 评论 -
【Redis】Redis缓存
当线程1刚删除缓存时,线程2此时来查询,发现缓存没有,于是查询数据库,此时线程1还没有来得及去更新数据库,于是线程2获取到旧的数据返回并写入缓存,此时线程1更新完数据库。执行完毕时,缓存里的值是旧的,而数据库里确实跟新了的,就会存在线程安全的问题。,假设缓存由于某种原因失效了,线程1来查询时缓存未命中于是去查询数据库数据,此时线程2再去更新数据,并将缓存删除,此时线程1执行将读取到的旧数据写入缓存,缓存值与数据库不一致存在线程安全问题。如果在缓存集群的环境下,缓存的使用会消耗更多的人力资源。原创 2023-04-26 23:12:55 · 2924 阅读 · 0 评论 -
【Redis】SpringBoot整合Redis
SpringData是Spring里专门用来操作数据的模块,其中对redis集成的模块。原创 2023-04-20 00:13:29 · 609 阅读 · 2 评论 -
【Redis】Java客户端操作reids数据库
上述代码在单线程环境下可以使用,但是在多线程环境下需要给每个线程创建连接,频繁的创建于销毁连接对性能是损耗,所以推荐使用连接池获取连接。他是基于Netty实现的,支持同步、异步、响应式的编程,且线程安全。它还支持redis的哨兵模式、集群模式、管道模式。但是他的缺陷是他是线程不安全的,在多线程环境下需要使用连接池。由于他的方法与redis命令相同,所以在使用时,我们可以直接输入对应的命令作为方法使用即可。此处我们使用Jedis进行操作Redis,有以下步骤:建立连接---进行操作---关闭连接。原创 2023-04-19 22:25:09 · 589 阅读 · 0 评论 -
【Redis】常用命令、各种数据结构及命令
一、常见数据结构二、常用命令三、不同数据类型的操作命令1、String2、List3、Set4、Hash5、SortedSet原创 2023-04-18 21:48:36 · 1433 阅读 · 0 评论 -
【Redis】入门篇之相关概念与Redis的安装
首先Redis是一个非关系型的数据库,他的存储与MySQL不同,他是以键值对的形式存放数据的,非关系型数据库有很多种类比如K-V类似的数据库比如Redis,还有Document格式的非关系型数据库,以及Graph类型,他是将每个数据看作一个节点。他的集群中的从节点是可以对主节点的数据进行备份,一次来保证数据的安全性,而且他的主从集群可以进行读写分离来提升效率,分片集群就可以对数据进行拆分。redis是一个键值型的非关系型数据库,他的value支持多种不同的数据结构,功能比较丰富。原创 2023-04-17 22:09:53 · 348 阅读 · 0 评论