redis有序集合和哈希联合使用
浏览量:444
防止数据库挂掉,就不应该把数据放在缓存里面,下面就是我经常使用的一种方法
<?php
/**
* 按照所属分类查询商品
* @param int $cat_id 分类id
* @param int $page 页数
* @param int $limit 条数
* @param string $sort 排序
* @return bool array 数组
* author : lianghuiju@chuchujie.com
* function_name : get_mall_goods
* date :2016-08-19
* description :
*/
public function get_mall_goods($cat_id, $page = 1, $limit = 20, $sort = 'sort_order')
{
$catgory_id = (int)trim($cat_id);
$zset_key = "good_ids-zset:" . $catgory_id . ':' . $sort;
$hash_key = "good_ids-hash:" . $catgory_id . ':' . $sort;
$count_key = "count_goods";
$this->load->driver('cache');
$start = ($page - 1) * $limit;
$end = $start + $limit - 1;
$where = array(
'cat_id' => $cat_id,
'is_on_sale' => '1',
'is_alone_sale' => '1',
'is_delete' => '0',
'is_team' => '1',
);
//按照sort从小到大排序
$goodids = $this->cache->redis->Zrange($zset_key, $start, $end);
//获取总页数
$count_goods = $this->cache->redis->get($count_key);
$query = array();
if ($count_goods) {
$query['page'] = $count_goods;
} else {
$count = $this->find($where, "count(*) as count_goods");
$max_page = ($count > 0) ? ceil($count['count_goods'] / $limit) : 1;
$this->cache->redis->save($count_key, $max_page, 600);
$query['page'] = $max_page;
}
if (!empty($goodids)) {
foreach ($goodids as $id) {
//从缓存里面读取详情信息
$json_array = $this->cache->redis->hGet($hash_key, $id);
$query['data'][] = json_decode($json_array, TRUE);
}
return $query;
}
$data = $this->select($where, " * ", $sort, $page, $limit);
$goods_info = array();
foreach ($data as $row) {
//写入缓存
$this->cache->redis->zAdd($zset_key, $row['sort_order'], $row['goods_id']);
$data_json = json_encode($row, JSON_UNESCAPED_UNICODE);
$this->cache->redis->hSet($hash_key, $row['goods_id'], $data_json);
$goods_info['data'][] = $row;
}
$goods_info['page'] = $query['page'];
return $goods_info;
}
神回复
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。