文档章节

redis 分页查询

C
 Canaan_
发布于 2016/04/15 15:04
字数 578
阅读 546
收藏 3

算法:

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

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

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

下面是分页lua脚本:

--[[
zset 分页查询: 
 格式: <zsetKey> <searchKey> <pageNo> <pageSize>
 参数说明:{
	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 {} end
if(not pageNo or pageNo < 1) then pageNo = 1 end
if(not pageSize or pageSize < 1) then pageSize = 15 end

local 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-2
end

local startPosition,endPosition = 0,recTotal
if(searchKey ~= "") then
	startPosition,endPosition = getRange(searchKey);
end

startPosition = startPosition + (pageNo-1)*pageSize
endPosition = math.min(startPosition + pageSize-1,endPosition)


if(startPosition > recTotal or endPosition < 0) then return {} end --没有找到要查询的结果

return redis.call('zrange',zsetKey,startPosition,endPosition)



--[[
zset 查询总数: 
 格式: <zsetKey> <searchKey> 
 参数说明:{
	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 end
local 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-2
end

local startPosition,endPosition = getRange(searchKey);

if(startPosition > recTotal or endPosition < 0) then return 0 end --没有找到要查询的结果

return endPosition - startPosition + 1;



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

© 著作权归作者所有

共有 人打赏支持
C
粉丝 17
博文 296
码字总数 128442
作品 0
福州
私信 提问
SSM(七)在JavaWeb应用中使用Redis

前言 由于最近换(mang)了(de)家(yi)公(bi)司接触了新的东西所以很久没有更新了。 这次谈谈Redis,关于应该很多朋友就算没有用过也听过,算是这几年最流行的之一了。 的应用场景非常多这里就不...

crossoverJie
2016/12/19
0
0
使用SSM+Solr优雅的实现电商项目中的搜索功能

在学习了Redis&Spring-Data-Redis入门和Solr&Spring-Data-Solr入门后,接下来就该是项目实战了。这次我们用Vue.JS和ElementUI写前端页面,优雅的整合SSM-Shiro-Redis-Solr框架。 手摸手教你优...

TyCoding
09/25
0
0
再提LBS经纬度搜索和距离排序,求更优方案

再提LBS经纬度搜索和距离排序,求更优方案 1赞踩收藏 一直在琢磨LBS,期待可以发现更好的方案。现在纠结了。 简单列举一下已经了解到的方案: 1.sphinx geo索引 2.mongodb geo索引 3.MySQL ...

飓风2000
2016/08/04
40
1
关于redis个人博客数据结构设计

想用redis做个博客,博客有tags,文章title,文章content,点击量,时间,id号组成.用户可以通过搜索功能,从titile,content和tags查询相关性息,这纯用redis能完成吗?个人感觉不可能啊,redis的模糊查...

徐智渊
2013/03/11
1K
3
SSM(七)在JavaWeb应用中使用Redis

前言 由于最近换(mang)了(de)家(yi)公(bi)司接触了新的东西所以很久没有更新了。这次谈谈Redis,关于应该很多朋友就算没有用过也听过,算是这几年最流行的之一了。的应用场景非常多这里就不一...

crossoverJie
2016/12/18
238
0

没有更多内容

加载失败,请刷新页面

加载更多

最重要的是做什么,而不是怎么做。

最重要的是做什么,而不是怎么做。 做什么是战略,怎么做是战术。将军下令说,天黑前拿下这座山头,这是战略。手下的士兵可以不知道为什么要拿下这座山头,还非得是天黑之前,但士兵必须知道...

我是菜鸟我骄傲
33分钟前
0
0
w, vmstat, top, sar, nload命令查看系统状态信息

w/uptime 查看系统负载 cat /proc/cpuinfo 查看cpu核数 vmstat 监控系统状态,用法 vmstat 1,关键的几列: r, b, swpd, si, so, bi, bo, us, wa top 查看进程使用资源情况 top -c 显示详细的...

野雪球
今天
2
0
小白创建一个spring boot项目

进入 https://start.spring.io/

lilugirl
今天
3
0
Alibaba Java诊断利器Arthas实践--使用redefine排查应用奇怪的日志来源

背景 随着应用越来越复杂,依赖越来越多,日志系统越来越混乱,有时会出现一些奇怪的日志,比如: [] [] [] No credential found 那么怎样排查这些奇怪的日志从哪里打印出来的呢?因为搞不清...

hengyunabc
今天
2
0
home hosts

home hosts lwk@qwfys:~$ cat /etc/hosts127.0.0.1 localhost127.0.1.1 qwfys192.168.56.101vm600.qwfys.com39.108.212.91alpha1.ppy.com39.108.117.122alpha2.p......

qwfys
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部