當前位置:首頁 » 服務存儲 » redis存儲地址
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

redis存儲地址

發布時間: 2022-02-23 10:32:37

『壹』 怎麼樣使用 Redis 來存儲和查詢 ip 數據

最簡單粗暴的方法就是把ip_startip和ip_endip都轉化為Sorted Sets里的Score,然後把ip_id定義為Member。
這樣我們的查詢就很簡單了,只需要用ZRANGESCORE查詢出離ip最近SCORE對應的兩個ip_id即可。
然後再分析,如果這兩個ip_id是相同的,那麼說明這個ip在這個地址段,如果不同的話證明這個ip地址沒有被任何地址段所定義,是一個未知的ip!

『貳』 redis怎麼存儲

  1. redis是一個性能非常優秀的內存資料庫,通過key-value存儲系統。

  2. 和Memcached類似,它支持存儲的value類型相對更多,包括string(字元串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hashs(哈希類型)。

  3. 這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。

  4. 與memcached一樣,為了保證效率,數據都是緩存在內存中。區別的是redis會周期性的把更新的數據寫入磁碟或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。

『叄』 怎麼樣使用Redis來存儲和查詢ip數據

今天朋友打了個電話,他們網站的業務要根據客戶的ip地址快速定位客戶的地理位置。網上已經有一大堆類似的ip地址庫可以用,但問題是這些地址庫的數據表結構大多如下所示
+--------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+------------------+------+-----+---------+----------------+
| ip_id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| ip_country | varchar(50) | NO | | NULL | |
| ip_startip | bigint(11) | NO | MUL | NULL | |
| ip_endip | bigint(11) | NO | MUL | NULL | |
| country_code | varchar(2) | NO | | NULL | |
| zone_id | int(11) | NO | | 0 | |
+--------------+------------------+------+-----+---------+----------------+

最核心的部分是三個: ip_startip , ip_endip 以及 ip_id 。其中 ip_id 是要查詢的結果,當然也可以把 zone_id 和 ip_country 包括進去。這里就用 ip_id 來特指查詢結果了。
面對這個表,沒什麼其它辦法,查詢語句只能是
SELECT * FROM who_ip WHERE ip_startip <= {ip} AND ip_endip >= {ip}

其中 {ip} 是要查詢的ip地址,為了方便查詢,在php中一般要用 ip2long函數把它轉換為一個整數。現在問題來了,這個表有400萬條數據,無論你怎麼優化它的索引結構(實際上我覺得這沒啥用),在以上查詢語句中都要耗費2秒以上的時間,對於一個高頻使用的介面,這顯然是不可忍受的。
REDIS能不能解決這個問題。實際上這也是朋友最關心的問題,因為知道Redis有強大數據結構和超快的速度,那麼能不能設計出適應這種查詢場景的結構。
范圍查詢,首先想到的就是Redis裡面的 Sorted Sets 結構,這也是redis中唯一可以指定范圍( SCORE 值)查詢的結構了,所以基本上希望都寄託在它身上了。
最簡單粗暴的方法就是把 ip_startip 和 ip_endip 都轉化為 Sorted Sets 里的 Score ,然後把 ip_id 定義為 Member 。這樣我們的查詢就很簡單了,只需要用 ZRANGESCORE 查詢出離ip最近SCORE對應的兩個 ip_id 即可。然後再分析,如果這兩個 ip_id 是相同的,那麼說明這個ip在這個地址段,如果不同的話證明這個ip地址沒有被任何地址段所定義,是一個未知的ip。
基本邏輯是沒有問題的,但是最大的問題還是性能上的挑戰。根據我的經驗,一個SET 裡面放10萬條數據以上就已經很慢了,如果放到400萬這種量級,我非常懷疑它跟mysql相比還有優勢嗎?
我設計的存儲結構
我的解決方案是把這個地址庫切分,每一片區最多保存65536個地址。也就是說如果一個ip地址段為 188.88.77.22 - 188.90.78.10 ,那麼我們就把它切分為
188.88.77.22 - 188.88.77.255
188.89.0.0 - 188.89.255.255
188.90.0.0 - 189.90.78.10

也就是我們保證每一個ip地址段都被保存在 xxx.xxx.0.0 - xxx.xxx.255.255的一個區段中,這個區段的理論極限是保存65536個值,實際上要遠小於這個數字。而這樣的區段理論上也有65536個,這都是ip地址的設計所限,當然實際上也遠小於這個值。
因此這樣的設計基本上就能滿足我們的性能需要了。以下是我用php寫的數據切分程序
<?php

// redis 參數
define('REDIS_HOST', '127.0.0.1');
define('REDIS_PORT', 6379);
define('REDIS_DB', 10);

define('MYSQL_HOST', 'localhost');
define('MYSQL_PORT', 3306);
define('MYSQL_USER', 'root');
define('MYSQL_PASS', '123456');
define('MYSQL_DB', 'who_brand');

define('MYSQL_TABLE', 'who_ip');
define('MYSQL_COLUMN_START', 'ip_startip');
define('MYSQL_COLUMN_END', 'ip_endip');
define('MYSQL_COLUMN_ID', 'ip_id');
define('MYSQL_PAGESIZE', 1000);

mysql_connect(MYSQL_HOST . ':' . MYSQL_PORT, MYSQL_USER, MYSQL_PASS);
mysql_select_db(MYSQL_DB);

function add_ip($page, $offset, $value) {
static $redis;

if (!$redis) {
$redis = new Redis();
$redis->connect(REDIS_HOST, REDIS_PORT);
$redis->select(REDIS_DB);
}

$key = 'ip:' . $page;
$redis->zAdd($key, $offset, $value);
}

$page = 0;
do {
$offset = $page * MYSQL_PAGESIZE;
$count = 0;

$res = mysql_query('SELECT * FROM ' . MYSQL_TABLE . ' LIMIT ' . MYSQL_PAGESIZE . " OFFSET {$offset}");

while ($ip = mysql_fetch_assoc($res)) {
$start = $ip[MYSQL_COLUMN_START];
$end = $ip[MYSQL_COLUMN_END];
$value = $ip[MYSQL_COLUMN_ID];

$startOffset = $start % 65536;
$endOffset = $end % 65536;

$start -= $startOffset;
$end -= $endOffset;

$startPage = $start / 65536;
$endPage = $end / 65536;

for ($i = $startPage; $i <= $endPage; $i ++) {
if ($i == $startPage) {
add_ip($i, $startOffset, 's:' . $value);

if ($i != $endPage) {
add_ip($i, 65535, 'e:' . $value);
}
}

if ($i == $endPage) {
add_ip($i, $endOffset, 'e:' . $value);

if ($i != $startPage) {
add_ip($i, 0, 's:' . $value);
}
}

if ($i != $endPage && $i != $startPage) {
add_ip($i, 0, 's:' . $value);
add_ip($i, 65535, 'e:' . $value);
}
}

echo ($page * MYSQL_PAGESIZE + $count) . "\n";
$count ++;
}

$page ++;
} while ($count = MYSQL_PAGESIZE);

<?php

define('REDIS_HOST', '127.0.0.1');
define('REDIS_PORT', 6379);
define('REDIS_DB', 10);

$redis = new Redis();
$redis->connect(REDIS_HOST, REDIS_PORT);
$redis->select(REDIS_DB);

$ip = ip2long('173.255.218.70');
$offset = $ip % 65536;
$page = ($ip - $offset) / 65536;

// 取出小於等於它的最接近值
$start = $redis->zRevRangeByScore('ip:' . $page, 0, $offset, array(
'limit' => array(0, 1)
));

// 取出大於等於它的最接近值
$end = $redis->zRangeByScore('ip:' . $page, $offset, 65535, array(
'limit' => array(0, 1)
));

if (empty($start) || empty($end)) {
echo 'unknown';
exit;
}

$start = $start[0];
$end = $end[0];

list ($startOp, $startId) = explode(':', $start);
list ($endOp, $endId) = explode(':', $end);

if ($startId != $endId) {
echo 'unknown';
exit;
}

echo $startId;

『肆』 redis中bgsave或者save命令保存的數據保存到哪裡去了

ctrl+alt+a之後復制到了剪切板~ 你可以在畫圖程序里執行「粘貼」命令~ 再保存!

『伍』 window怎麼更改redis資料庫位置

最近用php開發了一個redis程序,當要部署到伺服器的時候問題就出來了。redis默認是在linux伺服器中運行的,微軟開發小組針對redis也做出了相應的支持。那麼redis一般怎麼在windows系統中運行的呢?我一般是通過開始 > 運行 > cmd > 命令提示行中,然後切換到redis所在的文件目錄中(D: cd redis)。輸入redis的服務命令啟動redis(redis-server.exe)。這樣的話redis就會一直在命令提示行中運行,當關閉了cmd命令提示行的時候redis-server也相應的被關閉了。

那麼我們如何讓redis的服務程序伺服器一開機就自動運行呢?我們可以將redis-server.exe的程序加入到系統服務中。怎麼才能將一個程序加入windows的服務中呢?我們可以通過windows的sc命令將一個程序加入到windows的系統服務中。
sc命令,在注冊表和服務資料庫中創建服務項。語法如下。
sc<server>create[servicename][binPath=]<option1><option2>...
下面我們仿照此語法寫一個redis加入到系統服務中的命令。

sc create redis binPath= D:\redis\redis-server.exe start= auto

我們將上面的語句拿到cmd命令提示行中運行,在windows服務管理中就可以看到redis服務成功加入到系統服務中了。

『陸』 redis存儲幾個g的數據

首先看到 Redis 官方的說法是:『A String value can be at max 512 Megabytes in length.』。過大的 key 和 value 有兩個問題:Redis 是一個內存資料庫,如果容量過大的 key 和 value 首先會導致伺服器中的內存碎片。這會影響 Redis 的內存分配的效率,進一步導致內存的使用率下降。容量過大的 key 和 value 還有這樣幾個影響:a. 這些過大的數據需要更多的時間去傳輸數據b. 過大的數據傳輸可能會導致其他的請求超時如果 A 的響應數據過大,它可能會吃掉其他請求的超時時間。如下圖例子,如果 A 的響應數據過大,它會吃掉其他請求的超時時間

『柒』 redis的rdb默認存放在哪

RDB文件是Redis持久化的一種方式,Redis通過制定好的策略,按期將內存中的數據以鏡像的形式轉存到RDB文件中。

『捌』 redis的數據是存在內存里嗎

Redis就是基於內存可持久化的key-value資料庫。

1、性能問題,Hashmap存儲大量數知據時需要不斷擴容,Redis支持2的32次方個key,每個key或者value大小最大512M。

2、Hashmap是線程不安道全的,redis因為操作原子性不需要考慮這個。

3、Redis可持久化,Hashmap雖然也可以序列專化,但是Java的序列化因為安全問題說是要廢除了,效率也沒有Redis高,而且Redis有多屬種持久化策略。

4、Redis可擴展可分布式部署。

(8)redis存儲地址擴展閱讀:

redis的存儲分為內存存儲、磁碟存儲和log文件三部分,配置文件中有三個參數對其進行配置。

save seconds updates,save配置,指出在多長時間內,有多少次更新操作,就將數據同步到數據文件。這個可以多個條件配合,比如默認配置文件中的設置,就設置了三個條件。

appendonly yes/no ,appendonly配置,指出是否在每次更新操作後進行日誌記錄,如果不開啟,可能會在斷電時導致一段時間內的數據丟失。因為redis本身同步數據文件是按上面的save條件來同步的,所以有的數據會在一段時間內只存在於內存中。

『玖』 Redis存儲格式

redis目前提供四種數據類型:string,list,set及zset(sorted set)。
redis使用了兩種文件格式:全量數據和增量請求。全量數據格式是把內存中的數據寫入磁碟,便於下次讀取文件進行載入;增量請求文件則是把內存中的數據序列化為操作請求,用於讀取文件進行replay得到數據,序列化的操作包括SET、RPUSH、SADD、ZADD。redis的存儲分為內存存儲、磁碟存儲和log文件三部分,配置文件中有三個參數對其進行配置。save seconds updates,save配置,指出在多長時間內,有多少次更新操作,就將數據同步到數據文件。這個可以多個條件配合,比如默認配置文件中的設置,就設置了三個條件。appendonly yes/no ,appendonly配置,指出是否在每次更新操作後進行日誌記錄,如果不開啟,可能會在斷電時導致一段時間內的數據丟失。因為redis本身同步數據文件是按上面的save條件來同步的,所以有的數據會在一段時間內只存在於內存中。appendfsync no/always/everysec ,appendfsync配置,no表示等操作系統進行數據緩存同步到磁碟,always表示每次更新操作後手動調用fsync()將數據寫到磁碟,everysec表示每秒同步一次。

『拾』 Redis的落地(本地存儲)是怎麼做的

把官方文檔好好看看吧,沒多少的。
1. save 60 1000 指的是,如果60s內有超過1000個寫請求,則redis會調用一次fsync保證數據寫回磁碟。
For example, this configuration will make Redis automatically mp the dataset to disk every 60 seconds if at least 1000 keys changed:
save 60 1000
2. 取決於你使用AOF還是RDB模式。AOF模式(實際上就是所有請求的log)會自動重建(但是很慢,因為要從頭開始),而RDB模式則可能會出現文件損壞(所以官方推薦定時備份)。