1 Java 使用 Redis
1.1 方案简述
redis的java客户端很多,官方推荐的有三种:
- Jedis
- Lettuce
- Redisson
- Spring 对Redis 客户端进行了整合,提供了Spring Date Redis ,在Spring Boot项目中还提供了对应的Starter,即spring-boot-starter-data-redis。
1.2 使用Jedis连接到 redis 服务
使用Jedis操作Redis的步骤:
1.获取链接;
2.执行操作;
3.关闭连接;
1.2.1 实例
代码语言:javascript复制import redis.clients.jedis.Jedis;
public class RedisJava {
public static void main(String[] args) {
//连接本地的 Redis 服务
Jedis jedis = new Jedis("localhost");
// 如果 Redis 服务设置了密码,需要下面这行,没有就不需要
// jedis.auth("123456");
System.out.println("连接成功");
//查看服务是否运行
System.out.println("服务正在运行: " jedis.ping());
}
}
编译以上 Java 程序,确保驱动包的路径是正确的。
代码语言:javascript复制连接成功
服务正在运行: PONG
1.2.2 Redis Java String(字符串) 实例
代码语言:javascript复制import redis.clients.jedis.Jedis;
public class RedisStringJava {
public static void main(String[] args) {
//连接本地的 Redis 服务
Jedis jedis = new Jedis("localhost");
System.out.println("连接成功");
//设置 redis 字符串数据
jedis.set("runoobkey", "www.runoob.com");
// 获取存储的数据并输出
System.out.println("redis 存储的字符串为: " jedis.get("runoobkey"));
}
}
编译以上程序。
代码语言:javascript复制连接成功 redis
存储的字符串为: www.runoob.com
1.2.3 Redis Java List(列表) 实例
代码语言:javascript复制import java.util.List;
import redis.clients.jedis.Jedis;
public class RedisListJava {
public static void main(String[] args) {
//连接本地的 Redis 服务
Jedis jedis = new Jedis("localhost");
System.out.println("连接成功");
//存储数据到列表中
jedis.lpush("site-list", "Runoob");
jedis.lpush("site-list", "Google");
jedis.lpush("site-list", "Taobao");
// 获取存储的数据并输出
List<String> list = jedis.lrange("site-list", 0 ,2);
for(int i=0; i<list.size(); i ) {
System.out.println("列表项为: " list.get(i));
}
}
}
编译以上程序。
代码语言:javascript复制连接成功
列表项为: Taobao
列表项为: Google
列表项为: Runoob
1.2.4 Redis Java Keys 实例
代码语言:javascript复制import java.util.Iterator;
import java.util.Set;
import redis.clients.jedis.Jedis;
public class RedisKeyJava {
public static void main(String[] args) {
//连接本地的 Redis 服务
Jedis jedis = new Jedis("localhost");
System.out.println("连接成功");
// 获取数据并输出
Set<String> keys = jedis.keys("*");
Iterator<String> it=keys.iterator() ;
while(it.hasNext()){
String key = it.next();
System.out.println(key);
}
}
}
编译以上程序。
代码语言:javascript复制连接成功
runoobkey site-list
1.3 Lettuce
另一个流行的Java Redis客户端库Lettuce,它具有异步和响应式API,支持集群模式、Sentinel模式以及Redis 6中的新特性。以下是使用Lettuce连接Redis并执行一些基本操作的代码示例:
在上面的代码中,我们使用了Lettuce客户端库来连接Redis服务器并执行一些基本操作。首先,我们创建了一个RedisClient实例,并将Redis服务器的地址和端口作为参数传递给create方法。然后,我们通过调用connect方法来创建一个StatefulRedisConnection实例,该实例提供了同步和异步的API来操作Redis。接下来,我们使用sync方法来获取一个同步的RedisCommands实例,然后使用set方法来设置一个键值对,get方法获取一个键的值,del方法删除一个键。最后,我们关闭了连接哦。
1.4 Redisson
Redisson是一个基于Netty框架的Java Redis客户端库,它提供了分布式锁、分布式集合、分布式对象等功能,支持Redis集群和Sentinel模式。以下是使用Redisson连接Redis并执行一些基本操作的代码示例:
在上面的代码中,我们使用了Redisson客户端库来连接Redis服务器并执行一些基本操作。首先,我们创建了一个Config实例,并使用useSingleServer方法来指定Redis服务器的地址和端口。然后,我们通过调用create方法来创建一个RedissonClient实例。接下来,我们使用getBucket方法来获取一个RBucket实例,该实例可以用来操作一个特定的键。我们使用set方法来设置一个键值对,get方法获取一个键的值,delete方法删除一个键。最后,我们关闭了连接。
1.5 Spring Data Redis
Spring Data Redis 中提供了一个高度封装的类,针对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口,具体分类如下:
- ValueOperations:简单K-V操作
- SetOperations :set 类型数据操作
- ZSetOperations:zset 类型数据操作
- HashOperations:针对map类型的数据操作
- ListOperations:针对list类型的数据操作
默认操作的是0号数据库,也可以切换其他数据库:
设置一下序列化,这样设置key的时候不会变成乱码:
代码语言:javascript复制package com.example.demotest;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory){
RedisTemplate<Object,Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(connectionFactory);
return redisTemplate;
}
}
代码语言:javascript复制package com.example.demotest;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.connection.DataType;
import org.springframework.data.redis.core.*;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
@SpringBootTest
@RunWith(SpringRunner.class)
public class SpringDataRedisTest {
@Autowired
private RedisTemplate redisTemplate;
@Test
public void testString(){
redisTemplate.opsForValue().set("city2","sz");
String city2 = (String) redisTemplate.opsForValue().get("city2");
System.out.println("打印一下" city2);
//指定过期时间 10 秒
redisTemplate.opsForValue().set("key1","value1",10l, TimeUnit.SECONDS);
//如果不存在key则设置
Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("city", "sz");
System.out.println(aBoolean);
}
@Test
public void testHash(){
HashOperations hashOperations = redisTemplate.opsForHash();
//存值
hashOperations.put("002","name","hh");
hashOperations.put("002","age","20");
hashOperations.put("002","address","sz");
//取值
String age = (String) hashOperations.get("002", "age");
System.out.println(age);
//获得hash结构中的所有字段
Set keys = hashOperations.keys("002");
for (Object key : keys) {
System.out.println(key);
}
//获得hash结构中的所有值
List values = hashOperations.values("002");
for (Object value : values) {
System.out.println(value);
}
}
/**
* 操作list类型的数据
*/
@Test
public void testList(){
ListOperations listOperations = redisTemplate.opsForList();
//存储
listOperations.leftPush("mylist","a");
listOperations.leftPushAll("mylist","b","c","d");
//取值
List<String> mylist = listOperations.range("mylist", 0, -1);
for (String value : mylist) {
System.out.println(value);
}
//获得列表长度
Long size = listOperations.size("mylist");
int lSize = size.intValue();
for (int i = 0; i < lSize; i ) {
//出队列
String elment = (String) listOperations.rightPop("mylist");
System.out.println(elment);
}
}
/**
* 操作set类型的数据
*/
@Test
public void testSet(){
SetOperations setOperations = redisTemplate.opsForSet();
//存值
setOperations.add("myset","a","b","c","a");
//取值
Set<String> myset = setOperations.members("myset");
for (String s : myset) {
System.out.println(s);
}
//删除成员
setOperations.remove("myset","a","b");
//取值
myset = setOperations.members("myset");
for (String s : myset) {
System.out.println(s);
}
}
/**
* 操作zset类型的数据
*/
@Test
public void testZset(){
ZSetOperations zSetOperations = redisTemplate.opsForZSet();
//存值
zSetOperations.add("myZset","a",10.0);
zSetOperations.add("myZset","b",11.0);
zSetOperations.add("myZset","d",12.0);
zSetOperations.add("myZset","a",13.0);
//取值
Set<String> myZset = zSetOperations.range("myZset", 0, -1);
for (String s : myZset) {
System.out.println(s);
}
//修改分数
zSetOperations.incrementScore("myZset","b",20.0);
//取值
myZset = zSetOperations.range("myZset", 0, -1);
for (String s : myZset) {
System.out.println(s);
}
//删除成员
zSetOperations.remove("myZset","a","b");
}
@Test
public void testCommon(){
//获取Redis 中所有的key
Set<String> keys = redisTemplate.keys("*");
for (String key : keys) {
System.out.println(key);
}
//判断某个key是否存在
Boolean hh = redisTemplate.hasKey("hh");
System.out.println(hh);
//删除指定key
redisTemplate.delete("myzset");
//获取指定key对应的value的数据类型
DataType dataType = redisTemplate.type("myset");
System.out.println(dataType.name());
}
}
参考链接
Java 使用 Redis | 菜鸟教程
java在项目中如何使用redis_Redis_方法_操作
在Java中操作Redis_java redis_周盛欢的博客-CSDN博客
使用java操作redis_java连接redis_白未的博客-CSDN博客
Redis在java项目中的使用