1. 程式人生 > >關於redis的使用總結

關於redis的使用總結

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的使用總結