解析Redis的5中数据类型

一.在SpringBoot中配置和使用Redis
1.在SpringBoot中配置Redis
创基金一个maven项目,在配置文件中加入redis配置,
redis:
#database:9
host: 127.0.0.1
port: 6379
password:
database: 0
pool:
max-idle: 8
min-idle: 0
max-active: 8
max-wait: -1
2.在pom文件中引入redis依赖
以下是核心代码
二.操作Redis数据类型
常用的redis数据类型(字符串,散列,列表,集合,有序集合),主要从RedisTemplate的角度,因为在大部分的场景下,并不需要很复杂的操作redis,仅仅是很简单的使用而已,也就是只要操作一次redis.
/**
* 操作redis字符串和散列数据类型
* @return
*/
@RequestMapping("/stringAndHash")
@ResponseBody
public List testStringAndHash(){

	redisTemplate.opsForValue().set("key1", "value1");
	//这里使用了redis的反序列化器,所以redis保存时不时整数,不能运算
	redisTemplate.opsForValue().set("int_key", "1");
	stringRedisTemplate.opsForValue().set("int", "1");
	//使用运算
	stringRedisTemplate.opsForValue().increment("int", 5);
	System.out.println(stringRedisTemplate.opsForValue().get("int"));
	//获取底层Jredis链接
	Jedis jedis = (Jedis)         stringRedisTemplate.getConnectionFactory().getConnection().getNativeConnection();
	//减一操作,这个命令redisTemplate不支持,所以我先获取底层链接再操作
	jedis.decr("int");
	System.out.println(stringRedisTemplate.opsForValue().get("int"));
	Map<String,String> hash = new HashMap<String,String>();
	hash.put("field1", "value1");
	hash.put("field2", "value2");
	//存入一个散列数据类型
	stringRedisTemplate.opsForHash().putAll("hash", hash);
	//新增一个字段
	stringRedisTemplate.opsForHash().put("hash", "field3", "value3" );
	//绑定散列操作key,这样可以连续对同一个散列数据类型进行操作
	BoundHashOperations hashOps = stringRedisTemplate.boundHashOps("hash");
	//删除俩个字段
	hashOps.delete("field1","field2");
	hashOps.put("field4", "value4");
	List<String> list = jedis.hmget("hash", "field1","field2","field3","field4","field5");
	//https://www.cnblogs.com/lltse/p/5113886.htmlv
	System.out.println(list);
	return list;

}
要注意的是“int_key”存入到redis服务器中,因为采用了JDK序列化器,所以在redis服务器中它不是整数,而是一个被JDK序列化器序列化后的二进制字符串,是没有办法是用redis命令进行运算的,如果非要进行加减运算操作,这里我们使用了Jedis对象,用他来做减一运算。
/**
* 使用spring操作列表(链表)
* @return
*/
@RequestMapping("/list")
@ResponseBody
public Map<String,Object> testList(){

	//插入一个列表
	stringRedisTemplate.opsForList().leftPushAll("list", "v1","v2","v3","v4","v5");
	//绑定list链表操作
	BoundListOperations listOps = stringRedisTemplate.boundListOps("list");
	//从右边弹出一个成员
	Object result1 = listOps.rightPop();
	Object result2 = listOps.index(1);
	//从左边插入链表
	listOps.leftPush("v0");
	//求链表长度
	Long size = listOps.size();
	//求链表下标区间成员
	List elements = listOps.range(0, size-1);
	Map<String,Object> map = new HashMap<String,Object>();
	map.put("success", true);
	return map;

}

上诉操作都是基于stringRedisTemplate的,所以保存到redis服务器的都是字符串类型,需要注意的问题是顺序问题,在redis中下标是从0开始的。
/**
* 使用spring操作集合
* @return
*/
@RequestMapping("/set")
@ResponseBody
public Map<String,Object> testSet(){

	stringRedisTemplate.opsForSet().add("set1", "v1","v1","v2","v3","v4","v5");
	stringRedisTemplate.opsForSet().add("set2", "v2","v4","v6","v8");
	//绑定set1集合操作
	BoundSetOperations setOps = stringRedisTemplate.boundSetOps("set1");
	//添加俩个元素
	setOps.add("v6","v7");
	//删除俩个元素
	setOps.remove("v1","v7");
	//返回所有元素
	Set set1 = setOps.members();
	//求成员数
	Long size = setOps.size();
	//求交集
	Set inter = setOps.intersect("set2");
	//求交集,并使用新集合inter保存
	setOps.intersectAndStore("set2", "inter");
	//求差集
	Set diff = setOps.diff("set2");
	//求差集,并使用新集合diff保存
	setOps.diffAndStore("set2", "diff");
	//求并集
	Set union = setOps.union("set2");
	//求并集,并使用新集合union保存
	setOps.unionAndStore("set2", "union");
	Map<String,Object> map = new HashMap<String,Object>();
	map.put("success", true);
	return map;

}
这里添加set1时,存在俩个v1一样的元素,因为集合不允许重复,所以实际上集合只算是一个元素,然后可以对集合进行操作,交,差,并集。

/**
* 操作redis有序集合
* @return
*/
@RequestMapping("/zset")
@ResponseBody
public Map<String,Object> testZset(){

	Set<TypedTuple<String>> typedTupleSet = new HashSet();
	for (int i = 1; i <=9; i++) {
		//分数
		double score = i*0.1;
		//创建一个TypedTuple对象,存入值和分数
		TypedTuple<String> typedTuple = new DefaultTypedTuple<String>("value" + i, score);
		typedTupleSet.add(typedTuple);
	}
	//往有序集合里面插入元素
	stringRedisTemplate.opsForZSet().add("value", typedTupleSet);
	//绑定zset有序集合操作
	BoundZSetOperations<String,String> zsetOps = stringRedisTemplate.boundZSetOps("zset1");
	//增加一个元素
	zsetOps.add("value10", 0.26);
	Set<String> setRange = zsetOps.range(1, 6);
	//按分数排序,获取有序集合
	Set<String> setScore = zsetOps.rangeByScore(0.2, 0.6);
	//定义值范围
	Range range = new Range();
	range.gt("value3");//大于value3
	//range.gte("value3");//大于等于value3
	//range.lt("value8");//小于value3
	range.lte("value8");//小于等于value3
	//按值排序,根据字符串排序
	Set<String> setLex = zsetOps.rangeByLex(range);
	//删除元素
	zsetOps.remove("value9","value2");
	//求分数
	Double score = zsetOps.score("value8");
	//在下标区间下,按分数排序,同时返回value和score
	Set<TypedTuple<String>> rangeSet = zsetOps.rangeWithScores(1, 6);
	//在分数区间下,按分数排序,同时返回value和score
	Set<TypedTuple<String>> csoreSet = zsetOps.rangeByScoreWithScores(1, 6);
	//按从大到小排序
	Set<String> reverseSet = zsetOps.reverseRange(2, 8);
	Map<String,Object> map = new HashMap<String,Object>();
	map.put("success", true);
	return map;

}
代码中使用了TypedTuple保存有续集合元素,在默认情况下,有序集合是从小到大的顺序的,按下标,分数,和值进行排序获取有序集合元素,或者连同分数一起返回,有时候还可以进行从大到小的排序,只是在使用值排序时,我们可以用Spring为我们创建的Range类,定义范围。

猜你喜欢

转载自blog.csdn.net/huahuaxiji/article/details/88570483