Redis鍵值對的value的資料型別
阿新 • • 發佈:2018-12-11
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)