redis 实现对list进行排序
核心思路:通过sort命令实现
命令如下:
SORT命令介绍
- sort命令的基本格式
SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC | DESC] [ALPHA] [STORE destination] 1 2
2、用法
- 最简单的用法 SORT key 或 SORT key DESC 即升序或降序排序某个集合(集合存储的是数字)
- 如果想排序字符串 需要添加ALPHA修饰符 如 SORT key ALPHA
- 使用LIMIT 显示返回结果
limit 0 5 0表示第一个元素,5表示要返回5个元素 1 2
- 使用外部key进行排序
192.168.0.148:0>lpush uid 1 2 3 4 "4" 192.168.0.148:0>set uid-1 13 "OK" 192.168.0.148:0>set uid-2 7 "OK" 192.168.0.148:0>set uid-3 23 "OK" 192.168.0.148:0>set uid-4 14 "OK" 192.168.0.148:0>SORT uid 1) "1" 2) "2" 3) "3" 4) "4" 192.168.0.148:0>SORT uid by uid-* 1) "2" 2) "1" 3) "4" 4) "3" 192.168.0.148:0>SORT uid by uid-* get uid-* 1) "7" 2) "13" 3) "14" 4) "23" 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
- 获取外部键 但不进行排序
192.168.0.148:0>lrange uid 0 -1 1) "4" 2) "3" 3) "2" 4) "1" 192.168.0.148:0>SORT uid by not-exist-key get # get uid-* 1) "4" 2) "14" 3) "3" 4) "23" 5) "2" 6) "7" 7) "1" 8) "13" 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
- 使用哈希表作为GET或BY的参数
构造uid集合中id为1,2,3,4的user对于的哈希表 192.168.0.148:0>hset uid-1 name "jerry" "0" 192.168.0.148:0>hset uid-1 age 24 "1" 192.168.0.148:0>hget uid-1 name "jerry" 192.168.0.148:0>hset uid-2 name "admin" "1" 192.168.0.148:0>hset uid-2 age 16 "1" 192.168.0.148:0>hset uid-3 name "bob" "1" 192.168.0.148:0>hset uid-3 age 32 "1" 192.168.0.148:0>hset uid-4 name "flex" "1" 192.168.0.148:0>hset uid-4 age 18 "1" 不排序输出 192.168.0.148:0>lrange uid 0 -1 1) "4" 2) "3" 3) "2" 4) "1" 根据姓名排序 192.168.0.148:0>sort uid by uid-*->name desc alpha 1) "1" 2) "4" 3) "3" 4) "2" 上面的不直观 我们可以根据姓名排序并且将id和姓名也返回 192.168.0.148:0>sort uid by uid-*->name get # get uid-*->name desc 1) "1" 2) "jerry" 3) "4" 4) "flex" 5) "3" 6) "bob" 7) "2" 8) "admin" 根据年龄排序 192.168.0.148:0>sort uid by uid-*->age get # get uid-*->name get uid-*->age desc 1) "3" 2) "bob" 3) "32" 4) "1" 5) "jerry" 6) "24" 7) "4" 8) "flex" 9) "18" 10) "2" 11) "admin" 12) "16" 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
代码演示
1、需求说明
假设我们现在有一个商品对象,此对象有销量和价格的属性。。
然后我们经过一系列的操作,,将一些商品ID放到了redis一个集合key中。
当我们想要查询这些商品列表时,首先从redis的集合key中取出商品ID列表,然后遍历,
从redis中根据商品id查找对应的商品,然后再放到一个list中返回。。
那么问题来了!!
由于走的是redis 不走mysql 那么我们在查商品列表时怎么根据销量和价格对商品排序呢???
解决方案:
1、我们只需要在添加商品进商品列表时,动态维护一个哈希表,这个哈希表里面存着这个商品的排序字段。。如销量和价格。。
2、然后我们使用SORT命令 将商品列表和商品排序哈希表进行关联排序 就可以获取排序好的商品列表了
2、代码实现
- 商品表
我们现在有9个商品,ID从1-9 item_price是商品价格 item_sales是商品销量
- 先将这个9个商品从mysql中转到redis中存储 并且将商品id放到一个列表key中
List<Item> items=itemMapper.listItems(); for(Item item:items){ redisService.setObjectToJSON("item-"+item.getItemId(),item); } List<String> list = items.stream().map(Item::getItemId).map((l) -> String.valueOf(l)).collect(Collectors.toList()); redisService.lpush("item-list-key", list.toArray(new String[list.size()])); 1 2 3 4 5 6 7 8 9 10
- 我们取出列表key的值
redis命令 192.168.0.148:0>lrange item-list-key 0 -1 1) "9" 2) "8" 3) "7" 4) "6" 5) "5" 6) "4" 7) "3" 8) "2" 9) "1" java代码 List<String> strs = redisService.lrange("item-list-key", 0, -1); for(String str:strs){ System.out.println(str); } 结果: 9 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
- 这个顺序是根据我们添加的顺序排序的。。。
- 那么我们怎么根据商品id对应的商品价格或者是销量排序呢???
- 首先为我们list中的每个商品id创建一个hash表 里面存放价格和销量
List<Item> items=itemMapper.listItems(); for(Item item:items){ redisService.hset("item-sort-"+item.getItemId(),"price",item.getItemPrice().toString()); redisService.hset("item-sort-"+item.getItemId(),"sales",item.getItemSales().toString()); } 1 2 3 4 5 6
然后通过sort来进行排序
Jedis jedis = redisService.getPool().getResource(); String key="item-list-key"; String sortKey="item-sort"; SortingParams sortingParams=new SortingParams(); ## 这里是根据价格排序 如果想要根据销量排序 则将price改为sales即可 sortingParams.by(sortKey+"-*->price"); sortingParams.desc(); ## 将自身id输出 sortingParams.get("#"); ## 将价格输出 sortingParams.get(sortKey+"-*->price"); ## 将销量输出 sortingParams.get(sortKey+"-*->sales"); List<String> sort = jedis.sort(key, sortingParams); for(String str:sort){ System.out.println(str); } 输出结果 8 --------------------itemId 商品id 84.0 --------------------itemPrice 商品价格 34 --------------------itemSales 商品销量 5 72.1 19 2 68.8 133 1 50.2 80 9 49.0 208 7 38.8 42 6 19.9 102 4 18.8 1462 3 9.9 246 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
[源码地址](https://github.com/kingrocy/springboot/tree/master/springboot-redis
相关推荐
wordmhg 2020-04-09
wangqing 2020-04-06
blackeagleoht 2019-05-04
ztyzly00 2020-07-18
killgod 2020-06-14
小惠 2020-06-05
Oudasheng 2020-06-04
从零开始 2020-06-05
litterfrog 2020-05-30
老谢的自留地 2020-05-09
wulaxiaohei 2020-05-05
cyyking 2020-05-03
aaLiweipeng 2020-04-15
Pinkr 2020-03-12
dushine00 2020-02-21
dbhllnr 2020-02-18
zhujiangtaotaise 2020-01-26
chenchuang 2020-01-25