在大型分布式系统架构中,必须选择适合的缓存技术以应对高并发,实现系统相应的高性能,酷客多小程序经过慎重选型,选择了采用基于腾讯云服务的Redis弹性缓存技术,结合Redis官方推荐的.NET驱动类库Service.Stack.Redis,实现Redis弹性缓存在系统中的应用。

现针对Redis在实际应用中需注意的要点,就如下几个方面进行总结:

一、    应用注意事项

在企业级应用过程,任何技术的引入都需要考虑可能产生的各种影响,对于缓存应用来说,首先需要考虑的是内存的占用状况。对于应用系统来说,内存是极其宝贵的资源,对于每一个存储到Redis缓存中的内容,都必须严格控制其内容的有效性和存储期限,具体需要注意的事项如下:

  1. 1.      跟踪所有储存在Redis中的键

        a)       使用合适的命名方法,可以简化存储项的管理。建议使用带有业务意义的名称,可以采用类似DotNet命名空间的类似命名管理方式(可使用冒号来划分键名,例如Product:Category 键名来存储商品分类数据),这样有助于缓存数据的数据管理及后期数据的迁移,删除等

        b)       进行数据删除时,需注意同时删除掉相关联无效的级联数据

  1. 尽量控制键名的长度

a)       采用合适命名方式的同时,要控制键的名称长度,缓存数据量达到一定程度时,键(Key)所占用的存储空间也会是内存的一笔较大的开销,因此需要严格控制键的长度。

  1. 选择合适的数据结构

a)       可以使用list的情况下尽量用list代替set。如果你不需要使用set特性,List在使用更少内存的情况下可以提供比set更快的速度。

b)       Sorted sets是及其昂贵的数据结构,不管是对内存的消耗还是基本操作时的开销。如果只是需要一个存储查询记录的场景,不在意排序这样的属性,那么建议使用哈希表结构来存储。

二、    实际应用场景

对于在系统中实际对于Redis的使用,结合酷客多实际使用业务,可以考虑在如下几个场景中

  1. 1.      取最新X条数据

a)       例如可以将 最新100条评论Id 放在Redis的List中

b)       使用LPUSH latest.comments<ID>命令,向list集合中插入数据

c)        插入完成后再用LTRIM latest.comments 0 100命令使其永远只保存最近100条

  1. 2.      排行榜应用

a)       取Top N操作  按照某个条件为权重,使用sorted set,将要排序的值设置成sorted set的score,将具体的数据设置成相应的value,每次只需要执行一条ZADD命令即可。

  1. 3.      队列系统 使用

d)       使用list可以构建队列,使用SortSet可构建有优先级要求的队列

  1. 4.      数据缓存

e)       最基本的应用,其总体性能优于Memcached,数据结构更加丰富实用

  1. 5.      需要精准设定过期时间

a)       Sorted set的score设计成过期时间戳,通过过期时间排序定期清理数据,或根据此依据定期清理数据库中过期数据(官网推荐的使用场景之一,感觉应用方式不太好,不推荐)

  1. 6.      Pub/Sub构建实时消息系统

f)        Redis的Pub/Sub系统可以构建实时的消息系统,比如很多用Pub/Sub构建的实时聊天系统的例子(网上推荐,暂未用到)

三、    Redis过期策略注意

Rdis自身的过期策略为两种结合使用:

  1. 惰性删除

a)       进行 get 或setnx 时,先检查key是否过期,若过期,则删除key,并执行相关操作

b)       若没过期,直接执行相关操作

  1. 定期删除

定期循环 随机查是否过期,查到后,删除

当进行命令操作Redis缓存的数据时,需注意操作命令对Redis中数据的的过期时间的影响,简单概括如下:

  1. 当key被DEL命令删除或者被SET、GETSET命令重置后与之关联的过期时间会被清除
  2. 从概念上更新了存储在key中的值而没有用全新的值替换key原有值的所有操作都不会影响在该key上设置的过期时间(例如使用INCR命令增加key的值或者通过LPUSH命令在list中增加一个新的元素或者使用HSET命令更新hash字段的值 都不会清空原来的过期时间设置)
  3. 可通过PERSIST命令清除已设置的过期时间重新将key变为持久的
  4. 若key被RENAME命令重命名则与之关联的过期时间将传递到新名称的key,若key被RENAME命令重写,比如本存在名为mykey_a和mykey_b的key一个RENAME mykey_b mykey_a命令将mykey_b重命名为本已存在的mykey_a那么无论mykey_a原来的设置如何都将继承mykey_b的所有特性,包括过期时间设置。

关于过期时间:

Redis2.4中expire精度不高,通常在0到1秒间,Redis2.6以后expire精度可以控制在0到1毫秒内

作者:酷客多小程序 徐冰

微信小程序大型系统架构中应用Redis缓存要点的更多相关文章

  1. 微信小程序答题系统实现随机出题 答题小程序如何实现随机出题 微信小程序 答题系统

    最近头脑王者非常火爆,公司也在开发类似头脑王者的答题系统,这个重任交到我这边来了,我们在开发的这个微信小程序答题系统,需要实现随机出题.尤其是一些比如闯关的环节,需要随机从题库里抽取若干道题目,给到用 ...

  2. Python flask构建微信小程序订餐系统

    第1章 <Python Flask构建微信小程序订餐系统>课程简介 本章内容会带领大家通览整体架构,功能模块,及学习建议.让大家在一个清晰的开发思路下,进行后续的学习.同时领着大家登陆ht ...

  3. Python flask构建微信小程序订餐系统☝☝☝

    Python flask构建微信小程序订餐系统☝☝☝ 一.Flask MVC框架结构 1.1实际项目结构 1.2application.py  项目配置文件 Flask之flask-script模块使 ...

  4. Python flask构建微信小程序订餐系统✍✍✍

    Python flask构建微信小程序订餐系统  整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题, ...

  5. 基于微信小程序的系统开发准备工作

    腾讯推出微信小程序也有一段时间了,在各种行业里面也都掀起一阵阵的热潮,很多APP应用被简化为小程序的功能迅速推出,同时也根据小程序的特性推出各种独具匠心的应用,相对传统的APP来说,微信小程序确实能够 ...

  6. 小程序红包开发跳坑记 微信小程序红包接口开发过程中遇到的问题 微信小程序红包开发

    现在做小程序的越来越多,商家推广也是一个瓶颈,谁不发点红包,都很难找到人来用你的微信小程序了.于是不管你开发什么小程序功能,你或多或少都要用到小程序来发红包吧.  我们自己之前做公众号发红包,做了两三 ...

  7. 微信小程序商城系统怎样搭建?

    微信是一种非常便捷的生活方式,微信小程序一直深受企业和商家的青睐,如美团.京东.拼多多.唯品会.小红书等知名公司都推出了自己的小程序.对于网上商城小程序的开发似乎是一件非常难的事情,用什么开发?如何开 ...

  8. 微信小程序的线程架构

    小程序的线程架构 每个小程序包含一个描述整体程序的app实例和多个描述页面的page. 其中app由3个文件构成: app.json 公共配置文件 app.wxss 公共样式文件 app.js 主体逻 ...

  9. 在微信小程序的JS脚本中使用Promise来优化函数处理

    在我们传统的Javascript开发函数编写中,我们习惯了回调函数的处理,不过随着回调函数的增多,以及异步处理的复杂性等原因,代码越来越难读,因此诞生了使用Promise来优化JS函数处理的需求,引入 ...

随机推荐

  1. 显示Linux进程打开了哪些文件? 用lsof命令

    1.lsof abc.txt --> 显示开启文件 abc.txt的进程. 2.lsof -c abc  ---> 显示abc进程现在打开的文件. 3.lsof -c -p 1234 -- ...

  2. Chrome Inspect不显示Webview页面的问题总结

    首先,确保手机打开了USB调试.如果还是检测不到WebView页面,主要有以下几种情况. 1.反应慢,稍等一会 2.关闭然后重新打开USB调试开关,刺激一下chrome,我的魅族手机有时需要这样操作一 ...

  3. java抓取网页或者文件的邮箱号码

    抓文件的 package reg; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.i ...

  4. spring mvc 中 controller 路径配置

    下图中,由于红色部分(value="/")的存在,导致 host:port/项目/dimlist 无法被映射到dimList方法,解决办法是将其去掉. package cn.bgo ...

  5. 洗礼灵魂,修炼python(71)--爬虫篇—【转载】xpath/lxml模块,爬虫精髓讲解

    Xpath,lxml模块用法 转载的原因和前面的一样,我写的没别人写的好,所以我也不浪费时间了,直接转载这位崔庆才大佬的 原帖链接:传送门 以下为转载内容: --------------------- ...

  6. 几个常用dos网络命令

    ping www.baidu.com 测试网络的同时,查看ip地址 1. 如图:百度的ip为  14.215.177.39.浏览器直接输入ip即可进入百度首页. 另外还有,14.215.177.38 ...

  7. C++多线程同步技巧(二)--- 事件

    简介 Windows在线程控制方面提供了多种信号处理机制,其中一种便是使用 CreateEvent() 函数创建事件,然后使用信号控制线程运行.其中将事件变为有信号可使用 SetEvent() 函数, ...

  8. SQLServer插入数据

    使用数据库管理工具插入数据 打开数据库,选则要插入数据的表->右键点击->选择插入前200行->在右边视图中输入要插入的数据(如果字段设置为不为空,则必须输入,如果字段设置为可空,则 ...

  9. CSS--块级元素和行内元素

    相同:设置后,对应的模块都会脱离文档流 不同点:position相应的块级元素会覆盖下面的内容(文字,),而float只会覆盖块级元素,里面的文字会脱离 出来 float是浮动定位,position是 ...

  10. 匆忙记录 编译linux kernel zImage

    arm的板子. 自己要定制下内核. 下载源码 cp 模板配置 .config make menuconfig 进行定制化 之后make zImage {注意 交叉编译 gcc 也要配置的} 之后 ./ ...