Java操作Redis详细介绍
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")); //打印hello system.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(); //选择一个随机的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的值 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" ok 127.0.0.1:6379> get mynum "2" 127.0.0.1:6379> incr mynum (integer) 3 127.0.0.1:6379> get mynum "3"
java操作代码为:
//对string操作的测试 public void stringtest() { 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 (interruptedexception e) { e.printstacktrace(); } system.out.println(jedis.get("hello2")); // 一次添加多个key-value对 jedis.mset("a", "1", "b", "2"); // 获取a和b的value list<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 1 1) "0" 2) "1" //列出mylist中从编号0到倒数第一个元素 127.0.0.1:6379> lrange mylist 0 -1 1) "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) 1 127.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 //新建一个新的集合yourset 127.0.0.1:6379> sadd yourset "1" (integer) 1 127.0.0.1:6379> sadd yourset "2" (integer) 1 127.0.0.1:6379> smembers yourset 1) "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,给它赋予的序号是1 127.0.0.1:6379> zadd myzset 1 baidu.com (integer) 1 //向myzset中新增一个元素360.com,赋予它的序号是3 127.0.0.1:6379> zadd myzset 3 360.com (integer) 1 //向myzset中新增一个元素google.com,赋予它的序号是2 127.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 -1 1) "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 34 ok //列出哈希的内容 127.0.0.1:6379> hgetall user:001 1) "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:001 1) "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 的值加上增量 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> incr user_id //多条命令按顺序入队 queued redis> incr user_id queued redis> incr user_id queued redis> ping queued redis> exec //执行 1) (integer) 1 2) (integer) 2 3) (integer) 3 4) 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详细介绍的全部内容,希望对大家有所帮助。如有不足之处,欢迎留言指出。感谢朋友们对本站的支持。
上一篇: SpringMVC入门实例