Redis 基礎應用

Redis 基礎應用(一)html

==============================================================================程序員

概述:redis

  • Redis的相關介紹,功能,優點及於其餘key-value數據庫的對比;算法

  • Redis的安裝及程序環境;mongodb

  • 命令行客戶端命令數據庫

  • Redis 的數據結構
    vim

==============================================================================centos

Redis簡介

 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:主要解決海量數據的訪問效率問題

Redis安裝及數據結構

 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

Redis:k/v

 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 有序集合的基本命令:

序號 命令及描述
1 ZADD key score1 member1 [score2 member2] 
向有序集合添加一個或多個成員,或者更新已存在成員的分數
2 ZCARD key 
獲取有序集合的成員數
3 ZCOUNT key min max 
計算在有序集合中指定區間分數的成員數
4 ZINCRBY key increment member 
有序集合中對指定成員的分數加上增量 increment
5 ZINTERSTORE destination numkeys key [key ...] 
計算給定的一個或多個有序集的交集並將結果集存儲在新的有序集合 key 中
6 ZLEXCOUNT key min max 
在有序集合中計算指定字典區間內成員數量
7 ZRANGE key start stop [WITHSCORES] 
經過索引區間返回有序集合成指定區間內的成員
8 ZRANGEBYLEX key min max [LIMIT offset count] 
經過字典區間返回有序集合的成員
9 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 
經過分數返回有序集合指定區間內的成員
10 ZRANK key member 
返回有序集合中指定成員的索引
11 ZREM key member [member ...] 
移除有序集合中的一個或多個成員
12 ZREMRANGEBYLEX key min max 
移除有序集合中給定的字典區間的全部成員
13 ZREMRANGEBYRANK key start stop 
移除有序集合中給定的排名區間的全部成員
14 ZREMRANGEBYSCORE key min max 
移除有序集合中給定的分數區間的全部成員
15 ZREVRANGE key start stop [WITHSCORES] 
返回有序集中指定區間內的成員,經過索引,分數從高到底
16 ZREVRANGEBYSCORE key max min [WITHSCORES] 
返回有序集中指定分數區間內的成員,分數從高到低排序
17 ZREVRANK key member 
返回有序集合中指定成員的排名,有序集成員按分數值遞減(從大到小)排序
18 ZSCORE key member 
返回有序集中,成員的分數值
19 ZUNIONSTORE destination numkeys key [key ...] 
計算給定的一個或多個有序集的並集,並存儲在新的 key 中
20 ZSCAN key cursor [MATCH pattern] [COUNT count] 迭代有序集合中的元素(包括元素成員和元素分值)
相關文章
相關標籤/搜索