redis实现分页
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实现分页的更多相关文章
- hbase+springboot+redis实现分页
实现原理: 1.读取hbase数据每页的数据时多取一条数据.如:分页是10条一页,第一次查询hbase时, 取10+1条数据,然后把第一条和最后一条rowkey数据保存在redis中,redis中的k ...
- redis缓存分页思路
传统分页一般分页做缓存都是直接查找出来,按页放到缓存里,但是这种缓存方式有很多缺点.如缓存不能及时更新,一旦数据有变化,所有的之前的分页缓存都失效了.比如像微博这样的场景,微博下面现在有一个顶次数的排 ...
- [redis]redis实现分页的方法
每个主题下的用户的评论组装好写入Redis中,每个主题会有一个topicId,每一条评论会和topicId关联起来,大致的数据模型如下:{ topicId: 'xxxxxxxx', comments: ...
- redis缓存分页数据ID
1.用户通过分类.属性进来分页时 如果没有缓存,就读数据库前10页的数据Id,转为json,根据cate_分类1+cate_分类2+cate_分类3+arr_属性1+arr_属性2+arr_属性3作为 ...
- 使用MYSQL+Redis完成分页读取功能
public function getAnchorByPopularity($page, $pagesize){ //验证参数的正确性 if(!is_numeric($page) || !is_num ...
- redis实现分页技术
声明:原博客在这里https://www.cnblogs.com/find-the-right-direction/p/8465011.html,谢谢哥们提供,尊重原创. 本人是在原有的springb ...
- Redis 笔记与总结8 PHP + Redis 信息管理系统(分页+好友关注)
分页 要对列表页进行分页,需要知道: ①用户总数 $count ② 页大小 $pageSize:用户自定义 ③ 当前页:$page:GET 方式获取 ④ 总页数:$pageCount = ceil($ ...
- redis分页摘抄
Redis 笔记与总结8 PHP + Redis 信息管理系统(分页+好友关注) 分页 要对列表页进行分页,需要知道: ①用户总数 $count ② 页大小 $pageSize:用户自定义 ③ 当前页 ...
- 分页查询和redis
问题 我在做论坛的是时候遇到了如下的问题.论坛里可以有很多的主题topic,每个topic对应到很多回复reply.现在要查询某个topic下按照replyTime升序排列的第pageNo页的repl ...
随机推荐
- java基础(一):谈谈java内存管理与垃圾回收机制
看了很多java内存管理的文章或者博客,写的要么笼统,要么划分的不正确,且很多文章都千篇一律.例如部分地方将jvm笼统的分为堆.栈.程序计数器,这么分太过于笼统,无法清晰的阐述java的内存管理模型: ...
- Linux系统上Nginx服务器的安装与配置
前言: 详细步骤移步菜鸟教程 一. 安装Nginx,注意虚拟机与宿主机的网络连通性 l 安装编译工具及库文件(zlib库. ssl) yum -y install make zlib zlib-de ...
- MongoDB 中数据的替换方法实现 --类Replace()函数功能
关键字: MongoDB,Replace,forEach 近日接到一个开发需求,因业务调整,需要DBA协助,将MongoDB数据库中某集合的进行替换.例如我们需要将集合A中B字段中,有关<美好& ...
- Docker-Docker-compose应用
Docker-compose是用来定义和运行多容器应用的工具,它是独立于docker存在的,需要单独安装.实际应用场景中,我们的应用可能被打包运行在不同的容器里面,例如一个常规的web应用可能会涉及到 ...
- Redis 主从复制原理及雪崩 穿透问题
定义: Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发工作由VMw ...
- SQLServer之删除用户定义的数据库角色
删除用户定义的数据库角色注意事项 无法从数据库删除拥有安全对象的角色. 若要删除拥有安全对象的数据库角色,必须首先转移这些安全对象的所有权,或从数据库删除它们. 无法从数据库删除拥有成员的角色. 若要 ...
- JSBridge的实现
JSBridge是Native代码与JS代码的通信桥梁.目前的一种统一方案是:H5触发url scheme->Native捕获url scheme->原生分析,执行->原生调用h5. ...
- animation动画案例
最近一直苦恼做一个banner的进度条,原先用js改变width值,但明显卡顿.后来用了animation,超级好用. <!DOCTYPE html> <html lang=&quo ...
- eval、exec及元类、单例实现的5种方法
eval内置函数 # eval内置函数的使用场景:# 1.执行字符串会得到相应的执行结果# 2.一般用于类型转化,该函数执行完有返回值,得到dict.list.tuple等dic_str = ...
- Django Models 查询操作
1.准备数据表: from django.db import models class City(models.Model): name=models.CharField(max_length=32) ...