介绍
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。 [1]
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
redis的官网地址,非常好记,是redis.io。(域名后缀io属于国家域名,是british Indian Ocean territory,即英属印度洋领地),Vmware在资助着redis项目的开发和维护。
Redis 是一种开源(BSD 许可)、内存中数据结构存储,用作数据库、缓存和消息代理。Redis 提供了诸如字符串、散列、列表、集合、带范围查询的排序集合、位图、超级日志、地理空间索引和流等数据结构。Redis 内置复制、Lua 脚本、LRU 驱逐、事务和不同级别的磁盘持久化,并通过 Redis Sentinel 和 Redis Cluster 自动分区提供高可用性。
数据类型
- String: 字符串
string是最简单的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value,其上支持的操作与Memcached的操作类似。但它的功能更丰富。
- Hash: 散列
- List: 列表
list是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等。操作中key理解为链表的名字。
- Set: 集合
set是集合,和我们数学中的集合概念相似,对集合的操作有添加删除元素,有对多个集合求交并差等操作。操作中key理解为集合的名字。
- Sorted Set: 有序集合
Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
1.添加启动器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
2.配置连接信息
spring:
redis:
host: 127.0.0.1
port: 6379
password: 123456
jedis:
pool:
max-active: 8
max-wait: -1
max-idle: 500
min-idle: 0
3.配置序列化器
这个看你自己,不自定义也不影响使用,只是说可能不那么顺手,所以阿粉习惯自定义一个。因为 Spring Boot
在 RedisAutoConfiguration
中默认配置了 RedisTemplate<Object, Object>
、StringRedisTemplate
两个模板类,然而RedisTemplate<Object, Object>
并未指定key
、value
的序列化器。
-
为什么需要序列化?
你要记住一句话,在JAVA中,一切皆对象,而将对象的状态信息转为存储或传输的形式需要序列化。 -
我们需要把默认java序列化方式转换成json序列化方式
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
//redis默认序列化jdk,需要改成json来序列化
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
template.setDefaultSerializer(serializer);
return template;
}
}
4.开始测试
@Slf4j
@RestController
public class RedisController {
@Resource
RedisTemplate<String, Object> redisTemplate;
User user = new User();
@GetMapping("/add")
public String add(){
//添加数据
User.Student student = new User.Student();
user.setId(1);
user.setDate(LocalDate.now());
user.setDateTime(LocalDateTime.now());
student.setDate(LocalDate.now());
student.setDateTime(LocalDateTime.now());
student.setName("张三");
user.setStudent(student);
if (redisTemplate.opsForValue().get("张三")==null){
//判断缓存中是否存在如果没有则加入缓存
redisTemplate.opsForValue().set("张三",user);
log.info("加入缓存");
}
return redisTemplate.opsForValue().get("张三").toString();
}
@GetMapping("/get")
public String get(){
//首先从缓存中获取数据
if (redisTemplate.opsForValue().get("张三")!=null){
log.info("从缓存中拿数据");
return redisTemplate.opsForValue().get("张三").toString();
}else {
//没有则从数据库获取数据
if (1==user.getId()){
//然后加入缓存
redisTemplate.opsForValue().set("张三",user);
log.info("加入缓存");
}
return redisTemplate.opsForValue().get("张三").toString();
}
}
@GetMapping("/update")
public String update(){
//获取数据
if (null!=user.getId()&&1==user.getId()){
//修改数据
user.getStudent().setName("update张三");
//加入缓存
redisTemplate.opsForValue().set("张三",user);
log.info("加入缓存");
}
return redisTemplate.opsForValue().get("张三").toString();
}
@GetMapping("/delete")
public String delete(){
//获取数据
if (null!=user.getId()&&1==user.getId()){
//删除数据
user=null;
//删除缓存
redisTemplate.delete("张三");
log.info("删除缓存");
}
return "删除成功";
}
}
码云地址
https://gitee.com/lzz19980505/springboot-redisdemo
有问题联系我