1. 程式人生 > >Redis鍵值對的value的資料型別

Redis鍵值對的value的資料型別

1、Redis支援五種資料型別:string(字串),hash(雜湊),list(列表),set(集合)及zset(sorted set:有序集合)。
    String型別的資料(作為快取使用),列舉少量用法:
        1.插入和讀取一條string型別的資料
            redis notrue-centos:6379> set  sessionid-0001  "zhangsan"
            OK
            redis notrue-centos:6379> get  sessionid-0001
            "zhangsan"
        2.對string型別資料進行增減(前提是這條資料的value可以看成數字)
            DECR key
            INCR key

            DECRBY key decrement(減少量,如 2)
            INCRBY key increment(增加量,如 2)
        3.批量插入、批量獲取多條資料
            MSET  k1  v1  k2  v2  …
            MGET  k1  k2

        4.在插入一條string型別資料的同時為它指定一個存活期限
            setex  k1  10  v1
            釋:設定k1這條資料就只會存活10秒鐘,過期會被redis自動清除

        應用:將一個自定義的物件比如product存入redis
        實現方式二:將物件轉成json字串來存取 (簡單明瞭,推薦)
            /**
            * 將物件轉成json字串後快取到redis的string結構資料中
            */
            @Test
            public void testObjectToJsonCache(){
                //jedis連線並操作redis
                Jedis jedis = new Jedis("127.0.0.1", 6379);

                ProductInfo  p = new  ProductInfo();
                p.setName("ABC");
                p.setDescription("劉亦菲專用");
                p.setCatelog("夜用型");
                p.setPrice(10.8);

                //利用google的gson將物件轉成json串
                Gson  gson = new  Gson();
                String  pJson = gson.toJson(p);

                //將json串存入redis
                jedis.set("prodcut:02", pJson);

                //從redis中取出物件的json串
                String  pJsonResp = jedis.get("prodcut:02");

                //將返回的json解析成物件
                ProductInfo  pResponse = gson.fromJson(pJsonResp, ProductInfo.class);

                //顯示物件的屬性
                System.out.println(pResponse);
            }
    List資料結構
        從頭部(左邊)插入資料:lpush  key  v1  v2  v3
        從尾部(右邊)插入資料:rpush  key  v1  v2  v3
        讀取list中指定範圍的values:lrange  key  start   end
            redis> lrange  task-queue  0  -1      (-1表示讀取整個list)
        #從頭部彈出一個元素:lpop  key
        #從尾部彈出一個元素:rpop  key
        #從一個list的尾部彈出一個元素插入到另一個list:rpoplpush  key1  key2

      List的應用案例demo
        任務排程系統:
        生產者不斷產生任務,放入task-queue排隊
        消費者不斷拿出任務來處理,同時放入一個tmp-queue暫存;如果任務處理成功,則清除tmp-queue,否則,將任務彈回task-queue

        程式碼實現:
        A、生產者——模擬產生任務
            public class TaskProducer {
                // 獲取一個redis的客戶端連線物件(這裡我們用的是jedis)
                public static Jedis getRedisConnection(String host, int port) {
                    Jedis jedis = new Jedis(host, port);
                    return jedis;
                }
                public static void main(String[] args) {
                    // redis伺服器的ip地址和預設埠
                    Jedis jedis = getRedisConnection("192.168.2.70", 6379);
                    // 隨機數,這裡用於間隔生產者任務的產生
                    Random random = new Random();
                    // 生成任務
                    while (true) {
                        // 生成任務的速度有一定的隨機性,在1-2秒之間
                        Thread.sleep(random.nextInt(1000) + 1000);
                        // 生成一個任務
                        String taskid = UUID.randomUUID().toString();
                        // 往任務佇列"task-queue"中插入,第一次插入時,"task-queue"還不存在
                        //但是lpush方法會在redis庫中建立一條新的list資料
                        jedis.lpush("task-queue", taskid);
                        System.out.println("向任務佇列中插入了一個新的任務: " + taskid);
                    }
                }
            }
        B、消費者——模擬處理任務,並且管理暫存佇列
            public class TaskConsumer {
                public static void main(String[] args) {
                    Jedis jedis = new Jedis("192.168.2.70", 6379);
                    Random random = new Random();
                    while (true) {
                        // 從task-queue中取一個任務,同時放入"tmp-queue"
                        String taskid = jedis.rpoplpush("task-queue", "tmp-queue");
                        // 模擬處理任務
                        Thread.sleep(1000);
                        // 模擬有成功又有失敗的情況
                        int nextInt = random.nextInt(13);
                        if (nextInt % 7 == 0) {  // 模擬失敗的情況
                            // 失敗的情況下,需要將任務從"tmp-queue"彈回"task-queue"
                            jedis.rpoplpush("tmp-queue", "task-queue");
                            System.out.println("-------任務處理失敗: " + taskid);
                        } else {  // 模擬成功的情況
                            // 成功的情況下,將任務從"tmp-queue"清除
                            jedis.rpop("tmp-queue");
                            System.out.println("任務處理成功: " + taskid);
                        }
                    }
                }
            }
    上述機制是一個簡化版,真實版的任務排程系統會更加複雜,如下所示:
    (增加了一個專門用來管理暫存佇列的角色,以便就算消費者程式失敗退出,那些處理失敗的任務依然可以被彈回task-queue)