redis是一個經常使用的內存Nosql數據庫,爲何要用nosql,爲何要用redis不用memcache這些不少博客以及講得很清楚了。
下面介紹redis的5大基本數據類型的經常使用操做:
STRING(也能夠是字符串、浮點數、整數) 對整個字符串或者字符串的其中的一部分執行操做,對整數或者浮點數進行自增或者自減
LIST(有序) 鏈表
SET(無序) 集合
HASH(無序) 散列表 相似於java中的HashMap
ZSET(有序集合) 字符串成員 和 浮點數分值的有序映射
下面是使用java版本的redis的客戶端jedis對redis進行操做的相關的api的測試:
maven依賴以下:java
<dependencies> <!-- https://mvnrepository.com/artifact/redis.clients/jedis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> <!-- https://mvnrepository.com/artifact/junit/junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies>
public class JedisApiTest { private Jedis jedis; @Rule public ExpectedException expectedEx = ExpectedException.none(); @Before public void before() { jedis = new Jedis("127.0.0.1", 6379); } @Test public void test() { // redis 中 String數據類型的經常使用的操做相關測試 // 首先先清空全部的鍵值對 // jedis.flushAll(); // 清除全部測試要用到的 key jedis.del("hello", "name", "age", "ages"); // 設置 key - value Assert.assertEquals("OK", jedis.set("hello", "world")); // 獲取 key - value Assert.assertEquals("world", jedis.get("hello")); // append value jedis.append("hello", "!"); Assert.assertEquals("world!", jedis.get("hello")); // 刪除value Assert.assertEquals(Long.valueOf(1l), jedis.del("hello")); // 刪除不存在的能夠 Assert.assertEquals(Long.valueOf(0l), jedis.del("hello")); // 獲取不存在的 key Assert.assertEquals(null, jedis.get("hello")); // 同時設置多個值 Assert.assertEquals("OK", jedis.mset("name", "liuling", "age", "23", "qq", "476777XXX")); // incr增長一個值 返回結果是增長後的值 Assert.assertEquals(Long.valueOf(24l), jedis.incr("age")); // 增長一個不存在的值 會set這個值而且值爲一 Assert.assertEquals(Long.valueOf(1l), jedis.incr("ages")); // 增長一個不是數值的 值 expectedEx.expect(JedisDataException.class);// Exception.class其實也是能夠的 expectedEx.expectMessage("ERR value");// 錯誤信息中的一部分就能夠了 jedis.incr("name"); } @Test public void test2() { // 關於 List 數據類型的操做 // 先清除測試要用到 鍵值 jedis.del("list"); // 多個值推入返回的是推入的值的 數目 4 Assert.assertEquals(Long.valueOf(4L), jedis.rpush("list", "item1", "item2", "item1", "item3")); // 展現list所有的值 List<String> list = jedis.lrange("list", 0, -1); Assert.assertEquals(4, list.size()); // 測試取超出範圍的值 左右超出範圍不管 如何寫只要左邊比右邊小都是整個list列表 Assert.assertEquals(4, jedis.lrange("list", -200, 1000).size()); // 右邊沒有超過範圍 Assert.assertEquals(3, jedis.lrange("list", -200, 2).size()); // 左邊超過範圍 Assert.assertEquals(2, jedis.lrange("list", 2, 1000).size()); // 左右沒有超過範圍只是 左邊比右邊大 Assert.assertEquals(0, jedis.lrange("list", 2, 1).size()); // 其餘的都不用測試了 只要左邊比右邊大 返回的list都是空的 [] // pop返回的都是pop的值 Assert.assertEquals("item1", jedis.lpop("list")); for (int i = 0; i < 3; i++) { jedis.lpop("list"); } // pop 一個空的list查看返回什麼 返回null Assert.assertEquals(null, jedis.lpop("list")); } @Test public void test3() { // 清除 測試的 key jedis.del("set"); // 返回值是進入成功的的值的數目 重複的值進入不成功 Assert.assertEquals(Long.valueOf(2), jedis.sadd("set", "set1", "set2", "set1")); // 獲取set裏面全部的值 Set<String> set = jedis.smembers("set"); Assert.assertEquals(2, set.size()); // 判斷值是否在set中 Assert.assertTrue(jedis.sismember("set", "set1")); Assert.assertFalse(jedis.sismember("set", "set3")); // 返回刪除成功的 key的數量的值 Assert.assertEquals(Long.valueOf(2l), jedis.srem("set", "set1", "set2")); // 返回刪除成功的 key的值 由於 都不存在全部返回值是0l Assert.assertEquals(Long.valueOf(0l), jedis.srem("set", "set1", "set2")); } @Test public void test4() { // 哈希 測試 // 首先先刪除測試的key jedis.del("map"); Assert.assertEquals(Long.valueOf(1l), jedis.hset("map", "k1", "v1"));// 設置一個值 HashMap<String, String> map = new HashMap<String, String>(); map.put("k1", "v2"); map.put("k2", "v2"); Assert.assertEquals("OK", jedis.hmset("map", map)); Assert.assertEquals("v2", jedis.hget("map", "k1"));// 會被覆蓋 Assert.assertEquals(null, jedis.hget("map", "k3"));// 獲取不存在的key Assert.assertEquals("[v2, null]", jedis.hmget("map", "k1", "k3").toString());// 這個只想說明獲取 // 獲取hash中不存在的值會返回null Assert.assertEquals(2, jedis.hgetAll("map").size()); // ----------------------------------------- Assert.assertEquals(Long.valueOf(0l), jedis.hset("map", "k1", "v3")); Assert.assertEquals("v3", jedis.hget("map", "k1"));// 會被覆蓋 // 這兩個表示 hset一個存在的值 會返回0可是值確實會被覆蓋 // ----------------------------------------- Assert.assertEquals(Long.valueOf(1l), jedis.hdel("map", "k1")); // hdel也能夠批量刪除 返回刪除成功的key的數量 Assert.assertEquals(Long.valueOf(0l), jedis.hdel("map", "k1")); } @Test public void test5() { // 最後一種數據類型zSet有序集合 // 首先清楚要測試的key jedis.del("zset"); Assert.assertEquals(Long.valueOf(1l), jedis.zadd("zset", 1.1, "k1")); Assert.assertEquals(Long.valueOf(0l), jedis.zadd("zset", 4.4, "k1"));// 設置同樣的值是0 Assert.assertEquals(Long.valueOf(1l), jedis.zadd("zset", 3.3, "k3"));// // output:[k3,k1] 值被覆蓋了 System.out.println(jedis.zrangeByScore("zset", 0, 5)); // [[[107,51],3.3],[[107, 49],4.4]]f System.out.println(jedis.zrangeByScoreWithScores("zset", 0, 10)); Set<Tuple> setWithTuple = jedis.zrangeByScoreWithScores("zset", 0, 10); for (Tuple t : setWithTuple) { System.out.println(t.getElement() + "--" + t.getScore()); } // output: // k3--3.3 // k1--4.4 } }