關於redis的使用總結
阿新 • • 發佈:2019-02-24
ash img 持久化 dom help 使用總結 同步 config 工作
- 簡介
redis是一個開源的用c語言編寫的數據庫,但並不像常規的關系型數據庫那樣把數據存儲在表中 , 而是像Java中的Map集合一樣,存儲的是一系列key=value鍵值對,redis屬於NoSQL數據庫(非關系型數據庫)。
redis的設計初衷並不是取代傳統的關系型數據庫,而是作為它們的補充,在某些情況下發揮其特長。
redis數據庫工作的時候會把所有的數據都讀到內存中,磁盤上的數據文件只是用來持久化數據。這個特點使得redis具有極快的存取速度,但可以管理的數據量受到限制,不能超過可用的內存空間(雖然可以使用交換區,但會犧牲掉一些速度)。
- redis的內存結構
redis本身像一個map,可以直接存放鍵值對 ,也可以把數據以特定的數據結構組織起來,redis內部支持的數據結構有 list , set , sorted Set , hashMap
- redis做消息隊列
redis有list的數據結構,天生就適合做消息隊列。
使用代碼簡單模擬生產者、消費者如何操作消息隊列
public class MQTest { // 演示消息隊列的操作 public static void main(String[] args) { new Producer("蛋蛋").start(); new Producer("建國").start(); new Consumer().start(); new Consumer().start(); } } // 生產者class Producer extends Thread { private String name; private int count = 1;// 生產消息的個數 public Producer(String name) { this.name = name; } @Override public void run() { Jedis jedis = new Jedis("localhost"); // 循環著 讓生產者隨機睡眠一段時間,然後生產一條消息放入到消息隊列 Random random= new Random(); while (true) { try { Thread.sleep(200 + random.nextInt(1000));// 200-1200 } catch (InterruptedException e) { e.printStackTrace(); } // 生產消息 -- 用字符串表示 String message = name + "生產的第" + count + "個消息"; count++; // 把消息放入消息隊列 jedis.rpush("mq", message); } } } // 消費者 class Consumer extends Thread { @Override public void run() { // 循環著,先休眠一段時間,再從消息隊列中取出消息處理 Jedis jedis = new Jedis("localhost"); Random random = new Random(); while (true) { try { Thread.sleep(200 + random.nextInt(1000));// 200-1200 } catch (InterruptedException e) { e.printStackTrace(); } // 從消息隊列中取出消息 String message = jedis.lpop("mq"); // 處理消息--簡單的輸出一下 if (message != null) { System.out.println(message); } } } }
使用消息隊列記錄系統的日誌信息
public class LogTest { // 演示使用消息隊列暫存系統日誌 public static void main(String[] args) { // 模擬四個用戶操作 new UserThread().start(); new UserThread().start(); new UserThread().start(); new UserThread().start(); new OtherThread().start(); } } class UserThread extends Thread { // 用戶線程,模擬用戶操作時產生日誌信息 @Override public void run() { // 作為消息隊列使用 Jedis jedis = new Jedis("localhost"); Random random = new Random(); while (true) { try { Thread.sleep(random.nextInt(1000)); } catch (InterruptedException e) { e.printStackTrace(); } // 產生日誌信息 String log = "logloglog-----------"; // 把日誌信息放入到消息隊列 jedis.rpush("log_mq", log); } } } class OtherThread extends Thread { // 專門用來從消息隊列中取數據,寫入到緩沖輸出流 @Override public void run() { // 消息隊列 Jedis jedis = new Jedis("localhost"); // 緩沖輸出流 File file = new File("h:\\system.log"); FileWriter fileWriter = null; BufferedWriter bufferedWriter = null; try { fileWriter = new FileWriter(file); bufferedWriter = new BufferedWriter(fileWriter); // 不停的從消息隊列中讀數據,如果讀到,寫入到輸出流中, // 如果沒有讀到,不寫,然後讓線程“休息”一下--2秒 while (true) { // 從消息隊列取出一條消息 String log = jedis.lpop("log_mq"); if (log != null) { bufferedWriter.write(log); bufferedWriter.write("\n"); System.out.println("讀到了一條日記信息"); } else { // 睡眠2秒鐘 try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } } } catch (IOException e) { throw new RuntimeException(e); } finally { if (bufferedWriter != null) { try { bufferedWriter.close(); } catch (IOException e) { e.printStackTrace(); } } if (fileWriter != null) { try { fileWriter.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
- redis常用命令列表
常用命令(如果在命令行中執行,參數沒有小括號) 1)連接操作命令 quit:關閉連接(connection) auth:簡單密碼認證 help cmd: 查看cmd幫助,例如:help quit 2)持久化 save:將數據同步保存到磁盤 bgsave:將數據異步保存到磁盤 lastsave:返回上次成功將數據保存到磁盤的Unix時戳 shundown:將數據同步保存到磁盤,然後關閉服務 3)遠程服務控制 info:提供服務器的信息和統計 monitor:實時轉儲收到的請求 slaveof:改變復制策略設置 config:在運行時配置Redis服務器 4)對key操作的命令 exists(key):確認一個key是否存在 del(key):刪除一個key type(key):返回值的類型 keys(pattern):返回滿足給定pattern的所有key randomkey:隨機返回key空間的一個 keyrename(oldname, newname):重命名key dbsize:返回當前數據庫中key的數目 expire:設定一個key的活動時間(s) ttl:獲得一個key的活動時間 select(index):按索引查詢 move(key, dbindex):移動當前數據庫中的key到dbindex數據庫 flushdb:刪除當前選擇數據庫中的所有key flushall:刪除所有數據庫中的所有key 5)String set(key, value):把鍵值對存儲到數據庫中 get(key):返回數據庫中key對應的value getset(key, value):獲得key對應的當前值,然後設置新值 mget(key1, key2,…, key N):返回庫中多個string的value setnx(key, value):添加string,名稱為key,值為value setex(key, time, value):向庫中添加string,設定過期時間time mset(key N, value N):批量設置多個string的值 msetnx(key N, value N):如果所有名稱為key i的string都不存在 incr(key):名稱為key的string增1操作 incrby(key, integer):名稱為key的string增加integer decr(key):名稱為key的string減1操作 decrby(key, integer):名稱為key的string減少integer append(key, value):名稱為key的string的值附加value substr(key, start, end):返回名稱為key的string的value的子串 6)List rpush(key, value):在名稱為key的list尾添加一個值為value的元素---------消息隊列相關方法 lpush(key, value):在名稱為key的list頭添加一個值為value的 元素 llen(key):返回名稱為key的list的長度 lrange(key, start, end):返回名稱為key的list中start至end之間的元素 ltrim(key, start, end):截取名稱為key的list lindex(key, index):返回名稱為key的list中index位置的元素 lset(key, index, value):給名稱為key的list中index位置的元素賦值 lrem(key, count, value):刪除count個key的list中值為value的元素 lpop(key):返回並刪除名稱為key的list中的首元素------消息隊列相關方法 rpop(key):返回並刪除名稱為key的list中的尾元素 blpop(key1, key2,… key N, timeout):lpop命令的block版本。 brpop(key1, key2,… key N, timeout):rpop的block版本。 rpoplpush(srckey, dstkey):返回並刪除名稱為srckey的list的尾元素,並將該元素添加到名稱為dstkey的list的頭部 7)Set sadd(key, member):向名稱為key的set中添加元素member srem(key, member) :刪除名稱為key的set中的元素member spop(key) :隨機返回並刪除名稱為key的set中一個元素 smove(srckey, dstkey, member) :移到集合元素 scard(key) :返回名稱為key的set的基數 sismember(key, member) :member是否是名稱為key的set的元素 sinter(key1, key2,…key N) :求交集 sinterstore(dstkey, (keys)) :求交集並將交集保存到dstkey的集合 sunion(key1, (keys)) :求並集 sunionstore(dstkey, (keys)) :求並集並將並集保存到dstkey的集合 sdiff(key1, (keys)) :求差集 sdiffstore(dstkey, (keys)) :求差集並將差集保存到dstkey的集合 smembers(key) :返回名稱為key的set的所有元素 srandmember(key) :隨機返回名稱為key的set的一個元素 8)Hash hset(key, field, value):向名稱為key的hash中添加元素field hget(key, field):返回名稱為key的hash中field對應的value hmget(key, (fields)):返回名稱為key的hash中field i對應的value hmset(key, (fields)):向名稱為key的hash中添加元素field hincrby(key, field, integer):將名稱為key的hash中field的value增加integer hexists(key, field):名稱為key的hash中是否存在鍵為field的域 hdel(key, field):刪除名稱為key的hash中鍵為field的域 hlen(key):返回名稱為key的hash中元素個數 hkeys(key):返回名稱為key的hash中所有鍵 hvals(key):返回名稱為key的hash中所有鍵對應的value hgetall(key):返回名稱為key的hash中所有的鍵(field)及其對應的value
- redis參考網站
http://redisdoc.com
關於redis的使用總結