redis种类型对应java类型_Redis支持的五种数据类型操作,详细整理

话说Redis支持String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Zset(有序集合)五种数据类型,在java语言中,Redis对应的架包也有不少,最常用的当属Jedis、Lettuce和Redisson这三款框架,其中Jedis不仅小巧,而且实现简单,使用简单。下面就使用SpringBoot2.1.4整合Jedis框架,来把Redis所支持的数据类型一一写来。

首先,在pom文件中引入Jedis架包和测试架包;

redis.clients

jedis

2.9.1

org.springframework.boot

spring-boot-starter-test

这里需要加入Jedis client的版本号,不然会报错,这是需要注意的地方;不加回报:

Caused by: java.lang.ClassNotFoundException: redis.clients.jedis.Jedis

String(字符串类型)相关操作方法;

import org.junit.Test;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import redis.clients.jedis.Jedis;

/**

* 使用Jedis操作字符串示例

* @author

* @date 2019年12月23日

*/

public class StringTestDemo {

private static Logger log = LoggerFactory.getLogger(StringTestDemo.class);

@Test

public void operate(){

Jedis jedis = new Jedis("localhost", 6379);

//如果返回 pang 代表链接成功

log.info("1. jedis.ping():" + jedis.ping());

//设置key0的值 123456

jedis.set("key0", "123456");

//返回数据类型 string

log.info("2. jedis.type(key0): " + jedis.type("key0"));

//get key

log.info("3. jedis.get(key0): " + jedis.get("key0"));

// key是否存在

log.info("4. jedis.exists(key0):" + jedis.exists("key0"));

//返回key的长度

log.info("5. jedis.strlen(key0): " + jedis.strlen("key0"));

//返回截取字符串, 范围 0,-1 表示截取全部

log.info("6. jedis.getrange(key0): " + jedis.getrange("key0", 0, -1));

//返回截取字符串, 范围 1,4 表示从表示区间[1,4]

log.info("7. jedis.getrange(key0): " + jedis.getrange("key0", 1, 4));

//追加

log.info("8. jedis.append(key0): " + jedis.append("key0", "appendStr"));

log.info("9. jedis.get(key0): " + jedis.get("key0"));

//重命名

jedis.rename("key0", "key0_new");

//判断key 是否存在

log.info("10. jedis.exists(key0): " + jedis.exists("key0"));

//批量插入

jedis.mset("key1", "val1", "key2", "val2", "key3", "100");

//批量取出

log.info("11. jedis.mget(key1,key2,key3): " + jedis.mget("key1", "key2", "key3"));

//删除

log.info("12. jedis.del(key1): " + jedis.del("key1"));

log.info("13. jedis.exists(key1): " + jedis.exists("key1"));

//取出旧值 并set新值

log.info("14. jedis.getSet(key2): " + jedis.getSet("key2", "value3"));

//自增1 要求数值类型

log.info("15. jedis.incr(key3): " + jedis.incr("key3"));

//自增15 要求数值类型

log.info("16. jedis.incrBy(key3): " + jedis.incrBy("key3", 15));

//自减1 要求数值类型

log.info("17. jedis.decr(key3): " + jedis.decr("key3"));

//自减5 要求数值类型

log.info("18. jedis.decrBy(key3): " + jedis.decrBy("key3", 15));

//增加浮点类型

log.info("19. jedis.incrByFloat(key3): " + jedis.incrByFloat("key3", 1.1));

//返回0 只有在key不存在的时候才设置

log.info("20. jedis.setnx(key3): " + jedis.setnx("key3", "existVal"));

log.info("21. jedis.get(key3): " + jedis.get("key3"));// 3.1

//只有key都不存在的时候才设置,这里返回 null

log.info("22. jedis.msetnx(key2,key3): " + jedis.msetnx("key2", "exists1", "key3", "exists2"));

log.info("23. jedis.mget(key2,key3): " + jedis.mget("key2", "key3"));

//设置key 2 秒后失效

jedis.setex("key4", 2, "2 seconds is no Val");

try {

Thread.sleep(3000);

} catch (InterruptedException e) {

e.printStackTrace();

}

// 2 seconds is no Val

log.info("25. jedis.get(key4): " + jedis.get("key4"));

jedis.set("key6", "123456789");

//下标从0开始,从第三位开始,将新值覆盖旧值

jedis.setrange("key6", 3, "abcdefg");

//返回:123abcdefg

log.info("26. jedis.get(key6): " + jedis.get("key6"));

//返回所有匹配的key

log.info("27. jedis.get(key*): " + jedis.keys("key*"));

jedis.close();

}

}

ecbb95dd84fc

运行结果

Hash(哈希类型)相关的操作方法;

import java.util.HashMap;

import java.util.Map;

import org.junit.Test;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import redis.clients.jedis.Jedis;

/**

* Hash相关操作方法

* @author

* @date 2019年12月23日

*/

public class HashDemo {

private static Logger log = LoggerFactory.getLogger(HashDemo.class);

/**

* Redis hash 是一个string类型的field和value的映射表,

* hash特别适合用于存储对象。

* Redis 中每个 hash 可以存储 2^32 - 1 键值对(40多亿)

*/

@Test

public void operate() {

Jedis jedis = new Jedis("localhost");

jedis.del("config");

//设置hash的 field-value 对

jedis.hset("config", "ip", "127.0.0.1");

//取得hash的 field的关联的value值

log.info("0. jedis.hget(): " + jedis.hget("config", "ip"));

//取得类型:hash

log.info("0. jedis.type(): " + jedis.type("config"));

//批量添加 field-value 对,参数为java map

Map configFields = new HashMap();

configFields.put("port", "8080");

configFields.put("maxalive", "3600");

configFields.put("weight", "1.0");

//执行批量添加

jedis.hmset("config", configFields);

//批量获取:取得全部 field-value 对,返回 java map

log.info("1. jedis.hgetAll(): " + jedis.hgetAll("config"));

//批量获取:取得部分 field对应的value,返回 java map

log.info("2. jedis.hmget(): " + jedis.hmget("config", "ip", "port"));

//浮点数增加: 类似于String的 incrByFloat

jedis.hincrByFloat("config", "weight", 1.2);

log.info("3. jedis.hget(weight): " + jedis.hget("config", "weight"));

//获取所有的key

log.info("4. jedis.hkeys(config): " + jedis.hkeys("config"));

//获取所有的val

log.info("5. jedis.hvals(config): " + jedis.hvals("config"));

//获取长度

log.info("6. jedis.hlen(): " + jedis.hlen("config"));

//判断field是否存在

log.info("7. jedis.hexists(weight): " + jedis.hexists("config", "weight"));

//删除一个field

jedis.hdel("config", "weight");

log.info("8. jedis.hexists(weight): " + jedis.hexists("config", "weight"));

//删除后,查看是否存在

jedis.del("config");

log.info("9. jedis.hexists(weight): " + jedis.hexists("config", "weight"));

jedis.close();

}

}

ecbb95dd84fc

运行结果

List(字符串列表类型)相关的操作方法;

import org.junit.Test;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import redis.clients.jedis.Jedis;

/**

* list测试,list中只能存字符串

* @author

* @date 2019年12月23日

*/

public class ListDemo {

private static Logger log = LoggerFactory.getLogger(ListDemo.class);

/**

* Redis列表是简单的字符串列表,按照插入顺序排序。

* 可以添加一个元素到列表的头部(左边)或者尾部(右边)

*/

@Test

public void operate() {

Jedis jedis = new Jedis("localhost", 6379);

//从list尾部添加3个元素

jedis.rpush("list1", "zhangsan", "lisi", "wangwu");

//取得类型, list

log.info("1. jedis.type(): " +jedis.type("list1"));

//遍历区间[0,-1],取得全部的元素

log.info("2. jedis.lrange(0,-1): " +jedis.lrange("list1", 0, -1));

//遍历区间[1,2],取得区间的元素

log.info("3. jedis.lrange(1,2): " +jedis.lrange("list1", 1, 2));

//获取list长度

log.info("4. jedis.llen(list1): " +jedis.llen("list1"));

//获取下标为 1 的元素

log.info("5. jedis.lindex(list1,1): " +jedis.lindex("list1", 1));

//左侧弹出元素

log.info("6. jedis.lpop(): " +jedis.lpop("list1"));

//右侧弹出元素

log.info("7. jedis.rpop(): " +jedis.rpop("list1"));

//设置下标为0的元素val

jedis.lset("list1", 0, "lisi2");

//最后,遍历区间[0,-1],取得全部的元素

log.info("8. jedis.lrange(0,-1): " + jedis.lrange("list1", 0, -1));

//清除list1中所有的元素

jedis.del("list1");

log.info("9. jedis.del(list1):" + jedis.lrange("list1", 0, -1));

jedis.close();

}

}

ecbb95dd84fc

运行结果

Set(集合类型)相关的操作方法;

import org.junit.Test;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import redis.clients.jedis.Jedis;

/**

* set测试,是不重复的string无序集合

* @author

* @date 2019年12月23日

*/

public class SetDemo {

private static Logger log = LoggerFactory.getLogger(SetDemo.class);

/**

* Redis 的 Set 是 String 类型的无序集合。

* 集合成员是唯一的,这就意味着集合中不能出现重复的数据。

* Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

* 集合中最大的成员数为 2^32 - 1 (4294967295, 每个集合可存储40多亿个成员)。

*/

@Test

public void operate() {

Jedis jedis = new Jedis("localhost");

jedis.del("set1");

log.info("1. jedis.type(): " + jedis.type("set1"));

//sadd函数: 向集合添加元素

jedis.sadd("set1", "user01", "user02", "user03");

//smembers函数: 遍历所有元素

log.info("2. jedis.smembers(): " + jedis.smembers("set1"));

//scard函数: 获取集合元素个数

log.info("3. jedis.scard(): " + jedis.scard("set1"));

//sismember 判断是否是集合元素

log.info("4. jedis.sismember(user04): " + jedis.sismember("set1", "user04"));

//srem函数:移除元素

log.info("5. jedis.srem(): " + jedis.srem("set1", "user02", "user01"));

//smembers函数: 遍历所有元素

log.info("6. jedis.smembers(): " + jedis.smembers("set1"));

jedis.close();

}

}

ecbb95dd84fc

运行结果

ZSet(有序集合类型)相关的操作方法;

import org.junit.Test;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import redis.clients.jedis.Jedis;

import redis.clients.jedis.Tuple;

import java.util.HashMap;

import java.util.Map;

import java.util.Set;

/**

* zset测试

* @author

* @date 2019年12月23日

*/

public class ZSetDemo {

private static Logger log = LoggerFactory.getLogger(ZSetDemo.class);

/**

* Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。

* 不同的是每个元素都会关联一个double类型的分数。

* redis正是通过分数来为集合中的成员进行从小到大的排序。

* 有序集合的成员是唯一的,但分数(score)却可以重复。

* 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

* 集合中最大的成员数为 2^32 - 1 (4294967295, 每个集合可存储40多亿个成员)。

*/

@Test

public void operateZset() {

Jedis jedis = new Jedis("localhost");

Map members = new HashMap();

members.put("u01", 1000.0);

members.put("u02", 2000.0);

members.put("u03", 3000.0);

members.put("u04", 13000.0);

members.put("u05", 23000.0);

//批量添加元素

jedis.zadd("salary", members);

//类型,zset

log.info("1. jedis.type(): " + jedis.type("salary"));

//获取集合元素个数

log.info("2. jedis.zcard(): " + jedis.zcard("salary"));

//按照下标[起,止]遍历元素

log.info("3. jedis.zrange(): " + jedis.zrange("salary", 0, -1));

//按照下标[起,止]倒序遍历元素

log.info("4. jedis.zrevrange(): " + jedis.zrevrange("salary", 0, -1));

//按照分数(薪资)[起,止]遍历元素

log.info("5. jedis.zrangeByScore(): " + jedis.zrangeByScore("salary", 1000, 10000));

//按照薪资[起,止]遍历元素,带分数返回

Set res0 = jedis.zrangeByScoreWithScores("salary", 1000, 10000);

for (Tuple temp : res0) {

log.info("6. Tuple.get(): " + temp.getElement() + " -> " + temp.getScore());

}

//按照分数[起,止]倒序遍历元素

log.info("7. jedis.zrevrangeByScore(): " + jedis.zrevrangeByScore("salary", 1000, 4000));

//获取元素[起,止]分数区间的元素数量

log.info("8. jedis.zcount(): " + jedis.zcount("salary", 1000, 4000));

//获取元素score值:薪资

log.info("9. jedis.zscore(): " + jedis.zscore("salary", "u01"));

//获取元素下标

log.info("10. jedis.zrank(u01): " + jedis.zrank("salary", "u01"));

//倒序获取元素下标

log.info("11. jedis.zrevrank(u01): " + jedis.zrevrank("salary", "u01"));

//删除元素

log.info("12. jedis.zrem(): " + jedis.zrem("salary", "u01", "u02"));

//删除元素,通过下标范围

log.info("13. jedis.zremrangeByRank(): " + jedis.zremrangeByRank("salary", 0, 1));

//删除元素,通过分数范围

log.info("14. jedis.zremrangeByScore(): " + jedis.zremrangeByScore("salary", 20000, 30000));

//按照下标[起,止]遍历元素

log.info("15. jedis.zrange(): " + jedis.zrange("salary", 0, -1));

Map members2 = new HashMap();

members2.put("u11", 1136.0);

members2.put("u12", 2212.0);

members2.put("u13", 3324.0);

//批量添加元素

jedis.zadd("salary", members2);

//增加指定分数

log.info("16. jedis.zincrby(10000): " + jedis.zincrby("salary", 10000, "u13"));

//按照下标[起,止]遍历元素

log.info("17. jedis.zrange(): " + jedis.zrange("salary", 0, -1));

jedis.close();

}

}

ecbb95dd84fc

运行结果

别人写的demo,看起来很简单,自己来一遍,就会遇到这样那样意想不到的问题,并没有想得那么顺利;不管怎么样,还是按照别人的例子再来一遍比较好。这么多的方法,要靠不断地使用才能加深印象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值