使用Servlet 3.0,Redis / Jedis和CDI的简单CRUD –第1部分
在這篇文章中,我們將構建一個簡單的用戶界面。 數據將存儲在Redis中。 為了與Redis交互,我們將使用Jedis庫。 CDI用于Depedency Injection,而Servlet 3.0用于視圖。
讓我們從Redis / Jedis部分開始。 您可以在這些 帖子中找到有關Redis和Jedis的概述。
讓我們從User類開始,我們可以在下面看到:
現在,讓我們定義用于在Redis上存儲用戶信息的鍵。 在我們的示例中,我們將使用三個鍵:
- user:ids –將通過使用INCR命令來生成用戶ID。
- user:all –用于存儲所有用戶ID的Redis列表
- user:<id>: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
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的使用Servlet 3.0,Redis / Jedis和CDI的简单CRUD –第1部分的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大逆转裁判2安卓汉化(大逆转裁判2安卓)
- 下一篇: Linux c 开发环境(linux