zoukankan      html  css  js  c++  java
  • Redis应用场景

    Redis内存回收策略

    • noeviction:当内存使用达到阈值的时候,所有引起申请内存的命令会报错。

      • allkeys-lru:在所有键中采用lru算法删除键,直到腾出足够内存为止。

      • volatile-lru:在设置了过期时间的键中采用lru算法删除键,直到腾出足够内存为止。

      • allkeys-random:在所有键中采用随机删除键,直到腾出足够内存为止。

      • volatile-random:在设置了过期时间的键中随机删除键,直到腾出足够内存为止。

      • volatile-ttl:在设置了过期时间的键空间中,具有更早过期时间的key优先移除。

    Redis key过期策略

    Redis 会在有过期时间的 Key 集合中随机 20 个出来,删掉已经过期的 Key,如果比例超过 25%,再重新执行操作。每秒中会执行 10 个这样的操作。

    Redis 持久化策略

    rdb:xx秒内xx个key被修改 则fork一个自线程发起快照保存 
      手工调用:save 主线程执行 bgsave 自线程处理
      缺点是如果redis挂掉,会丢失上个保存点到挂掉时间点的数据
      fork时内存使用会翻倍
       
    aof:可配置 不保存、每秒保存、每次操作保存(主线程进行)
      记录所有redis写操作,然后追加到文件内
      追加文件过大时,redis会进行aof重写
      缺点是文件比rdb模式大,数据恢复慢

    redis应用场景

    1、数据缓存 String:验证码、计数器、限流、session共享 Set:去重计数、交并集 List:队列、阻塞队列 sortSet:排行榜、延时队列 hash:对象存储、购物车 pub/sub:发布订阅

    2、验证码: jedis.setex("login:18888888888", 300, "054543");

    3、计数器 jedis.incr(key); 计数器+1 返回当前值 jedis.incrby(key,n);//计数器增加n 返回当前值

    4、限流 //每秒点击超过多少次 if(jedis.incr(key)>10){ return false; } //set 每秒超过多少个用户点击 if(jedis.llen(userkey)>10){ return false; }

    5、实时排行榜 具体代码见RedisApiUtil 积分添加、获取m-n的用户及积分、获取用户积分、获取用户排名、获取积分段用户数、删除用户

    6、分布式锁 具体代码见RedisApiUtil //key:业务key requestId:随机id 1000(毫秒)占用锁时间 lockStatus为true时获取锁成功 while(true) { bool lockStatus = RedisApiUtil.tryGetDistributedLock(key, requestId,1000); if(lockStatus){ //TODO //清除锁并退出循环 RedisApiUtil.releaseDistributedLock(key, requestId, DbContextHolder.getDBType()); break; } }

    7、阻塞/非阻塞队列 使用redis的list作为轻量级队列 lpush key value 入队 brpop key 30 出队(如果队列当前没有值,则等待30秒,30秒内有数据插入则执行出队)

    8、延时队列 订单超过 30 分钟未支付,则自动取消 //key为订单取消队列 time 为订单取消时间戳 trans为订单号 RedisApiUtil.setSortedSet(key,time, trans); 启动一个线程 每秒获取值为当前时间戳的trans列表 不要求特别精确的话可以每分钟获取小于当前时间戳的trans列表

    9、发布订阅 可用于数据缓存任务分发 中心更新了缓存,通过发布订阅通知到各个服务器 各个服务器拉取最新缓存

    10、防并发 详见扫码平台代码

    11、lua脚本 原子性的命令集合,具体代码略

    12、通道 多个命令一起发送 减少网络开销 Transaction tx = jedis.multi();//开启通道 tx.set(key, value); tx.expire(key, seconds); List<Object> results = tx.exec();//返回值

    13、set集合操作 去重计数 抽奖:参与抽奖用户放入一个LottySet 抽取随机n位用户 SRANDMEMBER LottySet 3 交并集 共同关注的人:取交集 可能认识的人:取并集

    14、hash 对象存储 购物车 userkeygoodskey:goodsNum

    15、session共享 集群式web应用 将session存储至redis 并重写服务器session方法

    16、地理位置应用 3.2版本以后支持 lbs应用(附近的人、外卖、商铺等等): geoadd beijing 116.443 39.436 张三 添加张三位置信息到北京组 geodist beijing zhangsan lisi km 计算张三李四距离多远 geopos beijing zhangsan 获取张三坐标 geohash beijing zhangsan 获取张三的geohash georadiusbymember beijing zhangsan 5 km count 10 asc 按最近距离获取张三5km附近的10个人 可选参数:withcoord 返回包含经纬度 withdist 返回包含距离 withhash返回包含geohash georadius beijing 116.443 39.436 5 km withdist count 5 asc 按最近距离获取离输入坐标5km附近的5个人 可选参数同上 摇一摇:每秒或几秒生成一个set,摇动手机时 将用户key+geohash插入set,并随机获取当前时间set内的一位用户

    17 bitmap: 计数器、布隆过滤器

  • 相关阅读:
    iphone 使用委托(delegate)在不同的窗口之间传递数据
    创建单键模式的类
    读入Plist文件中的信息
    C#读取Excel,取值为空的解决办法!
    ORACLE 常见的数据类型
    ArcGISServer 将内网地图服务映射修改外网可以访问的地图服务
    C#中获取当前路径的几种方法
    sql server2005登录出错问题(转载)
    (转载)服务器控件的生命周期
    ORACLE 中ROWNUM用法总结(转载)
  • 原文地址:https://www.cnblogs.com/Hiramunderneath/p/15355538.html
Copyright © 2011-2022 走看看