目录
1.连接Redis
应用Redis的第一步就是要连接Redis,在项目的配置文件中配置如下的配置:
redis:
//redis所在主机的IP地址,由于这里是本机的redis服务,所以配置localhost
host: localhost
//redis的端口号,默认文6379,如果对其进行更改过这里应换为自己更改的端口号
port: 6379
//redis默认为用户创建了16个数据库,这里的数字就是数据库的编号,可以自定义切换数据库
//不更改的情况下默认是0号数据库
database: 0 - 15
//redis的密码,如果之前配置redis的时候未设置密码这一项可以不要
password: 123456
2.Java中应用Redis的技术
2.1 Jedis
- 简介: Jedis是一个简单且高效的Redis客户端,它提供了一系列简单的API来连接和操作Redis。
- 应用:
- 连接Redis服务器:使用Jedis连接池来管理多个连接。
- 数据存储:以简单的键值对形式存储和检索数据。
- 支持Redis的多种数据结构(如字符串、哈希、列表、集合等)。
Jedis jedis = new Jedis("localhost");
jedis.set("key", "value");
String value = jedis.get("key");
System.out.println(value); // 输出: value
2.2 Lettuce
- 简介: Lettuce是一个基于Netty的异步Redis客户端,支持反应式编程模型,适合需要高性能和非阻塞操作的应用。
- 应用:
- 异步和反应式编程支持。
- 使用Reactive Streams实现与Redis的交互。
RedisClient client = RedisClient.create("redis://localhost");
StatefulRedisConnection<String, String> connection = client.connect();
RedisCommands<String, String> syncCommands = connection.sync();
syncCommands.set("key", "value");
String value = syncCommands.get("key");
System.out.println(value); // 输出: value
2.3 Spring Data Redis
- 简介: Spring Data Redis是Spring框架的一部分,提供了与Spring生态系统的集成,使得与Redis的数据访问更加便捷。
- 应用:
- 可以通过注解和Spring的依赖注入功能轻松使用Redis。
- 支持序列化机制,让Java对象与Redis中的数据相互转换。
- 结合Spring Boot,提供自动配置的便利。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
private RedisTemplate<String, User> redisTemplate;
public void saveUser(User user) {
redisTemplate.opsForValue().set(user.getId(), user);
}
public User getUser(String userId) {
return redisTemplate.opsForValue().get(userId);
}
}
2.4 Redisson
- 简介: Redisson是一个完整的Redis客户端,提供分布式对象和Spring的集成,支持多种高级特性,如分布式锁、分布式集合和映射等。
- 应用:
- 分布式数据结构(如分布式Map、Set、List等)。
- 支持异步和反应式API。
- 分布式锁和限流功能。
Config config = new Config();
config.useSingleServer().setAddress("redis://localhost:6379");
RedissonClient redisson = Redisson.create(config);
RBucket<String> bucket = redisson.getBucket("key");
bucket.set("value");
String value = bucket.get();
System.out.println(value); // 输出: value
2.5 Spring Boot与Redis集成
- 简介: Spring Boot提供了与Redis的快速集成,只需在
application.yml
中配置Redis连接,便可以使用Spring Data Redis提供的组件。 - 应用:
- 快速搭建基于Redis的数据访问层,简化开发流程。
spring:
redis:
host: localhost
port: 6379
总结
Redis在Java中的应用主要依赖于如Jedis、Lettuce、Spring Data Redis和Redisson等库和框架。开发者可以根据具体需求选择合适的工具,让Redis的操作更加高效和简洁。在分布式架构、缓存、会话存储、消息队列等多个场景中,Redis与Java结合使用,都能够发挥出较高的性能和灵活性。
3.详解
下面就详解一下Jedis和Spring Data Redis这两种技术:
3.1 Jedis详解
Jedis的maven坐标
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedi</artifactId>
<!--版本号-->
<version>2.8.0</version>
</dependency>
使用Jedis的步骤:
1.获取连接
2.执行操作
3.关闭连接
具体代码如下:
public class JedisTest {
@Test
public void testJedis() {
//1.获取连接
Jedis jedis = new Jedis();
//2.执行操作
jedis.set("string","mtj");
//3.关闭连接
jedis.close();
}
}
3.2 Spring Data Redis详解
Spring Data Redis中提供了一个高度封装的类RedisTemplate,针对Jedis客户端中大量的API进行归类封装,将同一类型的操作封装为operation接口
ValueOperation 简单的K-V操作
HashOperation 针对map类型的数据操作
ListOperation 针对list类型的数据操作
SetOperation 针对无序set类型的数据操作
ZSetOperation 针对有序Set类型数据操作
Spring Data Redis的maven坐标:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifacctId>
<!--版本号-->
<version> </version>
</dependency>
使用Spring Data Redis之前要先对redis进行配置:
@Configuration
public class RedisConfiguration {
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate redisTemplate = new RedisTemplate();
//设置redis的连接工厂对象
redisTemplate.setConnectionFactory(redisConnectionFactory);
//设置redis key的序列化器,此处如果不设置序列化器,redis就会使用默认的序列化器
//这样最终显示的key值会出现看不懂的情况
redisTemplate.setKeySerializer(new StringRedisSerializer());
return redisTemplate;
}
}
不配置序列化器的情况下redis的key值
操作之前要注入RedisTemplate
@Autowrite
private RedisTemplate redisTemplate;
3.2.1 操作字符串类型数据
/**
* 操作字符串类型的数据
*/
@Test
public void testString() {
ValueOperations valueOperations = redisTemplate.opsForValue();
//SET key value 设置指定key的值
valueOperations.set("name","明天见See");
//GET key 获取指定key的值
String value = (String) valueOperations.get("name");
System.out.println(value);
//SETEX key seconds value 设置指定的key值,并将可以的过期时间设置为seconds秒
valueOperations.set("city","北京",3,TimeUnit.SECONDS);
//SETNX key value 只有在key不存在时才会设置key
valueOperations.setIfAbsent("game","hyrz");
valueOperations.setIfAbsent("game","yjwj");
}
3.2.2 操作哈希类型数据
/**
* 操作哈希类型数据
*/
@Test
public void testHash() {
HashOperations hashOperations = redisTemplate.opsForHash();
//HSET key field value 将哈希表key中的字段field设置为value
hashOperations.put("key1","name One","明天见See One");
hashOperations.put("key1","name Two","明天见See Two");
//HGET key field 获取存储在哈希表中的指定字段
String value = (String) hashOperations.get("key1", "name");
System.out.println(value);
//HVALUS key 获取哈希表中的所有值
List list = hashOperations.values("key1");
System.out.println(list);
//HEYS key 获取哈希表中的所有字段
Set values = hashOperations.keys("key1");
System.out.println(values);
//HDEL key field 删除存在哈希表中的指定字段
hashOperations.delete("key1","name Two");
}
3.2.3 操作列表类型数据
/**
* 操作列表类型数据
*/
@Test
public void testList() {
ListOperations listOperations = redisTemplate.opsForList();
//LPUSH key value [value] 将一个或多个值插入到列表头部
listOperations.leftPush("list","a");
listOperations.leftPushAll("list,","b","c","d");
//LRANGE key start stop 获取列表指定范围内的元素
List mylist = listOperations.range("list", 0, -1);
System.out.println(mylist);
//RPOP key 移除并获取列表最后一个元素
String rightedPop = (String) listOperations.rightPop("list");
System.out.println(rightedPop);
//LLEN key 获取列表的长度
Long size = listOperations.size("list");
System.out.println(size);
}
3.2.4 操作无序集合类型数据
/**
* 操作无序集合类型数据
*/
@Test
public void testSet() {
SetOperations setOperations = redisTemplate.opsForSet();
//SADD key member [member] 向集合中添加一个或多个元素
setOperations.add("set1","a","b","c","d");
setOperations.add("set2","a","b","x","y");
//SMEMBERS key 返回集合中的所有元素
Set members = setOperations.members("set1");
System.out.println(members);
//SCARD key 获取集合的元素数
Long size = setOperations.size("set1");
System.out.println(size);
//SINTER key1 [key2] 返回给定集合的交集
Set intersect = setOperations.intersect("set1", "set2");
System.out.println(intersect);
//SUNION key1 [key2] 返回所有给定集合的并集
Set union = setOperations.union("set1", "set2");
System.out.println(union);
//SDIFF key1 [key2] 返回给定所有集合的差集
Set difference = setOperations.difference("set1", "set2");
System.out.println(difference);
//SREM key member [member] 移除集合中一个或多个元素
setOperations.remove("set1","a","b");
}
3.2.5 操作无序集合类型数据
/**
* 操作有序集合类型数据
*/
@Test
public void testZset() {
ZSetOperations zSetOperations = redisTemplate.opsForZSet();
/**
* ZADD key score1 member [score2 member]
* 向有序集合中添加一个或多个元素,或更新已有元素的分数
*/
zSetOperations.add("zset","a",0.1);
zSetOperations.add("zset","b",1.5);
zSetOperations.add("zset","c",2.0);
/**
* ZRANGE key start stop [WITHSCORES]
* 通过索引区间返回有序集合指定区间的元素
*/
Set zset = zSetOperations.range("zset", 0, -1);
System.out.println(zset);
/**
*ZINCRBY key increment member
* 有序集合中指定元素的分数加上增量increment
*/
zSetOperations.incrementScore("zset", "c", 10.0);
/**
* ZREM key member [member...]
* 移除有序集合的一个或多个元素
*/
zSetOperations.remove("zset","a","b");
}
3.2.6 操作通用命令
/**
* 操作通用命令
*/
@Test
public void testCommon() {
//KEY pattern 查找所有符合给定模式pattern的key
Set keys = redisTemplate.keys("*");
System.out.println(keys);
//EXISTS key 检查给定的key是否存在
Boolean name = redisTemplate.hasKey("name");
Boolean set1 = redisTemplate.hasKey("set1");
//TYPE key 返回key所存储的值的类型
for (Object key : keys) {
DataType type = redisTemplate.type(key);
System.out.println(type.name());
}
//DEL key 该命令用于在key存在时删除key
redisTemplate.delete("mylist");
}