Java连接Redis
Jedis是Redis官方推荐的Java连接开发工具。
api:https://tool.oschina.net/apidocs/apidoc?api=jedis-2.1.0
一、 导入包
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version>
</dependency>
二、创建工具类 RedisUtil
package com.utils;import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;public class RedisUtil {//Redis服务器IPprivate static String ADDR = "127.0.0.1";//Redis的端口号private static int PORT = 6379;//访问密码private static String AUTH = "123456";//可用连接实例的最大数目,默认值为8;//如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。private static int MAX_ACTIVE = 1024;//控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。private static int MAX_IDLE = 200;//等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException;private static int MAX_WAIT = 10000;private static int TIMEOUT = 10000;//在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;private static boolean TEST_ON_BORROW = true;private static JedisPool jedisPool = null;//初始化redis连接池static {JedisPoolConfig config = new JedisPoolConfig();config.setMaxIdle(MAX_IDLE);config.setMaxWaitMillis(MAX_WAIT);config.setTestOnBorrow(TEST_ON_BORROW);//配置,IP,端口,超时时间,密码jedisPool = new JedisPool(config,ADDR,PORT,TIMEOUT,AUTH);}//获取Jedis实例public synchronized static Jedis getJedis(){if(jedisPool!=null){Jedis jedis = jedisPool.getResource();return jedis;}else{return null;}}//释放jedis资源public static void returnResource(Jedis jedis){if(jedis!=null){jedisPool.returnResource(jedis);}}}
三、在测试类中测试

测试代码
//redis存储字符串 string@Testpublic void testString(){jedis.select(2);jedis.set("name","laowang");jedis.set("name","laoli");System.out.println(jedis.get("name"));jedis.set("age","18");System.out.println(jedis.get("age"));//拼接jedis.append("name"," is my love");System.out.println(jedis.get("name"));//删除jedis.del("age");System.out.println(jedis.get("age"));//设置多个键值对jedis.mset("sname","laozhang","sage","28","qq","11223344");jedis.incr("sage");//加1操作System.out.println(jedis.get("sname")+"-"+jedis.get("sage")+"-"+jedis.get("qq"));}//redis操作hash--java里面操作Map map<String,String>@Testpublic void testMap(){Map<String,String> map = new HashMap<>();map.put("name","laozhang");map.put("age","16");map.put("qq","123456");jedis.hmset("user",map);List<String> rsmap = jedis.hmget("user", "name", "age", "qq");System.out.println(rsmap);//删除map中某一个键jedis.hdel("user","age");System.out.println(jedis.hmget("user","age"));//删除了age的key 获取nullSystem.out.println(jedis.hlen("user"));//返回user的键中还有几个valueSystem.out.println(jedis.exists("user"));//是否存在某个keySystem.out.println(jedis.hkeys("user"));//返回map对象中所有的keySystem.out.println(jedis.hvals("user"));//返回map对象中所有的valueIterator<String> iterator = jedis.hkeys("user").iterator();while (iterator.hasNext()){String key = iterator.next();System.out.println(key+":"+jedis.hmget("user",key));}}/*** jedis操作List-- java里面操作的是List<String>*/@Testpublic void testList() {//开始前,先移除所有的内容jedis.del("java framework");System.out.println(jedis.lrange("java framework", 0, -1));//先向key java framework中存放三条数据jedis.lpush("java framework", "spring");//redis的list类型 每个元素都是stringjedis.lpush("java framework", "struts");jedis.lpush("java framework", "hibernate");//再取出所有数据jedis.lrange是按范围取出,// 第一个是key,第二个是起始位置,第三个是结束位置,jedis.llen获取长度 -1表示取得所有System.out.println(jedis.lrange("java framework", 0, -1));jedis.del("java framework");jedis.rpush("java framework", "spring");jedis.rpush("java framework", "struts");jedis.rpush("java framework", "hibernate");System.out.println(jedis.lrange("java framework", 0, -1));}/*** jedis操作Set -- 在java里面返回的Set<String>或List<String>* (例如System.out.println(jedis.srandmember("user1"));时返回的就是一个List<String>)* 但是set类型本身是一个无序+不重复的list == java Set*/@Testpublic void testSet() {//添加jedis.sadd("user1", "liuling");jedis.sadd("user1", "xinxin");jedis.sadd("user1", "ling");jedis.sadd("user1", "zhangxinxin");jedis.sadd("user1", "who");//移除其中一个元素jedis.srem("user1", "who");System.out.println(jedis.smembers("user1"));//获取所有加入的valueSystem.out.println(jedis.sismember("user1", "who"));//判断 who 是否是user集合的元素//随机元素System.out.println(jedis.srandmember("user1"));System.out.println(jedis.scard("user1"));//返回集合的元素个数}//jedis操作zset -- java返回的是 Set<String> 排序+不重复的list 有点像 java TreeSet@Testpublic void test() throws InterruptedException {//如果要实现有序的集合,可以考虑使用list来排序(不去重)//注意,此处的rpush和lpush是List的操作。是一个双向链表(但从表现来看的)jedis.del("a");//先清除数据,再加入数据进行测试jedis.rpush("a", "1");jedis.lpush("a", "6");jedis.lpush("a", "3");jedis.lpush("a", "9");System.out.println(jedis.lrange("a", 0, -1));// [9, 3, 6, 1]System.out.println(jedis.sort("a")); //[1, 3, 6, 9] //输入排序后结果//使用zset类型实现有序集合去重//使用zadd命令 成绩排序 升序jedis.zadd("scoreList",100.0,"张三");jedis.zadd("scoreList",70.0,"李四");jedis.zadd("scoreList",85.5,"王朝");jedis.zadd("scoreList",100.0,"马汉");jedis.zadd("scoreList",90.0,"马汉");//展示全部System.out.println(jedis.zrange("scoreList",0,-1));}
四、Redis类型的使用场景
1、Redis 字符串(String)
典型应用场景:
1.作为缓存 -- 数据分两类冷数据与热数据,热数据表示经常使用的时常发生变化的数据但是对数据一致性要求不高的数据,如一个视频的点击量,某文件的浏览次数,某商品的日月销量,系统消息以及用户消息这些热数据都可以用Redis来做
2.限制某段时间内的访问次数,就比如我们登录的功能可以用手机获取验证码登录,但是我们发送验证码使用的第三方,是多少钱多少条的,肯定不能让他一直点,一直发短信,就算前端js做了校验,若有些人绕过前台就麻烦了,这时候可以用redis的incr命令和expire结合起来做一个解决方案
3.用于限流:计数器
举个栗子:
我们在双十一经常会有一些秒杀场景,比如我们现在需要秒杀一百台0.01元的手机,库存设置100。可想而知,会有很多十万甚至百万级别的用户都在等待到点抢手机,在使用redis之前,我们的流程是这样的,即所有的并发压力都压在服务(如果你服务不拦截,就压在数据库上),很可能高并发会彻底搞垮的服务或数据库:

使用redis之后:

2、Redis 哈希(Hash)
典型应用场景:
记录帖子的标题、摘要、作者和封面信息,用于列表页展示
记录帖子的点赞数、评论数和点击数
保存一个商品信息,该信息同时带有多个商品属性,就可以考虑使用hash的数据格式进行存储。但这种场景也可以考虑使用StringKey+jsonValue的情况来实现。两种方案中,如果商品信息可能会频繁变更,hash类型会更占优势。
3、Redis 列表(List)
典型使用场景:
简单的消息队列:
不推荐,不可靠,且市面上已有很多成熟的消息队列产品。
消息队列本身需要保证消息顺序不打乱、不处理重复的消息和保证消息可靠性。
如果我们一定要使用list类型实现消息队列,我们需要:
实现保证消息顺序
list类型可以支持。生产者使用LPUSH把消息写入队列,消费者使用RPOP把消息从队列中读取出来。
消息可靠性保证(如果消息出栈消费者就宕机没处理上如何保证可靠)
消费者从List中获取一条消息后,List不会再有这条消息的留存了,但是如果消费者获取了消息,但是还没来得及处理消费者就宕机了,那么这条消息就丢失了。为了解决留存问题。List类型提供了BRPOPLPUSH命令,这个命令的作用是让消费者程序从一个List中读取消息,同时,Redis会自动把这个消息再插入到另一个List(可以叫作备份List)留存,这样就可以保证消息可靠。
消息不重复处理保证(一个消息不处理两次)
list类型本身不能实现这个效果,我们需要在list的设计中加入唯一id自行保证。
分页展示
获取最新的列表(最新评论等等)
4、Zset有序集合
典型场景
排行版(例如热度榜、分类热榜)
虽然有序集合的成员是唯一的,但是分数(score)却可以重复。就比如在一个班中,学生的学号是唯一的,但是每科成绩却是可以一样的,redis可以利用有序集合存储学生成绩快速做成绩排名功能。
根据点赞数展示...
例如记录帖子的点赞用户 ID 列表,评论 ID 列表,用于显示(zset同时带有排序加去重)
5、Set(集合)
典型应用场景
好友/关注/粉丝/感兴趣的人集合
随机展示
相关文章:

Java连接Redis
Jedis是Redis官方推荐的Java连接开发工具。api:https://tool.oschina.net/apidocs/apidoc?apijedis-2.1.0一、 导入包<!-- https://mvnrepository.com/artifact/redis.clients/jedis --> <dependency><groupId>redis.clients</groupId><…...
Python语言零基础入门教程(十六)
Python 模块 Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。 模块让你能够有逻辑地组织你的 Python 代码段。 把相关的代码分配到一个模块里能让你的代码更好用,更易懂。 模块能定…...

SAP ERP系统SD模块常用增强之一:VA01/VA02创建或修改SO的输入检查
在SAP/ERP项目的实施中销售管理模块(SD)的创建和修改销售订单必定会有输入字段校验检查的需求,来防止业务人员录入错误或少录入数据,SAP公司也考虑到这一点,所以这方面的配置功能也非常强大,通常情况下不需…...

深度学习知识补充
候选位置(proposal) RCNN 什么时ROI? 在图像处理领域,感兴趣区域(region of interest , ROI) 是从图像中选择的一个图像区域,这个区域是你的图像分析所关注的重点。圈定该区域以便进行进一步处理。使用ROI圈定你想读的目标&…...

Vue笔记(1)——数据代理与绑定
一、初始Vue 1.想让Vue工作,就必须创建一个Vue实例,且要传入一个配置对象; 2.root容器里的代码依然符合html规范,只不过混入了一些特殊的Vue语法; 3.root容器里的代码被称为【Vue模板】; 4.Vue实例和容器是…...

LeetCode题目笔记——2563. 统计公平数对的数目
文章目录题目描述题目链接题目难度——中等方法一:排序双指针代码/Python代码/C方法二代码/Python总结题目描述 这是前天周赛的第二题。 统计公平数对的数目 - 给你一个下标从 0 开始、长度为 n 的整数数组 nums ,和两个整数 lower 和 upper ,…...
【MySQL Shell】8.9.5 将集群重新加入到 InnoDB ClusterSet
如果 InnoDB 集群是 InnoDB ClusterSet 部署的一部分,MySQL Shell 会在重新启动后立即自动将其恢复到拓扑中的角色,前提是其运行正常且未被标记为无效。但是,如果集群被标记为无效或其 ClusterSet 复制通道已停止,则必须使用 clus…...
元素水平垂直居中的方法有哪些?如果元素不定宽高呢?
实现元素水平垂直居中的方式: 利用定位margin:auto利用定位margin:负值利用定位transformtable布局flex布局grid布局 1-利用定位margin:auto <style>.father{width:500px;height:300px;border:1px solid #0a3b98;position: relative;}.son{width:100px;heig…...
访问学者在新加坡访学生活日常花销大吗?
新加坡地理位置优越,社会发达,教学质量好,吸引不少国内学生前往新加坡留学、访学。那么,去新加坡访学,访问学者花销需要多少钱呢?下面和51访学网小编一起来了解一下吧。 一、饮食 新加坡的饮食从很亲民的…...

XCP实战系列介绍11-几个常用的XCP命令解析
本文框架 1.概述2. 常用命令解析2.1 CONNECT连接(0xFF)2.2 SHORT_UPLOAD 命令(0xF4)2.2 SET_MTA (0xF6)2.3 MOVE命令(0x19)2.4 GET_CAL_PAGE(0xEA)2.5 SET_CAL_PAGE(0xEB)2.6 DOWNLOAD(0xF0)1.概述 在文章《看了就会的XCP协议介绍》中详细介绍了XCP的协议,在《XCP实战系列介绍…...

全志V853芯片 如何在Tina V85x平台切换sensor?
目的 V85x某方案目前默认Sensor是GC2053。实际使用时若需要用到GC4663(比如wdr功能)和SC530AI(支持500W),可按如下步骤完成切换。 步骤 下面以GC4663为例,SC530AI按相应方式适配。 Step1 检查Sensor驱动…...

2023全网最火的接口自动化测试,一看就会
目录 接口自动化测试用例设计Excel接口测试用例访问MySQL接口测试用例访问PyTest测试框架接口自动化测试必备技能-HTTP协议request库实现接口请求 引言 与UI相比,接口一旦研发完成,通常变更或重构的频率和幅度相对较小。因此做接口自动化的性价比更高&…...
华为OD机试真题JAVA实现【最小传递延迟】真题+解题思路+代码(20222023)
🔥系列专栏 华为OD机试(JAVA)真题目录汇总华为OD机试(Python)真题目录汇总华为OD机试(C++)真题目录汇总华为OD机试(JavaScript)真题目录汇总文章目录 🔥系列专栏题目输入输出示例一输入输出说明解题思路核心知识点Code运行结果版权说...

Transformer
Transformer由4部分组成,分别是:输入模块、编码模块、解码模块、输出模块整体架构图:一、输入模块结构 (1)源文本嵌入层及其位置编码器(2)目标文本嵌入层及其位置编码器二、编码器模块结构由N个…...

并发包工具之 批量处理任务 CompletionService(异步)、CompletableFuture(回调)
文章目录一、处理异步任务并获取返回值——CompletionService二、线程池三、Callable 与 Future四、通过回调方式处理可组合编排任务——CompletableFuture一、处理异步任务并获取返回值——CompletionService 特点描述: 对于比较复杂的计算,把…...

验收测试分类
α测试 Alpha 是内测版本,即现在所说的CB。 此版本表示该软件仅仅是一个初步完成品, 通常只在软件开发者内部交流, 也有很少一部分发布给专业测试人员。 一般而言, 该版本软件的bug 较多, 普通用户最好不要安装。 β测试 Beta是公测版本,是对所有用户…...

因新硬件支持内核问题Ubuntu 22.04.2推迟发布
导读Ubuntu 22.04.2 LTS 原定于 2 月 9 日发布。但 Canonical 宣布该版本因各种问题不得不推迟两周,定于 2 月 23 日发布。 Ubuntu 22.04.2 LTS 原定于 2 月 9 日发布。但 Canonical 宣布该版本因各种问题不得不推迟两周,定于 2 月 23 日发布。 Canonica…...

agent扩展-自定义外部加载路径
自定义classLoader实现加载外部jar, 以skywalking agent 类加载器为例子 整体思路 扩展findClass ,解决loadClass可以查找到扩展findResource,解决getResources可以获取到资源 基本原理 ClassLoader loadClass的加载顺序 findLoadedClass 加载本地已经…...
Elasticsearch使用篇 - 指标聚合
指标聚合 指标聚合从聚合文档中提取出指标进行计算。可以从文档的字段或者使用脚本方式进行提取。 聚合统计可以同时返回明细数据,可以分页查询,可以返回总数量。 可以结合查询条件,限制数据范围,结合倒排索引列式存储。 指标…...
Python生命周期及内存管理
文章目录 一、Python的生命周期 1、概念2、如何监听生命周期二、内存管理 1.存储2.垃圾回收3.引用计数一、生命周期: 1、概念:一个对象从创建到消亡的过程 当一个对象呗创建是,会在内存中分配响应的内存空间进行存储 当这个对象不再使…...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...

华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...

DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...

【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...

Java后端检查空条件查询
通过抛出运行异常:throw new RuntimeException("请输入查询条件!");BranchWarehouseServiceImpl.java // 查询试剂交易(入库/出库)记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...
Java并发编程实战 Day 11:并发设计模式
【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天,今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案,它们不仅提供了优雅的设计思路,还能显著提升系统的性能…...
比特币:固若金汤的数字堡垒与它的四道防线
第一道防线:机密信函——无法破解的哈希加密 将每一笔比特币交易比作一封在堡垒内部传递的机密信函。 解释“哈希”(Hashing)就是一种军事级的加密术(SHA-256),能将信函内容(交易细节…...

react更新页面数据,操作页面,双向数据绑定
// 路由不是组件的直接跳转use client,useEffect,useRouter,需3个结合, use client表示客户端 use client; import { Button,Card, Space,Tag,Table,message,Input } from antd; import { useEffect,useState } from react; impor…...