今日总结

  • java随笔录——redis过期策略和删除策略
  • AI随探录——构建训练集
  • 代码随想录——回溯—组合总和

目录

今日总结

详细内容

java随笔录

Redis缓存

1、Redis缓存—数据过期策略(假如redis的key过期之后,会立即删除吗)

2、Redis缓存—数据淘汰策略(假如redis的内存不够用时,此时向reids添加新的key,那么内存的数据删除策略是什么样子的)

AI随探录

代码随想录

回溯—组合总和


详细内容

java随笔录

Redis缓存

1、Redis缓存—数据过期策略(假如redis的key过期之后,会立即删除吗)

答:Redis对数据设置数据的有效时间,数据过期以后,就需要将数据从内存中删除掉。可以按照不同的规则进行删除,这种删除规则就被称之为数据的删除策略(数据过期策略)。

        1、惰性删除

设置该key过期时间后,我们不去管它,当需要该key时,我们在检查其是否过期,如果过期,我们就删掉它,反之返回该key
优点:对CPU友好,只会在使用该key时才会进行过期检查,对于很多用不到的key不用浪费时间进行过期检查
缺点:对内存不友好,如果一个key已经过期,但是一直没有使用,那么该key就会一直存在内存中,内存永远不会释放

        2、定期删除

每隔一段时间,我们就对一些key进行检查,删除里面过期的key(从一定数量的数据库中取出一定数量的随机key进行检查,并删除其中的过期key)。
优点:可以通过限制删除操作执行的时长和频率来减少删除操作对CPU的影响。另外定期删除,也能有效释放过期键占用的内存。
缺点:难以确定删除操作执行的时长和频率。
Reids的过期删除策略:惰性删除+定期删除 两种策略进行配合使用

2、Redis缓存—数据淘汰策略(假如redis的内存不够用时,此时向reids添加新的key,那么内存的数据删除策略是什么样子的)

答:以下八种策略。
使用建议:
1.优先使用allkeys-Iru策略。充分利用LRU算法的优势,把最近最常访问的数据留在缓存中。如果业务有明显的冷热数据区分,建议使用。
2.如果业务中数据访问频率差别不大,没有明显冷热数据区分,建议使用allkeys-random,随机选择淘汰。
3.如果业务中有置顶的需求,可以使用volatile-Iru策略,同时置顶数据不设置过期时间,这些数据就一直不被删除,会淘汰其他设置过期时间的数据。
4.如果业务中有短时高频访问的数据,可以使用allkeys-lfu或volatile-Ifu策略。

AI随探录

import jieba
import pandas as pd
from gensim.models.fasttext_inner import word2_index
from sklearn.model_selection import train_test_split
from sympy.codegen.fnodes import cmplx
from tqdm import tqdm

import config

def process():
    print("开始处理数据")
    #读取文件
    df = pd.read_json(config.RAW_DATA_DIR / "synthesized_.jsonl", lines=True,orient='records').sample(frac=0.1)

    # 提取句子
    sentences = []
    for dialog in df['dialog']:
        for sentence in dialog:
            sentences.append(sentence.split(':')[1])
    print(f'句子总数:{len(sentences)}')


    #划分数据集
    train_sentences, test_sentences = train_test_split(sentences,test_size=0.2)

    #构建词表
    vocab_set = set()
    for sentence in tqdm(train_sentences,desc="构建词表"):
        vocab_set.update(jieba.lcut(sentence))

    vocab_list = ['<unk>'] + list(vocab_set)
    print(f'词表大小:{len(vocab_list)}')

    #保存词表
    with open(config.MODELS_DIR / 'vocab.txt', 'w' , encoding='utf-8') as f:
        f.write('\n'.join(vocab_list))

    #构建训练集
    word2_index = {word: index for index, word in enumerate(vocab_list)}
    index_train_sentences =  [[word2_index.get(token,0 ) for token in jieba.lcut(sentence)] for sentence in train_sentences]

    print("数据处理完成")

if __name__ == '__main__':
    process()

代码随想录

回溯—组合总和

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。

candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。 

对于给定的输入,保证和为 target 的不同组合数少于 150 个。

示例 1:

输入:candidates = [2,3,6,7], target = 7
输出:[[2,2,3],[7]]
解释:
2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。
7 也是一个候选, 7 = 7 。
仅有这两种组合。

示例 2:

输入: candidates = [2,3,5], target = 8
输出: [[2,2,2,2],[2,3,3],[3,5]]

示例 3:

输入: candidates = [2], target = 1
输出: []

提示:

  • 1 <= candidates.length <= 30
  • 2 <= candidates[i] <= 40
  • candidates 的所有元素 互不相同
  • 1 <= target <= 40
class Solution {
    List<List<Integer>> result = new ArrayList<>();
    List<Integer> input = new LinkedList<>();
    private void back(int[] candidates, int target, int indexstart, int sum) {
        if(sum > target) {
            return;
        }
        if(sum == target) {
            result.add(new ArrayList<>(input));
            return;
        }
        for(int i = indexstart; i < candidates.length; i++) {
            if (sum + candidates[i] > target) break;
            input.add(candidates[i]);
            sum += candidates[i];
            back(candidates,target,i,sum);
            sum -= candidates[i];
            input.removeLast();
            }
        }
    
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        int sum=0;
        Arrays.sort(candidates);
        back(candidates,target,0,sum);
        return result;
    }
}

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐