笔记68 Redis数据库
一、Redis簡介
REmote DIctionary Server(Redis) 是一個由Salvatore Sanfilippo寫的key-value存儲系統(tǒng)。Redis是一個開源的使用ANSI C語言編寫、遵守BSD協(xié)議、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API。它通常被稱為數(shù)據(jù)結(jié)構(gòu)服務(wù)器,因為值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等類型。
1.Redis特點:
-
- Redis支持數(shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保存在磁盤中,重啟的時候可以再次加載進行使用。
- Redis不僅僅支持簡單的key-value類型的數(shù)據(jù),同時還提供list,set,zset,hash等數(shù)據(jù)結(jié)構(gòu)的存儲。
- Redis支持數(shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。
2.Redis優(yōu)勢
-
- 性能極高?– Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
- 豐富的數(shù)據(jù)類型 – Redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數(shù)據(jù)類型操作。
- 原子 – Redis的所有操作都是原子性的,意思就是要么成功執(zhí)行要么失敗完全不執(zhí)行。單個操作是原子性的。多個操作也支持事務(wù),即原子性,通過MULTI和EXEC指令包起來。
- 豐富的特性?– Redis還支持 publish/subscribe, 通知, key 過期等等特性。
3.Redis與其他key-value存儲有什么不同?
-
-
Redis有著更為復(fù)雜的數(shù)據(jù)結(jié)構(gòu)并且提供對他們的原子性操作,這是一個不同于其他數(shù)據(jù)庫的進化路徑。Redis的數(shù)據(jù)類型都是基于基本數(shù)據(jù)結(jié)構(gòu)的同時對程序員透明,無需進行額外的抽象。
-
Redis運行在內(nèi)存中但是可以持久化到磁盤,所以在對不同數(shù)據(jù)集進行高速讀寫時需要權(quán)衡內(nèi)存,因為數(shù)據(jù)量不能大于硬件內(nèi)存。在內(nèi)存數(shù)據(jù)庫方面的另一個優(yōu)點是,相比在磁盤上相同的復(fù)雜的數(shù)據(jù)結(jié)構(gòu),在內(nèi)存中操作起來非常簡單,這樣Redis可以做很多內(nèi)部復(fù)雜性很強的事情。同時,在磁盤格式方面他們是緊湊的以追加的方式產(chǎn)生的,因為他們并不需要進行隨機訪問
-
二、安裝
下載地址:https://github.com/MicrosoftArchive/redis/releases
三、常見命令
Redis目前有5種數(shù)據(jù)類型:String、List、Hash、Set、Sorted Set。
1.String
1 SET key value 設(shè)置key=value 2 GET key 或者鍵key對應(yīng)的值 3 GETRANGE key start end 得到字符串的子字符串存放在一個鍵 4 GETSET key value 設(shè)置鍵的字符串值,并返回舊值 5 GETBIT key offset 返回存儲在鍵位值的字符串值的偏移 6 MGET key1 [key2..] 得到所有的給定鍵的值 7 SETBIT key offset value 設(shè)置或清除該位在存儲在鍵的字符串值偏移 8 SETEX key seconds value 鍵到期時設(shè)置值 9 SETNX key value 設(shè)置鍵的值,只有當(dāng)該鍵不存在 10 SETRANGE key offset value 覆蓋字符串的一部分從指定鍵的偏移 11 STRLEN key 得到存儲在鍵的值的長度 12 MSET key value [key value...] 設(shè)置多個鍵和多個值 13 MSETNX key value [key value...] 設(shè)置多個鍵多個值,只有在當(dāng)沒有按鍵的存在時 14 PSETEX key milliseconds value 設(shè)置鍵的毫秒值和到期時間 15 INCR key 增加鍵的整數(shù)值一次 16 INCRBY key increment 由給定的數(shù)量遞增鍵的整數(shù)值 17 INCRBYFLOAT key increment 由給定的數(shù)量遞增鍵的浮點值 18 DECR key 遞減鍵一次的整數(shù)值 19 DECRBY key decrement 由給定數(shù)目遞減鍵的整數(shù)值 20 APPEND key value 追加值到一個鍵 21 DEL key 如果存在刪除鍵 22 DUMP key 返回存儲在指定鍵的值的序列化版本 23 EXISTS key 此命令檢查該鍵是否存在 24 EXPIRE key seconds 指定鍵的過期時間 25 EXPIREAT key timestamp 指定的鍵過期時間。在這里,時間是在Unix時間戳格式 26 PEXPIRE key milliseconds 設(shè)置鍵以毫秒為單位到期 27 PEXPIREAT key milliseconds-timestamp 設(shè)置鍵在Unix時間戳指定為毫秒到期 28 KEYS pattern 查找與指定模式匹配的所有鍵 29 MOVE key db 移動鍵到另一個數(shù)據(jù)庫 30 PERSIST key 移除過期的鍵 31 PTTL key 以毫秒為單位獲取剩余時間的到期鍵。 32 TTL key 獲取鍵到期的剩余時間。 33 RANDOMKEY 從Redis返回隨機鍵 34 RENAME key newkey 更改鍵的名稱 35 RENAMENX key newkey 重命名鍵,如果新的鍵不存在 36 TYPE key 返回存儲在鍵的數(shù)據(jù)類型的值。
2.List
1 BLPOP key1 [key2 ] timeout 取出并獲取列表中的第一個元素,或阻塞,直到有可用 2 BRPOP key1 [key2 ] timeout 取出并獲取列表中的最后一個元素,或阻塞,直到有可用 3 BRPOPLPUSH source destination timeout 從列表中彈出一個值,它推到另一個列表并返回它;或阻塞,直到有可用 4 LINDEX key index 從一個列表其索引獲取對應(yīng)的元素 5 LINSERT key BEFORE|AFTER pivot value 在列表中的其他元素之后或之前插入一個元素 6 LLEN key 獲取列表的長度 7 LPOP key 獲取并取出列表中的第一個元素 8 LPUSH key value1 [value2] 在前面加上一個或多個值的列表 9 LPUSHX key value 在前面加上一個值列表,僅當(dāng)列表中存在 10 LRANGE key start stop 從一個列表獲取各種元素 11 LREM key count value 從列表中刪除元素 12 LSET key index value 在列表中的索引設(shè)置一個元素的值 13 LTRIM key start stop 修剪列表到指定的范圍內(nèi) 14 RPOP key 取出并獲取列表中的最后一個元素 15 RPOPLPUSH source destination 刪除最后一個元素的列表,將其附加到另一個列表并返回它 16 RPUSH key value1 [value2] 添加一個或多個值到列表 17 RPUSHX key value 添加一個值列表,僅當(dāng)列表中存在
3.Hash
1 HDEL key field[field...] 刪除對象的一個或幾個屬性域,不存在的屬性將被忽略 2 HEXISTS key field 查看對象是否存在該屬性域 3 HGET key field 獲取對象中該field屬性域的值 4 HGETALL key 獲取對象的所有屬性域和值 5 HINCRBY key field value 將該對象中指定域的值增加給定的value,原子自增操作,只能是integer的屬性值可以使用 6 HINCRBYFLOAT key field increment 將該對象中指定域的值增加給定的浮點數(shù) 7 HKEYS key 獲取對象的所有屬性字段 8 HVALS key 獲取對象的所有屬性值 9 HLEN key 獲取對象的所有屬性字段的總數(shù) 10 HMGET key field[field...] 獲取對象的一個或多個指定字段的值 11 HSET key field value 設(shè)置對象指定字段的值 12 HMSET key field value [field value ...] 同時設(shè)置對象中一個或多個字段的值 13 HSETNX key field value 只在對象不存在指定的字段時才設(shè)置字段的值 14 HSTRLEN key field 返回對象指定field的value的字符串長度,如果該對象或者field不存在,返回0. 15 HSCAN key cursor [MATCH pattern] [COUNT count] 類似SCAN命令
4.Set
1 SADD key member [member ...] 添加一個或者多個元素到集合(set)里 2 SCARD key 獲取集合里面的元素數(shù)量 3 SDIFF key [key ...] 獲得隊列不存在的元素 4 SDIFFSTORE destination key [key ...] 獲得隊列不存在的元素,并存儲在一個關(guān)鍵的結(jié)果集 5 SINTER key [key ...] 獲得兩個集合的交集 6 SINTERSTORE destination key [key ...] 獲得兩個集合的交集,并存儲在一個集合中 7 SISMEMBER key member 確定一個給定的值是一個集合的成員 8 SMEMBERS key 獲取集合里面的所有key 9 SMOVE source destination member 移動集合里面的一個key到另一個集合 10 SPOP key [count] 獲取并刪除一個集合里面的元素 11 SRANDMEMBER key [count] 從集合里面隨機獲取一個元素 12 SREM key member [member ...] 從集合里刪除一個或多個元素,不存在的元素會被忽略 13 SUNION key [key ...] 添加多個set元素 14 SUNIONSTORE destination key [key ...] 合并set元素,并將結(jié)果存入新的set里面 15 SSCAN key cursor [MATCH pattern] [COUNT count] 迭代set里面的元素
5.Sorted Set
1 ZADD key score1 member1 [score2 member2] 添加一個或多個成員到有序集合,或者如果它已經(jīng)存在更新其分數(shù) 2 ZCARD key 得到的有序集合成員的數(shù)量 3 ZCOUNT key min max 計算一個有序集合成員與給定值范圍內(nèi)的分數(shù) 4 ZINCRBY key increment member 在有序集合增加成員的分數(shù) 5 ZINTERSTORE destination numkeys key [key ...] 多重交叉排序集合,并存儲生成一個新的鍵有序集合。 6 ZLEXCOUNT key min max 計算一個給定的字典范圍之間的有序集合成員的數(shù)量 7 ZRANGE key start stop [WITHSCORES] 由索引返回一個成員范圍的有序集合(從低到高) 8 ZRANGEBYLEX key min max [LIMIT offset count]返回一個成員范圍的有序集合(由字典范圍) 9 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 返回有序集key中,所有 score 值介于 min 和 max 之間(包括等于 min 或 max )的成員,有序集成員按 score 值遞增(從小到大)次序排列 10 ZRANK key member 確定成員的索引中有序集合 11 ZREM key member [member ...] 從有序集合中刪除一個或多個成員,不存在的成員將被忽略 12 ZREMRANGEBYLEX key min max 刪除所有成員在給定的字典范圍之間的有序集合 13 ZREMRANGEBYRANK key start stop 在給定的索引之內(nèi)刪除所有成員的有序集合 14 ZREMRANGEBYSCORE key min max 在給定的分數(shù)之內(nèi)刪除所有成員的有序集合 15 ZREVRANGE key start stop [WITHSCORES] 返回一個成員范圍的有序集合,通過索引,以分數(shù)排序,從高分到低分 16 ZREVRANGEBYSCORE key max min [WITHSCORES] 返回一個成員范圍的有序集合,以socre排序從高到低 17 ZREVRANK key member 確定一個有序集合成員的索引,以分數(shù)排序,從高分到低分 18 ZSCORE key member 獲取給定成員相關(guān)聯(lián)的分數(shù)在一個有序集合 19 ZUNIONSTORE destination numkeys key [key ...] 添加多個集排序,所得排序集合存儲在一個新的鍵 20 ZSCAN key cursor [MATCH pattern] [COUNT count] 增量迭代排序元素集和相關(guān)的分數(shù)
四、Jedis
在常見命令中,使用各種Redis自帶客戶端的命令行方式訪問Redis服務(wù)。 而在實際工作中卻需要用到Java代碼才能訪問,使用第三方j(luò)ar包 :Jedis就能方便地訪問Redis的各種服務(wù)了,具體操作代碼如下:
對list操作的時候有疑問,list只要聲明了key值,就可以一直存入值,如果不清楚的話。
1 import org.junit.Before; 2 import org.junit.Test; 3 import redis.clients.jedis.Jedis; 4 import redis.clients.jedis.JedisPool; 5 6 import java.util.HashMap; 7 import java.util.Iterator; 8 import java.util.List; 9 import java.util.Map; 10 11 public class Main { 12 13 JedisPool pool; 14 Jedis jedis; 15 16 @Before 17 public void Setup(){ 18 jedis=new Jedis("localhost"); 19 } 20 21 /** 22 * Redis存儲初級字符串 23 * CRUD 24 */ 25 @Test 26 public void testBasicString(){ 27 /** 28 * 添加一條數(shù)據(jù) 29 */ 30 jedis.set("name","123"); 31 System.out.println(jedis.get("name")); 32 33 /** 34 * 修改數(shù)據(jù) 35 */ 36 //1、在原來的基礎(chǔ)上修改 37 jedis.append("name","lol"); 38 System.out.println(jedis.get("name")); 39 40 //2.直接覆蓋原來的數(shù)據(jù) 41 jedis.set("name","dnf"); 42 System.out.println(jedis.get("name")); 43 44 //3.刪除key對應(yīng)的記錄 45 jedis.del("name"); 46 System.out.println(jedis.get("name")); 47 48 /** 49 * mest相當(dāng)于 50 * jedis.set("name","lol") 51 * jedis.set("dota","123") 52 */ 53 jedis.mset("name","lol","dota","123"); 54 System.out.println(jedis.get("dota")); 55 } 56 57 /** 58 * jedis操作Map 59 */ 60 @Test 61 public void testMap(){ 62 Map<String,String> user=new HashMap<>(); 63 user.put("name","123"); 64 user.put("age","12"); 65 jedis.hmset("user",user); 66 67 //取出user中的name,執(zhí)行結(jié)果:[123]-->注意結(jié)果是一個泛型的List 68 //第一個參數(shù)是存入redis中map對象的key,后面跟的是放入map中的對象的key,后面的key可以跟多個,是可變參數(shù) 69 List<String> rsmap=jedis.hmget("user","name","age"); 70 System.out.println(rsmap); 71 72 //刪除map種的某個鍵值 73 //jedis.hdel("user","name"); 74 75 System.out.println(jedis.hmget("user", "name")); //因為刪除了,所以返回的是null 76 System.out.println(jedis.hlen("user")); //返回key為user的鍵中存放的值的個數(shù) 77 System.out.println(jedis.exists("user"));//是否存在key為user的記錄 返回true 78 System.out.println(jedis.hkeys("user"));//返回map對象中的所有key [pwd, name] 79 System.out.println(jedis.hvals("user"));//返回map對象中的所有value [meepo, password] 80 81 Iterator<String> iterator=jedis.hkeys("user").iterator(); 82 while (iterator.hasNext()){ 83 String key=iterator.next(); 84 System.out.println(key+":"+jedis.hmget("user",key)); 85 } 86 } 87 /** 88 * Jdeis操作List 89 */ 90 @Test 91 public void testList(){ 92 /** 93 * 因為redis是存儲在緩存中,所以如果不清除list,會一直往list里面增加值。 94 */ 95 jedis.del("Java框架"); 96 97 jedis.lpush("Java框架","spring"); 98 jedis.lpush("Java框架","springMVC"); 99 jedis.lpush("Java框架","springBoot"); 100 101 System.out.println(jedis.lrange("Java框架",0,-1)); 102 103 //長度 104 System.out.println(jedis.llen("Java框架")); 105 } 106 107 /** 108 * jedis操作set 109 */ 110 @Test 111 public void testSet(){ 112 //添加 113 jedis.sadd("sname","lol"); 114 jedis.sadd("sname","dnf"); 115 jedis.sadd("sname","dota"); 116 117 //刪除 118 //jedis.srem("sanme","lol"); 119 120 System.out.println(jedis.smembers("sname")); 121 System.out.println(jedis.sismember("sname","lol")); 122 System.out.println(jedis.srandmember("sanme")); 123 System.out.println(jedis.scard("sname")); 124 125 } 126 127 @Test 128 public void test() throws InterruptedException { 129 //keys中可以傳入通配符 130 131 //返回庫中所有的key 132 System.out.println(jedis.keys("*")); 133 134 System.out.println(jedis.keys("*name")); 135 136 System.out.println(jedis.del("myset")); 137 138 System.out.println(jedis.ttl("names")); 139 140 jedis.setex("list1",10,"min"); 141 Thread.sleep(5000); 142 System.out.println(jedis.ttl("list1")); 143 144 jedis.setex("dbs",1,"min"); 145 System.out.println(jedis.ttl("dbs")); 146 147 jedis.rename("dbs","db"); 148 System.out.println(jedis.get("dbs")); 149 150 System.out.println(jedis.get("db")); 151 152 153 //jedis排序 154 //注意,此處的rpush和lpush是List的操作。可以左右雙向插入 155 jedis.del("a"); 156 jedis.rpush("a","1"); 157 jedis.rpush("a","2"); 158 jedis.lpush("a","3"); 159 jedis.lpush("a","4"); 160 161 //jedis.lset("a",2,"1111"); 162 jedis.lrem("a",0,"2"); 163 164 System.out.println(jedis.lrange("a",0,-1)); 165 System.out.println(jedis.sort("a")); 166 } 167 168 169 170 }五、
轉(zhuǎn)載于:https://www.cnblogs.com/lyj-gyq/p/9322340.html
總結(jié)
以上是生活随笔為你收集整理的笔记68 Redis数据库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Navicat数据库备份还原
- 下一篇: mysql 执行sql导出表格形式