精华内容
下载资源
问答
  • redis缓存分页数据

    千次阅读 2017-09-23 11:09:00
    在我们开发项目的过程中,经常会对数据做分页展示,如果每次请求都去查询数据库,当访问量增大时,...下面就给出高并发下的分页数据缓存方案。 一、需要了解的一些知识点 1、redis的hmset(key, value)方法,将key值设置

                         

             在我们开发项目的过程中,经常会对数据做分页展示,如果每次请求都去查询数据库,当访问量增大时,势必会加重数据库的负载,降低数据库性能。然而,有些数据的是极少变动的,或者说变动的频率不是很高,这时如果将这些数据进行缓存,不仅可以提高程序性能,还能降低数据库的负载。下面就给出高并发下的分页数据缓存方案。

    一、需要了解的一些知识点

    1、redis的hmset(key, value)方法,将key值设置为value,value是map类型的数据结构

    2、redis的hgetAll(key)方法,获取key的值,改值的类型为map类型的

    3、关键字synchronized

    4、key值包含的一些关键信息,前缀+当前的页数+每页数据的大小等

    二、代码实现

              
     /* (non-Javadoc)
    	 * 默认为60秒刷新一次;采用加锁模式应对高并发
    	 */
    	@Override
    	public Page<StrategySummary> getAdvisorStrategys(AdvisorCondition condition) throws IOException{
    		Pageable pageable=condition.getPage();
    		int currentPage = pageable.getPageNumber();
    		int pageSize = pageable.getPageSize();
    		Map<String,String> result=RedisUtil.getMap("advisor:"+condition.getId()+"_number:"+currentPage+"_size:"+pageSize, MARKET);
            if (result!=null&&result.size()>0) {
            	List<StrategySummary> dataList=JsonUtils.toJavaBeanList(result.get("data"), new TypeReference<List<StrategySummary>>() {});
            	long total=Long.valueOf(result.get("total"));
            	return new PageImplBean<StrategySummary>(dataList, pageable, total);	
    		} else {
    			Page<StrategySummary> page=null;
    			synchronized (MobileAppServiceImpl.class) {         //当首个线程将数据缓存后,后面的线程需再次检查,防止重复查询数据库和缓存数据
    				int count = 0;              
    				for (int i = 0; i < 3; i++) {                   //取3次,防止获取失败
    					Map<String,String> map =RedisUtil.getMap("advisor:"+condition.getId()+"_number:"+currentPage+"_size:"+pageSize, MARKET);
    					if (map==null||map.size()==0) {
    						continue;
    					}
    					if (map!=null&&map.size()>0) {
    						count++;
    						break;
    					}
    				}
    				if (count==0) {
    					page= mobileAppDao.getAdvisorStrategys(condition);
    					List<StrategySummary> dataList=page.getContent();
    					long total=page.getTotalElements();
    					if(dataList.size()>0){
    						Map<String, String> map=new HashMap<String,String>();
    						map.put("data", JsonUtils.toJsonString(dataList));
    						map.put("total", String.valueOf(total));
    						RedisUtil.setMapWithExpire("advisor:"+condition.getId()+"_number:"+currentPage+"_size:"+pageSize, map, MARKET);
    					}
    				}else{
    					Map<String,String> map =RedisUtil.getMap("advisor:"+condition.getId()+"_number:"+currentPage+"_size:"+pageSize, MARKET);
    					List<StrategySummary> dataList=JsonUtils.toJavaBeanList(map.get("data"), new TypeReference<List<StrategySummary>>() {});
    		        	long total=Long.valueOf(map.get("total"));
    		        	page= new PageImplBean<StrategySummary>(dataList, pageable, total);
    				}
    			}
    			return page;
    		}
    		
    	}

              
         
    展开全文
  • redis缓存分页数据ID

    2016-07-07 19:14:00
    1、用户通过分类、属性进来分页时 ...2、有缓存时,就直接读缓存分页数据Id,根据分页数,找出分页的ID,将分页id串成字符串,从数据库查询出数据 3、将查询出的数据和有序的数据ID进行排序 4、返回给前端用户...

    1、用户通过分类、属性进来分页时

    如果没有缓存,就读数据库前10页的数据Id,转为json,根据cate_分类1+cate_分类2+cate_分类3+arr_属性1+arr_属性2+arr_属性3作为 key值存储

    2、有缓存时,就直接读缓存的分页数据Id,根据分页数,找出分页的ID,将分页id串成字符串,从数据库查询出数据

    3、将查询出的数据和有序的数据ID进行排序

    4、返回给前端用户

    展开全文
  • C# redis缓存分页

    2020-03-06 21:59:34
    前言:我是借鉴别人的“redis缓存分页”的思路进行实现的,下面是代码实现部分(在我的博客中有一篇“转载”就是写的思路实现部分的,大家可以借鉴一下) /// <summary> /// 得到分页数据 /// 说明:使用了...

    前言:我是借鉴别人的“redis缓存分页”的思路进行实现的,下面是代码实现部分(在我的博客中有一篇“转载”就是写的思路实现部分的,大家可以借鉴一下)

      /// <summary>
            /// 得到分页数据
            /// 说明:使用了redis缓存分页
            /// </summary>
            /// <param name="pageNo"></param>
            /// <returns></returns>
            public Page.pa_ForumMain getPageData(int pageNo)
            {
                string userNum = "2091928133";
    
                //string userNum = HttpContext.Current.Session["UNumber"].ToString();
    
                Page.pa_ForumMain forumMain = new Page.pa_ForumMain();
                forumMain.pageNo = pageNo;//当前页
                forumMain.pageSize = (int)nf_ForumMain.PageNum;//每页显示条数
                forumMain.pageCountByParameter = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(new DAL.DAL_nf_ForumMain().getPageCount(userNum, forumMain.pageSize, forumMain.pageNo) + .0000)));//获得总页数【有一个三元表达式:防止用户没有博文抛异常】
                forumMain.pageCount = new BLL_nf_ForumMain().getDataCount(userNum);
    
                if (forumMain.pageCountByParameter < 0)//判断用户请求页数是否有数据
                    return new Page.pa_ForumMain() { pageCountByParameter = 0 };
    
                using (var client = RedisManager.GetClient())//判断redis中的ZSet集合里面是否存在数据
                {
                    if (client.GetSortedSetCount(userNum + "userBlogsZSet") == 0)//如果“ZSet集合”里面没有数据,但是数据库里面有
                       new VO.vo_redis_nf_ForumMain().getInitUserBlogsIdByRedisToZSet(userNum, forumMain);
                };//using end
    
                //如果“ZSet集合”存在数据
                using (var client = RedisManager.GetClient())
                {
                    //如果redis的ZSet里面存在数据,则查看Hash集合里面时候存在“指定区间”的数据。【存在就返回,不存在就先去数据库里面找。两个判断都要判断过期时间】
                    if (client.GetSortedSetCount(userNum + "userBlogsZSet") != 0)//如果“ZSet集合里面存在数据”,就获取指定区间内的
                    {
                        List<string> strlins = new VO.vo_redis_nf_ForumMain().getRedisBlogsIdByZSet(userNum, forumMain);//将“ZSet集合指定区间内的数据暂时存储到泛型集合里面”
                       
                        if (strlins.Count > 0)//如果“ZSet集合”的数据存在,“Hash集合里面又没有数据”,就不进行“Hash过期时间的判断”
                        {
                            foreach (string item in strlins)
                            {                         
                                if (client.GetHashCount(item) == 0)//如果“ZSet集合”的数据存在,并且指定“Hash集合里面不存在数据”,就增加指定区间内的数据
                                {
                                    if (new VO.vo_redis_nf_ForumMain().getInitUserBlogsIdByRedisToHash(userNum, strlins) == true)
                                        return new Page.pa_ForumMain() {pageNo= forumMain.pageNo, pageSize= forumMain.pageSize, pageCount=forumMain.pageCount, pageCountByParameter = forumMain.pageCountByParameter, forumMains= new VO.vo_redis_nf_ForumMain().getgetInitUserBlogsIdByRedisToHashValues(userNum,strlins) };
                                }
                                if (client.GetHashCount(item) != 0)//如果“ZSet集合存在数据”,指定“Hash集合”里面也存在数据,就进行“Hash过期时间”的判断
                                {
                                    DateTime time = Convert.ToDateTime(client.GetItemFromList(userNum + "userBlogsDatasTimeByRedisHash", 0));
                                    if (time == DateTime.Now.AddDays(30))//如果现在时间和过期时间一样,就删除“Hash集合”过期时间
                                    {
                                        client.Remove(item);//删除指定的“Hash集合”群【这里的】
                                    }//if end
                                    if (time != DateTime.Now.AddDays(30))//如果现在时间和过期时间不一样(Hash集合里面存在数据),将Hash集合指定区间内的数据取出来
                                    {
                                        if (new VO.vo_redis_nf_ForumMain().getInitUserBlogsIdByRedisToHash(userNum, strlins) == true)
                                            return new Page.pa_ForumMain() { pageNo = forumMain.pageNo, pageSize = forumMain.pageSize, pageCount = forumMain.pageCount, pageCountByParameter = forumMain.pageCountByParameter, forumMains = new VO.vo_redis_nf_ForumMain().getgetInitUserBlogsIdByRedisToHashValues(userNum, strlins) };
                                    }
                                }//if end
                            }//foreach end
                        }//if end
                    }//if end              
                };//using end      
    
                //如果出错,就直接返回“-1”
                return new Page.pa_ForumMain() { pageNo=-1};
            }//function end
    
     /// <summary>
            /// 获得数据库中,所有的用户博文Id并存储进“ZSet集合”
            /// </summary>
            /// <returns>布尔类型</returns>
            public bool getInitUserBlogsIdByRedisToZSet(string userNum, Page.pa_ForumMain forumMain=null)
            {
                DAL.DAL_nf_ForumMain forumMai = new DAL.DAL_nf_ForumMain();
    
                try
                {
                    //从数据库中查找数据
                    List<Model.nf_ForumMain> dataList = forumMai.getUserBlogsByTime(userNum);
                    using (var client = RedisManager.GetClient())
                    {
                        long Bignumber = 0;
                        foreach (Model.nf_ForumMain item in dataList)
                        {
                            Bignumber += 1;
                            client.AddItemToSortedSet(userNum + "userBlogsZSet", item.FMId, Bignumber);
                        }//foreach end
                        client.AddItemToList(userNum + "userBlogsZSetFirstCount", client.GetSortedSetCount(userNum + "userBlogsZSet").ToString());//存储第一次用户博文的总数
                        client.AddItemToList(userNum + "userBlogsZSetSecondCount", client.GetSortedSetCount(userNum + "userBlogsZSet").ToString());//除第一次外,用户的博文总数
                    }//using end
                    return true;
                }
                catch (Exception ex)
                {
                    return false;
                }
            }//function end
    
     /// <summary>
            /// 通过“第一个参数”和“第二个参数”获得ZSet集合区间内的博文Id,并进行返回
            /// pageNo、pageSize
            /// </summary>
            /// <returns></returns>
            public List<string> getRedisBlogsIdByZSet(string userNum, Page.pa_ForumMain forumMain)
            {
                List<string> strlins = new List<string>();
                using (var client = RedisManager.GetClient())
                {
                    IDictionary<string, double> pairs = client.GetRangeWithScoresFromSortedSet(userNum + "userBlogsZSet", (forumMain.pageSize * (forumMain.pageNo - 1) + 1), (forumMain.pageSize * forumMain.pageNo));//得到ZSet区间内的
                    for (int i = 0; i < pairs.Count; i++)
                        strlins.Add(pairs.ElementAt(i).Key);
                }//using end
    
                return strlins;
            }//function end
    
     /// <summary>y
            /// 将博文具体数据存储进Hash集合里面
            /// </summary>
            /// <param name="userNum"></param>
            /// <param name="datalength"></param>
            /// <param name="dataList"></param>
            /// <returns></returns>
            public bool getInitUserBlogsIdByRedisToHash(string userNum, List<string> strlins)
            {
                DAL.DAL_nf_ForumMain forumMain = new DAL_nf_ForumMain();
                try
                {
                    using (var client = RedisManager.GetClient())
                    {
                        foreach (string item in strlins)
                        {
                            Model.nf_ForumMain main = forumMain.getObject(item, userNum);
    
                            //17个对象字段为一个hash集群,hashId为该对象的Id
                            client.SetEntryInHash(main.FMId, "FMId", main.FMId);//帖子编号
                            client.SetEntryInHash(main.FMId, "FMTitle", main.FMTitle);//帖子标题
                            client.SetEntryInHash(main.FMId, "FMArea", main.FMArea.ToString());//区域编号
                            client.SetEntryInHash(main.FMId, "FMClassify", main.FMClassify.ToString());//分类编号
                            client.SetEntryInHash(main.FMId, "LId", main.LId);//标签编号
                            client.SetEntryInHash(main.FMId, "messager", main.messager);//发帖人编号
                            client.SetEntryInHash(main.FMId, "FMTime", main.FMTime.ToString());//发帖时间
                            client.SetEntryInHash(main.FMId, "FMContent", main.FMContent);//帖子内容
                            client.SetEntryInHash(main.FMId, "FBodyContent", main.FBodyContent);//纯文本内容
                            client.SetEntryInHash(main.FMId, "FImagesUrl", main.FImagesUrl);//图片路径
                            client.SetEntryInHash(main.FMId, "FMNumber", main.FMNumber.ToString());//点赞数量
                            client.SetEntryInHash(main.FMId, "FMViewCount", main.FMViewCount.ToString());//浏览次数
                            //求价值:
                            int number = new DAL.DAL_nf_ForumSecond().getCommentCount(main.FMId).Count();
                            string price = Math.Ceiling(Convert.ToDecimal(((long.Parse(client.GetValueFromHash(main.FMId, "FMNumber")) * 2) +//点赞数量
                                long.Parse(client.GetValueFromHash(main.FMId, "FMViewCount")) +//浏览数量
                                (number * 3)) / 3.0)).ToString();//评论数量[从后台拿到]
                            client.SetEntryInHash(main.FMId, "jiazhi", price);//【价值数量=浏览分数+点赞分数+评论分数】
                            client.SetEntryInHash(main.FMId, "Commentary", number.ToString());//评论数量
                            client.SetEntryInHash(main.FMId, "FMRecommend", main.FMRecommend.ToString());//是否推荐
                            client.SetEntryInHash(main.FMId, "FMExamine", main.FMExamine.ToString());//是否审查
                            client.SetEntryInHash(main.FMId, "IsDelete", main.IsDelete.ToString());//是否删除
                        }//foreach end
                        client.AddItemToList(userNum + "userBlogsDatasTimeByRedisHash", DateTime.Now.AddDays(30).ToString());//获得Hash集合过期时间
                        client.AddItemToList(userNum + "userBlogsImportDataTimeByRedisHash", DateTime.Now.AddDays(5).ToString());//获得“点赞、评论、浏览”的过期时间
                    }//using end
                    return true;
                }
                catch (Exception ex)
                {
                    return false;
                }//catch end
    
            }//function end
    
    /// <summary>
            /// 在“Hash集合”中得到指定区间的数据
            /// </summary>
            /// <param name="strlins">获得某ZSet集合区间内的用户博文Id</param>
            /// <returns></returns>
            public List<Model.nf_ForumMain> getgetInitUserBlogsIdByRedisToHashValues(string userNum, List<string> strlins)
            {
                List<Model.nf_ForumMain> forumMains = new List<Model.nf_ForumMain>();
                try
                {
                    using (var client = RedisManager.GetClient())
                    {
                        foreach (string item in strlins)
                        {
                            //如果“ZSet有值,Hash里面没有值。就通过博文Id到数据库里面寻找”
                            if (!client.HashContainsEntry(item, "FMArea") && !client.HashContainsEntry(item, "FMClassify") && !client.HashContainsEntry(item, "FMNumber") && !client.HashContainsEntry(item, "FMViewCount") && !client.HashContainsEntry(item, "jiazhi") && !client.HashContainsEntry(item, "Commentary") && !client.HashContainsEntry(item, "FMRecommend") && !client.HashContainsEntry(item, "FMExamine") && !client.HashContainsEntry(item, "IsDelete"))
                            {
                                Model.nf_ForumMain main = new DAL.DAL_nf_ForumMain().getObject(item, userNum);
    
                                client.SetEntryInHash(main.FMId, "FMId", main.FMId);//帖子编号
                                client.SetEntryInHash(main.FMId, "FMTitle", main.FMTitle);//帖子标题
                                client.SetEntryInHash(main.FMId, "FMArea", main.FMArea.ToString());//区域编号
                                client.SetEntryInHash(main.FMId, "FMClassify", main.FMClassify.ToString());//分类编号
                                client.SetEntryInHash(main.FMId, "LId", main.LId);//标签编号
                                client.SetEntryInHash(main.FMId, "messager", main.messager);//发帖人编号
                                client.SetEntryInHash(main.FMId, "FMTime", main.FMTime.ToString());//发帖时间
                                client.SetEntryInHash(main.FMId, "FMContent", main.FMContent);//帖子内容
                                client.SetEntryInHash(main.FMId, "FBodyContent", main.FBodyContent);//纯文本内容
                                client.SetEntryInHash(main.FMId, "FImagesUrl", main.FImagesUrl);//图片路径
                                client.SetEntryInHash(main.FMId, "FMNumber", main.FMNumber.ToString());//点赞数量
                                client.SetEntryInHash(main.FMId, "FMViewCount", main.FMViewCount.ToString());//浏览次数
                                client.SetEntryInHash(main.FMId, "jiazhi", Convert.ToString(0));//价值
    
                                int number = new DAL.DAL_nf_ForumSecond().getCommentCount(main.FMId).Count();
    
                                client.SetEntryInHash(main.FMId, "Commentary", number.ToString());//评论次数
                                client.SetEntryInHash(main.FMId, "BlogsFirstPageByPlusSign", Convert.ToString(0));//加号
                                client.SetEntryInHash(main.FMId, "BlogsFirstPageByMinusSign", Convert.ToString(0));//减号
                                client.SetEntryInHash(main.FMId, "FMRecommend", main.FMRecommend.ToString());//是否推荐
                                client.SetEntryInHash(main.FMId, "FMExamine", main.FMExamine.ToString());//是否审查
                                client.SetEntryInHash(main.FMId, "IsDelete", main.IsDelete.ToString());//是否删除    
    
                                //重新为“价值赋值”
                                string price = Math.Ceiling(Convert.ToDecimal(((long.Parse(client.GetValueFromHash(main.FMId, "FMNumber")) * 2) +//点赞数量
                                long.Parse(client.GetValueFromHash(main.FMId, "FMViewCount")) +//浏览数量
                                (number * 3)) / 3.0)).ToString();//评论数量[从后台拿到]
                                client.SetEntryInHash(main.FMId, "jiazhi", price);//【价值数量=浏览分数+点赞分数+评论分数】
                            }//if end
    
                            forumMains.Add(new Model.nf_ForumMain()
                            {
                                FMId = client.GetValueFromHash(item, "FMId") as string,//帖子编号
                                FMTitle = client.GetValueFromHash(item, "FMTitle") as string,//帖子标题
                                FMArea = int.Parse(client.GetValueFromHash(item, "FMArea")) == 0 ? -1 : int.Parse(client.GetValueFromHash(item, "FMArea")),//区域编号
                                FMClassify = int.Parse(client.GetValueFromHash(item, "FMClassify")) == 0 ? -1 : int.Parse(client.GetValueFromHash(item, "FMClassify")),//分类编号
                                LId = client.GetValueFromHash(item, "LId") as string,//标签编号
                                messager = client.GetValueFromHash(item, "messager") as string,//发帖人编号
                                FMTime = DateTime.Parse(client.GetValueFromHash(item, "FMTime")),//发帖时间
                                FMContent = client.GetValueFromHash(item, "FMContent") as string,//帖子内容
                                FBodyContent = client.GetValueFromHash(item, "FBodyContent") as string,//纯文本内容
                                FImagesUrl = client.GetValueFromHash(item, "FImagesUrl") as string,//图片路径
                                FMNumber = int.Parse(client.GetValueFromHash(item, "FMNumber")) == 0 ? -1 : int.Parse(client.GetValueFromHash(item, "FMNumber")),//点赞数量
                                FMViewCount = int.Parse(client.GetValueFromHash(item, "FMViewCount")) == 0 ? -1 : int.Parse(client.GetValueFromHash(item, "FMViewCount")),//浏览次数
                                jiazhi = int.Parse(client.GetValueFromHash(item, "jiazhi")) == 0 ? -1 : int.Parse(client.GetValueFromHash(item, "jiazhi")),//价值
                                Commentary = int.Parse(client.GetValueFromHash(item, "Commentary")) == 0 ? -1 : int.Parse(client.GetValueFromHash(item, "Commentary")),//评论数量
                                FMRecommend = int.Parse(client.GetValueFromHash(item, "FMRecommend")) == 0 ? -1 : int.Parse(client.GetValueFromHash(item, "FMRecommend")),//是否推荐
                                FMExamine = int.Parse(client.GetValueFromHash(item, "FMExamine")) == 0 ? -1 : int.Parse(client.GetValueFromHash(item, "FMExamine")),//是否审查
                                IsDelete = int.Parse(client.GetValueFromHash(item, "IsDelete")) == 0 ? -1 : int.Parse(client.GetValueFromHash(item, "IsDelete"))//是否删除
                            });//listObject end
                        }//foreach end
                    }//using end         
                    return forumMains;
                }
                catch (Exception ex)
                {
                    return null;
                }
            }//function end
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Page
    {
        /// <summary>
        /// 博客表
        /// 说明:用户个人中心时,显示用户文章
        /// </summary>
       public class pa_ForumMain
       {
            /// <summary>
            /// 当前页
            /// </summary>
            public int pageNo { get; set; }
            /// <summary>
            /// 每页显示的条数
            /// </summary>
            public int pageSize { get; set; }
            /// <summary>
            /// 数据总数
            /// </summary>
            public int pageCount { get; set; }
            /// <summary>
            /// 动态分页总数
            /// </summary>
            public int pageCountByParameter { get; set; }
            /// <summary>
            /// 用户账号
            /// </summary>
            public string userNum { get; set; }
            /// <summary>
            /// 用户博文
            /// </summary>
            public List<Model.nf_ForumMain> forumMains { get; set; }
       }
    }
    
    

    以上就是完整代码部分,亲测是可以使用的。
    补充:我的前端是使用了“layui的流显示”==>点我哦
    思路:和平常的分页一样,只是期间用户请求页的时候会先去缓存里面看是否存在,不在才会从数据库里面返回指定页区间的数据
    本人觉得,思路比代码实现更重要。思路是代码的灵魂,所以我的代码仅供参考哦!早点睡觉哦,宝贝们

    展开全文
  • redis缓存分页思路

    2020-02-29 02:02:08
    传统分页 一般分页做缓存都是直接查找出来,按页放到缓存里,但是这种缓存方式有很多缺点...Redis缓存分页 1.数据以ID为key缓存到Redis里; 2.把数据ID和排序打分存到Redis的skip list,即zset里; 3.当查找数据时,...

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

    Redis缓存分页
    1.数据以ID为key缓存到Redis里;
    2.把数据ID和排序打分存到Redis的skip list,即zset里;
    3.当查找数据时,先从Redis里的skip list取出对应的分页数据,得到ID列表。
    4.用multi get从redis上一次性把ID列表里的所有数据都取出来。如果有缺少某些ID的数据,再从数据库里查找,再一块返回给用户,并把查出来的数据按ID缓存到Redis里。

    在最后一步,可以有一些小技巧:
    比如在缺少一些ID数据的情况下,先直接返回给用户,然后前端再用ajax请求缺少的ID的数据,再动态刷新。
    还有一些可能用Lua脚本合并操作的优化,不过考虑到Lua脚本比较慢,可能要仔细测试。
    如果是利用Lua脚本的话,可以在一个请求里完成下面的操作:
    查找某页的所有文章,返回已缓存的文章的ID及内容,还有不在缓存里的文章的ID列表。
    其它的一些东东:
    Lua是支持LRU模式的,即像Memcached一样工作。但是貌似没有见到有人这样用,很是奇怪。
    可能是用redis早就准备好把redis做存储了,也不担心内存的容量问题。

    转发网址:https://www.cnblogs.com/l1pe1/p/7348976.html 作者:桃花雪,首页:博客园,转发时间:2020/2/22/14:51

    展开全文
  • 怎么用redis实现分页缓存,比如有1000页数据,只缓存当前页的后两页,点击到其他页时再缓存当前页的后两页。
  • 本文主要简单的使用Java代码进行redis缓存,即在查询的时候先在service层从redis缓存中获取数据。如果大家对在ssm项目中使用redis缓存查询数据的相关知识感兴趣的朋友跟随脚本之家小编一起看看吧
  • 缓存不能及时更新,一旦数据有变化,所有的之前的分页缓存都失效了。 比如像微博这样的场景,微博下面现在有一个顶次数的排序。这个用传统的分页方式很难应对。 一种思路 最近想到了另一种思路。 数据以ID为key...
  • 在用户首次登陆选课系统时,会先判断Redis缓存中是否有该缓存(这里使用的是Redis的zset数据结构来实现)。 补充:由于zset结构本身没有判断键是否存在的命令,我这里是用的是zcard(key)。zcard函数返回的是这个键...
  • Redis存储分页数据

    千次阅读 2015-07-16 10:21:19
    缓存不能及时更新,一旦数据有变化,所有的之前的分页缓存都失效了。 比如像微博这样的场景,微博下面现在有一个顶次数的排序。这个用传统的分页方式很难应对。 一种思路 最近想到了另一种思路。 数据以ID为...
  • redis缓存配置及redis工具类/缓存分页

    千次阅读 2018-07-05 17:12:46
    这里做一个工作笔记,业务场景:redis缓存配置,及redis工具类整合先做redis配置:pom.xml文件新增&lt;!-- redis --&gt; &lt;spring-redis.version&gt;1.8.10.RELEASE&lt;/spring-redis.version...
  • redis缓存数据

    千次阅读 2015-05-05 21:37:41
    dc数据收集在运行的时候,切换了一次conf数据库,结果导致菜单:应用-->JVM下的内存使用量图 没有数据。原因是切换了数据库,导致redis缓存metric数据错误,解决方式,删除掉dump.rdb文件,重新启动redis
  • redis缓存 分页思路

    2019-01-16 11:04:22
    传统分页 一般分页做缓存都是直接查找出来,按页放到缓存里,但是这种缓存方式有很多缺点。...Redis缓存分页 1.数据以ID为key缓存到Redis里; 2.把数据ID和排序打分存到Redis的skip list,即zset里; 3.当查...
  • 不用插件,不用臃肿代码,不用sql语句,Redis唾手可得的分页展示。
  • Redis工具类 package com.xd.common.server; import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import net.sf.jsqlparser.schema.*; import org.redisson.api.RedissonClient; import
  • Flask中用Redis缓存数据

    千次阅读 2019-12-04 19:49:20
    Flask使用Redis缓存数据 Redis配置 配置集群 app.config['REDIS_CLUSTER'] = [ {'host': '127.0.0.1', 'port': '7000'}, {'host': '127.0.0.1', 'port': '7001'}, {'host': '127.0.0.1', 'port': '7002'}, ] ...
  • redis分页数据缓存策略

    千次阅读 2016-07-28 17:12:20
    对于分页数据缓存问题,该如何处理呢?  1.以分页的索引为Key,缓存整个页面的数据。对于已经加载过的页面,可以根据Key直接从缓存中取出即可(采用相对时间缓存的策略,即数据在之后的某一时间段内未被访问,...
  • @CachePut:更新时使用,使用此注解,一定会从DB上查询数据 @CacheEvict:删除时使用; @Caching:组合用法 非实时同步 实时:一方修改,另一方同步修改 非实时:一方修改,另一方不需要同步修改 一个文章,一分
  • 针对此情况,使用缓存能的解决例如排行榜和报表以及一些一致性要求不强的数据,并且对缓存数据结构的设计,可以实现对缓存数据的排序和分页功能,解决分页和排序时重新执行SQL的问题。   目的:  1)缓存SQL...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,971
精华内容 9,588
关键字:

redis缓存分页数据

redis 订阅