看完这一篇后我同事说我写代码像写诗(二)

        前几天空闲时间写了一遍关于平时自己写代码的一些习惯分享了出来,这种文章大家好像挺感兴趣的,还冲到了热榜第三,今天再分享一点哈哈哈

 

目录

线程池

大量数据同步

接口入参

锁的颗粒度

缓存名称

@Cacheable

异步任务


统一管理线程池

        有的会在用到多线程的地方就创建一个线程池,为了统一管理,建议建立一个线程池,统一管理,统一设置非核心线程数,拒绝策略等等

private static volatile ThreadPoolExecutor threadPoolExecutor = null;

    private static final int CORE_POOL_SIZE = 0;
    private static final int MAX_MUM_POOL_SIZE = 1000;
    private static final long KEEP_ALIVE_TIME = 2;
    private static final TimeUnit UNIT = TimeUnit.MINUTES;
    private static final int CAPACITY = 1;
    private static final RejectedExecutionHandler HANDLER = new ThreadPoolExecutor.CallerRunsPolicy();

    private static final BasicThreadFactory factory =
            new BasicThreadFactory.Builder().namingPattern("aiserviceplatform-util-thread-pool-%d").build();

    private ThreadPoolFactory() {
    }

    public static ThreadPoolExecutor getInstance() {
        if (threadPoolExecutor == null) {
            synchronized (ThreadPoolFactory.class) {
                if (threadPoolExecutor == null) {
                    threadPoolExecutor = new ThreadPoolExecutor(CORE_POOL_SIZE, MAX_MUM_POOL_SIZE, KEEP_ALIVE_TIME, UNIT, new ArrayBlockingQueue<>(CAPACITY), factory, HANDLER);
                }
            }
        }
        return threadPoolExecutor;
    }

 大量数据同步

        在同步大数据量的信息时,(常用多线程方式:如果表里有唯一索引或者对表进行update操作那么就会经常锁表),优先考虑添加临时表的方式

String realTabelName = ....;
String tempTableName = realTableName + "_temp";

createTable(tempTableName); // 创建临时表
boolean flag = sync(tempTableName); // 同步数据

// 根据结果
if(flag) {
    dropTable(realTabelName);
    alterTabelName(realTableName, tempTableName); // 临时表改名 实际表
}else {
    // 同步失败 删除临时表
    dropTabel(tempTableName)
}

        实测:比对一张表做处理会快很多而且不会出问题

接口入参

定义接口的方法时,如接受一个集合类型,尽可能的用Collection<T>,因为其他业务场景可能会穿一个list有的会传一个hashSet,用起来还要改,Map也是。

正栗

Collection<String> getNodeIds(Collection<String> ids);

锁的颗粒度

       同步方法直接在方法上加synchronized实现加锁,同步代码块则在方法内部加锁,很明显,同步方法锁的范围比较大,而同步代码块范围要小点,一般同步的范围越大,性能就越差,一般需要加锁进行同步的时候,肯定是范围越小越好,这样性能更好

        我一般使用lock:ReentrantLock, ReentrantReadWriteLock,减少锁的颗粒度,提高系统的并发能力。

缓存名称

简短,精练,以文件夹形式保存

xxx:xxx:xxx,以:隔开

 方便查看缓存信息

@Cacheable

 使用Cacheable做缓存时,也要加上缓存失效时间。

之前提出疑问怎么有的缓存没有失效时间,看代码使用Cacheable缓存的,不会添加就没加(???)。

@Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        return new RedisCacheManager(
                RedisCacheWriter.lockingRedisCacheWriter(factory),
                this.getRedisCacheConfigurationWithTtl(1),
                this.getRedisCacheConfigurationMap()
        );
    }

    private RedisCacheConfiguration getRedisCacheConfigurationWithTtl(Integer hour) {
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        return RedisCacheConfiguration.defaultCacheConfig().serializeValuesWith(
                RedisSerializationContext
                        .SerializationPair
                        .fromSerializer(jackson2JsonRedisSerializer)).entryTtl(Duration.ofHours(hour));
    }

    public static final String REGION_LIST_BY_CODE_CACHE_KEY = "region:list";
    public static final String REGION_NAME_BY_CODE_CACHE_KEY = "region:name";

    /**
     * 已知缓存名称的映射以及用于这些缓存的配置
     */
    private Map<String, RedisCacheConfiguration> getRedisCacheConfigurationMap() {
        Map<String, RedisCacheConfiguration> redisCacheConfigurationMap = new HashMap<>();
        // 自定义缓存名称对应的配置
        redisCacheConfigurationMap.put(REGION_LIST_BY_CODE_CACHE_KEY, this.getRedisCacheConfigurationWithTtl(24));
        redisCacheConfigurationMap.put(REGION_NAME_BY_CODE_CACHE_KEY, this.getRedisCacheConfigurationWithTtl(120));
        redisCacheConfigurationMap.put(RedisKey.MARK_SERVICE_RENEW, this.getRedisCacheConfigurationWithTtl(-1));
        redisCacheConfigurationMap.put(RedisKey.MARK_ORGAN_RENEW, this.getRedisCacheConfigurationWithTtl(-1));
        redisCacheConfigurationMap.put(RedisKey.MARK_SERVICE_STREAM, this.getRedisCacheConfigurationWithTtl(-1));
        redisCacheConfigurationMap.put(RedisKey.MARK_ORGAN_STREAM, this.getRedisCacheConfigurationWithTtl(-1));
        return redisCacheConfigurationMap;
    }

异步任务

 为了提高接口的响应速度,我们会把比较耗时的操作异步处理。

例如异步任务,消息队列等。

好了,你们有想知道哪一块儿的可以留言(一时半会不知道该写点啥。。)

嗯。就到这吧。

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 这是一段AI自动写诗代码:from random import choice# 定义一个列表,用于存放诗句 poem_list = []# 定义一个函数,用于从poem_list中随机选择一个诗句 def choose_poem(): return choice(poem_list)# 将所有诗句放入列表 poem_list.append('春风十里,不如你') poem_list.append('繁花似锦,惹人醉') poem_list.append('烟笼寒水月笼沙') poem_list.append('梦回山林,相思空山')# 打印出随机选择的诗句 print(choose_poem()) ### 回答2: AI自动写诗代码可以基于深度学习算法,如循环神经网络(RNN)或变换器模型(Transformer)进行构建。下面是一个简单的示例代码,用于生成五言绝句: ```python import tensorflow as tf import numpy as np # 定义训练数据 poems = ['白日依山尽', '黄河入海流', '欲穷千里目', '更上一层楼'] # 构建字典 word2idx = {word: idx for idx, word in enumerate(np.unique(''.join(poems)))} idx2word = {idx: word for word, idx in word2idx.items()} vocab_size = len(word2idx) # 构建训练数据 train_data = [] for poem in poems: train_data.append([word2idx[word] for word in poem]) # 定义模型参数 embedding_dim = 100 hidden_units = 128 # 定义模型 model = tf.keras.Sequential([ tf.keras.layers.Embedding(vocab_size, embedding_dim, input_length=5), tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(hidden_units, return_sequences=True)), tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(hidden_units)), tf.keras.layers.Dense(vocab_size, activation='softmax') ]) # 编译模型 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy') # 训练模型 model.fit(np.array(train_data), np.array(train_data), epochs=100) # 生成诗句 start_words = '白日依山尽' generated_poem = start_words for i in range(5): input_seq = [word2idx[word] for word in generated_poem[-4:]] input_seq = np.expand_dims(input_seq, axis=0) output_probs = model.predict(input_seq)[0] # 预测下一个字的概率分布 predicted_idx = np.random.choice(range(vocab_size), p=output_probs) # 根据概率选择一个字 predicted_word = idx2word[predicted_idx] # 转换成字 generated_poem += predicted_word print(generated_poem) ``` 上述代码是一个简单的AI自动写诗的实现,使用了双向LSTM作为模型的核心结构,通过训练输入输出一致的模型以成自动写诗的任务。对于更复杂的模型和更大规模的语料库,可以进一步进行改进和调优。 ### 回答3: AI自动写诗是一个基于人工智能技术的应用,可以通过对大量的诗歌文本进行学习,生成新的诗歌作品。下面是一个简单的例子,展示了一个基于深度学习的AI自动写诗代码。 首先,我们需要准备一个包含大量诗歌文本的数据集,可以是从网络上爬取的或者是已有的诗歌数据库。接下来,我们使用Python语言和深度学习库TensorFlow来建立一个循环神经网络(RNN)模型。 ```python import tensorflow as tf # 设定参数 num_epochs = 100 # 训练轮数 num_steps = 30 # 输入序列的长度 batch_size = 32 # 每批次的大小 hidden_size = 128 # 隐藏层神经元数量 num_layers = 2 # RNN的层数 # 加载数据集,预处理数据 # 建立RNN模型 def build_model(vocab_size, hidden_size, num_layers): model = tf.keras.Sequential([ tf.keras.layers.Embedding(vocab_size, hidden_size), tf.keras.layers.GRU(hidden_size, return_sequences=True), tf.keras.layers.GRU(hidden_size, return_sequences=True), tf.keras.layers.Dense(vocab_size) ]) return model # 训练模型 def train(model, dataset, num_epochs): optimizer = tf.keras.optimizers.Adam() loss_metric = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True) for epoch in range(num_epochs): for batch_inputs, batch_labels in dataset: with tf.GradientTape() as tape: logits = model(batch_inputs) loss_value = loss_metric(batch_labels, logits) grads = tape.gradient(loss_value, model.trainable_variables) optimizer.apply_gradients(zip(grads, model.trainable_variables)) return model # 生成新的诗歌 def generate_poem(model, start_string, num_generate): input_eval = [char_to_id[s] for s in start_string] input_eval = tf.expand_dims(input_eval, 0) generated_poem = [] model.reset_states() for _ in range(num_generate): predictions = model(input_eval) predictions = tf.squeeze(predictions, 0) predicted_id = tf.random.categorical(predictions, num_samples=1)[-1, 0].numpy() input_eval = tf.expand_dims([predicted_id], 0) generated_poem.append(id_to_char[predicted_id]) return start_string + ''.join(generated_poem) # 加载数据集并预处理 # 建立词典 # 转换数据集为TensorFlow Dataset # 建立模型 model = build_model(vocab_size, hidden_size, num_layers) # 训练模型 trained_model = train(model, dataset, num_epochs) # 生成新的诗歌 start_string = '春风' num_generate = 30 poem = generate_poem(trained_model, start_string, num_generate) print(poem) ``` 以上代码是一个简单的AI自动写诗的示例,实际上,构建一个高质量的AI自动写诗系统需要更复杂的模型和更多的训练数据。此外,还需要进一步的参数调优和模型改进,以获得更好的诗歌生成效果。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值