文档章节

redis 分页查询

Canaan_
 Canaan_
发布于 2016/04/15 15:04
字数 578
阅读 878
收藏 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;



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

© 著作权归作者所有

Canaan_
粉丝 21
博文 444
码字总数 187561
作品 0
福州
私信 提问
加载中

评论(0)

Topfox 快速开发框架更新了版本 1.2.4 与 1.2.5

版本1.2.5 更新日志 2019-07-30 CamelHelper为驼峰和下划线命名互转的处理类 BeanUtil.toUnderlineName 删除, 用 CamelHelper.toUnderlineName 代替 BeanUtil.toCamelCase 删除, 用 CamelHel......

杭州罗平
2019/08/02
552
1
TopFox 开发框架(srpingboot2 MyBatis redis)

topfox 快速开发框架介绍 在 srpingboot2.x.x 和 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。和 Mybatis Plus 相似但更强大. 特性: 无侵入:只做增强不做改变,引入它不会...

杭州罗平
2019/07/18
1K
5
使用SSM+Solr优雅的实现电商项目中的搜索功能

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

TyCoding
2018/09/25
698
0
SSM(七)在JavaWeb应用中使用Redis

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

crossoverJie
2016/12/19
0
0
再提LBS经纬度搜索和距离排序,求更优方案

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

飓风2000
2016/08/04
320
1

没有更多内容

加载失败,请刷新页面

加载更多

centos7.4解压方式安装mysql5.7

删除Mysql yum remove mysql mysql-server mysql-libs mysql-server; find / -name mysql #将找到的相关东西删掉;例如:rm -rf /var/lib/mysql rpm -qa|grep mysql #(查询出来的东东yum rem......

中颀013
54分钟前
21
0
如何在电脑屏幕上录制视频?安利一款屏幕录像软件

如何在电脑屏幕上录制视频?相信很多小伙伴都会有这个需求,毕竟如今网上有很多教学视频或者游戏直播视频等,它们在市场上有产出所以必定会有大量需求,所以,如果伙伴们也想通过对电脑视频进...

斯卡哈
55分钟前
22
0
SQL笔试 I 经典44题及答案解析

01 建表语句 create table Student(sid varchar(10),sname varchar(10),sage datetime,ssex nvarchar(10));insert into Student values('01' , '赵雷' , '1990-01-01' , '男');insert into......

osc_s4e6jr85
55分钟前
14
0
csharp WebUploader 分块上传

HTML部分 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="index.aspx.cs" Inherits="up6.index" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://......

osc_afifi2qt
56分钟前
13
0
通信原理的新认识-从实践到原理

在读书期间,本人是学习的通信专业,曾反复研读樊昌信老师写的《通信原理》这本书,一直停留在表面且没有新的理解,直到毕业之后从事通信相关的工作,才在实践层面对通信有了新认识。现就将新...

osc_2mvp7jnu
58分钟前
19
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部