redis数据结构
简单动态字符串SDSRedis中保存的key是字符串,value往往是字符串或者字符串的集合。可以说字符串是Redis中最常见的数据结构。
不过Redis中没有直接使用C语言中的字符串,而是构建了一种新的字符串结构,称为简单动态字符串(Simple Dynamic String)。
比如我们执行命令set name Jack,那么Redis将在底层创建两个SDS,其中一个是包含name的SDS,另一个是包含Jack的SDS。
Redis是C语言实现的,其中SDS是一个结构体,源码如下:
struct __attribute__((packed)) sdshdr8 { uint8_t len; // buf已保存的字符串字节数,不包含结束标示\0 uint8_t alloc; // buf申请的总字节数,不包含结束标示\0 unsigned char flags; // 不同的SDS的头类型,用来控制SDS头大小 char buf[];};
flag对应的种类有五五种
#define SDS_TYPE_5 0#define SDS_TYPE_ ...
redis分布式缓存
分布式缓存之前学的都是单点Redis,而这种单点Redis存在一些问题:
数据丢失
并发能力差
存储量小
故障恢复能力弱
我们可以使用Redis分布式缓存解决以上问题。
Redis持久化解决数据丢失问题RDB持久化RDB全称 Redis Database Backup file(Redis数据备份文件),也可以称为叫Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。快照文件称为RDB文件,默认是保存在当前运行目录。
RDB持久化的执行条件有save命令、bfsave命令、Redis手动停机、触发系统内置RDB条件时。
save命令使用redis-cli链接到redis中后使用save命令可以立刻执行一次RDB。save命令会导致主进程执行RDB,这个过程中其它所有命令都会被阻塞。只有在数据迁移时可能用到。
bgsave命令与save命令的执行步骤相同,但bgsave命令执行是异步的,执行后会开启独立进程完成RDB,主进程可以持续处理用户请求,不受影响。
停机主动停机时会自动执行一次RDB
Redis内置RDB ...
二分查找算法入门
二分查找可以有几种写法:
闭区间
开区间
半开半闭区间(左开右闭/左闭右开)
所谓开闭区间,指的是二分查找中的left和right的值,如果取值在数组内部(大部分情况下),就可以成为闭区间,反之为开区间。
展示这三种写法,我们从一道题目开始:
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
这道题就是纯粹的二分查找板子题,数组有序,数组中无重复元素。
这里使用Java进行展示,首先是闭区间写法。
class Solution { public int search(int[] nums, int target) { int n = nums.length; int l = 0, r = n - 1; while(l <= r){ int mid = l + (r - l >> 1); // 防止爆int ...
强化学习基础知识
记录一些强化学习基础名词解释,理解的不深
基本概念强化学习(Reinforcement Learning,RL)是一种机器学习方法,旨在通过与环境的交互来学习如何采取行动以最大化累积奖励。与监督学习不同,强化学习没有预先标注的输入输出对,而是通过试错和从反馈中学习
Agent:做出动作的角色,即智能体
state(状态):智能体当前所处的环境,包含环境当前的全部或部分信息,在玩游戏时,state就是当前的游戏画面,如果状态,动作,奖励等变量被观测到了,用s表示;没观测到就表示随机变量,用S表示
action(动作):智能体在每个时间步可以采取的操作
policy(决策):agent在当前做出的动作
policy function(策略函数):在某种state下,agent采取某种action的概率$\pi(s.a)$,函数值范围为[0,1]
Reward(奖励):是指采取动作后,环境给agent的奖励,它可能为正、负、0
state transition(状态转移):agent在某个状态采取某个动作后,可能发生的状态变化
强化学习是agent与环境互动的过程。我们观测到状态$s_t$, ...
pytorch基础入门
两个实用函数假如pytorch是一个大型工具箱,我们想查看工具箱中有什么工具,这时就可以使用dir()函数查看,如果我们想知道某一个工具是如何使用的,就可以使用help()函数查看
dir():可以查看指定对象包含的全部内容,包括变量、方法、函数和类等。不仅包含可供我们调用的模块成员,还包含所有名称以双下划线“__”开头和结尾的“特殊”命名的私有成员,这些成员是在本模块中使用的,不能在类的外部调用。
help():查看指定对象(类型、模块、变量、方法等)的详细使用说明
Pytorch在学习和使用pytorch时,要经常使用官方文档,里面有详细的使用说明
加载数据集加载数据方法及label形式Pytorch中加载数据需要Dataset、Dataloader
Dataset提供一种方式去获取每个数据及其对应的label和编号,以及总共有多少个数据
Dataloader为后面的网络提供不同的数据形式,可以将数据进行打包
label形式
文件夹名即为label。文件夹中存放若干条数据
一个文件夹存放数据,数据有编号,另一个文件夹存放数据对应编号的说明文本(txt),文本中有label ...
numpy常用api
NumPy,全称Numerical Python,是一个开源的Python库,它为Python提供了强大的多维数组对象和用于处理这些数组的函数。NumPy的核心是ndarray,它是一个高效的多维数组容器,用于存储和处理大规模的数据。NumPy还提供了许多数学函数,用于数组之间的操作,以及用于线性代数、傅立叶变换和随机数生成等功能。
基本使用创建数组ndarraynumpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
上面的构造器接受以下参数:
参数
描述
object
返回一个数组或任何(嵌套)序列
dtype
数组的所需数据类型,可选
copy
可选,默认为true,对象是否被复制
order
C(按行)、F(按列)或A(任意,默认)
subok
默认情况下,返回的数组被强制为基类数组。 如果为true,则返回子类
ndmin
指定返回数组的最小维数
示例import numpy as np a = np.array([1,2,3 ...
机器学习基础知识
机器学习是人工智能的重要技术基础,涉及的内容十分广泛。由于我是以发强化学习方向论文为导向,所以机器学习部分知识点不做深入学习,了解为主,本文主要涵盖机器学习入门的基础知识。
机器学习的核心元素:数据、模型、算法
机器学习工作流程一般为数据预处理(Processing)、模型学习(Learning)、模型评估(Evaluation)、新样本预测(Prediction)几个步骤
数据预处理:输入(未处理的数据 + 标签)-> 处理过程 ->(特征处理+幅度缩放、特征选择、维度约减、采样)-> 输出(测试集 + 训练集)
模型学习:模型选择、交叉验证、结果评估、超参选择。
模型评估:了解模型对于数据集测试的得分。
新样本预测:预测测试集
基本名词示例/样本:一条数据集中的一条数据
属性/特征:判断样本好坏的根据,如「色泽」「根蒂」
属性空间/样本空间/输入空间X:由全部属性张成的空间
特征向量:空间中每个点对应的一个坐标向量
标记:关于示例结果的信息,如((色泽=青绿,根蒂=蜷缩,敲声=浊响),好瓜),其 ...
MySQL运维篇
MySQL日志错误日志错误日志记录了当mysqld启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,应当首先查看此日志
该日志默认开启,默认存放目录/var/log/,默认的日志文件名为mysqld.log,查看日志位置:
show variables like '%log_error%';
二进制日志二进制日志(BINLOG)记录了所有的 DDL和 DML语句,不包括数据查询(SELECT、SHOW)语句
作用:
灾难时的数据恢复
MySQL的主从复制
在MySQL8中,默认二进制日志是开启的,查看日志参数:
show variables like '%log_bin%';
参数说明:
log_bin_basename:当前数据库服务器的binlog日志的基础名称(前缀),具体的binlog文件名需要在该basename的基础上加上编号(编号从000001开始)
log_bin_index:binlog的索引文件,记录了当前服务器关联的binlog文件有哪些
格式
日志格式 ...
ElasticSearch基础入门(二)
DSL语句DSL(Domain Specific Language),中文翻译为特定领域语言,在这里代表ES中的查询语言。
Elasticsearch的查询可以分为两大类:
叶子查询(Leaf query clauses):一般是在特定的字段里查询特定值,属于简单查询,很少单独使用。
复合查询(Compound query clauses):以逻辑方式组合多个叶子查询或者更改叶子查询的行为方式。
快速入门语法结构:
GET /索引库名/_search{ "query": { "查询类型": { // .. 查询条件 } }}
GET /索引库名/_search:其中的_search是固定路径,不能修改
以最简单的无条件查询为例,无条件查询的类型是:match_all,因此其查询语句如下:
GET /items/_search{ "query": { "match_all": { ...
SpringCloud微服务入门(二)
在微服务远程调用的过程中,还存在几个问题需要解决。
首先是业务健壮性问题:
例如在之前的查询购物车列表业务中,购物车服务需要查询最新的商品信息,与购物车数据做对比,提醒用户。大家设想一下,如果商品服务查询时发生故障,查询购物车列表在调用商品服 务时,是不是也会异常?从而导致购物车查询失败。但从业务角度来说,为了提升用户体验,即便是商品查询失败,购物车列表也应该正确展示出来,哪怕是不包含最新的商品信息。
还有级联失败问题:
还是查询购物车的业务,假如商品服务业务并发较高,占用过多Tomcat连接。可能会导致商品服务的所有接口响应时间增加,延迟变高,甚至是长时间阻塞直至查询失败。
此时查询购物车业务需要查询并等待商品查询结果,从而导致查询购物车列表业务的响应时间也变长,甚至也阻塞直至无法访问。而此时如果查询购物车的请求较多,可能导致购物车服务的Tomcat连接占用较多,所有接口的响应时间都会增加,整个服务性能很差, 甚至不可用。
暂时无法在飞书文档外展示此内容
依次类推,整个微服务群中与购物车服务、商品服务等有调用关系的服务可能都会出现问题,最终导致整个集群不可用。
暂时无法在飞书文档外展 ...