- 博客(23)
- 收藏
- 关注
原创 Synchronized底层以及锁升级机制
在对象头中的倒数第三bit 有个是否是偏向锁的标志位,如果是1,那么就去读Mark Word前23个bit,获取线程ID,通过线程ID来确认想要获得对象锁的线程是不是“偏向”的线程(有点像MVCC去获取up_limit_id 对比 transaction id的感觉了)然后线程就开始通过CAS去获取锁(自旋,默认10次吧好像是),一旦获得,将会复制这个对象的Mark Word到虚拟机栈的Lock Record中,并将之前的Owner指针指向该对象锁。如果这时候有其他线程来了,想获取这个对象的锁。
2023-03-08 20:20:59 127
原创 Java集合之Collection类之子类Set,List和Queue
5.内存空间占用:ArrayList 的空 间浪费主要体现在在 list 列表的结尾会预留一定的容量空间,而 LinkedList 的空间花费则体现在它的每一个元素都需要消耗比 ArrayList 更多的空间(因为要存放直接后继和直接前驱以及数据)。尾插法:对于尾插法而言,不是说ArrayList就一定比LinkedList效率高,经过大量的数据测试,发现10w以内LinkedList比ArrayList快,100w以上ArrayList明显比LinkedList快。HashSet:无序,唯一。
2023-03-05 21:17:22 243
原创 Redis五问(五)如何保证缓存和数据库数据一致性
然后B抢占到了资源 更新缓存的数据a = 2,此时线程A将数据更心动缓存 会产生a = 1的结果。让Redis订阅主数据库的binlog,这样即使从数据库没有即使同步到数据,线程B进来的读的时候也可以从Redis里读到A = 1。先把缓存删除了,那上面的例子,B进来想读缓存原来的数据发现没有,去数据库读到a = 2,此时线程A又将数据库数据改为a = 1。2.失效:程序从缓存中读取数据,如果没有命中,则从数据库读取,成功之后将数据放到缓存中。假如说更新数据库失败了,数据库要回滚,那缓存也要回滚吗?
2023-03-04 20:30:57 112
原创 Redis五问(四)性能优化
其中最主要的缺点就是它有一定的误判率,也就是说,当布隆过滤器判断一个元素不在集合中时,有一定的概率会出现误判,即认为该元素在集合中。当检查一个元素是否存在于集合中时,将该元素进行哈希处理,并查看对应的位是否被标记为 1,如果全部被标记为 1,则认为该元素可能存在于集合中,否则肯定不存在于集合中。此外,布隆过滤器的误判率非常低,也就是说,它的判断结果几乎总是正确的。将所有存在的key提前存入布隆过滤器,在访问缓存层之前,先通过过滤器拦截,若请求的是不存在的key,则直接返回空值。
2023-03-04 20:26:36 89
原创 Redis五问(二)内存管理
把最新访问过的数据放在表头,即最近访问的key在表头,最少访问的key在表尾。给每个key维护一个时间戳,淘汰时随机采样5个key,从中淘汰调最旧的key,如果还是超出内存限制,则继续随机采样淘汰。volatile-ttl:在设置了过期时间的key中,选择剩余寿命(TTL)最短的key将其淘汰。volatile-lru:在设置了过期时间的key中,选择最少使用的key将其淘汰。allkeys-lru:在所有的key中,选择最少使用的key,将其淘汰。2.删除这20个key中已过期的key。
2023-03-04 20:26:35 74
原创 Redis五问(一)常用数据结构
5种基础数据结构:String, List, Set, Hash, Zset三种特殊数据结构:HyperLogLogs(基数统计),Bitmap(位存储),Geospatial(地理位置)5种基础数据结构底层依赖以下8种,简单动态字符串(SDS)、LinkedList(双向链表)、Hash Table(哈希表)、SkipList(跳跃表)、Intset(整数集合)、ZipList(压缩列表)、QuickList(快速列表)StringListSetHashZsetSDSLinkedList/ZipList/
2023-03-04 20:24:14 51
原创 复习Redis数据结构以及常用场景
5种基础数据结构底层依赖以下8种,简单动态字符串(SDS)、LinkedList(双向链表)、Hash Table(哈希表)、SkipList(跳跃表)、Intset(整数集合)、ZipList(压缩列表)、QuickList(快速列表)Redis实现的List实际是个双向链表,可以支持反向查找和遍历,方便操作但是增加了额外的内存开销。
2023-03-04 17:23:28 32
原创 牛客社区复盘(六)——点赞,我收到的点赞
这里的eventProducer.fireEvent就是将事件发布到指定主题。这里的eventProducer.fireEvent就是将事件发布到指定主题。当然系统得通知你吧,系统通知用到kafka 也就是简单的生产者消费者模式。logger.error("消息内容为空!logger.error("消息格式错误!那么Controller层。查询某个用户获得的赞。
2023-03-02 10:30:00 88
原创 牛客社区复盘(五)——评论和评论的评论
这也是这个项目的难点。评论分三种,一种是帖子的评论,一种是评论的评论,剩下的就是第二种评论指向特定人的评论。三个字段含义是评论种类,指向的id,指向的人,只有第三种评论指向人才有含义。(这个地方涉及数据结构设计,评论应该需要什么属性即数据库需要什么字段来统一描述三种类型评论,第一个表示评论类型属于三种的哪一种,第二个表示属于谁的子评论,第三个表示第三种评论回复哪个用户,这样设计会比上面好一点点)查询评论,添加评论同时帖子评论数更新用到事务。Entity几个常量定义/**
2023-03-01 22:00:00 296
原创 牛客社区复盘(四)——斗嘴功能
// 若指针1处于根节点,将此符号计入结果,让指针2向下走一步。// 子节点(key是下级字符,value是下级节点)// 无论符号在开头或中间,指针3都向下走一步。// 以begin为开头的不是敏感词。过滤的内容,三个指针开始遍历,遇到敏感词替换为***// 指向子节点,进入下一轮循环。// @Param注解用于给参数取别名。// 关键词结束标识。然后发帖的controller层。// 转义HTML标记。
2023-03-01 20:30:00 100
原创 牛客社区复盘(三)——你得先登录吧
核心:验证用户名,密码,生成登录凭证表记录,发送cookie给用户端,默认一天过期,其实就是分布式session。logger.error("响应验证码失败:"+e.getMessage());model.addAttribute("codeMsg", "验证码不正确");map.put("usernameMsg", "该账号不存在");map.put("usernameMsg", "该账号未激活");map.put("passwordMsg", "密码不正确");// 将验证码存入Redis。
2023-03-01 20:00:00 67
原创 牛客社区复盘(二)——来点用户
核心内容:mysql用户表存放用户激活情况,用户激活码,md5加密的密码。注册时随机生成盐(UUID)并对密码进行MD5加密。后端和浏览器用cookie交互,或者设置path。当然,邮件功能得用到JavaMailSender这个类,到这就可以实现注册了。给注册邮箱发邮件,点击激活链接进行激活,
2023-03-01 19:45:00 51
原创 HashMap的key可以为null吗?
所以 当key==null的时候,key的hashcode = 0;不会抛出空指针异常(有区别与hashtable)。// 这里会报空指针异常,有区别于hash()//当key等于null的时候,不走hashCode()方法。在hashcode的源码里:提到将null的hashcode置为0。不允许key为空,为什么呢?以下是hashtable的put方法。jdk1.8中,HashMap的put函数是这样的。hash(key)就是求key的hashcode。
2023-02-23 13:57:27 3456
原创 Redis序列化转换类型报错
可以方便地处理JSON格式的数据,并且对于复杂的Java对象可以进行较好的序列化和反序列化。但是,它可能会在序列化过程中忽略一些Java对象中的字段,因此需要进行一些配置才能完全控制序列化过程。使用Redis的内置JSON序列化器,将Java对象序列化为JSON格式的字符串,并将其存储到Redis中。如果需要处理复杂的Java对象,并且对序列化和反序列化的精细控制比较关键,那么。在序列化过程中会将所有Java对象中的字段都序列化到Redis中,但在处理复杂Java对象时,可能需要进行一些额外的配置。
2023-02-20 17:32:53 1032
原创 为什么float或double运算的时候会有精度丢失的风险?
解决比较float精度丢失的两种方法为什么float或double运算的时候会有精度丢失的风险?
2023-02-15 20:42:11 749
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人