当前位置: 首页 > article >正文

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 等)时,需要根据具体的业务需求选择合适的接口进行操作,以提高代码的可读性和可维护性。

 


http://www.kler.cn/a/307308.html

相关文章:

  • 力扣-Mysql-3308- 寻找表现最佳的司机(中等)
  • 前端系统设计面试题(二)Javascript\Vue
  • React中 修改 html字符串 中某些元素的属性
  • 项目风险管理的3大要素
  • Android Studio更新成2024.1.2版本后旧项目Gradle配置问题
  • 【大数据学习 | flume】flume的概述与组件的介绍
  • Java并发:互斥锁,读写锁,Condition,StampedLock
  • shopify主题开发之template模板解析
  • C++学习笔记----7、使用类与对象获得高性能(一)---- 书写类(3)
  • 蓝桥杯-基于STM32G432RBT6的LCD进阶(LCD界面切换以及高亮显示界面)
  • 【AIGC】CFG:基于扩散模型分类器差异引导
  • JavaScript 函数 function
  • 用 nextjs 创建 Node+React Demo
  • WebGL入门(048):OES_draw_buffers_indexed 简介、使用方法、示例代码
  • Python---爬虫
  • Leetcode-轮转数组
  • 复现OpenVLA:开源的视觉-语言-动作模型及原理详解
  • 【Go开发】Go语言结构体,与java类不一样的定义方式
  • 推荐|基于springBoot智能推荐的卫生健康系统设计与实现(源码+论文+数据库)
  • 【附源码】用Python开发一个音乐下载工具,并打包EXE文件,所有音乐都能搜索下载!
  • el-table 的单元格 + 图表 + 排序
  • 动手学深度学习(pytorch土堆)-03常见的Transforms
  • 图论篇--代码随想录算法训练营第五十六天打卡| 108. 冗余连接,109. 冗余连接II
  • 【SQL】百题计划:SQL排序Order by的使用。
  • Flutter Error: Type ‘UnmodifiableUint8ListView‘ not found
  • 刷题DAY36