Redis数据库

在前面我们学习了MySQL数据库,它是一种传统的关系型数据库,我们可以使用MySQL来更好地管理和组织我们的数据,虽然在小型Web应用下,只需要一个MySQL+Mybatis自带的缓存系统就可以胜任大部分的数据存储工作。但是MySQL的缺点也很明显,它的数据始终是存储在硬盘上的,对于我们的用户信息这种不需要经常发生修改的内容,使用MySQL存储确实可以,但是如果是快速更新或是频繁使用的数据,比如微博热搜、双十一秒杀,这些数据不仅要求服务器需要提供更高的响应速度,而且还需要面对短时间内上百万甚至上千万次访问,而MySQL的磁盘IO读写性能完全不能满足上面的需求,能够满足上述需求的只有内存,因为速度远高于磁盘IO。

因此,我们需要寻找一种更好的解决方案,来存储上述这类特殊数据,弥补MySQL的不足,以应对大数据时代的重重考验。

NoSQL全称是Not Only SQL(不仅仅是SQL)它是一种非关系型数据库

  1. 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.

  2. 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.

  3. 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.

下载非官方的redis数据库安装后运行:

Redis数据库_第1张图片

基本操作

在我们之前使用MySQL时,我们需要先在数据库中创建一张表,并定义好表的每个字段内容,最后再通过insert语句向表中添加数据,而Redis并不具有MySQL那样的严格的表结构,Redis是一个键值数据库,因此,可以像Map一样的操作方式,通过键值对向Redis数据库中添加数据(操作起来类似于向一个HashMap中存放数据)

在Redis下,数据库是由一个整数索引标识,而不是由一个数据库名称。 默认情况下,我们连接Redis数据库之后,会使用0号数据库,我们可以通过Redis配置文件中的参数来修改数据库总数,默认为16个。

我们可以通过select语句进行切换:

select 序号;

Redis数据库_第2张图片

数据操作

我们来看看,如何向Redis数据库中添加数据:

set  
-- 一次性多个
mset [ ]...

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所有存入的数据默认会以字符串的形式保存,键值具有一定的命名规范,以方便我们可以快速定位我们的数据属于哪一个部分,比如用户的数据:

-- 使用冒号来进行板块分割,比如下面表示用户XXX的信息中的name属性,值为lbw
set user:info:用户ID:name lbw

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以通过键值获取存入的值:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

它还支持数据的过期时间设定:

set   EX 秒
set   PX 毫秒

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当数据到达指定时间时,会被自动删除。我们也可以单独为其他的键值对设置过期时间:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Redis数据库_第3张图片

通过下面的命令来查询某个键值对的过期时间还剩多少:

ttl 
-- 毫秒显示
pttl 
-- 转换为永久
persist 

Redis数据库_第4张图片

那么当我们想直接删除这个数据时呢?直接使用:

del 

删除命令可以同时拼接多个键值一起删除

当我们想要查看数据库中所有的键值时:

keys *

查询某个键是否存在:

exists ...

随机拿一个键:

randomkey

将一个数据库中的内容移动到另一个数据库中:

move  数据库序号

修改一个键为另一个键:

rename  <新的名称>
-- 下面这个会检查新的名称是否已经存在
renamex  <新的名称>

如果存放的数据是一个数字,我们还可以对其进行自增自减操作:

-- 等价于a = a + 1
incr 
-- 等价于a = a + b
incrby  b
-- 等价于a = a - 1
decr 

查看值的数据类型:

type 

导入依赖:


    org.springframework.boot
    spring-boot-starter-data-redis

starter提供的默认配置会去连接本地的Redis服务器,并使用0号数据库,当然你也可以手动进行修改:

spring:
  redis:
  	#Redis服务器地址
    host: 192.168.10.3
    #端口
    port: 6379
    #使用几号数据库
    database: 0

starter已经给我们提供了两个默认的模板类:

@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 redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate template = new RedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }

    @Bean
    @ConditionalOnMissingBean
    @ConditionalOnSingleCandidate(RedisConnectionFactory.class)
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
        return new StringRedisTemplate(redisConnectionFactory);
    }
}

可以直接注入StringRedisTemplate来使用模板:

@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一致。

你可能感兴趣的:(数据库,redis,缓存)