在前面我们学习了MySQL数据库,它是一种传统的关系型数据库,我们可以使用MySQL来更好地管理和组织我们的数据,虽然在小型Web应用下,只需要一个MySQL+Mybatis自带的缓存系统就可以胜任大部分的数据存储工作。但是MySQL的缺点也很明显,它的数据始终是存储在硬盘上的,对于我们的用户信息这种不需要经常发生修改的内容,使用MySQL存储确实可以,但是如果是快速更新或是频繁使用的数据,比如微博热搜、双十一秒杀,这些数据不仅要求服务器需要提供更高的响应速度,而且还需要面对短时间内上百万甚至上千万次访问,而MySQL的磁盘IO读写性能完全不能满足上面的需求,能够满足上述需求的只有内存,因为速度远高于磁盘IO。
因此,我们需要寻找一种更好的解决方案,来存储上述这类特殊数据,弥补MySQL的不足,以应对大数据时代的重重考验。
NoSQL全称是Not Only SQL(不仅仅是SQL)它是一种非关系型数据库
No guarantee of ACID properties: NoSQL databases often prioritize scalability and performance over strict ACID (Atomicity, Consistency, Isolation, Durability) guarantees. They may sacrifice some of these properties to achieve higher scalability and availability.
Non-compliance with SQL standards: NoSQL databases do not adhere to the SQL standard. Instead, they provide their own query languages or APIs for data manipulation and retrieval. These languages may vary across different NoSQL databases.
Elimination of relational data associations: NoSQL databases do not rely on fixed table schemas and structured relationships between tables. They typically use flexible data models, such as key-value pairs, documents, graphs, or column families, to store and retrieve data. This flexibility allows for dynamic and schema-less data storage, enabling easier scalability and handling of unstructured and semi-structured data.
在我们之前使用MySQL时,我们需要先在数据库中创建一张表,并定义好表的每个字段内容,最后再通过insert
语句向表中添加数据,而Redis并不具有MySQL那样的严格的表结构,Redis是一个键值数据库,因此,可以像Map一样的操作方式,通过键值对向Redis数据库中添加数据(操作起来类似于向一个HashMap中存放数据)
在Redis下,数据库是由一个整数索引标识,而不是由一个数据库名称。 默认情况下,我们连接Redis数据库之后,会使用0号数据库,我们可以通过Redis配置文件中的参数来修改数据库总数,默认为16个。
我们可以通过select
语句进行切换:
select 序号;
我们来看看,如何向Redis数据库中添加数据:
```Plain Text set -- 一次性多个 mset [ ]…
![image.png](https://flowus.cn/preview/316de7c7-26ab-41ab-9e97-1c0db6bfeb86)
所有存入的数据默认会以**字符串**的形式保存,键值具有一定的命名规范,以方便我们可以快速定位我们的数据属于哪一个部分,比如用户的数据:
Java -- 使用冒号来进行板块分割,比如下面表示用户XXX的信息中的name属性,值为lbw set user:info:用户ID:name lbw
![image.png](https://flowus.cn/preview/c2bae873-d865-40ec-bbd0-11fa4208f609)
我们可以通过键值获取存入的值:
![image.png](https://flowus.cn/preview/88f67452-1944-46e9-aecc-86c83e5dca43)
它还支持数据的过期时间设定:
Plain Text set EX 秒 set PX 毫秒
![image.png](https://flowus.cn/preview/06965990-84a5-49d3-8bb0-c088cc5b0f8c)
当数据到达指定时间时,会被自动删除。我们也可以单独为其他的键值对设置过期时间:
![image.png](https://flowus.cn/preview/2e4230c6-682e-4072-89db-926cb91b34ab)
![image.png](https://flowus.cn/preview/1ff27734-2b53-4557-b6d7-404ec60e7c4b)
通过下面的命令来查询某个键值对的过期时间还剩多少:
Plain Text ttl -- 毫秒显示 pttl -- 转换为永久 persist
![image.png](https://flowus.cn/preview/2cf74240-8624-4394-b0ca-c057c353ccbc)
那么当我们想直接删除这个数据时呢?直接使用:
Java del
删除命令可以同时拼接多个键值一起删除
当我们想要查看数据库中所有的键值时:
Plain Text keys *
查询某个键是否存在:
Plain Text exists …
随机拿一个键:
Plain Text randomkey
将一个数据库中的内容移动到另一个数据库中:
Java move 数据库序号
修改一个键为另一个键:
Plain Text rename -- 下面这个会检查新的名称是否已经存在 renamex
如果存放的数据是一个数字,我们还可以对其进行自增自减操作:
Plain Text -- 等价于a = a + 1 incr -- 等价于a = a + b incrby b -- 等价于a = a - 1 decr
查看值的数据类型:
Java type ```
导入依赖:
org.springframework.boot
spring-boot-starter-data-redis
starter提供的默认配置会去连接本地的Redis服务器,并使用0号数据库,当然你也可以手动进行修改:
```Plain Text spring: redis: #Redis服务器地址 host: 192.168.10.3 #端口 port: 6379 #使用几号数据库 database: 0
starter已经给我们提供了两个默认的模板类:
Plain Text @Configuration( proxyBeanMethods = false ) @ConditionalOnClass({RedisOperations.class}) @EnableConfigurationProperties({RedisProperties.class}) @Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class}) public class RedisAutoConfiguration { public RedisAutoConfiguration() { }
@Bean
@ConditionalOnMissingBean(
name = {"redisTemplate"}
)
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
public RedisTemplate
}
可以直接注入`StringRedisTemplate`来使用模板:
Plain Text @SpringBootTest class SpringBootTestApplicationTests {
@Autowired
StringRedisTemplate template;
@Test
void contextLoads() {
ValueOperations operations = template.opsForValue();
operations.set("c", "xxxxx"); //设置值
System.out.println(operations.get("c")); //获取值
template.delete("c"); //删除键
System.out.println(template.hasKey("c")); //判断是否包含键
}
} ```
实际上所有的值的操作都被封装到了ValueOperations
对象中,而普通的键操作直接通过模板对象就可以使用了,大致使用方式其实和Jedis一致。