什么是Redis?
Redis 是由意大利人 Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库。Redis 全称为:Remote Dictionary Server(远程数据服务), 该软件使用 C 语言编写,典型的 NoSQL 数据库服务器,== Redis 是一个 key-value 存储系统,它支持丰富的数据类型,如:string、list、set、zset(sorted set)、hash。Redis 本质上是一个 Key-Value 类型的内存数据库== ,很像 memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据 flush 到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过10万次读写操作 ,是已知性能最快的 Key-Value DB。Redis 的出色之处不仅仅是性能,Redis 最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB,不像 memcached 只能保存1MB的数据,另外Redis也可以对存入的 Key-Value 设置 expire 时间。Redis 的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此 Redis 适合的场景主要局限在较小数据量的高性能操作和运算上。
Redis适合的场景
(1)、会话缓存(Session Cache)
(2)、全页缓存(FPC)
(3)、队列
(4)、排行榜/计数器
(5)、发布/订阅
Redis的数据结构
Redis 的基本数据结构有五种,分别是:
1、String——字符串
2、Hash——字典
3、List——列表
4、Set——集合
5、Sorted Set——有序集合(简称ZSet)
三种特殊数据类型,分别是:
1、geospatial地理位置
2、Hyperloglog基数统计
3、bitmaps位存储
SpringBoot整合
1、导入redis需要的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.1.6.RELEASE</version>
</dependency>
2、导入依赖之后就可以使用RedisTemplate的模板了,使用的时候只需要注入进来即可。
@Controller
public class testController {
@Autowired
private RedisTemplate redisTemplate;
@RequestMapping("/v1/redis")
public void test(){
/**
* redisTemplate操作不同的数据类型
* opsForValue() 操作String类型
* opsForHash() 操作Hash类型
* opsForList() 操作List类型
* opsForSet() 操作Set类型
* opsForZSet() 操作ZSet类型
* opsForGeo() 地图
* opsForHyperLogLog() 基数统计
*/
redisTemplate.opsForValue().set("name","zhao");
System.out.println(redisTemplate.opsForValue().get("name"));
}
}
在控制会把name的值输出出来,但如果用客户端查看会发现,name会变成如下图所示,值也是不可见的
原因是默认使用的redis模板使用的是jdbc序列化的方式,所以我们需要把jdbc的方式改成json的方式,
3、配置一个json的方式
@Configuration
public class redisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory){
RedisTemplate<String,Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
//json序列号配置
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper obj= new ObjectMapper();
obj.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
obj.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(obj);
//String 序列化
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
//key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
template.setHashKeySerializer(stringRedisSerializer);
//value采用jackson的序列化方式
template.setValueSerializer(jackson2JsonRedisSerializer);
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
使用这个再次测试
@Autowired
@Qualifier("redisTemplate")
private RedisTemplate redisTemplate;
@RequestMapping("/v1/redis")
public void test(){
/**
* redisTemplate操作不同的数据类型
* opsForValue() 操作String类型
* opsForHash() 操作Hash类型
* opsForList() 操作List类型
* opsForSet() 操作Set类型
* opsForZSet() 操作ZSet类型
* opsForGeo() 地图
* opsForHyperLogLog() 基数统计
*/
redisTemplate.opsForValue().set("name","zhao");
System.out.println(redisTemplate.opsForValue().get("name"));
}
}
结果如下图
4、一般企业开发会把redis的命令自己写一个ResultUtil工具类中,而不是直接使用 redisTemplate.opsForValue() 这种方式,如果想要ResultUtil这个工具类,自行百度即可。