Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
redis是一个key-value存储系统,支持存储的value类型包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。
一、pom.xml引入redis模块
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
二、application.properties配置
server.port = 9001 # Redis数据库索引(默认为0) spring.redis.database = 0 # Redis服务器地址 spring.redis.host = 127.0.0.1 # Redis服务器连接端口 spring.redis.port = 6379 # Redis服务器连接密码(如果没有则设置为空) spring.redis.password = 123456 # 连接池最大连接数(使用负值表示没有限制) spring.redis.pool.max-active = 8 # 连接池最大阻塞等待时间(使用负值表示没有限制) spring.redis.pool.max-wait = -1 # 连接池中的最大空闲连接 spring.redis.pool.max-idle = 8 # 连接池中的最小空闲连接 spring.redis.pool.min-idle = 0 # 连接超时时间(毫秒) spring.redis.timeout = 1000
备注:
网上一些例子spring.redis.timeout设置为0,不能设置为0,刚开始也是照抄过来,结果报了连接超时错误
Unable to connect to Redis; nested exception is io.lettuce.core.RedisCommandTimeoutException: Command timed out
三、RedisConfig配置
代码来自:https://blog.csdn.net/lx1309244704/article/details/80696235
package com.example.demo.config; import java.lang.reflect.Method; import java.util.HashSet; import java.util.Set; import javax.annotation.Resource; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.interceptor.KeyGenerator; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper.DefaultTyping; @Configuration @EnableCaching public class RedisConfig extends CachingConfigurerSupport { @Resource private LettuceConnectionFactory lettuceConnectionFactory; @Bean public KeyGenerator keyGenerator() { return new KeyGenerator() { @Override public Object generate(Object target, Method method, Object... params) { StringBuffer sb = new StringBuffer(); sb.append(target.getClass().getName()); sb.append(method.getName()); for (Object obj : params) { sb.append(obj.toString()); } return sb.toString(); } }; } // 缓存管理器 @Bean public CacheManager cacheManager() { RedisCacheManager.RedisCacheManagerBuilder builder = RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(lettuceConnectionFactory); @SuppressWarnings("serial") Set<String> cacheNames = new HashSet<String>() { { add("codeNameCache"); } }; builder.initialCacheNames(cacheNames); return builder.build(); } /** * RedisTemplate配置 */ @Bean public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) { // 设置序列化 Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, Visibility.ANY); om.enableDefaultTyping(DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); // 配置redisTemplate RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>(); redisTemplate.setConnectionFactory(lettuceConnectionFactory); RedisSerializer<?> stringSerializer = new StringRedisSerializer(); redisTemplate.setKeySerializer(stringSerializer);// key序列化 redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);// value序列化 redisTemplate.setHashKeySerializer(stringSerializer);// Hash key序列化 redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);// Hash value序列化 redisTemplate.afterPropertiesSet(); return redisTemplate; } }
四、Redis使用例子
package com.example.demo.web.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RestController public class DemoController { @Autowired private StringRedisTemplate stringRedisTemplate; @RequestMapping(value = "/redis", method = RequestMethod.GET) public String redis() { stringRedisTemplate.opsForValue().set("test1", "test11111");//存入数据 String test1 = stringRedisTemplate.opsForValue().get("test1"); return test1; } }
在浏览器访问http://localhost:9001/redis,可看到输出结果为:test11111
备注:RedisTemplate中定义了5种数据结构操作
redisTemplate.opsForValue(); //操作字符串 redisTemplate.opsForHash(); //操作hash redisTemplate.opsForList(); //操作list redisTemplate.opsForSet(); //操作set redisTemplate.opsForZSet(); //操作有序set
五、单元测试
package com.example.demo; import org.junit.Assert; 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.core.StringRedisTemplate; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class DemoApplicationTests { @Autowired private StringRedisTemplate stringRedisTemplate; @Test public void contextLoads() { } @Test public void test1() throws Exception { stringRedisTemplate.opsForValue().set("a", "123"); Assert.assertEquals("123", stringRedisTemplate.opsForValue().get("a")); } }