Redis与Jedis排序

在本文中,我们将讨论Redis SORT命令。

Redis提供了SORT命令,我们可以使用该命令从LIST,SET或ZSET中检索或存储排序的值。

我们可以使用最简单的形式在KEY上使用命令,如下例所示:

SORT numbers_list

这将对键中包含的值进行排序并返回它们。 该命令将值排序为数字。 因此,可以说我们有一个包含以下值的列表:

1, 110, 5

上面的命令将返回

1 5 110

我们可以指定使用ALPHA修饰符按字母顺序对值进行排序。 有许多修饰符。 我们将在下面的示例中查看其中的一些。 这些示例将使用Jedis api。

对于我们的示例,让我们考虑一下我们有一个想法管理系统。 我们有一个列表,其中包含系统中的所有用户名:

all:users [junior, francisco, ribeiro, user4]

对于每个用户名,将有一个包含用户信息的哈希:

user:user:junior- name: "Junior User"- num_ideas : "5"- email:"fjunior@email.com"user:francisco- name: "Francisco User"- num_ideas: "4"- email: "francisco@email.com"...

我们可以为我们的示例看到一个将填充redis的类:

package br.com.xicojunior.redistest;import java.util.HashMap;
import java.util.Map;import redis.clients.jedis.Jedis;public class App 
{public static Jedis jedis = new Jedis("localhost");   public static void main( String[] args ){String names[] = new String[]{"junior", "francisco", "ribeiro", "user4"};for(String name: names){jedis.lpush("all:users", name);}addUserHash(names[0], "Junior User", "junior@junior.com", "5");addUserHash(names[1], "Francisco User", "francisco@francisco.com", "4");addUserHash(names[2], "Ribeiro User", "ribeiro@ribeiro.com", "3");addUserHash(names[3], "User 4", "user@user.com", "2");for(String name: names){System.out.println(jedis.hgetAll("user:".concat(name)));}System.out.println(jedis.lrange("all:users", 0, -1));}public static void addUserHash(String username, String name, String email, String numberOfIdeas){Map<String, String> userProp = new HashMap<String, String>();userProp.put("name",name);userProp.put("email", email);userProp.put("num_ideas", String.valueOf(numberOfIdeas));jedis.hmset("user:".concat(username), userProp);}
}

让我们看下面的代码示例:

package br.com.xicojunior.redistest;import redis.clients.jedis.Jedis;
import redis.clients.jedis.SortingParams;public class SortTest {public static void main(String[] args) {Jedis jedis = new Jedis("localhost");//[1]sorting the usernamesSystem.out.println(jedis.sort("all:users"));//[ribeiro, francisco, junior, user4]//[2]sorting the username alpha//jedis sort method receives a SortingParams instance for modifiersSystem.out.println(jedis.sort("all:users", new SortingParams().alpha()));//[francisco, junior, ribeiro, user4]}}

在上面的示例中,我们对键“ all:users ”进行了排序。 第一次尝试时,它似乎没有正确排序,因为默认排序考虑了数字。 在第二个示例中,我们使用ALPHA修饰符。 我们可以通过使用重载版本的sort方法来做到这一点。 它接收SortingParams类的实例。 在这种情况下,我们看到用户名已正确排序。

SORT命令的一个不错的功能是我们可以使用外部值(其他键中的值)对列表进行排序。 在下面的示例中,我们将按用户给出的提示数对all:users键进行排序。 可以使用“ BY ”修饰符来完成,该修饰符接收要使用的键的模式。 让我们看下面的例子:

package br.com.xicojunior.redistest;import redis.clients.jedis.Jedis;
import redis.clients.jedis.SortingParams;public class SortTest {public static void main(String[] args) {Jedis jedis = new Jedis("localhost");//[1] Sorting the usernames by the number of ideasSystem.out.println(jedis.sort("all:users", new SortingParams().by("user:*->num_ideas")));//[user4, ribeiro, francisco, junior]//[1] Sorting the usernames by the number of ideas DESCSystem.out.println(jedis.sort("all:users", new SortingParams().by("user:*->num_ideas").desc()));}}

在第二个示例中,我们通过一个外部值对用户名进行排序,在本例中,我们通过字段“ num_ideas ”进行排序 。 在这种情况下,我们使用哈希模式进行排序,我们使用以下模式“ user:*-> num_ideas ”。 在这种模式下,我们要寻找键“ user:* ”,其中“ *”将被列表中的值替换。 由于它是一个散列,因此我们需要通知该字段,因此我们使用模式“ -> fieldname ”进行操作。 如果我们按字符串键进行排序,则可以使用以下模式“ num_ideas_ * ”,因为有一个键可以存储每个用户的想法数。

在第一次调用它检索排序ASC他们的价值观,我们也可以告诉Redis的对它进行排序DESC使用DESC修改。 jedis BY和DESC是SortingParams中的方法。 当所有方法都返回实例时,我们可以链接所有调用,这使代码读取更容易。

使用SORT命令,我们还可以从外部键或来自外部哈希的字段中检索值。 我们可以使用GET修饰符执行此操作,并且可以多次使用它。 让我们在下面看到此修饰符的一些示例:

package br.com.xicojunior.redistest;import redis.clients.jedis.Jedis;
import redis.clients.jedis.SortingParams;public class SortTest {public static void main(String[] args) {Jedis jedis = new Jedis("localhost");//[1] Sorting the usernames by the number of ideas and retrieving the user nameSystem.out.println(jedis.sort("all:users", new SortingParams().by("user:*->num_ideas").get("user:*->name")));//[User 4, Ribeiro User, Francisco User, Junior User]//[2] Retrieving the name and emailSystem.out.println(jedis.sort("all:users", new SortingParams().by("user:*->num_ideas").get("user:*->name","user:*->email")));//[User 4, user@user.com, Ribeiro User, ribeiro@ribeiro.com, Francisco User, francisco@francisco.com, Junior User, junior@junior.com]//[3] Retrieve the value of the key being sorted - Special pattern #System.out.println(jedis.sort("all:users", new SortingParams().by("user:*->num_ideas").get("user:*->name","user:*->email","#")));//[User 4, user@user.com, user4, Ribeiro User, ribeiro@ribeiro.com, ribeiro, Francisco User, francisco@francisco.com, francisco, Junior User, junior@junior.com, junior]}}

在上面的代码中,我们可以看到GET修饰符的使用,为了返回哈希字段,我们可以使用一种类似于在BY修饰符中使用的模式。 如前所述,在第一个示例中,我们仅返回名称,我们可以多次使用GET;在第二个示例中,我们从用户那里检索名称和电子邮件。 我们还可以检索使用特殊模式“#”排序的键的值。 方法get,接收一个变量,因此我们可以传递要从中检索值的所有外部键。

我们可以做的另一件事是将排序结果存储在一个键中。 在需要缓存排序结果的情况下很有用,我们可以为sort命令指定一个dest键。 结果将存储为LIST。

package br.com.xicojunior.redistest;import redis.clients.jedis.Jedis;
import redis.clients.jedis.SortingParams;public class SortTest {public static void main(String[] args) {Jedis jedis = new Jedis("localhost");jedis.sort("all:users","dest_key1");System.out.println(jedis.lrange("dest_key1", 0, -1));//[ribeiro, francisco, junior, user4]jedis.sort("all:users", new SortingParams().alpha().desc(), "dest_key2");System.out.println(jedis.lrange("dest_key2", 0, -1));//[user4, ribeiro, junior, francisco]}}

SORT命令的一个非常有用的功能是我们只能将其用于从相关键中获取值。 有一个修饰符,指示不对NOSORT进行排序

package br.com.xicojunior.redistest;import redis.clients.jedis.Jedis;
import redis.clients.jedis.SortingParams;public class SortTest {public static void main(String[] args) {Jedis jedis = new Jedis("localhost");System.out.println(jedis.sort("all:users", new SortingParams().get("user:*->name","user:*->email").nosort()));//[User 4, user@user.com, Ribeiro User, ribeiro@ribeiro.com, Francisco User, francisco@francisco.com, Junior User, junior@junior.com]}}

这段代码基本上为所有用户检索名称和电子邮件。 如果我们不使用SORT命令,则至少需要两个命令来执行相同的操作:

LRANGE all:users 0 -1 //TO get all usernames

然后为每个用户名分别调用hmget,如下所示

HMGET user:junior name email //TO get the name and email from a user
  • 我们可以在redis站点中找到命令文档。

参考:在XICO JUNIOR'S WEBLOG博客中,来自JCG合作伙伴 Francisco Ribeiro Junior的Jedis 与Redis进行了排序 。

翻译自: https://www.javacodegeeks.com/2014/02/redis-sort-with-jedis.html

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

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

相关文章

获取 HTML5 网页设计灵感的10个网站推荐

这篇文章向大家推荐10个收集 HTML5 网页作品的网站&#xff0c;让大家感受一下 HTML5 的魅力。作为下一代网页标准&#xff0c;HTML5 增加了很多新标签以及新特性&#xff0c;正引领网页技术革命。希望这些优秀的 HTML5 网页案例能带给大家制作 HTML5 网页的灵感。 HTML5 Gall…

postgresql存图片字段类型_PostgreSQL让人着迷的多态性,另辟蹊径省时又省力

PostgreSQL 让人着迷的地方&#xff0c;不在于他比某些数据库的流行&#xff0c;也不在于比某些数据库的高“贵”&#xff0c; 更不如某些数据库的“简单”。Postgresql 让人无法自拔的是他的”多端变化”&#xff0c; 用开发的角度来说&#xff0c;叫多态性。PG本身支持着太多…

计算机怎么查看U盘品牌,如何查看电脑u盘使用

如何查看电脑u盘使用其实笔记本设置U盘启动也并不困难&#xff0c;小编这就教你怎样设置U盘启动&#xff01;全是硬货&#xff01;第一步&#xff1a;我们先把U盘插入笔记本的USB接口上&#xff0c;(注意&#xff1a;请不要通过USB延长线来连接笔记本)插上U盘后重启笔记本本。电…

Maven补全之生命周期(Lifecycle)

Maven补全之生命周期&#xff08;Lifecycle) Maven生命周期基础概念 Maven是基于生命周期构建的&#xff0c;一个Maven项目的构建是已经被清晰定义的过程。 对于我们使用Maven构建项目来说&#xff0c;POM.xml文件可以确保我们得到自己想要的项目&#xff08;项目名&#xff0c…

嵌入式-第一季-第2课

第二课 嵌入式系统概述 一&#xff0e;核心概念 嵌入式系统是&#xff08;1&#xff09;以应用为中心&#xff0c;以计算机技术为基础&#xff0c;&#xff08;2&#xff09;软硬件可剪裁&#xff0c;对&#xff08;3&#xff09;功能、可靠性、成本、体积、功耗严格要求的专用…

善用封盖

不久前&#xff0c;在博客文章中 &#xff0c;我解释了Groovy中的Closure。 这篇博客文章将解释一个使用它们的好例子。 最近&#xff0c;我发现自己不得不为服务AJAX请求的大量后端Controller API编写相同的异常处理逻辑。 就像这样&#xff1a; class ApiRugbyPlayerControl…

12款精美的免费 HTML 网站模板下载

这篇文章收集了12款精美的免费HTML网站模板分享给大家&#xff0c;您可以免费下载使用。相信这些漂亮的HTML网站模板既能够帮助您节省大量的时间和精力&#xff0c;又能有很满意的效果。感谢那些优秀的设计师分享他们的劳动成果&#xff0c;让更多的人可以使用他们的创意设计&a…

两个数相乘积一定比每个因数都大_小升初数学知识点大全含公式+20类必考应用题(含答案解析),孩子考试一定用得上!...

小升初数学知识点大全含公式一、几何图形周长、面积和体积公式*三角形的面积&#xff1d;底高2。S ah2正方形的面积&#xff1d;边长边长 S a长方形的面积&#xff1d;长宽 公式 S ab平行四边形的面积&#xff1d;底高 S ah梯形的面积&#xff1d;(上底下底)高2 S(ab)h2内角和&…

WPF自定义TabControl样式

WPF自定义TabControl样式 原文:WPF自定义TabControl样式WPF自定义TabControl&#xff0c;TabControl美化 XAML代码&#xff1a; <TabControl x:Class"SunCreate.Common.Controls.TabControlEx"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentat…

11计算机,11-计算机科学与技术

《11-计算机科学与技术》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《11-计算机科学与技术(23页珍藏版)》请在人人文库网上搜索。1、计算机软件技术基础,机械工业出版社2007年7月,第一部分 数据结构与算法基础,第1章 算法 第2章 数据结构的基础 第3章 线性表及其存…

Spring新变化

让我们检查一下Spring社区在前几天宣布的一些新版本&#xff1a; Spring Boot 1.0.0.RC1 Spring很高兴地宣布Spring Boot v1.0.0的第一个候选版本。 它包含了先前里程碑中的许多错误修复和增强功能。 二进制文件已发布到Spring Maven存储库 。 使用下载说明和Maven / Gradle坐…

H.264分层结构与码流结构

H.264分层结构 H.264编码器输出的Bit流中&#xff0c;每个Bit都隶属于某个句法元素。句法元素被组织成有层次的结构&#xff0c;分别描述各个层次的信息。 在H.264 中&#xff0c;句法元素共被组织成 序列、图像、片、宏块、子宏块五个层次。在这样的结构中&#xff0c;每一层…

20个很酷的CSS3导航菜单制作教程

CSS3 是对 CSS 规范的一个很大的改善和增强&#xff0c;它使得 Web 开发人员可以很容易的在网站中加入时尚的效果。以前很多需要编写 JavaScript 才能实现的效果&#xff0c;如今只需要简单的写几句 CSS3 代码就能实现。今天这篇文章就向大家推荐20个很酷的CSS3导航菜单制作教程…

金算盘高手论坛资料中心_3D006期 菜鸟论坛精英PK专栏 速来围观!!

点上方“菜鸟选号论坛”→点右上角“...”→选“星标★”每日上午更新&#xff0c;星标置顶与大神不走散苹果是置顶&#xff0c;安卓是星标 点击"菜鸟选号论坛"关注我们论坛明星版块&#xff0c;集全网各路高手之大乘&#xff0c;打造草根明星 展示舞台。同时主要是为…

模拟最后一堂课

前言 如果您已经阅读了其他有关异常模拟的博客文章&#xff0c;则可以通过此链接跳过前奏 。 我被要求汇总一些示例&#xff0c;这些示例如何模拟因其可测试性问题而众所周知的Java结构&#xff1a; 模拟私人方法 模拟最终方法 模拟最后一堂课 模拟构造器 模拟静态方法 …

ajax 浏览器后退,全站Ajax浏览器后退方法

全站Ajax后退有两种方法&#xff0c;浏览器后退按钮加入历史链接。其中一种是常规的Ajax后退&#xff0c;这种后退是带有ajax效果的&#xff0c;要重新请求历史链接页面。另一种是将历史数据保存&#xff0c;后退时取出缓存的数据即可。后者比前者效率要高&#xff0c;所以速度…

java基础day11---空指针异常----引用类型--自定义类型赋值--封装

day111.空指针异常-----属于运行错误-java.long.NullPointerException--原因&#xff1a;当引用名称的值为null时&#xff0c;就不能访问某个对象中的属性或方法热锅非要访问这就出现空指针异常--解决办法&#xff1a;在访问某个对象中的属性或方法之前必须保证该引用名称中存放…

CentOS 7下安装Python3.6

•安装python3.6可能使用的依赖 yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel •到python官网找到下载路径, 用wget下载 wget https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tgz •解压tgz包 tar -zxvf Python-3.6.4.t…

非常酷!10个基于 HTML5 的字体应用演示网站

HTML5 是现在Web开发领域的热点&#xff0c;更多的开发人员开始使用HTML5来开发交互性强、效果出众的网站和各种应用。这是 HTML5 网站大观系列第四篇&#xff0c;本文与大家分享5个非常酷的基于 HTML5 的字体应用演示网站&#xff0c;一起欣赏。 Web Typography For The Lone…

ntp如何确认与服务器偏差_LED电子时钟显示屏如何实现时间同步统一校时?

LED电子时钟显示屏采用一体式铝合金边框设计&#xff0c;更坚固美观节能环保&#xff0c;更以其简单的操作和稳定的性能&#xff0c;广泛应用于学校、考场、医院、金融、移动通信、石油、电力、交通、工业以及国防等同步时钟系统的显示终端&#xff0c;LED电子时钟显示屏已成为…