最近的工作是优化网站的列表缓存
采用的是redis+memcache结构
redis只存文章ID号及逻辑关系 memcache存单篇文章的信息、内容及点击数
redis和memcache采用的都是主动缓存模式,在通常情况下,缓存时间不设时限,并且不主动读取mysql数据库,所有的数据从缓存中读取
列表缓存需求:不同分类及所有分类的文章列表,带分页功能
redis使用lists存储不同的分类列表
例: news_list_1: 表示存放文章cid为1的列表的key,值为id号
new_list_1:2:3:4:5 表示存放文章cid为1,2,3,4,5的全部文章列表的key
压数据:从mysql中按排序要求把这些文章的ID号摄取出来,从底部开始压入按cid命名的lists中
添加新篇文章后,把新的文章id压入最上面,然后从mysql中,按顺序读取这个ID上面有多少篇文章,决定交换多少次的次数n
然后把新的文章ID(因为压在最上页,index为0)与下面的index 一个一个交换值 ,一共交换上面从mysql得到的次数n
修改排序方法同新加。先删除,然后把ID压到最上面,最后把这个ID下沉到指定位置
删除ID就简单了,直接可以使用lists的删除命令,通过value删除
需要使用分页,则主要是使用命令 LRANGE key start end 指定开始的index及结束的index.按分页要求取一段数据
然后把取到这的段ID数组,放入memcache中得到文章的标题等信息,最后在php中组成数组,输出。这样一个列表缓存就搞定了
多分享一些redis的使用经验和技巧吧,这方面的技术资料比较缺,学习过程中常常找不到路
没有看明白,为什么要先从上面压入,在交换n次,沉到下面呢,不能原子性的修改么?
可惜不能哦,因为index是自然序号,是一个一个生成的。能改变的只是value值,而且这个交换很快的,可以从mysql中的时间来判断是从头部插入下沉,或是从底部插入上升。其实原理就像排队买票一样。如果一个人要插队的话,前面或后面的全部人都会改变他们的index也就是原本的顺序
上次有一phper他们公司的实现方式类似,但是是用memcache模拟队列,因为存的都是id号,数据量超小,php全部读出存数组,然后处理,存memcache 或是直接从mysql把全部的id通过排序读出存memcache,因为只读id一个字段,而且id是主键,速度方面影响不大。
LRANGE 的时间复杂度是
O(S+N), S 为偏移量 start , N 为指定区间内元素的数量。
5000万数据分页消耗太大。。
有道理 ,所以改为set和sort比较高效
@℃冻番茄: 改成set? 那如何做到range操作呢?
sort命令