RedisTemplate大量使用的callback机制(转)

假如要让你封装jedis以便让外界调用你大概率会像下面方法一样实现。

@Service
public class JedisSpringDemo {
    @Resource(name = "shardedJedisPool")
    private ShardedJedisPool shardedJedisPool;
    
    public String set(String key, String value){
        ShardedJedis shardedJedis = null;
        try{
            // 从连接池中获取jedis分片对象
            shardedJedis = shardedJedisPool.getResource();
            // 设置值到redis中
            return shardedJedis.set(key, value);
        }catch (Exception e){
            System.out.println(e.getMessage());
        }finally {
            if(null != shardedJedis){
                shardedJedis.close();
            }
        }
        return null;
    }

    public String get(String key){
        ShardedJedis shardedJedis = null;
        try{
            // 从连接池中获取jedis分片对象
            shardedJedis = shardedJedisPool.getResource();
            // 从redis中获取key对应value
            return shardedJedis.get(key);
        }catch (Exception e){
            System.out.println(e.getMessage());
        }finally {
            if(null != shardedJedis){
                shardedJedis.close();
            }
        }
        return null;
    }
}

上面的这段代码违反了DRY原则,两个方法get()和set()大部分代码是相同的(try,catch,finally这部分代码),唯一不同的就是我们return的那一行具体的调用方法,如果像这种方法很多的话(jedis提供了几十种类似的方法),我们的代码重复率是很高的,代码重复率一旦高起来,相应的维护成本也会提高,下面我们就来引进一种改进方法–回调机制。

Read More

hexo博客换新皮肤了!

很久没打理博客了,最近准备写些文章,结果clone下来发现hexo都不能正常install了,原因是node版本有些高,和3.x的hexo不兼容,那么,索性这次就把hexo版本升级到最新的6.x,然后给博客换一个新主题。

具体思路是,下载新版的hexo-cli,用hexo init初始化一个文件夹,然后挑选自己喜欢主题,clone到themes下,接着将旧的post文件夹下的文章全部搬过来,然后呢,就把博客在本地启动起来,左看看、右看看,哪里有不合适的就改改配置,或者改改主题的源码。

改的差不多了,还有最重要的一步,配置一下自动部署到GitHub Pages。上次是用的一个叫hexo-deployer-git的hexo插件,能够实现一键部署,原理就是本地生成好静态文件,直接上传,这次打算换一种方式,用一下GitHub的Actions,具体做法也很简单,在.github/workflows下建一个ci文件就行了,脚本官网上已经写好了。

Read More

什么时候该使用NoSQL.md

当SQL满足不了你的需求或者SQL 已经不是必须的或者最佳的选择时,就是你考虑这类NoSQL 的时候了。

当你的内存大于你的数据时,schema也不是太确定时,mongodb在这里静静地等待My SQL转业户;为了尝鲜过来看热闹的,不改变设计模式,爽在前面痛在后面;

当你唯一追求的就是速度,又对memcached的过于简单心存芥蒂,刚好内存也比数据多时,redis俏生生站在那里;

Read More

强软弱虚与ThreadLocal

Java中有四种引用类型:强引用、软引用、弱引用、虚引用。

Java为什么要设计这四种引用

  • 可以让程序员通过代码的方式来决定某个对象的生命周期;
  • 有利用垃圾回收

软引用

1
SoftReference<Student>studentSoftReference=new SoftReference<Student>(new Student());

当内存不足,会触发JVM的GC,如果GC后,内存还是不足,就会把软引用包裹的对象给干掉,也就是只有在内存不足,JVM才会回收该对象。

Read More

Spring事务五边形

ACID:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

事务五边形

  • 传播行为
  • 隔离级别
  • 是否只读
  • 事务超时时间
  • 回滚规则
1
2
3
4
5
6
7
// Spring事务核心接口
public interface TransactionDefinition {
int getPropagationBehavior(); // 返回事务的传播行为
int getIsolationLevel(); // 返回事务的隔离级别,事务管理器根据它来控制另外一个事务可以看到本事务内的哪些数据
int getTimeout(); // 返回事务必须在多少秒内完成
boolean isReadOnly(); // 事务是否只读,事务管理器能够根据这个返回值进行优化,确保事务是只读的
}

Read More