本文主要讲解在IDEA上对Jedis中关于Redis五种不同数据结构的具体操作,如果需要完整代码配置的,可以到github上下载相关代码。https://github.com/carson0408/JredisDemo.git
至于如何建立Maven项目,之前博客已经仔细讲述过,这里就不叙述了。直接讲Jedis使用需要的Jar包。
4.0.0
com.carson
JredisTest
1.0-SNAPSHOT
redis.clients
jedis
2.9.0
commons-pool
commons-pool
20030825.183949
junit
junit
4.12
org.apache.logging.log4j
log4j-core
2.10.0
log4j
log4j
1.2.17
import redis.clients.jedis.BitOP;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisShardInfo;
import java.util.logging.Logger;
public class StringDemo {
/**
* 连接上redis服务器
* @return
*/
public static Jedis getJedis(){
JedisShardInfo info = new JedisShardInfo("127.0.0.1", 6379);
Jedis jedis = new Jedis(info);
return jedis;
}
public static void testString(Jedis jedis){
//对set、get、incr、decr的用法示例,其中String数据结构中key是String类型,但是value可以是字符串、整数和浮点数
try {
jedis.set("name", "carson");
jedis.set("age", "25");
jedis.set("money", "26.5");
jedis.incr("age");
jedis.incrBy("age", 10);
String age = jedis.get("age");
String name = jedis.get("name");
System.out.println(name + ":" + age);
System.out.println("age:" + jedis.decrBy("age", 5));
}catch(Exception e){
e.printStackTrace();
}
// System.out.println(jedis.incrByFloat("money",3.5));
//setnx key_name value:设值,如果存在key_name,则什么都不做,反之设值。
try {
jedis.setnx("money", "31");
System.out.println("使用设值之后的money:" + jedis.get("money"));
}catch(Exception e){
e.printStackTrace();
}
//append方法的使用
try {
jedis.append("name", " Jack");
System.out.println("append全名之后的name是:" + jedis.get("name"));
}catch(Exception e){
e.printStackTrace();
}
//getrange、setrange的使用
try {
System.out.println("取前四个字节是:"+jedis.getrange("name", 0, 3));
jedis.setrange("name", 5, "abc");
System.out.println("修改之后的name是:" + jedis.get("name"));
}catch(Exception e){
e.printStackTrace();
}
//setbit key_name offset value:将字符串看作二进制位串,并将位串中偏移量为offset的二进制位的值
//getbit key_name offset:将字符串看作是二进制位串,并将位串中偏移量为offset的二进制位的值。
try {
System.out.println("name值的二进制位的第五位是:" + jedis.getbit("name", 5));
jedis.setbit("name", 5, true);
System.out.println("改变第5位的值后:" + jedis.get("name"));
}catch(Exception e){
e.printStackTrace();
}
//判断是否存在key
try {
System.out.println("name是否存在:" + jedis.exists("name"));
}catch(Exception e){
e.printStackTrace();
}
//mset key1 value1 [key2 value2 ...]:批量添加
//mget key1 [key2 ....]:批量获取
try {
System.out.println("批量获取name、name1、name2对应的值是:"+jedis.mget("name", "name1", "name2"));
jedis.mset("one","1","two","2","three","3");
System.out.println("批量获取到的one、two、three对应的值是:"+jedis.mget("one","two","three"));
}catch(Exception e){
e.printStackTrace();
}
//expire key time:为key设置过期时间
try {
System.out.println("设置过期时间之前的name值:" + jedis.get("name"));
jedis.expire("name",5);
Thread.sleep(6000);
System.out.println("过期时间到达之后的name值:"+jedis.get("name"));
}catch(Exception e){
e.printStackTrace();
}
//setex key time value:这个是原子操作,同步进行,而set+expire是两步操作。
try{
jedis.setex("name",5,"carson");
System.out.println("过期时间之前的name值:"+jedis.get("name"));
Thread.sleep(6000);
System.out.println("过期时间之后的name值:"+jedis.get("name"));
}catch(Exception e){
e.printStackTrace();
}
}
}
import redis.clients.jedis.BinaryClient;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisShardInfo;
public class ListDemo {
/**
* 连接上redis服务器
* @return
*/
public static Jedis getJedis(){
JedisShardInfo info = new JedisShardInfo("127.0.0.1", 6379);
Jedis jedis = new Jedis(info);
return jedis;
}
/**
* 测试List相关的方法
* List即为链表,可以联想Java中的数据结构双向链表,两者有许多相似之处
* @param jedis
*/
public static void testList(Jedis jedis){
//lpush list_name value:链表头插入元素,可以多个元素
//rpush list_name value 链表尾插入元素
//lpop list_name :链表头弹出元素
//rpop list_name :链表尾弹出元素
//lrange list_name start end:输出start到end偏移量之间的所有元素
try{
jedis.lpush("list_","book");
jedis.rpush("list_","table");
jedis.lpush("list_","pen");
jedis.rpush("list_","pencil");
jedis.rpush("list_","watch");
jedis.lpush("list_","ball");
jedis.rpush("list_","water");
jedis.rpush("list_","bag");
System.out.println("获取当前list_链表所有元素:"+jedis.lrange("list_",0,-1));
System.out.println("从链表头弹出的元素是:"+jedis.lpop("list_"));
System.out.println("从链表尾弹出的元素是:"+jedis.rpop("list_"));
}catch (Exception e){
e.printStackTrace();
}
finally {
System.out.println();
}
//lrem list_name count value:链表中删除与value相等的元素,其中count>0时,表示移除与value相等的元素,数量为count
//count<0表示从尾到头搜索,移除与value相等的元素,数量为count
//count=0表示移除表中所有与value相等的元素
try{
System.out.println("当前list_所有元素是:"+jedis.lrange("list_",0,-1));
jedis.lrem("list_",2,"book");
System.out.println("删除两个book元素之后的list_所有元素:"+jedis.lrange("list_",0,-1));
}catch(Exception e){
e.printStackTrace();
}
finally {
System.out.println();
}
//lindex list_name index:获取链表list_name中下标为index的值
//lset list_name index value:将链表下标为index的元素值设为value
//ltrim list_name start end:截取start和end之间的元素
try{
System.out.println("链表list_中下标3的元素是:"+jedis.lindex("list_",3));
jedis.lset("list_",2,"banana");
System.out.println("修改值之后list_的所有元素:"+jedis.lrange("list_",0,-1));
jedis.ltrim("list_",1,3);
System.out.println("截取之后list_中的元素为"+jedis.lrange("list_",0,-1));
}catch(Exception e){
e.printStackTrace();
}
finally {
System.out.println();
}
//llen list_name:获取链表长度
//linsert list_name before|after pivot value :将value插入pivot前或者后面,当pivot不存在时,则不操作。当有多个pivot时,以第一个pivot为主
try{
long size = jedis.llen("list_");
System.out.println(size);
System.out.println("执行插入操作之前list_链表的所有元素有:"+jedis.lrange("list_",0,-1));
jedis.linsert("list_", BinaryClient.LIST_POSITION.BEFORE,"banana","apple");
System.out.println("执行插入操作之后的链表list_所有元素为:"+jedis.lrange("list_",0,-1));
jedis.linsert("list_", BinaryClient.LIST_POSITION.AFTER,"banana","apple");
System.out.println("执行插入操作之后的链表list_所有元素为:"+jedis.lrange("list_",0,-1));
}catch(Exception e){
e.printStackTrace();
}
finally {
System.out.println();
}
//rpoplpush list_name source dest:将source链表从尾部弹出,从dest头部压进
try{
int size = Integer.parseInt(""+jedis.llen("list_"));
System.out.println("执行转移操作之前的list_元素有:"+jedis.lrange("list_",0,-1));
for(int i=0;i
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisShardInfo;
public class SetDemo {
/**
* 连接上redis服务器
* @return
*/
public static Jedis getJedis(){
JedisShardInfo info = new JedisShardInfo("127.0.0.1", 6379);
Jedis jedis = new Jedis(info);
return jedis;
}
/**
* 主要讲解集合set的一些常见方法,该集合可以参考Java的集合,同样具有无序性、不可重复性
* @param jedis
*/
public static void testSet(Jedis jedis){
//sadd set_name value1 [value2 ...]:添加元素到集合中
//smembers set_name:输出集合中所有元素
//scard set_name:返回链表的数量
try{
jedis.sadd("myset","apple","banana","orange");
System.out.println(jedis.smembers("myset"));
System.out.println(jedis.scard("myset"));
}catch(Exception e){
e.printStackTrace();
}
finally{
System.out.println();
}
//srem set_name value1 [value2 ....]:从集合离面移除一个或者多个元素,并返回被移除元素的数量
//spop set_name:随机地移除集合中的一个元素,并返回被移除的元素
try{
System.out.println("移除元素个数:"+jedis.srem("myset","banana"));
System.out.println("移除指定元素之后的myset包含元素有:"+jedis.smembers("myset"));
jedis.sadd("myset","peer","knif","ball");
System.out.println("添加三个元素之后的myset:"+jedis.smembers("myset"));
System.out.println("随机移除一个元素:"+jedis.spop("myset"));
System.out.println("随机移除一个元素之后的myset:"+jedis.smembers("myset"));
}catch(Exception e){
e.printStackTrace();
}
finally{
System.out.println();
}
//smove source_set dest_set item:如果集合source_set包含元素item,那么就会从集合source_set中移除元素item,并将元素item添加到集合dest_set中,
//如果item成功移除,那么返回1,否则返回0.
//sismember set_name item:检查元素item是否存在于集合set_name中
try{
System.out.println("当前myset中所有元素为:"+jedis.smembers("myset"));
String[] strs = {"banana","apple","peer","melon","berry"};
int size = strs.length;
for(int i=0;i
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisShardInfo;
import java.util.HashMap;
public class HashDemo {
/**
* 连接上redis服务器
* @return
*/
public static Jedis getJedis(){
JedisShardInfo info = new JedisShardInfo("127.0.0.1", 6379);
Jedis jedis = new Jedis(info);
return jedis;
}
/**
* 讲解哈希表的一些主要操作
* @param jedis
*/
public static void testHash(Jedis jedis){
//hset hash_name key value:给hash表hash_name添加key-value键值对
//hmset hash_name Map hash:给hash表同时添加一个或多个键值对,需要整合到map中作为hmset的输入
//hget hash_name key:获取hash表hash_name中key对应的value
//hmget hash_name key1 [key2 key3...]:获取多个key对应的值
try{
jedis.hset("myhash","name","Carson");
System.out.println("获取myhash表中name对应的值:"+jedis.hget("myhash","name"));
HashMap map = new HashMap();
map.put("age","20");
map.put("sex","female");
map.put("birth","0317");
jedis.hmset("myhash",map);
System.out.println("同时获取多个key对应的value:"+jedis.hmget("myhash","name","age","sex"));
}catch(Exception e){
e.printStackTrace();
}finally {
System.out.println();
}
//hkeys hash_name:获取hash表中所有的key
//hvals hash_name:获取hash表中所有的values
try{
System.out.println("获取myhash的所有的key:"+jedis.keys("myhash"));
System.out.println("获取myhash的所有的value:"+jedis.hvals("myhash"));
}catch(Exception e){
e.printStackTrace();
}finally{
System.out.println();
}
//hgetall hash_name:获取hash表所有的键值对
//hexists hash_name key:判断key是不是在hash表中
try{
System.out.println("获取myhash中所有的键值对:"+jedis.hgetAll("myhash"));
System.out.println("判断name是否在myhash中:"+jedis.hexists("myhash","name"));
}catch(Exception e){
e.printStackTrace();
}finally {
System.out.println();
}
//hlen hash_name:获取hash表的长度
//hdel hash_name key1 [key2...]:删除hash表中的一个或多个元素
try{
System.out.println("获取myhash表的长度:"+jedis.hlen("myhash"));
System.out.println("获取删除之前的myhash所有的元素:"+jedis.hgetAll("myhash"));
jedis.del("name","sex");
System.out.println("获取删除之后的myhash的元素:"+jedis.hgetAll("myhash"));
}catch(Exception e){
e.printStackTrace();
}finally {
System.out.println();
}
//hincrby hash_name key count:给hash表中key的值加数值count。
//hde
try{
jedis.hset("myhash","money","200");
System.out.println("incr之前的money对应的值:"+jedis.hget("myhash","money"));
jedis.hincrBy("myhash","money",10);
System.out.println("incr之后的money对应的值:"+jedis.hget("myhash","money"));
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] args){
testHash(getJedis());
}
}
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisShardInfo;
import java.util.HashMap;
public class ZsetDemo {
/**
* 连接上redis服务器
* @return
*/
public static Jedis getJedis(){
JedisShardInfo info = new JedisShardInfo("127.0.0.1", 6379);
Jedis jedis = new Jedis(info);
return jedis;
}
public static void testZset(Jedis jedis){
//zadd zset_name score member:zset_name有序集合中key值为member,value为score,注意顺序,同时该有序集合是以score进行排序的,重复member则会覆盖。
//zadd zset_name Mapmap:对zset_name有序集合添加一个member、score键值对的map。
//zcard zset_name :返回有序集zset_name的元素个数
try{
jedis.zadd("myzset",100.0,"id:1001");
HashMap map = new HashMap();
map.put("id:1002",50.0);
map.put("id:1003",125.0);
map.put("id:1004",75.0);
map.put("id:1005",180.0);
jedis.zadd("myzset",map);
System.out.println("当前myzset的元素的个数是:"+jedis.zcard("myzset"));
}catch (Exception e){
e.printStackTrace();
}finally {
System.out.println();
}
//zcount zset_name min max:返回有序集中,score值>=min且<=max的成员的数量
//zrangeByscore(zrangeByscoreWithscores) zset_name start end [withscores]:返回有序集合中的score区间的元素
//zrange(zrangeWithscores) zset_name start end [withscores]:返回有序集中指定区间内的位置,成员位置按score从小到大排序
//zrevrange(zrevrangeWithscores) zset_name start end [withscores]:返回有序集中指定区间内的位置,成员位置按score从大到小排序
//zrevrangeByscore(zrevrangeByscoreWithscores) zset_name start end [withscores]:返回有序集合中的score区间的元素,score从大到小排序
try{
System.out.println("myzset中score处于100到200之间的元素有:"+jedis.zcount("myzset",100,200));
System.out.println("返回利用score范围的元素的成员值:"+jedis.zrangeByScore("myzset",100,200));
System.out.println("返回利用score区间的成员值包含score:"+jedis.zrangeByScoreWithScores("myzset",100,200));
System.out.println("返回有序区间score排名区间内的所有成员值:"+jedis.zrange("myzset",0,-1));
System.out.println("返回有序区间score排名区间内的所有成员与score值对:"+jedis.zrangeWithScores("myzset",0,-1));
System.out.println("返回从高到低score排名区间的所有值:"+jedis.zrevrange("myzset",0,-1));
System.out.println("返回从高到低score排名区间的所有值score对:"+jedis.zrevrangeWithScores("myzset",0,-1));
System.out.println("返回从高到低score区间内的所有成员值:"+jedis.zrevrangeByScore("myzset",200,100));
System.out.println("返回从高到低score区间内的所有成员score值对:"+jedis.zrevrangeByScoreWithScores("myzset",200,100));
}catch(Exception e){
e.printStackTrace();
}finally {
System.out.println();
}
//zrank zset_name member:查member在zset_name中排名位置,score从小到大排序,其中最小的为0
//zrevrank zset_name member:查member在zset_name中排名位置,score从大到小排序,其中最大的为0.
try{
System.out.println("在从小到大的有序集合中id:1002的排名是:"+jedis.zrank("myzset","id:1002"));
System.out.println("在从大到小的有序集合中id:1002的排名是:"+jedis.zrevrank("myzset","id:1002"));
}catch (Exception e){
e.printStackTrace();
}finally {
System.out.println();
}
//zrem zset_name member [member...]:移除指定一个或多个的member,不存在的member被忽略
//zremrangebyrank zset_name start end:删除排名区间内的元素
//zremrangebyscore zset_name min max:删除score区间内的元素
try{
System.out.println("移除之前的myzset:"+jedis.zrange("myzset",0,-1));
jedis.zrem("myzset","id:1001","id:1010");
System.out.println("zrem之后的myzset元素:"+jedis.zrangeWithScores("myzset",0,-1));
jedis.zremrangeByRank("myzset",0,1);
System.out.println("zremByRank之后的myzset元素是:"+jedis.zrangeWithScores("myzset",0,-1));
jedis.zremrangeByScore("myzset",150,200);
System.out.println("zremrangeByScore之后的myzset元素是:"+jedis.zrangeWithScores("myzset",0,-1));
}catch(Exception e){
e.printStackTrace();
}finally {
System.out.println();
}
}
public static void main(String[] args){
testZset(getJedis());
}
}
以上代码讲述了对redis五种数据结构的具体操作,还有详细的注解,可以了解一些方法的特性,便于对Redis的使用有更深的了解。