1. 程式人生 > 其它 >c++ createtoolhelp32snapshot取程序路徑_Qt 程序間互動

c++ createtoolhelp32snapshot取程序路徑_Qt 程序間互動

資源列表:

Redis 命令參考

Commands

Redis是什麼

  Redis是一個開源(BSD許可)的記憶體中的資料結構儲存,用作資料庫、快取和訊息中介軟體。它支援多種資料結構,如字串雜湊表列表無序集合有序集合的範圍查詢,點陣圖基數統計地理空間索引的與查詢。Redis內建複製Lua指令碼LRU回收事務和不同級別的磁碟持久化,並通過哨兵自動分割槽提供高可用性叢集。

單執行緒結構

  • 純記憶體資料庫,瓶頸不在記憶體,在於網路IO
  • 單執行緒,避免頻繁切換上下文
  • 非同步阻塞I/O(多路複用)

持久化

RDB(Redis DataBase)持久化

  • 快照
  • 優點:適合備份、還原、恢復資料快、最大化 Redis 的效能
  • 缺點:兩次快照間的資料會丟失、資料集比較龐大時, fork() 可能會非常耗時

AOF(Append Only File)持久化

  • 日誌
  • 優點:資料完整性高、可讀性高、可重寫(重寫後的新 AOF 檔案包含了恢復當前資料集所需的最小命令集合)
  • 缺點:體積大、慢於RDB、有bug

事務

multi開啟事務,exec執行事務

  可以看到,redis事務實現原理是將要執行的命令,儲存到一個佇列中,依次執行,報錯時停止並取消事務,不報錯則提交事務。

例外:不會回滾的情況:

當一個事務中某一條(多條)命令加入佇列不報錯,執行時才會報錯,則redis會忽略錯誤繼續執行。

  使用watch監視一個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動,那麼事務將被打斷。當exec

被呼叫時, 不管事務是否成功執行, 對所有鍵的監視都會被取消。或者呼叫unwatch手動取消監控。

管道

  • pipeline通過減少客戶端與redis的通訊次數來實現降低往返延時時間,而且Pipeline 實現的原理是佇列,而佇列的原理是時先進先出,這樣就保證資料的順序性。
  • 適用場景:批量操作、可靠性要求不高、

Lua指令碼

  Lua是一個高效的輕量級指令碼語言,用標準C語言編寫並以原始碼形式開放, 其設計目的是為了嵌入應用程式中,從而為應用程式提供靈活的擴充套件和定製功能,從定義上來說, Redis 中的指令碼本身就是一種事務, 所以任何在事務裡可以完成的事, 在腳本里面也能完成。 並且一般來說, 使用指令碼要來得更簡單,並且速度更快。

  • 通過lua指令碼可以原子執行多條redis命令
  • 執行lua指令碼期間,會阻塞所有命令操作

使用指令碼的好處

  • 減少網路開銷,在Lua指令碼中可以把多個命令放在同一個指令碼中執行
  • 原子操作,redis會將整個指令碼作為一個整體執行,中間不會被其他命令插入。換句話說,編寫指令碼的過程中無需擔心會出現競態條件
  • 複用性,客戶端傳送的指令碼會永遠儲存在redis中,這意味著其他客戶端可以複用這一指令碼來完成同樣的邏輯

多資料庫支援

預設支援16個數據庫;可以理解為一個名稱空間

跟關係型資料庫不一樣的點

  1. redis不支援自定義資料庫名詞
  2. 每個資料庫不能單獨設定授權
  3. 每個資料庫之間並不是完全隔離的。 可以通過flushall命令清空redis例項面的所有資料庫中的資料

通過 select dbid 去選擇不同的資料庫名稱空間 。 dbid的取值範圍預設是0 -15

分散式叢集

  Redis Cluster中,Sharding採用slot(槽)的概念,一共分成16384個槽,這有點兒類似前面講的pre sharding思路。對於每個進入Redis的鍵值對,根據key進行雜湊,分配到這16384個slot中的某一箇中。使用的hash演算法也比較簡單,就是CRC16後16384取模。Redis叢集中的每個node(節點)負責分攤這16384個slot中的一部分,也就是說,每個slot都對應一個node負責處理。當動態新增或減少node節點時,需要將16384個槽做個再分配,槽中的鍵值也要遷移。當然,這一過程,在目前實現中,還處於半自動狀態,需要人工介入。Redis叢集,要保證16384個槽對應的node都正常工作,如果某個node發生故障,那它負責的slots也就失效,整個叢集將不能工作。為了增加叢集的可訪問性,官方推薦的方案是將node配置成主從結構,即一個master主節點,掛n個slave從節點。這時,如果主節點失效,Redis Cluster會根據選舉演算法從slave節點中選擇一個上升為主節點,整個叢集繼續對外提供服務。這非常類似伺服器節點通過Sentinel監控架構成主從結構,只是Redis Cluster本身提供了故障轉移容錯的能力。

  • redis sharding
  • codis
  • twemproxy

支援的資料型別、常用命令、常用場景

String

預設儲存最大容量為512M

常用命令:setgetincrdecrappendstrlenmgetsetnx

  • set+get:快取、單點登入
  • bitmap:使用者上線次數統計
  • incr:計數器、限速器

List

有序,可重複

常用命令:lpushrpushlpoprpopllenlrangelremlset

  • lpush+lpop:Stack(棧)
  • lpush+rpop:Queue(佇列)
  • lpush+ltrim:Capped Collection(有限集合)
  • lpush+brpop:Message Queue(訊息佇列)
  • blpop:事件提醒(替代輪詢)

Hash

不支援資料型別的巢狀

適合儲存物件

常用命令:hsethget、[hmset](http://doc.redisfans.com/hash/hmset
,.html)、hmgethgetallhexistshincrbyhsetnxhdel

Set

無序、不重複

常用命令:saddsremsmemberssdiffsunionsinter

  • sadd:標籤
  • sinter:交集
  • sunion:並集

SortedSet

有序、不重複

常用命令:zaddzrange

  • zcount:統計資訊
  • zrevrange:排行榜

key

常用命令:expirettl

Script

常用命令:eval

Redis安裝

安裝

首先,到redis官網找到要安裝的redis版本,Redis下載頁,我們這裡選用v4.0.11,依次執行下面命令:

# wget http://download.redis.io/releases/redis-4.0.11.tar.gz
# tar xzf redis-4.0.11.tar.gz
# cd redis-4.0.11
# make

到此安裝完成,然後可以通過make test測試編譯狀態

# make test

無報錯完成編譯應該會有這樣的輸出:

報錯:需要tcl 8.5以上來執行redis test

You need tcl 8.5 or newer in order to run the Redis test
make: *** [test] Error 1

下面安裝tcl8.6.1

# wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz
# sudo tar xzvf tcl8.6.1-src.tar.gz
# cd tcl8.6.1/unix/
# sudo ./configure
# sudo make
# sudo make install 

再次執行make test,沒問題之後,執行最後一步,完成安裝:

# make install

直接啟動:

# ./redis-server ../redis.conf

後臺啟動redis,只需修改redis.conf配置檔案的daemonize yes,再次啟動即可。

安裝啟動相關命令

啟動redis伺服器:

# ./redis-server ../redis.conf

停止redis服務:

# ./redis-cli shutdown

連線本地啟動好的redis:

# redis-cli

根據ip埠連線redis:

# redis-cli -h 127.0.0.1 -p 6379

檢視當前是否設定了密碼

127.0.0.1:6379> config get requirepass
1) "requirepass"
2) ""

設定密碼

127.0.0.1:6379> config set requirepass 123456 //密碼是123456
OK

使用總結

關於key

  • 建議key不要太長,不要超過1024位元組,佔用記憶體且會降低查詢效率
  • 建議統一命名規則,例如:String:001:zhangsan:age

使用 bitmap 實現使用者上線次數統計

  Bitmap 對於一些特定型別的計算非常有效。

  假設現在我們希望記錄自己網站上的使用者的上線頻率,比如說,計算使用者 A 上線了多少天,使用者 B 上線了多少天,諸如此類,以此作為資料,從而決定讓哪些使用者參加 beta 測試等活動 —— 這個模式可以使用 SETBITBITCOUNT 來實現。

  比如說,每當使用者在某一天上線的時候,我們就使用 SETBIT ,以使用者名稱作為 key ,將那天所代表的網站的上線日作為 offset 引數,並將這個 offset 上的為設定為 1

  舉個例子,如果今天是網站上線的第 100 天,而使用者 peter 在今天閱覽過網站,那麼執行命令 SETBIT peter 100 1 ;如果明天 peter 也繼續閱覽網站,那麼執行命令 SETBIT peter 101 1 ,以此類推。

  當要計算 peter 總共以來的上線次數時,就使用 BITCOUNT 命令:執行 BITCOUNT peter ,得出的結果就是 peter 上線的總天數。

  更詳細的實現可以參考博文(牆外) Fast, easy, realtime metrics using Redis bitmaps

快取

快取一致性

  • 先更新庫資料,再刪除快取

快取擊穿和快取雪崩

分散式鎖的實現

setnx+lua實現

public class RedisTool {

    private static final String LOCK_SUCCESS = "OK";
    private static final String SET_IF_NOT_EXIST = "NX";
    private static final String SET_WITH_EXPIRE_TIME = "PX";
    private static final Long RELEASE_SUCCESS = 1L;

    // 獲取鎖
    public static boolean getLock(Jedis jedis, String lockKey, String requestId, int expireTime) {

        String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);

        if (LOCK_SUCCESS.equals(result)) {
            return true;
        }
        return false;

    }

	// 釋放鎖
    public static boolean releaseLock(Jedis jedis, String lockKey, String requestId) {

        String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
        Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));

        if (RELEASE_SUCCESS.equals(result)) {
            return true;
        }
        return false;
    }
}

搶紅包,秒殺的實現

incr+lua指令碼實現

參考連結:

http://doc.redisfans.com

https://blog.csdn.net/liqingtx/article/details/60330555

更多資訊可以關注我的個人部落格:逸竹小站

也歡迎關注我的公眾號:yizhuxiaozhan,二維碼: