⦁ 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());