Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 19 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,29 @@ TODO:

-----------------------------------------------


更新日志:

v0.4.2 (2016-10-20)

增加删除空闲Key的功能,配置详见config_global.php

修正导出中的BUG

修正因JS缺失而产生的BUG

——————————————————


v0.4.1 (2016-09-19)

修正scan在集群模式下不可用的问题(由于官方文档缺失,暂时将集群模式读取key列表改回原来的keys命令,如有错误,请斧正)

——————————————————

v0.4.0 (2016-09-05)

采用scan命令读取key列表(redis >= 2.8),页面建树改用ztree (https://github.com/zTree/zTree_v3),单个节点超过10万时不建议展开(好吧,有可能展不开)
采用scan命令读取key列表(redis >= 2.8),页面建树改用ztree ( https://github.com/zTree/zTree_v3 ),单个节点超过10万时不建议展开(好吧,有可能展不开)

增加直接查看指定key的功能

Expand Down
25 changes: 25 additions & 0 deletions application/config/config.php
Original file line number Diff line number Diff line change
Expand Up @@ -360,3 +360,28 @@

/* End of file config.php */
/* Location: ./application/config/config.php */


//================== Readonly switch add by binyan.li
define('READONLY_SWITCH', TRUE);
//define('READONLY_SWITCH', FALSE);
$config['readonly'] = READONLY_SWITCH;
$config['deny_operater']= array(
'none',
//== 下方为放行方法
// 'delete', //删除键
// 'rename', //修改键名
// 'edit', //查看/修改键值
// 'ttl', //存活时间查看/修改
// 'save', //保存
// 'import', //导入键值
// 'clear_idle_key',
// 'export', //导出键值
// 'idle',
// 'overview', //统计信息
// 'info', //统计信息
// 'view', //查看各类型数据(string/hash/set/zset/list)
// 'index', //首页
// 'key', //列出键值
);
//==================
2 changes: 1 addition & 1 deletion application/config/config_auth.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
/*
* 验证码语言 en=英文 cn=中文
*/
$config['seccode_lang'] = 'en';
$config['seccode_lang'] = 'cn';

/*
* 验证码字数 默认为4,
Expand Down
12 changes: 11 additions & 1 deletion application/config/config_global.php
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
<?php

$config['project_name'] = 'RedisMyAdmin';
$config['version'] = '0.4.0';
$config['version'] = '0.4.2';

if( defined('READONLY_SWITCH') && READONLY_SWITCH==TRUE ){
$config['project_name'].= '-只读开启';
}

/**
* PHP执行时间
Expand Down Expand Up @@ -47,3 +51,9 @@
*/
$config['tree_key_page_size'] = 10000;

/*
* 检索空闲key时每次读取的个数
* 如为本机或本地局域网 建议甚至为1000-2000
* 如为远程redis服务器,建议设置100-500
*/
$config['idle_key_page_size'] = 1000;
99 changes: 99 additions & 0 deletions application/controllers/clear_idle_key.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

/**
* 清理空闲key
* @author DV
*
*/
class Clear_idle_key extends MY_Controller {

private $_idle_key;

public function __construct()
{
parent::__construct();
$this -> _idle_key = get_custom_config('config_global', 'idle_key');
}

public function index()
{
$db_size = $this -> redis_model -> get_db_size();

$page_data = $this -> get_default_page_data();
$page_data['db_size'] = $db_size;
$page_data['title'] = '检索/删除 空闲key';

$this -> load -> view('clear_idle_key', $page_data);
}

public function view_idle_key_list()
{
$iterator = get_arg('iterator', -1, 'intval');
$idle_time = get_arg('idle_time', 0, 'intval');
$key_prefix = get_arg('key_prefix', '', 'trim');
if ( $idle_time < 5 ) {
show_message(1, sprintf('设置的时间[%d]过短,空闲时间不建议小于5秒', $idle_time));

}
$iterator = ($iterator === -1) ? NULL : $iterator;
$sub_key = '';
if ( $key_prefix != '' ) {
$sub_key = $key_prefix . '*';
}
$result = $this -> redis_model -> scan_keys($sub_key, $iterator, TRUE, IDLE_KEY_PAGE_SIZE);
$redis_keys = $result['keys'];
$new_iterator = $result['iterator'];
$ret_arr = array();
if ( ! empty($redis_keys) ) {
$redis = $this -> redis_model -> get_redis_instance();
foreach($redis_keys as $key) {
$t = $redis -> object('idletime', $key);
if ( $t >= $idle_time ) {
$ret_arr[] = array(
'k' => htmlspecialchars($key),
't' => $t,
);
}
}
}
show_message(0, '', array(
'iterator' => $new_iterator,
'idle_keys' => $ret_arr,
));
}

public function clear_keys()
{
$iterator = get_arg('iterator', -1, 'intval');
$idle_time = get_arg('idle_time', 0, 'intval');
$key_prefix = get_arg('key_prefix', '', 'trim');
if ( $idle_time < 5 ) {
show_message(1, sprintf('设置的时间[%d]过短,空闲时间不建议小于5秒', $idle_time));

}
$iterator = ($iterator === -1) ? NULL : $iterator;
$sub_key = '';
if ( $key_prefix != '' ) {
$sub_key = $key_prefix . '*';
}
$result = $this -> redis_model -> scan_keys($sub_key, $iterator, TRUE, IDLE_KEY_PAGE_SIZE);
$redis_keys = $result['keys'];
$new_iterator = $result['iterator'];
$ret_arr = array();
$affected = 0;
if ( ! empty($redis_keys) ) {
$redis = $this -> redis_model -> get_redis_instance();
foreach($redis_keys as $key) {
$t = $redis -> object('idletime', $key);
if ( $t >= $idle_time ) {
$redis -> del($key);
$affected += 1;
}
}
}
show_message(0, '', array(
'iterator' => $new_iterator,
'affected' => $affected,
));
}
}
15 changes: 11 additions & 4 deletions application/controllers/delete.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,13 @@ public function __construct()
public function index()
{
$key = get_arg('key');

if(strpos($key,"\\")){
$key_raw = urldecode(strtr($key, array('\x'=>'%')));
} else {
$key_raw = $key;
}

$type = strtolower( get_arg('type') );
$allow_type = array('' ,'string', 'hash', 'list', 'set', 'zset');

Expand All @@ -24,7 +31,7 @@ public function index()
&& ( $key !== '' )
&& ( in_array($type, $allow_type) )
){
$this -> _delete_key($type, $key);
$this -> _delete_key($type, $key_raw);

$url = manager_site_url('view', 'index', 'key=' . urlencode($key));
die($url);
Expand All @@ -45,7 +52,7 @@ private function _delete_tree($tree)
$tree .= '*';
$keys = $redis -> keys($tree);
foreach($keys as $key) {
$redis -> delete($key);
$redis -> del($key);
}
}

Expand All @@ -55,7 +62,7 @@ private function _delete_key($type, $key)
switch($type) {
default: //如果传空,即是整key删除
case 'string':
$redis -> delete($key);
$redis -> del($key);

break;

Expand Down Expand Up @@ -91,7 +98,7 @@ private function _delete_key($type, $key)
case 'zset':
$value = get_arg('value');
if ( $value !== NULL ){
$redis -> zDelete($key, $value);
$redis -> zRem($key, $value);
}
break;
}
Expand Down
4 changes: 2 additions & 2 deletions application/controllers/edit.php
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ private function _do_index()

} elseif ( $type == 'list' ) {
//list
$size = $redis -> lSize($key);
$size = $redis -> lLen($key);

$index = get_post_arg('index', NULL, 'trim');
($index === NULL) && ($index = '');
Expand Down Expand Up @@ -174,7 +174,7 @@ private function _do_index()
if ( ( $value != $old_value )
|| ( $score != $old_score )
){
$redis -> zDelete($key, $old_value);
$redis -> zRem($key, $old_value);
$redis -> zAdd($key, $score, $value);

}
Expand Down
24 changes: 15 additions & 9 deletions application/controllers/export.php
Original file line number Diff line number Diff line change
Expand Up @@ -118,38 +118,44 @@ private function _export_redis($key)
// Hash
else if ($type == 'hash') {
$values = $redis -> hGetAll($key);

$result = array();
foreach ($values as $k => $v) {
return 'HSET "' . addslashes($key) . '" "' . addslashes($k) . '" "' . addslashes($v) . '"';
$result[] = 'HSET "' . addslashes($key) . '" "' . addslashes($k) . '" "' . addslashes($v) . '"';
}
return implode(PHP_EOL, $result);
}

// List
else if ($type == 'list') {
$size = $redis -> lSize($key);

for ($i = 0; $i < $size; ++$i) {
return 'RPUSH "' . addslashes($key) . '" "' . addslashes($redis -> lGet($key . $i)) . '"';
$size = $redis -> lLen($key);
$result = array();
for ($i = 0; $i < $size; $i++) {
$result[] = 'RPUSH "' . addslashes($key) . '" "' . addslashes($redis -> lGet($key, $i)) . '"';
}
return implode(PHP_EOL, $result);
}

// Set
else if ($type == 'set') {
$values = $redis -> sMembers($key);

$result = array();
foreach ($values as $v) {
return 'SADD "' . addslashes($key) . '" "' . addslashes($v) . '"';
$result[] = 'SADD "' . addslashes($key) . '" "' . addslashes($v) . '"';
}
return implode(PHP_EOL, $result);
}

// ZSet
else if ($type == 'zset') {
$values = $redis -> zRange($key, 0, -1);
$result = array();

foreach ($values as $v) {
$s = $redis -> zScore($key, $v);
return 'ZADD "' . addslashes($key) . '" ' . $s . ' "' . addslashes($v) . '"';
$result[] = 'ZADD "' . addslashes($key) . '" ' . $s . ' "' . addslashes($v) . '"';
}
return implode(PHP_EOL, $result);
}
}

Expand Down Expand Up @@ -186,7 +192,7 @@ private function _export_json($key)

// List
else if ($type == 'list') {
$size = $redis -> lSize($key);
$size = $redis -> lLen($key);
$value = array();

for ($i = 0; $i < $size; ++$i) {
Expand Down
6 changes: 6 additions & 0 deletions application/controllers/index.php
Original file line number Diff line number Diff line change
Expand Up @@ -100,5 +100,11 @@ public function idle()
$this -> index();
}

public function clear_idle_key()
{
$this -> _current_method = 'clear_idle_key';
$this -> index();
}


}
1 change: 1 addition & 0 deletions application/controllers/overview.php
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ private function _overview_all()
$can_connect = FALSE;
try {
$can_connect = $redis -> connect($server['host'], $server['port'], 0.5);
if($server['auth']) $redis -> auth($server['auth']);
} catch (Exception $e) {
$can_connect = TRUE;
}
Expand Down
20 changes: 16 additions & 4 deletions application/controllers/rename.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,20 @@ public function index()
show_error('没有找到参数Key');
}

if(strpos($key,"\\")){
$key_raw = urldecode(strtr($key, array('\x'=>'%')));
} else {
$key_raw = $key;
}

$redis = $this -> redis_model -> get_redis_instance();
$key_exists = $redis -> exists($key);
$key_exists = $redis -> exists($key_raw);
if ( ! $key_exists ) {
show_error('Key[' . $key . ']不存在');
}

$page_data = $this -> get_default_page_data();
$page_data['key'] = $key;
$page_data['key'] = $key_raw;
$page_data['title'] = '重命名Key[' . $key . ']';

$this -> load -> view('rename', $page_data);
Expand All @@ -49,17 +55,23 @@ private function _do_index()
show_error('没有找到新键名参数key');
}

if(strpos($old_key,"\\")){
$old_key_raw = urldecode(strtr($old_key, array('\x'=>'%')));
} else {
$old_key_raw = $old_key;
}

if ( strlen($key) > MAX_KEY_LEN ) {
show_error('Key长度[' . strlen($key) . ']超过限制,当前限制为[' . MAX_KEY_LEN . ']');
}

$redis = $this -> redis_model -> get_redis_instance();
$key_exists = $redis -> exists($old_key);
$key_exists = $redis -> exists($old_key_raw);
if ( ! $key_exists ) {
show_error('Key[' . $old_key . ']不存在');
}

$redis -> rename($old_key, $key);
$redis -> rename($old_key_raw, $key);

$url = manager_site_url('view', 'index', 'key=' . urlencode($key));
Header('Location:' . $url);
Expand Down
Loading