1.利用链表实现文章列表页缓存 http://www.woyaofeng.com/1411.html
通常的文章列表,每次都要访问数据库,数据库压力很大,一个分页条件的不同页面之间数据无法共享。一旦数据库出问题时,整个页面随之无法访问。
怎么办?可以增加memcache缓存。每一页做一个缓存,例如10分钟。但是多页之间,可能你先缓存,我后缓存,数据就会出现不一致的情况。而且每一页的缓存创建都需要访问数据库。如果将所有结果缓存起来,每次读取出整个缓存再分析出分页数据,不仅性能不高,服务器网卡也将承受巨大的流量压力。
而redis的链表功能,能基本完美的解决这些问题。
将mysql查询出的列表的全部文章id都保存到一个链表里,需要访问第N页时,只需要lrange出对应的PAGE_SIZE个文章id,然后再从缓存中读取这PAGE_SIZE个文章的信息。列表就完成了。下次访问的时候,就完全不需要数据库,直到缓存失效。并且一次读取,所有分页都共用该缓存。不仅提高了效率,还保证了分页间的数据一致。文章信息,也再从数据库读取之后,保存到redis中。
对于访问频繁且从数据库读取代价比较大的数据,一旦缓存失效,将有多个并发去请求数据库,给数据库带来很大的压力。这时可以给列表缓存(命名为list)再加个存活缓存(命名为live)。list永不过期,而live存活时间只有10分钟。每次先lrange请求出需要的数据,再检测live是否存在。如果不存在就先重新设置live,然后再从数据库读取列表,重新设置list。这样的好处就是,只有第一个检测到live失效的请求会访问数据库,其他并发请求访问的是缓存数据。
这个方法带来的另一个好处是,即使数据库宕机,列表仍然能正常访问
2. redis做带分页的列表缓存最近的工作是优化网站的列表缓存 采用的是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中组成数组,输出。这样一个列表缓存就搞定了
3.能不能分批获取的redis数据结构
对于你现在的直接k-v存储方式,不能分批获取。如果要分批获取的话肯定要维护一个除了k-v之外的一个类似“索引”的东西。
所以string,hash的数据类型都不能分批获取,而list,set,sorted set类型则可以分批获取。
如需既需要顺序又需要唯一性的话,可以使用sorted set结构,
4.用mysql+redis实现微博feed架构上需要注意哪些问题