redis实现分页功能,主要是将数据缓存起来,无需频繁查询数据库,减少数据库的压力。

适用场景:单用户操作列表界面分页,如博客列表。

缺点:不可模糊查询,缺少灵活性。

封装类:

class XgRedis
{
protected $_redis;
public function __construct($hash_prefix=''){
$this->_redis = connectRedis::getinstance();;
//$this->_redis = Redis::connection();
} /*
* 添加记录
* @param $hash_prefix 前缀
* @param $id 记录id
* @param $data 数据
* @return bool 返回值
*/
public function set_redis_page_info($hash_prefix,$id,$data){
if(!is_numeric($id) || !is_array($data)) return false;
$hashName = $hash_prefix.'_'.$id;
//同时设置 hash 的多个 field,已存在会自动更新
$this->_redis->hmset($hashName, $data);
//添加元素到有序集合,元素在集合中存在则更新对应的score(权)(key,权,值)
$this->_redis->zadd($hash_prefix.'_sort',$id,$id);
return true;
} /*
* 获取分页数据
* @param $hash_prefix 前缀
* @param $page 当前页数
* @param $pageSize 每页多少条
* @param $hashName Hash 记录名称
* @param $SortName Redis SortSet 记录名称
* @param $redis Redis 对象
* @param $key 字段数组 不传为取出全部字段
* @return array
*/
public function get_redis_page_info($hash_prefix,$page,$pageSize,$key=array()){
if(!is_numeric($page) || !is_numeric($pageSize)) return false;
$limit_s = ($page-1) * $pageSize;
$limit_e = ($limit_s + $pageSize) - 1;
//类似lrange操作从集合中去指定区间的元素,返回的是带有 score 值(可选)的有序结果集:
$range = $this->_redis->zrange($hash_prefix.'_sort',$limit_s,$limit_e);
//统计ScoreSet集合元素总数
$count = $this->_redis->zcard($hash_prefix.'_sort');
$pageCount = ceil($count/$pageSize); //总共多少页
$pageList = array();
foreach($range as $qid){
if(count($key) > 0){
$pageList[] = $this->_redis->hmget($hash_prefix.'_'.$qid,$key); //获取hash表中的field所有的数据
}else{
$pageList[] = $this->_redis->hgetall($hash_prefix.'_'.$qid); //获取hash表中所有的数据
}
}
$data = array(
'data'=>$pageList, //需求数据
'page'=>array(
'page'=>$page, //当前页数
'pageSize'=>$pageSize, //每页多少条
'count'=>$count, //记录总数
'pageCount'=>$pageCount //总页数
)
);
return $data;
} /*
* 获取单条记录
* @param $id id
* @return array
*/
public function show_redis_page_info($hash_prefix,$id){
$info = $this->_redis->hgetall($hash_prefix.'_'.$id);
return $info;
} /*
* 删除记录 单条或多条
* @param $ids ids 数组形式 [1,2,3]
* @param $hashName Hash 记录名称
* @param $SortName Redis SortSet 记录名称
* @param $redis Redis 对象
* @return bool
*/
public function del_redis_page_info($hash_prefix,$ids){
if(!is_array($ids)) return false;
foreach($ids as $value){
$hashName = $hash_prefix.'_'.$value;
$this->_redis->del($hashName);
$this->_redis->zrem($hash_prefix.'_sort',$value);
}
return true;
} /*
* 清空数据
* @param string $type db:清空当前数据库 all:清空所有数据库
* @return bool
*/
public function clear($type='db'){
if($type == 'db'){
$this->_redis->flushdb();
}elseif($type == 'all'){
$this->_redis->flushall();
}else{
return false;
}
return true;
} /*
* 入栈单条数据,针对某个用户可以,多用户并发就不好了
* @param $hash_prefix 前缀
* @param $data 数据
* @return bool 返回值
*/
public function in_data($hash_prefix,$data){
if(count($data) != count($data,1)) echo '须为一维数组';return false;
if(!is_array($data)) return false;
//统计ScoreSet集合元素总数
$id = $this->_redis->zcard($hash_prefix.'_sort');
$hashName = $hash_prefix.'_'.$id;
//同时设置 hash 的多个 field,已存在会自动更新
$this->_redis->hmset($hashName, $data);
//添加元素到有序集合,元素在集合中存在则更新对应的score(权)(key,权,值)
$this->_redis->zadd($hash_prefix.'_sort',$id,$id);
return true;
} }

连接redis:

class connectRedis
{
static $redis_port = '6379';
static $redis_host = '127.0.0.1'; private function __construct()
{
} static public $instance; static public function getinstance()
{
if (!self::$instance) self::$instance = new self();
try {
$redis = new Redis();
$redis->connect(static::$redis_host, static::$redis_port);
} catch (Exception $e) {
die('RedisException : Can\'t connect to ' . static::$redis_host . ':' . static::$redis_port);
}
return $redis;
}
}

连接数据库:

class connectVboxDb{
static $db = 'demo';
static $host = '192.168.1.20';
static $pdo;
private function __construct(){
$pdo = new PDO('mysql:host='.static::$host.';dbname='.static::$db,'root','Aaa2019.cn');
$pdo->query('set names utf8');//设置字符集
static::$pdo = $pdo;
} static public $instance;
static public function getinstance(){
if(!self::$instance) self::$instance = new self();
return self::$instance;
} static public function fetchAll($sql){
$qry = static::$pdo->query($sql);
$rst = $qry->fetchAll(PDO::FETCH_ASSOC);
return $rst;
}
}

index:

require_once('../connectRedis.php');
require_once('xgredis.php');
require_once('../../connectVboxDb.php'); $XgRedis = new XgRedis();
connectVboxDb::getinstance(); $post = connectVboxDb::fetchAll('select * from PaydayCardOrder');
$key_name = 'PaydayCardOrderList';
//var_dump($post);die;
foreach ($post as $k => $v) {
//将每条数据信息存储起来,这里key是数组key,信息后期有添加可以入栈添加,不影响其他信息,
$XgRedis->set_redis_page_info($key_name, $k, $v);
}
//$XgRedis->in_data($key_name,$post[0]);
//var_dump($XgRedis->del_redis_page_info($key_name,[52,53]));
var_dump($XgRedis->get_redis_page_info($key_name, 1, 100));
//var_dump($XgRedis->show_redis_page_info($key_name,0));

总结:redis做为缓存工具使用,

  ①  定义的key要简洁明了,不可过长。

  ②  无用数据要及时清除掉,防止服务器内存过大。清除的时候,建议设置过期时间,防止当前有其他用户使用。

  ③  更新缓存数据,应当先更新数据库,再更新redis缓存,防止并发下出现脏数据。

当然网上很多也很全,自己整理的先就这些。

redis实现分页的更多相关文章

  1. hbase+springboot+redis实现分页

    实现原理: 1.读取hbase数据每页的数据时多取一条数据.如:分页是10条一页,第一次查询hbase时, 取10+1条数据,然后把第一条和最后一条rowkey数据保存在redis中,redis中的k ...

  2. redis缓存分页思路

    传统分页一般分页做缓存都是直接查找出来,按页放到缓存里,但是这种缓存方式有很多缺点.如缓存不能及时更新,一旦数据有变化,所有的之前的分页缓存都失效了.比如像微博这样的场景,微博下面现在有一个顶次数的排 ...

  3. [redis]redis实现分页的方法

    每个主题下的用户的评论组装好写入Redis中,每个主题会有一个topicId,每一条评论会和topicId关联起来,大致的数据模型如下:{ topicId: 'xxxxxxxx', comments: ...

  4. redis缓存分页数据ID

    1.用户通过分类.属性进来分页时 如果没有缓存,就读数据库前10页的数据Id,转为json,根据cate_分类1+cate_分类2+cate_分类3+arr_属性1+arr_属性2+arr_属性3作为 ...

  5. 使用MYSQL+Redis完成分页读取功能

    public function getAnchorByPopularity($page, $pagesize){ //验证参数的正确性 if(!is_numeric($page) || !is_num ...

  6. redis实现分页技术

    声明:原博客在这里https://www.cnblogs.com/find-the-right-direction/p/8465011.html,谢谢哥们提供,尊重原创. 本人是在原有的springb ...

  7. Redis 笔记与总结8 PHP + Redis 信息管理系统(分页+好友关注)

    分页 要对列表页进行分页,需要知道: ①用户总数 $count ② 页大小 $pageSize:用户自定义 ③ 当前页:$page:GET 方式获取 ④ 总页数:$pageCount = ceil($ ...

  8. redis分页摘抄

    Redis 笔记与总结8 PHP + Redis 信息管理系统(分页+好友关注) 分页 要对列表页进行分页,需要知道: ①用户总数 $count ② 页大小 $pageSize:用户自定义 ③ 当前页 ...

  9. 分页查询和redis

    问题 我在做论坛的是时候遇到了如下的问题.论坛里可以有很多的主题topic,每个topic对应到很多回复reply.现在要查询某个topic下按照replyTime升序排列的第pageNo页的repl ...

随机推荐

  1. react异步加载组件

    1. 创建 asyncComponent 异步加载工具 import React from 'react' function asyncComponent(loadComponent){ class ...

  2. java工作流引擎Jflow父子流程demo

    关键字 驰骋工作流引擎 流程快速开发平台 workflow ccflow jflow  .net开源工作流 定义 一个流程A的一个节点,因工作的需要调起另外的流程B,A就叫父流程,B就叫子流程.如果流 ...

  3. arcgis api 3.x for js 入门开发系列十四最近设施点路径分析(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  4. Python笔记-IO编程

    IO在计算机中是指input和output(数据输入与输出),涉及到数据交换(磁盘.网络)的地方就需要IO接口. 输入流input stream是指数据从外面(磁盘.网络服务器)流入内存:输出流out ...

  5. 客户端传值里面包含URL特殊字符的应对方法

    URL传递值的时候参数里面含有%2f等URL转义问题可通过URLDecoder.decode(字符串,“utf-8”);的方法去转义为"/". 此外:URLEncoder是将字符串 ...

  6. 好代码是管出来的——.Net Core集成测试与数据驱动测试

    软件的单元测试关注是的软件最小可执行单元是否能够正常执行,但是软件是由一个个最小执行单元组成的集合体,单元与单元之间存在着种种依赖或联系,所以在软件开发时仅仅确保最小单元的正确往往是不够的,为了保证软 ...

  7. SQL 获取时间段内日期列表

    declare @start date,@end date; set @start='2010-01-01'; set @end='2010-02-01'; --获取时间段内日期列表 select [ ...

  8. 前端之BOM

    老师的博客:https://www.cnblogs.com/liwenzhou/p/8011504.html BOM(Browser Object Model)是指浏览器对象模型,它使 JavaScr ...

  9. Python学习步骤如何安排?

    一.清楚学习目标 无论是学习什么知识,都要有一个对学习目标的清楚认识. 只有这样才能朝着目标持续前进,少走弯路,从学习中得到不断的提升,享受python学习计划的过程. 二.基本python 知识学习 ...

  10. Education CodeForces Round 63 Div.2

    A. Reverse a Substring 代码: #include <bits/stdc++.h> using namespace std; int N; string s; int ...