Java操作Redis详细介绍
1.简介
Redis是一个开源(BSD许可)的,内存中的key-value存储系统,它可以用作数据库、缓存和消息中间件。
2.对key的操作
首先要建立连接Jedisjedis=newJedis("127.0.0.1",6379),然后就可以对string,set,zset,hash进行操作了。
//对key的测试
publicvoidkeyTest(){
System.out.println(jedis.flushDB());
//清空数据
System.out.println(jedis.echo("hello"));
//打印hello
System.out.println(jedis.exists("foo"));
//判断key是否存在
jedis.set("key1","values1");
jedis.set("key2","values2");
System.out.println(jedis.exists("key1"));
//判断key是否存在
StringrandomKey=jedis.randomKey();
//选择一个随机的key
System.out.println("randomKey的为:"+randomKey);
jedis.expire("key1",60);
//生存时间
System.out.println(jedis.pttl("key1"));
//剩下的生存时间
//移除key的过期时间
jedis.persist("key1");
//获取key的类型,"string","list","set""none"none表示key不存在
System.out.println("type的类型为:"+jedis.type("key1"));
//key的类型
//导出key的值
Stringvalue=jedis.get("key1");
System.out.println(value);
//将key重命名
jedis.renamenx("key1","keytest");
System.out.println("key1是否存在:"+jedis.exists("key1"));
//判断是否存在
System.out.println("keytest是否存在:"+jedis.exists("keytest"));
//判断是否存在
//查询匹配的key
//KEYS*匹配数据库中所有key。
//KEYSh?llo匹配hello,hallo和hxllo等。
//KEYSh*llo匹配hllo和heeeeello等。
//KEYSh[ae]llo匹配hello和hallo,但不匹配hillo。
//特殊符号用\隔开。
Setset=jedis.keys("k*");
//获取所有相关的keykeys方法
System.out.println(set);
jedis.del("key1");
//删除keydel方法
System.out.println(jedis.exists("key1"));
}
3.String数据类型
setmystr"helloworld!"//设置字符串类型 getmystr//读取字符串类型 对字符串进行数值操作 127.0.0.1:6379>setmynum"2" OK 127.0.0.1:6379>getmynum "2" 127.0.0.1:6379>incrmynum (integer)3 127.0.0.1:6379>getmynum "3"
Java操作代码为:
//对string操作的测试
publicvoidstringTest(){
jedis.set("hello","hello");
//set
System.out.println(jedis.get("hello"));
//get
//使用append向字符串后面添加
jedis.append("hello","world");
//追加append方法
System.out.println(jedis.get("hello"));
//set覆盖字符串
jedis.set("hello","123");
System.out.println(jedis.get("hello"));
//设置过期时间
jedis.setex("hello2",2,"world2");
System.out.println(jedis.get("hello2"));
try{
Thread.sleep(3000);
}
catch(InterruptedExceptione){
e.printStackTrace();
}
System.out.println(jedis.get("hello2"));
//一次添加多个key-value对
jedis.mset("a","1","b","2");
//获取a和b的value
Listvalus=jedis.mget("a","b");
System.out.println(valus);
//批量删除
jedis.del("a","b");
System.out.println(jedis.exists("a"));
System.out.println(jedis.exists("b"));
}
4.List数据类型
redis中的lists在底层实现上并不是数组,而是链表。
一系列操作:RPUSH,LPUSH,LLEN,LRANGE,LPOP和RPOP。
我们可以用LPUSH在lists的左侧插入一个新元素,用RPUSH在lists的右侧插入一个新元素,用LRANGE命令从lists中指定一个范围来提取元素。
//新建一个list叫做mylist,并在列表头部插入元素"1" 127.0.0.1:6379>lpushmylist"1" //返回当前mylist中的元素个数 (integer)1 //在mylist右侧插入元素"2" 127.0.0.1:6379>rpushmylist"2" (integer)2 //在mylist左侧插入元素"0" 127.0.0.1:6379>lpushmylist"0" (integer)3 //列出mylist中从编号0到编号1的元素 127.0.0.1:6379>lrangemylist01 1)"0" 2)"1" //列出mylist中从编号0到倒数第一个元素 127.0.0.1:6379>lrangemylist0-1 1)"0" 2)"1" 3)"2"
Java操作代码为:
publicvoidlistTest(){
Stringkey="mylist";
jedis.del(key);
//把之前的删除
//队列添加元素
jedis.rpush(key,"aaaa");
jedis.rpush(key,"aaaa");
jedis.rpush(key,"bbbb");
jedis.rpush(key,"cccc");
jedis.rpush(key,"cccc");
//队列长度
System.out.println("lenth:"+jedis.llen(key));
//打印队列,从索引0开始,到倒数第1个(全部元素)
System.out.println("allelements:"+jedis.lrange(key,0,-1));
//索引为1的元素
System.out.println("indexof1:"+jedis.lindex(key,1));
//设置队列里面一个元素的值,当index超出范围时会返回一个error。
jedis.lset(key,1,"aa22");
System.out.println("indexof1:"+jedis.lindex(key,1));
//从队列的右边入队一个元素
jedis.rpush(key,"-2","-1");
//先-2,后-1入队列
System.out.println("allelements:"+jedis.lrange(key,0,-1));
//从队列的左边入队一个或多个元素
jedis.lpush(key,"secondelement","firstelement");
//先second
//element,后first
//elementF入队列
System.out.println("allelements:"+jedis.lrange(key,0,-1));
//从队列的右边出队一个元素
System.out.println(jedis.rpop(key));
//从队列的左边出队一个元素
System.out.println(jedis.lpop(key));
System.out.println("allelements:"+jedis.lrange(key,0,-1));
//count>0:从头往尾移除值为value的元素,count为移除的个数。
//count<0:从尾往头移除值为value的元素,count为移除的个数。
//count=0:移除所有值为value的元素。
jedis.lrem(key,1,"cccc");
System.out.println("allelements:"+jedis.lrange(key,0,-1));
//即最右边的那个元素也会被包含在内。如果start比list的尾部下标大的时候,会返回一个空列表。
//如果stop比list的实际尾部大的时候,Redis会当它是最后一个元素的下标。
System.out.println(jedis.lrange(key,0,2));
System.out.println("allelements:"+jedis.lrange(key,0,-1));
//删除区间以外的元素
System.out.println(jedis.ltrim(key,0,2));
System.out.println("allelements:"+jedis.lrange(key,0,-1));
}
5.Set类型
redis的集合,是一种无序的集合,集合中的元素没有先后顺序。
一系列操作:SADD,SREM,SISMEMBER,SMEMBERS和SUNION.
集合相关的操作也很丰富,如添加新元素、删除已有元素、取交集、取并集、取差集等。
//向集合myset中加入一个新元素"one" 127.0.0.1:6379>saddmyset"one" (integer)1 127.0.0.1:6379>saddmyset"two" (integer)1 //列出集合myset中的所有元素 127.0.0.1:6379>smembersmyset 1)"one" 2)"two" //判断元素1是否在集合myset中,返回1表示存在 127.0.0.1:6379>sismembermyset"one" (integer)1 //判断元素3是否在集合myset中,返回0表示不存在 127.0.0.1:6379>sismembermyset"three" (integer)0 //新建一个新的集合yourset 127.0.0.1:6379>saddyourset"1" (integer)1 127.0.0.1:6379>saddyourset"2" (integer)1 127.0.0.1:6379>smembersyourset 1)"1" 2)"2" //对两个集合求并集 127.0.0.1:6379>sunionmysetyourset 1)"1" 2)"one" 3)"2" 4)"two"
Java操作代码:
publicvoidsetTest(){
//清空数据
System.out.println(jedis.flushDB());
Stringkey="myset1";
Stringkey2="myset2";
//集合添加元素
jedis.sadd(key,"aaa","bbb","ccc");
jedis.sadd(key2,"bbb","ccc","ddd");
//获取集合里面的元素数量
System.out.println(jedis.scard(key));
//thenumbercountoftheset
//获得两个集合的交集,并存储在一个关键的结果集
jedis.sinterstore("destination",key,key2);
System.out.println(jedis.smembers("destination"));
//获得两个集合的并集,并存储在一个关键的结果集
jedis.sunionstore("destination",key,key2);
System.out.println(jedis.smembers("destination"));
//key1集合中,key2集合没有的元素,并存储在一个关键的结果集
jedis.sdiffstore("destination",key,key2);
System.out.println(jedis.smembers("destination"));
//确定某个元素是一个集合的成员
System.out.println(jedis.sismember(key,"aaa"));
//从key集合里面随机获取一个元素
System.out.println(jedis.srandmember(key));
//aaa从key移动到key2集合
jedis.smove(key,key2,"aaa");
System.out.println(jedis.smembers(key));
//获取集合中的元素
System.out.println(jedis.smembers(key2));
//删除并获取一个集合里面的元素
System.out.println(jedis.spop(key));
//从集合里删除一个或多个元素
jedis.srem(key2,"ccc","ddd");
System.out.println(jedis.smembers(key2));
}
6.SortedSets类型
我们都将redis中的有序集合叫做zsets
//新增一个有序集合myzset,并加入一个元素baidu.com,给它赋予的序号是1 127.0.0.1:6379>zaddmyzset1baidu.com (integer)1 //向myzset中新增一个元素360.com,赋予它的序号是3 127.0.0.1:6379>zaddmyzset3360.com (integer)1 //向myzset中新增一个元素google.com,赋予它的序号是2 127.0.0.1:6379>zaddmyzset2google.com (integer)1 //列出myzset的所有元素,同时列出其序号,可以看出myzset已经是有序的了。 127.0.0.1:6379>zrangemyzset0-1withscores 1)"baidu.com" 2)"1" 3)"google.com" 4)"2" 5)"360.com" 6)"3" //只列出myzset的元素 127.0.0.1:6379>zrangemyzset0-1 1)"baidu.com" 2)"google.com" 3)"360.com"
Java操作代码为:
publicvoidzsetTest(){
//清空数据
System.out.println(jedis.flushDB());
Stringkey="mysortset";
MapscoreMembers=newHashMap<>();
scoreMembers.put("aaa",1001.0);
scoreMembers.put("bbb",1002.0);
scoreMembers.put("ccc",1003.0);
//添加数据
jedis.zadd(key,1004.0,"ddd");
jedis.zadd(key,scoreMembers);
//获取一个排序的集合中的成员数量
System.out.println(jedis.zcard(key));
//返回的成员在指定范围内的有序集合,以0表示有序集第一个成员,以1表示有序集第二个成员,以此类推。
//负数下标,以-1表示最后一个成员,-2表示倒数第二个成员
Setcoll=jedis.zrange(key,0,-1);
System.out.println(coll);
//返回的成员在指定范围内的逆序集合
coll=jedis.zrevrange(key,0,-1);
System.out.println(coll);
//元素下标
System.out.println(jedis.zscore(key,"bbb"));
//删除元素
System.out.println(jedis.zrem(key,"aaa"));
System.out.println(jedis.zrange(key,0,-1));
//给定值范围内的成员数
System.out.println(jedis.zcount(key,1002.0,1003.0));
}
7.Hash类型
hashes存的是字符串和字符串值之间的映射
//建立哈希,并赋值 127.0.0.1:6379>HMSETuser:001usernameantirezpasswordP1pp0age34 OK //列出哈希的内容 127.0.0.1:6379>HGETALLuser:001 1)"username" 2)"antirez" 3)"password" 4)"P1pp0" 5)"age" 6)"34" //更改哈希中的某一个值 127.0.0.1:6379>HSETuser:001password12345 (integer)0 //再次列出哈希的内容 127.0.0.1:6379>HGETALLuser:001 1)"username" 2)"antirez" 3)"password" 4)"12345" 5)"age" 6)"34"
Java操作代码:
publicvoidhashTest(){
//清空数据
System.out.println(jedis.flushDB());
Stringkey="myhash";
Maphash=newHashMap<>();
hash.put("aaa","11");
hash.put("bbb","22");
hash.put("ccc","33");
//添加数据
jedis.hmset(key,hash);
jedis.hset(key,"ddd","44");
//获取hash的所有元素(key值)
System.out.println(jedis.hkeys(key));
//获取hash中所有的key对应的value值
System.out.println(jedis.hvals(key));
//获取hash里所有元素的数量
System.out.println(jedis.hlen(key));
//获取hash中全部的域和值,以Map的形式返回
Mapelements=jedis.hgetAll(key);
System.out.println(elements);
//判断给定key值是否存在于哈希集中
System.out.println(jedis.hexists(key,"bbb"));
//获取hash里面指定字段对应的值
System.out.println(jedis.hmget(key,"aaa","bbb"));
//获取指定的值
System.out.println(jedis.hget(key,"aaa"));
//删除指定的值
System.out.println(jedis.hdel(key,"aaa"));
System.out.println(jedis.hgetAll(key));
//为key中的域field的值加上增量increment
System.out.println(jedis.hincrBy(key,"bbb",100));
System.out.println(jedis.hgetAll(key));
}
8.事务
事务是指“一个完整的动作,要么全部执行,要么什么也没有做”。
在聊redis事务处理之前,要先和大家介绍四个redis指令,即MULTI、EXEC、DISCARD、WATCH。这四个指令构成了redis事务处理的基础。
1.MULTI用来组装一个事务;
2.EXEC用来执行一个事务;
3.DISCARD用来取消一个事务;
4.WATCH用来监视一些key,一旦这些key在事务执行之前被改变,则取消事务的执行。
redis>MULTI//标记事务开始 OK redis>INCRuser_id//多条命令按顺序入队 QUEUED redis>INCRuser_id QUEUED redis>INCRuser_id QUEUED redis>PING QUEUED redis>EXEC//执行 1)(integer)1 2)(integer)2 3)(integer)3 4)PONG
Java操作代码为:
publicvoidtransactionTest(){
Transactiont=jedis.multi();
//组装一个事务
t.set("hello","world");
Responseresponse=t.get("hello");
t.zadd("foo",1,"barowitch");
t.zadd("foo",0,"barinsky");
t.zadd("foo",0,"barikoviev");
Response>sose=t.zrange("foo",0,-1);
//返回全部相应并以有序集合的方式返回
System.out.println(response);
System.out.println(sose);
t.exec();
//此行注意,不能缺少执行
Stringfoolbar=response.get();
//Response.get()可以从响应中获取数据
intsoseSize=sose.get().size();
//sose.get()
System.out.println(foolbar);
System.out.println(sose.get());
System.out.println("集合的size为:"+soseSize);
}
管道操作Java代码:
publicvoidtransactionPipelineTest(){
Pipelinep=jedis.pipelined();
//开一个管道
p.set("fool","bar");
p.zadd("foo",1,"barowitch");
p.zadd("foo",0,"barinsky");
p.zadd("foo",0,"barikoviev");
ResponsepipeString=p.get("fool");
Response>sose=p.zrange("foo",0,-1);
System.out.println(pipeString);
System.out.println(sose);
p.sync();
//提交
System.out.println("==========");
System.out.println(p.get("fool"));
System.out.println(p.zrange("foo",0,-1));
intsoseSize=sose.get().size();
SetsetBack=sose.get();
System.out.println(soseSize);
System.out.println(setBack);
System.out.println(pipeString.get());
}
总结
以上就是本文关于Java操作Redis详细介绍的全部内容,希望对大家有所帮助。如有不足之处,欢迎留言指出。感谢朋友们对本站的支持。