在这篇文章中,我们将构建一个简单的用户界面。 数据将存储在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 –系统中的每个用户都有一个带有此模式的密钥。 这些密钥将是哈希。
当我们要向系统添加新用户时,我们将处理三个键,如下面的步骤所示:
- 首先,我们通过增加user:ids键获得一个新的用户ID: INCR user:ids
- 然后我们将其添加到user:all列表: lpush user:all returnId
- 并将用户信息添加到其自己的哈希中: 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进行视图。
翻译自: https://www.javacodegeeks.com/2013/10/simple-crud-using-servlet-3-0-redisjedis-and-cdi-part-1.html