一、什么是Redis
Redis(Remote Dictionary Server,即远程字典服务)是一个使用ANSI C语言编写的开源、包含多种数据结构、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它通常被用作内存数据结构服务器,因为它可以保持数据在断电或重启后不会丢失。Redis支持存储的键类型包括字符串、列表、集合、有序集合和哈希表等。此外,Redis还具有单进程单线程模型、丰富的数据类型和持久化选项、高并发读写、分布式配置等亮点。
二、Redis的优点
- 性能极高:Redis能支持超过10万次/秒的读写频率,这使其成为最快的NoSQL数据库之一。
- 数据类型丰富:Redis支持多种数据类型,使得它可以适应不同的应用场景。
- 原子性操作:Redis的所有操作都是原子性的,这意味着它们要么全部执行,要么全部不执行,不会出现部分执行的情况。
- 丰富的特性:Redis支持发布/订阅、通知、键过期等等特性,使得其功能更加丰富。
- 数据持久化:虽然Redis主要存储在内存中,但它也支持将数据周期性地写入磁盘,以及从磁盘加载数据,从而实现数据的持久化。
三、Redis的使用场景
- 缓存:Redis可以用作缓存层,存储经常访问的数据,以减轻数据库的访问压力。
- 排行榜:利用Redis的Sorted Set数据类型,可以实现排行榜功能。
- 消息系统:Redis的Pub/Sub功能可以用于实现实时消息系统。
- 计数器:由于Redis支持原子性操作,因此它非常适合用于实现计数器功能。
四、Redis存在的问题
当向Redis写入数据时,会对key跟value进行序列化,默认使用的序列化器为JDK序列化器,当从Redis 读取数据时,会对key跟value进行反序列化。为什么要这么做?
可以保障保障安全,由于当前配置类不是必须的,因为 Spring Boot 框架会自动装配 RedisTemplate 对象,但是默认的key序列化器为JdkSerializationRedisSerializer,导致我们存到Redis中后的数据和原始数据有差别,故设置为StringRedisSerializer序列化器会将key和value都进行序列化操作。但是这样会使得内存空间占用的更多。所以我们在使用redis时,多数可以只对value进行操作,一般情况不需要对key进行序列化操作。
四、自定义序列化器
我们可以通过自定序列化器解决上面的问题,自定义序列化器和默认序列化器的主要区别在于它们所能处理的类型和提供的控制级别。默认序列化器是Java自带的序列化机制,它能够处理大多数类型的对象,包括基本数据类型、数组、集合等。默认序列化器将对象的状态信息转换为字节流,并保存在磁盘或通过网络传输,然后再通过反序列化将字节流恢复为对象。
然而,默认序列化器在序列化过程中存在一些局限性。例如,它无法处理自定义类型的对象,无法序列化对象的成员变量等。因此,我们需要自定义序列化器来解决这些问题。
自定义序列化器可以提供更详细和灵活的控制,比如只序列化对象的某个属性,或者对序列化的过程进行更详细的控制。自定义序列化器可以通过重写writeObject()
和readObject()
方法来实现对序列化的控制。在writeObject()
方法中,我们可以将需要序列化的属性写入到字节流中;在readObject()
方法中,我们可以从字节流中读取数据并设置给对象的属性。这样,我们就可以只序列化对象的某个属性,而不是整个对象。
另外,自定义序列化器还可以通过重写serialVersionUID
字段来确保反序列化后的对象与序列化前的对象具有相同的版本号,以避免版本不一致的问题。
总之,自定义序列化器可以提供更详细和灵活的控制,而默认序列化器则能够处理大多数类型的对象。在实际应用中,我们可以根据需要选择使用哪种序列化器。