天天看點

Redis常用的一些功能

Redis常用的一些功能

Redis的特性 :

Strings:Strings 資料結構是簡單的key-value類型,value其實不僅是String,也可以是數字. 常用指令: set,get,decr,incr,mget 等。 常用方法:

  1. 清單内容

    擷取字元串長度

    往字元串append内容

    設定和擷取字元串的某一段内容

    設定及擷取字元串的某一位(bit)

    批量設定一系列字元串的内容

    Hashs:Redis Hash對應Value内部實際就是一個HashMap,常用指令:hget,hset,hgetall 等。

    Lists:Redis list的實作為一個雙向連結清單,即可以支援反向查找和周遊,更友善操作,不過帶來了部分額外的記憶體開銷,Redis内部的很多實作,包括發送緩沖隊列等也都是用的這個資料結構。 常用指令:lpush,rpush,lpop,rpop,lrange等。

    Sets:Sets 集合的概念就是一堆不重複值的組合。Redis還為集合提供了求交集、并集、差集等操作,可以非常友善的實作如共同關注、共同喜好、二度好友等功能。 常用指令:sadd,spop,smembers,sunion 等。

    Sorted Sets:Redis sorted set的使用場景與set類似,差別是set不是自動有序的。sorted set可以通過使用者額外提供一個優先級(score)的參數來為成員排序,并且是插入有序的,即自動排序。 常用指令:zadd,zrange,zrem,zcard等

計數:

Redis是一個很好的計數器,計數器是 Redis 的原子性自增操作可實作的最直覺的模式了,它的想法相當簡單:每當某個操作發生時,向 Redis 發送一個 INCR 指令。使用場景比如網站的通路數,注冊使用者數,文章的點贊數,高并發的秒殺活動,分布式序列号生成等等統計計數的功能實作。Redis 解決這類計數問題得心應手,相比關系資料庫速度更快,消耗資源更少。還可以通過set()方法來重置計數。

存值:這裡這樣存表示用于用于計數,不然會報錯

stringRedisTemplate.opsForValue().set("test","testValue",10);           
/*計數功能*/


    @RequestMapping("/count")
    @ResponseBody
    public String count(){



        ValueOperations<String,String> opsForValues=Template.opsForValue();
        //沒有計數前得到的是Value 存進去的testValue值
        System.out.println(opsForValues.get("test").equalsIgnoreCase("testValue"));
        for (int i = 4; i < 100; i++) {
            //計數,第一個參數為key值,第二個參數為每次增加計數的機關
            //計數的開始的值是0
            opsForValues.increment("test", 1);
        }
        //開始計數後得到的是計數
        System.out.println(opsForValues.get("test")); //100

        return "ok";


    }
           

時間計數

有時候除了簡單的計數外,比如注冊使用者數需要按日統計,處理方法比較簡單,把日期帶入計數器 key 就可以。以此類推,還可以按其他方式進行統計計數,隻需要把統計的方式添加到key值就可以了
@RequestMapping("/count2")
    @ResponseBody
    public String count2(){


        String key="test_"+new SimpleDateFormat("yyyy-MM-dd").format(new Date());
        ValueOperations<String,String> opsForValues=Template.opsForValue();
        //沒有計數前得到的是Value 存進去的testValue值
        System.out.println(opsForValues.get(key));
        for (int i = 0; i < 100; i++) {
            //計數,第一個參數為key值,第二個參數為每次增加計數的機關
            //不管
            opsForValues.increment(key, 1);
        }
        //開始計數後得到的是計數
        System.out.println(opsForValues.get(key)); //100

        return "ok";


    }
           

按模糊Key值查詢

在按條件統計計數的時候,把時間加入到了key值中,有時候要隻是查詢某個對象的統計數時,就可以使用模糊Key值查詢。
@RequestMapping("/like")
    @ResponseBody
    public String like(){

     ValueOperations<String,String> opsForValues=Template.opsForValue();
        //字首是user的key集合
        Set<String> set=Template.keys("use*");
        for (String s:set) {
            String str=opsForValues.get(s);
            //輸出每個key的value
        }

        return "ok";

    }           

使用hashs存儲擷取修改java對象

在實際開發中,我們經常将一些結構化的資訊打包成HashMap,在用戶端序列化後存儲為一個字元串的值,比如使用者的昵稱、年齡、性别、積分等,這時候在需要修改其中某一項時,通常需要将所有值取出反序列化後,修改某一項的值,再序列化存儲回去。這樣不僅增大了開銷,也不适用于一些可能并發操作的場合(比如兩個并發的操作都需要修改積分)。

而Redis的Hash結構可以使你像在資料庫中Update一個屬性一樣隻修改某一項屬性值。因為Redis的Hash結構是以對象的名字作為redis的key值,以對象的唯一屬性值作為hash的key值,以對象來作為redis的value值

@RequestMapping("/testHash")
    @ResponseBody
    public String testHash(){
        User user=new User(1,"tom","123");
        User user1=new User(2,"tom","123");
        HashOperations<String,Object,Object> hashOperations=Template.opsForHash();
        //把user=1的值改變
        hashOperations.put("test",user.getId(),user1);


        return "ok";

    }           

使用lists有序存儲讀取

用于擷取最近N個操作的資料。           
@RequestMapping("/testList")
    @ResponseBody
    public String testList(){
        //存儲有序
         ListOperations<String,String> listOperations=Template.opsForList();
         listOperations.leftPush("a","1");
         listOperations.leftPush("a","2");
         listOperations.leftPush("a","3");
         listOperations.leftPush("a","4");
         listOperations.leftPush("a","5");
         listOperations.leftPush("a","6");
         //保留5個key-value
         listOperations.trim("a",0,4); //[6, 5, 4, 3, 2]
         System.out.println(listOperations.range("a",0,listOperations.size("a")-1));
         //
         return "ok";

    }           

使用sets存儲讀取 無序 去重 求差集,交集,并集

//使用set存儲讀取 無序 去重 求差集,交集,并集
@RequestMapping("/testSet")
    @ResponseBody
    public String testSet(){
        SetOperations<String,String> set=Template.opsForSet();
        set.add("test7_1", "2", "1","2","3","4","4","3");
        set.add("test7_2", "2", "6","2","3","7","6","5");
        System.out.println("全部成員"+set.members("test7_1"));
        System.out.println("差集"+set.difference("test7_1", "test7_2"));
        System.out.println("交集"+set.intersect("test7_1", "test7_2"));
        System.out.println("并集"+set.union("test7_1", "test7_2"));
        return "ok";

    }           

Sorted Set 存取資料 排序

//Sorted Set 存取資料 排序 相比sets 儲存時多一個權重參數score,相當于按照此參數來排序
@RequestMapping("/testzSet")
    @ResponseBody
    public String testzSet(){
        ZSetOperations<String, String> zSet = Template.opsForZSet();
        zSet.add("test8", "use1", 9);
        zSet.add("test8", "use2", 1);
        zSet.add("test8", "use3", 5);
        zSet.add("test8", "use4", 9);
        //對應的score值增加
        //zSet.incrementScore("test8", "use1", 1);
        System.out.println(zSet.reverseRange("test8", 0, zSet.size("test8")-1));
        //輸出[use4, use1, use3, use2] 從高到低的順序
        return "ok";

    }

原文位址             http://www.bieryun.com/3732.html