JAVA架构——Redis

⦁    Redis概述
⦁      什么是NOSQL
   nosql工具也是一种简易数据库,它主要是一种基于内存的数据库,并提供一定的持久化功能。Redis和MongoDB是当前使用最广泛的NOSQL。我们课上主要介绍的是Redis技术,它的性能十分优越,可以支持每秒十几万的读/写操作,其性能远超数据库,并支持集群,分布式,主从同步等配置,原则上可以无限拓展,让更多的数据存储在内存中,而更让我们感到欣喜的是它还支持一定的事务能力,这在高并发访问的场景下保证数据安全和一致性特别有用。
⦁    Redis性能优越的原因
基于ANSI C语言编写的,接近于汇编语言的机器语言,运行十分快速。
基于内存的读/写,速度自然比数据库的磁盘读写要快很多。
它的数据库结构只有6种类型,数据结构比较简单,因此规则较少,而数据库则是范式,完整性,规范性需要考虑的规则较多,处理业务会比较复杂。
⦁    Redis在Java Web中的应用
⦁    缓存
 
⦁    高速读写场合
 
⦁    Redis基本安装和使用
⦁    在Windows下安装Redis
把Redis文件下载下来,进行解压缩
 
 
为了方便,我们可以在这个目录,新建一个文件startup.cmd,用记事本打开,输入如下内容:
redis-server redis.windows.conf
这个命令调用redis-server.exe的命令读取    的内容,用来启动redis,保存好了双击就可以看到Redis 启动的信息了。

 
启动成功。
这时候可以双击放在同一个文件夹下文件redis-cli.exe,它是一个Redis自带的客户端工具,这样就可以连接到Redis服务器了。

⦁    简介Redis的6种数据类型
 Redis是一种基于内存的数据库,并且提供一定的持久化功能,它是一种键值(key-value)数据库,使用key作为索引找到当前缓存的数据,并返回给程序调用者。当前的Redis支持6中数据类型,它们分别是字符串(String)、列表(List)、集合(set)、哈希结构(hash)、有序集合(zset)和基数(HyperLogLog)。使用Redis编程要熟悉这6种数据类型,并且了解它们常用的命令。Redis定义的这6种数据类型是十分有用的,它除了提供简单的存储功能外,还能对存储的数据进行一些计算,比如字符串可以支持浮点数的自增、自减、字符串求子串、集合求交集、并集、有序集合进行排序等,所以使用它们有利于对一些不太大的数据集合进行快速计算,简化编程,同时它也比数据库要快得多,所以它对系统性能的提升十分有意义。
                        Redis的6种数据类型的基本描述
 
此外,Redis还支持一些事务、发布订阅消息模式、主从复制、持久化等作为Java开发人员需要知道的功能。
⦁    在Spring Boot中使用Redis
⦁       引入Spring-boot-stater-data-redis
   <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <!--不依赖Redis的异步客户端,因为默认是依赖这个的,我想用的是jedis驱动 -->
            <exclusions>
                <exclusion>
                    <groupId>io.lettuce</groupId>
                    <artifactId>lettuce-core</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--引入Redis的客户端驱动jedis -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>
⦁    Spring-data-redis项目简介
    在Java中与Redis连接的驱动存在很多中,目前比较广泛使用的是Jedis,其他还有Lettue、
Jredis和Srp。我们推荐使用的类库Jedis。当我们在项目中引入Spring-data-redis项目后,Spring提供了一个RedisConnectionFactory接口,通过它可以生成一个RedisConnection接口对象,而RedisConnection接口对象是对Redis底层接口的封装。例如,这里我们使用的Jedis驱动,那么Spring 会提供RedisConnection接口的实现类JedisConnection去封装原有的Jedis(redis.clients.jedis.Jedis)对象。
在Spring中是通过RedisConnection接口操作Redis的,而RedisConnection则是对原生的Jedis进行封装的。要想获得RedisConnection接口对象,使用通过RedisConnectionFactory接口去生成的,所以第一步要配置的便是这个工厂了,而配置这个工厂主要是配置Redis的连接池,对于连接池可以限定其最大连接数、超时时间等属性。
⦁    创建RedisConnectionFactory对象

@Configuration
public class RedisConfig {

    private RedisConnectionFactory connectionFactory = null;

    @Bean(name = "RedisConnectionFactory")
    public RedisConnectionFactory initRedisConnectionFactory() {

        if (this.connectionFactory != null) {
            return this.connectionFactory;
        }
        JedisPoolConfig poolConfig = new JedisPoolConfig();

        // 最大空闲数
        poolConfig.setMaxIdle(30);
        // 最大连接数
        poolConfig.setMaxTotal(50);
        // 最大等待毫秒数
        poolConfig.setMaxWaitMillis(2000);
        // 创建Jedis连接工厂
        JedisConnectionFactory connectionFactory = new JedisConnectionFactory(poolConfig);
        // 获取单机的Redis配置
        RedisStandaloneConfiguration rsCfg = connectionFactory.getStandaloneConfiguration();
        connectionFactory.setHostName("localhost");
        connectionFactory.setPort(6379);
        // connectionFactory.setPassword(password);

        this.connectionFactory = connectionFactory;
        return connectionFactory;

    }
}


这里通过一个连接池的配置创建了一个RedisConnectionFactory,通过它就能创建RedisConnection接口对象了。但是我们在使用一条连接时,需要先从RedisConnectionFactory工厂获取,然后在使用完成还要关闭它,Spring 为了进一步简化开发,提供了RedisTemplate。
⦁    RedisTemplate
RedisTemplate是一个强大的类,首先它会自动从RedisConnectionFactory工厂中获取连接,然后执行对应的Redis命令,在最后还会关闭Redis的连接。这些在RedisTemplate中都被封装了,所以开发者并不需要开发者关注Redis连接的闭合问题。
在上面的配置类中添加如下代码清单。
@Bean(name = "redisTemplate")
    public RedisTemplate<Object, Object> initRedisTemplate() {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(initRedisConnectionFactory());
        return redisTemplate;
    }
⦁    测试RedisTemplate
public class Main {
    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(RedisConfig.class);
        RedisTemplate redisTemplate = ctx.getBean(RedisTemplate.class);
        // 拿到redisTemplate 之后就可以操作redis了
        redisTemplate.opsForValue().set("key1", "value1");

        redisTemplate.opsForHash().put("hash", "fidld", "hvalue");
        
    }
}  

⦁    使用Redis命令查询键信息
 
⦁    序列化器和反序列化器
通过上面步骤可以看到,Redis存入的并不是”key1”这样的字符串,这是怎么回事呢?
首先需要清楚,Redis是一种基于字符串存储的NOSQL,而Java是基于对象的语言,对象是无法存储到Redis中的,不过Java提供了序列化机制,只需要实现了java.io.Serializable接口,就代表这个对象能够进行序列化,通过将类对象进行序列化就能够得到二进制字符串,这样Redis就可以将这些对象以字符串进行存储。Java也可以将那些二进制字符串通过反序列化转为对象,通过这个原理,Spring 提供了序列化器的机制,并且实现了几个序列化器。
对于序列化器,Spring提供了RedisSerializer接口,它有两个方法:serialize,它能把那些可以序列化的对象转换为二进制字符串。 deserialize,它能通过反序列化把二进制字符串转换为Java对象。
我们主要讨论的是StringRedisSerializer和JdkSerializationRedisSerializer,其中JdkSerializationRedisSerializer是RedisTemplate默认的序列化器。所以看到了上面的结果。

 
RedisTemplate提供了如下几个可以配置的属性

属性    描述    备注
defaultSerializer    默认序列化器    如果没设置,则使用JdkSerializationRedisSerializer
keySerializer    Redis键序列化器    如果没设置,则使用默认序列化器
valueSerializer    Redis值序列化器    如果没设置,则使用默认序列化器
hashKeySerializer    散列结构field序列化器    如果没设置,则使用默认序列化器
hashValueSerializer    Redis散列结构value序列化器    如果没设置,则使用默认序列化器
stringSerializer    字符串序列化器     RedisTemplate自动赋值为StringRedisSerializer对象

   通过上述讲解我们可以看到,在上面的例子中,我们什么都没设置,因此默认使用JdkSerializationRedisSerializer对对象进行序列化和反序列化。所以我们得到的是复杂的字符串,为了方便我们查询Redis数据,我们希望将Redis的键以普通字符串保存。
⦁    使用字符串序列化器

    @Bean(name = "redisTemplate")
    public RedisTemplate<Object, Object> initRedisTemplate() {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(initRedisConnectionFactory());
     

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值