Redis学习从入门到掌握(基础篇)
文章目录
- 一、初识Redis
- 1.认识 Redis
- 2.Redis常见命令
- (1)Redis 数据结构介绍
- (2)Redis 通用命令
- (3)String 类型
- (4)String 类型的常见命令
- (5)Hash 类型
- (6)Hash 类型的常见命令
- (7)List 类型
- (8)List 类型的常见命令
- (9)Set 类型
- (10)Set 类型的常见命令
- (11)SortedSet 类型
- (12)SortedSet 类型的常见命令
- 3.Redis 的 Java 客户端
- (1)Jedis
- (2)Jedis 连接池
- (3)SpringDataRedis
- (4)SpringDataRedis 快速入门
- (5)SpringDataRedis 的序列化方式
一、初识Redis
1.认识 Redis
认识Redis
Redis 诞生于2009年全称是Remote Dictionary Server ,远程词典服务器,是一个基于内存的键值型NoSQL 数据库。
特征:
-
键值(key-value )型,value 支持多种不同数据结构,功能丰富
-
单线程,每个命令具备原子性
-
低延迟,速度快(基于内存、10多路复用、良好的编码)。
-
支持数据持久化
-
支持主从集群、分片集群
-
支持多语言客户端
2.Redis常见命令
(1)Redis 数据结构介绍
- Redis 是一个key-value 的数据库,key一般是String 类型,不过value 的类型多种多样
- String
- Hash
- List
- Set
- Sortedset(Zset)
- GEO
- BitMap
- HyperLog
(2)Redis 通用命令
通用指令是部分数据类型的,都可以使用的指令,常见的有:
- KEYS:查看符合模板的所有key
- DEL:删除一个指定的key
- EXISTS :判断key是否存在
- EXPIRE :给一个key设置有效期,有效期到期时该key会被自动删除
- TTL:查看一个KEY的剩余有效期
(3)String 类型
String 类型,也就是字符串类型,是Redis 中最简单的存储类型。
其value 是字符串,不过根据字符串的格式不同,又可以分为3类:
- string :普通字符串
- int:整数类型,可以做自增、自减操作
- float :浮点类型,可以做自增、自减操作
不管是哪种格式,底层都是字节数组形式存储,只不过是编码方式不同。字符串类型的最大空间不能超过512m。
(4)String 类型的常见命令
-
SET :添加或者修改已经存在的一个 String 类型的键值对。
-
GET :根据 key 获取 String 类型的 value。
-
MSET :批量添加多个 String 类型的键值对。
-
MGET :根据多个 key 获取多个 String 类型的 value。
-
INCR :让一个整型的 key 自增 1。
-
INCRBY: 让一个整型的 key 自增并指定步长,例如: incrby num 2 让 num 值自增 2。
-
INCRBYFLOAT :让一个浮点类型的数字自增并指定步长。
-
SETNX :添加一个 String 类型的键值对,前提是这个 key 不存在,否则不执行。
-
SETEX :添加一个 String 类型的键值对,并且指定有效期。
(5)Hash 类型
Hash类型,也叫散列,其value 是一个无序字典,类似于Java中的HashMap 结构。
String 结构是将对象序列化为JSON字符串后存储,当需要修改对象某个字段时很不方便:
hotel:user:1 | {name:“Jack”, age:21} |
---|---|
hotel:user:2 | {name:“Rose”, age:18} |
Hash 结构可以将对象中的每个字段独立存储,可以针对单个字段做 CRUD :
KEY | field | value |
---|---|---|
hotel:user:1 | name | jack |
age | 21 | |
hotel:user:2 | name | Rose |
age | 18 |
(6)Hash 类型的常见命令
-
HSET key field value :添加或者修改 hash 类型 key 的 field 的值。
-
HGET key field :获取一个 hash 类型 key 的 field 的值
-
HMSET :批量添加多个 hash 类型 key 的 field 的值
-
HMGET :批量获取多个 hash 类型 key 的 field 的值
-
HGETALL :获取一个 hash 类型的 key 中的所有的 field 和 value
-
HKEYS :获取一个 hash 类型的 key 中的所有的 field
-
HVALS :获取一个 hash 类型的 key 中的所有的 value
-
HINCRBY: 让一个 hash 类型 key 的字段值自增并指定步长
-
HSETNX :添加一个 hash 类型的 key 的 field 值,前提是这个 field 不存在,否则不执行
(7)List 类型
Redis 中的List类型与Java中的LinkedList 类似,可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。
特征也与LinkedList 类似:
- 有序
- 元素可以重复
- 插入和删除快
- 查询速度一般
常用来存储一个有序数据,例如:朋友圈点赞列表,评论列表等。
(8)List 类型的常见命令
- LPUSH key element … :向列表左侧插入一个或多个元素
- LPOP key :移除并返回列表左侧的第一个元素,没有则返回 nil
- RPUSH key element … :向列表右侧插入一个或多个元素
- RPOP key :移除并返回列表右侧的第一个元素
- LRANGE key star end :返回一段角标范围内的所有元素
- BLPOP 和 BRPOP :与 LPOP 和 RPOP 类似,只不过在没有元素时等待指定时间,而不是直接返回 nil
(9)Set 类型
Redis 的Set结构与Java中的HashSet 类似,可以看做是一个value 为null的HashMap 。因为也是一个hash表,因此具备与HashSet 类似的特征:
- 无序
- 元素不可重复
- 查找快
- 支持交集、并集、差集等功能
(10)Set 类型的常见命令
-
SADD key member … :向 set 中添加一个或多个元素
-
SREM key member … : 移除 set 中的指定元素
-
SCARD key : 返回 set 中元素的个数
-
SISMEMBER key member :判断一个元素是否存在于 set 中
-
SMEMBERS :获取 set 中的所有元素
-
SINTER key1 key2 … :求 key1 与 key2 的交集
-
SDIFF key1 key2 … :求 key1 与 key2 的差集
-
SUNION key1 key2 … :求 key1 和 key2 的并集
(11)SortedSet 类型
Redis 的Sortedset 是一个可排序的set集合,与java中的TreeSet 有些类似,但底层数据结构却差别很大。Sortedset 中的每一个元素都带有一个score 属性,可以基于score 属性对元素排序,底层的实现是一个跳表(SkipList )加hash表。
SortedSet 具备下列特性:
- 可排序
- 元素不重复
- 查询速度快
因为SortedSet 的可排序特性,经常被用来实现排行榜这样的功能。
(12)SortedSet 类型的常见命令
ZADD key score member :添加一个或多个元素到 sorted set ,如果已经存在则更新其 score 值
- ZREM key member :删除 sorted set 中的一个指定元素
- ZSCORE key member : 获取 sorted set 中的指定元素的 score 值
- ZRANK key member :获取 sorted set 中的指定元素的排名
- ZCARD key :获取 sorted set 中的元素个数
- ZCOUNT key min max :统计 score 值在给定范围内的所有元素的个数
- ZINCRBY key increment member :让 sorted set 中的指定元素自增,步长为指定的 increment 值
- ZRANGE key min max :按照 score 排序后,获取指定排名范围内的元素
- ZRANGEBYSCORE key min max :按照 score 排序后,获取指定 score 范围内的元素
- ZDIFF 、 ZINTER 、 ZUNION :求差集、交集、并集
注意:所有的排名默认都是升序,如果要降序则在命令的 Z 后面添加 REV 即可
3.Redis 的 Java 客户端
在 Redis 官网中提供了各种语言的客户端,地址: https://redis.io/clients
(1)Jedis
jedis官网https://github.com/redis/jedis
- 引入依赖:
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.7.0</version></dependency>
- 创建 Jedis 对象,建立连接:
public Jedis setUp() {//建立连接Jedis jedis = new Jedis("127.0.0.1", 6379);//选择库jedis.select(0);return jedis;}
- 使用 Jedis ,方法名与 Redis 命令一致:
@Testpublic void testString() {Jedis jedis = setUp();try {//插入数据,方法名称就是 redis命令名称,非常简单String result = jedis.set("name", " 张三 ");System.out.println("result = " + result);//获取数据String name = jedis.get("name");System.out.println("name = " + name);} finally {jedis.close();}}
(2)Jedis 连接池
Jedis 本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,因此我们推荐大家使用Jedis 连接池代替Jedis 的直连。
private static final JedisPool jedisPool;static {JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();//最大连接jedisPoolConfig.setMaxTotal(8);//最大空闲连接jedisPoolConfig.setMaxIdle(8);//最小空闲连接jedisPoolConfig.setMinIdle(0);//设置最长等待时间, msjedisPoolConfig.setMaxWaitMillis(200);jedisPool = new JedisPool(jedisPoolConfig, "127.0.0.1", 6379,1000);}//获取 Jedis对象public static Jedis getJedis() {return jedisPool.getResource();}
(3)SpringDataRedis
SpringData 是Spring 中数据操作的模块,包含对各种数据库的集成,
其中对Redis 的集成模块就叫做Spring DataRedis ,官网地址:https://spring.io/projects/spring-data-redis/
提供了对不同 Redis 客户端的整合( Lettuce 和 Jedis )
- 提供了 RedisTemplate 统一 API 来操作 Redis
- 支持 Redis 的发布订阅模型
- 支持 Redis 哨兵和 Redis 集群
- 支持基于 Lettuce 的响应式编程
- 支持基于 JDK 、 JSON 、字符串、 Spring 对象的数据序列化及反序列化
- 支持基于 Redis 的 JDKCollection 实现
(4)SpringDataRedis 快速入门
SpringDataRedis 中提供了 RedisTemplate 工具类,其中封装了各种对 Redis 的操作。并且将不同数据类型的操作
API 封装到了不同的类型中:
- 引入依赖:
<!--Redis依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!--连接池依赖 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency>
- 配置文件:
spring:redis:host: 127.0.0.1port: 6379lettuce:pool:max-active: 8 #最大连接max-idle: 8 #最大空闲连接min-idle: 0 #最小空闲连接max-wait: 100 #连接等待时间
- 编写测试
@Autowiredprivate RedisTemplate redisTemplate;@Testpublic void testString() {//插入一条 string类型数据redisTemplate.opsForValue().set("name", " 李四 ");//读取一条 string类型数据Object name = redisTemplate.opsForValue().get("name");System.out.println("name = " + name);}
(5)SpringDataRedis 的序列化方式
RedisTemplate 可以接收任意 Object 作为值写入 Redis ,只不过写入前会把 Object 序列化为字节形式,默认是采用 JDK 序列化,得到的结果是这样的:
缺点:
- 可读性差
- 内存占用较大
我们可以自定义 RedisTemplate 的序列化方式,代码如下:
@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {//创建 TemplateRedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();//设置连接工厂redisTemplate.setConnectionFactory(redisConnectionFactory);//设置序列化工具GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();// key和 hashKey采用 string序列化redisTemplate.setKeySerializer(RedisSerializer.string());redisTemplate.setHashKeySerializer(RedisSerializer.string());// value和 hashValue采用 JSON序列化redisTemplate.setValueSerializer(jsonRedisSerializer);redisTemplate.setHashValueSerializer(jsonRedisSerializer);return redisTemplate;}
尽管 JSON 的序列化方式可以满足我们的需求,但依然存在一些问题,如图:
为了在反序列化时知道对象的类型, JSON 序列化器会将类的 class 类型写入 json 结果中,存入 Redis ,会带来额外的内存开销。
为了节省内存空间,我们并不会使用 JSON 序列化器来处理 value ,而是统一使用 String 序列化器,要求只能存储String 类型的 key 和 value 。当需要存储 Java 对象时,手动完成对象的序列化和反序列化。
Spring 默认提供了一个 StringRedisTemplate 类,它的 key 和 value 的序列化方式默认就是 String 方式。省去了我们自定义 RedisTemplate 的过程:
@Autowired(required = false)private StringRedisTemplate stringRedisTemplate;// JSON工具private static final ObjectMapper mapper = new ObjectMapper();@Testpublic void testStringTemplate() throws JsonProcessingException {//准备对象User user = new User(" 虎哥 ", 18);//手动序列化String json = mapper.writeValueAsString(user);//写入一条数据到 redisstringRedisTemplate.opsForValue().set("user:200", json);//读取数据String val = stringRedisTemplate.opsForValue().get("user:200");//反序列化User user1 = mapper.readValue(val, User.class);System.out.println("user1 = " + user1);}
相关文章:

Redis学习从入门到掌握(基础篇)
文章目录 一、初识Redis1.认识 Redis2.Redis常见命令(1)Redis 数据结构介绍(2)Redis 通用命令(3)String 类型(4)String 类型的常见命令(5)Hash 类型ÿ…...

redis主从复制、哨兵
目录 1. 主从复制 特点: 工作原理: 配置: 2. 哨兵 特点: 工作原理: 配置: 编辑 1. 主从复制 特点: 主从复制是 Redis 最基本的高可用性方案。主节点(Master)…...

uniapp登录拦截白名单使用
1、创建uni.promisify.adaptor.js文件 // 根目录新建 uni.promisify.adaptor.js // 路由白名单 const list [/, /pages/stroke/stroke]; //创建路由拦截,这里只判断一般跳转 uni.addInterceptor(switchTab, {invoke(res) {console.log(res);//存在token就跳转if (…...

力扣45. 跳跃游戏 II
Problem: 45. 跳跃游戏 II 文章目录 题目描述思路复杂度Code 题目描述 思路 1.获取数组的长度len,定义int类型变量end用于标记每次在当前可以跳到的最远距离,farthest用于记录每次可以跳跃到的最远距离,jumps用于记录最小的跳跃次数ÿ…...

MXNet安装:专业指南与深度解析
一、引言 MXNet是一个高效且灵活的深度学习框架,它支持多种编程语言和平台,并提供了丰富的深度学习算法和工具。随着深度学习技术的广泛应用,MXNet因其出色的性能和易用性受到了越来越多开发者和研究人员的青睐。本文将详细介绍MXNet的安装过…...

C++函数模板案例--数组封装
目录 一、数组封装的需求 案例描述: 二、实操 创建.hpp文件,编写数组类。 浅拷贝危害 拷贝构造函数 “”重载 尾插法 尾删法 “[]"重载 返回数组容量、大小 完整代码 编写.cpp文件,对自定义数组进行测试。 打印数组函数 test01测试函数…...

传统文字检测方法+代码实现
文章目录 前言传统文字检测方法1、基于最大稳定极值区域(MSER)的文字检测1.1 MSER(MSER-Maximally Stable Extremal Regions)基本原理代码实现——使用Opencv中的cv2.MSER_create()接口 2、基于笔画宽度变换(Stroke Wi…...

Jmeter从数据为查找结果集数据方法随笔
一、Jmeter连接数据库 1.下载对应数据库的驱动包到jmeter安装目录的lib下ext文件中,并导入到jmeter的测试计划中,本实例中使用的是mysql如下所示: 点击测试计划–>点击浏览–>选中mysql驱动jar包–>打开 2.添加线程组,…...

Objective-C网络请求开发的高效实现方法与技巧
前言 在移动应用开发中,网络请求是一项至关重要的技术。Objective-C作为iOS平台的主要开发语言之一,拥有丰富的网络请求开发工具和技术。本文将介绍如何利用Objective-C语言实现高效的网络请求,以及一些实用的技巧和方法。 1.Objective-C技…...

Java:OOP之术语或概念
■■ 编程和程序设计 ■□ 程序员和编程■ 程序员:programmer■ 编程:program, programming■ 面向过程:Process oriented■ 面向对象:object-oriented● 面向对象分析:OOA,全称Object-oriented Analysis●…...

内存地产风云录:malloc、free、calloc、realloc演绎动态内存世界的楼盘开发与交易大戏
欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看,已成习惯 创作不易,多多支持! 在这个波澜壮阔的内存地产世界中,malloc、free、calloc和realloc四位主角,共同演绎着一场场精彩绝伦的楼盘开…...

个人博客项目笔记_05
1. ThreadLocal内存泄漏 ThreadLocal 内存泄漏是指由于没有及时清理 ThreadLocal 实例所存储的数据,导致这些数据在线程池或长时间运行的应用中累积过多,最终导致内存占用过高的情况。 内存泄漏通常发生在以下情况下: 线程池场景下的 ThreadL…...

基础知识点全覆盖(1)
Python基础知识点 1.基本语句 1.注释 方便阅读和调试代码注释的方法有行注释和块注释 1.行注释 行注释以 **# **开头 # 这是单行注释2.块注释 块注释以多个 #、三单引号或三双引号(注意: 基于英文输入状态下的标点符号) # 类 # 似 # 于 # 多 # 行 # 效 # 果 这就是多行注释…...

异常处理java
在Java中,异常处理可以使用"throws"关键字或者"try-catch"语句。这两种方法有不同的用途和适用场景。 "throws"关键字: 在方法声明中使用"throws"关键字,表示该方法可能会抛出异常,但是并不立即处理…...

个人博客项目_09
1. 归档文章列表 1.1 接口说明 接口url:/articles 请求方式:POST 请求参数: 参数名称参数类型说明yearstring年monthstring月 返回数据: {"success": true, "code": 200, "msg": "succ…...

【2024年MathorCup数模竞赛】C题赛题与解题思路
2024年MathorCup数模竞赛C题 题目 物流网络分拣中心货量预测及人员排班背景求解问题 解题思路问题一问题二问题三问题四 本次竞赛的C题是对物流网络分拣中心的货量预测及人员排班问题进行规划。整个问题可以分为两个部分,一是对时间序列进行预测,二是对人…...

蓝桥杯省赛冲刺(3)广度优先搜索
广度优先搜索(Breadth-First Search, BFS)是一种在图或树等非线性数据结构中遍历节点的算法,它从起始节点开始,按层级逐步向外扩展,即先访问离起始节点最近的节点,再访问这些节点的邻居,然后是邻…...

网页内容生成图片,这18般武艺你会几种呢?
前言 关于【SSD系列】: 前端一些有意思的内容,旨在3-10分钟里, 500-1000字,有所获,又不为所累。 网页截图,windows内置了快捷命令和软件,chrome开发者工具也能一键截图,html2canva…...

pytest的时候输出一个F后面跟很多绿色的点解读
使用pytest来测试pyramid和kotti项目,在kotti项目测试的时候,输出一个F后面跟很多绿色的点,是什么意思呢? 原来在使用pytest进行测试时,输出中的“F”代表一个失败的测试(Failed),而…...

算法打卡day33
今日任务: 1)509. 斐波那契数 2)70. 爬楼梯 3)746.使用最小花费爬楼梯 509. 斐波那契数 题目链接:509. 斐波那契数 - 力扣(LeetCode) 斐波那契数,通常用 F(n) 表示,形成…...

《疯狂java讲义》Java AWT图形化编程中文显示
《疯狂java讲义》第六版第十一章AWT中文没有办法显示问题解决 VM Options设置为-Dfile.encodinggbk 需要增加变量 或者这边直接设置gbk 此外如果用swing 就不会产生这个问题了。...

Python3 标准库,API文档链接
一、标准库 即当你安装python3 后就自己携带的一些已经提供好的工具模块,工具类,可以专门用来某一类相关问题,达到辅助日常工作或者个人想法的一些成品库 类似的 C ,Java 等等也都有自己的标准库和使用文档 常见的一些: os 模块…...

【Web】CTFSHOW-ThinkPHP5-6反序列化刷题记录(全)
目录 web611 web612 web613-622 web623 web624-626 纯记录exp,链子不作赘述 web611 具体分析: ThinkPHP-Vuln/ThinkPHP5/ThinkPHP5.1.X反序列化利用链.md at master Mochazz/ThinkPHP-Vuln GitHub 题目直接给了反序列化入口 exp: <?ph…...

AR智能眼镜方案_MTK平台安卓主板芯片|光学解决方案
AR眼镜作为一种引人注目的创新产品,其芯片、显示屏和光学方案是决定整机成本和性能的关键因素。在这篇文章中,我们将探讨AR眼镜的关键技术,并介绍一种高性能的AR眼镜方案,旨在为用户带来卓越的体验。 AR眼镜的芯片选型至关重要。一…...

Android网络抓包--Charles
一、Android抓包方式 对Https降级进行抓包,降级成Http使用抓包工具对Https进行抓包 二、常用的抓包工具 wireshark:侧重于TCP、UDP传输层,HTTP/HTTPS也能抓包,但不能解密HTTPS报文。比较复杂fiddler:支持HTTP/HTTPS…...

【LeetCode热题100】238. 除自身以外数组的乘积(数组)
一.题目要求 给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 **不要使用除法,**且在…...

《哈迪斯》自带的Lua解释器是哪个版本?
玩过《哈迪斯》(英文名:Hades)吗?最近在研究怎么给这款游戏做MOD,想把它的振动体验升级到更高品质的RichTap。N站下载了一些别人做的MOD,发现很多都基于相同的格式,均是对游戏.sjon文件或.lua文…...

Java内存泄漏内存溢出
1.定义 OOM内存溢出是指应用程序尝试使用更多内存资源,而系统无足够的内存,导致程序崩溃。 内存泄漏是指应用程序中分配的内存未能被正确释放,导致系统中的可用内存逐渐减少。 2.内存泄漏的原因 可能包括对象引用未被释放、缓存未被清理等。 …...

【springboot】项目启动时打印全部接口方法
方法:在你springboot项目的基础上,创建下面的类: package com.llq.wahaha.listener;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework…...

单例19c RMAN数据迁移方案
一、环境说明 源库 目标库 IP 192.168.37.200 192.168.37.202 系统版本 RedHat 7.9 RedHat 7.9 数据库版本 19.3.0.0.0 19.3.0.0.0 SID beg beg hostname beg rman 数据量 1353M 说明:源库已经创建数据库实例,并且存在用户kk和他创建的表空间…...