什么是NoSQL
为了解决高并发、高可扩展、高可用、大数据存储问题而产生的数据库解决方案,就是NoSQL数据库。
NoSQL,泛指非关系型的数据库,NoSQL即Not-Only SQL,它可以作为关系型数据库的良好补充。Redis是NoSQL中的一种。
什么是redis
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库。它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如 字符串类型、散列类型、列表类型、集合类型、有序集合类型
redis有什么用
缓存(数据查询、短连接、新闻内容、商品内容等等)(最多使用)
分布式集群架构中的session分离
聊天室的在线好友列表
任务队列(秒杀、抢购、12306等等)
应用排行榜
网站访问统计
数据过期处理(可以精确到毫秒)
redis使用入门
1、下载
当前为Mac环境
官网下载安装包
或使用命令下载并解压
$ wget http://download.redis.io/releases/redis-5.0.5.tar.gz
$ tar xzf redis-5.0.5.tar.gz
2、编译
$ cd redis-5.0.5
$ make
3、启动
$ src/redis-server
4、使用
通过redis自带的客户端来使用redis命令
$ src/redis-cli
redis> set foo bar
OK
redis> get foo
"bar"
springboot集成redis
1、添加依赖pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2、设置属性application.properties
#Redis数据库索引(默认为0)
spring.redis.database=0
#Redis服务器地址
spring.redis.host=localhost
#Redis服务器连接端口
spring.redis.port=6379
### Redis服务器连接密码(默认为空)
spring.redis.password=123456
3、基础使用
spring-boot提供了两个类来直接操作redis,RedisTemplate和StringRedisTemplate。RedisTemplate的范型是<Object,Object>,而StringRedisTemplate是RedisTemplate的子类,其范型是<String, String>。两者相互独立,操作的数据互不相干,且不能操作另一方的数据。
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private StringRedisTemplate stringRedisTemplate;
@RequestMapping("/hello")
public String hello() {
redisTemplate.opsForValue().set("user.001", "Jackson");
stringRedisTemplate.opsForValue().set("user.002", "Jackson");
return "hello";
}
通过可视化客户端查看保存的数据如下:
4、解决乱码
从上图可以看出,通过RedisTemplate保存的数据出现了乱码,这是因为RedisTemplate默认使用的是JDK序列化的方式,数据是被序列化成16进制后进行保存的。可以自定义RedisTemplate并添加到Spring的bean容器中来代替默认的RedisTemplate对象。
@Configuration // 通过Configuration+Bean来添加到Spring容器中。
public class RedisConfig {
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(mapper);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}