spring-data-redis
文档: https://docs.spring.io/spring-data/redis/docs/2.0.1.RELEASE/reference/html/#new-in-2.0.0Redis
文档: https://redis.io/documentationRedis
中文文档: 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 {@Beanpublic 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(地理位置)