微信小程序大型系统架构中应用Redis缓存要点

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

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

1、    应用注意事项

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

  1. 1.      跟踪全部储存在Redis中的键

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

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

  1. 尽可能控制键名的长度

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

  1. 选择合适的数据结构

        a)       可使用list的状况下尽可能用list代替set。若是你不须要使用set特性,List在使用更少内存的状况下能够提供比set更快的速度。并发

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

2、    实际应用场景

        对于在系统中实际对于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构建的实时聊天系统的例子(网上推荐,暂未用到)

3、    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毫秒内

 

做者:酷客多小程序 徐冰

相关文章
相关标签/搜索