Java操作Redis详细介绍

网友投稿 490 2023-03-14


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 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.printStackThttp://race();

}

System.out.println(jedis.get("hello2"));

// 一次添加多个key-value对

jedis.mset("a", "1", "b", "2");

// 获取a和b的value

List 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 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 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 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 的形式返回

Map 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 response = 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();

// 此行注意,不能缺少 执行

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 pipeString = 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));

int soseSize = sose.get().size();

Set setBack = sose.get();

System.out.println(soseSize);

System.out.println(setBack);

System.out.println(pipeString.get());

}

总结

以上就是本文关于Java操作Redis详细介绍的全部内容,希望对大家有所帮助。如有不足之处,欢迎留言指出。感谢朋友们对本站的支持。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:登录接口功能测试用例(登录接口功能测试用例怎么写)
下一篇:java接口开发工程师(java接口开发工程师工资)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~