1 | package main |
Go基础之基本数据类型
1 | package main |
Go基础之变量的定义
1 | package main |
TypeError: not all arguments converted during string formatting python
该报错发生在字符串拼接时的操作, 以下字符串拼接的方式, 只要不混用, 该问题就可以解决
第一种 % 占位符
1 | In [2]: s = "abc %s" % 123 |
第二种 {} 大括号
1 | In [6]: s = 'abc {0}'.format(123) |
python中的mysql连接池
code
1 | import pymysql |
PooledDB的参数
- mincached: 最少的空闲连接数, 如果空闲连接数小于这个数, pool会创建一个新的连接
- maxcached: 最大的空闲连接数, 如果空闲连接数大于这个数, pool会关闭空闲连接
- maxconnections: 最大的连接数
- blocking: 当连接数达到最大的连接数时, 在请求连接的时候, 如果这个值是True, 请求连接的程序会一直等待, 直到当前连接数小于最大连接数, 如果这个值是False, 会报错
python下http.client与urllib访问https报证书认证失败
在python3代码中, 使用http.client或urllib.request进行https访问的时候, 出现以下报错
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)
解决方法如下:
1 | import ssl |
再次访问, 即可正常访问https站点
python连接mysql报错:'latin-1' codec can't encode characters
python连接mysql数据库进行查询时, 遇到以下报错:
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 40-41: ordinal not in range(256)
很明显提示了是字符编码的问题
发生以上问题, 是因为我在sql语句中出现了中文, 在拿到db游标对象之后, 去执行sql的时候的报错
排查数据库字符编码
登录MySQL数据库, 执行以下SQL语句执行查询:
1 | mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%'; |
经过查询, 发现mysql数据库本身已是 utf8
的字符编码
分析可能的原因:
mysql一般有三段配置, 分别是: [mysql]
[clinet]
[mysqld]
- [mysql] 对其他远程连接的mysql客户端的配置, 例如在其他服务器执行
mysql -h -u -p
或使用代码进行连接 - [client] 对本地的mysql客户端的配置, 例如在本地执行
mysql -u -p
- [mysqld] 对mysql服务进行配置
有可能mysql配置文件中的[mysql]下没有配置 default-character-set = utf8mb4
, 导致远程客户端连接到服务器端后, 没有获得服务端声明的字符编码, 而使用客户端默认带的字符编码进行连接, 如果是这种情况, 可以在mysql服务端更改配置文件并重启mysql服务, 如果你不想重启数据库, 可以显示地在mysql客户端声明使用的字符编码
解决pymysql字符编码问题
1 | import pymysql |
解决方法很简单, 只需要在创建数据库连接对象的时候, 显示地声明字符编码就可以了 charset="utf8"
注意: 如果你的MySQL服务器的字符编码使用的是utf-8
的话, 你需要声明你的连接对象的字符编码也是 utf-8
如果你的MySQL服务器的字符编码使用的是utf8mb4
的话, 相对应的, 你应该声明自己客户端的字符编码是 utf8mb4
heartbeat-elastic报错:system_api_version [6] is not supported by system_id [beats]
配置heartbeat-elastic服务时日志报错如下
2018-02-11T07:36:29.217-0500 ERROR pipeline/output.go:92 Failed to publish events: 400 Bad Request: {"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"system_api_version [6] is not supported by system_id [beats]"}],"type":"illegal_argument_exception","reason":"system_api_version [6] is not supported by system_id [beats]"},"status":400}
解决方法:
手动设置/etc/heartbeat/heartbeat.yml
配置文件中的 name
变量 name: 10.10.62.16
重启heartbeat-elastic
服务即可
systemctl restart heartbeat-elastic.service
Python实现redis的自增操作
在传统的数据库中, 如果实现一个计数器的操作, 需要先去数据库中读取该值, 再程序中加1, 再讲最新的值存入数据库. 用户操作的流程步骤多不说, 还容易出现数据安全性的问题, 比如多进程/多线程的并发情况, 有可能出现A进程读取的计数器为5, 在本地执行+1, 操作的时候, 此时B进程也去执行计数器+1操作, B读取的数值也是5, 然后A将+1之后的数字6存入数据库, 之后B处理完后也将+1之后的6存入数据库, 这样就导致了在并发的情况下, 计数器的数据不准的情况.
Redis的很多操作本身都是原子性的, 例如上面案例中, 计数器+1的问题, 会有三个步骤
- 读取数值
- 自增操作
- 写入数值
在传统数据库中, 为了保证数据的安全性, 这三个步骤通常是要加锁的, 也就是在步骤已经很多的情况下, 还需要考虑锁的问题. 但是Redis就不同了, Redis原子性的意思就是说, 可以保证上面的三个步骤是一个操作, 在这个操作完成之后才允许我们对其进行其他操作, 这就原生的保证了数据安全性
redis中的自增
在redis中, 如果一个key的value是数值类型, 我们就可以对这个值进行incr操作, 如果数值是整形int, 使用incr进行自增操作, 如果数值是浮点型float, 则需要使用incrbyfloat进行操作, 还有一种情况, 就是对int使用了incrbyfloat操作, 则这个数值就会变成float类型, 也就无法再对其执行incr操作了
1 | In [1]: import redis |
redis中的自减
redis中使用decr函数进行自减操作, 但是自减中, 没有提供类似incrbyfloat的操作, 如果在自减中想实现浮点数的效果, 可以通过在incrbyfloat函数中使用负数的方式实现
1 | In [19]: r.keys() |
nginx切割日志文件
不知道这么基础的功能, 为什么Nginx官方没有提供配置~
1 | #!/bin/bash |
以上文件名为年月日形式, 写成脚本保存, 然后加入到计划任务里每天执行就可以了
1 | > crontab -l |