1. 简介
Redis 是一个开源(BSD许可)的,内存中的key-value存储系统,它可以用作数据库、缓存和消息中间件。
2. 对key的操作
首先要建立连接Jedis jedis = new Jedis("127.0.0.1", 6379),然后就可以对string,set,zset,hash进行操作了。
//对key的测试public void keyTest() {System.out.println(jedis.flushDB());//清空数据System.out.println(jedis.echo("hello"));//打印helloSystem.out.println(jedis.exists("foo"));//判断key是否存在jedis.set("key1", "values1");jedis.set("key2", "values2");System.out.println(jedis.exists("key1"));//判断key是否存在String randomKey = jedis.randomKey();//选择一个随机的keySystem.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的值String value = 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 。// KEYS h?llo 匹配 hello , hallo 和 hxllo 等。// KEYS h*llo 匹配 hllo 和 heeeeello 等。// KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo 。// 特殊符号用 / 隔开。Set<string> set = jedis.keys("k*");//获取所有相关的key keys方法System.out.println(set);jedis.del("key1");// 删除key del方法System.out.println(jedis.exists("key1"));}3. String数据类型
set mystr "hello world!" //设置字符串类型get mystr //读取字符串类型 对字符串进行数值操作127.0.0.1:6379> set mynum "2"OK127.0.0.1:6379> get mynum"2"127.0.0.1:6379> incr mynum(integer) 3127.0.0.1:6379> get mynum"3"
Java操作代码为:
//对string操作的测试public void stringTest() {jedis.set("hello", "hello");//setSystem.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 (InterruptedException e) {e.printStackTrace();}System.out.println(jedis.get("hello2"));// 一次添加多个key-value对jedis.mset("a", "1", "b", "2");// 获取a和b的valueList<string> valus = 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> lpush mylist "1"//返回当前mylist中的元素个数(integer) 1//在mylist右侧插入元素"2"127.0.0.1:6379> rpush mylist "2"(integer) 2//在mylist左侧插入元素"0"127.0.0.1:6379> lpush mylist "0"(integer) 3//列出mylist中从编号0到编号1的元素127.0.0.1:6379> lrange mylist 0 11) "0"2) "1"//列出mylist中从编号0到倒数第一个元素127.0.0.1:6379> lrange mylist 0 -11) "0"2) "1"3) "2"
Java操作代码为:
public void listTest() {String key = "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("all elements: " + jedis.lrange(key, 0, -1));// 索引为1的元素System.out.println("index of 1: " + jedis.lindex(key, 1));// 设置队列里面一个元素的值,当index超出范围时会返回一个error。jedis.lset(key, 1, "aa22");System.out.println("index of 1: " + jedis.lindex(key, 1));// 从队列的右边入队一个元素jedis.rpush(key, "-2", "-1");// 先-2,后-1入队列System.out.println("all elements: " + jedis.lrange(key, 0, -1));// 从队列的左边入队一个或多个元素jedis.lpush(key, "second element", "first element");// 先second// element,后first// elementF入队列System.out.println("all elements: " + jedis.lrange(key, 0, -1));// 从队列的右边出队一个元素System.out.println(jedis.rpop(key));// 从队列的左边出队一个元素System.out.println(jedis.lpop(key));System.out.println("all elements: " + jedis.lrange(key, 0, -1));// count > 0: 从头往尾移除值为 value 的元素,count为移除的个数。// count < 0: 从尾往头移除值为 value 的元素,count为移除的个数。// count = 0: 移除所有值为 value 的元素。jedis.lrem(key, 1, "cccc");System.out.println("all elements: " + jedis.lrange(key, 0, -1));// 即最右边的那个元素也会被包含在内。 如果start比list的尾部下标大的时候,会返回一个空列表。// 如果stop比list的实际尾部大的时候,Redis会当它是最后一个元素的下标。System.out.println(jedis.lrange(key, 0, 2));System.out.println("all elements: " + jedis.lrange(key, 0, -1));// 删除区间以外的元素System.out.println(jedis.ltrim(key, 0, 2));System.out.println("all elements: " + jedis.lrange(key, 0, -1));}5. Set类型
redis的集合,是一种无序的集合,集合中的元素没有先后顺序。
一系列操作:SADD, SREM, SISMEMBER, SMEMBERS 和 SUNION.
集合相关的操作也很丰富,如添加新元素、删除已有元素、取交集、取并集、取差集等。
//向集合myset中加入一个新元素"one"127.0.0.1:6379> sadd myset "one"(integer) 1127.0.0.1:6379> sadd myset "two"(integer) 1//列出集合myset中的所有元素127.0.0.1:6379> smembers myset 1) "one"2) "two"//判断元素1是否在集合myset中,返回1表示存在127.0.0.1:6379> sismember myset "one"(integer) 1//判断元素3是否在集合myset中,返回0表示不存在127.0.0.1:6379> sismember myset "three"(integer) 0//新建一个新的集合yourset127.0.0.1:6379> sadd yourset "1"(integer) 1127.0.0.1:6379> sadd yourset "2"(integer) 1127.0.0.1:6379> smembers yourset1) "1"2) "2"//对两个集合求并集127.0.0.1:6379> sunion myset yourset 1) "1"2) "one"3) "2"4) "two"
Java操作代码:
public void setTest() {// 清空数据System.out.println(jedis.flushDB());String key = "myset1";String key2 = "myset2";// 集合添加元素jedis.sadd(key, "aaa", "bbb", "ccc");jedis.sadd(key2, "bbb", "ccc", "ddd");// 获取集合里面的元素数量System.out.println(jedis.scard(key));//the number count of the set// 获得两个集合的交集,并存储在一个关键的结果集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. Sorted Sets类型
我们都将redis中的有序集合叫做zsets
//新增一个有序集合myzset,并加入一个元素baidu.com,给它赋予的序号是1127.0.0.1:6379> zadd myzset 1 baidu.com (integer) 1//向myzset中新增一个元素360.com,赋予它的序号是3127.0.0.1:6379> zadd myzset 3 360.com (integer) 1//向myzset中新增一个元素google.com,赋予它的序号是2127.0.0.1:6379> zadd myzset 2 google.com (integer) 1//列出myzset的所有元素,同时列出其序号,可以看出myzset已经是有序的了。127.0.0.1:6379> zrange myzset 0 -1 with scores 1) "baidu.com"2) "1"3) "google.com"4) "2"5) "360.com"6) "3"//只列出myzset的元素127.0.0.1:6379> zrange myzset 0 -11) "baidu.com"2) "google.com"3) "360.com"
Java操作代码为:
public void zsetTest() {// 清空数据System.out.println(jedis.flushDB());String key = "mysortset";Map<string, double=""> scoreMembers = new HashMap<>();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表示倒数第二个成员Set<string> coll = 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> HMSET user:001 username antirez password P1pp0 age 34OK//列出哈希的内容127.0.0.1:6379> HGETALL user:0011) "username"2) "antirez"3) "password"4) "P1pp0"5) "age"6) "34"//更改哈希中的某一个值127.0.0.1:6379> HSET user:001 password 12345(integer) 0//再次列出哈希的内容127.0.0.1:6379> HGETALL user:0011) "username"2) "antirez"3) "password"4) "12345"5) "age"6) "34"
Java操作代码:
public void hashTest() {// 清空数据System.out.println(jedis.flushDB());String key = "myhash";Map<string, string=""> hash = new HashMap<>();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<string, string=""> 的形式返回Map<string, string=""> elements = 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 的值加上增量 incrementSystem.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 //标记事务开始OKredis> INCR user_id //多条命令按顺序入队QUEUEDredis> INCR user_idQUEUEDredis> INCR user_idQUEUEDredis> PINGQUEUEDredis> EXEC //执行1) (integer) 12) (integer) 23) (integer) 34) PONG
Java操作代码为:
public void transactionTest() {Transaction t = jedis.multi();//组装一个事务t.set("hello", "world");Response<string> response = t.get("hello");t.zadd("foo", 1, "barowitch");t.zadd("foo", 0, "barinsky");t.zadd("foo", 0, "barikoviev");Response<set<string>> sose = t.zrange("foo", 0, -1);// 返回全部相应并以有序集合的方式返回System.out.println(response);System.out.println(sose);t.exec();// 此行注意,不能缺少 执行String foolbar = response.get();// Response.get() 可以从响应中获取数据int soseSize = sose.get().size();// sose.get()System.out.println(foolbar);System.out.println(sose.get());System.out.println("集合的size为:" + soseSize);}管道操作Java代码:
public void transactionPipelineTest() {Pipeline p = jedis.pipelined();//开一个管道p.set("fool", "bar");p.zadd("foo", 1, "barowitch");p.zadd("foo", 0, "barinsky");p.zadd("foo", 0, "barikoviev");Response<string> pipeString = p.get("fool");Response<set<string>> 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));int soseSize = sose.get().size();Set<string> setBack = sose.get();System.out.println(soseSize);System.out.println(setBack);System.out.println(pipeString.get());}总结
以上就是本文关于Java操作Redis详细介绍的全部内容,希望对大家有所帮助。如有不足之处,欢迎留言指出。感谢朋友们对本站的支持。