文档章节

redis 分页查询

C
 Canaan_
发布于 2016/04/15 15:04
字数 578
阅读 534
收藏 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
粉丝 16
博文 256
码字总数 109262
作品 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
40
1
SSM(七)在JavaWeb应用中使用Redis

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

crossoverJie
2016/12/18
238
0
关于redis个人博客数据结构设计

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

徐智渊
2013/03/11
1K
3
一步步实现 Redis 搜索引擎

原文出处:jasonGeng88 场景 大家如果是做后端开发的,想必都实现过列表查询的接口,当然有的查询条件很简单,一条 SQL 就搞定了,但有的查询条件极其复杂,再加上库表中设计的各种不合理,导...

jasonGeng88
2017/06/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

180.mariadb 主从复制

参考:https://blog.csdn.net/chengxuzaza/article/details/62042920 睡觉睡觉,明天写 1.效果 当主库中数据有变化的时候,从库就自动同步 2. 环境要求 至少两台 linux服务器 (教程:https...

Lucky_Me
9分钟前
0
0
erlng file id3v1 id3v1.1

%% ---%% Excerpted from "Programming Erlang",%% published by The Pragmatic Bookshelf.%% Copyrights apply to this code. It may not be used to create training material, %% ......

xueyuse0012
10分钟前
0
0
RabbitMq的安装

环境Centos6.5 32位 JDK 1.7.8 Jdk的卸载 rpm -qa|grep jdk yum –y remove 上边的安装包 JDK的安装 Rpm –ivh jdk安装包 配置环境变量 export JAVA_BIN=/usr/java/jdk1.7.0_80/bin export J......

DemonsI
14分钟前
0
0
http和https协议

HTTPS全称为Hypertext Transfer Protocol over Secure Socket Layer,中文含义为“超文本传输协议在安全加密字层”,简单来说就是加密数据传输,通俗的说就是安全连接。 HTTPS安全超文本传输...

寰宇01
20分钟前
0
0
vue内引入语音播报功能

在vue项目中引入语音播报,使用的科大讯飞语音接入, 具体思路为每次接收到语音信息后存入一个数组,然后监听这个数组,开始冲第一个索引播放,并且同时根据vuex getter 来动态删减数量 给a...

originDu
29分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部