文档章节

redis 分页查询

C
 Canaan_
发布于 2016/04/15 15:04
字数 578
阅读 523
收藏 3
点赞 1
评论 0

算法:

容器使用的是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
粉丝 13
博文 226
码字总数 97359
作品 0
福州
SSM(七)在JavaWeb应用中使用Redis

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

crossoverJie ⋅ 2016/12/19 ⋅ 0

再提LBS经纬度搜索和距离排序,求更优方案

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

飓风2000 ⋅ 2016/08/04 ⋅ 1

SSM(七)在JavaWeb应用中使用Redis

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

crossoverJie ⋅ 2016/12/18 ⋅ 0

关于redis个人博客数据结构设计

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

徐智渊 ⋅ 2013/03/11 ⋅ 3

一步步实现 Redis 搜索引擎

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

jasonGeng88 ⋅ 2017/06/19 ⋅ 0

Springboot项目中Mybatis分页和Redis缓存之间的冲突

该项目是SpringBoot项目, 查询列表时,我在Controller层时加了分页,在Mapper层加了缓存注解 然后当使用Mapper层访问其他的业务时就报错了,比如我查询版本信息,结果在查询语句后面就自动加...

哦哦哦飞 ⋅ 04/14 ⋅ 0

用Redis实现微博关注关系

关注 粉丝 双向关注(互粉) 无关系 在微博中,每一个用户都会有一个关注列表,一个粉丝列表。用户可以查看自己的关注,粉丝列表,也可以查看别人的关注,粉丝列表。并且,要展示列表里每个人与...

jockchou ⋅ 2015/07/02 ⋅ 25

DreamWork/mgfinal

mgfinal 基于mgwork(servlet3.0多实例非单例)做mvc框架,mybatis做orm框架,mgioc做单例容器的mgfinal框架,mgutil做日志及常用工具方法管理,致力于打造实用的java后台底层。 适用于中小型...

DreamWork ⋅ 2016/05/07 ⋅ 0

技术积累笔记概要

2015年11月24日 1、rest 速率限制,写属于自己的方法。 2、actions方法深刻了解。 3、YII技术博客:http://blog.csdn.net/terrywater/article/category/2565815。 4、静态方法传递参数的习惯...

风清扬-深圳 ⋅ 2015/11/24 ⋅ 0

cassandra 有感

最近研究也开始研究cassandra了。 cassandra 相对于Mongodb Cassandra 更强调稳定,Scalability。(clustering,failvoer,crashonly的设计。查询只是key 查询) mongdb则是个文档数据库,强...

youandroid ⋅ 2010/07/28 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

思路分析 如何通过反射 给 bean entity 对象 的List 集合属性赋值?

其实 这块 大家 去 看 springmvc 源码 肯定可以找到实现办法。 因为 spirngmvc 的方法 是可以 为 对象 参数里面的 list 属性赋值的。 我也没有看 具体的 mvc 源码实现,我这里只是 写一个 简...

之渊 ⋅ 30分钟前 ⋅ 0

vim使用手册--配对括号的查找

1、把光标放在标记有(、[或{处。 2、按%字符 3、此时光标的位置应当在配对的括号处 4、再次按%就可以跳回配对的第一个括号处。

dragon_tech ⋅ 34分钟前 ⋅ 0

c++ 、object-c printf,%02X和%x有什么区别 ?

%x即按十六进制输出,英文字母小写,右对齐。 %02X有以下变化:英文字母变大写,如果输出字符不足两位的,输出两位宽度,右对齐,空的一位补0。超过两位的,全部输出。 如果不用 %02x 会出现...

yizhichao ⋅ 39分钟前 ⋅ 0

Spring源码解析(七)——实例创建(中)

前言 上一节讲到了,Spring 会根据实例的作用域执行不同的创建逻辑,分别是 Singleton、Prototype、其他 Scope,其中 Singleton 会调用 getSingleton 从缓存中获取,缓存中没有才会创建实例;...

MarvelCode ⋅ 40分钟前 ⋅ 0

Thrift RPC实战(六) spring集成thrift

1.服务端设置 对泛型Thrift Service的支持, 通过采用spring配置以及反射的方式来实现.对于一个服务提供者来说,需要提供端口,接口以及接口实现类,因此在接口中spring配置文件中配置如下 <!...

lemonLove ⋅ 42分钟前 ⋅ 0

oracle11g自动分区使用

为什么使用自动分区? 在oracle11g之前,oracle是不支持自动分区功能的,这就可能导致我们系统在运行一段时间之后,就需要看看分区是否创建或者写触发器进行创建分区,否则就会导致数据无法入...

strict_nerd ⋅ 53分钟前 ⋅ 0

Spring mvc ViewResolver视图解析器实现机制

概要 我们在controller里面经常这样return一个ModelAndView。 return new ModelAndView("userList", "users", userList); DispatcherServlet 靠 ViewResolver 把 userList 解析为 /WEB-INF......

轨迹_ ⋅ 今天 ⋅ 0

策略模式

1.策略模式 策略模式是同一个行为的不同处理办法。策略模式和简单工厂模式的区别:1.策略模式主要是方法的执行方式,工厂模式要获取的对象。两者的侧重点不同。 ...

Cobbage ⋅ 今天 ⋅ 0

行政区划代码转为字典形式

原数据为: http://www.mca.gov.cn/article/sj/xzqh/2018/201804-12/201804-06041553.html 手动替换了一下格式,并使用下面的代码处理. # 输入格式s = """110000:北京市110101:东城区1101...

漫步海边小路 ⋅ 今天 ⋅ 0

android apk 签名

创建key,需要用到keytool.exe (位于C:\Program Files\Java\jdk1.6.0_10\bin目录下),使用产生的key对apk签名用到的是jarsigner.exe (位于C:\Program Files\Java\jdk1.6.0_10\bin目录下),把...

国仔饼 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部