【Redis】快速入门 数据类型 常用指令 在Java中操作Redis

文章目录

  • 一、简介
  • 二、特点
  • 三、下载与安装
  • 四、使用
    • 4.1 服务器启动
    • 4.2 客户端连接命令
    • 4.3 修改Redis配置文件
    • 4.4 客户端图形化界面
  • 五、数据类型
    • 5.1 五种常用数据类型介绍
    • 5.2 各种数据类型特点
  • 六、常用命令
    • 6.1 字符串操作命令
    • 6.2 哈希操作命令
    • 6.3 列表操作命令
    • 6.4 集合操作命令
    • 6.5 有序集合操作命令
    • 6.6 通用命令
  • 七、在Java中操作Redis
    • 7.1 Redis的Java客户端
    • 7.2 Spring Data Redis使用方式
      • 7.2.1 介绍
      • 7.2.2 环境搭建
      • 7.2.3 操作常见类型数据
        • 1. 操作字符串类型数据
        • 2. 操作哈希类型数据
        • 3. 操作列表类型数据
        • 4. 操作集合类型数据
        • 5. 操作有序集合类型数据
        • 6. 通用命令操作


一、简介

Redis是一个基于内存的key-value结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件

官网: https://redis.io
中文网: https://www.redis.net.cn/

二、特点

主要特点:

  • 基于内存存储,读写性能高
  • 适合存储热点数据(热点商品、资讯、新闻)
  • 企业应用广泛

Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,官方提供的数据是可以达到100000+的QPS(每秒内查询次数)。它存储的value类型比较丰富,也被称为结构化的NoSql数据库。

NoSql(Not Only SQL),不仅仅是SQL,泛指非关系型数据库。NoSql数据库并不是要取代关系型数据库,而是关系型数据库的补充。

关系型数据库(RDBMS):

  • Mysql
  • Oracle
  • DB2
  • SQLServer

非关系型数据库(NoSql):

  • Redis
  • Mongo db
  • MemCached

三、下载与安装

下载:
Redis安装包分为windows版和Linux版:

  • Windows版下载地址:https://github.com/microsoftarchive/redis/releases
  • Linux版下载地址: https://download.redis.io/releases/

安装 :
PC 直接 解压缩,解压后目录结构:
1

四、使用

4.1 服务器启动

tab补全即可:

redis-server.exe redis.windows.conf

Redis服务默认端口号为 6379 ,通过快捷键Ctrl + C 即可停止Redis服务

当Redis服务启动成功后,可通过客户端进行连接。

4.2 客户端连接命令

redis-cli.exe

通过redis-cli.exe命令默认连接的是本地的redis服务,并且使用默认6379端口。也可以通过指定如下参数连接:

  • -h ip地址
  • -p 端口号
  • -a 密码(如果需要)

4.3 修改Redis配置文件

设置Redis服务密码,修改redis.windows.conf

文件查找:password

requirepass 123456

注意:

  • 修改密码后需要重启Redis服务才能生效
  • Redis配置文件中 # 表示注释

重启Redis后,再次连接Redis时,需加上密码,否则连接失败。

redis-cli.exe -h localhost -p 6379 -a 123456

此时,-h 和 -p 参数可省略不写。

4.4 客户端图形化界面

启动服务器后,直接使用客户端的图形化工具。
1
连接成功!
1

五、数据类型

5.1 五种常用数据类型介绍

Redis存储的是key-value结构的数据,其中key字符串类型,value有5种常用的数据类型:

  • 字符串 string
  • 哈希 hash
  • 列表 list
  • 集合 set
  • 有序集合 sorted set / zset

5.2 各种数据类型特点

1
解释说明:

  • 字符串(string):普通字符串,Redis中最简单的数据类型
  • 哈希(hash):也叫散列,类似于Java中的HashMap结构
  • 列表(list):按照插入顺序排序,可以有重复元素,类似于Java中的LinkedList
  • 集合(set):无序集合,没有重复元素,类似于Java中的HashSet
  • 有序集合(sorted set/zset):集合中每个元素关联一个分数(score),根据分数升序排序,没有重复元素

六、常用命令

6.1 字符串操作命令

Redis 中字符串类型常用命令:

  • SET key value 设置指定key的值
  • GET key 获取指定key的值
  • SETEX key seconds value 设置指定key的值,并将 key 的过期时间设为 seconds 秒
  • SETNX key value 只有在 key 不存在时设置 key 的值

更多命令-参考官网

6.2 哈希操作命令

Redis hash 是一个string类型的 field 和 value 的映射表,hash特别适合用于存储对象,常用命令:

  • HSET key field value 将哈希表 key 中的字段 field 的值设为 value
  • HGET key field 获取存储在哈希表中指定字段的值
  • HDEL key field 删除存储在哈希表中的指定字段
  • HKEYS key 获取哈希表中所有字段
  • HVALS key 获取哈希表中所有值

1
1

6.3 列表操作命令

Redis 列表是简单的字符串列表,按照插入顺序排序,常用命令:

  • LPUSH key value1 [value2] 将一个或多个值插入到列表头部
  • LRANGE key start stop 获取列表指定范围内的元素
    • lrange mylist 0 -1 将列表数据全打印
  • RPOP key 移除并获取列表最后一个元素
    • 类似队列的POP,最先插入的在最前面,先取出
  • LLEN key 获取列表长度
  • BRPOP key1 [key2 ] timeout 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超 时或发现可弹出元素为止

1
队列结构 push pop
1

6.4 集合操作命令

  • Redis set 是string类型的无序集合
  • 集合成员是唯一的,这就意味着集合中不能出现重复的数据

常用命令:

  • SADD key member1 [member2] 向集合添加一个或多个成员
  • SMEMBERS key 返回集合中的所有成员
  • SCARD key 获取集合的成员数
  • SINTER key1 [key2] 返回给定所有集合的交集
  • SUNION key1 [key2] 返回所有给定集合的并集
  • SREM key member1 [member2] 移除集合中一个或多个成员

1
1

6.5 有序集合操作命令

Redis有序集合是string类型元素的集合,且不允许有重复成员。每个元素都会关联一个double类型的分数。常用命令:

常用命令:

  • ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员
  • ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合中指定区间内的成员
  • ZINCRBY key increment member 有序集合中对指定成员的分数加上增量 increment
  • ZREM key member [member …] 移除有序集合中的一个或多个成员

在这里插入图片描述
1

6.6 通用命令

Redis的通用命令是不分数据类型的,都可以使用的命令:

  • KEYS pattern 查找所有符合给定模式( pattern)的 key
    • keys *
    • keys set*
  • EXISTS key 检查给定 key 是否存在
  • TYPE key 返回 key 所储存的值的类型
  • DEL key 该命令用于在 key 存在是删除 key

七、在Java中操作Redis

7.1 Redis的Java客户端

使用Redis的Java客户端,如同我们使用JDBC操作MySQL数据库一样。

Redis 的 Java 客户端很多,常用的几种:

  • Jedis
  • Lettuce
  • Spring Data Redis

Spring 对 Redis 客户端进行了整合,提供了 Spring Data Redis,在Spring Boot项目中还提供了对应的Starter,即 spring-boot-starter-data-redis

7.2 Spring Data Redis使用方式

Spring-Data-Redis-官方文档

7.2.1 介绍

Spring Boot提供了对应的Starter,maven坐标:

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

Spring Data Redis中提供了一个高度封装的类:RedisTemplate,对相关api进行了归类封装,将同一类型操作封装为operation接口,具体分类如下:

  • ValueOperations:string数据操作
  • SetOperations:set类型数据操作
  • ZSetOperations:zset类型数据操作
  • HashOperations:hash类型的数据操作
  • ListOperations:list类型的数据操作

7.2.2 环境搭建

  1. 导入Spring Data Redis的maven坐标:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  1. 配置Redis数据源
    在application-dev.yml中添加:
sky:redis:host: localhostport: 6379password: 123456database: 10

解释说明:

  • database:指定使用Redis的哪个数据库,
  • Redis服务启动后默认有16个数据库,编号分别是从0到15。
  • 1
  • 可以通过修改Redis配置文件来指定数据库的数量。
  • 不同数据库的数据是完全隔离的

application.yml中添加读取application-dev.yml中的相关Redis配置:

spring:profiles:active: devredis:host: ${sky.redis.host}port: ${sky.redis.port}password: ${sky.redis.password}database: ${sky.redis.database}
  1. 编写配置类,创建RedisTemplate对象
@Configuration
@Slf4j
public class RedisConfiguration {@Beanpublic RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {log.info("开始创建redis模板工厂....");RedisTemplate redisTemplate = new RedisTemplate();// 设置redis的连接工厂对象redisTemplate.setConnectionFactory(redisConnectionFactory);// 设置redis key 的序列化器redisTemplate.setKeySerializer(new StringRedisSerializer());return redisTemplate;}
}

解释说明:

  • 当前配置类不是必须的,因为 Spring Boot 框架会自动装配 RedisTemplate 对象,
  • 但是默认的key序列化器JdkSerializationRedisSerializer,导致我们存到Redis中后的数据和原始数据有差别,
  • 故设置为StringRedisSerializer序列化器。
  1. 通过RedisTemplate对象操作Redis
@SpringBootTest(classes = SkyApplication.class)
public class SpringDataRedisTest {@Autowiredprivate RedisTemplate redisTemplate;@Testpublic void testRedisTemplate(){System.out.println(redisTemplate);//string数据操作ValueOperations valueOperations = redisTemplate.opsForValue();//hash类型的数据操作HashOperations hashOperations = redisTemplate.opsForHash();//list类型的数据操作ListOperations listOperations = redisTemplate.opsForList();//set类型数据操作SetOperations setOperations = redisTemplate.opsForSet();//zset类型数据操作ZSetOperations zSetOperations = redisTemplate.opsForZSet();}
}

1
说明RedisTemplate对象注入成功,并且通过该RedisTemplate对象获取操作5种数据类型相关对象。

7.2.3 操作常见类型数据

1

1. 操作字符串类型数据

1

    /*** 操作字符串*/@Testpublic void testString(){// set get setex setnxredisTemplate.opsForValue().set("name","道格维克");String name = (String) redisTemplate.opsForValue().get("name");System.out.println(name);redisTemplate.opsForValue().set("code","7896",2, TimeUnit.MINUTES);redisTemplate.opsForValue().setIfAbsent("lock","1");redisTemplate.opsForValue().setIfAbsent("lock","2");}
2. 操作哈希类型数据
  /*** 操作哈希类型的数据*/@Testpublic void testHash(){//hset hget hdel hkeys hvalsHashOperations hashOperations = redisTemplate.opsForHash();hashOperations.put("100","name","doug");hashOperations.put("100","age","25");String name = (String) hashOperations.get("100", "name");System.out.println(name);Set keys = hashOperations.keys("100");System.out.println(keys);List values = hashOperations.values("100");System.out.println(values);hashOperations.delete("100","age");}

1

3. 操作列表类型数据
    /*** 操作列表类型的数据*/@Testpublic void testList() {//lpush lrange rpop llenListOperations listOperations = redisTemplate.opsForList();listOperations.leftPushAll("mylist","a","b","c");listOperations.leftPush("mylist","d");List mylist = listOperations.range("mylist", 0, -1);System.out.println(mylist);listOperations.rightPop("mylist");Long size = listOperations.size("mylist");System.out.println(size);}

在这里插入图片描述

4. 操作集合类型数据
    /*** 操作集合类型的数据*/@Testpublic void testSet() {//sadd smembers scard sinter sunion sremSetOperations setOperations = redisTemplate.opsForSet();setOperations.add("set1","a","b","c","d");setOperations.add("set2","a","b","x","y");Set set1 = setOperations.members("set1");System.out.println("set1 = " + set1);Long size = setOperations.size("set1");System.out.println("size = " + size);Set intersect = setOperations.intersect("set1", "set2");System.out.println("intersect = " + intersect);Set union = setOperations.union("set1", "set2");System.out.println("union = " + union);setOperations.remove("set1","a","b");}

1
1

5. 操作有序集合类型数据
    /*** 操作有序集合类型的数据*/@Testpublic void testZSet() {//zadd zrange zincrby zremZSetOperations zSetOperations = redisTemplate.opsForZSet();zSetOperations.add("zset1","a",11.1);zSetOperations.add("zset1","b",22.2);zSetOperations.add("zset1","c",44.4);Set zset1 = zSetOperations.range("zset1", 0, -1);System.out.println("zset1 = " + zset1);zSetOperations.incrementScore("zset1","c",33.3);//给c增加33.3zSetOperations.remove("zset1","a","b");}

1
在这里插入图片描述

6. 通用命令操作
    /*** 通用命令操作*/@Testpublic void testCommon() {//keys exists type delSet keys = redisTemplate.keys("*");System.out.println("keys = " + keys);Boolean name = redisTemplate.hasKey("name");Boolean set1 = redisTemplate.hasKey("set1");for (Object key : keys) {DataType type = redisTemplate.type(key);System.out.println(type);}redisTemplate.delete("mylist");}

1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/774205.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java_17 两数之和

两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任…

Day35 ● 860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球

● 860.柠檬水找零 class Solution:def lemonadeChange(self, bills: List[int]) -> bool:fiveten0for bill in bills:if bill5:five1elif bill10:five-1ten1elif bill20 and ten!0:five-1ten-1else:five-3if five<0:return Falsereturn True ● 406.根据身高重建队列 cl…

光伏百科|分布式光伏电站如何开展运维管理工作?

随着经济的不断发展和生活水平的日益提高&#xff0c;节能环保已经成为全社会的责任和共识&#xff0c;分布式光伏电站作为清洁能源走进了千家万户。然而&#xff0c;在分布式光伏电站运行期间&#xff0c;面临监管困难、系统繁多、火灾隐患和运维不当等困难&#xff0c;该如何…

推特社交机器人分类

机器人有不同的种类。 cresci-17数据集中的三种不同的机器人类:传统垃圾机器人、社交垃圾机器人和假追随者。 传统的垃圾邮件机器人会生成大量推广产品的内容&#xff0c;并且可以通过频繁使用的形容词来检测; 社交垃圾邮件倾向于攻击或支持政治候选人&#xff0c;因此情绪是一…

ES5和ES6的深拷贝问题

深拷贝我们知道是引用值的一个问题&#xff0c;因为在拷贝的时候&#xff0c;拷贝的是在内存中同一个引用。所以当其中的一个应用值发生改变的时候&#xff0c;其他的同一个引用值也会发生变化。那么针对于这种情况&#xff0c;我们需要进行深度拷贝&#xff0c;这样就可以做到…

高效篇02-如何选择适合自己的工作/如何选择offer

前言 你有没有遇到以下3个问题。 1、对当前工作不满意&#xff0c;但是好像不知道具体哪里不满意。 2、有想要换工作的想法&#xff0c;但是不知道该换一个什么样的工作。 3、已经在找工作了&#xff0c;说不定手上也有几份 offer 了&#xff0c;但是不知道该如何选择。 在这篇…

Spring是如何解决循环依赖问题的?

目录 问题介绍什么是Spring中的三级缓存?Spring中的三级缓存是如何解决循环依赖问题的?解决Spring循环依赖问题一定需要第三级缓存吗?解决Spring循环依赖问题一定需要第二级缓存吗?什么场景下的Spring循环依赖问题无法解决?采用了构造器的注入方式相互依赖的bean都是原型b…

代码随想录算法训练营DAY7| C++哈希表Part.2|LeetCode:454.四数相加II、383.赎金信、15. 三数之和、18.四数之和

文章目录 454.四数相加II思路C代码 383.赎金信C 代码 15. 三数之和排序哈希法思路C代码 排序双指针法思路去重C代码 18.四数之和前言剪枝C代码 454.四数相加II 力扣题目链接 文章链接&#xff1a;454.四数相加II 视频链接&#xff1a;学透哈希表&#xff0c;map使用有技巧&…

工业物联网关的应用及相关产品-天拓四方

随着科技的飞速发展&#xff0c;智能制造业已成为工业领域的转型方向。在这一转变中&#xff0c;工业物联网关发挥着至关重要的作用。作为连接物理世界与数字世界的桥梁&#xff0c;工业物联网关不仅实现了设备与设备、设备与云平台之间的互联互通&#xff0c;更通过实时数据采…

0.96寸OLED屏调试 ----(四)

所需设备&#xff1a; 1、USB 转 SPI I2C 适配器&#xff1b;内附链接 2、0.96寸OLED显示模块&#xff1b; 备注&#xff1a;专业版、升级版都适用&#xff1b; 继续我们OLED模块的熟悉 &#xff1a; 指令详解 基础指令 1.设置对比度 &#xff08;81HA[7:0]&#xff09;  …

兼顾陪读|本科学历律师自费赴美国加州大学伯克利分校访学

S律师拟陪同孩子赴海外就读&#xff0c;决定以访问学者身份&#xff0c;申请美国J类签证出国以兼顾陪读。因本科学历&#xff0c;无文章且有地域要求&#xff0c;自己申请无果后做了全权委托。为此我们酌情制定了三条申请策略&#xff0c;最终落实加州大学伯克利分校的访学职位…

AI大模型学习——AI领域技术发展

目录 前言 一、AI大模型学习的理论基础 二、AI大模型的训练与优化 三、AI大模型在特定领域的应用 四、AI大模型学习的伦理与社会影响 五、未来发展趋势与挑战 总结 前言 在当前技术环境下&#xff0c;AI大模型学习不仅要求研究者具备深厚的数学基础和编程能力&#xff…

鸿蒙打包so及引用

一、打包so 1. 环境&#xff0c;DevEco Studio3.1 2. 创建c工程 创建完成后&#xff0c;如下图&#xff1a; 3. 打包so 先配置 然后 二、引用so 1. 新建普工项目 2. 在src同一层级下创建libs文件夹&#xff0c;将so文件拷入 3. 将c工程中的侧接口文件及声明文件复制到项目…

协程库-锁类-实现线程互斥同步

mutex.h&#xff1a;信号量&#xff0c;互斥锁&#xff0c;读写锁&#xff0c;范围锁模板&#xff0c;自旋锁&#xff0c;原子锁 锁 **锁不能进行拷贝操作&#xff1a;**锁是用于管理多线程并发访问共享资源的同步原语。这些锁包括互斥锁&#xff08;mutex&#xff09;、读写锁…

AI智能分析网关V4使用GB28181注册到EasyCVR平台的具体步骤

旭帆科技的智能分析网关V4内含近40种智能分析算法&#xff0c;包括人体、车辆、消防、环境卫生、异常检测等等&#xff0c;在消防安全、生产安全、行为检测等场景应用十分广泛。如常见的智慧工地、智慧校园、智慧景区、智慧城管等等&#xff0c;还支持抓拍、记录、告警、语音对…

小黑的Vue前端之路:js中通过构造函数封装,设置对象getter和setter方法

js中构造函数创建对象 JavaScript本身并不是设计成面向对象的,所以没有class之类的关键字用来定义类,但JavaScript本身相当灵活,可以利用function关键字来定义类并创建对象。 例如js创建person对象 通过new关键字&#xff0c;把函数当成了创建对象的构造函数 function Pers…

某康安全开发工程师一面

一、反射型XSS跟DOM型XSS的最大区别 DOM型xss和别的xss最大的区别就是它不经过服务器&#xff0c;仅仅是通过网页本身的JavaScript进行渲染触发的。 二、Oracle数据库了解多吗 平常用的多的是MySQL数据库&#xff0c;像Oracle数据库也有了解&#xff0c;但是用的不多。 三、…

Fastjson反序列化漏洞原理与漏洞复现(基于vulhub靶场)

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…

【码银送书第十五期】一本书掌握数字化运维方法,构建数字化运维体系

前言 数字化转型已经成为大势所趋&#xff0c;各行各业正朝着数字化方向转型&#xff0c;利用数字化转型方法论和前沿科学技术实现降本、提质、增效&#xff0c;从而提升竞争力。 数字化转型是一项长期工作&#xff0c;包含的要素非常丰富&#xff0c;如数字化转型顶层设计、…

macOS Sonoma 14.4.1 (23E224) 正式版发布,ISO、IPSW、PKG 下载

macOS Sonoma 14.4.1 (23E224) 正式版发布&#xff0c;ISO、IPSW、PKG 下载 2024 年 3 月 26 日凌晨&#xff0c;macOS Sonoma 14.4.1 更新修复了一个可能导致连接到外部显示器的 USB 集线器无法被识别的问题。它还解决了可能导致 Java 应用程序意外退出的问题&#xff0c;并修…