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、概念:一个对象从创建到消亡的过程 当一个对象呗创建是,会在内存中分配响应的内存空间进行存储 当这个对象不再使…...
Elasticsearch7.8.0版本进阶——数据写流程
目录一、数据写流程概述二、数据写流程步骤2.1、数据写流程图2.2、数据写流程步骤(新建索引和删除文档所需要的步骤顺序)2.3、数据写流程的请求参数一、数据写流程概述 新建、删除索引和新建、删除文档的请求都是写操作, 必须在主分片上面完…...
化学试剂Glutaric Acid-PEG-Glutaric Acid,GA-PEG-GA,戊二酸-聚乙二醇-戊二酸
一:产品描述 1、名称 英文:Glutaric Acid-PEG-Glutaric Acid,GA-PEG-GA 中文:戊二酸-聚乙二醇-戊二酸 2、CAS编号:N/A 3、所属分类:Carboxylic acid PEG 4、分子量:可定制, 戊…...
知识图谱业务落地技术推荐之国内知识图谱平台汇总(竞品)[阿里、腾讯、华为等】
各位可以参考国内知识图谱平台产品进行对技术链路搭建和产品参考提供借鉴。...
ABC 289 G - Shopping in AtCoder store 数学推导+凸包
大意: n个顾客,每个人有一个购买的欲望bi,m件物品,每一件物品有一个价值ci,每一个顾客会买商品当且仅当bici>定价. 现在要求对每一个商品定价,求出它的最大销售值(数量*定价) n,m<2e5 思路&#x…...
ARM Linux 如何在sysfs用户态命令行中控制 GPIO 引脚?
ARM Linux 如何在sysfs用户态命令行中控制 GPIO 引脚?我们在开发工作中,经常需要确定内核gpio驱动,是否有异常,或者在没有应用的情况下,像控制某个外设,这时我们就可以在控制台命令行中,用命令导…...
【Linux】生产者消费者模型 - 详解
目录 一.生产者消费者模型概念 1.为何要使用生产者消费者模型 2.生产者消费者之间的关系 3.生产者消费者模型的优点 二.基于阻塞队列的生产消费模型 1.在阻塞队列中的三种关系 2.BlockingQueue.hpp - 阻塞队列类 3.LockGurad.hpp - RAII互斥锁类 4.Task.hpp - 在阻塞队…...
源码深度解析Spring Bean的加载
在应用spring 的过程中,就会涉及到bean的加载,bean的加载经历一个相当复杂的过程,bean的加载入口如下: 使用getBean()方法进行加载Bean,最终调用的是AbstractBeanFactory.doGetBean() 进行Bean的…...
STL——priority_queue
一、priority_queue介绍及使用 1.priority_queue文档介绍 (1)优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。 (2)此上下文类似与堆,在堆中可以…...
Springboot集成工作流Activity
介绍 官网:https://www.activiti.org/ 一 、工作流介绍 1.工作流(workflow) 就是通过计算机对业务流程自动化执行管理,它主要解决的是“使在多个参与这之间按照某种预定义规则自动化进行传递文档、信息或任务的过程,…...
2023软件测试工程师涨薪攻略,3年如何达到月薪30K?
1.软件测试如何实现涨薪 首先涨薪并不是从8000涨到9000这种涨薪,而是从8000涨到15K加到25K的涨薪。基本上三年之内就可以实现。 如果我们只是普通的有应届毕业生或者是普通本科那我们就只能从小公司开始慢慢往上走。 有些同学想去做测试,是希望能够日…...
成都房产网上政务大厅/佛山抖音seo
一、 新工地:新开工的工地,之前未有测量员来过放线、未开工或刚开工。1、找已知控制点(坐标控制点至少2个、高程控制点至少1个):先问工地负责人,如其不知,再问监理或业主,有些地 方亦可能由设计单位或第三方…...
自有服务器 建网站/赣州seo外包怎么收费
中新网1月21日电 1月21日早,融创中国(01918.HK)公告称,集团全资附属公司融创房地产与武汉中央商务区签订收购协议,以125.53亿元人民币收购其持有的上海泛海建设公司100%股权。 公告指出,被收购公司拥有北京泛海国际项目1号地块与上…...
招标信息网哪个比较好/优化大师下载安装app
1、vi编辑器visual interface 可视化接口,类似windows的记事本2、vi编辑器的操作模式(esc键切换)command mode - 命令模式insert mode - 输入模式 last line mode - 底行模式(尾行,末行)3、简单操作步骤&am…...
临漳 网站建设/老铁seo外链工具
香港服务器防攻击能力怎么样 一个很强的防攻击能力的香港服务器可能吗?我们在购买香港服务器时,都希望能够购买一个香港服务器防攻击能力很强的那样一个服务器。但是,很多时候,我们在各个服务器商那里去咨询的时候,都…...
wordpress jsp/网站制作的基本流程是什么
网络检测和网络维护第5章 网络检测及网络维护;5.1 网络故障的分类 ;逻辑故障通常指由软件引起的网络故障,最常见的是由配置不当引起的网络故障,如网卡的参数配置、路由器及交换机的配置、计算机中协议的配置等均可能引起网络故障。一些网络服务进程或端口…...
商洛网站制作/无锡网站建设公司
推荐一个拟合及其方便的工具箱cftool,傻瓜式操作。 首先,在matlab的工作区里有待拟合的数据。然后命令行输入cftool,就会出现如下界面: 在x data和y data区选择拟合数据名称,这里和工作区是对应的。拟合的图像和结果就…...