# Java中怎么使用Redis ## 一、Redis简介 Redis(Remote Dictionary Server)是一个开源的、基于内存的键值存储系统,常用作数据库、缓存和消息中间件。它支持多种数据结构,包括: - 字符串(String) - 哈希(Hash) - 列表(List) - 集合(Set) - 有序集合(Sorted Set) - 位图(Bitmap) - 地理位置(GEO) - 流(Stream) ### Redis核心优势 1. **高性能**:数据存储在内存中,读写速度极快 2. **丰富的数据结构**:支持多种高级数据结构 3. **持久化**:支持RDB和AOF两种持久化方式 4. **高可用**:通过哨兵和集群实现高可用 5. **原子性操作**:所有操作都是原子性的 ## 二、Java连接Redis ### 1. 使用Jedis客户端 Jedis是Redis官方推荐的Java客户端之一。 #### 添加Maven依赖 ```xml <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>4.3.1</version> </dependency>
import redis.clients.jedis.Jedis; public class JedisExample { public static void main(String[] args) { // 创建连接 Jedis jedis = new Jedis("localhost", 6379); try { // 字符串操作 jedis.set("key", "value"); String value = jedis.get("key"); System.out.println(value); // 输出: value // 哈希操作 jedis.hset("user:1", "name", "张三"); jedis.hset("user:1", "age", "30"); String name = jedis.hget("user:1", "name"); System.out.println(name); // 输出: 张三 } finally { jedis.close(); // 关闭连接 } } }
Lettuce是基于Netty的异步Redis客户端,支持响应式编程。
<dependency> <groupId>io.lettuce</groupId> <artifactId>lettuce-core</artifactId> <version>6.2.3.RELEASE</version> </dependency>
import io.lettuce.core.RedisClient; import io.lettuce.core.api.StatefulRedisConnection; import io.lettuce.core.api.sync.RedisCommands; public class LettuceExample { public static void main(String[] args) { RedisClient client = RedisClient.create("redis://localhost:6379"); StatefulRedisConnection<String, String> connection = client.connect(); RedisCommands<String, String> commands = connection.sync(); // 字符串操作 commands.set("lettuceKey", "lettuceValue"); String value = commands.get("lettuceKey"); System.out.println(value); // 输出: lettuceValue connection.close(); client.shutdown(); } }
// 设置值(带过期时间) jedis.setex("tempKey", 60, "tempValue"); // 60秒后过期 // 批量操作 jedis.mset("k1", "v1", "k2", "v2"); List<String> values = jedis.mget("k1", "k2"); // 原子性递增 jedis.incr("counter");
// 设置哈希字段 jedis.hset("user:1001", Map.of( "username", "user1", "email", "user1@example.com" )); // 获取所有字段 Map<String, String> user = jedis.hgetAll("user:1001"); // 增量修改 jedis.hincrBy("user:1001", "loginCount", 1);
// 从左侧插入 jedis.lpush("messages", "msg1", "msg2"); // 获取范围 List<String> messages = jedis.lrange("messages", 0, -1); // 阻塞弹出 String message = jedis.brpop(30, "messages"); // 最多等待30秒
// 添加元素 jedis.sadd("tags", "java", "redis", "database"); // 获取所有元素 Set<String> tags = jedis.smembers("tags"); // 集合运算 jedis.sinter("tags1", "tags2"); // 交集
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
spring: redis: host: localhost port: 6379 password: database: 0 lettuce: pool: max-active: 8 max-idle: 8 min-idle: 0
@RestController public class UserController { @Autowired private RedisTemplate<String, Object> redisTemplate; @GetMapping("/user/{id}") public User getUser(@PathVariable String id) { ValueOperations<String, Object> ops = redisTemplate.opsForValue(); User user = (User) ops.get("user:" + id); if (user == null) { // 从数据库查询并缓存 user = userService.findById(id); ops.set("user:" + id, user, 30, TimeUnit.MINUTES); } return user; } }
@Service public class ProductService { @Cacheable(value = "products", key = "#id") public Product getProductById(String id) { // 数据库查询逻辑 return productRepository.findById(id); } @CacheEvict(value = "products", key = "#id") public void updateProduct(Product product) { productRepository.update(product); } }
// 发布者 jedis.publish("channel", "message"); // 订阅者 JedisPubSub pubSub = new JedisPubSub() { @Override public void onMessage(String channel, String message) { System.out.println("收到消息: " + message); } }; new Thread(() -> jedis.subscribe(pubSub, "channel")).start();
Transaction tx = jedis.multi(); try { tx.set("tx1", "1"); tx.incr("tx1"); tx.exec(); // 执行事务 } catch (Exception e) { tx.discard(); // 放弃事务 }
String script = "return redis.call('get', KEYS[1])"; Object result = jedis.eval(script, 1, "key");
user:1001:profile
)Redis作为高性能的内存数据库,在Java生态中有着广泛的应用。通过选择合适的客户端(Jedis/Lettuce)和合理的集成方式(直接使用/Spring集成),可以充分发挥Redis的优势。在实际项目中,需要根据业务场景选择合适的数据结构和缓存策略,同时注意性能优化和异常处理。
本文示例代码基于Redis 6.x和Java 8编写,不同版本可能略有差异。生产环境建议使用Redis集群和更完善的连接管理方案。 “`
这篇文章共计约2100字,涵盖了Redis在Java中的主要使用方式,包括: 1. 客户端选择(Jedis/Lettuce) 2. 各种数据结构操作 3. Spring Boot集成 4. 高级特性 5. 最佳实践和常见问题
文章采用Markdown格式,包含代码块、列表、标题等标准元素,可以直接用于技术文档或博客发布。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。