作者文章

fwq

FWQ
服务器教程
SpringBoot AOP Redis如何实现延时双删功能
SpringBoot AOP Redis如何实现延时双删功能 收藏 小伙伴们对数据库编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《SpringBoot AOP Redis如何实现延时双删功能》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中也会多多分享相关知识点,希望对大家的知识积累有所帮助! 一、业务场景 在多线程并发情况下,假设有两个数据库修改请求,为保证数据库与redis的数据一致性,修改请求的实现中需要修改数据库后,级联修改Redis中的数据。请求一:A修改数据库数据 B修改Redis数据请求二:C修改数据库数据 D修改Redis数据并发情况下就会存在A —> C —> D —> B的情况(一定要理解线程并发执行多组原子操作执行顺序是可能存在交叉现象的) 1、此时存在的问题 A修改数据库的数据最终保存到了Redis中,C在A之后也修改了数据库数据。 此时出现了Redis中数据和数据库数据不一致的情况,在后面的查询过程中就会长时间去先查Redis,从而出现查询到的数据并不是数据库中的真实数据的严重问题。 2、解决方案 在使用Redis时,需要保持Redis和数据库数据的一致性,最流行的解决方案之一就是延时双删策略。注意:要知道经常修改的数据表不适合使用Redis,因为双删策略执行的结果是把Redis中保存的那条数据删除了,以后的查询就都会去查询数据库。所以Redis使用的是读远远大于改的数据缓存。延时双删方案执行步骤 1> 删除缓存2> 更新数据库3> 延时500毫秒 (根据具体业务设置延时执行的时间)4> 删除缓存 3、为何要延时500毫秒? 这是为了我们在第二次删除Redis之前能完成数据库的更新操作。假象一下,如果没有第三步操作时,有很大概率,在两次删除Redis操作执行完毕之后,数据库的数据还没有更新,此时若有请求访问数据,便会出现我们一开始提到的那个问题。 4、为何要两次删除缓存? 如果我们没有第二次删除操作,此时有请求访问数据,有可能是访问的之前未做修改的Redis数据,删除操作执行后,Redis为空,有请求进来时,便会去访问数据库,此时数据库中的数据已是更新后的数据,保证了数据的一致性。…
2025-05-10 阅读全文 →
FWQ
服务器教程
图解 | 深入理解跳表及其在Redis中的应用
图解 | 深入理解跳表及其在Redis中的应用 收藏 本篇文章向大家介绍《图解 | 深入理解跳表及其在Redis中的应用》,主要包括Redis、应用、跳表,具有一定的参考价值,需要的朋友可以参考一下。 本文转载自微信公众号「后端技术指南针」,作者大白斯基。转载本文请联系后端技术指南针公众号。 跳跃链表及其应用是非常热门的问题,深入了解其中奥秘大有裨益,不吹了,快开始品尝这美味的知识吧! 跳跃链表的基本概念 初识跳表 跳跃列表是一种数据结构。它允许快速查询一个有序连续元素的数据链表。跳跃列表的平均查找和插入时间复杂度都是O(log n),优于普通队列的O(n)。 跳跃列表由威廉·普发明,发明者对跳跃列表的评价:跳跃链表是在很多应用中有可能替代平衡树而作为实现方法的一种数据结构。 跳跃列表的算法有同平衡树一样的渐进的预期时间边界,并且更简单、更快速和使用更少的空间。 这种数据结构是由William Pugh(音译为威廉·普)发明的,最早出现于他在1990年发表的论文《Skip Lists: A Probabilistic Alternative to Balanced Trees》。 大白在谷歌上找到一篇作者关于跳表的论文,感兴趣强烈建议下载阅读: https://epaperpress.com/sortsearch/download/skiplist.pdf 看下这篇论文的摘要部分: 从中我们获取到的信息是:跳表在动态查找过程中使用了一种非严格的平衡机制来让插入和删除都更加便利和快捷,这种非严格平衡是基于概率的,而不是平衡树的严格平衡。…
2025-05-10 阅读全文 →
FWQ
服务器教程
Redis缓存穿透出现原因及解决方案
Redis缓存穿透出现原因及解决方案 收藏 本篇文章向大家介绍《Redis缓存穿透出现原因及解决方案》,主要包括redis缓存、穿透,具有一定的参考价值,需要的朋友可以参考一下。 在并发式的项目当中,一定要考虑一个缓存穿透的情况。那么什么是缓存穿透呢?简单的说来,就是当大量请求的key根本不在缓存当中,所以导致了请求直接到了数据库上,根本没有经过缓存这一层。比如一个黑客故意制造我们缓存中不存在的key发送大量的请求,就会导致请求直接落到数据库上。 也就是说,缓存穿透就是:1.缓存层不命中。2,存储层不命中,不将空的结果写回缓存。3,返回空结果给客户端。 一般mysql的默认最大连接数是150左右,当然这个是可以用show variables like ‘%max_connections%’命令来查看。 当然这只是一个指标,cpu磁盘内存网络等等原因都影响了他的并发能力,所以一般3000的并发请求就可以杀死大部分的数据库。 那么出现缓存穿透的时候需要怎么应对呢? 1)最基本的方式就是做好参数校检,比如不合法的请求就直接抛出异常信息给客户端,就比如设置查询条件id不能小于0或者传入邮箱格式不正确时直接返回错误消息给客户端。但是这样还是会出现缓存穿透的现象。那么还可以通过下面几个方案来解决: 2)缓存无效的key,如果数据库和缓存都找不到某个key的数据,就直接写一个到redis中并设置它的过期时间 set key value EX 10086。这种方式可以解决请求的key变化不频繁的情况,如果遇到专门的黑客攻击就不能解决这个情况。但是如果依然想用这个方法的话,那么在设置过期时间的时候,时间短一点,比如是一分钟。多说一句设置key的格式一般是:表名:列名:主键名:主键。 3)利用布隆过滤器:布隆过滤器是一个非常神奇的数据结构,通过这个过滤器可以帮助我们非常方便的去判断一个给定的数据是否存在于海量的数据当中。所以布隆过滤器在针对数据去重和验证数据的合法性时是非常有用的,布隆过滤器的实质就是一个bit(位)数组。也就是说每一个存进的数据都仅仅只占一位,在数据结构上来说相当于List、Map、Set等数据结构,但是占用的空间更少而且效率更高,但是缺点是它返回的值是概率性的,并不是多么的准确。当一个元素加入到布隆过滤器的时候:1.使用布隆过滤器当中的哈希函数对元素值进行计算,得到哈希值。2.根据得到的哈希值,在位数组中把对应的下标改为1。那么设置完成之后,我们要怎么判断一个元素是否存在于布隆过滤器当中呢? 首先我们要根据给定的元素再次进行hash计算;得到值之后判断数组中的每个元素是否都为1,如果值都为1的话,那么说明这个值在过滤器当中,如果不为1的话,就说明不再过滤器当中。 举个非常简单的例子 如上图所示,当字符串要加入到布隆过滤器当中时,该事务首先由多个哈希函数生成不同的哈希值,然后在对应的位数组的下标的元素设置位1,当二次存储相同的字符串时,因为先前的对应位置已经存在,所以在去重的时候非常方便。如果我们需要判断某个字符串是否在布隆过滤器当中时,只需要对给定的字符串再次进行相同的哈希计算,得到的值判断是否为1,从而判断数据是否存在于布隆过滤器当中,那么假如布隆过滤器说明一个数据存在时,很小的概率会误判,但是如果说明一个数据不存在时,那么一定是不存在的。 那么通过这个原理,利用redis布隆过滤器来将所有可能存在请求的值放在布隆过滤器当中,当用户请求时,直接判断用户发送来的请求是否存在于布隆过滤器中,不存在的话,直接返回请求参数错误信息给客户,存在的话就继续往下面走流程。
2025-05-10 阅读全文 →
FWQ
服务器教程
基于Redis的List实现特价商品列表功能
基于Redis的List实现特价商品列表功能 收藏 本篇文章给大家分享《基于Redis的List实现特价商品列表功能》,覆盖了数据库的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。  1、场景分析 淘宝京东的特价商品列表, 商品特点: 商品有限,并发量非常的大。 考虑分页 传统解决方案:数据库db, 但是在如此大的并发量的情况下,不可取。 一般会采用redis来处理。这些特价商品的数据不多,而且redis的list本身也支持分页。是天然处理这种列表的最佳选择解决方案。 2、分析 采用list数据,因为list数据结构有:lrange key 0 -1 可以进行数据的分页。 127.0.0.1:6379> lpush products p1 p2 p3 p4 p5 p6 p7…
2025-05-10 阅读全文 →
FWQ
服务器教程
浅谈redis加锁常用几种方式
浅谈redis加锁常用几种方式 收藏 在数据库实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天golang学习网就整理分享《浅谈redis加锁常用几种方式》,聊聊redis加锁,希望可以帮助到正在努力赚钱的你。 一、incr加锁 connect('127.0.0.1'); $redis->multi(); $redis->incr('number'); //$redis->decr('number'); //$redis->expire('number', -1); var_dump($redis->get('number')); var_dump($redis->ttl('number')); 二、setnx加锁 setnx('name', 'felix'); var_dump($redis->get('name')); var_dump($redis->ttl('name')); 三、set加锁 set('like', 'chuangxi', ['nx', 'ex' => 10]); //$redis->del('like'); var_dump($redis->get('like')); var_dump($redis->ttl('like')); 四、防止死锁…
2025-05-10 阅读全文 →
FWQ
服务器教程
Redis特殊数据类型bitmap位图
Redis特殊数据类型bitmap位图 收藏 本篇文章向大家介绍《Redis特殊数据类型bitmap位图》,主要包括BitMap、Redis数据类型、位图,具有一定的参考价值,需要的朋友可以参考一下。 Redis数据类型bitmap位图 bitmap数据结构,是基于二进制位来进行操作记录的,只有0 和 1两个状态。可以想象成一个数组,里面只有0或者1。 能干嘛呢? 现实中会有这些场景,比如统计用户信息,活跃用户和非活跃用户、登录的、未登录的用户,打卡的、未打卡的,像这种只有2个状态,并且数据量非常大的,就适合使用bitmap。 网上找了一个对比,可以帮助记忆下bitmap的优点。 一、setbit 设置或者清空key的value(字符串)在offset处的bit值。 那个位置的bit要么被设置,要么被清空,这个由value(只能是0或者1)来决定。当key不存在的时候,就创建一个新的字符串value。 比如现在我设置一个用户的7天的打卡信息,1是打卡,0是未打卡。 setbit sign 0 1 setbit sign 1 1 setbit sign 3 1 setbit sign…
2025-05-10 阅读全文 →
FWQ
服务器教程
如何使用Redis和PHP开发分布式搜索功能
如何使用Redis和PHP开发分布式搜索功能 偷偷努力,悄无声息地变强,然后惊艳所有人!哈哈,小伙伴们又来学习啦~今天我将给大家介绍《如何使用Redis和PHP开发分布式搜索功能》,这篇文章主要会讲到等等知识点,不知道大家对其都有多少了解,下面我们就一起来看一吧!当然,非常希望大家能多多评论,给出合理的建议,我们一起学习,一起进步! 如何使用Redis和PHP开发分布式搜索功能 分布式搜索是现代互联网应用中非常常见的需求之一,它能够帮助用户快速准确地搜索到所需要的信息。其中,Redis是一个非常快速且灵活的内存数据库,而PHP是一种广泛应用于Web开发的脚本语言。本文将介绍如何使用Redis和PHP来开发分布式搜索功能,并提供详细的代码示例。 安装Redis和PHP扩展首先,需要在服务器上安装Redis和PHP扩展以保证能够正常使用Redis的功能。Redis的安装可以参考官方文档或者相应的教程进行操作。PHP扩展可以通过包管理器(如apt、yum等)或者源码编译安装的方式进行安装。 设计搜索索引结构在使用Redis进行分布式搜索之前,需要设计好搜索索引的数据结构。一种常见的方式是使用有序集合(Sorted Set)来存储索引,以及使用散列(Hash)来存储每个文档的详细信息。可以按照以下方式进行设计: 索引: ZADD index:<关键词> <权重> <文档ID> 文档: HMSET doc:<文档ID> title <标题> content <内容> 其中,<关键词>为搜索关键词,<权重>为该关键词在文档中的重要性权重(可选),<文档ID>为唯一的文档标识,<标题>为文档标题,<内容>为文档内容。 建立搜索索引在进行搜索之前,首先需要在Redis中建立搜索索引。可以先将所有文档的内容、标题等信息存储到Redis中,并为每个文档建立适当的索引。 // 获取文档列表 $documents = [/* 文档列表 */];…
2025-05-10 阅读全文 →
FWQ
服务器教程
使用Redis和Golang构建缓存一致性:如何实现数据同步
使用Redis和Golang构建缓存一致性:如何实现数据同步 一分耕耘,一分收获!既然打开了这篇文章《使用Redis和Golang构建缓存一致性:如何实现数据同步》,就坚持看下去吧!文中内容包含等等知识点…希望你能在阅读本文后,能真真实实学到知识或者帮你解决心中的疑惑,也欢迎大佬或者新人朋友们多留言评论,多给建议!谢谢! 使用Redis和Golang构建缓存一致性:如何实现数据同步 引言:在大多数应用程序中,缓存被广泛使用来提高请求响应速度和减轻后端数据库的压力。然而,当存在多个缓存实例时,很容易出现数据不一致的情况,因为缓存之间的同步需要额外的工作。在本文中,我们将探讨如何使用Redis和Golang构建缓存一致性,以确保数据在多个缓存实例之间保持同步。 介绍Redis:Redis是一种内存数据存储系统,它可以用作缓存服务器。它提供了一种灵活的数据结构,如字符串、哈希、列表、集合和有序集合,并且支持各种操作,如读取、写入和删除数据。Redis还具有持久存储的功能,可以将数据保存到磁盘上,并在重启后恢复数据。 使用Redis构建缓存系统:我们可以使用Redis构建一个简单的缓存系统。首先,我们需要设置两个Redis实例:一个用作主服务器,一个用作从服务器。主服务器负责写入和更新缓存数据,而从服务器负责读取缓存数据。 在Golang程序中,我们可以使用像redigo这样的Redis客户端库来连接和操作Redis服务器。下面是一个使用redigo库进行读写操作的示例代码: package main import ( "fmt" "github.com/gomodule/redigo/redis" ) func main() { // 连接Redis服务器 conn, err := redis.Dial("tcp", ":6379") if err != nil…
2025-05-10 阅读全文 →
FWQ
服务器教程
Redis之sql缓存的具体使用
Redis之sql缓存的具体使用 收藏 来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习数据库相关编程知识。下面本篇文章就来带大家聊聊《Redis之sql缓存的具体使用》,介绍一下缓存、Redissql,希望对大家的知识积累有所帮助,助力实战开发! 1.环境搭建 org.springframework.boot spring-boot-starter-data-redis spring: redis: host: 192.168.8.128 port: 6380 password: 1234 database: 0 timeout: 3000 jedis: pool: max-wait: -1 max-active: -1 max-idle: 20 min-idle: 10…
2025-05-10 阅读全文 →
FWQ
服务器教程
redis bitmap数据结构之java对等操作详解
redis bitmap数据结构之java对等操作详解 收藏 来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习数据库相关编程知识。下面本篇文章就来带大家聊聊《redis bitmap数据结构之java对等操作详解》,介绍一下数据结构、redisbitmap,希望对大家的知识积累有所帮助,助力实战开发!   在之前的文章中,我们有说过bitmap,bitmap在很多场景可以应用,比如黑白名单,快速判定,登录情况等等。总之,bitmap是以其高性能出名。其基本原理是一位存储一个标识,其他衍生知道咱就不说了,而redis就是以这种原生格式存储的。   实际上,redis是基于string的数据结构实现了bitmap的功能。 1. redis基本的bitmap操作命令   最基本的,redis的bitmap有设置和读取两个值,即 setbit/getbit, 非常容易理解,即设置某个标识为1,那么取值判定的时候,就可以得到true. 127.0.0.1:6379> setbit bm1 222 1 (integer) 0 127.0.0.1:6379> getbit bm1 222 (integer) 1   这很容易理解,也是最基本的。当然,它还提供其他的一些操作:BITCOUNT 做数据量统计, BITOP 做bitmap的交并差运算… 我们也不必过多讨论它。…
2025-05-10 阅读全文 →