一.Redis
exists
exists key
确认一个key是否存在
例如: exists ruanl
如果存在返回(integer)1 不存在 返回(integer)0
type
type key
返回值的类型
例如 :type ruanl
返回 string ,hash,list,set
randomkey
randomkey
随机返回key空间的一个
rename
rename oldkey newkey
重命名key
当 oldkey 和 newkey 相同,或者 oldkey 不存在时,返回一个错误
当 newkey 已经存在时, RENAME 命令将覆盖旧值
慎用 ! rename 命令执行后,oldkey会在redis 中消失 ,如果newkey 已经存在,oldkey会覆盖newkey的类型和value
select
select index
Redis Select 命令用于切换到指定的数据库,数据库索引号 index 用数字值指定,以 0 作为起始索引值
Redis 默认数据库个数是16,索引范围为0-15,就像mysql服务器可以有多个实例,各个数据库之间是相互分离的,每个数据库都有属于自己的空间,不必担心之间的key冲突。
redis下,数据库是由一个整数索引标识,而不是由一个数据库名称.
例如:
select 1;
提示符切换到:
127.0.0.1:6379[1]>
move
将当前数据库的 key 移动到给定的数据库 db 当中
MOVE key db
移动成功返回 1 ,失败则返回 0
expire
设定一个key的活动时间(s)
EXPIRE key seconds
当 key 过期时(生存时间为 0 ),它会被自动删除
ttl
以秒为单位,返回给定 key 的剩余生存时间
TTL key
当 key 不存在时,返回 -2
当 key 存在但没有设置剩余生存时间时,返回 -1
否则,以秒为单位,返回 key 的剩余生存时间
删除
del key [key …]
删除多个key,这种对于几个以内的key还好,但对于包含数量比较多的时候不适用
flushdb
删除当前选择数据库中的所有key
flushall
删除所有数据库中的所有key
这2种在正式环境中使用非常不合适,如果我们想要删除匹配某一规则的key怎么处理呢
可以参考这2种
eval 脚本删除
eval “return redis.call(‘del’,unpack(redis.call(‘keys’,ARGV[1])))” 0 RULE_FIXED_REPAYMENT_*
这样的方式,通过内置的 Lua 解释器,可以使用 EVAL 命令对 Lua 脚本
但这种处理方式,量大的情况下,lua函数unpack会出现问题
可以采用脚本循环处理
xargs
但是有的redis版本过低没有内置lua解释器,可以使用linux xargs 命令处理
redis-cli -h ip -a password keys SILK_BAG_DETAIL_* |xargs redis-cli -h ip -a password del
如果redis-cli没有设置成系统变量,需要指定redis-cli的完整路径
如:/opt/redis/redis-cli keys “*” | xargs /opt/redis/redis-cli del
既然讲到了linux 的 xargs,简单介绍一下
xargs
xargs是一条Unix和类Unix操作系统的常用命令。它的作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题.
相当于给命令传递参数的过滤器,组合多个命令的一个工具。
例如:我们想要获得/usr/ 下所有*.test 结尾的文件列表,并删除
find /etc -name "*.test" | rm
这样linux 是不支持的
但是我们可以通过
find /usr -name "*.test" | xargs rm
find -name '*.log' -print0 | xargs -0 rm
find -print和-print0的区别:
-print每一个输出后会添加一个回车换行符,而-print0则不会.
例如:
find -name "*.te" -print0
显示:
./test1.te./test2.te
find -name "*.te" -print
./test1.te
./test2.te
-0
当stdin含有特殊子元的时候,将其当成一般字符
mysql
查询分析
慢查询日志
慢查询日志:记录所有执行时间超过long_query_time秒的所有查询或者不使用索引的查询;
通过
SHOW VARIABLES LIKE '%query%'
查看慢查询日志的信息;
SHOW VARIABLES LIKE '%slow_query_log%'
Variable_name | Value |
---|---|
slow_query_log | on |
slow_query_log_file | /var/lib/mysql/slow_queries.log |
SHOW VARIABLES LIKE 'long%';
查看 long_query_time
Variable_name | Value |
---|---|
long_query_time | 10.000 |
默认值为10秒
# Time: 161117 15:30:33
# User@Host: db_write[db_write] @ [192.168.1.91] Id: 31477
# Query_time: 63.218828 Lock_time: 0.000127 Rows_sent: 0 Rows_examined: 12777
use zglc_zjcg;
SET timestamp=1479367833;
SELECT
r.* FROM base_interest_record r JOIN base_invest t ON t.transaction_id = r.assoc_id WHERE t.free_product_type = 2
GROUP BY r.user_id = 11341
ORDER BY id desc
LIMIT 0, 1000;
通过慢查询记录的 那条语句导致慢查询(sql_text),该慢查询语句的查询时间(query_time),锁表时间(Lock_time),以及扫描过的行数
(rows_examined)等信息。
使用 show profile;
show profiles ;
Empty set (0.00 sec)
说明profiles功能是关闭的,使用下面命令开启
mysql> set profiling = 1;
Query OK, 0 rows affected, 1 warning (0.00 sec)
show profiles ;
+———-+————+—————————————————-+
| Query_ID | Duration | Query |
+———-+————+—————————————————-+
| 1 | 0.00025850 | select id,username from user_info where id = 11556 |
+———-+————+—————————————————-+
1 row in set, 1 warning (0.00 sec)
以很高的精度显示了查询的相应时间
show profile for query 1;
给出了执行每个步骤及其花费的时间
使用 SHOW STATUS
MYSQL 的 SHOW STATUS命令返回了一些计数器,查看mysql 的服务器状态信息
当我们执行show status语句时,MySQL将会列出多达300多条的状态信息记录,其中包括了供我们查看了解的各种信息。
不过,如果直接使用show status指令得到300多条记录,会让我们看得眼花缭乱,
因此我们希望能够「按需查看」一部分状态信息。这个时候,我们可以在show status语句后加上对应的like子句
show status like ''
一些常用:
Connections : 查看试图连接到MySQL(不管是否连接成功)的连接数
threads_cached :查看线程缓存内的线程的数量
threads_connected :查看当前打开的连接的数量
threads_running : 查看激活的(非睡眠状态)线程数
table_locks_waited : 查看不能立即获得的表的锁的次数。如果该值较高,并且有性能问题,你应首先优化查询
Handler_read_rnd_next : 没有用到索引的读操作
使用 SHOW PROCESSLIST;
显示哪些线程正在运行
Id :
User:
Host:
db:
Command:
Time:
state 状态
Info:
关键列 state
这个大家可以自行查询具体的状态信息
如果发现被锁
通过Kill QUERY xx 为Id的值