使用Servlet 3.0,Redis / Jedis和CDI的简单CRUD –第1部分

在这篇文章中,我们将构建一个简单的用户界面。 数据将存储在Redis中。 为了与Redis交互,我们将使用Jedis库。 CDI用于Depedency Injection,而Servlet 3.0用于视图。

让我们从Redis / Jedis部分开始。 您可以在这些 帖子中找到有关Redis和Jedis的概述。

让我们从User类开始,我们可以在下面看到:

public class User {private String firstName;private String lastName;private String email;private String gender;private long id;
}

现在,让我们定义用于在Redis上存储用户信息的键。 在我们的示例中,我们将使用三个键:

  • user:ids –将通过使用INCR命令来生成用户ID。
  • user:all –用于存储所有用户ID的Redis列表
  • user:<id>:data –系统中的每个用户都有一个带有此模式的密钥。 这些密钥将是哈希。

当我们要向系统添加新用户时,我们将处理三个键,如下面的步骤所示:

  1. 首先,我们通过增加user:ids键获得一个新的用户ID: INCR user:ids
  2. 然后我们将其添加到user:all列表: lpush user:all returnId
  3. 并将用户信息添加到其自己的哈希中: HMSET user:<returnedId>:data字段值..

我们可以在方法UserDAO.addUser中看到以下代码

public User addUser(User user){long userId = jedis.incr(Keys.USER_IDS.key());user.setId(userId);//Getting the PipelinePipeline pipeline = jedis.pipelined();//add to users listpipeline.lpush(Keys.USER_ALL.key(), String.valueOf(userId));//add to the hashpipeline.hmset(Keys.USER_DATA.formated(String.valueOf(userId)), BeanUtil.toMap(user));pipeline.sync();return user;}

解释上面的代码,首先我们得到新的用户ID。 jedis变量是UserDAO类的属性,它是Jedis类的实例。 为了避免对Redis服务器的三个网络调用,我们使用管道的概念,因此,在对Redis服务器的一次调用中,我们将在user:all列表中添加用户ID,并在user:<id>:data中添加用户信息。哈希。

管道实例执行的命令将在调用pipeline.sync()之后在redis服务器中执行。 我们创建了一个util类,用于将Map <String,String>中的用户对象转换为存储在redis哈希中的对象。

为了查看用户的详细信息,我们在DAO中有一个方法来获取用户,我们可以在下面看到:

public User getUser(long userId){String userInfoKey = Keys.USER_DATA.formated(String.valueOf(userId));Map<String, String> properties = jedis.hgetAll(userInfoKey);return BeanUtil.populate(properties, new User());}

如我们所见,这是一个简单的方法,基本上,我们调用命令HGETALL来从哈希中检索所有字段。 Jedis api将其作为Map返回,因此我们可以简单地从Map中填充用户属性。

要删除用户,我们创建了以下方法:

public boolean remove(long userId){String userInfoKey = Keys.USER_DATA.formated(String.valueOf(userId));Pipeline pipeline = jedis.pipelined();Response<Long> responseDel = pipeline.del(userInfoKey);Response<Long> responseLrem = pipeline.lrem(Keys.USER_ALL.key(), 0, String.valueOf(userId));pipeline.sync();return responseDel.get() > 0 && responseLrem.get() > 0;}

一旦需要从user:all列表中删除Hash键和用户ID,下面的方法也将使用流水线的概念。 LREM命令从列表中删除该值,零表示删除该值在列表中的所有出现。 在此方法中,我们还通过使用每个命令返回的Response对象来使用命令返回的值。 我们只有在调用sync方法之后才能使用那些对象。

更新方法非常简单,我们可以在下面看到它:

public User update(User user){String userInfoKey = Keys.USER_DATA.formated(String.valueOf(user.getId()));jedis.hmset(userInfoKey ,BeanUtil.toMap(user));return user;}

这只是HMSET的调用,它传递具有所有用户属性的Map,该映射将在Redis哈希中进行更新。

要列出用户,我们还需要使用管道。 Redis不提供HMGETALL命令,因此,要检索具有一个网络连接的所有用户,我们将通过管道进行操作。

列表方法如下所示:

public List<User> list(){List<User> users = new ArrayList<User>();//Get all user ids from the redis list using LRANGEList<String> allUserIds = jedis.lrange(Keys.USER_ALL.key(), 0, -1);if(allUserIds != null && !allUserIds.isEmpty()){List<Response<Map<String,String>>> responseList = new ArrayList<Response<Map<String,String>>>();Pipeline pipeline = jedis.pipelined();for(String userId : allUserIds){//call HGETALL for each user idresponseList.add(pipeline.hgetAll(Keys.USER_DATA.formated(userId)));}pipeline.sync();//iterate over the pipelined resultsfor(Response<Map<String, String>> properties : responseList){users.add(BeanUtil.populate(properties.get(), new User()));}}return users;}

在这种方法中,我们首先使用命令LRANGE从列表user:all获得所有用户ID。 之后,我们通过管道执行“ HMGETALL”,我们为每个用户调用HGETALL命令,然后从返回的Map实例构建用户对象。

在第一篇文章中,我们了解了如何使用Jedis api与Redis服务器进行交互以存储和检索用户的信息。 我们看到了Pipeline的概念和用法。 在下一篇文章中,我们将展示如何使用CDI进行依赖注入和使用Servlet 3.0进行视图。

参考: 使用Servlet 3.0,Redis / Jedis和CDI的简单CRUD –第1部分,来自XICO JUNIOR'S WEBLOG博客的JCG合作伙伴 Francisco Ribeiro Junior。

翻译自: https://www.javacodegeeks.com/2013/10/simple-crud-using-servlet-3-0-redisjedis-and-cdi-part-1.html

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

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

相关文章

Socket.io 深入理解

最近在做项目优化工作时&#xff0c;用到了Socket.io , Socket.io 文档比较少&#xff0c; 结合官网介绍以及自己在项目开发中的摸索&#xff0c;总结如下内容&#xff1b; Socket.io将Websocket和轮询 &#xff08;Polling&#xff09;机制以及其它的实时通信方式封装成了通用…

python填表_小Python填表得到d

我正在尝试使用Scrapy从网站自动下载数据。在我要做的是&#xff1a;使用我的凭据登录网站通过在“RIC”行中写入代码并选择感兴趣的时段来选择我想要的数据单击“获取数据”后&#xff0c;将生成.csv文件&#xff0c;我可以从“下载/”url下载该文件&#xff0c;其中我的所有文…

如何使用异步Servlet来提高性能

这篇文章将描述一种性能优化技术&#xff0c;适用于与现代Web应用程序相关的常见问题。 如今的应用程序不再只是被动地等待浏览器发起请求&#xff0c;而是希望自己开始通信。 一个典型的示例可能涉及聊天应用程序&#xff0c;拍卖行等–共同点是以下事实&#xff1a;大多数时间…

我理解中的“大前端”/“大无线”

本文内容较长&#xff0c;大概需要15分钟时间阅读。 内容包含五部分&#xff1a;前言&#xff0c;NodeJS职能变化&#xff0c;ReactNative的大规模应用&#xff0c;专门的架构组职能&#xff0c;总结。主要是介绍我所在团队最近的一些变化和思考。 更多信息可以加入我的小密圈关…

STM32之Systick(系统时钟滴答定时器)

systick定时器有两个可选的时钟源&#xff0c;一个是外部时钟源&#xff08;STCLK&#xff0c;等于HCLK/8&#xff09;&#xff0c;另一个是内核时钟&#xff08;FCLK&#xff0c;等于HCLK&#xff09;。假若你选择内核时钟&#xff0c;并将HCLK频率设置为72MHz的话&#xff0c…

Dirichlet分布

1.预备知识 Beta分布函数是一种定义在实数区间[0,1]的特殊函数&#xff0c;它是二项式分布的共轭分布&#xff1b;与Beta分布相同&#xff0c;Dirichlet分布也是定义在实数区间[0,1]的概率度量函数&#xff0c;Dirichlet分布是多项式分布的共轭分布&#xff0c;Dirichlet分布的…

python编程制作接金币游戏_pygame学习笔记(6):完成一个简单的游戏

学了这么长时间的Pygame&#xff0c;一直想写个游戏实战一下。看起来很简单的游戏&#xff0c;写其来怎么这么难。最初想写个俄罗斯方块&#xff0c;想了很长时间如何实现&#xff0c;想来想去&#xff0c;也没写出来&#xff0c;于是干脆下载别人的代码来读。后来&#xff0c;…

Spring:使基于Java的配置更加优雅

大家好&#xff0c;我很久没有写新文章了。 积累了很多资料&#xff0c;需要在不久的将来在我的博客中发布。 但是现在我想谈谈Spring MVC应用程序配置。 确切地说&#xff0c;我想谈谈基于Java的Spring配置。 尽管在3.0版本中引入了基于Spring Java的配置&#xff0c;但是许多…

用观察者模式编写一个可被其他对象拓展复用自定义事件系统

观察者模式 定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都将得到通知 什么是观察者模式&#xff1f; 发布—订阅模式又叫观察者模式&#xff0c;它定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态…

布局定位

布局与定位 摆放元素 1&#xff0c;使用流 流实际上就是浏览器在页面上摆放HTML元素所用的方法。浏览器从HTML文件最上面开始&#xff0c;从上到下沿着元素流逐个显示所遇到的各个元素。 每个块元素会按它在HTML标记中出现的顺序放置在页面上。每个新的块元素会带来一个换行。并…

T - Memory and Trident CodeForces - 712B( 注意:* ++ = 的优先级

题意&#xff1a;有四种命令&#xff1a;U代表上移一个单位&#xff0c;D代表下移一个单位&#xff0c;R代表右移一个单位&#xff0c;L代表左移一个单位。 现在给出一串命令&#xff0c;问怎样修改命令中的任意一条命令&#xff0c;使得命令结束后重新返回原点&#xff0c;并且…

python语言精通_Python语言基础从入门到精通

1、python关键字False await else import passNone break except in raiseTrue class finally is returnand continue for lambda tryas def from nonlocal whileassert del global not withasync elif if or yield2、命令行参数williamdeMBP-2:~ william$ python -c "imp…

休眠事实:了解刷新操作顺序很重要

Hibernate将开发人员的思维方式从思考SQL转变为思考对象状态转换。 根据Hibernate Docs&#xff0c;实体可能处于以下状态之一&#xff1a; new / transient&#xff1a;实体不与持久性上下文关联&#xff0c;因为它是数据库不知道的新创建的对象。 持久性&#xff1a;实体与…

[HNOI2012]排队

题目描述 某中学有 n 名男同学&#xff0c;m 名女同学和两名老师要排队参加体检。他们排成一条直线&#xff0c;并且任意两名女同学不能相邻&#xff0c;两名老师也不能相邻&#xff0c;那么一共有多少种排法呢&#xff1f;&#xff08;注意&#xff1a;任意两个人都是不同的&a…

声速的测量的实验原理和应用_声速的测定实验报告心得体会

测量声速的实验报告1。提出问题如何测出声音的速度?2。猜想与假设如果在一定距离内听到声音要多少时间?3。实验步骤步骤应该就是实施实验&#xff0c;第三是实验器材的话&#xff0c;就是要秒表。4。实施实验在一个山谷中&#xff0c;站在距离峭壁680M的地方大叫一声&#xf…

FreeNAS:创建 CIFS 共享(权限)

第一部分&#xff1a;新建账户与指定数据集权限 简单起见&#xff0c;本教程主要介绍带基本身份验证的 CIFS 共享&#xff0c;即只有输入正确的用户名和密码才可以访问共享目录。关于创建匿名共享、多用户权限管理以及域控制器相关内容&#xff0c;我们会另外发布教程专门介绍。…

使用序列化查找对象中的脏字段

假设您正在开发一个将对象自动保存到数据库中的框架。 您需要检测两次保存之间所做的更改&#xff0c;以便仅保存修改过的字段。 如何检测脏场。 最简单的方法是遍历原始数据和当前数据&#xff0c;并分别比较每个字段。 代码如下&#xff1a; public static void getDirtyFie…

js操作table中tr的顺序,实现上移下移一行的效果

总体思路是在table外部加个div&#xff0c;修改div的innerHtml实现改变tr顺序的效果 具体思路是 获取当前要移动tr行的rowIndex&#xff0c;在table中删除掉&#xff0c;然后循环table的rows&#xff0c;到了目标行再直接加进去&#xff0c;最后把整体的html赋值给div完成效果…

oracle日记账单据编号未生成_商管财务数据平台Oracle与共享未付池差异如何核对、解决?...

‍‍近期&#xff0c;总部新上线财务数据平台啦&#xff01;各个系统间的差异异常数据清晰可见&#xff0c;随时可查&#xff0c;今天就和小伙伴们一起分享一下Oracle与共享未付池差异如何核对、解决。首先&#xff0c;将Oracle与共享未付池差异数据导出。由于导出的数据包括本…

python (六)函数

一、函数的形成 需求1&#xff1a;来测试一下‘hello word’ 的长度 # 在没有函数的时候&#xff0c;我们可以用for循环实现 s1 "hello world" length 0 for i in s1:length length1 print(length) 再增加一个需求2&#xff1a;再来测试一下另外一个字符串的长度&…