Redis 基礎應用(一)html
==============================================================================程序員
概述:redis
Redis的相關介紹,功能,優點及於其餘key-value數據庫的對比;算法
Redis的安裝及程序環境;mongodb
命令行客戶端命令數據庫
Redis 的數據結構
vim
==============================================================================centos
1.簡介緩存
★Redisbash
REmote DIctionary Server(Redis) 是一個由Salvatore Sanfilippo寫的 key-value存儲系統。
Redis是一個開源的使用ANSI C語言編寫、遵照BSD協議、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API。
它一般被稱爲數據結構服務器,由於值(value)能夠是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等類型。
☉REmote DIctionary Server(Redis)
內存存儲;
持久化;
主從;
Cluster
☉Redis 與其餘 key - value 緩存產品有如下三個特色:
Redis支持數據的持久化,能夠將內存中的數據保存在磁盤中,重啓的時候能夠再次加載進行使用。
Redis不只僅支持簡單的key-value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。
Redis支持數據的備份,即master-slave模式的數據備份。
2.功能
★支持的功能以下:
☉數據結構服務器:
值(value)能夠是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等類型。
☉單進程
CPU 並不是瓶頸
☉持久化機制
snapshoting
AOF
☉Replication
主從:
主:rw
從:read-only
3.優點
★優點
性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
豐富的數據類型 – Redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操做
原子 – Redis的全部操做都是原子性的,同時Redis還支持對幾個操做全並後的原子性執行。
豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過時等等特性。
4.Redis與其餘key-value存儲有什麼不一樣
★區別:
Redis有着更爲複雜的數據結構而且提供對他們的原子性操做,這是一個不一樣於其餘數據庫的進化路徑。Redis的數據類型都是基於基本數據結構的同時對程序員透明,無需進行額外的抽象。
Redis運行在內存中可是能夠持久化到磁盤,因此在對不一樣數據集進行高速讀寫時須要權衡內存,由於數據量不能大於硬件內存。在內存數據庫方面的另外一個優勢是,相比在磁盤上相同的複雜的數據結構,在內存中操做起來很是簡單,這樣Redis能夠作不少內部複雜性很強的事情。同時,在磁盤格式方面他們是緊湊的以追加的方式產生的,由於他們並不須要進行隨機訪問。
★和memcached的區別
Redis不只僅支持簡單的k/v類型的數據,同時還提供list,set,hash等數據結構的存儲。memcache僅支持字符串型值(流式化數據)
Redis爲單線程,Memcached爲多線程,但性能上至關;
Redis支持數據的備份,即master-slave模式的數據備份。
Redis支持數據的持久化,能夠將內存中的數據保持在磁盤中,重啓的時候能夠再次加載進行使用。(在Redis中,並非全部的數據都一直存儲在內存中的。這是和Memcached相比一個最大的區別)
應用場景不同:Redis出來做爲NoSQL數據庫使用外,還能用作消息隊列、數據堆棧和數據緩存等;Memcached適合於緩存SQL語句、數據集、用戶臨時性數據、延遲查詢數據和session等。
★redis、memcache、mongoDB 對比
從如下幾個維度,對redis、memcache、mongoDB 作了對比,歡迎拍磚
☉性能
都比較高,性能對咱們來講應該都不是瓶頸
整體來說,TPS方面redis和memcache差很少,要大於mongodb
☉操做的便利性
memcache數據結構單一
redis豐富一些,數據操做方面,redis更好一些,較少的網絡IO次數
mongodb支持豐富的數據表達,索引,最相似關係型數據庫,支持的查詢語言很是豐富
☉內存空間的大小和數據量的大小
redis在2.0版本後增長了本身的VM特性,突破物理內存的限制;能夠對key value設置過時時間(相似memcache)
memcache能夠修改最大可用內存,採用LRU算法
mongoDB適合大數據量的存儲,依賴操做系統VM作內存管理,吃內存也比較厲害,服務不要和別的服務在一塊兒
☉可用性(單點問題)
對於單點問題
redis,依賴客戶端來實現分佈式讀寫;主從複製時,每次從節點從新鏈接主節點都要依賴整個快照,無增量複製,因性能和效率問題,
因此單點問題比較複雜;不支持自動sharding,須要依賴程序設定一致hash 機制。
一種替代方案是,不用redis自己的複製機制,採用本身作主動複製(多份存儲),或者改爲增量複製的方式(須要本身實現),一致性問題和性能的權衡Memcache自己沒有數據冗餘機制,也不必;對於故障預防,採用依賴成熟的hash或者環狀的算法,解決單點故障引發的抖動問題。
mongoDB支持master-slave,replicaset(內部採用paxos選舉算法,自動故障恢復),auto sharding機制,對客戶端屏蔽了故障轉移和切分機制。
☉可靠性(持久化)
對於數據持久化和數據恢復,
redis支持(快照、AOF):依賴快照進行持久化,aof加強了可靠性的同時,對性能有所影響
memcache不支持,一般用在作緩存,提高性能;
MongoDB從1.8版本開始採用binlog方式支持持久化的可靠性
☉數據一致性(事務支持)
Memcache 在併發場景下,用cas保證一致性
redis事務支持比較弱,只能保證事務中的每一個操做連續執行
mongoDB不支持事務
☉數據分析
mongoDB內置了數據分析的功能(mapreduce),其餘不支持
☉應用場景
redis:數據量較小的更性能操做和運算上
memcache:用於在動態系統中減小數據庫負載,提高性能;作緩存,提升性能(適合讀多寫少,對於數據量比較大,能夠採用sharding)
MongoDB:主要解決海量數據的訪問效率問題
1.安裝及程序環境
★安裝方法:
編譯安裝
rpm包安裝
★程序環境
☉配置文件
/etc/redis.conf
/etc/redis-sentinel.conf
☉主程序
/usr/bin/redis-server
/usr/bin/redis-sentinel
監聽端口:6379/tcp
☉命令行客戶端
/usr/bin/redis-cli
演示:
1.安裝程序包
# 配置好epel倉庫 [root@centos7 ~]# yum install redis
2.程序環境以下:
[root@centos7 ~]# rpm -ql redis /etc/logrotate.d/redis /etc/redis-sentinel.conf /etc/redis.conf /etc/systemd/system/redis-sentinel.service.d /etc/systemd/system/redis-sentinel.service.d/limit.conf /etc/systemd/system/redis.service.d /etc/systemd/system/redis.service.d/limit.conf /usr/bin/redis-benchmark /usr/bin/redis-check-aof /usr/bin/redis-check-rdb /usr/bin/redis-cli /usr/bin/redis-sentinel /usr/bin/redis-server /usr/bin/redis-shutdown /usr/lib/systemd/system/redis-sentinel.service /usr/lib/systemd/system/redis.service /usr/lib/tmpfiles.d/redis.conf /usr/share/doc/redis-3.2.3 /usr/share/doc/redis-3.2.3/00-RELEASENOTES /usr/share/doc/redis-3.2.3/BUGS /usr/share/doc/redis-3.2.3/CONTRIBUTING /usr/share/doc/redis-3.2.3/MANIFESTO /usr/share/doc/redis-3.2.3/README.md /usr/share/licenses/redis-3.2.3 /usr/share/licenses/redis-3.2.3/COPYING /var/lib/redis /var/log/redis /var/run/redis
3.配置文件/etc/redis.conf 以下:
# 備份 [root@centos7 ~]# cp /etc/redis.conf{,.bak} [root@centos7 ~]# grep "^##" /etc/redis.conf ################################## INCLUDES ################################### ################################## NETWORK ##################################### ################################# GENERAL ##################################### ################################ SNAPSHOTTING ################################ ################################# REPLICATION ################################# ################################## SECURITY ################################### ################################### LIMITS #################################### ############################## APPEND ONLY MODE ############################### ################################ LUA SCRIPTING ############################### ################################ REDIS CLUSTER ############################### ################################## SLOW LOG ################################### ################################ LATENCY MONITOR ############################## ############################# EVENT NOTIFICATION ############################## ############################### ADVANCED CONFIG ############################### [root@centos7 ~]# vim /etc/redis.conf bind 0.0.0.0 # 修改綁定的端口 # 啓動 redis,查看堅挺的端口 6379 [root@centos7 ~]# systemctl start redis [root@centos7 ~]# ss -tnlp |grep "redis" LISTEN 0 128 *:6379 *:* users:(("redis-server",pid=3840,fd=4))
3.命令行客戶端命令
★redis-cli
☉語法:
redis-cli [OPTIONS] [cmd [arg [arg ...]]]
☉經常使用選項:
-h <hostname> Server hostname (default: 127.0.0.1). //主機地址
-p <port> Server port (default: 6379). //端口
-a <password> Password to use when connecting to the server. //密碼
演示:
1.本地鏈接,直接運行 redis-cli 命令便可
[root@centos7 ~]# redis-cli 127.0.0.1:6379> ping PONG
2.遠程鏈接,指明要鏈接的主機,端口和密碼便可
[root@centos7 ~]# redis-cli -h 192.168.1.112 192.168.1.112:6379> ping PONG 192.168.1.112:6379> help # 獲取幫助 redis-cli 3.2.3 To get help about Redis commands type: "help @<group>" to get a list of commands in <group> "help <command>" for help on <command> "help <tab>" to get a list of possible help topics "quit" to exit To set redis-cli perferences: ":set hints" enable online hints ":set nohints" disable online hints Set your preferences in ~/.redisclirc
1.k/v 和 group
★k/v
key:直接ASCII字符串;
value(數據結構):string,lists,hashes,set,sored sets,bltmaps,hyperloglog
★group
@string,@generic,@list @...
2.string(字符串)
★做用:
Redis 字符串數據類型的相關命令用於管理 redis 字符串值;
☉基本語法:
127.0.0.1:6379>COMMAND KEY_NAME
演示:
192.168.1.112:6379> SET count 1 OK 192.168.1.112:6379> GET count "1" 192.168.1.112:6379> INCR count (integer) 2 192.168.1.112:6379> INCR count (integer) 3 192.168.1.112:6379> INCR count (integer) 4 192.168.1.112:6379> INCR count (integer) 5 192.168.1.112:6379> DECR count (integer) 4 192.168.1.112:6379> DECR count (integer) 3 192.168.1.112:6379> DECR count (integer) 2 192.168.1.112:6379> DECR count (integer) 1
下表列出了經常使用的 redis 字符串命令:
序號 | 命令及描述 |
---|---|
1 | SET key value 設置指定 key 的值 |
2 | GET key 獲取指定 key 的值。 |
3 | GETRANGE key start end 返回 key 中字符串值的子字符 |
4 | GETSET key value 將給定 key 的值設爲 value ,並返回 key 的舊值(old value)。 |
5 | GETBIT key offset 對 key 所儲存的字符串值,獲取指定偏移量上的位(bit)。 |
6 | MGET key1 [key2..] 獲取全部(一個或多個)給定 key 的值。 |
7 | SETBIT key offset value 對 key 所儲存的字符串值,設置或清除指定偏移量上的位(bit)。 |
8 | SETEX key seconds value 將值 value 關聯到 key ,並將 key 的過時時間設爲 seconds (以秒爲單位)。 |
9 | SETNX key value 只有在 key 不存在時設置 key 的值。 |
10 | SETRANGE key offset value 用 value 參數覆寫給定 key 所儲存的字符串值,從偏移量 offset 開始。 |
11 | STRLEN key 返回 key 所儲存的字符串值的長度。 |
12 | MSET key value [key value ...] 同時設置一個或多個 key-value 對。 |
13 | MSETNX key value [key value ...] 同時設置一個或多個 key-value 對,當且僅當全部給定 key 都不存在。 |
14 | PSETEX key milliseconds value 這個命令和 SETEX 命令類似,但它以毫秒爲單位設置 key 的生存時間,而不是像 SETEX 命令那樣,以秒爲單位。 |
15 | INCR key 將 key 中儲存的數字值增一。 |
16 | INCRBY key increment 將 key 所儲存的值加上給定的增量值(increment) 。 |
17 | INCRBYFLOAT key increment 將 key 所儲存的值加上給定的浮點增量值(increment) 。 |
18 | DECR key 將 key 中儲存的數字值減一。 |
19 | DECRBY key decrement key 所儲存的值減去給定的減量值(decrement) 。 |
20 | APPEND key value 若是 key 已經存在而且是一個字符串, APPEND 命令將 value 追加到 key 原來的值的末尾。 |
3.list(列表)
★做用
Redis列表是簡單的字符串列表,按照插入順序排序。你能夠添加一個元素導列表的頭部(左邊)或者尾部(右邊)
一個列表最多能夠包含 232 - 1 個元素 (4294967295, 每一個列表超過40億個元素)。
演示:
192.168.1.112:6379> RPUSH mylist "mon" (integer) 1 192.168.1.112:6379> LINDEX mylist 0 "mon" 192.168.1.112:6379> RPUSH mylist "tun" (integer) 2 192.168.1.112:6379> LPUSH mylist "sun" (integer) 3 192.168.1.112:6379> LINDEX mylist 0 "sun" 192.168.1.112:6379> LINDEX mylist 0 "sun" 192.168.1.112:6379> LINDEX mylist 1 "mon" 192.168.1.112:6379> LINDEX mylist 2 "tun" 192.168.1.112:6379> RPOP mylist "tun" 192.168.1.112:6379> LLEN mylist (integer) 2
下表列出了列表相關的基本命令:
序號 | 命令及描述 |
---|---|
1 | BLPOP key1 [key2 ] timeout 移出並獲取列表的第一個元素, 若是列表沒有元素會阻塞列表直到等待超時或發現可彈出元素爲止。 |
2 | BRPOP key1 [key2 ] timeout 移出並獲取列表的最後一個元素, 若是列表沒有元素會阻塞列表直到等待超時或發現可彈出元素爲止。 |
3 | BRPOPLPUSH source destination timeout 從列表中彈出一個值,將彈出的元素插入到另一個列表中並返回它; 若是列表沒有元素會阻塞列表直到等待超時或發現可彈出元素爲止。 |
4 | LINDEX key index 經過索引獲取列表中的元素 |
5 | LINSERT key BEFORE|AFTER pivot value 在列表的元素前或者後插入元素 |
6 | LLEN key 獲取列表長度 |
7 | LPOP key 移出並獲取列表的第一個元素 |
8 | LPUSH key value1 [value2] 將一個或多個值插入到列表頭部 |
9 | LPUSHX key value 將一個或多個值插入到已存在的列表頭部 |
10 | LRANGE key start stop 獲取列表指定範圍內的元素 |
11 | LREM key count value 移除列表元素 |
12 | LSET key index value 經過索引設置列表元素的值 |
13 | LTRIM key start stop 對一個列表進行修剪(trim),就是說,讓列表只保留指定區間內的元素,不在指定區間以內的元素都將被刪除。 |
14 | RPOP key 移除並獲取列表最後一個元素 |
15 | RPOPLPUSH source destination 移除列表的最後一個元素,並將該元素添加到另外一個列表並返回 |
16 | RPUSH key value1 [value2] 在列表中添加一個或多個值 |
17 | RPUSHX key value 爲已存在的列表添加值 |
4.set(集合)
★做用:
Redis的Set是string類型的無序集合。集合成員是惟一的,這就意味着集合中不能出現重複的數據。
Redis 中 集合是經過哈希表實現的,因此添加,刪除,查找的複雜度都是O(1)。
集合中最大的成員數爲 232 - 1 (4294967295, 每一個集合可存儲40多億個成員)。
演示:
192.168.1.112:6379> SADD s1 'a' 'b' 'c' (integer) 3 192.168.1.112:6379> SMEMBERS s1 1) "c" 2) "b" 3) "a" 192.168.1.112:6379> SISMEMBER s1 'a' (integer) 1 192.168.1.112:6379> SISMEMBER s1 'c' (integer) 1 192.168.1.112:6379> SISMEMBER s1 'd' (integer) 0 192.168.1.112:6379> SADD s2 'a' 'c' 'd' 'f' (integer) 4 192.168.1.112:6379> SINTER s1 s2 1) "c" 2) "a" 192.168.1.112:6379> SUNION s1 s2 1) "f" 2) "a" 3) "b" 4) "d" 5) "c"
下表列出了 Redis 集合基本命令:
序號 | 命令及描述 |
---|---|
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] 返回集合中一個或多個隨機數 |
12 | SREM key member1 [member2] 移除集合中一個或多個成員 |
13 | SUNION key1 [key2] 返回全部給定集合的並集 |
14 | SUNIONSTORE destination key1 [key2] 全部給定集合的並集存儲在 destination 集合中 |
15 | SSCAN key cursor [MATCH pattern] [COUNT count] 迭代集合中的元素 |
5.hash(哈希)
★做用:
Redis hash 是一個string類型的field和value的映射表,hash特別適合用於存儲對象。
Redis 中每一個 hash 能夠存儲 232 - 1 鍵值對(40多億)。
演示:
192.168.1.112:6379> HSET h1 name taotao (integer) 1 192.168.1.112:6379> HSET h1 age 25 (integer) 1 192.168.1.112:6379> HGETALL h1 1) "name" 2) "taotao" 3) "age" 4) "25" 192.168.1.112:6379> HKEYS h1 1) "name" 2) "age" 192.168.1.112:6379> HVALS h1 1) "taotao" 2) "25" 192.168.1.112:6379> HGET h1 name "taotao" 192.168.1.112:6379> HGET h1 age "25"
下表列出了 redis hash 基本的相關命令:
序號 | 命令及描述 |
---|---|
1 | HDEL key field2 [field2] 刪除一個或多個哈希表字段 |
2 | HEXISTS key field 查看哈希表 key 中,指定的字段是否存在。 |
3 | HGET key field 獲取存儲在哈希表中指定字段的值。 |
4 | HGETALL key 獲取在哈希表中指定 key 的全部字段和值 |
5 | HINCRBY key field increment 爲哈希表 key 中的指定字段的整數值加上增量 increment 。 |
6 | HINCRBYFLOAT key field increment 爲哈希表 key 中的指定字段的浮點數值加上增量 increment 。 |
7 | HKEYS key 獲取全部哈希表中的字段 |
8 | HLEN key 獲取哈希表中字段的數量 |
9 | HMGET key field1 [field2] 獲取全部給定字段的值 |
10 | HMSET key field1 value1 [field2 value2 ] 同時將多個 field-value (域-值)對設置到哈希表 key 中。 |
11 | HSET key field value 將哈希表 key 中的字段 field 的值設爲 value 。 |
12 | HSETNX key field value 只有在字段 field 不存在時,設置哈希表字段的值。 |
13 | HVALS key 獲取哈希表中全部值 |
14 | HSCAN key cursor [MATCH pattern] [COUNT count] 迭代哈希表中的鍵值對。 |
6.sorted set(有序集合)
★做用:
Redis 有序集合和集合同樣也是string類型元素的集合,且不容許重複的成員。
不一樣的是每一個元素都會關聯一個double類型的分數。redis正是經過分數來爲集合中的成員進行從小到大的排序。
有序集合的成員是惟一的,但分數(score)卻能夠重複。
集合是經過哈希表實現的,因此添加,刪除,查找的複雜度都是O(1)。 集合中最大的成員數爲 232 - 1 (4294967295, 每一個集合可存儲40多億個成員)。
下表列出了 redis 有序集合的基本命令: