Redis之數據類型及命令

  Redis(REmote DIctionary Server) 是一個遵照BSD協議、支持網絡、可基於內存亦可持久化的日誌型key-value存儲系統。redis

KEY數據庫

  經常使用指令:安全

指令
註釋
備註
exits key 
檢測指定 key 是否存在
 1 : 存在,0 : 不存在
del key1 key2......keyN 
刪除給定 key
返回刪除 key 的數目,0 表示給定 key 都不存在
type key 
返回給定 key 值的類型
none : key 不在         string   : 字符類型
list       : 鏈表類型      set       : 無序集合類型
keys pattern 
返回匹配指定模式的全部 key
 
randomkey 
隨機返回一個 key
若是當前數據庫是空的,返回空串
rename oldkey newkey 
重命名一個 key
若是 newkey 已存在,將會被覆蓋newkey的值.
expire key seconds
設置key 的過時時間,單位是秒。
返回 1 : 成功,0 :key 不存在
ttl key 
返回key的剩餘過時秒數
-1 : key未設置過時時間, -2:key不存在
persist key
清除key的過時時間
1 : 成功  0:key不存在或者沒有設置過時時間

 

 

 

 

 

 

 

 VALUE網絡

  Redis 提供五種數據類型:String,Hash,List,Set 及 ZSet。app

  • String

     String 是最基本的類型,並且 String 類型是二進制安全的,意思是 Redis 的 String 能夠 包含任何數據。dom

    經常使用指令:spa

指令
註釋
例子
set key value
存數據
set username 'winn'
get key  
取數據
get username
mset key1 value1... keyn valuen 
一次存多個鍵值對
mset uname 'winn' pwd '123'
mget key1 ... keyn
一次取多個值
mget uname pwd

    Java使用:日誌

@Test
public void testString() {
   Jedis jedis = new Jedis("localhost");
    jedis.set("name","winn");
    System.out.println(jedis.get("name"));
    //拼接
    jedis.append("name", " is my lover");
    System.out.println(jedis.get("name"));
    jedis.del("name");
    System.out.println(jedis.get("name"));
    //設置多個鍵值對
    jedis.mset("name","winn","age","27","qq","174754613");
    //進行加1操做
    jedis.incr("age");
    System.out.println(jedis.get("name") + "-" + jedis.get("age") + "-" + jedis.get("qq"));//執行結果:winn-28-174754613
}

 

  • Hash

    Hash 是一個 String 類型的 field 和 value 的映射表,最大能夠包含(2^32 -1)個鍵值對。增刪操做的時間複雜度爲 O(1)。code

              Hash 特別適合用於存儲對象,將一個對象存儲在 Hash 類型中會佔用更少的內存,而且能夠更方便的存取整個對象。【省內存的緣由是新建一個 Hash 對象時開始是用 zipmap(又稱爲 smallhash)來存儲的。這個 zipmap 其實並非hash table,可是 zipmap 相比正常的 hash 實現,能夠節省很多 hash 自己須要的一些元數據存儲開銷。儘管 zipmap 的添加、刪除、查找都是 O(n),可是因爲通常對象的 field 數量都不太多,因此使用 zipmap的添加刪除平均仍是 O(1)。若是 field 或者 value的大小超出必定限制(在配置文件中指定)後,redis會在內部自動將zipmap替換成正常的hash實現.
#配置字段最多 64 個 
hash-max-zipmap-entries 64 

#配置 value 最大爲 512 字節
hash-max-zipmap-value 512  

    經常使用指令:對象

指令
註釋
例子
hmset key field1 value1 ... fieldn valuen
存數據
hmset user name 'winn' sex 'man'
hget key
取數據
hget user name
hgetall key
獲取對象
 
HKEYS key
奪取對象中的全部filed
 
HVALS key
奪取對象中的全部value
 
 @Test
    public void testHash(){
     Jedis jedis = new Jedis("localhost"); Map
<String, String> map = new HashMap<>(); map.put("name", "xinxin"); map.put("age", "22"); map.put("qq", "123456"); jedis.hmset("user",map); List<String> rsmap = jedis.hmget("user", "name", "age", "qq"); System.out.println(rsmap); //刪除map中的某個鍵值 jedis.hdel("user","age"); System.out.println(jedis.hmget("user", "age")); //null //hlen 返回key中的field-value個數 System.out.println(jedis.hlen("user")); //2 //exists 判斷key是否存在 System.out.println(jedis.exists("user"));//true //hkeys 返回全部的field System.out.println(jedis.hkeys("user"));//[name, qq] //hvals 返回全部的value System.out.println(jedis.hvals("user"));//[xinxin, 123456] Iterator<String> iter=jedis.hkeys("user").iterator(); while (iter.hasNext()){ String key = iter.next(); System.out.println(key+":"+jedis.hmget("user",key)); } }

 

  • List(雙向鏈表類型)

     List 是一個鏈表結構,能夠理解爲一個每一個子元素都是 String 類型的雙向鏈表。主要功能是 push、pop、獲取一個範圍內的全部值等。

    經常使用指令:

指令
註釋
例子
lpush listName value
將value存入list的表頭
lpush listData demo
rpush listName value
將value存入list的表尾
rpush listData demo
lrange listName startIndex endIndex
返回下標在[startIndex, endIndex]中的值
lrange listData 0 10

    Java使用:

@Test
public void testList(){
    Jedis jedis = new Jedis("localhost");
    if(jedis.keys("*") != null){
        jedis.flushDB();
    }
    //rpush : 在表尾添加數據
    jedis.rpush("db","This","is","redis");
    jedis.rpush("db","demo");
    //lpush : 在表頭添加數據
    jedis.lpush("db","Begin : ");
    //lrange : 獲取鏈表中的值 、 llen : 獲取鏈表長度
    System.out.println(jedis.lrange("db", 0, jedis.llen("db")));
    //-1表示最後一個元素
    System.out.println(jedis.lrange("db", 0, -1));
    //排序 : 排序默認以數字做爲對象,值被解釋爲雙精度浮點數,而後進行比較。
    //System.out.println(jedis.sort("db"));
}

 

  • Set
     Set 是無序集合,且不容許重複的成員。最大能夠包含(2^32 -1)個元素。增刪查操做的時間複雜度爲 O(1)。
               Set 的是經過 hashtable 實現的, hashtable 會隨着添加或者刪除自動的調整大小。 須要注意的是調整 hashtable 大小時候須要同步(獲取寫鎖),會阻塞其餘讀寫操做。
               關於 Set 集合類型 除了基本的添加刪除操做,還包含集合的取並集(union),交集(intersection), 差集(difference)。
    經常使用指令:
指令
註釋
例子
sadd key member
將value存入set
sadd setData set demo
smembers key
返回key中的數據
sembers setData
sismbers key
 判斷key是否存在  sismembers setData
SDIFF key1 [key2]
返回給定全部集合的差集
 
SINTER key1 [key2]
返回給定全部集合的交集
 
SUNION key1 [key2]
返回全部給定集合的並集
 

    Java使用:

@Test
public void testSet(){
   Jedis jedis = new Jedis("localhost");
//添加 jedis.sadd("user","liuling"); jedis.sadd("user","xinxin"); jedis.sadd("user","ling"); jedis.sadd("user","zhangxinxin"); jedis.sadd("user","who"); //srem : 移除value jedis.srem("user","who"); System.out.println(jedis.smembers("user"));//獲取全部加入的value System.out.println(jedis.sismember("user", "who"));//判斷 who 是不是user集合的元素 System.out.println(jedis.srandmember("user"));//隨機返回一個value System.out.println(jedis.scard("user"));//返回集合的元素個數

  
jedis.sadd("customer","ling");
  jedis.sadd("customer","xinxin");
  jedis.sadd("customer","winn");
  jedis.sadd("customer","nicole");
  jedis.sadd("customer","sam");
  //並集
  System.out.println(jedis.sunion("user","customer"));
  //差集 : 返回user中customer不包含的value
  System.out.println(jedis.sdiff("user","customer"));
  //交集
  System.out.println(jedis.sinter("user","customer"));
}

 

  • ZSet(有序集合類型Sorted Set)

     Sorted Set 是有序集合,且不容許重複的成員。它在 Set 的基礎上增長了一個順序屬性(score),這一屬性在添加修改元素的時候能夠指定,每次指定後,會自動從新按新的值調整順序。

    經常使用指令:

指令
註釋
例子
zadd key score member
存數據
zset zsetData 0 demo
zrange key startScore endScore  [WITHSCORES]
取score在[startScore, endScore]之間的數據
zrange zsetData 0  10

     Java使用:

 

@Test
public void testZSet(){
   Jedis jedis = new Jedis("localhost");
    jedis.zadd("user",1,"winn");
    jedis.zadd("user",2,"sam");
    jedis.zadd("user",5,"nicole");
    jedis.zadd("user",4,"roy");
    Set<String> user = jedis.zrange("user", 0, -1);
    System.out.println(user);
}

 

 

 

補充

  • 系統經常使用指令
指令
註釋
備註
keys name
獲取指定key
keys * 獲取全部key
flushdb
清除當前數據庫的全部數據
 
flushall
清除全部數據庫的全部數據
 
besize
返回數據庫中key的數量
 
config set field value 設置系統參數 config set maxmemory 100mb
config get field 查看系統參數 config get maxmemory
 
  • Java使用Redis事務
/**
 * 使用事務
 * Redis事務能夠理解爲一個打包的批量執行腳本,中間某條指令的失敗不會致使前面已作指令的回滾,也不會形成後續的指令不作。
 *
 */
@Test
public void testTrans() {
    //開啓事務
    Transaction tx = jedis.multi();
    for (int i = 0; i < 1000; i++) {
        tx.set("t" + i, "t" + i);
    }
    //執行事務
    tx.exec();
    System.out.println(jedis.get("t100"));
}

 

相關文章
相關標籤/搜索