spring-data-redis文档: https://docs.spring.io/spring-data/redis/docs/2.0.1.RELEASE/reference/html/#new-in-2.0.0
Redis 文档: https://redis.io/documentation
Redis 中文文档: http://www.redis.cn/commands.html
本文学习一下如何通过 Java 操作 Redis。
Java 操作 Redis 的库有两个,Jedis 和 Lettuce,目前 SpringBoot 2.x 中已经将 Jedis 换成了 Lettuce。
Lettuce 和 Jedis 的都是连接Redis Server的客户端程序。Jedis在实现上是直连redis server,多线程环境下非线程安全,除非使用连接池,为每个Jedis实例增加物理连接。Lettuce基于Netty的连接实例(StatefulRedisConnection),可以在多个线程间并发访问,且线程安全,满足多线程环境下的并发访问,同时它是可伸缩的设计,一个连接实例不够的情况也可以按需增加连接实例。
本文直接从 Lettuce 来学习。
基本使用
1:添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
属性配置
在 application.properties
文件中配置如下内容
spring.redis.host=localhost #spring.redis.password=battcn # 连接超时时间(毫秒) spring.redis.timeout=10000 # Redis默认情况下有16个分片,这里配置具体使用的分片,默认是0 spring.redis.database=0 # 连接池最大连接数(使用负值表示没有限制) 默认 8 spring.redis.lettuce.pool.max-active=8 # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1 spring.redis.lettuce.pool.max-wait=-1 # 连接池中的最大空闲连接 默认 8 spring.redis.lettuce.pool.max-idle=8 # 连接池中的最小空闲连接 默认 0 spring.redis.lettuce.pool.min-idle=0
实体类
创建一个User
类
private static final long serialVersionUID = 8655851615465363473L; private Long id; private String username; private String password; public Users(Long id, String username, String password) { this.id = id; this.username = username; this.password = password; } public static long getSerialVersionUID() { return serialVersionUID; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "Users{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + '}'; }
新建RedisCacheAutoConfiguration配置类
默认情况下的模板只能支持RedisTemplate<String, String>
,也就是只能存入字符串,这在开发中是不友好的,所以自定义模板是很有必要的,当自定义了模板又想使用String
存储这时候就可以使用StringRedisTemplate
的方式,它们并不冲突
@Configuration @AutoConfigureAfter(RedisAutoConfiguration.class) public class RedisCacheAutoConfiguration { @Bean public RedisTemplate<String, Serializable> redisCacheTemplate(LettuceConnectionFactory redisConnectionFactory) { RedisTemplate<String, Serializable> template = new RedisTemplate<>(); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); template.setConnectionFactory(redisConnectionFactory); return template; } }
新建一个SpringbootRedisDemoApplicationTests类测试
private static final Logger log = LoggerFactory.getLogger(SpringbootRedisDemoApplicationTests.class); @Autowired private StringRedisTemplate stringRedisTemplate; @Autowired private RedisTemplate<String, Serializable> redisCacheTemplate; @PostMapping public void get() { ExecutorService executorService = Executors.newFixedThreadPool(8888); IntStream.range(0, 8888).forEach(i -> executorService.execute(() -> stringRedisTemplate.opsForValue().increment("dd", 1)) ); stringRedisTemplate.opsForValue().set("flag", "好"); final String a = stringRedisTemplate.opsForValue().get("flag"); log.info("[字符缓存结果] - [{}]", a); String key = "opsForValue:user:1"; redisCacheTemplate.opsForValue().set(key, new Users(99L, "小王", "18")); final Users user = (Users) redisCacheTemplate.opsForValue().get(key); System.out.println(user + "*****"); log.info("[对象缓存结果] - [{}]", user); }
用postman发起请求
客户端工具显示效果
下列的就是Redis其它类型所对应的操作方式
opsForValue: 对应 String(字符串)
opsForZSet: 对应 ZSet(有序集合)
opsForHash: 对应 Hash(哈希)
opsForList: 对应 List(列表)
opsForSet: 对应 Set(集合)
opsForGeo: 对应 GEO(地理位置)