redis简单使用与安装
redis
redis 是什么
Redis 是一个开源的,使用 C 语言编写的,支持网络交互的,内存中的Key-Value 数据结构存储系统,支持多种语言,它可以用作数据库、缓存和消息中间件。
一、存储系统特性
-
内存存储与持久化
-
Redis 主要将数据存储在内存中,这使得它能够实现极高的读写速度。在内存中进行数据操作可以极大地减少访问延迟,适用于对响应时间要求苛刻的场景。例如,在高并发的 Web 应用中,Redis 可以快速响应频繁访问的数据请求,提升用户体验。
-
同时,Redis 支持数据的持久化,能够将内存中的数据保存到磁盘中。这样,在服务器重启时可以再次加载数据进行使用,确保数据不会因为服务器故障而丢失。持久化方式包括 RDB(快照)和 AOF(只追加文件)两种,用户可以根据实际需求选择合适的方式。
-
-
高性能读写
-
Redis 的性能极高,读的速度可达 110000 次 / 秒,写的速度可达 81000 次 / 秒。这种卓越的性能使其在处理大量并发请求时表现出色。无论是作为数据库直接提供数据服务,还是作为缓存层加速数据访问,Redis 都能快速响应请求,提高系统的整体性能。
-
例如,在实时数据分析场景中,Redis 可以快速存储和检索大量的实时数据,为数据分析提供高效的数据支持。
-
二、数据结构丰富
-
多种数据结构支持
-
Redis 提供了丰富的数据结构,包括 list(列表)、set(集合)、zset(有序集合)、hash(哈希表)等。这些数据结构为开发者提供了灵活的数据存储和操作方式。
-
例如,使用 list 可以实现消息队列,生产者将消息推入列表一端,消费者从另一端取出消息进行处理;使用 set 可以进行去重操作,快速判断一个元素是否存在于集合中;使用 zset 可以实现排行榜功能,根据元素的分值进行排序。
-
-
灵活的数据操作
-
不同的数据结构支持不同的操作方法,Redis 提供了丰富的命令来操作这些数据结构。开发者可以根据具体需求选择合适的数据结构和操作命令,实现高效的数据管理。
-
比如,对 hash 数据结构可以进行字段的添加、修改和删除操作,方便存储和管理复杂的结构化数据。
-
三、原子性操作与分布式扩展
-
原子性操作
-
Redis 的所有操作都是原子性的,这意味着一个操作要么完全执行成功,要么完全不执行,不会出现部分执行的情况。这种原子性保证了数据的一致性和完整性。
-
同时,Redis 还支持对几个操作合并后的原子性执行,例如使用事务(MULTI/EXEC 命令)可以将多个操作打包成一个原子操作,确保这些操作要么全部成功执行,要么全部不执行。这在需要保证多个操作的一致性的场景中非常有用,比如在金融交易系统中。
-
-
分布式扩展
-
Redis 具有极高的分布式集群化扩展性,支持 master-slave(主从)模式。在主从模式下,可以将数据复制到多个从节点,实现数据的冗余备份和读操作的负载均衡。主节点负责写操作,从节点负责读操作,提高了系统的整体性能和可用性。
-
此外,Redis 还可以通过分片(sharding)技术将数据分布到多个节点上,进一步提高系统的存储容量和处理能力。这种分布式扩展能力使得 Redis 能够适应大规模数据存储和高并发访问的需求。
-
四、应用场景广泛
-
数据库
-
Redis 可以用作数据库,直接存储和管理数据。由于其高性能和丰富的数据结构,适用于一些对性能要求高、数据规模相对较小的场景,如缓存数据、会话管理、实时数据存储等。
-
例如,在社交网络应用中,可以使用 Redis 存储用户的在线状态、好友列表等数据。
-
-
缓存
-
作为缓存是 Redis 最常见的应用场景之一。将经常访问的数据存储在 Redis 中,可以大大减少对后端数据库的访问压力,提高系统的响应速度。当数据发生变化时,可以同时更新数据库和 Redis 缓存,确保数据的一致性。
-
比如,在电商平台中,商品的热门信息可以缓存到 Redis 中,提高页面加载速度。
-
-
消息中间件
-
利用 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 有以下重要原因:
一、解决传统关系型数据库性能问题
-
应对大量访问压力
-
随着互联网的发展,Web 应用面临着越来越多的用户访问和数据处理需求。传统的关系型数据库在大量访问压力下容易出现性能问题,如连接数量限制和 IO 瓶颈。Redis 作为一种高性能的内存数据库,可以有效地缓解这些问题。
-
例如,在高并发的电商平台中,大量用户同时进行商品浏览和购买操作,对数据库的访问压力巨大。使用 Redis 缓存热门商品信息和用户购物车数据,可以减少对关系型数据库的访问次数,提高系统的响应速度。
-
-
解决连接数量问题
-
传统关系型数据库通常对连接数量有一定的限制,当连接数量过多时,会导致数据库性能下降甚至崩溃。Redis 可以作为一个独立的缓存层,接收来自应用程序的大量连接,减轻关系型数据库的连接压力。
-
比如,在社交网络应用中,用户频繁地查看好友动态和消息通知。使用 Redis 缓存这些数据,可以减少对关系型数据库的连接需求,提高系统的稳定性。
-
-
突破 IO 瓶颈
-
关系型数据库的 IO 操作通常比较耗时,尤其是在大量数据读写的情况下。Redis 将数据存储在内存中,读写速度极快,可以大大减少 IO 操作的时间,提高系统的性能。
-
例如,在数据分析场景中,需要对大量数据进行实时查询和处理。使用 Redis 作为缓存,可以快速获取频繁访问的数据,减少对关系型数据库的 IO 压力,提高数据分析的效率。
-
二、数据缓存与存储优化
-
数据缓存
-
Redis 可以对部分数据进行缓存,将经常访问的数据存储在内存中,以便快速访问。当数据发生变化时,可以同时更新数据库和 Redis 缓存,确保数据的一致性。
-
比如,在新闻网站中,热门新闻文章的访问频率很高。将这些文章的内容缓存到 Redis 中,可以大大提高页面加载速度,减少对数据库的访问压力。
-
-
直接存储某些数据
-
对于一些特定的数据,如会话信息、配置参数等,可以直接存储在 Redis 中。这些数据通常不需要复杂的关系型数据库结构,而且对读写速度要求较高。
-
例如,在在线游戏中,玩家的会话状态可以存储在 Redis 中,方便快速获取和更新玩家的游戏状态。
-
三、与关系型数据库相互依赖
-
不能完全替代关系型数据库
-
虽然 Redis 具有很多优点,但它不能完全替代关系型数据库。关系型数据库在数据的完整性、一致性和复杂查询方面具有优势,适合存储结构化的数据和进行复杂的事务处理。
-
例如,在企业级应用中,订单数据、用户信息等需要保证数据的准确性和完整性,适合存储在关系型数据库中。而 Redis 可以作为缓存层,提高这些数据的访问速度。
-
-
相互补充
-
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(字符串)
-
用途:
-
可以存储字符串、整数或浮点数等简单数据类型。
-
常用于缓存单个值,如用户信息、计数器等。
-
-
特点:
-
是二进制安全的,可以存储任何类型的数据。
-
支持对字符串进行追加、截取、自增自减等操作。
-
二、Hash(哈希)
-
用途:
-
存储对象信息,例如用户的属性(姓名、年龄、性别等)。
-
适合存储需要以字段形式访问的数据。
-
-
特点:
-
类似于 Java 中的 HashMap,由键值对组成。
-
可以对单个字段进行操作,如增加、删除或修改特定字段的值。
-
三、List(列表)
-
用途:
-
实现消息队列、栈等数据结构。
-
可以存储有序的元素集合。
-
-
特点:
-
可以从两端进行插入和弹出操作。
-
支持按照索引访问元素。
-
四、Set(集合)
-
用途:
-
存储不重复的元素集合,例如用户的标签、兴趣爱好等。
-
可用于实现交集、并集、差集等集合运算。
-
-
特点:
-
元素无序且唯一。
-
可以快速判断一个元素是否存在于集合中。
-
五、Zset(Sorted Set:有序集合)
-
用途:
-
实现排行榜、优先级队列等功能。
-
存储带有分数的元素集合,并根据分数进行排序。
-
-
特点:
-
元素具有唯一性,但每个元素都关联一个分数。
-
可以按照分数范围获取元素。
-
String(字符串)
一、基本概念
String 类型是 Redis 最基本的数据类型之一,它通过一个 key 对应一个 value 的方式进行存储。这种简单而直接的存储方式使得它在很多场景下都非常实用。
二、二进制安全的特性
Redis 的 String 类型具有二进制安全的特点,这意味着它可以存储任何类型的数据,包括但不限于文本、图片(以二进制形式存储)、序列化的对象等。这种特性使得 Redis 在存储各种复杂数据时具有很大的灵活性。例如,可以将序列化后的 Java 对象存储在 Redis 中,实现对象的缓存和快速访问。
三、存储容量
String 类型的值最大能存储 512MB。这个容量对于大多数应用场景来说已经足够大,可以满足存储大量文本、图片或其他数据的需求。
四、单值缓存的应用场景
-
设置和获取值:
- 使用
set key value
命令可以设置一个键值对,将特定的 value 存储在指定的 key 下。 get key
命令用于获取指定 key 对应的 value。del key
命令可以删除指定的 key 及其对应的值。keys *
命令可以列出所有的 key。
- 使用
-
存储 JSON 字符串:
- 单值缓存的值可以是 JSON 字符串。这在存储复杂数据结构时非常有用,例如存储一个包含多个字段的对象的 JSON 表示形式。通过将对象序列化为 JSON 字符串并存储在 Redis 中,可以方便地进行缓存和快速访问。
五、计数器的应用场景
-
设置初始值:
set news_views:1 0
可以设置文章的访问量初始值为 0。这里的news_views:1
是一个特定的 key,表示文章 1 的访问量。
-
增加和减少计数器:
incr news_views:1
用于将文章的访问量加 1。每次执行这个命令,Redis 会自动将指定 key 的值增加 1。decr news_views:1
则将文章的访问量减 1。
-
获取计数器的值:
get news_views:1
可以获取文章的当前访问量值。
通过使用 Redis 的 String 类型,可以方便地实现单值缓存和计数器等功能,为应用程序提供高效的数据存储和访问方式。
Hash(哈希)
一、数据结构特点
Redis 的 Hash 类型是一个 string 类型的 field(字段)和 value 的映射表。它非常适合用于存储对象,因为可以将对象的各个属性作为 field,对应的值作为 value 进行存储。例如,存储用户信息时,可以将用户的 ID、姓名、年龄等属性分别作为 field,对应的具体值作为 value 存储在一个 Hash 中。
二、常用命令及功能
-
存储键值对:
-
hset key field value
命令用于在指定的哈希表(key)中存储一个 field 和 value 的键值对。如果哈希表不存在,会自动创建。这个命令可以方便地向 Hash 中添加或更新一个属性的值。
-
-
获取键值:
-
hget key field
命令用于获取指定哈希表(key)中对应 field 的键值。通过这个命令,可以快速获取对象的特定属性值。
-
-
删除键值对:
-
hdel key field
命令用于删除指定哈希表(key)中的一个 field 键值对。如果要删除多个 field,可以多次执行这个命令。
-
-
获取 field 数量:
-
hlen key
命令用于返回指定哈希表(key)中的 field 的数量。这个命令可以快速了解 Hash 中存储了多少个属性。
-
-
获取所有键值对:
-
hgetall key
命令用于返回指定哈希表(key)中所有的键值对。这个命令会返回一个包含所有 field 和 value 的列表,方便对整个对象进行遍历和处理。
-
三、应用场景举例
-
存储用户购物车信息:可以将用户的购物车作为一个 Hash 存储,每个商品的 ID 作为 field,商品的数量、价格等信息作为 value。这样可以方便地对购物车进行添加、删除商品以及查询购物车中商品的信息等操作。
-
存储系统配置信息:将将系统的各种配置参数作为 field,对应的配置值作为 value 存储在一个 Hash 中。这样可以方便地进行配置的读取和修改,并且可以对不同的配置进行分组管理。
总之,Redis 的 Hash 类型提供了一种方便、高效的方式来存储和操作对象类型的数据,在很多实际应用场景中都有广泛的应用。
List(列表)
一、数据结构特点
Redis 列表是简单的字符串列表,按照插入顺序进行排序。这意味着可以在列表的头部(左边)或尾部(右边)插入元素,并且元素在列表中的位置是固定的,按照插入的先后顺序排列。
二、常用命令及功能
-
插入元素:
-
lpush key value[value...]
:将一个或多个值插入到指定 key 列表的表头(最左边)。例如,lpush mylist value1 value2
会将value1
和value2
依次插入到名为mylist
的列表的头部。 -
rpush key value[value...]
:将一个或多个值插入到指定 key 列表的表尾(最右边)。例如,rpush mylist value3 value4
会将value3
和value4
依次插入到名为mylist
的列表的尾部。
-
-
移除并返回元素:
-
lpop key
:移除并返回指定 key 列表的头元素。执行这个命令后,列表的第一个元素将被移除,并返回该元素的值。 -
rpop key
:移除并返回指定 key 列表的尾元素。与lpop
类似,这个命令会移除并返回列表的最后一个元素。
-
-
获取指定区间内的元素:
-
lrange key start stop
:返回列表key
中指定区间内的元素,区间以偏移量start
和stop
确定。例如,lrange mylist 0 -1
会返回mylist
列表中的所有元素。 -
-
三、常见用法
-
Stack(栈):
-
实现方式为
LPUSH + LPOP
,即先使用lpush
将元素依次压入栈中,然后使用lpop
从栈顶弹出元素。这种方式遵循 “后进先出”(FILO)的原则,类似于数据结构中的栈。
-
-
Queue(队列):
-
实现方式为
LPUSH + RPOP
,即先使用lpush
将元素依次插入到队列的尾部,然后使用rpop
从队列的尾部弹出元素。这种方式遵循 “先进先出”(FIFO)的原则,类似于数据结构中的队列。
-
四、应用场景举例
-
消息队列:可以使用 Redis 列表作为消息队列,生产者使用
lpush
将消息插入到列表中,消费者使用rpop
从列表中获取消息进行处理。 -
任务队列:将任务存储在列表中,工作进程使用
lpop
从列表中获取任务进行处理,实现任务的分发和执行。 -
历史记录:可以将用户的操作历史记录存储在列表中,方便后续查询和分析。
总之,Redis 的列表类型提供了一种灵活、高效的方式来处理有序的字符串集合,可以应用于多种场景。
Set(集合)
一、数据结构特点
Redis 的 Set 是一种无序集合,这意味着集合中的元素没有特定的顺序。Set 中的元素是唯一的,不允许重复。
二、常用命令及功能
-
添加元素:
-
sadd key member[member...]
:往集合key
中存入一个或多个元素。如果元素已经存在于集合中,则会被忽略。如果集合key
不存在,则会新建一个集合。例如,sadd myset element1 element2
会将element1
和element2
添加到名为myset
的集合中。
-
-
删除元素:
-
srem key member[member...]
:从集合key
中删除一个或多个元素。例如,srem myset element1
会从myset
集合中删除element1
。
-
-
获取所有元素:
-
smembers key
:获取集合key
中所有的元素。这个命令会返回一个包含集合中所有元素的列表。例如,执行smembers myset
会返回myset
集合中的所有元素。
-
-
获取元素个数:
-
scard key
:获取集合key
的元素个数。这个命令会返回一个整数,表示集合中元素的数量。例如,执行scard myset
会返回myset
集合中元素的个数。
-
三、应用场景举例
-
标签系统:可以使用 Set 来存储用户的标签。每个用户的标签集合是一个 Set,通过
sadd
命令添加标签,srem
命令删除标签,smembers
命令获取用户的所有标签。 -
共同关注:在社交网络中,可以使用 Set 来存储用户的关注列表。通过对两个用户的关注集合进行交集运算,可以得到他们的共同关注用户。
-
去重功能:Set 的唯一性特点可以用于数据去重。例如,在处理日志数据时,可以将日志中的 IP 地址存储在 Set 中,以去除重复的 IP 地址。
总之,Redis 的 Set 类型提供了一种高效的方式来存储和操作无序的唯一元素集合,可以应用于多种场景。
zset(sorted set:有序集合)
一、数据结构特点
Redis 的有序集合(Zset)与普通集合类似,也是不允许重复的成员,但它是有序的。每个元素都会关联一个 double 类型的分数,Redis 通过这个分数来为集合中的成员进行从小到大的排序。
二、关键特性
-
成员唯一性:Zset 的成员是唯一的,这意味着不能有重复的元素存在于同一个有序集合中。
-
分数可重复:虽然成员是唯一的,但分数可以重复。这使得可以有多个元素具有相同的分数,它们在排序中的位置将根据插入的先后顺序或者其他规则来确定。
三、常用命令及功能
-
添加带分值元素:
-
zadd key score member[[score member]..]
:往有序集合key
中加入带分值的元素。可以同时添加一个或多个元素,每个元素由分数和成员组成。例如,zadd myzset 10 element1 20 element2
会将element1
以分数 10 和element2
以分数 20 添加到名为myzset
的有序集合中。
-
-
删除元素:
-
zrem key member[member...]
:从有序集合key
中删除一个或多个元素。例如,zrem myzset element1
会从myzset
有序集合中删除element1
。
-
-
获取元素分值:
-
zscore key member
:返回有序集合key
中元素member
的分值。例如,执行zscore myzset element1
会返回element1
在myzset
有序集合中的分数。
-
-
获取元素个数:
-
zcard key
:返回有序集合key
中元素的个数。例如,执行zcard myzset
会返回myzset
有序集合中的元素数量。
-
四、应用场景举例
-
排行榜:可以使用 Zset 来实现各种排行榜,例如游戏得分排行榜、用户活跃度排行榜等。将用户的 ID 或其他标识作为成员,用户的得分或活跃度作为分数,通过
zadd
命令添加元素,然后可以使用zrevrange
等命令获取排行榜的前几名。 -
时间线:在社交网络或新闻平台中,可以使用 Zset 来存储用户的动态或新闻文章,以发布时间作为分数,动态或文章的 ID 作为成员。这样可以方便地按照时间顺序获取最新的动态或文章。
-
优先级队列:Zset 可以用作优先级队列,将任务的优先级作为分数,任务的标识作为成员。高优先级的任务会排在前面,可以通过
zpopmin
或zpopmax
命令获取并删除优先级最高的任务。
设置失效时间
一、需求背景
在很多应用场景中,我们并不希望 Redis 的键一直存在。比如缓存数据,为了提高性能而将一些数据存储在 Redis 中,但这些数据可能随着时间的推移变得不再有效,需要被自动清理以释放内存空间。又如验证码,通常只在一定时间内有效,过期后就应该被自动删除。Redis 提供的设置键过期时间的命令正好满足了这些需求。
二、设置过期时间的方式
-
设置值时直接设置有效时间:
-
使用
set name jim EX 30
命令可以在设置键值对的同时设置失效时间为 30 秒。其中EX
表示以秒为单位设置过期时间。同样,PX
表示以毫秒为单位设置过期时间,且EX
和PX
不区分大小写。例如set name jim PX 30000
表示设置键name
的值为jim
,并以毫秒为单位设置过期时间为 30000 毫秒。
-
-
设置值后设置有效时间:
-
expire key 时间(秒)
:在设置键值对之后,可以使用expire
命令为键设置过期时间,单位为秒。例如expire name 60
表示为键name
设置过期时间为 60 秒。 -
pexpire key 时间(毫秒)
:与expire
类似,pexpire
以毫秒为单位设置键的过期时间。例如pexpire name 60000
表示为键name
设置过期时间为 60000 毫秒。
-
三、查看剩余时间的命令
-
ttl key
:查看键的剩余时间,单位为秒。执行这个命令会返回键的剩余生存时间,如果键不存在或者已经过期,会返回-2
;如果键没有设置过期时间,会返回-1
。 -
pttl key
:查看键的剩余时间,单位为毫秒。与ttl
类似,但返回的时间单位是毫秒。
四、应用场景举例
-
缓存管理:在缓存系统中,可以为缓存数据设置合理的过期时间,确保缓存数据在一定时间后自动失效,避免缓存数据占用过多内存。例如,对于经常变化的数据,可以设置较短的过期时间,以保证缓存中的数据始终是最新的。
-
验证码验证:在用户注册、登录等场景中,生成的验证码通常只在一定时间内有效。可以将验证码存储在 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 的功能
-
连接池自动管理和高度封装的 RedisTemplate:
-
Spring-data-redis 自动管理 Redis 连接池,避免了手动管理连接的复杂性。
-
提供了高度封装的 “RedisTemplate” 类,简化了 Redis 的操作。通过这个模板类,可以方便地进行各种数据类型的存储和读取操作。
-
-
归类封装的操作接口:
-
将 Jedis 客户端中的大量 API 进行了归类封装,将同一类型的操作封装为不同的 operation 接口。
-
ValueOperations
:用于简单的键值对(K-V)操作,如设置和获取单个值。 -
SetOperations
:用于 set 类型数据的操作,如添加、删除元素,判断元素是否存在等。 -
ZSetOperations
:用于 zset 类型数据的操作,如添加元素并设置分数,获取范围内的元素等。 -
HashOperations
:针对 map 类型的数据操作,如设置和获取哈希表中的字段值。 -
ListOperations
:针对 list 类型的数据操作,如在列表的头部或尾部添加元素,获取列表中的元素范围等。
-
-
事务操作封装:
-
Spring-data-redis 将事务操作进行了封装,由容器控制事务的开始、提交和回滚。可以方便地在 Spring 应用中使用事务来保证数据的一致性。
-
-
序列化 / 反序列化策略:
-
针对数据的 “序列化 / 反序列化”,提供了多种可选择的策略(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 格式进行存储和传输时非常方便。
-
三、使用步骤
-
在项目中添加 Spring-data-redis 和 Jedis 的依赖。
-
配置 Redis 连接信息,如主机地址、端口号、密码等。
-
在 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 缓存的类,必须实现序列化接口
详细说明:
-
判断键是否存在和删除键:
-
System.out.println(redisTemplate.hasKey("e"));
:判断键"e"
是否存在于 Redis 中。 -
System.out.println(redisTemplate.delete("e"));
:删除键"e"
,并返回是否删除成功的布尔值。 -
System.out.println(redisTemplate.hasKey("e"));
:再次判断键"e"
是否存在,验证删除操作是否成功。
-
-
设置键值对和自增操作:
-
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 秒。
-
-
操作哈希类型数据:
-
HashOperations hashOperations = redisTemplate.opsForHash();
:获取用于操作哈希类型数据的HashOperations
对象。 -
hashOperations.put("news","newsdz1",20);
:在键为"news"
的哈希中,设置字段为"newsdz1"
,值为20
的键值对。
-
-
操作列表类型数据:
-
ListOperations listOperations = redisTemplate.opsForList();
:获取用于操作列表类型数据的ListOperations
对象。
-
-
序列化键值:
-
redisTemplate.setKeySerializer(new StringRedisSerializer());
:设置键的序列化器为StringRedisSerializer
,确保键以字符串形式进行序列化。 -
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<User>(User.class));
:设置值的序列化器为Jackson2JsonRedisSerializer
,用于将 Java 对象序列化为 JSON 格式存储在 Redis 中。这里指定了要序列化的对象类型为User
类。
-
注意事项
-
需要被 Redis 缓存的类必须实现序列化接口,这是因为 Redis 在存储对象时需要将对象序列化为字节数组进行存储。如果不实现序列化接口,在存储和读取对象时会抛出异常。
-
在设置键值对时,如果没有指定过期时间,那么键值对将一直存在于 Redis 中,直到被手动删除或 Redis 内存不足时被清理。
-
在使用不同的操作接口(如
ValueOperations
、HashOperations
、ListOperations
等)时,需要根据具体的业务需求选择合适的接口进行操作,以提高代码的可读性和可维护性。
相关文章:

redis简单使用与安装
redis redis 是什么 Redis 是一个开源的,使用 C 语言编写的,支持网络交互的,内存中的Key-Value 数据结构存储系统,支持多种语言,它可以用作数据库、缓存和消息中间件。 一、存储系统特性 内存存储与持久化 Redis 主要将数据存储在内存中,这…...
封装 WBXpopup 组件
这是Popup组件基于微博小程序,需要改变标签,以及一写方法 支持四个方向抽屉,以及中间弹出功能 // 用法 <template><wbx-view style"height: 100vh;"><!-- 对话框组件 --><wbx-view><wbx-text click&quo…...

【OJ刷题】双指针问题6
这里是阿川的博客,祝您变得更强 ✨ 个人主页:在线OJ的阿川 💖文章专栏:OJ刷题入门到进阶 🌏代码仓库: 写在开头 现在您看到的是我的结论或想法,但在这背后凝结了大量的思考、经验和讨论 目录 1…...

详解:Tensorflow、Pytorch、Keras(搭建自己的深度学习网络)
这是一个专门对Tensorflow、Pytorch、Keras三个主流DL框架的一个详解和对比分析 一、何为深度学习框架? 你可以理解为一个工具帮你构建一个深度学习网络,调用里面的各种方法就能自行构建任意层,diy你想要的DNN,而且任意指定学习…...

【CSS in Depth 2 精译_035】5.5 Grid 网格布局中的子网格布局(全新内容)
当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一章 层叠、优先级与继承(已完结) 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位(已完结) 2.1 相对…...
Java是怎么处理死锁的
文章目录 避免死锁避免嵌套锁资源进行排序超时锁 检测死锁通过Java提供的API检查死锁情况jStack监控工具 Java 本身没有内置的机制自动处理死锁问题,但可以采取一些策略和技术来检测和避免死锁。 避免死锁 避免嵌套锁 尽可能减少嵌套锁操作,避免在一个…...
Effective Java 学习笔记 方法签名设计
目录 谨慎选择方法名称 不要过于追求提供便利的快捷方法 避免过长的参数列表 对于参数类型优先使用接口而不是类 对于boolean参数,要优先使用两个元素的枚举类型 本文接续前一篇文章聚焦Java方法签名的设计,方法签名包括了方法的输入和输出参数以及…...
毛利超70%、超70+智驾客户,这家AI数据训练服务商刚刚止亏
AI训练数据服务第一股海天瑞声终于迎来了“曙光”。 日前,海天瑞声发布2024年半年报显示,上半年其实现营收9242.63万,同比增长24.13%;实现净利润41.64 万元,不过同比去年同期的亏损1724.14万元,扭亏为盈。…...

本地部署高颜值某抑云音乐播放器Splayer并实现无公网IP远程听歌
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

图像压缩编码(4)--H.26x系列视频压缩编码_2
目录 H.261 视频编码标准 H.261的编码与解码 1) 帧内/帧间编码 2)运动补偿 3)量化 4)环路滤波器 5)缓存器 压缩数据的分层 数据复用结构 H.264的编码与解码 H.261 视频编码标准 实际应用时,要求有…...

JS渲染锻炼输入表单
前言 上篇文章为大家展现了好看的信息窗口,接下来我们跟着流程图看下一步 之前我们的带点击事件已经添加完毕,下一步就是当用户点击的时候,渲染锻炼形式,当然这是一个标签,可以提供给用户输入锻炼形式 实例 ● 我…...

proteus仿真学习(1)
一,创建工程 一般选择默认模式,不配置pcb文件 可以选用芯片型号也可以不选 不选则从零开始布局,没有初始最小系统。选用则有初始最小系统以及基础的main函数 本次学习使用从零开始,不配置固件 二,上手软件 1.在元件…...

决策树+随机森林模型实现足球大小球让球预测软件
文章目录 前言一、决策树是什么?二、数据收集与整理1.数据收集2.数据清洗3.特征选择 三、决策树构建3.1绘制训练数据图像3.2 训练决策树模型3.3 依据模型绘制决策树的决策边界3.4 树模型可视化 四、模型预测五、随机森林模型总结 前言 之前搞足球数据分析的时候&…...

31省市农业地图大数据
1.北京市 谷类作物种植结构(万亩) 农作物种植结构(万亩) 2.天津市 谷类作物种植结构(万亩) 农作物种植结构(万亩) 3.黑龙江省 谷类作物种植结构(万亩) 农作物…...
http请求包含什么
HTTP请求通常包含以下几个主要部分: 请求行(Request Line): 包含请求方法(如 GET、POST、PUT、DELETE 等)、请求的目标 URI 和 HTTP 版本。例如:GET /index.html HTTP/1.1 请求头部(…...

【基础算法总结】模拟篇
目录 一,算法介绍二,算法原理和代码实现1576.替换所有的问号495.提莫攻击6.Z字形变换38.外观数列1419.数青蛙 三,算法总结 一,算法介绍 模拟算法本质就是"依葫芦画瓢",就是在题目中已经告诉了我们该如何操作…...

《深度学习》PyTorch 手写数字识别 案例解析及实现 <下>
目录 一、回顾神经网络框架 1、单层神经网络 2、多层神经网络 二、手写数字识别 1、续接上节课代码,如下所示 2、建立神经网络模型 输出结果: 3、设置训练集 4、设置测试集 5、创建损失函数、优化器 参数解析: 1)para…...

【笔记】材料分析测试:晶体学
晶体与晶体结构Crystal and Crystal Structure 1.晶体主要特征 固态物质可以分为晶态和非晶态两大类,分别称为晶体和非晶体。 晶体和非晶体在微观结构上的区别在于是否具有长程有序。 晶体(长程有序)非晶(短程有序)…...
飞塔Fortigate7.4.4的DNS劫持功能
基础网络配置、上网策略、与Server的VIP配置(略)。 在FortiGate上配置DNS Translation,将DNS请求结果为202.103.12.2的DNS响应报文中的IP地址修改为Server的内网IP 10.10.2.100。 config firewall dnstranslationedit 1set src 2.13.12.2set…...

Unity 设计模式 之 行为型模式 -【状态模式】【观察者模式】【备忘录模式】
Unity 设计模式 之 行为型模式 -【状态模式】【观察者模式】【备忘录模式】 目录 Unity 设计模式 之 行为型模式 -【状态模式】【观察者模式】【备忘录模式】 一、简单介绍 二、状态模式(State Pattern) 1、什么时候使用状态模式 2、使用状态模式的…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...