精华内容
下载资源
问答
  • 过期时间及生存时间 命令 1. EXPIRE <key> <ttl> 设置 key 的生存时间为 ttl 秒 2. PEXPIRE <... 设置 key 的生存时间为 ttl 毫秒 3.... 设置 key 的过期时间为 ti...

    过期时间及生存时间

    1. 命令

       1. EXPIRE <key> <ttl> 							设置 key 的生存时间为 ttl 秒
       2. PEXPIRE <key> <ttl> 						设置 key 的生存时间为 ttl 毫秒
       3. EXPIREAT <key> <timestamp> 	设置 key 的过期时间为 timestamp 所指定的秒数时间戳
       4. PEXPIREAT <key> <timestamp>  设置 key 的过期时间为 timestamp 所指定的毫秒数时间戳
      
    2. 调用过程
      EXPIRE、PEXPIRE、EXPIREAT 三个命令都是通过 PEXPIREAT 命令来实现的。

      转换成
      转换成
      转换成
      EXPIRE
      PEXPIRE
      PEXPIREAT
      EXPIREAT

      EXPIRE 过程为:

        	  1. EXPIRE 将 ttl 秒转化为 ttl 毫秒,
        	  2. 调用 PEXPIRE 命令
      

      PEXPIRE 过程为:

        1. 通过 ttl 毫秒获取当前 UNIX 的时间戳;
        2. 当前时间戳加上 ttl 得出毫秒格式的 key 过期时间
        3. 调用 PEXPIREAT 命令
      

      EXPIREAT 过程为:

       1. 过期时间戳 timestamp 秒转化为毫秒时间戳
       2. 调用 PEXPIREAT 命令
      
    3. 移除过期时间命令

      	PERSIST <key>
      
    4. 获取键的剩余生存时间

      	1. TTL <key>      获取 key 的剩余过期时间,秒 
      	2. PTTL <key>   获取 key 的剩余过期时间,毫秒
      
    展开全文
  • Redis BitMap

    2021-01-19 17:54:58
    redis对bitmap提供了一套命令,可以对任一进行设置和读取 SETBIT、GRTBIT SETBIT aaa 1234 0/1 GETBIT aaa 1234 --->0/1 因为bitmap的每一位只占据1bit的空间 ,所以利用这个特性我们可以把每一天作为...

    Redis bitmap简介

    1. 在redis2.0之后,新增了位图数据,bitmap实际上不是redis的一种数据结构,而是一个一个字符串结构,只是value是一个二进制数据,每一位是0或者1
    2. redis对bitmap提供了一套命令,可以对任一进行设置和读取
    3. SETBIT、GRTBIT
      1. SETBIT aaa 1234 0/1
      2. GETBIT aaa 1234 --->0/1
    4. 因为bitmap的每一位只占据1bit的空间 ,所以利用这个特性我们可以把每一天作为key,value为1亿用户的活跃度状态。假设一个用户一天内只要登录了一次就算活跃。活跃我们就记为1,不活跃我们就记为0。把用户Id作为偏移量(offset)。这样我们一个key就可以存储1亿用户的活跃状态。

    5. 其他命令:bitcount,bitcount,bitpos,bitop,数据压缩:WAH,EWAH,Roaring Bitmaps

    6. 主要需要提示的是key可以设置过期时间,完全满足了我们业务的需求

    7. 转载:https://mp.weixin.qq.com/s/yUaZ9VX9ErJ-WW7L5RBL4A

    展开全文
  • 一:设置过期时间redis有四种命令可以用于设置键的生存时间过期时间:EXPIRE <KEY> <TTL> : 将键的生存时间设为 ttl 秒 PEXPIRE <KEY> <TTL> :将键的生存时间设为 ttl 毫秒EXPIREAT <...

    一:设置过期时间

    redis有四种命令可以用于设置键的生存时间和过期时间:

    EXPIRE <KEY> <TTL> : 将键的生存时间设为 ttl 秒    PEXPIRE <KEY> <TTL> :将键的生存时间设为 ttl 毫秒EXPIREAT <KEY> <timestamp> :将键的过期时间设为 timestamp 所指定的秒数时间戳PEXPIREAT <KEY> <timestamp>: 将键的过期时间设为 timestamp 所指定的毫秒数时间戳.

    二:保存过期时间

    那么redis里面对这些key的过期时间和生存时间的信息是怎么保存的呢??
    答:在数据库结构redisDb中的expires字典中保存了数据库中所有键的过期时间,我们称expire这个字典为过期字典。
    (1)过期字典是一个指针,指向键空间的某个键对象。
    (2)过期字典的值是一个longlong类型的整数,这个整数保存了键所指向的数据库键的过期时间–一个毫秒级的 UNIX 时间戳。

    下图是一个带过期字典的数据库例子:

    564dceeba09f12ff20bd91db49f5f007.png

    过期字典是存储在redisDb这个结构里的:

    typedef struct redisDb {    ...        dict *dict;     //数据库键空间,保存着数据库中所有键值对    dict *expires   // 过期字典,保存着键的过期时间    ...} redisDb;

    从以上结构中可以看到expire字典(过期字典)和dict字典(数据库键空间,保存着数据库中所有键值对)是并列的,由此可见expire字典的重要性。

    三:移除过期时间

    PERSIST 命令可以移除一个键的过期时间:

    127.0.0.1:6379> set message "hello"OK127.0.0.1:6379> expire message 60(integer) 1127.0.0.1:6379> ttl message(integer) 54127.0.0.1:6379> persist message(integer) 1127.0.0.1:6379> ttl message(integer) -1

    persist命令就是expire命令的反命令,这个函数在过期字典中查找给定的键,并从过期字典中移除。
    比如在数据库当前状态(如上图所示),当给book这个key移除过期时间:

    redis> persist book(integer) 1

    数据库将更新成如下状态:

    e6a0518da9ecc7814797e53878ade7fc.png

    可以从图中看到,当PERSIST book命令执行之后,过期字典中的 book 键消失了。

    四:计算并返回剩余生存时间

    ttl命令以秒为单位返回指定键的剩余生存时间。pttl以毫秒返回。两个命令都是通过计算当前时间和过期时间的差值得到剩余生存期的。

    127.0.0.1:6379> set minping shuxinOK127.0.0.1:6379> expire minping 60(integer) 1127.0.0.1:6379> ttl minping(integer) 57127.0.0.1:6379> ttl minping(integer) 27127.0.0.1:6379> pttl minping(integer) 23839127.0.0.1:6379>

    redis源码为:

    void ttlCommand(redisClient *c) {    ttlGenericCommand(c, 0);}void pttlCommand(redisClient *c) {    ttlGenericCommand(c, 1);}void ttlGenericCommand(redisClient *c, int output_ms) {    long long expire, ttl = -1;    /* 如果键不存在,返回-2 */    if (lookupKeyRead(c->db,c->argv[1]) == NULL) {        addReplyLongLong(c,-2);        return;    }        /* 如果键存在*/    /*如果没有设置生存时间,返回 -1, 否则返回实际剩余时间 */    expire = getExpire(c->db,c->argv[1]);    if (expire != -1) {        /* 过期时间减去当前时间,就是键的剩余时间*/        ttl = expire-mstime();        if (ttl < 0) ttl = 0;    }    if (ttl == -1) {        addReplyLongLong(c,-1);    } else {         /*将毫秒转化为秒*/        addReplyLongLong(c,output_ms ? ttl : ((ttl+500)/1000));    }}

    五:过期键的删除策略

    如果一个键是过期的,那它到了过期时间之后是不是马上就从内存中被被删除呢??如果不是,那过期后到底什么时候被删除呢??

    其实有三种不同的删除策略:
    (1):立即删除。在设置键的过期时间时,创建一个回调事件,当过期时间达到时,由时间处理器自动执行键的删除操作。
    (2):惰性删除。键过期了就过期了,不管。每次从dict字典中按key取值时,先检查此key是否已经过期,如果过期了就删除它,并返回nil,如果没过期,就返回键值。
    (3):定时删除。每隔一段时间,对expires字典进行检查,删除里面的过期键。
    可以看到,第二种为被动删除,第一种和第三种为主动删除,且第一种实时性更高。下面对这三种删除策略进行具体分析。

    立即删除

    立即删除能保证内存中数据的最大新鲜度,因为它保证过期键值会在过期后马上被删除,其所占用的内存也会随之释放。但是立即删除对cpu是最不友好的。因为删除操作会占用cpu的时间,如果刚好碰上了cpu很忙的时候,比如正在做交集或排序等计算的时候,就会给cpu造成额外的压力。

    而且目前redis事件处理器对时间事件的处理方式--无序链表,查找一个key的时间复杂度为O(n),所以并不适合用来处理大量的时间事件。

    惰性删除

    惰性删除是指,某个键值过期后,此键值不会马上被删除,而是等到下次被使用的时候,才会被检查到过期,此时才能得到删除。所以惰性删除的缺点很明显:浪费内存。dict字典和expires字典都要保存这个键值的信息。

    举个例子,对于一些按时间点来更新的数据,比如log日志,过期后在很长的一段时间内可能都得不到访问,这样在这段时间内就要拜拜浪费这么多内存来存log。这对于性能非常依赖于内存大小的redis来说,是比较致命的

    定时删除

    从上面分析来看,立即删除会短时间内占用大量cpu,惰性删除会在一段时间内浪费内存,所以定时删除是一个折中的办法。
    定时删除是:每隔一段时间执行一次删除操作,并通过限制删除操作执行的时长和频率,来减少删除操作对cpu的影响。另一方面定时删除也有效的减少了因惰性删除带来的内存浪费。

    六:redis使用的策略

    redis使用的过期键值删除策略是:惰性删除加上定期删除,两者配合使用。

    caff6c650bcac795e38cf75e89a5c632.png

    展开全文
  • id} 对应的键值为 {"name":"张三","age":13} 实际例子 set mail:user:user_id:123123414 {"name":"张三","age":13} 【强制】必须设置过期时间 因为 redis 应该是提供 纯缓存 任务,数据是可以丢失的,如果 key 不...

    这里收录一些有用的 Redis 规范,方便查看:

    1.记录

    1. 关于redis key命名规范的设计: https://cloud.tencent.com/developer/article/1551803
    2. redis:key设计原则

    2.个人总结

    2.1 key 命名规范

    1. 业务模块名:业务逻辑含义:其他:value类型

    : 连接各个模块 mail:user:user_id:123123414
    . 可以连接单词 比如 study.recored
    mail 是业务名称,user 是 value 的值,id 是key 值

    举个例子
    你的项目是电商项目,

    • 业务名称叫,mail
    • 数据库表示user表,user
    • key值想用user_id

    key 规范为 mail:user:user_id:${user_id} 对应的键值为 {"name":"张三","age":13}

    实际例子

    set mail:user:user_id:123123414 {"name":"张三","age":13}
    
    1. 【强制】必须设置过期时间
      因为 redis 应该是提供 纯缓存 任务,数据是可以丢失的,如果 key 不设置过期时间, key 将会越来越多,直到服务器冗机!

    拓展基本 redis 命令

    # 清除当前数据库
    flushdb 
    # 清除所有数据库
    flushall
    # 切换时数据库,默认数据库为 0
    select 0
    # 查看所有 redis 信息
    info 
    # 查看当前redis数据量,个数
    dbsize
    

    Redis遍历所有key的两个命令 keys 和 scan

    # keys [表达式] 
    keys *
    # scan 
    scan 0 match * count 100 
    

    redis bitmap操作

    getbit key offset
    setbit key offset value
    

    知乎 Redis 常用操作命令,非常详细
    十分详细!

    展开全文
  • 详解BitMap算法

    千次阅读 2019-05-29 00:03:00
    所谓的BitMap就是用一个bit位来标记某个元素所对应的value,而key即是该元素,由于BitMap使用了bit位来存储数据,因此可以大大节省存储空间。 1. 基本思想 首先用一个简单的例子来详细介绍BitMap算法的原理。假设...
  • 上面设置缓存过期时间的TimeUnit源码 部分截图说明(后面会附上全部的源码——总390行,我就折叠一下了): 先上截图   TimeUnit全部源码: 1 /* 2 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is ...
  • MD中的bitmap(3) - Bitmap初始化

    千次阅读 2009-08-06 11:17:00
    bitmap_create完成bitmap的初始化,该函数在磁阵启动时或者用户设置bitmap文件时被调用,主要完成bitmap从磁盘到内存的加载:1. 前面说过,bitmap文件在磁盘上可能有两个位置,分别以文件指针或者与超级块之间的...
  • BitMap算法原理及实现实现

    千次阅读 2017-09-04 15:35:22
    bitmap是一个十分有用的结构。所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。
  • Redis新类型bitmap

    2021-05-16 21:37:13
    以抖音vcr最新的留言评价为案例,所有评论需要两个功能,按照时间排序+分页显示 能够排序+分页显示的redis数据结构是什么合适? answer: list: 每个商品评价对应一个list集合,这个List包含了对这个商品的所有评论,...
  • 分布式缓存Redis之bitmap、setbit

    万次阅读 多人点赞 2018-01-06 17:11:46
    写在前面  本学习教程所有示例代码见GitHub:... setbit KEY_NAME OFFSET VALUE //该命令用于对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。时间复杂度O(1)  在redis中,存储的字符串都是
  • 文章目录一、bitmap1. bitmap的应用2. bitmap的数据结构 一、bitmap 1. bitmap的应用 应用场景: 例如签到,打卡的应用,每天的状态只需要用一个bit来存储,就算一年365天也只需要356bit 按年去存储一个用户的签到...
  • 现在我的业务需求是根据userId查询出当前用户今年的签到记录,我想一次性查出bitmap的365位数据。</p><p>百度了一小时,仅仅了解到需要用这个方法...
  • 小伙伴们都知道,做一个app是少不了和图片打交道的,而不管是jpg还是png格式的图片,android的显示的时候最终都是将它们变换为Bitmap显示的,而Bitmap占用内存巨大,打个比方假如是ARGB_8888格式的Bitmap的话,每...
  • 需求:使用redis的bitmap做每日统计 解决思路:使用每天的第一个id作为被减量,这样每天的offset(偏移量)就从1开始,大幅...//使用guava cache缓存机制获取最小id,设置过期时间为每一天,每天清空一次 private Lo...
  • 并发 并行的区别? 并发: 在一个时间段内,多任务同时运行 并行: 在一个时间点上,多任务同时运行, 多核CPU 高并发问题 一、多进程 把每个任务,都分配给一...进程的切换也需要消耗系统时间 调度时间 二、多线...
  • 命令演示 最基础的命令SET/GET 加过期时间(秒) 加过期时间(毫秒) 只能新增 只能修改 通用组命令 常用命令: DEL EXISTS EXPIRE KEYS RENAME TTL TYPE string组命令 通用 SET GET GETSET MGET MSET PSETEX SETEX...
  • //设置bitmap小于设置的缓存 while (curCacheSize + valueSize > sizeLimit){ //如果缓存超出了则调用removeNext删除对象 Bitmap removedValue = removeNext(); //获取需要删除的bitmap if (hardCache....
  • 一、场景需求 ...显示用户某个月的签到次数和首次签到时间。 在日历控件上展示用户每月签到情况,可以切换年月显示……等等。 二、代码 以下代码没有积分逻辑,只有签到 import datetim...
  • android bitmap 缓存实现(OOM)

    千次阅读 2013-02-21 23:45:51
    比如一个Activity会展示一些用户的头像列表,而如果用户没有设置头像的话,则会显示一个默认头像,而这个头像是位于应用程序本身的资源文件中的。 4 bitmap转成drawable  用Drawable保存图片对象比Bitmap...
  • 设置key的值:EX seconds – 设置键key的过期时间,单位时秒PX milliseconds – 设置键key的过期时间,单位时毫秒NX – 只有键key不存在的时候才会设置key的值XX – 只有键key存在的时候才会设置key的值 get key ...
  • 在移动应用的业务场景中,我们需要保存这样的信息:一个 key 关联了一个数据集合。常见的场景如下:给一个 userId ,判断用户登陆状态;显示用户某个月的签到次数和首次签到时间;两亿用户...
  • 显示用户某个月的签到次数和首次签到时间; 两亿用户最近 7 天的签到情况,统计 7 天内连续签到的用户总数; 通常情况下,我们面临的用户数量以及访问量都是巨大的,比如百万、千万级别的用户数量,或者千万级别、...
  • Bitmap二次采样 一、二次采样: (一)、意义或目的:  1、用BitmapFactory解码一张图片时,有时会遇到该错误。这往往是由于图片过大造成的。要想正常使用,则需要分配更少的内存空间来存储。...
  • redis缓存的数据类型分析 字符串(string): 优点:字符串存储节省内存 缺点:序列化转换(读写过程需要做数据的转换处理)消耗时间,更新操作不方便...作用:节省内存,保持数据的弱一致性(过期时间设置,能在...
  • RPOP key 9、列表头部,阻塞弹出,列表为空时阻塞,超时时间设置为0,就是永久阻塞,直到有数据弹出为止,遵循先到先出原则 BLPOP key timeout 10、列表尾部,阻塞弹出,规则同上 BRPOP key timeout 11、删除指定元素 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,701
精华内容 5,080
关键字:

bitmap设置过期时间