Redis-基本介绍/linux下环境配置/配置文件/SpringBoot整合

发布于:2023-01-24 ⋅ 阅读:(22) ⋅ 点赞:(0) ⋅ 评论:(0)

目录

一、NoSQL数据库

二、linux环境下的安装

三、配置文件redis.config

四、SpringBoot整合


一、NoSQL数据库

        NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库

        NoSQL 不依赖业务逻辑方式存储,而以简单的key-value模式存储。因此大大的增加了数据库的扩展能力

  1. 不遵循SQL标准。
  2. 不支持ACID。
  3. 远超于SQL的性能。

        NoSQL的适用场景

  1. 对数据高并发的读写
  2. 海量数据的读写
  3. 对数据高可扩展性的

        NoSQL不适用的场景:

  1. 需要事务支持
  2. 基于sql的结构化查询存储,处理复杂的关系,需要即席查询。

        

        RedisNoSQL数据库的一种,具有以下特点:

  • 数据都在内存中,支持持久化,主要用作备份恢复,也作为缓存数据库辅助持久化的数据库
  • 除了支持简单的key-value模式,还支持多种数据结构的存储,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。
  • 这些数据类型都支持push/popadd/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。
  • Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件。
  • 并且在此基础上实现了master-slave(主从)同步。

        应用场景

  1. 配合关系型数据库做高速缓存
    1. 高频次,热门访问的数据,降低数据库IO
    2. 分布式架构,做session共享
  2. 多样的数据结构存储持久化数据

         Redis的默认端口6379单线程+多路IO复用技术

        多路复用是指使用一个线程来检查多个文件描述符(Socket)的就绪状态,比如调用select和poll函数,传入多个文件描述符,如果有一个文件描述符就绪,则返回,否则阻塞直到超时。得到就绪状态后进行真正的操作可以在同一个线程里执行,也可以启动线程执行(比如使用线程池)

        就好比人们通过黄牛买电影票。黄牛与影院之间是单线程,与若干买票的人之间是多路复用。票不是即买即有的,买票的人可能购买之后需要等待,在等待的过程中可以去做自己的事情,等黄牛告诉他有票时再来取。

二、linux环境下的安装

        1.下载redis软件包的压缩文件(推荐去镜像源下载)

        2.安装虚拟机软件,如vmware,然后安装centOS镜像(推荐去镜像源下载)

        3.将redis-6.2.1.tar.gz放在桌面的自定义文件夹内,示例:

        4.在该文件夹内打开终端,键入命令:tar -zxvf redis-6.2.1.tar.gz

        5.进入解压后redis-6.2.1目录,打开终端键入 make 命令,执行完毕后再键入make install 命令(若提示权限不足,就先键入“su”,输入密码获取最高权限;有些情况可能提示要安装gcc编译器,但我安装的过程没有提示)。

        6.这是安装成功后的安装目录:/usr/local/bin

redis-benchmark:性能测试工具,可以在自己本子运行,看看自己本子性能如何

redis-check-aof:修复有问题的AOF文件,rdb和aof后面讲

redis-check-dump:修复有问题的dump.rdb文件

redis-sentinel:Redis集群使用

redis-server:Redis服务器启动命令

redis-cli:客户端,操作入口

        7.我们要设置后台启动,因为默认情况下是前台启动,一旦关闭了终端,服务器就也关了。

在桌面上新建一个文件夹,用于存放配置文件。把解压后redis-6.2.1目录中的redis.conf文件复制过来:

         8.打开该配置文件,搜索并修改下面的字段:

                daemonize no --> daemonize yes

         9.打开redis服务器redis-server /xxx/xxx/redis.config

        10.客户端连接redis服务器redis-cli    ,输入ping测试是否连接

三、配置文件redis.config

        timeout一个空闲的客户端维持多少秒会关闭,0表示关闭该功能。即永不关闭

​​​​​​​​​​​​​​        tcp-keepalive对访问客户端的一种心跳检测,每个n秒检测一次。单位为秒,如果设置为0,则不会进行Keepalive检测,建议设置成60

        port端口号默认6379

​​​​​​​​​​​​​​        daemonize是否为后台进程,一般设置为yes

        loglevel;指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为notice

        databases设定库的数量默认16默认数据库为0,可以使用SELECT <dbid>命令在连接上指定数据库id

        maxmemory 建议必须设置,否则,将内存占满,造成服务器宕机设置redis可以使用的内存量。一旦到达内存使用上限,redis将会试图移除内部数据,移除规则可以通过maxmemory-policy来指定。如果redis无法根据移除规则来移除内存中的数据,或者设置了“不允许移除”,那么redis则会针对那些需要申请内存的指令返回错误信息,比如SET、LPUSH等。但是对于无内存申请的指令,仍然会正常响应,比如GET等。如果你的redis是主redis(说明你的redis有从redis),那么在设置内存使用上限时,需要在系统中留出一些内存空间给同步队列缓存,只有在你设置的是“不移除”的情况下,才不用考虑这个因素。

        maxclients设置redis同时可以与多少个客户端进行连接。默认情况下为10000个客户端

        如果想要远程访问redis服务器,需要修改下面几个重要的参数:

        bind:默认情况bind=127.0.0.1只能接受本机的访问请求,不写的情况下可以无限制接受任何ip地址的访问

        protected-mode如果开启了protected-mode,那么在没有设定bind ip且没有设密码的情况下,Redis只允许接受本机的响应。应设置为 no

四、SpringBoot整合

<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

<!-- spring2.X集成redis所需common-pool2-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.6.0</version>
</dependency>

        配置文件: 

#Redis服务器地址
spring.redis.host=192.168.140.136
#Redis服务器连接端口
spring.redis.port=6379
#Redis数据库索引(默认为0)
spring.redis.database= 0
#连接超时时间(毫秒)
spring.redis.timeout=1800000
#连接池最大连接数(使用负值表示没有限制)
spring.redis.lettuce.pool.max-active=20
#最大阻塞等待时间(负数表示没限制)
spring.redis.lettuce.pool.max-wait=-1
#连接池中的最大空闲连接
spring.redis.lettuce.pool.max-idle=5
#连接池中的最小空闲连接
spring.redis.lettuce.pool.min-idle=0

        配置类:

@EnableCaching
@Configuration
public class RedisConfig extends CachingConfigurerSupport {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        template.setConnectionFactory(factory);
//key序列化方式
        template.setKeySerializer(redisSerializer);
//value序列化
        template.setValueSerializer(jackson2JsonRedisSerializer);
//value hashmap序列化
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        return template;
    }

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
//解决查询缓存转换异常的问题
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
// 配置序列化(解决乱码的问题),过期时间600秒
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofSeconds(600))
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
                .disableCachingNullValues();
        RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
                .cacheDefaults(config)
                .build();
        return cacheManager;
    }
}

        使用SpringBoot提供的redisTemplate进行操作。


网站公告

欢迎关注微信公众号

今日签到

点亮在社区的每一天
签到