1.cd /etc/mysql/
sudo vim mysql.conf.d 2 3.Move to mysqld.cnf and enter;
4.add the follow clause and add its max_allowed_packet value to 1000M
max_allowed_packet=1000M 5.Save and quit
6.Restart mysql
sudo service mysql restart 7.login in mysql again
sudo mysql -u root -p 8.show databases;use myDB;show tables;
Through above steps we had ajust the max_allowed_packet to 1000M so that we can insert to table in bulk within big data capacity.
对 value 操作的命令 • exists(key):确认一个 key 是否存在 • del(key):删除一个 key • type(key):返回值的类型 • keys(pattern):返回满足给定 pattern 的所有 key • randomkey:随机返回 key 空间的一个 key • rename(oldname, newname):将 key 由 oldname 重命名为 newname,若newname 存在则删除 newname 表示的 key • dbsize:返回当前数据库中 key 的数目 • expire:设定一个 key 的活动时间(s) • ttl:获得一个 key 的活动时间 • select(index):按索引查询 • move(key, dbindex):将当前数据库中的 key 转移到有 dbindex 索引的数据库 • flushdb:删除当前选择数据库中的所有 key • flushall:删除所有数据库中的所有 key 对 String 操作的命令 • set(key, value):给数据库中名称为 key 的 string 赋予值 value • get(key):返回数据库中名称为 key 的 string 的 value • getset(key, value):给名称为 key 的 string 赋予上一次的 value • mget(key1, key2,…, key N):返回库中多个 string(它们的名称为 key1,key2…)的 value • setnx(key, value):如果不存在名称为 key 的 string,则向库中添加string,名称为 key,值为 value • setex(key, time, value):向库中添加 string(名称为 key,值为 value)同时,设定过期时间 time • mset(key1, value1, key2, value2,…key N, value N):同时给多个string 赋值,名称为 key i 的 string 赋值 value i • msetnx(key1, value1, key2, value2,…key N, value N):如果所有名称为 key i 的 string 都不存在,则向库中添加 string,名称 key i 赋值为 value i • incr(key):名称为 key 的 string 增 1 操作 • incrby(key, integer):名称为 key 的 string 增加 integer • decr(key):名称为 key 的 string 减 1 操作 • decrby(key, integer):名称为 key 的 string 减少 integer • append(key, value):名称为 key 的 string 的值附加 value • substr(key, start, end):返回名称为 key 的 string 的 value 的子串 对 List 操作的命令 • rpush(key, value):在名称为 key 的 list 尾添加一个值为 value 的元素 • lpush(key, value):在名称为 key 的 list 头添加一个值为 value 的 元素 • llen(key):返回名称为 key 的 list 的长度 • lrange(key, start, end):返回名称为 key 的 list 中 start 至 end 之间的元素(下标从 0 开始,下同) • ltrim(key, start, end):截取名称为 key 的 list,保留 start 至 end之间的元素 • lindex(key, index):返回名称为 key 的 list 中 index 位置的元素 • lset(key, index, value):给名称为 key 的 list 中 index 位置的元素赋值为 value • lrem(key, count, value):删除 count 个名称为 key 的 list 中值为 value的元素。count 为 0,删除所有值为 value 的元素,count>0 从 头至尾删除 count 个值为 value 的元素,count<0 从尾到头删除|count|个值为value 的元素。 lpop(key):返回并删除名称为 key 的 list 中的首元素 • rpop(key):返回并删除名称为 key 的 list 中的尾元素 blpop(key1,key2,… key N, timeout):lpop 命令的 block 版本。即当 timeout 为 0时,若遇到名称为 key i 的 list 不存在或该 list 为空,则命令结束。如果 timeout>0,则遇到上述情况时,等待 timeout 秒,如果问题没有解决,则对 keyi+1 开始的 list 执行 pop 操作。 • brpop(key1, key2,… key N, timeout):rpop 的 block 版本。参考上一命令。 • rpoplpush(srckey, dstkey):返回并删除名称为 srckey 的 list 的尾元素,并将该元素添加到名称为 dstkey 的 list 的头部 对 Set 操作的命令(了解) • sadd(key, member):向名称为 key 的 set 中添加元素 member • srem(key, member) :删除名称为 key 的 set 中的元素 member • spop(key) :随机返回并删除名称为 key 的 set 中一个元素 • smove(srckey, dstkey, member) :将 member 元素从名称为 srckey 的集合移到名称为 dstkey 的集合 • scard(key) :返回名称为 key 的 set 的基数 • sismember(key, member) :测试 member 是否是名称为 key 的 set 的元素 • sinter(key1, key2,…key N) :求交集 • sinterstore(dstkey, key1, key2,…key N) :求交集并将交集保存到 dstkey 的集合 • sunion(key1, key2,…key N) :求并集 • sunionstore(dstkey, key1, key2,…key N) :求并集并将并集保存到 dstkey 的集合 • sdiff(key1, key2,…key N) :求差集 • sdiffstore(dstkey, key1, key2,…key N) :求差集并将差集保存到 dstkey 的集合 • smembers(key) :返回名称为 key 的 set 的所有元素 • srandmember(key) :随机返回名称为 key 的 set 的一个元素 对 zset(sorted set)操作的命令 • zadd(key, score, member):向名称为 key 的 zset 中添加元素 member,score 用于排序。如果该元素已经存在,则根据 score 更新该元素的顺序。 • zrem(key, member) :删除名称为 key 的 zset 中的元素 member • zincrby(key, increment, member) :如果在名称为 key 的 zset 中已经存在元素 member,则该元素的 score 增加 increment;否则向集合中添加该元素,其 score 的值为 increment • zrank(key, member) :返回名称为 key 的 zset(元素已按 score 从小到大排序)中 member 元素的 rank(即 index,从 0 开始),若没有 member元素,返回“nil” • zrevrank(key, member) :返回名称为 key 的 zset(元素已按 score 从大到小排序)中 member 元素的 rank(即 index,从 0 开始),若没有 member元素,返回“nil” • zrange(key, start, end):返回名称为 key 的 zset(元素已按 score 从小到大排序)中的 index 从 start 到 end 的所有元素 • zrevrange(key, start, end):返回名称为 key 的 zset(元素已按 score从大到小排序)中的 index 从 start 到 end 的所有元素 • zrangebyscore(key, min, max):返回名称为 key 的 zset 中 score >= min且 score <= max 的所有元素 zcard(key):返回名称为 key 的 zset 的基数 zscore(key, element):返回名称为 key 的 zset 中元素 element 的score zremrangebyrank(key, min, max):删除名称为 key 的 zset 中rank >= min 且 rank <= max 的所有元素 zremrangebyscore(key, min,max) :删除名称为 key 的 zset 中 score >= min 且 score <= max 的所有元素• zunionstore / zinterstore(dstkeyN, key1,…,keyN, WEIGHTS w1,…wN,AGGREGATE SUM|MIN|MAX):对 N 个 zset 求并集和交集,并将最后的集合保存在 dstkeyN 中。对于集合中每一个元素的 score,在进行 AGGREGATE运算前,都要乘以对于的 WEIGHT 参数。如果没有提供 WEIGHT,默认为 1。默认的 AGGREGATE 是 SUM,即结果集合中元素 的 score 是所有集合对应元素进行 SUM 运算的值,而 MIN 和 MAX 是指,结果集合中元素的 score是所有集合对应元素中最小值和最大值。 对 Hash 操作的命令 • hset(key, field, value):向名称为 key 的 hash 中添加元素 field<—>value • hget(key, field):返回名称为 key 的 hash 中 field 对应的 value • hmget(key, field1, …,field N):返回名称为 key 的 hash 中 field i 对应的 value • hmset(key, field1, value1,…,field N, value N):向名称为 key 的 hash 中添加元素 field i<—>value i • hincrby(key, field, integer):将名称为 key 的 hash 中 field 的 value 增加 integer • hexists(key, field):名称为 key 的 hash 中是否存在键为 field 的域 • hdel(key, field):删除名称为 key 的 hash 中键为 field 的域 • hlen(key):返回名称为 key 的 hash 中元素个数 • hkeys(key):返回名称为 key 的 hash 中所有键 • hvals(key):返回名称为 key 的 hash 中所有键对应的 value • hgetall(key):返回名称为 key 的 hash 中所有的键(field)及其对应的 value 持久化 • save:将数据同步保存到磁盘 • bgsave:将数据异步保存到磁盘 • lastsave:返回上次成功将数据保存到磁盘的 Unix 时戳 • shundown:将数据同步保存到磁盘,然后关闭服务 远程服务控制 • info:提供服务器的信息和统计 • monitor:实时转储收到的请求 • slaveof:改变复制策略设置 • config:在运行时配置 Redis 服务器
目录一、应用程序日志的概述二、日志的作用三、记录日记的时机四、日志打印最佳实践1、日志变量定义2、参数占位符格式3、日志的基本格式4、日志文件5、日志配置6、日志使用规范
日志:记录程序的运行轨迹,方便查找关键信息,也方便快速定位解决问题。
一、应用程序日志的概述 通常,Java程序员在开发项目时都是依赖Eclipse/IDEA等集成开发工具的Debug 调试功能来跟踪解决Bug,但项目发布到了测试、生产环境怎么办?你有可能会说可以使用远程调试,但实际并不能允许让你这么做。
所以,日志的作用就是在测试、生产环境没有 Debug 调试工具时开发和测试人员定位问题的手段。日志打得好,就能根据日志的轨迹快速定位并解决线上问题,反之,日志输出不好,不仅无法辅助定位问题反而可能会影响到程序的运行性能和稳定性。
很多介绍 AOP 的地方都采用日志来作为介绍,实际上日志要采用切面的话是极其不科学的!对于日志来说,只是在方法开始、结束、异常时输出一些什么,那是绝对不够的,这样的日志对于日志分析没有任何意义。
如果在方法的开始和结束整个日志,那方法中呢?如果方法中没有日志的话,那就完全失去了日志的意义!如果应用出现问题要查找由什么原因造成的,也没有什么作用。这样的日志还不如不用!
二、日志的作用 不管是使用何种编程语言,日志输出几乎无处不再。总结起来,日志大致有以下几种用途:
「问题追踪」:辅助排查和定位线上问题,优化程序运行性能。 「状态监控」:通过日志分析,可以监控系统的运行状态。 「安全审计」:审计主要体现在安全上,可以发现非授权的操作。 三、记录日记的时机 在看线上日志的时候,我们可曾陷入到日志泥潭?该出现的日志没有,无用的日志一大堆,或者需要的信息分散在各个角落,特别是遇到紧急的在线bug时,有效的日志被大量无意义的日志信息淹没,焦急且无奈地浪费大量精力查询日志。那什么是记录日志的合适时机呢?
总结几个需要写日志的点:
「编程语言提示异常」:如今各类主流的编程语言都包括异常机制,业务相关的流行框架有完整的异常模块。这类捕获的异常是系统告知开发人员需要加以关注的,是质量非常高的报错。应当适当记录日志,根据实际结合业务的情况使用warn或者error级别。 「业务流程预期不符」:除开平台以及编程语言异常之外,项目代码中结果与期望不符时也是日志场景之一,简单来说所有流程分支都可以加入考虑。取决于开发人员判断能否容忍情形发生。常见的合适场景包括外部参数不正确,数据处理问题导致返回码不在合理范围内等等。 「系统核心角色,组件关键动作」:系统中核心角色触发的业务动作是需要多加关注的,是衡量系统正常运行的重要指标,建议记录INFO级别日志,比如电商系统用户从登录到下单的整个流程;微服务各服务节点交互;核心数据表增删改;核心组件运行等等,如果日志频度高或者打印量特别大,可以提炼关键点INFO记录,其余酌情考虑DEBUG级别。 「系统初始化」:系统或者服务的启动参数。核心模块或者组件初始化过程中往往依赖一些关键配置,根据参数不同会提供不一样的服务。务必在这里记录INFO日志,打印出参数以及启动完成态服务表述。 四、日志打印最佳实践 1、日志变量定义 日志变量往往不变,最好定义成final static,变量名用大写。
private static final Logger log = LoggerFactory.getLogger({SimpleClassName}.getClass()); 通常一个类只有一个 log 对象,如果有父类可以将 log 定义在父类中。
日志变量类型定义为门面接口(如 slf4j 的 Logger),实现类可以是 Log4j、Logback 等日志实现框架,不要把实现类定义为变量类型,否则日志切换不方便,也不符合抽象编程思想。
另外,推荐引入lombok的依赖,在类的头部加上@Slf4j的注解,之后便可以在程序的任意位置使用log变量打印日志信息了,使用起来更加简洁一点,在重构代码尤其是修改类名的时候无需改动原有代码。
2、参数占位符格式 使用参数化形式{}占位,[]进行参数隔离
String username = linhuaming; String password = 123456; log.
面向对象编程 这一章所有的东西都是围绕一个概念开展的第一个叫类,第二个叫对象,第三个叫面向对象编程三大基本特征.
更细一点的话可以是一个概念 “对象” 类的概念是由对象 引出来的,面向对象的三大特征的概念是由对象引出来的, Oriewted Object(定位对象)
通过对象来
封装数据,组织代码
面向对象编程初步
OOP:Object Oriented Programming
区别
面向过程:
事物比较简单,可以用线性的思维去解决
面向对象:
事物比较复杂,使用简单的线性思维无法解决
共同点:
面向过程和面向对象都是解决实际问题的一种思维方式 二者相辅相成,并不是对立的.
解决复杂问题,通过面向对象方式便于我们从宏观上把握事物之间复杂的关系,方便我们分析整个系统,具体到微观操作,仍然使用面向过程方式来处理.
物以类聚
面向对象编程初步
(OOP:Object Oriented Programming)
如何开汽车(事物比较简单,可以用线性的思维去解决)
--面向过程:
踩离合2.挂挡3.踩油门,放离合4.开了 --向对象:
驾驶员 汽车 驾驶员开汽车 car.start(); 有了面向对象仍然需要面向过程 如何造汽车(事物比较复杂,使用简单的线性思维无法解决)
面向过程:
造车轮2.造发动机3,造车皮4.挡风玻璃...... 很难决定上面这些步骤之间的关系!先造发动机还是先造车轮?
面向对象:
车轮
买橡胶
到马来西亚
找到橡胶厂
掏钱买
用船将橡胶晕倒国内
造磨具
将橡胶放入磨具
出车轮
发动机
......
1.Create table in mysql
CREATE TABLE `mt` ( `BookIndex` int NOT NULL AUTO_INCREMENT, `BookId` bigint NOT NULL, `BookName` varchar(100) NOT NULL, `BookTitle` varchar(100) NOT NULL, PRIMARY KEY (`BookIndex`) ) //ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci run below command to validate the table created statement.
desc mt; 2.Cpp code
#include <cppconn/driver.h> #include <cppconn/resultset.h> #include <cppconn/statement.h> #include <cppconn/exception.h> #include <cppconn/prepared_statement.h> #include <iostream> #include <sstream> #include <string.h> using namespace std; static char *uuidValue = (char *)malloc(40); char *getUuid() { uuid_t newUUID; uuid_generate(newUUID); uuid_unparse(newUUID, uuidValue); return uuidValue; } void batchInsert(int loops); int main(int args, char **argv) { batchInsert(atoi(argv[1])); } void batchInsert(int loops) { try { sql::Driver *driver; sql::Connection *conn; sql::PreparedStatement *prepStmt; driver=get_driver_instance(); conn=driver->connect(tcp://127.
面向对象通过构建更大的结构来模拟世界,函数式编程通过构造更大的计算来求解问题
那我认为的编程语言两个功能, 一个是模拟, 一个是计算,真实的物理世界, 或者说具体的业务, 有巨大的复杂性,当你要用编程语言解决问题, 首先语言应该有足够的灵活性去描述问题,然后是计算, 比说你能描述字符串文件, 也能描述 zip 文件,那两种形态之间的转化过程, 语言就要能进行拆解由 CPU 完成计算.更重要的例子当然是多个任务之间相互协作, 需要能模拟和计算.
https://segmentfault.com/a/1190000006935290
Numpy的通用函数可以用来替代循环, 快速实现数组的逐元素的 运算 同样,使用其他通用函数实现数组的逐元素的 比较
< > 这些运算结果 是一个布尔数据类型的数组。 有6种标准的比较操作
小于,大于,小于等于,大于等于, 不等于, 等于 x > 3 x <= 3 x >= 3 x != 3 x == 3
复合表达式 对应的通用函数 Operator Equivalent ufunc Operator Equivalent ufunc == np.equal != np.not_equal < np.less <= np.less_equal > np.greater >= np.greater_equal 操作布尔数组 统计记录的个数 False : 0 ,True : 1 np.
unity使用的三种不同路径 软件路径
1.unity hub 软件路径,在 unity hub 属性中设置。 unity 软件路径,在 unity hub 的 unity 安装中设置。
2.数据以及资源路径 unity hub 和 unity 在运行过程中,产生的数据和资源路径,一般默认为系统盘,且不能通过软件(unity hub 和 unity)更改。
3.项目路径 在 unity 中我们写的程序所在的位置,在第一次保存项目时进行设定,也可通过“另存为”进行更改。
以上三种路径不需要在一起,可根据需求自行更改。
默认路径 1.unity 编译器路径 editor 编译器指 unity 软件本身,可以在 unity hub 中下载安装 unity 不同版本时手动指定,在 unity hub 中查看路径
2.unity 数据以及资源路径 C:\User\用户名\AppData\Roaming\Unity
3.unity hub 资源路径 C:\User\用户名\AppData\Roaming\UnityHub
修改路径 1.关闭unity 2.将 C:\User\用户名\AppData\Roaming\Unity 文件夹剪切到一个比较大的盘;或者将其复制,然后重命名该文件夹,这种方式更加保险,等全部操作完成后再将其删除 3.更改文件夹位置后,需要建立起原文件夹和新文件夹之间的连接。以管理员身份打开命令行,输入以下命令: mklink /j C\User\用户名\AppData\Roaming\Unity E:\Unity 4.分别右键点击 C\User\用户名\AppData\Roaming\Unity 和 E:\Unity ,查看属性,取消“只读”属性 5.测试,打开 Unity,若能正常开启,则成功修改
一、新建容器实例docker run -d -p 3306:3306 --privileged=true -v /finnlee/mysql/log:/var/log/mysql -v /finnlee/mysql/data:/var/lib/mysql -v /finnlee/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:8.0
二、新建my.cnf 设置字符编码[client]default_character_set=utf8[mysqld]collation_server = utf8_general_cicharacter_set_server = utf8
三、重新启动服务
备份环境
centos7 ,地址10.0.0.7 数据库: MySQL5.7 数据库 备份库
centos7 地址10.0.0.77 数据库: MySQL5.7 数据库 还原库 xtrabackup工具2.4
centos7:10.0.0.7和10.0.0.77 都操作
创建备份目录
上传工具包xtrabackup
[root@centos7-liyj ~]#mkdir /backup/ [root@centos7-liyj ~]#rz -E rz waiting to receive. [root@centos7-liyj ~]#ls anaconda-ks.cfg boost_1_59_0.tar.gz percona-xtrabackup-24-2.4.20-1.el7.x86_64.rpm 安装工具包
[root@centos7-liyj ~]#yum -y install percona-xtrabackup-24-2.4.20-1.el7.x86_64.rpm [root@centos7-liyj ~]#yum -y install percona-xtrabackup-24-2.4.20-1.el7.x86_64.rpm Loaded plugins: fastestmirror Examining percona-xtrabackup-24-2.4.20-1.el7.x86_64.rpm: percona-xtrabackup-24-2.4.20-1.el7.x86_64 Marking percona-xtrabackup-24-2.4.20-1.el7.x86_64.rpm to be installed Resolving Dependencies --> Running transaction check ---> Package percona-xtrabackup-24.x86_64 0:2.4.20-1.el7 will be installed --> Processing Dependency: perl(DBD::mysql) for package: percona-xtrabackup-24-2.