溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Redis 基礎應用

發布時間:2020-04-19 22:53:44 來源:網絡 閱讀:859 作者:逐夢小濤 欄目:數據庫

Redis 基礎應用(一)

==============================================================================

概述:

  • Redis的相關介紹,功能,優勢及于其他key-value數據庫的對比;

  • Redis的安裝及程序環境;

  • 命令行客戶端命令

  • Redis 的數據結構

==============================================================================

Redis簡介

 1.簡介

Redis

  • 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 字符串命令:

序號命令及描述
1SET key value 
設置指定 key 的值
2GET key 
獲取指定 key 的值。
3GETRANGE key start end 
返回 key 中字符串值的子字符
4GETSET key value
將給定 key 的值設為 value ,并返回 key 的舊值(old value)。
5GETBIT key offset
對 key 所儲存的字符串值,獲取指定偏移量上的位(bit)。
6MGET key1 [key2..]
獲取所有(一個或多個)給定 key 的值。
7SETBIT key offset value
對 key 所儲存的字符串值,設置或清除指定偏移量上的位(bit)。
8SETEX key seconds value
將值 value 關聯到 key ,并將 key 的過期時間設為 seconds (以秒為單位)。
9SETNX key value
只有在 key 不存在時設置 key 的值。
10SETRANGE key offset value
用 value 參數覆寫給定 key 所儲存的字符串值,從偏移量 offset 開始。
11STRLEN key
返回 key 所儲存的字符串值的長度。
12MSET key value [key value ...]
同時設置一個或多個 key-value 對。
13MSETNX key value [key value ...] 
同時設置一個或多個 key-value 對,當且僅當所有給定 key 都不存在。
14PSETEX key milliseconds value
這個命令和 SETEX 命令相似,但它以毫秒為單位設置 key 的生存時間,而不是像 SETEX 命令那樣,以秒為單位。
15INCR key
將 key 中儲存的數字值增一。
16INCRBY key increment
將 key 所儲存的值加上給定的增量值(increment) 。
17INCRBYFLOAT key increment
將 key 所儲存的值加上給定的浮點增量值(increment) 。
18DECR key
將 key 中儲存的數字值減一。
19DECRBY key decrement
key 所儲存的值減去給定的減量值(decrement) 。
20APPEND 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

下表列出了列表相關的基本命令:

序號命令及描述
1BLPOP key1 [key2 ] timeout 
移出并獲取列表的第一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。
2BRPOP key1 [key2 ] timeout 
移出并獲取列表的最后一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。
3BRPOPLPUSH source destination timeout 
從列表中彈出一個值,將彈出的元素插入到另外一個列表中并返回它; 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。
4LINDEX key index 
通過索引獲取列表中的元素
5LINSERT key BEFORE|AFTER pivot value 
在列表的元素前或者后插入元素
6LLEN key 
獲取列表長度
7LPOP key 
移出并獲取列表的第一個元素
8LPUSH key value1 [value2] 
將一個或多個值插入到列表頭部
9LPUSHX key value 
將一個或多個值插入到已存在的列表頭部
10LRANGE key start stop 
獲取列表指定范圍內的元素
11LREM key count value 
移除列表元素
12LSET key index value 
通過索引設置列表元素的值
13LTRIM key start stop 
對一個列表進行修剪(trim),就是說,讓列表只保留指定區間內的元素,不在指定區間之內的元素都將被刪除。
14RPOP key 
移除并獲取列表最后一個元素
15RPOPLPUSH source destination 
移除列表的最后一個元素,并將該元素添加到另一個列表并返回
16RPUSH key value1 [value2] 
在列表中添加一個或多個值
17RPUSHX 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 集合基本命令:

序號命令及描述
1SADD key member1 [member2] 
向集合添加一個或多個成員
2SCARD key 
獲取集合的成員數
3SDIFF key1 [key2] 
返回給定所有集合的差集
4SDIFFSTORE destination key1 [key2] 
返回給定所有集合的差集并存儲在 destination 中
5SINTER key1 [key2] 
返回給定所有集合的交集
6SINTERSTORE destination key1 [key2] 
返回給定所有集合的交集并存儲在 destination 中
7SISMEMBER key member 
判斷 member 元素是否是集合 key 的成員
8SMEMBERS key 
返回集合中的所有成員
9SMOVE source destination member 
將 member 元素從 source 集合移動到 destination 集合
10SPOP key 
移除并返回集合中的一個隨機元素
11SRANDMEMBER key [count] 
返回集合中一個或多個隨機數
12SREM key member1 [member2] 
移除集合中一個或多個成員
13SUNION key1 [key2] 
返回所有給定集合的并集
14SUNIONSTORE destination key1 [key2] 
所有給定集合的并集存儲在 destination 集合中
15SSCAN 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 h2 name taotao
(integer) 1
192.168.1.112:6379> HSET h2 age 25
(integer) 1
192.168.1.112:6379> HGETALL h2
1) "name"
2) "taotao"
3) "age"
4) "25"
192.168.1.112:6379> HKEYS h2
1) "name"
2) "age"
192.168.1.112:6379> HVALS h2
1) "taotao"
2) "25"
192.168.1.112:6379> HGET h2 name
"taotao"
192.168.1.112:6379> HGET h2 age
"25"

下表列出了 redis hash 基本的相關命令:

序號命令及描述
1HDEL key field2 [field2] 
刪除一個或多個哈希表字段
2HEXISTS key field 
查看哈希表 key 中,指定的字段是否存在。
3HGET key field 
獲取存儲在哈希表中指定字段的值。
4HGETALL key 
獲取在哈希表中指定 key 的所有字段和值
5HINCRBY key field increment 
為哈希表 key 中的指定字段的整數值加上增量 increment 。
6HINCRBYFLOAT key field increment 
為哈希表 key 中的指定字段的浮點數值加上增量 increment 。
7HKEYS key 
獲取所有哈希表中的字段
8HLEN key 
獲取哈希表中字段的數量
9HMGET key field1 [field2] 
獲取所有給定字段的值
10HMSET key field1 value1 [field2 value2 ] 
同時將多個 field-value (域-值)對設置到哈希表 key 中。
11HSET key field value 
將哈希表 key 中的字段 field 的值設為 value 。
12HSETNX key field value 
只有在字段 field 不存在時,設置哈希表字段的值。
13HVALS key 
獲取哈希表中所有值
14HSCAN key cursor [MATCH pattern] [COUNT count] 
迭代哈希表中的鍵值對。

 6.sorted set(有序集合)

作用:

  • Redis 有序集合和集合一樣也是string類型元素的集合,且不允許重復的成員。

  • 不同的是每個元素都會關聯一個double類型的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。

  • 有序集合的成員是唯一的,但分數(score)卻可以重復。

  • 集合是通過哈希表實現的,所以添加,刪除,查找的復雜度都是O(1)。 集合中最大的成員數為 232 - 1 (4294967295, 每個集合可存儲40多億個成員)。

下表列出了 redis 有序集合的基本命令:

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






向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女