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

[尚庭公寓]06-Redis快速入门

概述

Redis(Remote Dictionary Server)是一个**基于内存**的键值对存储系统,常用作缓存服务。由于Reids将数据都保存在内存中,因此其读写性能十分惊人,同时,为保证数据的可靠性,Redis会将数据备份到硬盘上,用于故障发生时的数据恢复。

Redis特点

  1. 高性能

Redis主要将数据存储在内存中,因此读写速度非常快,适合对速度有较高要求的场景。

  1. 支持多种数据结构

Redis中键值对的值(Value)支持多种数据结构,如字符串、哈希表、列表、集合等,这使得它可以应用于多种不同的场景。

  1. 持久化

Redis可以通过**定期快照**或者**实时记录写操作日志**的方式将内存中的数据持久化到硬盘,确保数据在重启后不会丢失。

  1. 灵活的数据过期策略

可以为每个键设置过期时间,一旦过期,Redis会自动删除。

Redis应用场景

Redis最为常见的一个应用场景就是用作**缓存**,缓存可以显著提升访问速度,降低数据库压力。

客户端

命令行客户端

Reids提供了一个命令行客户端`redis-cli`,我们可以使用它连接到Redis服务器,然后通过命令与服务器进行各种交互,例如数据的增删改查。下面介绍该命令的基本用法。

  1. 启动客户端
redis-cli -h 127.0.0.1 -p 6379
  • `-h <hostname>`选项用于声明Redis服务器的主机名或IP地址,默认值为`127.0.0.1`。
  • `-p <port>`选项用于声明Redis服务器监听的端口号,默认值为`6379`。

  1. 测试连接状态

`ping`命令可用于测试连接状态,语法如下

ping

说明:若连接正常,则会返回pong。

  1. 退出客户端

 `quit`命令可用于断开客户端与服务端的连接,并退出客户端,语法如下

quit

图形化客户端

Redis官方推荐的图形化客户端为**RedisInsight**,该客户端开源免费,且功能强大,下面演示如何使用。

  1. 安装

 安装包为`RedisInsight-v2-win-installer.exe`,可在项目资料中获取,安装步骤比较简单,大家自行安装即可。

  1. 选择配置数据库连接

  1. 填写连接信息,并测试连接,通过后保存连接

  1. 点击创建好的连接

  1. 工作界面如下

常用数据类型和命令

通用命令

`keys`命令可用于查看所有键,语法如下

keys pattern
  1. 说明:pattern用于匹配key,其中`*`表示任意个任意字符,`?`表示一个任意字符。
  2. 示例:
  127.0.0.1:6379> KEYS *1) "k3"2) "k2"3) "k1"
  1. 注意:该命令会遍历Redis服务器中保存的所有键,因此当键很多时会影响整个Redis服务的性能,线上环境需要谨慎使用。

`dbsize`可用于查看键的总数,语法如下

dbsize

 `exists`命令可用于判断一个键是否存在,语法如下

exists key

说明:若键存在则返回1,不存在则返回0。

`del`可用于删除指定键,语法如下

del key [key ...]

 说明:返回值为删除键的个数,若删除一个不存在的键,则返回0。

查询键的剩余过期时间

ttl key

 说明:`ttl`的含义为**time to live**,用于查询一个定时键的剩余存活时间,返回值以秒为单位。若查询的键的未设置过期时间,则返回`-1`,若查询的键不存在,则返回`-2`。

数据库管理命令

 Redis默认有编号为0~15的16个逻辑数据库,每个数据库之间的数据是相互独立的,所有连接默认使用的都是0号数据库。

# `select`命令可用于切换数据库,语法如下select index

说明:若index超出范围,会报错

# 清空数据库
# 命令会清空当前所选用的数据库
flushdb# 命令会清空0~15号所有的数据库
flushall

注意:生产环境慎用

string类型

 Redis中的string类型保存的是字节序列(Sequence of bytes),因此任意类型的数据,只要经过序列化之后都可以保存到Redis的string类型中,包括文本、数字甚至是一个对象。

`set`命令用于添加string类型的键值对,具体语法如下

SET key value [NX|XX] [EX seconds|PX milliseconds]

各选项含义如下
- NX:仅在key不存在时set
- XX:仅在key存在时set
- EX seconds:设置过期时间,单位为秒
- PX milliseconds:设置过期时间,单位为毫秒

`get`命令用于获取某个string类型的键对应的值,具体语法如下

GET key

`incr`命令用于对数值做自增操作,具体语法如下

INCR key

若key对应的value是整数,则返回自增后的结果,若不是整数则报错,若key不存在则创建并返回1。

 `decr`命令用于对数值做自减操作,具体语法如下

DECR key

 若key对应的value是整数,则返回自减后的结果,若不是整数则报错,若key不存在则创建并返回-1。

list类型

list类型可用于存储多个string类型的元素,并且所有元素按照被添加的顺序存储。

list类型相关的命令较多,下面分类进行进行介绍。

添加元素

 向列表中添加元素的命令有`lpush`、`rpush` 、`linsert`,各命令的功能与用法如下

lpush: 该命令用于向list左侧添加元素



# 语法如下
lpush key element [element ...]# 示例
lpush l1 a b c

lpush: 该命令用于向list左侧添加元素


# 语法如下
lpush key element [element ...]# 示例
lpush l1 a b c

rpush:  该命令用于向list右侧添加元素


# 语法如下
rpush key element [element ...]

linsert: 该命令用于向list指定位置添加元素

# 语法如下
linsert key before|after pivot element# 示例
linsert l1 after b new

查询元素

lindex: 该命令用于获取指定索引位置的元素,

# 语法如下
lindex key index

 说明:index从左到右依次是0,1,2...,从右到左依次是-1,-2,-3...

lrange: 该命令用于获取指定范围内的元素列表

# 语法如下
lrange key start stop# 示例: 获取list全部元素,命令如下
lrange l1 0 -1

删除元素

删除list元素的命令有`lpop`、`rpop`、`lrem`,各命令的功能与用法如下

`lpop` 该命令用于移除并返回list左侧元素,语法如下

lpop key [count]

说明:count参数表示移除元素的个数

`rpop` 该命令用于移除并返回list右侧的元素,语法如下

rpop key [count]

lrem 该命令用于移除list中的指定元素,语法如下

lrem key count element

说明:count参数表示要移除element元素的个数(list中可以存在多个相同的元素),count的用法如下

- 若count>0,则从左到右删除最多count个element元素

- 若count<0,则从右到左删除最多count(的绝对值)个element元素

- 若count=0,则删除所有的element元素

修改元素

`lset`命令可用于修改指定索引位置的元素,语法如下

lset key index element
其他

`llen`命令可用于查看list长度,语法如下

llen key

set类型

和list类型相似,set类型也可用来存储多个string类型的元素,但与list类型不同,set中的元素是无序的,且set中不会包含相同元素。

集合内

sadd 该命令用于向set中添加元素,语法如下

sadd key member [member ...]

smembers 该命令用于查询set中的全部元素,语法如下

smembers key

srem 该命令用于移除set中的指定元素,语法如下

srem key member [member ...]

spop 该命令随机移除并返回set中的n个元素,语法如下

spop key [count]

srandmember 该命令随机返回set中的n个元素(不删除),语法如下

srandmember key [count]

scard(Cardinality,基数) 该命令用于查询set中的元素个数,语法如下

scard key

sismember 该命令用于元素是否在set中,语法如下

sismember key element

集合间

sinter 该命令用于计算多个集合的交集,语法如下

sinter key [key ...]

sunion 该命令用于计算多个集合的并集,语法如下

sunion key [key ...]

sdiff 该命令用于计算多个集合的差集,语法如下

sdiff key [key ...]

hash类型

 hash类型类似于Java语言中的`HashMap`,可用于存储键值对。

hset 该命令用于向hash中增加键值对,语法如下

hset key field value [field value ...]

hget 该命令用于获取hash中某个键对应的值,语法如下

hget key field

hdel 该命令用于删除hash中的指定的键值对,语法如下

hdel key field [field ...]

hlen 该命令用于查询hash中的键值对个数,语法如下

hlen key

hexists 该命令用于判断hash中的某个键是否存在,语法如下

hexists key field

hkeys 该命令用于返回hash中所有的键,语法如下

hkeys key

hvals 该命令用于返回hash中所有的值,语法如下

hvals key

hgetall 该命令用于返回hash中所有的键与值,语法如下

hgetall key

zset类型

 zset(sorted set)被称为有序集合,同set相似,zset中也不会包含相同元素,但不同的是,zset中的元素是有序的。并且zset中的元素并非像list一样按照元素的插入顺序排序,而是按照每个元素的分数(score)排序。

zadd 该命令用于向zset中添加元素,语法如下

ZADD key [NX|XX] score member

说明:

- NX:仅当member不存在时才add

- XX:仅当member存在时才add

zcard 该命令用于计算zset中的元素个数,语法如下

zcard key

zscore 改名用于查看某个元素的分数,语法如下

zscore key member

zrank/zrevrank 这组命令用于计算元素的排名,其中zrank按照score的升序排序,zrevrank则按照降序排序,语法如下

zrank/zrevrank key member

说明:名次从0开始。

zrem 该命令用于删除元素,语法如下

zrem key member [member ...]

zincrby 该命令用于增加元素的分数,语法如下

zincrby key increment member

zrange 该命令用于查询指定区间范围的元素,语法如下

zrange key start stop [byscore] [rev] [limit offset count] [withscores]

说明:

  • start/stop:用于指定查询区间,但是在不同模式下,其代表的含义也不相同
    • 默认模式下,`start~stop`表示的是名次区间,且该区间为闭区间。名次从0开始,且可为负数,-1表示倒数第一,-2表示倒数第二,以此类推。
    • byscore模式下(声明了byscore参数),则`start~stop`表示的就是分数区间,该区间默认仍为闭区间。在该模式下,可以在`start`或`stop`前增加`(`来表示开区间,例如`(1 (5`,表示的就是`(1,5)`这个开区间。除此之外,还可以使用`-inf`和`+inf`表示负无穷和正无穷。
  • byscore:用于切换到分数模式
  • rev:表示降序排序。在byscore模式下使用rev参数需要注意查询区间,start应大于stop。
  • limit:该选项只用于byscore模式,作用和sql语句中的limit一致
  • withscores:用于打印分数

Spring Data Redis** 是Spring大家族中的一个子项目,主要用于Spring程序和Redis的交互。它基于的Redis Java客户端([Jedis](https://github.com/redis/jedis)和[Lettuce](https://lettuce.io/))做了抽象,提供了一个统一的编程模型,使得Spring程序与Redis的交互变得十分简单。

SpringBoot整合Redis

Spring Data Redis 是Spring大家族中的一个子项目,主要用于Spring程序和Redis的交互。它基于的Redis Java客户端([Jedis](https://github.com/redis/jedis)和[Lettuce](https://lettuce.io/))做了抽象,提供了一个统一的编程模型,使得Spring程序与Redis的交互变得十分简单。

Spring Data Redis 中有一个十分重要的类——`RedisTemplate`,它封装了与Redis进行的交互的各种方法,我们主要用使用它与Redis进行交互。

  1. 创建SpringBoot项目
  2. 引入Maven依赖

Spring Boot提供了对Spring Data Redis的支持,在Spring Boot项目中可以直接引入`spring-boot-starter-data-redis`来完成Spring Data Redis的自动配置,具体依赖如下

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

  1. 配置application.yml文件

在`application.yml`文件中增加如下参数

 spring:data:redis:host: 192.168.10.101port: 6379database: 0

  1. RedisTemplate使用

由于`spring-boot-starter-data-redis`中提供了`RedisTemplate`的自动配置,所以我们可以将`RedisTemplate`注入自己的类中,如下边的案例所示

  @SpringBootTestpublic class TestRedisTemplate {@Autowiredprivate RedisTemplate redisTemplate;@Testpublic void testRedisTemplate() {}}

根据Redis的数据类型,RedisTemplate对各种交互方法做了分组,以下是常用的几个分组

下面简单测试几个简单的方法

@SpringBootTestpublic class TestRedisTemplate {@Autowiredprivate RedisTemplate redisTemplate;@Testpublic void testSet() {redisTemplate.opsForValue().set("key1", "value1");}@Testpublic void testGet() {String result = (String) redisTemplate.opsForValue().get("key1");System.out.println(result);}@Testpublic void testDel() {redisTemplate.delete("key1");}}

  1. 序列化问题

问题演示

问题一

使用RedisTemplate向Redis中增加一个键值对

redisTemplate.opsForValue().set("key2","value2");

使用RedisTemplate查询key2所对应的value,有结果

redisTemplate.opsForValue().get("key2");

使用命令行客户端查询key2所对应的value,无结果

  get key2

问题二

在图形化客户端或者命令行客户端观察key2,显示异常

 RedisInsight中的key2显示如下

  命令行客户端中的key2显示如下

问题说明

 上述问题的根本原因是,Redis中的key和value均是以二进制的形式存储的,因此客户端输入的key和value都会经过序列化之后才发往Redis服务端。而RedisTemplate所使用序列化方式和命令行客户端采用序列化方式不相同,进而导致序列化之后的二进制数据不同,所以才会导致上述的现象。

  1. StringRedisTemplate使用

 为解决上述问题,可使用`StringRedisTemplate`代替`RedisTemplate`,因为`StringRedisTemplate`使用的序列化器和命令行所使用的序列化器是相同的。

 `spring-boot-starter-data-redis`同样提供了`StringRedisTemplate`的自动配置,因此我们也可以直接将其注入到自己的类中。实例代码如下

@SpringBootTestpublic class TestStringRedisTemplate {@Autowiredprivate StringRedisTemplate redisTemplate;@Testpublic void testSet() {redisTemplate.opsForValue().set("key4", "value4");}@Testpublic void testGet() {String result = redisTemplate.opsForValue().get("key4");System.out.println(result);}@Testpublic void testDel() {redisTemplate.delete("key4");}}
http://www.lryc.cn/news/580058.html

相关文章:

  • 通过 Ansys Discovery CFD 仿真探索电池冷板概念
  • Excel 如何进行多条件查找或求和?
  • WPF 右键菜单 MenuItem 绑定图片时只显示最后一个 Icon
  • 深度分析:Microsoft .NET Framework System.Random 的 C++ 复刻实现
  • c# 使用GADL: Can‘t load requested DLL错误处理
  • PixiJS教程(004):点击事件交互
  • gic 中断触发类型
  • Python 中线程和进程在实际项目使用中的区别和联系
  • FastAPI 小白教程:从入门级到实战(源码教程)
  • 基于Docker构建OrangePi5 SDK环境
  • 使用mindie:2.0.RC2-800I-A2-py311-openeuler24.03-lts制作一个通用的模型推理性能测试的镜像
  • Windows 10/11 PC平台关闭禁用系统自动上传相关隐私数据手册
  • TDengine STMT2 API 使用指南
  • HarmonyOS-ArkUI 手势系列4--多层级手势
  • Spring Boot 中常用的工具类库及其使用示例(完整版)
  • 洛谷P1941 [NOIP 2014 提高组] 飞扬的小鸟
  • 行阶梯形矩阵和行最简形矩阵的区别
  • 【WRFDA教程第十期】混合数据同化(Hybrid Data Assimilation)
  • 【C++复习1】基础篇
  • 负载均衡--常见负载均衡算法
  • 大带宽服务器中冗余技术的功能
  • 【深度解析】Seedance 1.0:重新定义 AI 视频生成的工业级标准
  • 10.双端Diff算法
  • [代码学习] c++ 通过H矩阵快速生成图像对应的mask
  • 嵌入式C语言:指针
  • Jenkins-Email Extension 插件插件
  • ubuntu 18.04配置镜像源
  • ubuntu22桌面版中文输入法 fcitx5
  • 运维打铁:企业云服务解决方案
  • 金融系统中常用的FIX协议