本文最后更新于2 分钟前,文中所描述的信息可能已发生改变。
Redis启动(Windows下)
在 Redis 的安装目录下进入终端,输入redis-server.exe redis.windows.conf
启动 Redis 服务端,另起一个终端进入 Redis 的安装目录下输入redis-cli.exe -h 127.0.0.1 -p 6379
启动客户端。
Redis安全
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) ""
查看是否设置了 Redis 的密码,显示空字符串则为没有设置。
通过config set requirepass "12345"
即可设置密码。设置后客户端连接 redis 需要输入auth 12345
才能操作数据库。
数据类型
- String类型:
set "string.key" "value"
。 - list类型:加入元素
lpush "key" "value1" "value2"
;输出全部元素lrange "key" 0 20
。 - set类型:加入元素
add "key" "value1" "value2"
;输出全部元素smembers "key"
。 - zset类型:加入
zadd key value
;输出zrange key start end
。 - hash类型:加入
hmset key field1 v1 field2 v2...
;输出hget key filed
。
其它的数据类型:位图(bitmaps)、超日志(HyperLogLogs)、地理空间(Geospatial)、发布/订阅(Pub/Sub)、流(Streams)、模块(Modules)。
Redis整合SpringBoot
依赖导入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 简化缓存操作 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
配置文件配置(springboot2.x版本)
# 单机模式配置
server:
port: 8080
spring:
redis:
database: 0
host: localhost
port: 6379
lettuce:
pool:
enabled: true #使用连接池
max-active: 8
main:
banner-mode: off #关闭横幅
cache: #使用redis的缓存
type: redis
cache-names: test
配置 RedisTemplate
@Configuration
@Slf4j
public class MyConfig {
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate<String, Object> template = new RedisTemplate<>();
//设置连接工厂
template.setConnectionFactory(redisConnectionFactory);
StringRedisSerializer redisSerializer = new StringRedisSerializer();
GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
//设置key的序列化器为StringRedisSerializer
template.setKeySerializer(redisSerializer);
//设置value的序列化器为GenericJackson2JsonRedisSerializer
template.setValueSerializer(jsonRedisSerializer);
//设置hash类型数据的序列化方式
template.setHashKeySerializer(redisSerializer);
template.setHashValueSerializer(jsonRedisSerializer);
log.info("RedisTemplate注入完成");
return template;
}
/**
* 配置后缓存入redis不会乱码
* @param redisTemplate
* @return
*/
@Bean
public CacheManager cacheManager(RedisTemplate<String,Object> redisTemplate){
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
//设置key的序列化方式
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getStringSerializer()))
//设置value的序列化方式
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer()))
//设置不缓存null值
.disableCachingNullValues()
//设置过期时间为1小时
.entryTtl(Duration.ofHours(1));
RedisCacheManager cacheManager = RedisCacheManager.RedisCacheManagerBuilder
//设置连接池
.fromConnectionFactory(redisTemplate.getConnectionFactory())
//设置缓存默认配置
.cacheDefaults(redisCacheConfiguration)
//设置同步修改或删除 put/evict
.transactionAware()
.build();
return cacheManager;
}
//获取操作String类型数据的类,简化。
@Bean(name = "valueOperations")
public ValueOperations<String,Object> valueOperations(RedisTemplate<String,Object> redisTemplate){
return redisTemplate.opsForValue();
}
}
还需要在主启动类上加上注解@EnableCaching启用SpringCache的注解功能
配置一个RedisController用于测试
应该是写在业务层的
@RequestMapping("/redis")
@RestController
@Slf4j
public class RedisController {
@GetMapping("/get1")
@Cacheable(value = "cacheName",key = "#key")
public User getUser1(@RequestParam("key") String key){
log.info("key :{}",key);
return User.builder().id(1).name("哈姆").age(18).build();
}
@GetMapping("/get2")
@Cacheable(value = "cacheName",key = "#key")
public String getUser2(@RequestParam("key") String key){
log.info("key :{}",key);
return "我是数据";
}
@GetMapping("/del")
@CacheEvict(value = "cacheName",key = "#key")
public void delUser(@RequestParam("key")String key){
log.info("删除数据与缓存:{}",key);
}
@GetMapping("/update1")
@CachePut(value = "cacheName",key = "#key",unless = "#result == null")
public void update1(@RequestParam("key")String key){
//此处更新因为返回值为空且设置了unless判断是否进行缓存,条件为真则不进行更新缓存。
log.info("更新数据与缓存:{}",key);
}
@GetMapping("/update2")
@CachePut(value = "cacheName",key = "#key",unless = "#result == null")
public String update2(@RequestParam("key")String key){
//返回值不为空,会将返回值更新到对于的缓存中。
log.info("更新数据与缓存:{}",key);
return "更新后的数据";
}
@GetMapping("/addBatch")
@Caching(cacheable = {
@Cacheable(value = "cacheName",key = "#key1"),
@Cacheable(value = "cacheName",key = "#key2")
})
public String addBatch(@RequestParam("key1")String key1,@RequestParam("key2")String key2){
log.info("批量缓存:{} {}",key1,key2);
return "批量缓存的数据";
}
}
@Cacheable(value = "cacheName",key = "key")
使用在方法上,如果缓存中有则提供缓存中的,如果缓存中没有则将方法返回值添加到缓存中。key为缓存的key,value类似分组。
@CachePut(value = "cacheName",key = "key")
用在方法上,用于更新缓存,无论缓存中否有都执行方法并将执行结果更新到缓存中。
@CacheEvict(value = "cacheName,key = "key")
用在方法上,用于删除缓存,当方法掉用时会清除指定value与key的缓存。通过allEntries、beforeInvocation属性可以来清除全部缓存数据,不过allEntries是方法调用后清理,beforeInvocation是方法调用前清理。
@Caching
用于方法或类上,即用于执行批量的缓存操作,可以在里面使用多个Spring Cache相关注解。
//此处当方法执行时会移除两个缓存中的数据。
//@Caching的属性cacheable、put、evict分别用于指定@Cacheable、@CachePut、@CacheEvict注解
@Caching(evict{
@CacheEvict(value = "c1",key = "#args.id"),
@CacheEvict(value = "c2",key = "#args.id")
}
)
public void save(MyArgs args){
//业务逻辑
}
@CacheConfig
可以写在类上,主要就是用于简化缓存的配置,例如我可以在类上CacheConfig(cacheNames = {"myCache"})
这样就不用在每一个方法上都指定 cacheName 属性的值。
缓存的key可以使用sqEL表达式书写,#result表示方法执行后的返回值。
整合SpringCloud
其实和整合SpringBoot是一样的,只不过是在配置中心配置罢了。
最佳实践
- 读多写少,对及时性与一致性要求不高的数据尽量使用缓存。
- 注意数据一致性问题,即线程安全问题。