star++
致力于研究Apache开源项目
展开
-
redis实用技能
MoreKey问题指的是redis中有百万key value对,或者list set zset hash中有大量元素,一次使用key * 之类的命令,获取数据量太大的问题,可能导致redis卡顿,导致数据库雪崩指的是 string类型 的value 值大于10k, hash,list,set,zset元素个数超过5000。原创 2024-07-03 17:46:30 · 240 阅读 · 1 评论 -
JVM关于内存回收总结
theme: channing-cyan概述JVM内存回收,我将从以下几方面分析。分别是回收的区域,回收的数据,回收的依据,回收的算法,常见垃圾回收器来彻底聊一下这个问题。回收的区域1.JVM内存模型分为线程共享和线程独享2.线程独享内存生命周期是等于线程的生命周期,是不需要回收的3.线程共享的内存生命周期是和JVM进程相同的,是需要回收的回收的数据堆回收1.当我们new一个对象或者数组的时候,其实就会将对象和数组的内存分配在堆上2.当堆上数组和对象已经不需要的时候,这些对象和数组.原创 2022-04-03 18:29:43 · 1118 阅读 · 0 评论 -
缓存一致性问题三种解决方案附上代码
概述缓存一致性问题也是使用缓存中比较经典的问题之一。使用缓存,涉及数据库和缓存两部分数据的维护,既然是两个组件的数据,那么必然有数据一致性问题。常用的解决方案有三种,分别是设置过期时间,先更新数据库,再删缓存,先删缓存,再更新数据库。吗,设置过期时间代码示例1.查询数据@RequestMapping("/cache/db/{userId}")@GetMappingpublic User getUser(@PathVariable Integer userId){ //查询缓存原创 2022-04-03 18:28:04 · 1663 阅读 · 0 评论 -
布隆过滤器解决缓存穿透方案附上代码
概述缓存击穿,大家多多少少听说过。那么这个问题到底是个什么问题?怎么解决呢?这个问题其实是在高并发场景下,使用缓存提高访问速度,一些非法访问或者说攻击刻意绕过缓存,来直接攻击我们数据库。导致我们缓存形同虚设,并没有起到缓存效果。这个问题解决的根本就是过滤掉非法请求,只允许访问合法数据即可,而布隆过滤器就是用来过滤非法请求的,能达到我们预想的效果。布隆过滤器原理原理图1.首先会初始化一个全0比特位的数组,这个数组长度取决于用户期望存储数据的个数size,以及用户期望的误判率fpp,根据用户size原创 2022-04-03 18:26:46 · 1237 阅读 · 0 评论 -
redis集群部署及应用场景
概述redis cluster大家喜欢叫它redis集群,也有人喜欢叫分片集群。总结下来,redis有三种模式,分别是单机,哨兵模式,分片集群。从表面上看使用的机器越来越多了,其实确实是随着数据量读写的变化,需要不断升级三种部署模式,我们下面来看看区别,以及分别适用场景。分片集群原理图说明:如图,分片集群的含义的一目了然,数据分布存储在不同节点。首先客户端会对key进行CRC16计算,计算出来得到一个slot号,然后数据读写就在对应的redis实例上。和哨兵模式对比,分片集群不仅保证了高可用,同时还原创 2021-12-26 20:00:54 · 1371 阅读 · 0 评论 -
redis使用哨兵主从切换,程序应该做点什么?
概述哨兵通过监控master,如果发现master未回复心跳包,那么会判断为主观下线,票数过半哨兵都认为master主观下线,那么确认为master客观下线,那么接下来会在多个哨兵中选择一个作为leader,去做master切换工作。切换了新的master,通知客户端连接新的master.那么问题来了,程序那边怎么知道新master地址多少?应用程序那边需要做什么改变吗?引入依赖//springboot项目集成redis<dependency> <groupId>org原创 2021-12-26 15:14:50 · 573 阅读 · 0 评论 -
redis主从结构及应用场景
概述一般而言主从结构都是用来达到高可用的效果,也就是主服务器宕机情况下,马上切换为从服务器来应对.主从结构有很多好处,比如:高可用,读写压力分离; 同时也带来了问题,主从数据可能不一致问题,导致读到脏数据.redis既然支持主从结构,自然也存在这些问题,我们可以看看redis是怎么解决这些问题的.原理说明:正常主从同步结构,从节点只要执行 replicaof命令即可说明:其中一台salve掉线或者挂机了(一般来说,主从在一个网段内,掉线可能性不大,很大概率是宕机了),这个时候master新接受原创 2021-12-24 19:31:21 · 1242 阅读 · 0 评论 -
redis持久化问题及最终解决方案
概述redis作为一个缓存,为了达到高性能,数据都是直接放到缓存中的,那么必然会面临一个断电数据丢失的问题.对于流量不高的应用来说,大不了通过数据库,将数据恢复到缓存中; 对于高并发应用来说,缓存宕机丢失数据,会引发雪崩,击穿,穿透等一系列问题.AOF持久化方案工作原理描述: 1.客户端每接受到一条命令,执行完后,将日志数据写到AOF文件中 2.写回AOF文件有三种策略,Always(每个命令执行完,立即写回磁盘),Everysec(每秒将缓存中的日志写回原创 2021-12-24 11:22:20 · 498 阅读 · 0 评论 -
redis脑裂问题
概述脑裂问题,听起来很高端的样子.其实说白了就是主从拓扑结构,在主节点被误切换,导致原主节点还在处理请求,导致新主节点这部分数据缺失的一个现象.一般来说,主从结构多少有脑裂问题.脑裂问题说明:redis主从结构正常情况,正常同步,正常处理客户端请求.说明: master由于处理数据量比较大,或者网络拥堵,没有ack心跳包,哨兵误以为主节点下线,这个时候选举了新的master,而且这个时候旧master依然在处理 set a 10这个请求说明:旧的master已经恢复网络,发现已经选举了新m原创 2021-12-22 19:51:43 · 955 阅读 · 0 评论 -
redis如何解决缓存雪崩、击穿、穿透难题
概述针对雪崩、击穿、穿透问题,前提都是在高并发情况下,如果你做的场景流量在mysql数据库承载范围内,那么你并不需要关心这些问题。你只要保证你使用缓存,保证缓存与数据库数据一致性即可。所以今天讨论的是在高流量情况,如何应对使用缓存中一些常见的问题。缓存雪崩 背景:大量缓存同时过期,直接访问数据库刷新缓存数据,访问量超过mysql并发处理阈值,导致mysql长时间 无响应,导致依赖mysql服务都长时间不可用,无响应,服务超时. 解决方案: 1.错开缓存过期时间,设原创 2021-12-22 12:46:21 · 380 阅读 · 1 评论 -
redis使用过程中怎么用来解决并发问题
概述redis作为缓存组件,一般而言用来缓存我们程序的数据。所以并发问题可能存在两个地方,一个是redis缓存中数据并发问题,一个是业务程序数据并发问题。redis缓存数据并发问题场景1: 我们做的是个博客系统,需要对每篇文章点赞数据进行收集统计,多个用户同时点赞是个并发行为, 这个时候一般来说就有数据并发问题。初始谋篇文章点赞数量是0,这个时候张三和李四同时对一篇文章 进行点赞,拿到的初始值都是0,点赞完都是+1,这个时候更新回去,点赞数量就是1了。 解决方案:直接使用redi原创 2021-12-13 19:58:34 · 1329 阅读 · 0 评论 -
redis讨论下Sorted Set底层数据结构及应用场景
概述redis中一般数据结构已经够用了,比如常用的string和hash基本已经可以覆盖常用场景了,数据读写时间复杂度都是O(1).因为都是key value的结构. 但是当需要范围查找和排序的话,那就不能了,这种操作有点像数据库操作,而且有点像索引的功能. 没错,Sorted Set底层就是使用跳表实现的,有点类似二叉树索引之类的数据结构,时间复杂度为O(LogN).数据结构图redis整体结构图entry结构图skiplist结构图1.Sorted Set也是一个集合,相对于strin原创 2021-12-09 16:28:07 · 475 阅读 · 0 评论 -
redis讨论下Hash底层数据结构及应用场景
概述Hash结构对于我们来说太熟悉了,Java中我们几乎天天都要使用hash这种数据类型,也很清楚Hash的底层数据结构是HashTable.其实redis也类似,Hash底层也采用了HashTable,毕竟时间复杂度是O(1),但其实redis的Hash底层结构同时使用了两种数据结构,另外一种是Ziplist(压缩列表).两种结构有不同的使用场景,我们来分析一下.数据结构图redis整体结构图entry结构图hashtable结构图ziplist结构图1.hash和string有着明原创 2021-12-09 11:51:26 · 1006 阅读 · 0 评论 -
redis讨论下string底层数据结构及应用场景
概述了解string数据结构,还是非常有必要的.谈到数据结构就必须要谈两个问题,一个是时间复杂度,一个是空间.redis作为缓存,一个涉及访问速度,一个涉及占用内存空间,对于redis来说还是非常敏感的.数据结构图redis整体结构图entry结构图1.从redis整体结构图来看,只要是个全局key,意味着都会占用一个全局hash表元素2.从entry结构图来看,entry默认就要分配key,value,next24字节的指针本省消耗 分配数量是2的幂次方,会分配32字节 3.原创 2021-12-03 13:30:38 · 1087 阅读 · 1 评论 -
(四)redis常用命令之hash
概述hash这种数据结构也是非常常见的,在redis中,表示的是key仍然是string,value是hash类型的;redis中这种结构形如:key ->value={{filed1 value1},{filed2,filed2}…}hset命令(创建hash,并且填充filed)格式:hset key filed valuehget命令(获取某个hash的file...原创 2019-07-07 17:11:12 · 1403 阅读 · 0 评论 -
(五)redis常用命令之list
概述列表类型用来存储多个有序的字符串,列表中的每个字符串就是一个元素,一个列表最多可以存储2^32-1个元素; redis的列表结构操作起来非常灵活,应用场景非常广。lpush命令(从列表左边插入多个元素)格式:lpush key value1 value2 …rpush命令(从列表右边插入多个元素)格式:rpush key value1 value2 …lin...原创 2019-07-07 19:26:19 · 527 阅读 · 0 评论 -
(六)redis常用命令之set
概述集合类型(set)也是用来保存多个字符串元素的,和列表不一样的是,集合不允许有重复元素,并且集合中元素是无序的,不能像list那样通过下标来获取元素。但是集合不仅可以提供内部增删改查操作,而且提供多个集合之间的运算,也就是和外部集合的计算。sadd命令(添加多个元素)格式:sadd key element [element …]srem命令(删除set中多个指定元素—&...原创 2019-07-08 08:32:53 · 193 阅读 · 0 评论 -
(八)redis常用命令之键管理
单个键管理命令a.rename命令(键重命名)格式:rename key newkeyb.randomkey命令(随机返回一个键)格式: randomkeyc.expireat命令(在某个时间戳过期,秒级别)格式: expireat key timestampd.pexpire命令(设置键过期时间,精确到毫秒)格式: pexpire key millisecond...原创 2019-07-08 23:13:11 · 148 阅读 · 0 评论 -
(十)redis常用命令之redis通信协议
概述在我们平常总是有客户端和服务端的概念,客户端和服务端总是要交互的,服务端总是要理解客户端需要做什么操作,那么这个就是通过通信协议来实现的。也就是服务端与客户端必须遵循相同协议才能进行交互的。比如我们平常开发的后端,其实就是因为 browser和web-server之间都遵循http协议,使用http协议进行交互。那么redis也是一种服务端,我们需要使用redis客户端来和redis-s...原创 2019-07-12 23:39:50 · 321 阅读 · 0 评论 -
(十一)redis常用命令之RDB持久化
概述RDB持久化就是把当前进程数据生成快照保存到硬盘的过程,触发RDB持久化分为自动触发和手动触发手动触发a.save命令阻塞当前redis服务器,直到RDB过程完成为止,当redis内存中有很多数据需要RDB时,RDB阻塞时间会比较长说明:save命令执行完成后会将内存中的数据持久化到dump.rdb文件中,下次重启服务会还原到redis内存中;但是,save命令是阻塞的...原创 2019-07-14 08:17:04 · 696 阅读 · 0 评论 -
(九)redis常用命令之发布订阅
概述redis是可以满足简单的消息队列的功能的,比如消息队列的两种模型:点对点 和发布订阅。点对点可以通过redis中的list进行实现,结合lpush和brpop(阻塞读取)命令来实现。发布订阅模型就是现在要讲的,发布订阅模式又三部分组成:发布者,订阅者,频道。发布者发送消息到频道,然后订阅了频道的人都可以收到消息。publish命令(发布消息)格式: publish chan...原创 2019-07-10 23:29:35 · 387 阅读 · 0 评论 -
(一)redis常用命令之全局命令
查看所有键(当前数据库)keys *查看键总数(当前数据库)dbsize检查键是否存在exists key(存在返回1,否则返回0)删除一个键del key1 key2 key3(删除成功返回)...原创 2019-07-07 00:26:01 · 296 阅读 · 0 评论 -
(二)redis常用命令之数据结构和内部编码
概述我们知道通过type key 命令,可以看到当前key的值对应的数据结构。常用的有五种:string,hash,list,set,zset;但是其实这些知识redis的对外数据结构,其实每种数据结构背后有多种内部编码实现(代码实现),redis会根据具体情况,来决定使用哪种内部编码方式。查看使用内部编码object encoding key五种数据结构对应内部编码...原创 2019-07-07 08:15:27 · 173 阅读 · 0 评论 -
(三)redis常用命令之string
概述string可能是最普遍的数据类型了,在redis中,字符串可以存储的值还是很多的,当然这要结合业务场景。字符串类型可以存储:简单字符串,复杂字符串(json/xml),数字,二进制(图片,视频),但是单个值不能超过512M。set(添加一个键值对)格式:set key value [ex seconds] [px milliseconds] [nx|xx]ex ...原创 2019-07-07 09:10:11 · 262 阅读 · 0 评论 -
redis命令大全--学习笔记(一)
下载可视化管理工具:先下载vc_redist.x86.exe进行环境配置下载地址:vc_redist.x86.exe添加链接描述原创 2019-02-18 12:42:15 · 385 阅读 · 0 评论