一、NoSql
1.NoSql
NoSql(not only SQL)。是一種全新的數據庫理念,泛指非關係型數據庫
隨着web2.0的興起,關係型數據庫對於超大規模和高併發的SNS類型的web2.0純動態網站已經顯得力不從心,而非關係型數據庫則滿足三個特點:
1)High performance——高併發讀寫
2)Huge Storage——對海量數據的高效率存儲和訪問
3)High Scalability && High Availability ——高可拓展性和高可用性
2.主流NoSql產品
Redis MongoDB 等
3.Nosql數據庫的四大分類
1)鍵值(key-value)存儲數據庫
相關產品:Redis、TokyoCabinet/Tyrant
典型應用:內容緩存,主要用於處理大量數據的高訪問負載
數據模型:一系列鍵值對
優勢:快速查詢
劣勢:存儲的數據缺少結構化
2)列存儲數據庫
相關產品:Casssandra、HBase,Riak
典型應用:分佈式的文件系統
數據模型:以列簇式存儲,將同一列數據存在一起
優勢:查找速度快,可拓展性強,容易進行分佈式擴展
劣勢:功能相對侷限
3)文檔型數據庫
相關產品:CouchDB、MongoDB
典型應用:Web應用(與key-value類似,Value是結構化的)
數據模型:一系列鍵值對
優勢:數據結構要求不嚴格
劣勢:查詢性能不高,而且缺乏統一的查詢語法
4)圖形(Graph)數據庫
相關產品:Neo4J、InfoGrid
典型應用:社交網絡
數據模型:圖結構
優勢:利用圖結構相關算法
劣勢:需要對整個圖做計算才能得出結果,不容易做分佈式的集羣方案
4.NoSql的特點:
在大數據存取上具備關係型數據庫無法比擬的性能優勢,例如:
1)易拓展
2)大數據量,高性能
3)靈活的數據模型
4)高可用
二:Redis
1.Redis是用C語言開發的一個開源的高性能鍵值對數據庫,它通過提供多種鍵值數據類型來適應不同場景下的存儲需求,目前爲止Redis支持的鍵值數據類型如下:
1)字符串類型
2)散列類型
3)列表類型
4)集合類型
5)有序集合類型
2.應用場景:
緩存(最多)
聊天室的在線好友列表
任務隊列(秒殺、搶購等)
應用排行榜
網站訪問統計
數據過期處理(可以精確到毫秒)
分佈式集羣結構中的session分離
3.Redis方法
Object get(String key); //獲取數據
void set(String key , Object value); //插入數據
三、Jedis
Redis不僅是使用命令來操作,現在基本上主流的語言都有客戶端支持,比如Java、C、C++、C#、php、Node.js、Go等
Java中常用的是Jedis
1.Java連接Redis(先導包)
1)獲得單一的jedis對象操作數據庫
@Test
public void test1() {
//1.獲得連接對象
//如果你的Redis客戶端沒有設置訪問密碼的話,可以直接使用下面的構造方法,如果設置了密碼,則使用JedisShardInfo 對象來設置訪問配置
// Jedis jedis = new Jedis("192.168.0.1", 6379);
JedisShardInfo shardInfo = new JedisShardInfo("redis://192.168.0.1:6379");//這裏是連接的本地地址和端口
shardInfo.setPassword("123456");//這裏是密碼
Jedis jedis = new Jedis(shardInfo);
//2.獲得數據
String username = jedis.get("username");
System.out.println(username);
//3.存儲數據
jedis.set("addr", "南京") ;
System.out.println(jedis.get("addr"));
}
2)連接池連接
@Test
public void test2() {
//0.創建池子的配置對象
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxIdle(30); //最大閒置個數,超過30個閒置的就開始關
poolConfig.setMinIdle(10); //最小閒置個數,最少保持有10個是閒置的,低於10個的時候就開始增
poolConfig.setMaxTotal(50); //最大連接數
//1.創建一個redis連接池
/**
* JedisPool(GenericObjectPoolConfig poolConfig, String host, int port, int timeout, String password)
* poolConfig:連接池配置對象
* host:連接ip
* port:端口號,通常爲6379
* timeout:連接超時時間,單位 毫秒
* password:連接密碼
*/
JedisPool pool = new JedisPool(poolConfig, "192.168.0.1", 6379,2000,"123456");
//2.從池子中獲取redis的連接資源
Jedis jedis = pool.getResource();
//3.操作數據庫
jedis.set("age", "23");
System.out.println(jedis.get("age"));
//4.關閉資源
jedis.close();
pool.close(); //日常使用並不用關閉連接池
}
類似數據庫的連接池,Redis的連接代碼也可以提取爲一個簡單工具類,具體配置參數放在一個properties文件中,具體代碼如下:
工具類:
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisPoolUtils {
private static JedisPool pool = null;
static {
//配置對象不用每次都創建,只需要創建一次,因此寫在靜態代碼區域
//配置信息寫在配置文件中,方便統一管理
//加載配置文件
InputStream redisResource = JedisPoolUtils.class.getClassLoader().getResourceAsStream("redis.properties");
Properties pro = new Properties();
try {
pro.load(redisResource);
} catch (IOException e) {
e.printStackTrace();
}
//0.創建池子的配置對象
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxIdle(Integer.parseInt(pro.get("redis.maxIdle").toString())); //最大閒置個數,超過30個閒置的就開始關
poolConfig.setMinIdle(Integer.parseInt(pro.get("redis.minIdle").toString())); //最小閒置個數,最少保持有10個是閒置的,低於10個的時候就開始增
poolConfig.setMaxTotal(Integer.parseInt(pro.get("redis.maxTotal").toString())); //最大連接數
//1.創建一個redis連接池
/**
* JedisPool(GenericObjectPoolConfig poolConfig, String host, int port, int timeout, String password)
* poolConfig:連接池配置對象
* host:連接ip
* port:端口號,通常爲6379
* timeout:連接超時時間,單位 毫秒
* password:連接密碼
*/
pool = new JedisPool(poolConfig, pro.get("redis.url").toString(), Integer.parseInt(pro.get("redis.port").toString()),Integer.parseInt(pro.get("redis.timeout").toString()),pro.get("redis.password").toString());
}
//獲取連接資源方法
public static Jedis getResource() {
return pool.getResource();
}
}
//其他方法
配置文件redis.properties(創建在src下):
redis.maxIdle=30
redis.minIdle=10
redis.maxTotal=100
redis.url=192.168.0.1
redis.port=6379
redis.timeout=2000
redis.password=123456
@Test
public void test2() {
//2.從池子中獲取redis的連接資源
Jedis jedis = JedisPoolUtils.getResource();
//3.操作數據庫
jedis.set("age", "23");
System.out.println(jedis.get("age"));
//4.關閉資源
jedis.close();
}
5.Redis數據結構
1)Redis是一種高級的key-value的存儲系統,其中value支持五中數據類型
字符串(String)
哈希(hash)
字符串列表(list)
字符串集合(set)
有序字符串集合(sorted set)
2)關於key的定義,需要注意以下:
1.key不要太長,最好不要超過1024個字節,這不僅會消耗內存還會降低查詢效率
2.key不要太短,如果太短會降低key的可讀性
3.在項目中,key最好有一個統一的命名規範
5.1 存儲String
字符串類型是Redis中最爲基礎的數據存儲類型,它在Redis中是二進制安全的,這 便意味着該類型可以接受任何格式的數據,如JPEG圖像數據或Json對象描述信息等。 在Redis中字符串類型的Value最多可以容納的數據長度是512M。
常用命令:
1)賦值
set key value:設定key持有指定的字符串value,如果該key存在則進行覆蓋操作。總是返回”OK
2)取值
get key:獲取key的value。如果與該key關聯的value不是String類型,redis將返回錯誤信息,因爲get命令只能用於獲取String value;如果該key不存在,返回null。
getset key value:先獲取該key的值,然後在設置該key的值
3)刪除
del key :刪除指定的key
4)數值增減
incr key:將指定的key的value原子性的遞增1.如果該key不存在,其初始值 爲0,在incr之後其值爲1。如果value的值不能轉成整型,如hello,該操作將執 行失敗並返回相應的錯誤信息。
decr key:將指定的key的value原子性的遞減1.如果該key不存在,其初始值爲0,在incr之後其值爲-1。如果value的值不能轉成整型,如hello,該操作將執 行失敗並返回相應的錯誤信息。
incrby key increment:將指定的key的value原子性增加increment,如果該 key不存在,器初始值爲0,在incrby之後,該值爲increment。如果該值不能轉成 整型,如hello則失敗並返回錯誤信息
decrby key decrement:將指定的key的value原子性減少decrement,如果 該key不存在,器初始值爲0,在decrby之後,該值爲decrement。如果該值不能 轉成整型,如hello則失敗並返回錯誤信息
騰訊雲服務器redis:0>set username zhangsan
"OK"
騰訊雲服務器redis:0>get username
"zhangsan"
騰訊雲服務器redis:0>getset username lisi
"zhangsan"
騰訊雲服務器redis:0>get username
"lisi"
騰訊雲服務器redis:0>del age
"0"
騰訊雲服務器redis:0>del username
"1"
騰訊雲服務器redis:0>set username zhang
"OK"
騰訊雲服務器redis:0>set age 25
"OK"
騰訊雲服務器redis:0>incr age
"26"
騰訊雲服務器redis:0>decr age
"25"
騰訊雲服務器redis:0>incrby age 10
"35"
騰訊雲服務器redis:0>decrby age 5
"30"
5.2 存儲hash
Redis中的Hashes類型可以看成具有String Key和String Value的map容器。所以該類型非常適合於存儲值對象的信息。如Username、Password和Age等。如果Hash中包含很少的字段,那麼該類型的數據也將僅佔用很少的磁盤空間。每一個Hash可以存儲4294967295個鍵值對。
常用命令:
1)賦值
hset key field value:爲指定的key設定field/value對(鍵值對)
hmset key fields:設置key中的多個filed/value
2)取值
hgetall key:獲取key中的所有filed-vaule
hmget key fileds:獲取key中的多個filed的值
hget key field:返回指定的key中的field的值
3)刪除
del key:刪除指定key
hdel key field1 field2 filed3…:可以刪除一個或多個字段,返回值是被刪除的字段的個數
4)增加數字
hincrby key field increment:設置key中filed的值增加increment,如:age增加20,如果是負數則是減
5)其他
hexists key field:判斷指定的key中的filed是否存在
hlen key:獲取key所包含的field的數量
hkeys key :獲得所有的key
hvals key:獲得所有的value
騰訊雲服務器redis:0> hset myhash name zhangsan
"1"
騰訊雲服務器redis:0>hmset myhash age 25 addr nanjing
"OK"
騰訊雲服務器redis:0>hgetall myhash
1) "name"
2) "zhangsan"
3) "age"
4) "25"
5) "addr"
6) "nanjing"
騰訊雲服務器redis:0>hmget myhash name age
1) "zhangsan"
2) "25"
騰訊雲服務器redis:0>hget myhash addr
"nanjing"
騰訊雲服務器redis:0>hdel myhash age addr
"2"
騰訊雲服務器redis:0>hgetall myhash
1) "name"
2) "zhangsan"
騰訊雲服務器redis:0>hmset myhash age 18 addr beijing
"OK"
騰訊雲服務器redis:0>hincrby myhash age 20
"38"
騰訊雲服務器redis:0>hincrby myhash age -15
"23"
騰訊雲服務器redis:0>hexists myhash name
"1"
騰訊雲服務器redis:0>hexists myhash username
"0"
騰訊雲服務器redis:0>hlen myhash
"3"
騰訊雲服務器redis:0>hkeys myhash
1) "name"
2) "age"
3) "addr"
騰訊雲服務器redis:0>hvals myhash
1) "zhangsan"
2) "23"
3) "beijing"
5.3存儲list
在Redis中,List類型是按照插入順序排序的字符串鏈表。和數據結構中的普通鏈表一樣,我們可以在其頭部(left)和尾部(right)添加新的元素。在插入時,如果該鍵並不存在,Redis將爲該鍵創建一個新的鏈表。與此相反,如果鏈表中所有的元素均被移除,那麼該鍵也將會被從數據庫中刪除。List中可以包含的最大元素數量是 4294967295。
從元素插入和刪除的效率視角來看,如果我們是在鏈表的兩頭插入或刪除元素,這將會是非常高效的操作,即使鏈表中已經存儲了百萬條記錄,該操作也可以在常量時間內完成。然而需要說明的是,如果元素插入或刪除操作是作用於鏈表中間,那將會是非常低效的。相信對於有良好數據結構基礎的開發者而言,這一點並不難理解。
常用命令:
1)兩端添加:
lpush key value1 value2…:在指定的key所關聯的list的頭部插入所有的values,如果該key不存在,該命令在插入的之前創建一個與該key關聯的空鏈表,之後再向該鏈表的頭部插入數據。插入成功,返回元素的個數。
rpush key value1、value2…:在該list的尾部添加元素
2)查看鏈表
lrange key start end:獲取鏈表中從start到end的元素的值,start、end可爲負數,若爲-1則表示鏈表尾部的元素,-2則表示倒數第二個,依次類推…從左向右爲0到N,從右到左爲-1到-N;start爲0且end爲-1表示從頭查到尾;
3)兩端彈出
lpop key:返回並彈出指定的key關聯的鏈表中的第一個元素,即頭部元素。
rpop key:從尾部彈出元素。
4)獲取元素個數
llen key:返回指定的key關聯的鏈表中的元素的數量。
5)其他
lpushx key value:僅當參數中指定的key存在時(如果與key管理的list中沒有值時,則該key是不存在的)在指定的key所關聯的list的頭部插入value。
rpushx key value:在該list的尾部添加元素
lrem key count value:刪除count個值爲value的元素,如果count大於0,從頭向尾遍歷並刪除count個值爲value的元素,如果count小於0,則從尾向頭遍歷並刪除。如果count等於0,則刪除鏈表中所有等於value的元素。
lset key index value:設置鏈表中的index的腳標的元素值,0代表鏈表的頭元素,-1代表鏈表的尾元素。
linsert key before|after pivot value:在pivot元素前或者後插入value這個元素。
rpoplpush resource destination:將鏈表中的尾部元素彈出並添加到頭部
注:rpoplpush的使用場景:Redis經常被用於消息隊列的服務,以完成多個程序之間的信息交換,假設一個應用程序正在執行lpush操作向鏈表中添加新元素,我們通常將這樣的程序稱之爲“生產者(Producer)”,而另一個應用程序正在執行rpop操作從鏈表中取出元素,我們稱這樣的程序爲“消費者(Consumer)”。如果此時消費者在取出元素後立即崩潰,由於該消息已經被取出且沒有被正常處理,那我們就可以認爲該消息已經丟失,由此可能導致業務數據丟失,或業務狀態的不一致現象的發生。然而通過使用rpoplpush命令,消費者程序在從消息隊列中取出消息之後再將其插入到備份隊列中,直到消費者程序在完成正常的邏輯處理後再將該消息從備份隊列中刪除。同時我們還可以提供一個守護進程,當發現備份隊列中的消息過期時,可以重新將其再放回到主消息隊列中,以便其他消費程序使用。
騰訊雲服務器redis:0>lrange mylist 0 -1
1) "3"
2) "2"
3) "1"
4) "c"
5) "b"
6) "a"
騰訊雲服務器redis:0>lrange mylist 0 3
1) "3"
2) "2"
3) "1"
4) "c"
騰訊雲服務器redis:0>lpop mylist
"3"
騰訊雲服務器redis:0>lrange mylist 0 -1
1) "2"
2) "1"
3) "c"
4) "b"
5) "a"
騰訊雲服務器redis:0>rpop mylist
"a"
騰訊雲服務器redis:0>lrange mylist 0 -1
1) "2"
2) "1"
3) "c"
4) "b"
騰訊雲服務器redis:0>llen mylist
"4"
騰訊雲服務器redis:0>lpushx mylist a
"5"
騰訊雲服務器redis:0>lrange mylist 0 -1
1) "a"
2) "2"
3) "1"
4) "c"
5) "b"
騰訊雲服務器redis:0>lpushx yourlist a
"0"
騰訊雲服務器redis:0>rpushx mylist 5 6 7
"8"
騰訊雲服務器redis:0>lrange mylist 0 -1
1) "a"
2) "2"
3) "1"
4) "c"
5) "b"
6) "5"
7) "6"
8) "7"
騰訊雲服務器redis:0>rpushx mylist 1 2 2 1 3 4 5
"15"
騰訊雲服務器redis:0>lrange mylist 0 -1
1) "a"
2) "2"
3) "1"
4) "c"
5) "b"
6) "5"
7) "6"
8) "7"
9) "1"
10) "2"
11) "2"
12) "1"
13) "3"
14) "4"
15) "5"
騰訊雲服務器redis:0>lrem mylist 2 1
"2"
騰訊雲服務器redis:0>lrange mylist 0 -1
1) "a"
2) "2"
3) "c"
4) "b"
5) "5"
6) "6"
7) "7"
8) "2"
9) "2"
10) "1"
11) "3"
12) "4"
13) "5"
騰訊雲服務器redis:0>lrem mylist -2 2
"2"
騰訊雲服務器redis:0>lrange mylist 0 -1
1) "a"
2) "2"
3) "c"
4) "b"
5) "5"
6) "6"
7) "7"
8) "1"
9) "3"
10) "4"
11) "5"
騰訊雲服務器redis:0>lset mylist 3 d
"OK"
騰訊雲服務器redis:0>lrange mylist 0 -1
1) "a"
2) "2"
3) "c"
4) "d"
5) "5"
6) "6"
7) "7"
8) "1"
9) "3"
10) "4"
11) "5"
騰訊雲服務器redis:0>linsert mylist after d e
"12"
騰訊雲服務器redis:0>lrange mylist 0 -1
1) "a"
2) "2"
3) "c"
4) "d"
5) "e"
6) "5"
7) "6"
8) "7"
9) "1"
10) "3"
11) "4"
12) "5"
騰訊雲服務器redis:0>lpush mylist2 1 2 3
"3"
騰訊雲服務器redis:0>lpush mylist3 a b c
"3"
騰訊雲服務器redis:0>rpoplpush mylist2 mylist3
"1"
騰訊雲服務器redis:0>lrange mylist2 0 -1
1) "3"
2) "2"
騰訊雲服務器redis:0>lrange mylist3 0 -1
1) "1"
2) "c"
3) "b"
4) "a"
5.4 存儲set
在Redis中,我們可以將Set類型看作爲沒有排序的字符集合,和List類型一樣,我 們也可以在該類型的數據值上執行添加、刪除或判斷某一元素是否存在等操作。需要說明的是,這些操作的時間是常量時間。Set可包含的最大元素數是4294967295。
和List類型不同的是,Set集合中不允許出現重複的元素。和List類型相比,Set類 型在功能上還存在着一個非常重要的特性,即在服務器端完成多個Sets之間的聚合計 算操作,如unions、intersections和differences。由於這些操作均在服務端完成, 因此效率極高,而且也節省了大量的網絡IO開銷
常用命令:
1)添加/刪除元素
sadd key value1、value2…:向set中添加數據,如果該key的值已有則不會重複添加
srem key member1、member2…:刪除set中指定的成員
2)獲取元素
smembers key:獲取set中所有的成員
sismember key member:判斷參數中指定的成員是否在該set中,1表示存 在,0表示不存在或者該key本身就不存在
3)集合的交併差運算
sinter key[key1,key2…]:返回交集
sunion key1、key2:返回並集
sdiff key1 key2:返回key1與key2中相差的成員,而且與key的順序有關。即返回差集。
sinterstore destination key1 key2:將返回的交集存儲在destination上
sunionstore destination key1 key2:將返回的並集存儲在destination上
sdiffstore destination key1 key2:將key1、key2相差的成員存儲在destination上
4)其他
scard key:獲取set中成員的數量
使用場景:
1.可以使用redis 的set確保數據的唯一性,比如訪問某一博客的唯一ip地址,我們僅需要在每次訪問該博客時將訪問者的IP存入Redis,set數據類型會自動保證IP地址的唯一性
2.充分利用set類型的服務端聚合操作方便、高效的特點,可以用於維護數據對象之間的關聯關係。
騰訊雲服務器redis:0>sadd myset aa bb cc
"3"
騰訊雲服務器redis:0>srem myset cc
"1"
騰訊雲服務器redis:0>smembers myset
1) "aa"
2) "bb"
騰訊雲服務器redis:0>sismember myset cc
"0"
騰訊雲服務器redis:0>sismember myset aa
"1"
騰訊雲服務器redis:0>sadd yourset bb cc dd ee
"4"
騰訊雲服務器redis:0>sadd myset cc
"1"
騰訊雲服務器redis:0>smembers myset
1) "aa"
2) "cc"
3) "bb"
騰訊雲服務器redis:0>smembers yourset
1) "cc"
2) "ee"
3) "dd"
4) "bb"
騰訊雲服務器redis:0>sinter myset yourset
1) "cc"
2) "bb"
騰訊雲服務器redis:0>sunion myset yourset
1) "cc"
2) "ee"
3) "bb"
4) "aa"
5) "dd"
騰訊雲服務器redis:0>sdiff myset yourset
1) "aa"
騰訊雲服務器redis:0>sinterstore hisset myset yourset
"2"
騰訊雲服務器redis:0>smembers hisset
1) "cc"
2) "bb"
騰訊雲服務器redis:0>sunionstore herset myset yourset
"5"
騰訊雲服務器redis:0>smembers herset
1) "cc"
2) "ee"
3) "bb"
4) "aa"
5) "dd"
騰訊雲服務器redis:0>sdiffstore itsset myset yourset
"1"
騰訊雲服務器redis:0>smembers itsset
1) "aa"
騰訊雲服務器redis:0>scard myset
"3"
5.5存儲sortedset
Sorted-Sets和Sets類型極爲相似,它們都是字符串的集合,都不允許重複的成員出現在一個Set中。它們之間的主要差別是Sorted-Sets中的每一個成員都會有一個分數(score)與之關聯,Redis正是通過分數來爲集合中的成員進行從小到大的排序。然而需要額外指出的是,儘管Sorted-Sets中的成員必須是唯一的,但是分數(score) 卻是可以重複的。
在Sorted-Set中添加、刪除或更新一個成員都是非常快速的操作,其時間複雜度爲集合中成員數量的對數。由於Sorted-Sets中的成員在集合中的位置是有序的,因此,即便是訪問位於集合中部的成員也仍然是非常高效的。事實上,Redis所具有的這一特徵在很多其它類型的數據庫中是很難實現的,換句話說,在該點上要想達到和Redis 同樣的高效,在其它數據庫中進行建模是非常困難的。
例如:遊戲排名、微博熱點話題等使用場景。
常用命令:
1)添加元素
zadd key score member score2 member2 … :將所有成員以及該成員的分數存放到sorted-set中
2)獲得元素
zscore key member:返回指定成員的分數
zcard key:獲取集合中的成員數量
3)刪除元素
zrem key member[member…]:移除集合中指定的成員,可以指定多個成員。
4)範圍查詢
zrange key start end [withscores]:獲取集合中腳標爲start-end的成員,[withscores]參數表明返回的成員包含其分數
zrevrange key start stop [withScore]:按照元素分數從大到小的順序返回索引從start到stop之間的所有元素(包含兩端的元素)
zremrangebyrank key start stop:按照排名範圍刪除元素
zremrangebyscore key start stop:按照分數範圍刪除元素
5)擴展命令:
zrevrangebyscore key min max[withscores] [limit offset count]:返回分數在[min,max]
的成員並按照分數從高到低排序。wihthscores:顯示分數 [limit offset with]、offset表明從腳標爲offset的元素開始並返回count的成員
zincrby key increment member:設置指定成員的增加的分數。
zcount key min max:獲取分數在[min,max]之間的成員
騰訊雲服務器redis:0>zadd mysortedset 100 zhangsan 70 lisi 50 wangwu 30 zhaoliu
"4"
騰訊雲服務器redis:0>zscore mysortedset zhangsan
"100"
騰訊雲服務器redis:0>zscore mysortedset wangwu
"50"
騰訊雲服務器redis:0>zcard mysortedset
"4"
騰訊雲服務器redis:0>zrem mysortedset wangwu
"1"
騰訊雲服務器redis:0>zrange mysortedset 40 90
騰訊雲服務器redis:0>zrange mysortedset 0 -1
1) "zhaoliu"
2) "lisi"
3) "zhangsan"
騰訊雲服務器redis:0>zrevrange mysortedset 0 -1 withscores
1) "zhangsan"
2) "100"
3) "lisi"
4) "70"
5) "zhaoliu"
6) "30"
騰訊雲服務器redis:0>zremrangebyrank mysortedset 1 2
"2"
騰訊雲服務器redis:0>zrevrange mysortedset 0 -1 withscores
1) "zhaoliu"
2) "30"
騰訊雲服務器redis:0>zremrangebyscore mysortedset 10 20
"0"
騰訊雲服務器redis:0>zremrangebyscore mysortedset 10 30
"1"
騰訊雲服務器redis:0>zrevrange mysortedset 0 -1 withscores
5.6 Redis的通用操作
keys pattern :獲取所有與pattern匹配的key,返回所有與該key匹配的keys,*表示任意一個或多個字符,?表示任意一個字符。
del key1 key2 …:刪除指定的key
exists key:判斷該key是否存在,1表示存在,0表示不存在
rename key newkey:爲當前的key重命名
expire key:設置過期時間,單位 秒
ttl key:獲取該key所剩的超時時間,如果沒有設置超時,返回-1,如果返回-2表示超時不存在
type key:獲取指定key的類型,命令將以字符串的格式返回,返回的字符串爲string、list、set、hash、和zset,如果key不存在返回none
騰訊雲服務器redis:0>keys *
1) "itsset"
2) "yourset"
3) "myhash"
4) "age"
5) "username"
6) "runtime"
7) "myset"
8) "herset"
9) "hisset"
10) "mylist3"
11) "caches"
12) "mylist"
13) "mylist2"
騰訊雲服務器redis:0>keys *list?
1) "mylist3"
2) "mylist2"
騰訊雲服務器redis:0>del itsset
"1"
騰訊雲服務器redis:0>exists mylist
"1"
騰訊雲服務器redis:0>rename mylist mylist1
"OK"
騰訊雲服務器redis:0>expire mylist3 60
"1"
騰訊雲服務器redis:0>ttl mylist3
"42"
騰訊雲服務器redis:0>ttl mylist3
"39"
騰訊雲服務器redis:0>type mylist
"none"
騰訊雲服務器redis:0>type mylist3
"list"
5.7 Redis特性
1)多數據庫
一個Redis實例可以包括多個數據庫,客戶端可以指定連接某個redis實例的哪個數據庫,就好比一個mysql中創建多個數據庫,客戶端連接時指定連接哪個數據庫。
選擇數據庫:select N
2)移庫
將這個數據庫下的key移植到另一個庫中(當前庫則被刪除)
騰訊雲服務器redis:0>select 1
"OK"
騰訊雲服務器redis:1>keys *
騰訊雲服務器redis:1>select 0
"OK"
騰訊雲服務器redis:0>keys *
1) "yourset"
2) "myhash"
3) "age"
4) "username"
5) "runtime"
6) "myset"
7) "herset"
8) "hisset"
9) "caches"
10) "mylist1"
11) "mylist2"
騰訊雲服務器redis:0>move age 1
"1"
騰訊雲服務器redis:0>keys *
1) "yourset"
2) "myhash"
3) "username"
4) "runtime"
5) "myset"
6) "herset"
7) "hisset"
8) "caches"
9) "mylist1"
10) "mylist2"
騰訊雲服務器redis:0>select 1
"OK"
騰訊雲服務器redis:1>keys *
1) "age"
騰訊雲服務器redis:1>