springboot下的redis各项操作以及bit操作的应用场景与实现

springboot下集成redis请参考:https://blog.csdn.net/m0_37179470/article/details/81219424

主要包括:string、set、list、map和bit,其中bit操作可以用于大数据下统计多少用户在线,以及在毫秒级别下查询哪个用户在线。

应用场景:

用于数据量上亿的场景下,例如几亿用户系统的签到,去重登录次数统计,某用户是否在线状态等等。
想想一下腾讯10亿用户,要几个毫秒内查询到某个用户是否在线,你能怎么做?千万别说给每个用户建立一个key,然后挨个记(你可以算一下需要的内存会很恐怖,而且这种类似的需求很多,腾讯光这个得多花多少钱。。)好吧。这里要用到位操作——使用setbit、getbit、bitcount命令。

原理是:

redis内构建一个足够长的数组,每个数组元素只能是0和1两个值,然后这个数组的下标index用来表示我们上面例子里面的用户id(必须是数字哈),那么很显然,这个几亿长的大数组就能通过下标和元素值(0和1)来构建一个记忆系统,上面我说的几个场景也就能够实现。用到的命令是:setbit、getbit、bitcount。

package com.lzz;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.*;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.*;

/**
 * @author lzz
 * @description:
 * @date 2018/7/29 17:19
 */

@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisTemplateTest {

    @Autowired
    private RedisTemplate redisTemplate;


    @Test
    public void stringTest(){
        ValueOperations ops = redisTemplate.opsForValue();

        ops.set("user","操作666");
        System.out.println(ops.get("user"));
    }

    @Test
    public void listTest(){
        ListOperations<String,List<String>> ops = redisTemplate.opsForList();
        List list = new ArrayList<String>();
        list.add("value1");
        list.add("value2");
        list.add("value3");
        ops.leftPush("listKey",list);
        list = ops.leftPop("listKey");
        Iterator<String> itr = list.iterator();
        while(itr.hasNext()){
            System.out.println(itr.next());
        }
    }
    @Test
    public void setTest(){
        SetOperations<String,String> ops = redisTemplate.opsForSet();
        ops.add("key1","value1","value2","value3");
        Set<String> set = ops.members("key1");
        Iterator<String> iter = set.iterator();
        while(iter.hasNext()){
            System.out.println(iter.next());
        }
    }

    @Test
    public void mapTest(){
        Map map = new HashMap<String,String>();
        map.put("hashKey1","value1");
        map.put("hashKey2","value2");
        map.put("hashKey3","value3");
        HashOperations<String,String,String> ops = redisTemplate.opsForHash();
        ops.putAll("key2",map);
        map = ops.entries("key2");
        Iterator<String> iter = map.keySet().iterator();
        while(iter.hasNext()){
            System.out.println(map.get(iter.next()));
        }
    }
    /*计数器和查询(可以在毫秒级别查询到哪个用户是否在线)*/
    @Test
    public void bitTest(){
        ValueOperations<String,String> ops = redisTemplate.opsForValue();
        ops.set("userArray",new Long(0L).toString());
        ops.set("userCount",new Long(0L).toString());
        Long userid = 100L;
        ops.setBit("userArray",userid,true);
        ops.increment("userCount",2);
        //ops.set("userCount",ops.get("userCount")+1);
        System.out.println(ops.getBit("userArray",userid));
        System.out.println(ops.get("userCount"));
    }
}

猜你喜欢

转载自blog.csdn.net/m0_37179470/article/details/81449486