- 博客(155)
- 收藏
- 关注
原创 J9:缓存淘汰, Redis 分布式锁,事务
所有数据淘汰由于普通的lru算法依赖链表,并且需要移动,会降低redis的性能。redis进行了简化。lfuLRU 策略更加关注数据的时效性,而 LFU 策略更加关注数据的访问频次。
2023-03-19 19:19:44
458
原创 J7:如何应对变慢的Redis
通过 Redis 日志,或者是 latency monitor 工具,查询变慢的请求,根据请求对应的具体命令以及官方文档,确认下是否采用了复杂度高的慢查询命令。Redis 键值对的 key 可以设置过期时间。选项,可以用来监测和统计测试期间内的最大延迟。redis-cli 命令提供了。
2023-03-12 22:43:06
421
原创 J6:Redis如何避免异步阻塞,CPU对redis的影响
非统一内存访问架构(Non-Uniform Memory Access,NUMA 架构):在多 CPU 架构下,一个应用程序访问所在 Socket 的本地内存和访问远端内存的延迟并不一致。多 CPU Socket 架构。
2023-03-12 20:55:33
298
原创 J5、String,geo
背景:使用 string存储key,value,当保存的数据较小时,反而空间占用大,可以考虑使用hash 进行解决空间过大的问题。
2023-03-12 14:52:25
203
原创 4.门面模式,组合模式,享元模式
为了保证接口的可复用性(或者叫通用性),我们需要将接口尽量设计得细粒度一点,职责单一一点。但是,如果接口的粒度过小,在接口的使用者开发一个业务功能时,就会导致需要调用 n 多细粒度的接口才能完成。调用者肯定会抱怨接口不好用。粒度太大,会导致接口的通用性不好。
2023-01-30 14:57:16
213
原创 3.代理模式、桥接模式、装饰器模式、适配器模式
在不改变原始类(或叫被代理类)代码的情况下,通过引入代理类来给原始类附加功能原来的实现,代码侵入性比较强但是如果有很多方法需要实现,那改动特别大,可以使用动态代理实现,就是我们不事先为每个原始类编写代理类,而是在运行的时候,动态地创建原始类对应的代理类,然后在系统中用代理类替换掉原始类。
2023-01-29 22:31:55
568
原创 2.单例模式,工厂模式,建造者模式,原型模式
在简单工厂和工厂方法中,类只有一种分类方式。如果还用简单工厂或者工厂方法就会创建过多的工厂类。抽象工厂可以让一个工厂负责创建多个不同类型的对象,有效地减少工厂类的个数。//此处可以扩展新的parser类型,比如IBizConfigParser } public class JsonConfigParserFactory implements IConfigParserFactory {} }
2023-01-28 22:37:05
897
原创 1.设计模式的前奏
1、2、6、7 都是跟 token 有关,负责 token 的生成、验证;在基于充血模型的 DDD 开发模式下,Service 类并不会完全移除,而是负责一些不适合放在。基于充血模型的 DDD 开发模式跟基于贫血模型的传统开发模式相比,主要区别在 Service。// 当每秒钟接口超时请求个数,超过某个预先设置的最大阈值时,我们也要触发告警发送通知。重构作为保持代码质量不下降的有效手段,利用的就是面向对象、设计原则、设计模式、编。3、4 都是在处理 URL,负责 URL 的拼接、解析;
2023-01-26 22:45:34
999
原创 4. ThreadLocal,Java对象内存布局和对象头,Synchronized与锁升级
ThreadLocal实现每一个线程都有自己专属的本地变量副本主要解决了让每个线程绑定自己的值,通过使用get()和set()方法,获取默认值或将其值更改为当前线程所存的副本的值从而避免了线程安全问题。ThreadLocal<Integer> threadLocal = ThreadLocal.withInitial(() -> 0);因为每个 Thread 内有自己的实例副本且该副本只由当前线程自己使用既然其它 Thread 不可访问,那就不存在多线程间共享的问题。统
2022-05-14 20:44:05
227
原创 3. java锁,JMM,volatile,CAS
乐观锁和悲观锁悲观锁适合写操作多的场景,先加锁可以保证写操作时数据正确。显式的锁定之后再操作同步资源synchronized关键字和Lock的实现类都是悲观锁//=============悲观锁的调用方式public synchronized void m1(){ //加锁后的业务逻辑......}// 保证多个线程使用的是同一个lock对象的前提下ReentrantLock lock = new ReentrantLock();public void m2() {
2022-05-06 18:06:59
427
原创 2.LockSupport与线程中断
什么是中断?首先一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止。所以,Thread.stop, Thread.suspend, Thread.resume 都已经被废弃了。其次在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Java提供了一种用于停止线程的机制——中断。中断只是一种协作机制,Java没有给中断增加任何语法,中断的过程完全需要程序员自己实现。若要中断一个线程,你需要手动调用该线程的interrupt
2022-05-06 13:58:33
187
原创 1. 多线程,CompletableFuture
多线程的原因硬件方面:摩尔定律失效,在主频不再提高且核数在不断增加的情况下,要想让程序更快就要用到并行或并发编程。软件方面:高并发系统,异步+回调等生产需求private native void start0();openjdk8\jdk\src\share\native\java\lang thread.cjava线程是通过start的方法启动执行的,主要内容在native方法start0中,Openjdk的写JNI一般是一一对应的,Thread.java对应的就是Thread.csta
2022-05-05 17:19:13
453
原创 16,Redis为什么这么快 select ,poll,epoll
Redis是单线程为什么这么快同步调用者要一直等待调用结果的通知后才能进行后续的操作,现在就要,我可以等到出结果为止。异步被调用方先返回应答让调用者先回去,然后再计算调用结果,计算完最终结果后返回给调用方(一般通过回调)同步和异步的讨论对象是被调用者,重点在于获取调用结果的消息通知方式上。阻塞调用方一直等待而且什么事都不做,当前线程挂起,啥都不干非阻塞调用方先去忙别的事,不会阻塞当前线程,立即返回阻塞和非阻塞主要是调用者在等消息都时候能否干其他事BIONIO
2022-03-30 22:26:19
893
原创 18.Redis之微信抢红包
发红包发红包无需加锁使用redis的list的数据结构:LPUSH hongbao:a 1 2 3 4 5红包金额: 二倍均值法 。 剩余金额M,人数N 每次抢到的金额 = (0,(M / N )X2)redisTemplate.opsForList().leftPushAll(key,packages);redisTemplate.expire(key,1,TimeUnit.Days)抢红包需要加锁使用 LPOP hongbao:a 可以出来红包的金额obj
2022-03-29 22:11:13
1204
原创 17 Redis缓存更新策略(缓存和数据库更新选择)
1. 先更新数据库,在更新缓存会有异常更新完Mysql,发生异常,redis还没有更新,导致redis的是旧数据,下次读取缓存读的是脏数据2.先删除缓存,在更新数据库1.缓存已经删了,mysql还在更新中。。。由于Mysql还在更新中,会读取到Mysql的旧值,回写到redis低并发:写入旧值 高并发:缓存击穿解决方案延迟双删策略带来的问题删除要多久mysql主从架构会怎么样这种同步淘汰策略,吞吐量降低怎么办3.先更新数据库,在删除缓存可能读
2022-03-28 22:25:22
1518
4
原创 16. Redis底层实现 总结
不同数据类型对应的底层数据结构:1. 字符串int:8个字节的长整型。embstr:小于等于44个字节的字符串。raw:大于44个字节的字符串。Redis会根据当前值的类型和长度决定使用哪种内部编码实现。2. 哈希ziplist(压缩列表):当哈希类型元素个数小于hash-max-ziplist-entries 配置(默认512个)、同时所有值都小于hash-max-ziplist-value配置(默认64 字节)时,Redis会使用ziplist作为哈希的内部实现,ziplist使用更加.
2022-03-28 16:38:37
128
原创 15. Redis底层实现 ZSet
ZSet当有序集合中包含的元素数量超过服务器属性 zset_max_ziplist_entries 的值(默认值为 128 ),或者有序集合中新添加元素的 member 的长度大于服务器属性 zset_max_ziplist_value 的值(默认值为 64 )时,redis会使用跳跃表作为有序集合的底层实现。否则会使用ziplist作为有序集合的底层实现skiplist跳表跳表是可以实现二分查找的有序链表skiplist是一种以空间换取时间的结构。由于链表,无法进行二分查找
2022-03-28 16:37:03
1696
原创 13. Redis底层实现 List
List(1) ziplist压缩配置:list-compress-depth 0表示一个quicklist两端不被压缩的节点个数。这里的节点是指quicklist双向链表的节点,而不是指ziplist里面的数据项个数参数list-compress-depth的取值含义如下:0: 是个特殊值,表示都不压缩。这是Redis的默认值。1: 表示quicklist两端各有1个节点不压缩,中间的节点压缩。2: 表示quicklist两端各有2个节点不压缩,中间的节点压缩。3: 表示quicklist
2022-03-28 15:23:59
1346
原创 12. Redis底层实现 Hash
HASHconfig get hash*hash-max-ziplist-entries: 512(使用压缩列表保存时哈希集合中的最大元素个数。),hash-max-ziplist-value:64(使用压缩列表保存时哈希集合中单个元素的最大长度。key和value都包括)以上两个条件都满足时(小于等于),会使用OBJ_ENCODING_ZIPLIST来存储该键,前述条件任意一个不满足则会转换为 OBJ_ENCODING_HT的编码方式结论:哈希对象保存的键值对数量小于512个所有的
2022-03-28 14:31:24
1715
原创 11. Redis数据类型底层实现 String 底层实现
整体看https://mp.weixin.qq.com/s/7ct-mvSIaT3o4-tsMaKRWA不同数据结构在源码中的名称1.简单动态字符串sds.c2.整数集合intset.c3.压缩列表ziplist.c4.快速链表quicklist.c5.字典dict.c6.Streams的底层实现结构listpack.c和rax.c不同数据类型在源码中的名称Redis对象object.c字符串t_string.c列表t_list.c字典t_hash.c集合及有序集合t_set.c
2022-03-28 11:42:59
3193
原创 10.Redis的缓存过期淘汰策略
redis默认内存多少?maxmemory是bytes字节类型redis默认内存多少可以用?如果不设置最大内存大小或者设置最大内存大小为0,在64位操作系统下不限制内存大小,在32位操作系统下最多使用3GB,一般推荐Redis设置内存为最大物理内存的四分之三获取内存使用情况Redis数据删除策略立即删除:立即删除能保证内存中数据的最大新鲜度,因为它保证过期键值会在过期后马上被删除,其所占用的内存也会随之释放。但是立即删除对cpu是最不友好的。因为删除操作会占用cpu的时间,如果刚好
2022-03-24 15:11:23
122
原创 9. Redis分布式锁
使用场景:多个服务间保证同一时刻同一时间段内同一用户只能有一个请求(防止关键业务出现并发攻击)单机案例:加锁:加锁实际上就是在redis中,给Key键设置一个值,为避免死锁,并给定一个过期时间public static boolean tryLock(String key, String uniqueId, int seconds) { return "OK".equals(jedis.set(key, uniqueId, "NX", "EX", seconds));}解锁:将
2022-03-22 16:04:51
739
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人