Redis 整合
还是再提一下常考的RDB和AOF,二者都是为了保证数据的持久化,比较Redis是存在内存当中的,还是不可避免的要保存到硬盘中。
RDB: 以快照的方式,以一定的时间间隔存到硬盘当中,这个间隔会因为存储频率的变化而变化。
AOF: 以日志的方式,记录对数据库执行的所有操作,只要操作成功,就会被追加到文件末尾。
引入依赖
在Spring Boot中集成Redis,需要在pom.xml中添加Redis的依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency>
配置application.yml
然后在application.yml
中配置Redis的连接信息:
spring: redis: host: 127.0.0.1 # Redis服务器地址 port: 6379 # Redis服务器端口 password: <PASSWORD> lettuce: # 一般新的springboot用的都是lettuce pool: max-active: 8 # 连接池最大连接数(使用负值表示没有限制) max-idle: 8 # 连接池最大空闲连接数 min-idle: 0 # 连接池最小空闲连接数 time-between-eviction-runs: 10m # 连接空闲超时时间
注入
然后就可以在Spring Boot的Bean中注入RedisTemplate,进行Redis的操作:
@Autowiredprivate RedisTemplate<String, Object> redisTemplate;
或者注入StringRedisTemplate,进行字符串操作:
@Autowiredprivate StringRedisTemplate stringRedisTemplate;
这样就可以在Spring Boot中使用Redis了。
基本用法
-
String:
- set
stringRedisTemplate.opsForValue().set(key, value);
- get
stringRedisTemplate.opsForValue().get(key);
- delete
stringRedisTemplate.delete(key);
- expire
stringRedisTemplate.expire(key, timeout, timeUnit);
- exists
stringRedisTemplate.hasKey(key);
- set
-
Hash
- put
stringRedisTemplate.opsForHash().put(key, hashKey, value);
- putAll
一次性把所有field-value对存入hashmap中Map<String, String> map = new HashMap<>();map.put("key1", "value1");map.put("key2", "value2");stringRedisTemplate.opsForHash().putAll(key, map); - get
stringRedisTemplate.opsForHash().get(key, hashKey);
- expire
stringRedisTemplate.expire(key, timeout, timeUnit);
- delete
也可以一次把key对应的所有field-value对删除stringRedisTemplate.opsForHash().delete(key, hashKey);stringRedisTemplate.delete(key);
- put
-
List
- leftPush
stringRedisTemplate.opsForList().leftPush(key, value);
- rightPush
stringRedisTemplate.opsForList().rightPush(key, value);
- leftPop
stringRedisTemplate.opsForList().leftPop(key);
- rightPop
stringRedisTemplate.opsForList().rightPop(key);
- size
stringRedisTemplate.opsForList().size(key);
- range
stringRedisTemplate.opsForList().range(key, start, end);
- expire
stringRedisTemplate.expire(key, timeout, timeUnit);
- delete
stringRedisTemplate.opsForList().delete(key, index);
- leftPush
-
Set
- add
stringRedisTemplate.opsForSet().add(key, value);
- size
stringRedisTemplate.opsForSet().size(key);
- members
stringRedisTemplate.opsForSet().members(key);
- expire
stringRedisTemplate.expire(key, timeout, timeUnit);
- delete
stringRedisTemplate.opsForSet().delete(key, value);
- add
其他的暂且不提,因为用的确实比较少
问题记录
接下来记录一下我遇到的问题
-
在我们使用
@Autowired
注解尝试对redisTemplate进行注入时会报Warning。这个呢,你要么用
@Resource
注解,要么用IDEA推荐的方法,将要注入的redisTemplate通过输入的参数来获取 -
StringRedisTemplate
能用,但是RedisTemplate
使用报null的错。这个是因为两者默认的序列化方式不同,你注意发现的话,前者在redis中显示的方式就是可阅读的字符串,而后者则是
0x
开头的字节码形式。所以如果你要用RedisTemplate
,需要我们去配置一下redisTemplate的序列化方式。// 这个可以放在config包下的RedisConfig类中// 这里的Object可以替换成你要序列化的对象类型@Configurationpublic class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(factory);template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(new GenericJackson2JsonRedisSerializer());template.setHashKeySerializer(new StringRedisSerializer());template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());return template;}}