1. Redis是什么、特點、優勢
Redis是一個開源的使用C語言編寫、開源、支持網絡、可基於內存亦可持久化的日志型、高性能的Key-Value數據庫,並提供多種語言的API。
它通常被稱為數據結構服務器,因為值(value)可以是 字符串(String)、哈希(Map)、 列表(list)、集合(sets) 和 有序集合(sorted sets)等類型。
Redis 與其他 key - value 緩存產品有以下三個特點:
- Redis支持數據的持久化,可以將內存中的數據保持在磁盤中,重啟的時候可以再次加載進行使用。
- Redis不僅僅支持簡單的key-value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。
- Redis支持數據的備份,即master-slave模式的數據備份。
Redis優勢
- 性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
- 豐富的數據類型 – Redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操作。
- 原子 – Redis的所有操作都是原子性的,同時Redis還支持對幾個操作全並后的原子性執行。
- 豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性。
2. Redis 的啟動與退出
[root@centoszang 桌面]# redis-cli Could not connect to Redis at 127.0.0.1:6379: Connection refused Could not connect to Redis at 127.0.0.1:6379: Connection refused not connected> exit [root@centoszang 桌面]# redis-server /etc/redis.conf [root@centoszang 桌面]# redis-cli 127.0.0.1:6379>
[root@centoszang 桌面]# redis-cli 127.0.0.1:6379> ping PONG 127.0.0.1:6379> set var helloWorld OK 127.0.0.1:6379> get var "helloWorld" 127.0.0.1:6379> del var (integer) 1 127.0.0.1:6379> get var (nil) 127.0.0.1:6379> quit [root@centoszang 桌面]#
redis命令不區分大小寫,所以get var和GET var是等價的
3. Redis key
Redis是key-value的數據庫,Redis的鍵用於管理Redis的鍵。主要命令如下:
序號 | Redis keys命令及描述 |
---|---|
1 | DEL key 該命令用於在 key 存在是刪除 key。 |
2 | DUMP key 序列化給定 key ,並返回被序列化的值。 |
3 | EXISTS key 檢查給定 key 是否存在。 |
4 | EXPIRE key seconds 為給定 key 設置過期時間。 |
5 | EXPIREAT key timestamp EXPIREAT 的作用和 EXPIRE 類似,都用於為 key 設置過期時間。 不同在於 EXPIREAT 命令接受的時間參數是 UNIX 時間戳(unix timestamp)。 |
6 | PEXPIRE key milliseconds 設置 key 的過期時間億以毫秒計。 |
7 | PEXPIREAT key milliseconds-timestamp 設置 key 過期時間的時間戳(unix timestamp) 以毫秒計 |
8 | KEYS pattern 查找所有符合給定模式( pattern)的 key 。例如keys * 返回所有的key |
9 | MOVE key db 將當前數據庫的 key 移動到給定的數據庫 db 當中。 |
10 | PERSIST key 移除 key 的過期時間,key 將持久保持。 |
11 | PTTL key 以毫秒為單位返回 key 的剩余的過期時間。 |
12 | TTL key 以秒為單位,返回給定 key 的剩余生存時間(TTL, time to live)。 |
13 | RANDOMKEY 從當前數據庫中隨機返回一個 key 。 |
14 | RENAME key newkey 修改 key 的名稱 |
15 | RENAMENX key newkey 僅當 newkey 不存在時,將 key 改名為 newkey 。 |
16 | TYPE key 返回 key 所儲存的值的類型。 |
4. Redis數據類型
Redis支持五種數據類型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
- string是最簡單的類型,你可以理解成與Memcached一模一個的類型,一個key對應一個value,其上支持的操作與Memcached的操作類似。但它的功能更豐富。
- Hash數據類型允許用戶用Redis存儲對象類型,Hash數據類型的一個重要優點是,當你存儲的數據對象只有很少幾個key值時,數據存儲的內存消耗會很小.
- list是一個鏈表結構,主要功能是push、pop、獲取一個范圍的所有值等等。操作中key理解為鏈表的名字。
- set是集合,和我們數學中的集合概念相似,對集合的操作有添加刪除元素,有對多個集合求交並差等操作。操作中key理解為集合的名字。
- zset是set的一個升級版本,他在set的基礎上增加了一個順序屬性,這一屬性在添加修改元素的時候可以指定,每次指定后,zset會自動重新按新的值調整順序。可以理解了有兩列的mysql表,一列存value,一列存順序。操作中key理解為zset的名字。
4.1 String(字符串)
- 是Redis最基本的數據類型,可以理解成與Memcached一模一樣的類型,一個key對應一個value
- 二進制安全的。意思是redis的string可以包含任何數據。比如jpg圖片或者序列化的對象
- 一個鍵最大能存儲512MB
利用set給變量var賦值“String type”;利用get獲得變量var的值
127.0.0.1:6379> set var1 "xiaofeng" OK 127.0.0.1:6379> get var1 "xiaofeng"
4.2 Hash(哈希)
- 是一個鍵值對集合
- 是一個string類型的field和value的映射表,hash特別適合用於存儲對象
hset,hget例子
127.0.0.1:6379> hset hash1 name "xiaoming" (integer) 1 127.0.0.1:6379> hset hash1 rank "first" (integer) 1 127.0.0.1:6379> hset hash2 name "dahuang" (integer) 1 127.0.0.1:6379> hset hash2 rank "second" (integer) 1 127.0.0.1:6379> hget hash1 rank "first"
hset&hget一次只能往哈希結構里面插入一個鍵值對,如果插入多個可以用hmset&hmget
hmset, hmget例子
127.0.0.1:6379> hmset hash3 name "fengge" rank "third" OK 127.0.0.1:6379> hmget hash3 (error) ERR wrong number of arguments for 'hmget' command 127.0.0.1:6379> hmget hash3 name 1) "fengge" 127.0.0.1:6379> hgetall hash3 1) "name" 2) "fengge" 3) "rank" 4) "third"
4.3 List(列表)
lpush往列表的前邊插入;lrange后面的數字是范圍(閉區間)
列表最多可存儲 232 - 1 元素 (4294967295, 每個列表可存儲40多億)。
127.0.0.1:6379> lpush list1 one (integer) 1 127.0.0.1:6379> lpush list1 two (integer) 2 127.0.0.1:6379> lpush list1 three (integer) 3 127.0.0.1:6379> lrange list1 (error) ERR wrong number of arguments for 'lrange' command 127.0.0.1:6379> lrange list1 0 10 1) "three" 2) "two" 3) "one"
redis 127.0.0.1:6379> LRANGE KEY_NAME START END
Redis Lrange 返回列表中指定區間內的元素,區間以偏移量 START 和 END 指定。 其中 0 表示列表的第一個元素, 1 表示列表的第二個元素,以此類推。 你也可以使用負數下標,以 -1 表示列表的最后一個元素, -2 表示列表的倒數第二個元素,以此類推。
4.4 Set(集合)
Redis的Set是string類型的無序集合。
集合是通過哈希表實現的,所以添加,刪除,查找的復雜度都是O(1)
set往集合中插入元素,smembers列舉出集合中的元素
成功插入返回1;錯誤插入返回0,例子中 two 第二次插入時,因已經存在,故插入失敗。
127.0.0.1:6379> sadd set1 one (integer) 1 127.0.0.1:6379> sadd set1 two (integer) 1 127.0.0.1:6379> sadd set1 two (integer) 0 127.0.0.1:6379> sadd set1 three (integer) 1 127.0.0.1:6379> SMEMBERS set1 1) "two" 2) "three" 3) "one"
4.5 zset(sorted sete:有序集合)
zset和set一樣也是String類型的集合,且不允許元素重復 , 用於將一個或多個成員元素及其分數值加入到有序集當中。
如果某個成員已經是有序集的成員,那么更新這個成員的分數值,並通過重新插入這個成員元素,來保證該成員在正確的位置上。
zset和set不同的地方在於zset關聯一個double類型的分數,redis通過分數對集合中的元素排序
zset的元素是唯一的,但是分數是可以重復的
127.0.0.1:6379> zadd zset1 1 one (integer) 1 127.0.0.1:6379> zadd zset1 2 two (integer) 1 127.0.0.1:6379> zadd zset1 3 three (integer) 1 127.0.0.1:6379> zadd zset1 3 three (integer) 0 127.0.0.1:6379> zadd zset1 4 three (integer) 0 127.0.0.1:6379> ZRANGE zset1 0 10 1) "one" 2) "two" 3) "three"
127.0.0.1:6379> zadd zset1 3 ttt (integer) 1 127.0.0.1:6379> ZRANGE zset1 0 10 1) "one" 2) "two" 3) "ttt" 4) "three"
成功插入返回1,否則返回0。插入已存在元素失敗--返回0
5. Redis HyperLogLog
Redis HyperLogLog是用來做基數統計的算法。優點是,在輸入元素的數量或者體積非常非常大時,計算基數所需的空間總是固定的、並且是很小的。
在 Redis 里面,每個 HyperLogLog 鍵只需要花費 12 KB 內存,就可以計算接近 2^64 個不同元素的基 數。這和計算基數時,元素越多耗費內存就越多的集合形成鮮明對比。
注:因為HyperLogLog只會根據輸入元素來計算基數,而不會存儲輸入元素本身,因此不會返回輸入的各個元素。
基數是什么?比如數據集 {1, 3, 5, 7, 5, 7, 8}, 那么這個數據集的基數集為 {1, 3, 5 ,7, 8}, 基數(不重復元素)為5。 基數估計就是在誤差可接受的范圍內,快速計算基數。
127.0.0.1:6379> pfadd zang money (integer) 1 127.0.0.1:6379> pfadd zang health (integer) 1 127.0.0.1:6379> pfadd zang handsome (integer) 1 127.0.0.1:6379> pfadd zang clever (integer) 1 127.0.0.1:6379> PFCOUNT zang (integer) 4
127.0.0.1:6379> pfadd key1 a b c d (integer) 1 127.0.0.1:6379> pfadd key2 a e f d (integer) 1 127.0.0.1:6379> PFMERGE key3 key1 key2 OK 127.0.0.1:6379> PFCOUNT key3 (integer) 6