1. 程式人生 > >分散式快取--redis和memcache

分散式快取--redis和memcache

redis

     日常開發中,總會接觸到一些好玩的東西,比如這篇的redis,一說到redis,可能就有人跟memcache做比較了,是呀,

memcache只能說是簡單的kv記憶體資料結構,而redis支援的資料型別就豐富多了,當然最能讓人看上眼的就是SortedSet。

有了它,我們就可以玩一些“貪心”的問題,比如適合“貪心”的優先佇列,說到優先佇列,我們以前實現了僅僅是記憶體形式的,

哎,記憶體畢竟是記憶體,當有海量資料的時候,最好能有一個序列化到硬碟的操作。。。恰恰這個場景redis就可以辦到。。。

一:快速搭建

    好了,我們知道redis比較適合做的事情了,現在我們可以進行快速搭建。

最重要的也就是下面兩個:

redis-server.exe:        這個就是redis的服務端程式。

redis-cli.exe:             服務端開啟後,我們的客戶端就可以輸入各種命令測試了。

從圖中我們可以看到兩點:

①:沒有指定config file。

     原來redis建議我們做一個配置檔案,那我就搞段配置。

daemonize:  是否以“守護程序”的方式開啟,當是守護程序的時候就不受控制檯的影響了。

logfile:         log檔案位置。

database:    開啟資料庫的個數。

dbfilename:  資料快照檔名。

save * *:     儲存快照的頻率,第一個為時間,第二個為寫操作。

將這些配置好後,我們再看看:

②:我們看到redis預設的開放埠為6379。

二:安裝驅動

好了,redis已經搭建完畢了,現在我們就要用C#去操作redis,這也是我最渴望的功能,優先佇列~,先下載C#驅動

就可以看到如下3個dll。

最後我們做下小測試:

複製程式碼

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             var client = new RedisClient("127.0.0.1", 6379);
 6 
 7             //最後一個引數為我們排序的依據
 8             var s = client.AddItemToSortedSet("12", "百度", 400);
 9 
10             client.AddItemToSortedSet("12", "谷歌", 300);
11             client.AddItemToSortedSet("12", "阿里", 200);
12             client.AddItemToSortedSet("12", "新浪", 100);
13             client.AddItemToSortedSet("12", "人人", 500);
14 
15             //升序獲取最一個值:"新浪"
16             var list = client.GetRangeFromSortedSet("12", 0, 0);
17 
18             foreach (var item in list)
19             {
20                 Console.WriteLine(item);
21             }
22 
23             //降序獲取最一個值:"人人"
24             list = client.GetRangeFromSortedSetDesc("12", 0, 0);
25 
26             foreach (var item in list)
27             {
28                 Console.WriteLine(item);
29             }
30 
31             Console.Read();
32         }
33     }

複製程式碼

AddItemToSortedSet: 第三個引數也就是我們要排序的依據,這也非常適合我們做topK的問題,非常爽~

   這篇開始決定把系列文章的名字改掉,想了個好名字,反正不是玩單機版的就行了。

    好了,這篇我們看看一種非持久化的快取伺服器memcache,說到快取本能反映就是cache,session什麼的,是的,可以說這

些都是基於.net程序的,通俗點也就做不了多機器的共享,典型的一個就是SSO。

一: 安裝

     memcahce像redis,mongodb一樣都需要開啟他們自己的服務端,我們下載Memcached_1.2.5.zip,然後放到C盤,修改檔案

名為memcached。

1:install

     install可以說是萬能通用命令,首先我們轉到memcached目錄,然後 memcached.exe -d install 即可。

        

2:start

    現在我們只要啟動start即可,要注意的就是memecache預設的埠是11211,當然我也不想重新指定埠了。

        

3:stop,uninstall

     這兩個就不截圖了,一個是停止,一個是解除安裝,反正都是萬能通用命令。

二:驅動程式

   memcache的伺服器我們就已經開啟好了,由於在公司最近一直都在用php,算了還是用C#驅動吧,誰讓這是.net

社群呢,下載C#驅動,既然是快取伺服器,只要有基本的CURD,我想應該就差不多了。

複製程式碼

 1 using System;
 2 using System.Collections.Generic;
 3 
 4 namespace BeIT.MemCached
 5 {
 6     class Example
 7     {
 8         public static void Main(string[] args)
 9         {
10             //通過配置檔案初始化memcache例項
11             MemcachedClient cache = MemcachedClient.GetInstance("MyConfigFileCache");
12 
13             //編輯(可以模擬session操作,快取20分鐘)
14             cache.Set("name", "一線碼農", DateTime.Now.AddMinutes(20));
15 
16             //獲取
17             var result = cache.Get("name");
18 
19             Console.WriteLine("獲取name的快取資料為: " + result);
20 
21             //刪除
22             cache.Delete("name");
23 
24             Console.WriteLine("\n成功刪除cache中name的資料");
25 
26             result = cache.Get("name");
27 
28             Console.WriteLine("\n再次獲取cache中name的資料為:" + (result ?? "null") + "\n");
29 
30             //檢視下memecahce的執行情況
31             foreach (KeyValuePair<string, Dictionary<string, string>> host in cache.Status())
32             {
33                 Console.Out.WriteLine("Host: " + host.Key);
34                 foreach (KeyValuePair<string, string> item in host.Value)
35                 {
36                     Console.Out.WriteLine("\t" + item.Key + ": " + item.Value);
37                 }
38                 Console.Out.WriteLine();
39             }
40 
41             Console.Read();
42         }
43     }
44 }

複製程式碼

我們再定義下配置檔案,既然memcache可以用於分散式,那就避免不了將cache分攤到幾臺伺服器上去,可以看到,下面的

配置也是非常簡單的,當然分配的法則自然是memcache自身的演算法決定的,最後別忘了在另一臺伺服器上開放一個埠就它

就行了。

複製程式碼

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="beitmemcached" type="System.Configuration.NameValueSectionHandler" />
  </configSections>
  <appSettings>
  </appSettings>
  <beitmemcached>
    <add key="MyConfigFileCache" value="127.0.0.1:11211" />
    <!--<add key="MyConfigFileCache" value="127.0.0.1:11211,127.0.0.1:8888" />-->
  </beitmemcached>
</configuration>

複製程式碼

歡迎關注公眾號:

相關推薦

分散式快取--redismemcache

redis      日常開發中,總會接觸到一些好玩的東西,比如這篇的redis,一說到redis,可能就有人跟memcache做比較了,是呀, memcache只能說是簡單的kv記憶體資料結構,而redis支援的資料型別就豐富多了,當然最能讓人看上眼的就是Sorte

分散式快取Redis的持久化方式RDBAOF

一、前言   Redis支援兩種方式的持久化,RDB和AOF。RDB會根據指定的規則“定時”將記憶體中的資料儲存到硬碟上,AOF會在每次執行命令後將命令本身記錄下來。兩種持久化方式可以單獨使用其中一種,但更多情況下是兩種結合使用。 二、RDB   RDB方式的持久化是通過快照完成的,當符合一定條件的時候Red

【開源專案系列】如何基於 Spring Cache 實現多級快取(同時整合本地快取 Ehcache 分散式快取 Redis

## 一、快取 當系統的併發量上來了,如果我們頻繁地去訪問資料庫,那麼會使資料庫的壓力不斷增大,在高峰時甚至可以出現數據庫崩潰的現象。所以一般我們會使用快取來解決這個資料庫併發訪問問題,使用者訪問進來,會先從快取裡查詢,如果存在則返回,如果不存在再從資料庫裡查詢,最後新增到快取裡,然後返回給使用者,當然了,接

RedisMemcache性能測試對比

數據 redis 3.3 replace class 內存 知識 獲取數據 lac Redis和Memcache在寫入性能上面差別不大,讀取性能上面尤其是批量讀取性能上面Memcache全面勝出,當然Redis也有自己的優點:比如數據持久化、支持更多的數據結構(Set Li

RedisMemcache對比及選擇(轉載)

rain not 目前 ctu res sim per fast 超過 http://www.cnblogs.com/EE-NovRain/p/3268476.html 我這段時間在用Redis,感覺挺方便的,但比較疑惑在選擇內存數據庫的時候到底什麽時候選擇redis,

RedisMemcache對比及選擇

fas 之前 there 快照 存在 cas struct 服務器 eboot 在選擇內存數據庫的時候到底什麽時候選擇redis,什麽時候選擇memcache,然後就查到下面對應的資料,是來自redis作者的說法(stackoverflow上面)。 You shou

RedisMemcache的區別總結

font 自己 持久性 類型 面具 最大的 利用 eight con 數據類型 redis數據類型豐富,支持set liset等類型 memcache支持簡單數據類型,需要客戶端自己處理復雜對象 持久性 redis支持數據落地持久化存儲 memcac

安裝NoSQL數據庫類型的redis memcache數據庫

查看 red ini package emc 數據庫類型 download windows 添加 1.添加redis擴展 (1)phpinfo 查看版本 nts還是ts 下載相應的版本(phpstudy是32位的所以下載X86版本NTS版本)如7.2 Non Thread

RedisMemcache

看專案的時候,發現了我們的系統中,同時使用了redis和memcache;起初自己也沒有太注意;現在細細想想既然用了兩個元件,必然都有他們的長處和短處。看看他們的區別: You should not care too much about performances. Redis is fas

RedisMemcache的使用場景區別

作者:Gamer_young 連結:https://www.jianshu.com/p/0cee8085fc8f 來源:簡書 簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。   使用場景: 一、如果需要快取的資料只是key-value 這樣簡單的結構時,採用M

分散式快取Redis之HyperLogLog

寫在前面   基數估計演算法就是使用準確性換取空間。 為了說明這一點,我們用三種不同的計算方法統計所有莎士比亞作品中不同單詞的數量。請注意,我們的輸入資料集增加了額外的資料以致比問題的參考基數更高。 這三種技術是:Java HashSet、Linear Probabil

分散式快取Redis之持久化

寫在前面 Redis 可以持久化,當做Cache時持久化的意義在哪?   持久化的意思就是說伺服器重啟之後,快取依然存在,記憶體型別的快取,伺服器重啟後就不存在了。比如使用持久化的方案做登入Session,伺服器重啟後用戶不用再次登入,而一般記憶體方案需要再次登入。

分散式快取Redis之bitmap、setbit

寫在前面   本學習教程所有示例程式碼見GitHub:https://github.com/selfconzrr/Redis_Learning ###基本語法: 1)SETBIT redis 127.0.0.1:6379> setbit KEY_NAME OFFSE

分散式快取Redis之適用場景

寫在前面   本學習教程所有示例程式碼見GitHub:https://github.com/selfconzrr/Redis_Learning   學而用之嘛。在這總結一下,Redis的適用場景,合理的使用Redis會讓你的專案變得更高效。 1、顯示最新的專案列表   下

分散式快取Redis之效能測試

寫在前面   本學習教程所有示例程式碼見GitHub:https://github.com/selfconzrr/Redis_Learning   Redis 效能測試是通過同時執行多個命令實現的。 語法:   redis 效能測試的基本命令如下: redis-ben

php操作redismemcache過期時間

php-redis 設定過期時間setTimeOut 命令列expireredis過期時間redis術語裡面,把設定了expire time的key 叫做:volatile keys。 意思就是不穩定的key。沒有設定過期時間的也就是永久儲存 set:set('key','value')將值 valu

分散式快取Redis之cluster叢集

寫在前面      jedis客戶端操作redis主要三種模式:單臺模式、分片模式(ShardedJedis)、叢集模式(BinaryJedisCluster),分片模式是一種輕量級叢集。   單臺模式、分片模式(ShardedJedis)前面已經

分散式快取Redis之Pipeline(管道)

寫在前面   Redis的pipeline(管道)功能在命令列中沒有,但redis是支援pipeline的,而且在各個語言版的client中都有相應的實現。 由於網路開銷延遲,就算redis server端有很強的處理能力,也會由於收到的client訊息少

分散式快取redis之事務

關係型資料庫的事務具備:原子性(A)、一致性(C)、隔離性(I)、永續性(D)。在redis中也同樣擁有事務的概念redis事務的使用redis中與事務相關的命令有5個,分別是:MULTI EXEC D

分散式快取Redis之與Memcached的比較

寫在前面   由於在專案中並沒有使用Memcached,所以在這貼出Memcached的教程,以備不時之需。   Redis的作者Salvatore Sanfilippo曾經對這兩種基於記憶體的資料儲存系統進行過比較,總體來看還是比較客觀的。