redis简单使用与安装

redis

redis 是什么

Redis 是一个开源的,使用 C 语言编写的,支持网络交互的,内存中的Key-Value 数据结构存储系统,支持多种语言,它可以用作数据库、缓存和消息中间件。

一、存储系统特性

  1. 内存存储与持久化

    • Redis 主要将数据存储在内存中,这使得它能够实现极高的读写速度。在内存中进行数据操作可以极大地减少访问延迟,适用于对响应时间要求苛刻的场景。例如,在高并发的 Web 应用中,Redis 可以快速响应频繁访问的数据请求,提升用户体验。

    • 同时,Redis 支持数据的持久化,能够将内存中的数据保存到磁盘中。这样,在服务器重启时可以再次加载数据进行使用,确保数据不会因为服务器故障而丢失。持久化方式包括 RDB(快照)和 AOF(只追加文件)两种,用户可以根据实际需求选择合适的方式。

  2. 高性能读写

    • Redis 的性能极高,读的速度可达 110000 次 / 秒,写的速度可达 81000 次 / 秒。这种卓越的性能使其在处理大量并发请求时表现出色。无论是作为数据库直接提供数据服务,还是作为缓存层加速数据访问,Redis 都能快速响应请求,提高系统的整体性能。

    • 例如,在实时数据分析场景中,Redis 可以快速存储和检索大量的实时数据,为数据分析提供高效的数据支持。

二、数据结构丰富

  1. 多种数据结构支持

    • Redis 提供了丰富的数据结构,包括 list(列表)、set(集合)、zset(有序集合)、hash(哈希表)等。这些数据结构为开发者提供了灵活的数据存储和操作方式。

    • 例如,使用 list 可以实现消息队列,生产者将消息推入列表一端,消费者从另一端取出消息进行处理;使用 set 可以进行去重操作,快速判断一个元素是否存在于集合中;使用 zset 可以实现排行榜功能,根据元素的分值进行排序。

  2. 灵活的数据操作

    • 不同的数据结构支持不同的操作方法,Redis 提供了丰富的命令来操作这些数据结构。开发者可以根据具体需求选择合适的数据结构和操作命令,实现高效的数据管理。

    • 比如,对 hash 数据结构可以进行字段的添加、修改和删除操作,方便存储和管理复杂的结构化数据。

三、原子性操作与分布式扩展

  1. 原子性操作

    • Redis 的所有操作都是原子性的,这意味着一个操作要么完全执行成功,要么完全不执行,不会出现部分执行的情况。这种原子性保证了数据的一致性和完整性。

    • 同时,Redis 还支持对几个操作合并后的原子性执行,例如使用事务(MULTI/EXEC 命令)可以将多个操作打包成一个原子操作,确保这些操作要么全部成功执行,要么全部不执行。这在需要保证多个操作的一致性的场景中非常有用,比如在金融交易系统中。

  2. 分布式扩展

    • Redis 具有极高的分布式集群化扩展性,支持 master-slave(主从)模式。在主从模式下,可以将数据复制到多个从节点,实现数据的冗余备份和读操作的负载均衡。主节点负责写操作,从节点负责读操作,提高了系统的整体性能和可用性。

    • 此外,Redis 还可以通过分片(sharding)技术将数据分布到多个节点上,进一步提高系统的存储容量和处理能力。这种分布式扩展能力使得 Redis 能够适应大规模数据存储和高并发访问的需求。

四、应用场景广泛

  1. 数据库

    • Redis 可以用作数据库,直接存储和管理数据。由于其高性能和丰富的数据结构,适用于一些对性能要求高、数据规模相对较小的场景,如缓存数据、会话管理、实时数据存储等。

    • 例如,在社交网络应用中,可以使用 Redis 存储用户的在线状态、好友列表等数据。

  2. 缓存

    • 作为缓存是 Redis 最常见的应用场景之一。将经常访问的数据存储在 Redis 中,可以大大减少对后端数据库的访问压力,提高系统的响应速度。当数据发生变化时,可以同时更新数据库和 Redis 缓存,确保数据的一致性。

    • 比如,在电商平台中,商品的热门信息可以缓存到 Redis 中,提高页面加载速度。

  3. 消息中间件

    • 利用 Redis 的发布 / 订阅功能可以实现消息中间件的作用。生产者将消息发布到特定的频道,消费者订阅这些频道,接收并处理消息。这种方式可以实现实时的消息传递,适用于实时通知、日志处理等场景。

    • 例如,在分布式系统中,可以使用 Redis 实现事件通知机制,当一个节点发生特定事件时,将消息发布到 Redis 频道,其他节点订阅该频道并进行相应的处理。

简单来说:

1.Redis 将数据存储在内存中,也支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。

2.性能极高 , Redis 能读的速度是 110000 次/s,写的速度是 81000 次/s 。

3.Redis 供 list,set,zset,hash 等数据结构的存储。

4.原子 – Redis 的所有操作都是原子性的,同时 Redis 还支持对几个操作全并后的原子性执行。

5.Redis 分布式集群化扩展性极,高即 master-slave(主-从)模式。

为什么使用 redis

在当今 web3.0 时代,使用 Redis 有以下重要原因:

一、解决传统关系型数据库性能问题

  1. 应对大量访问压力

    • 随着互联网的发展,Web 应用面临着越来越多的用户访问和数据处理需求。传统的关系型数据库在大量访问压力下容易出现性能问题,如连接数量限制和 IO 瓶颈。Redis 作为一种高性能的内存数据库,可以有效地缓解这些问题。

    • 例如,在高并发的电商平台中,大量用户同时进行商品浏览和购买操作,对数据库的访问压力巨大。使用 Redis 缓存热门商品信息和用户购物车数据,可以减少对关系型数据库的访问次数,提高系统的响应速度。

  2. 解决连接数量问题

    • 传统关系型数据库通常对连接数量有一定的限制,当连接数量过多时,会导致数据库性能下降甚至崩溃。Redis 可以作为一个独立的缓存层,接收来自应用程序的大量连接,减轻关系型数据库的连接压力。

    • 比如,在社交网络应用中,用户频繁地查看好友动态和消息通知。使用 Redis 缓存这些数据,可以减少对关系型数据库的连接需求,提高系统的稳定性。

  3. 突破 IO 瓶颈

    • 关系型数据库的 IO 操作通常比较耗时,尤其是在大量数据读写的情况下。Redis 将数据存储在内存中,读写速度极快,可以大大减少 IO 操作的时间,提高系统的性能。

    • 例如,在数据分析场景中,需要对大量数据进行实时查询和处理。使用 Redis 作为缓存,可以快速获取频繁访问的数据,减少对关系型数据库的 IO 压力,提高数据分析的效率。

二、数据缓存与存储优化

  1. 数据缓存

    • Redis 可以对部分数据进行缓存,将经常访问的数据存储在内存中,以便快速访问。当数据发生变化时,可以同时更新数据库和 Redis 缓存,确保数据的一致性。

    • 比如,在新闻网站中,热门新闻文章的访问频率很高。将这些文章的内容缓存到 Redis 中,可以大大提高页面加载速度,减少对数据库的访问压力。

  2. 直接存储某些数据

    • 对于一些特定的数据,如会话信息、配置参数等,可以直接存储在 Redis 中。这些数据通常不需要复杂的关系型数据库结构,而且对读写速度要求较高。

    • 例如,在在线游戏中,玩家的会话状态可以存储在 Redis 中,方便快速获取和更新玩家的游戏状态。

三、与关系型数据库相互依赖

  1. 不能完全替代关系型数据库

    • 虽然 Redis 具有很多优点,但它不能完全替代关系型数据库。关系型数据库在数据的完整性、一致性和复杂查询方面具有优势,适合存储结构化的数据和进行复杂的事务处理。

    • 例如,在企业级应用中,订单数据、用户信息等需要保证数据的准确性和完整性,适合存储在关系型数据库中。而 Redis 可以作为缓存层,提高这些数据的访问速度。

  2. 相互补充

    • Redis 和关系型数据库可以相互依赖,共同构建一个高效的应用系统。Redis 可以缓存关系型数据库中的数据,减少数据库的访问压力;关系型数据库可以作为数据的持久存储层,保证数据的安全性和可靠性。

    • 比如,在电商平台中,商品信息可以存储在关系型数据库中,同时将热门商品的信息缓存到 Redis 中。当用户查询商品时,先从 Redis 中获取数据,如果没有找到,则从关系型数据库中查询,并将结果缓存到 Redis 中,以便下次快速访问。

Linux 下使用 Docker 安装 redis

从官网下载:

官方地址:Redis configuration | Docs

创建 redis 配置文件: mkdir -p /opt/redis/conf

数据映射挂载卷: mkdir -p /opt/redis/data

复制 redis.conf 文件到/opt/redis/conf 目录下(注意,此文件已设置密码为 123)

允许远程连接访问

拉取镜像

docker pull redis:6.0

安装命令

docker run -d -p 6379:6379 --name redis --restart=always --privileged=true -v /opt/redis/conf/redis.conf:/etc/redis/redis.conf -v /opt/redis/data:/data redis:6.0

redis 数据结构

5 种基本常用结构

一、String(字符串)

  1. 用途:

    • 可以存储字符串、整数或浮点数等简单数据类型。

    • 常用于缓存单个值,如用户信息、计数器等。

  2. 特点:

    • 是二进制安全的,可以存储任何类型的数据。

    • 支持对字符串进行追加、截取、自增自减等操作。

二、Hash(哈希)

  1. 用途:

    • 存储对象信息,例如用户的属性(姓名、年龄、性别等)。

    • 适合存储需要以字段形式访问的数据。

  2. 特点:

    • 类似于 Java 中的 HashMap,由键值对组成。

    • 可以对单个字段进行操作,如增加、删除或修改特定字段的值。

三、List(列表)

  1. 用途:

    • 实现消息队列、栈等数据结构。

    • 可以存储有序的元素集合。

  2. 特点:

    • 可以从两端进行插入和弹出操作。

    • 支持按照索引访问元素。

四、Set(集合)

  1. 用途:

    • 存储不重复的元素集合,例如用户的标签、兴趣爱好等。

    • 可用于实现交集、并集、差集等集合运算。

  2. 特点:

    • 元素无序且唯一。

    • 可以快速判断一个元素是否存在于集合中。

五、Zset(Sorted Set:有序集合)

  1. 用途:

    • 实现排行榜、优先级队列等功能。

    • 存储带有分数的元素集合,并根据分数进行排序。

  2. 特点:

    • 元素具有唯一性,但每个元素都关联一个分数。

    • 可以按照分数范围获取元素。

String(字符串) 

一、基本概念

String 类型是 Redis 最基本的数据类型之一,它通过一个 key 对应一个 value 的方式进行存储。这种简单而直接的存储方式使得它在很多场景下都非常实用。

二、二进制安全的特性

Redis 的 String 类型具有二进制安全的特点,这意味着它可以存储任何类型的数据,包括但不限于文本、图片(以二进制形式存储)、序列化的对象等。这种特性使得 Redis 在存储各种复杂数据时具有很大的灵活性。例如,可以将序列化后的 Java 对象存储在 Redis 中,实现对象的缓存和快速访问。

三、存储容量

String 类型的值最大能存储 512MB。这个容量对于大多数应用场景来说已经足够大,可以满足存储大量文本、图片或其他数据的需求。

四、单值缓存的应用场景

  1. 设置和获取值

    • 使用 set key value 命令可以设置一个键值对,将特定的 value 存储在指定的 key 下。
    • get key 命令用于获取指定 key 对应的 value。
    • del key 命令可以删除指定的 key 及其对应的值。
    • keys * 命令可以列出所有的 key。
  2. 存储 JSON 字符串

    • 单值缓存的值可以是 JSON 字符串。这在存储复杂数据结构时非常有用,例如存储一个包含多个字段的对象的 JSON 表示形式。通过将对象序列化为 JSON 字符串并存储在 Redis 中,可以方便地进行缓存和快速访问。

五、计数器的应用场景

  1. 设置初始值

    • set news_views:1 0 可以设置文章的访问量初始值为 0。这里的 news_views:1 是一个特定的 key,表示文章 1 的访问量。
  2. 增加和减少计数器

    • incr news_views:1 用于将文章的访问量加 1。每次执行这个命令,Redis 会自动将指定 key 的值增加 1。
    • decr news_views:1 则将文章的访问量减 1。
  3. 获取计数器的值

    • get news_views:1 可以获取文章的当前访问量值。

通过使用 Redis 的 String 类型,可以方便地实现单值缓存和计数器等功能,为应用程序提供高效的数据存储和访问方式。

Hash(哈希)

一、数据结构特点

Redis 的 Hash 类型是一个 string 类型的 field(字段)和 value 的映射表。它非常适合用于存储对象,因为可以将对象的各个属性作为 field,对应的值作为 value 进行存储。例如,存储用户信息时,可以将用户的 ID、姓名、年龄等属性分别作为 field,对应的具体值作为 value 存储在一个 Hash 中。

二、常用命令及功能

  1. 存储键值对

    • hset key field value 命令用于在指定的哈希表(key)中存储一个 field 和 value 的键值对。如果哈希表不存在,会自动创建。这个命令可以方便地向 Hash 中添加或更新一个属性的值。

  2. 获取键值

    • hget key field 命令用于获取指定哈希表(key)中对应 field 的键值。通过这个命令,可以快速获取对象的特定属性值。

  3. 删除键值对

    • hdel key field 命令用于删除指定哈希表(key)中的一个 field 键值对。如果要删除多个 field,可以多次执行这个命令。

  4. 获取 field 数量

    • hlen key 命令用于返回指定哈希表(key)中的 field 的数量。这个命令可以快速了解 Hash 中存储了多少个属性。

  5. 获取所有键值对

    • hgetall key 命令用于返回指定哈希表(key)中所有的键值对。这个命令会返回一个包含所有 field 和 value 的列表,方便对整个对象进行遍历和处理。

三、应用场景举例

  1. 存储用户购物车信息:可以将用户的购物车作为一个 Hash 存储,每个商品的 ID 作为 field,商品的数量、价格等信息作为 value。这样可以方便地对购物车进行添加、删除商品以及查询购物车中商品的信息等操作。

  2. 存储系统配置信息:将将系统的各种配置参数作为 field,对应的配置值作为 value 存储在一个 Hash 中。这样可以方便地进行配置的读取和修改,并且可以对不同的配置进行分组管理。

总之,Redis 的 Hash 类型提供了一种方便、高效的方式来存储和操作对象类型的数据,在很多实际应用场景中都有广泛的应用。

List(列表)

一、数据结构特点

Redis 列表是简单的字符串列表,按照插入顺序进行排序。这意味着可以在列表的头部(左边)或尾部(右边)插入元素,并且元素在列表中的位置是固定的,按照插入的先后顺序排列。

二、常用命令及功能

  1. 插入元素

    • lpush key value[value...]:将一个或多个值插入到指定 key 列表的表头(最左边)。例如,lpush mylist value1 value2 会将 value1value2 依次插入到名为 mylist 的列表的头部。

    • rpush key value[value...]:将一个或多个值插入到指定 key 列表的表尾(最右边)。例如,rpush mylist value3 value4 会将 value3value4 依次插入到名为 mylist 的列表的尾部。

  2. 移除并返回元素

    • lpop key:移除并返回指定 key 列表的头元素。执行这个命令后,列表的第一个元素将被移除,并返回该元素的值。

    • rpop key:移除并返回指定 key 列表的尾元素。与 lpop 类似,这个命令会移除并返回列表的最后一个元素。

  3. 获取指定区间内的元素

    • lrange key start stop:返回列表 key 中指定区间内的元素,区间以偏移量 startstop 确定。例如,lrange mylist 0 -1 会返回 mylist 列表中的所有元素。

三、常见用法

  1. Stack(栈)

    • 实现方式为 LPUSH + LPOP,即先使用 lpush 将元素依次压入栈中,然后使用 lpop 从栈顶弹出元素。这种方式遵循 “后进先出”(FILO)的原则,类似于数据结构中的栈。

  2. Queue(队列)

    • 实现方式为 LPUSH + RPOP,即先使用 lpush 将元素依次插入到队列的尾部,然后使用 rpop 从队列的尾部弹出元素。这种方式遵循 “先进先出”(FIFO)的原则,类似于数据结构中的队列。

四、应用场景举例

  1. 消息队列:可以使用 Redis 列表作为消息队列,生产者使用 lpush 将消息插入到列表中,消费者使用 rpop 从列表中获取消息进行处理。

  2. 任务队列:将任务存储在列表中,工作进程使用 lpop 从列表中获取任务进行处理,实现任务的分发和执行。

  3. 历史记录:可以将用户的操作历史记录存储在列表中,方便后续查询和分析。

总之,Redis 的列表类型提供了一种灵活、高效的方式来处理有序的字符串集合,可以应用于多种场景。

 

Set(集合)

一、数据结构特点

Redis 的 Set 是一种无序集合,这意味着集合中的元素没有特定的顺序。Set 中的元素是唯一的,不允许重复。

二、常用命令及功能

  1. 添加元素

    • sadd key member[member...]:往集合 key 中存入一个或多个元素。如果元素已经存在于集合中,则会被忽略。如果集合 key 不存在,则会新建一个集合。例如,sadd myset element1 element2 会将 element1element2 添加到名为 myset 的集合中。

  2. 删除元素

    • srem key member[member...]:从集合 key 中删除一个或多个元素。例如,srem myset element1 会从 myset 集合中删除 element1

  3. 获取所有元素

    • smembers key:获取集合 key 中所有的元素。这个命令会返回一个包含集合中所有元素的列表。例如,执行 smembers myset 会返回 myset 集合中的所有元素。

  4. 获取元素个数

    • scard key:获取集合 key 的元素个数。这个命令会返回一个整数,表示集合中元素的数量。例如,执行 scard myset 会返回 myset 集合中元素的个数。

三、应用场景举例

  1. 标签系统:可以使用 Set 来存储用户的标签。每个用户的标签集合是一个 Set,通过 sadd 命令添加标签,srem 命令删除标签,smembers 命令获取用户的所有标签。

  2. 共同关注:在社交网络中,可以使用 Set 来存储用户的关注列表。通过对两个用户的关注集合进行交集运算,可以得到他们的共同关注用户。

  3. 去重功能:Set 的唯一性特点可以用于数据去重。例如,在处理日志数据时,可以将日志中的 IP 地址存储在 Set 中,以去除重复的 IP 地址。

总之,Redis 的 Set 类型提供了一种高效的方式来存储和操作无序的唯一元素集合,可以应用于多种场景。

 

zset(sorted set:有序集合)

一、数据结构特点

Redis 的有序集合(Zset)与普通集合类似,也是不允许重复的成员,但它是有序的。每个元素都会关联一个 double 类型的分数,Redis 通过这个分数来为集合中的成员进行从小到大的排序。

二、关键特性

  1. 成员唯一性:Zset 的成员是唯一的,这意味着不能有重复的元素存在于同一个有序集合中。

  2. 分数可重复:虽然成员是唯一的,但分数可以重复。这使得可以有多个元素具有相同的分数,它们在排序中的位置将根据插入的先后顺序或者其他规则来确定。

三、常用命令及功能

  1. 添加带分值元素

    • zadd key score member[[score member]..]:往有序集合 key 中加入带分值的元素。可以同时添加一个或多个元素,每个元素由分数和成员组成。例如,zadd myzset 10 element1 20 element2 会将 element1 以分数 10 和 element2 以分数 20 添加到名为 myzset 的有序集合中。

  2. 删除元素

    • zrem key member[member...]:从有序集合 key 中删除一个或多个元素。例如,zrem myzset element1 会从 myzset 有序集合中删除 element1

  3. 获取元素分值

    • zscore key member:返回有序集合 key 中元素 member 的分值。例如,执行 zscore myzset element1 会返回 element1myzset 有序集合中的分数。

  4. 获取元素个数

    • zcard key:返回有序集合 key 中元素的个数。例如,执行 zcard myzset 会返回 myzset 有序集合中的元素数量。

四、应用场景举例

  1. 排行榜:可以使用 Zset 来实现各种排行榜,例如游戏得分排行榜、用户活跃度排行榜等。将用户的 ID 或其他标识作为成员,用户的得分或活跃度作为分数,通过 zadd 命令添加元素,然后可以使用 zrevrange 等命令获取排行榜的前几名。

  2. 时间线:在社交网络或新闻平台中,可以使用 Zset 来存储用户的动态或新闻文章,以发布时间作为分数,动态或文章的 ID 作为成员。这样可以方便地按照时间顺序获取最新的动态或文章。

  3. 优先级队列:Zset 可以用作优先级队列,将任务的优先级作为分数,任务的标识作为成员。高优先级的任务会排在前面,可以通过 zpopminzpopmax 命令获取并删除优先级最高的任务。

 

设置失效时间

一、需求背景

在很多应用场景中,我们并不希望 Redis 的键一直存在。比如缓存数据,为了提高性能而将一些数据存储在 Redis 中,但这些数据可能随着时间的推移变得不再有效,需要被自动清理以释放内存空间。又如验证码,通常只在一定时间内有效,过期后就应该被自动删除。Redis 提供的设置键过期时间的命令正好满足了这些需求。

二、设置过期时间的方式

  1. 设置值时直接设置有效时间

    • 使用 set name jim EX 30 命令可以在设置键值对的同时设置失效时间为 30 秒。其中 EX 表示以秒为单位设置过期时间。同样,PX 表示以毫秒为单位设置过期时间,且 EXPX 不区分大小写。例如 set name jim PX 30000 表示设置键 name 的值为 jim,并以毫秒为单位设置过期时间为 30000 毫秒。

  2. 设置值后设置有效时间

    • expire key 时间(秒):在设置键值对之后,可以使用 expire 命令为键设置过期时间,单位为秒。例如 expire name 60 表示为键 name 设置过期时间为 60 秒。

    • pexpire key 时间(毫秒):与 expire 类似,pexpire 以毫秒为单位设置键的过期时间。例如 pexpire name 60000 表示为键 name 设置过期时间为 60000 毫秒。

三、查看剩余时间的命令

  1. ttl key:查看键的剩余时间,单位为秒。执行这个命令会返回键的剩余生存时间,如果键不存在或者已经过期,会返回 -2;如果键没有设置过期时间,会返回 -1

  2. pttl key:查看键的剩余时间,单位为毫秒。与 ttl 类似,但返回的时间单位是毫秒。

四、应用场景举例

  1. 缓存管理:在缓存系统中,可以为缓存数据设置合理的过期时间,确保缓存数据在一定时间后自动失效,避免缓存数据占用过多内存。例如,对于经常变化的数据,可以设置较短的过期时间,以保证缓存中的数据始终是最新的。

  2. 验证码验证:在用户注册、登录等场景中,生成的验证码通常只在一定时间内有效。可以将验证码存储在 Redis 中,并设置适当的过期时间,过期后自动删除,确保验证码的安全性和有效性。

springBoot 集成使用 redis

一、概述

在 Spring Boot 应用中,集成 Redis 可以极大地提高数据的存储和访问效率。Jedis 是 Redis 官方推出的 Java 客户端,但直接使用 Jedis 可能会比较繁琐。而 Spring-data-redis 作为 Spring 大家族的一部分,提供了更简单、高效的方式来在 Spring 应用中访问 Redis 服务。它对底层的 Redis 开发包(如 Jedis、JRedis 和 RJC)进行了高度封装,通过 RedisTemplate 提供了丰富的 Redis 操作接口。

二、Spring-data-redis 针对 Jedis 的功能

  1. 连接池自动管理和高度封装的 RedisTemplate

    • Spring-data-redis 自动管理 Redis 连接池,避免了手动管理连接的复杂性。

    • 提供了高度封装的 “RedisTemplate” 类,简化了 Redis 的操作。通过这个模板类,可以方便地进行各种数据类型的存储和读取操作。

  2. 归类封装的操作接口

    • 将 Jedis 客户端中的大量 API 进行了归类封装,将同一类型的操作封装为不同的 operation 接口。

    • ValueOperations:用于简单的键值对(K-V)操作,如设置和获取单个值。

    • SetOperations:用于 set 类型数据的操作,如添加、删除元素,判断元素是否存在等。

    • ZSetOperations:用于 zset 类型数据的操作,如添加元素并设置分数,获取范围内的元素等。

    • HashOperations:针对 map 类型的数据操作,如设置和获取哈希表中的字段值。

    • ListOperations:针对 list 类型的数据操作,如在列表的头部或尾部添加元素,获取列表中的元素范围等。

  3. 事务操作封装

    • Spring-data-redis 将事务操作进行了封装,由容器控制事务的开始、提交和回滚。可以方便地在 Spring 应用中使用事务来保证数据的一致性。

  4. 序列化 / 反序列化策略

    • 针对数据的 “序列化 / 反序列化”,提供了多种可选择的策略(RedisSerializer)。

    • JdkSerializationRedisSerializer:适用于 POJO 对象的存取场景,使用 JDK 本身的序列化机制。但这种方式可能会导致序列化后的字节数组较大,并且在不同 JDK 版本之间可能存在兼容性问题。

    • StringRedisSerializer:在 Key 或者 value 为字符串的场景下非常适用。它根据指定的 charset 对数据的字节序列进行编码成 string,是 “new String (bytes, charset)” 和 “string.getBytes (charset)” 的直接封装。是最轻量级和高效的策略。

    • JacksonJsonRedisSerializer:利用 Jackson-json 工具提供了 JavaBean 与 JSON 之间的转换能力。可以将 POJO 实例序列化成 JSON 格式存储在 Redis 中,也可以将 JSON 格式的数据转换成 POJO 实例。这种方式在需要存储复杂对象并且希望以 JSON 格式进行存储和传输时非常方便。

三、使用步骤

  1. 在项目中添加 Spring-data-redis 和 Jedis 的依赖。

  2. 配置 Redis 连接信息,如主机地址、端口号、密码等。

  3. 在 Spring Boot 应用中注入 RedisTemplate 或相应的 operation 接口,进行 Redis 操作。

    搭建:

1.添加 redis 依赖

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

2.配置连接 redis(.yml)

spring:
​
    redis:
​
    host: 192.168.31.100
​
    port: 6379
​
    password: 111
​
    database: 0
​
    pool:
​
    max-active: 8 *# 连接池最大连接数(使用负值表示没有限制)*max-wait: -1ms *# 连接池最大阻塞等待时间(使用负值表示没有限制)*
​
    max-idle: 8 *# 连接池中的最大空闲连接*
​
    min-idle: 0 *# 连接池中的最小空闲连接*
​
    timeout: 5000ms *# 连接超时时间(毫秒)*

3.注入 RedisTemplate

@Autowired
​
RedisTemplate redisTemplate;

4.测试

System.out.println(redisTemplate.hasKey("e"));//判断键是否在
        System.out.println(redisTemplate.delete("e"));//删除指定的键
        System.out.println(redisTemplate.hasKey("e"));//判断键是否在
​
​
        ValueOperations valueOperations = redisTemplate.opsForValue();
                        valueOperations.set("name","jim");
                        valueOperations.set("count",1);
                        valueOperations.increment("count");
                        valueOperations.increment("count");
                        valueOperations.set("yzm","12345",10, TimeUnit.SECONDS);
        System.out.println(redisTemplate.hasKey("name"));
​
        HashOperations hashOperations = redisTemplate.opsForHash();
        hashOperations.put("news","newsdz1",20);
​
        ListOperations listOperations = redisTemplate.opsForList();
        
序列化键值
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<User>(User.class));       

需要被 Redis 缓存的类,必须实现序列化接口

详细说明:

  1. 判断键是否存在和删除键

    • System.out.println(redisTemplate.hasKey("e"));:判断键 "e" 是否存在于 Redis 中。

    • System.out.println(redisTemplate.delete("e"));:删除键 "e",并返回是否删除成功的布尔值。

    • System.out.println(redisTemplate.hasKey("e"));:再次判断键 "e" 是否存在,验证删除操作是否成功。

  2. 设置键值对和自增操作

    • ValueOperations valueOperations = redisTemplate.opsForValue();:获取用于操作简单键值对的 ValueOperations 对象。

    • valueOperations.set("name","jim");:设置键为 "name",值为 "jim" 的键值对。

    • valueOperations.set("count",1);:设置键为 "count",值为 1 的键值对。

    • valueOperations.increment("count");:将键 "count" 的值自增 1

    • valueOperations.increment("count");:再次将键 "count" 的值自增 1

    • valueOperations.set("yzm","12345",10, TimeUnit.SECONDS);:设置键为 "yzm",值为 "12345",并设置过期时间为 10 秒。

  3. 操作哈希类型数据

    • HashOperations hashOperations = redisTemplate.opsForHash();:获取用于操作哈希类型数据的 HashOperations 对象。

    • hashOperations.put("news","newsdz1",20);:在键为 "news" 的哈希中,设置字段为 "newsdz1",值为 20 的键值对。

  4. 操作列表类型数据

    • ListOperations listOperations = redisTemplate.opsForList();:获取用于操作列表类型数据的 ListOperations 对象。

  5. 序列化键值

    • redisTemplate.setKeySerializer(new StringRedisSerializer());:设置键的序列化器为 StringRedisSerializer,确保键以字符串形式进行序列化。

    • redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<User>(User.class));:设置值的序列化器为 Jackson2JsonRedisSerializer,用于将 Java 对象序列化为 JSON 格式存储在 Redis 中。这里指定了要序列化的对象类型为 User 类。

注意事项

  1. 需要被 Redis 缓存的类必须实现序列化接口,这是因为 Redis 在存储对象时需要将对象序列化为字节数组进行存储。如果不实现序列化接口,在存储和读取对象时会抛出异常。

  2. 在设置键值对时,如果没有指定过期时间,那么键值对将一直存在于 Redis 中,直到被手动删除或 Redis 内存不足时被清理。

  3. 在使用不同的操作接口(如 ValueOperationsHashOperationsListOperations 等)时,需要根据具体的业务需求选择合适的接口进行操作,以提高代码的可读性和可维护性。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值