1. 程式人生 > >我與狗子的日常3

我與狗子的日常3

move fail 插入數據 lis 虛擬內存 ber .gz car 名稱

Redis 進階之路

Redis安裝

redis簡介:

redis是NOSQL(not only sql,非關系型數據庫)的一種,NoSQL是以Key-Value的形式存儲數據,當前主流的分布式緩存技術有Redis, memcached,ssdb,mongodb 等。可以把redis理解為緩存技術,因為它的數據都是緩存在內存中,也可以理解為數據庫,因為redis可以周期性的將數據寫入磁盤或者把操作追加到記錄文件中。

redis與其他key-value的緩存產品相比有以下三個特點:

1.Redis支撐數據的持久化,可以將內存中的數據保存在磁盤中,重啟的時候可以再次加載進行使用。

2.Redis不僅僅支持簡單的key-value類型的數據,同時還提供list set zset hash等數據結構的存儲。

3.Redis支持數據的備份,即master-slave模式的數據備份。

優點:

性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s。

豐富的數據類型 – Redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操作

原子 – Redis的所有操作都是原子性的,意思就是要麽成功執行要麽失敗完全不執行。單個操作是原子性的。多個操作也支持事務,即原子性,通過MULTI和EXEC指令包起來

豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性

Linux 下安裝redis

編譯源程序:

[root@localhost ftpuser]# tar zxvf redis-3.2.0.tar.gz

[root@localhost ftpuser]# cd redis-3.2.0

[root@localhost redis-3.2.0]# make

[root@localhost redis-3.2.0]# cd src && make install

創建目錄存放redis命令和配置文件

[root@localhost redis-3.2.0]# mkdir -p /usr/local/redis/bin

[root@localhost redis-3.2.0]# mkdir -p /usr/local/redis/etc

移動文件:

[root@localhost redis-3.2.0]# mv redis.conf /usr/local/redis/etc

[root@localhost redis-3.2.0]# cd src

[root@localhost src]# mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server redis-sentinel redis-trib.rb /usr/local/redis/bin

啟動redis:

[root@localhost ~]# /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf

驗證是否啟動成功:

[root@localhost ~]# ps -ef | grep redis

#或者

[root@localhost ~]# netstat -tunpl | grep 6379

Redis客戶端連接:

[root@localhost ~]# /usr/local/redis/bin/redis-cli -h 192.168.2.128 -p 6379

192.168.2.128:6379> info

# Server

redis_version:3.2.0

redis_git_sha1:00000000

停止redis:

[root@localhost ~]# /usr/local/redis/bin/redis-cli shutdown

#或者

[root@localhost ~]# pkill redis-server

redis數據結構(內存模型)及常用命令

redis數據類型:

redis支持的數據類型有五種:String、List、Hash、Set和Sorted Set.

Redis 數據類型內存結構分析:

Redis內部使用一個RedisObject對象來表示所有的key和value,redisObject主要的信息包括數據類型type 編碼方式encoding 數據指針ptr 虛擬內存vm 等。type表示value的數據類型。

String:是最常用的一種數據類型,普通的key/value存儲都可以歸為此類。

string類型的值最大能存儲512MB

1. SET key value

設置指定 key 的值

2. GET key
獲取指定 key 的值。

3. GETSET key value
將給定 key 的值設為 value ,並返回 key 的舊值(old value)。

4. SETEX key seconds value
將值 value 關聯到 key ,並將 key 的過期時間設為 seconds (以秒為單位)。

5.SETNX key value
只有在 key 不存在時設置 key 的值。

6. STRLEN key
返回 key 所儲存的字符串值的長度。

Hash:redis hash是一個鍵值對集合 string類型的field 和 value的映射表,hash特別適合用於存儲對象。

每個 hash可以存儲232-1 個鍵值對(40多億)

1. HDEL key field1 [field2]
刪除一個或多個哈希表字段

2. HEXISTS key field
查看哈希表 key 中,指定的字段是否存在。

3. HGET key field
獲取存儲在哈希表中指定字段的值。

4. HGETALL key
獲取在哈希表中指定 key 的所有字段和值

5. HKEYS key
獲取所有哈希表中的字段

6. HLEN key
獲取哈希表中字段的數量

7. HMSET key field1 value1 [field2 value2 ]
同時將多個 field-value (域-值)對設置到哈希表 key 中。

8. HSET key field value
將哈希表 key 中的字段 field 的值設為 value 。

9. HSETNX key field value
只有在字段 field 不存在時,設置哈希表字段的值。

10. HVALS key
獲取哈希表中所有值

11. HSCAN key cursor [MATCH pattern] [COUNT count]
叠代哈希表中的鍵值對。

List:Redis列表是簡單的字符串列表。按照插入順序排序。

插入數據:Lpush 列表名 value

查詢數據:lrange 列表 0 10

List 最多可存儲232-1 個元素

1. BLPOP key1 [key2 ] timeout
移出並獲取列表的第一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。

2. BRPOP key1 [key2 ] timeout
移出並獲取列表的最後一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。

3. LINDEX key index
通過索引獲取列表中的元素

4. LLEN key
獲取列表長度

5. LPOP key
移出並獲取列表的第一個元素

6. LPUSH key value1 [value2]
將一個或多個值插入到列表頭部

7. LSET key index value
通過索引設置列表元素的值

8. LTRIM key start stop
對一個列表進行修剪(trim),就是說,讓列表只保留指定區間內的元素,不在指定區間之內的元素都將被刪除。

9. RPOP key
移除並獲取列表最後一個元素

10. RPUSH key value1 [value2]
在列表中添加一個或多個值

11. RPUSHX key value
為已存在的列表添加值

Set:Redis的set是string 類型的無序集合 set集合是通過哈希表實現的,所以添加刪除查找的復雜度都是O(1)。

Sadd: 添加一個key到對應的set集合,返回1表示成功,返回0表示元素已存在集合中。如果key對應的集合不存在,則返回錯誤。

Set集合的最大成員是數為232-1 個元素。

1. SADD key member1 [member2]
向集合添加一個或多個成員

2. SCARD key
獲取集合的成員數

3. SDIFF key1 [key2]
返回給定所有集合的差集

4. SDIFFSTORE destination key1 [key2]
返回給定所有集合的差集並存儲在 destination 中

5. SINTER key1 [key2]
返回給定所有集合的交集

6. SINTERSTORE destination key1 [key2]
返回給定所有集合的交集並存儲在 destination 中

7. SISMEMBER key member
判斷 member 元素是否是集合 key 的成員

8. SMEMBERS key
返回集合中的所有成員

9. SMOVE source destination member
將 member 元素從 source 集合移動到 destination 集合

10. SPOP key
移除並返回集合中的一個隨機元素

11. SRANDMEMBER key [count]
返回集合中一個或多個隨機數

ZSet:有序結合 Zset的每個元素都會關聯一個double類型的分數,redis正是通過分數來為集合的成員進行從小到大的排序,Zset的成員是唯一的,但分數可以重復。

1. ZADD key score1 member1 [score2 member2]
向有序集合添加一個或多個成員,或者更新已存在成員的分數

2.ZCARD key
獲取有序集合的成員數

3. ZCOUNT key min max
計算在有序集合中指定區間分數的成員數

4. ZRANK key member
返回有序集合中指定成員的索引

5. ZSCORE key member
返回有序集中,成員的分數值

6. ZREVRANGEBYSCORE key max min [WITHSCORES]
返回有序集中指定分數區間內的成員,分數從高到低排序

Redis鍵

Redis鍵命令的基本語法如下:

Command key_name

1.del key:當key存在時,刪除key

2.dump key: 序列化key,並返回被序列化的值

3.exists key: 檢查key是否存在

4.expire key seconds:為key設置過期時間

5.keys pattern: 查找所有符合給定模式的key

6.move key db: 將當前的數據庫的key移動到給定的數據db中

7.persist key:移除key的過期時間,key將持久保持

8.randomkey:從當前數據庫隨機返回一個key

9.rename key newkey:修改key的名稱

10.renamenx key newkey: 僅當newkey 不存在時,將key改名為newkey

11.type key:返回key所存儲的的類型

Redis 事務

Redis事務可以一次執行多個命令

批量操作再發送EXEC命令前被放入隊列緩存;

收到EXEC命令後進入事務執行,事務中任意命令執行失敗,其余的命令依然被執行;

在事務執行過程中,其他客戶端提交的命令請求不會插入到事務執行的命令序列中;

一個事務從開始到執行的三個階段:

開始事務à命令入隊à執行事務

原子性:

單個Redis命令的執行是原子性的,但Redis在事務上沒有增加任何維持原子性的機制,所以Redis事務的執行並不是原子性的。

Redis官網的說明:

It‘s important to note that even when a command fails, all the other commands in the queue are processed – Redis will not stop the processing of commands.

Eg:

multi

set a aaa

set b bbb

set c ccc

exec

如果set b bbb 失敗了,則set a aaa 不會回滾,set c ccc 還會繼續執行

Redis 事務命令:

DISCARD 取消事務,放棄執行事務塊內的所有命令

EXEC 執行所有事務塊內的命令

MULTI 標記一個事務塊的開始

UNWATCH 取消WATCH 命令對所有key的監視

WATCH KEY[ KEY…..] 監視一個或多個key,如果在事務執行之前這些key被其他命令所改動,那麽事務將被打斷。

我與狗子的日常3