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"));
}
}