Skip to main content

Go select 学习

· 3 min read
ahKevinXy
作者

预览图 在 Go 语言内 select 是一个关键字,用于监听 和channel 有关的IO 操作

通过 select 语句,可以同时监听多个channel,并在其中任意一个channel 就绪时进行处理

Hash 冲突解决方法

· 2 min read
flankx
作者

Hash 冲突解决方法

  1. 开放定址法 这种方法也称再散列法,其基本思想是:当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…,直到找出一个不冲突的哈希地址pi ,将相应元素存入其中。这种方法有一个通用的再散列函数形式: Hi=(H(key)+di)% m   i=1,2,…,n

  2. 再哈希法 这种方法是同时构造多个不同的哈希函数: Hi=RH1(key)  i=1,2,…,k 当哈希地址Hi=RH1(key)发生冲突时,再计算Hi=RH2(key)……,直到冲突不再产生。这种方法不易产生聚集,但增加了计算时间

  3. 链地址法 这种方法的基本思想是将所有哈希地址为i的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第i个单元中,因而查找、插入和删除主要在同义词链中进行。链地址法适用于经常进行插入和删除的情况

  4. 建立公共溢出区 这种方法的基本思想是:将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表

Transactional 什么情况下会失效?

· One min read
flankx
作者
  • @Transactional 注解只有作用到 public 方法上事务才生效,不推荐在接口上使用;
  • 避免同一个类中调用 @Transactional 注解的方法,这样会导致事务失效;
  • 正确的设置 @Transactional 的 rollbackFor 和 propagation 属性,否则事务可能会回滚失败;
  • 被 @Transactional 注解的方法所在的类必须被 Spring 管理,否则不生效;
  • 底层使用的数据库必须支持事务机制,否则不生效;

如何保证 redis 缓存一致性?

· One min read
flankx
作者

方案一

采用延时双删策略

  • 基本思路: 在写库前后都进行删除缓存操作,并且设置合理的超时时间
  • 基本步骤: 先删除缓存–再写数据库—休眠一段时间—再次删除缓存 注:休眠的时间是根据自己的项目的读数据业务逻辑的耗时来确定的。这样做主要是为了保证在写请求之前确保读请求结束,写请求可以删除读请求造成的缓存脏数据。
  • 该方案的弊端: 集合双删策略+缓存超时策略设置,这样最差的结果就是在超时时间内数据存在不一致,又增加了写请求的耗时。

方案二

一步更新缓存(基于订阅Binlog的同步机制)

  • 基本思路: MySQL Binlog增强订阅消费 + 消息队列 + 增量数据更新到Redis

Redis数据结构

· One min read
flankx
作者

5种基础数据结构

  • String字符串
  • List列表
  • Set集合
  • Hash散列
  • Zset有序集合

3种特殊数据结构

  • HyperLogLogs基数统计
  • Bitmap位存储
  • Geospatial地理位置

Redis 淘汰机制

· 2 min read
flankx
作者

Redis提供6种数据淘汰策略

  1. volatile-lru(least recently used):从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
  2. volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
  3. volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
  4. allkeys-lru(least recently used):当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key(这个是最常用的)
  5. allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
  6. no-eviction:禁止驱逐数据,也就是说当内存不足以容纳新写入数据时,新写入操作会报错。这个应该没人使用吧! 4.0 版本后增加以下两种:
  7. volatile-lfu(least frequently used):从已设置过期时间的数据集(server.db[i].expires)中挑选最不经常使用的数据淘汰
  8. allkeys-lfu(least frequently used):当内存不足以容纳新写入数据时,在键空间中,移除最不经常使用的 key

Redis持久化机制

  1. RDB快照
  2. AOF只追加文件