博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
redis 分页查询
阅读量:6610 次
发布时间:2019-06-24

本文共 2978 字,大约阅读时间需要 9 分钟。

hot3.png

算法:

容器使用的是zset,因为当zset中所有的分值都为0时集合将按ascii码排序。所以利用这点只要找出其范围再

使用zrange获取就行了。取得该范围的方式是通过在集合中插入两个搜索关键字的临界值,如搜索abc,那么这个

临界值为abb{ 和abc{ 。将其插入到集合中再搜索出基位置。最后将其删除(参考:<<redis in action>>)

下面是分页lua脚本:

--[[zset 分页查询:  格式: 
参数说明:{ zsetKey :有序集键 key1 searchKey : 查询内容 argv1 pageNo :当前页号(默认为1) argv2 pageSize :页面大小(默认为15) argv3 } 示例: evalsha 232fd51614574cf0867b83d384a5e898cfd24e5a 1 my:zset abc]]local zsetKey,searchKey,pageNo,pageSize = KEYS[1],ARGV[1],tonumber(ARGV[2]),tonumber(ARGV[3])local content = ",-/0123456789@_abcdefghijklmnopqrstuvwxyz{"if(not zsetKey) then return {} endif(not pageNo or pageNo < 1) then pageNo = 1 endif(not pageSize or pageSize < 1) then pageSize = 15 endlocal recTotal = redis.call('zcard',zsetKey)if(recTotal == 0) then return {} end --空集合--找出查询关键字在zset中的位置local function getRange(searchKey) local lastChar = string.sub(searchKey,-1,-1) local temp = string.find(content,lastChar)-1 local startStr = string.sub(searchKey,1,-2)..string.sub(content,temp,temp)..string.sub(content,-1,-1) local endStr = searchKey..string.sub(content,-1,-1) redis.call('zadd',zsetKey,0,startStr) redis.call('zadd',zsetKey,0,endStr) local starp1,starp2 = redis.call('zrank',zsetKey,startStr) , redis.call('zrank',zsetKey,endStr) redis.call('zrem',zsetKey,startStr) redis.call('zrem',zsetKey,endStr) return starp1,starp2-2endlocal startPosition,endPosition = 0,recTotalif(searchKey ~= "") then startPosition,endPosition = getRange(searchKey);endstartPosition = startPosition + (pageNo-1)*pageSizeendPosition = math.min(startPosition + pageSize-1,endPosition)if(startPosition > recTotal or endPosition < 0) then return {} end --没有找到要查询的结果return redis.call('zrange',zsetKey,startPosition,endPosition)

--[[zset 查询总数:  格式: 
参数说明:{ zsetKey :有序集键 key1 searchKey : 查询内容 argv1 } 示例: evalsha 232fd51614574cf0867b83d384a5e898cfd24e5a 1 my:zset abc]]local zsetKey,searchKey = KEYS[1],ARGV[1]local content = ",-/0123456789@_abcdefghijklmnopqrstuvwxyz{"if(not zsetKey) then return 0 endlocal recTotal = redis.call('zcard',zsetKey)if(searchKey == "") then return recTotal end --找出查询关键字在zset中的位置local function getRange(searchKey) local lastChar = string.sub(searchKey,-1,-1) local temp = string.find(content,lastChar)-1 local startStr = string.sub(searchKey,1,-2)..string.sub(content,temp,temp)..string.sub(content,-1,-1) local endStr = searchKey..string.sub(content,-1,-1) redis.call('zadd',zsetKey,0,startStr) redis.call('zadd',zsetKey,0,endStr) local starp1,starp2 = redis.call('zrank',zsetKey,startStr) , redis.call('zrank',zsetKey,endStr) redis.call('zrem',zsetKey,startStr) redis.call('zrem',zsetKey,endStr) return starp1,starp2-2endlocal startPosition,endPosition = getRange(searchKey);if(startPosition > recTotal or endPosition < 0) then return 0 end --没有找到要查询的结果return endPosition - startPosition + 1;

上面只支持英文查询(小写)

转载于:https://my.oschina.net/u/2552286/blog/660536

你可能感兴趣的文章
HTML
查看>>
【转】左手坐标系和右手坐标系
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
POJ 3335 Rotating Scoreboard 半平面交
查看>>
oracle 闪回查询
查看>>
window.location.href和window.location.replace的区别
查看>>
《Gamestorming》读书笔记
查看>>
域名和网址链接被微信浏览器拦截怎么办 微信屏蔽网址打开如何解决
查看>>
SpringBoot 统一响应格式
查看>>
使用SQL Server Analysis Services数据挖掘的关联规则实现商品推荐功能(二)
查看>>
ubuntu下安装jdk
查看>>
C/S与B/S架构比较
查看>>
XML学习总结(2)——XML简单介绍
查看>>
python操作数据库-安装
查看>>
vs.net删除转移文件
查看>>
你真的了解interface和内部类么
查看>>
java中常用的类型转换
查看>>
【log4j】使用Log4j?,slf4j更轻巧高效
查看>>
第三章 创建命令
查看>>