1. 首页 > 经验 >

redis ttl单位 redistlist

Redis过期时间

redis> EXPIRE mykey 10

1.0.0版本这意味着在任何一个时刻,正在使用内存的已经过期的数量的键等于每秒写作数量除以4.后可用

redis ttl单位 redistlistredis ttl单位 redistlist


给一个 key 设置超时时间。在一个超时时间结束后,这个键将会被自动删除。一个拥有关联过期时间的键在Redis术语里通常被认为 不稳定的 。

只有删除或者覆盖键的内容的命令,包括 DEL , SET , GETSET 和所有的 STORE 命令,才会把过期时间清除。这意味着从理论上讲,所有改变键上存储的值而不是使用新的值来替换的作,都将会保持过期时间不变。例如,使用 INCR 增加一个键的值,使用 LPUSH 讲一个新的值放到列表中,或者使用 HSET 改变一个哈希的字段的值都将会使过期时间保持不变。

使用 PERSIST 命令将一个键变成持久化的键,过期时间也会被清除。

如果一个键被 RENAME 重命名,就像在一个已经存在的键 Key_A ,它被一个调用 RENAME Key_B Key_A 所覆盖,原始的 Key_A 是否关联过期时间是没关系的,新的键 Key_A 将会继承 Key_B 的所有特征。

可以使用一个已经有过期时间集的键作为参数来调用 EXPIRE 。在这种情况下,一个键的生存时间已经 更新 为一个新值。对此很多应用,下面的 Nigation session 模式一节记录了一个例子。

在Redis 2.1.3之前的版本中,使用一个命令改变一个拥有过期时间的键的值,效果跟移除这个键一样。这种语义是必须的,因为层的限制现在已经确定了。

EXPIRE 将会返回0,并且不会使用一个过期时间来改变一个键的过期时间。

特别的 返回数字 :

redis> SET mykey "Hello"

redis> TTL mykey

redis> SET mykey "Hello World"

redis> TTL mykey

redis>

想象你有一个网页服务,并且你对用户最近访问的N个页面有兴趣,这样每个临近的页面视图的执行时间如果一个键被 RENAME 重命名,关联的生存时间将会被转移到新的键名上。不会超过前一个页面视图执行的60秒。理论上来讲,你可以认为用户访问的页面为 Nigation session ,其中就可以包含用户在寻找哪些他或她感兴趣的产品信息,因此你可以关联的产品。

你可以非常容易的使用下面的策略在Redis中建模这种类型:每次用户访问一个页面你就调用下面的命令:

如果用户闲置超过60秒,这个键将会被删除,只有访问时间值小于60秒的页面才会被记录。

这个模式可以很容易的修改为使用 INCR 做计数器来替代使用 RPUSH 的列表。

通常情况下创建Redis的键时不关联生存时间。这个键将会简单的一直生存,除非用户显示的删除它,例如使用 DEL 命令。

EXPIRE 家族命令能够把一个过期时间关联到一个给定的键,代价是这个键会使用额外的内存。当一个键设置了过期时间,Redis将会确保当指定的时间过去之后移除这个键。

一个键的生存时间可以被 EXPIRE 命令更新,或者被 PERSIST 命令完全移除(或其他严格相关的命令)。

在Redis2.4版本中,过期时间可能不是非常的,并且它可能是在0到1秒之间的出入。从Redis2.6版本开始,过期时间误是从0到1毫秒。

键的过期信息以的Unix时间戳形式保存(Redis2.6以及更新的版本毫秒内)。这意味着甚至当Redis实例未启动时时间就流走了。

为了过期时间能工作的很好,计算机时间必须保持稳定。如果你从两个时钟巨大不同步的计算机上移动一个RDB文件,有趣的事情将会发生(像所有的键在加载时变成过期)。

实际上运行中的实例将一直会检查计算机的时钟,举例来说,如果你给一个键设置1000秒的生存时间,然后在未来将你的计算机设置在2000秒以后,这个键将会立即失效,而不是持续1000秒。

Redis键将会通过两种方式过期:一个被动的方式,和一个主动的方式。

一个键的被动过期是很简单的,当一些客户端尝试访问它,然后这个键被发现超时了。

这就是Redis会在每秒做10次的事情:

这是一个小概率的算法,基本的设想是我们的样本代表整个键空间,然后我们继续失效直到将要失效的键百分比小于25%。

为了获得正确的行为而不牺牲一致性,当一个键失效, DEL 作会同时在AOF文件和附属的副节点执行。这种方式失效进程是在主实例集中的,也不会出现一致性错误。

Redis是什么

如果客户端执行的工作由小步骤组成,则默认情况下可以使用较小的锁定有效期,并扩展实现锁定扩展机制的算法。基本上,如果客户端在计算过程中锁定有效性接近较低值,则可以通过将Lua脚本发送到所有实例来扩展锁定,该实例扩展密钥的TTL(如果密钥存在并且其值仍然是客户端在获取锁定时分配的随机值)。

什么是Redis?

基本上,为了看到这里的问题,让我们假设我们配置Redis时根本没有持久性。客户端在 5 个实例中的 3 个实例中获取锁。客户端能够获取锁的其中一个实例重新启动,此时我们可以为同一资源锁定3个实例,而另一个客户端可以再次锁定它,这违反了锁的独占性的安全属性。

Redis是一个内存中的键值数据库,通常称为数据结构。Redis和其他键值数据库之间的主要区别之一是Redis存储和作高级数据类型的能力。这些数据类型是大多数开发人员熟悉的基本数据结构(列表,映射,和排序集)。Redis的卓越性能,简单性和数据结构的原子作有助于解决使用传统关系数据库实现时难以实现或执行不佳的问题。

当然,这是不够的,因为有一些键将永远不会被再次访问。这些键无论如何都应该被过期。所以,Redis会定期的在过期的中随机范围内测试少量的键。所有的已过期的键将会被从键空间被删除。

Redis主要特点

高级数据结构:为值提供五种可能的数据类型:字符串,列表,,哈希和有序。提供了这些数据类型的作,并且具有记录良好的时间复杂度(Big O表示法)。

高性能:由于其内存特性,项目维护者将复杂性保持在限度的承诺以及基于的编程模型,Redis 在读写作方面具有出色的性能。

没有依赖关系的轻量级:用ANSI C编写,没有外部依赖关系。适用于所有POSIX环境。Windows不受支持,但Microsoft提供了实验性版本。

高可用性: 内置支持异步,非阻塞,主/从,以确保数据的高可用性。目前有一种名为Redis Sentinel的高可用性解决方案目前可以使用,但仍被视为正在进行的工作。

以下是一些最重要的Redis功能:

● 内存缓存: 由于其高性能,当读写作量超过传统数据库的功能时,Redis能够轻松地将数据持久保存到磁盘,

● Lua脚本

● LRU逐出钥匙

● 自动故障转移

● 内置

● 数据结构支持字符串,散列,列表,,有序集,位图,超级日志,地理空间索引

Redis支持数据结构,可以存储字符串,列表,,哈希。它提供了有趣的功能,如内置,LRU驱逐,事务,磁盘持久性和高可用性。它在群集环境中提供自动故障转移;它可以与大多数语言一起使用。

下面给大家介绍一下redis命令

SET (设置键)

127.0.0.1:6379> SET foo“Hello World”

OK // 设置密钥GET (获取密钥)

127.0.0.1:6379> GET foo

“Hello World”// 获取密钥DEL (删除键)

127.0.0.1:6379> GET foo

"Hello World" // 获取密钥

127.0.0.1:6379> DEL foo

(integer) 1 // 密钥刚删除

127.0.0.1:6379> GET foo

(nil) // 自密钥因此删除,结果为零。SETEX (设置键的有效期)

(integer) 36 // 36秒后超时

redis的默认生存时间是多少

执行EXEC命令之后会取消使用WATCH命令的键,如果不想执行事务中的命令,也可以使用UNWATCH命令来取消。

不特意设置的话 理论上是的,具体可以按下面的方法查看下 ttl

经测试,springboot项目,使用redis实现session共享,session的有效期默认为2100s,即35分钟,并且,springboot已经实现了自动续期,每次访问session(getSession或者存取数据),都会把ttl重置为2100s。

缓存还有多少,取决于你设置了多少,使用了多少,只要电脑volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰开着,缓存就在不停的开关,你说的那些,没有任何意义

Redis 配置过期自动删除策略

其次理解的话,可以简单从字面层次理解为

Redis 默认 的生效的配置为 noeviction ,需要根据不同的业务选择不同的淘汰策略

之前的应用都是统计总数,但如果业务需要,有时也可能需要获取用户ID,来做下一步作。

volatile-lru:在设置过期时间的数据里淘汰最近访问最少的数据

每次执行session.setAttribute(),并不会马上把数据写到redis,而是先写到本地内存缓存,等本次请求结束后,再写到redis。

allkeys-lru:所有数据中淘汰最近访问最少的数据

volatile-lfu:在设置过期时间的数据里淘汰访问频率的数据

allkeys-lfu:所有数据中淘汰访问频率的数据

volatile-random:在设置过期时间的数据里,随机淘汰

allkeys-random:在所有的数据随机淘汰

volatile-ttl:在设置过期时间的数据里,淘汰剩余存活时间 (TTL) 最少的数据

noevictionl:当内存不足以写入新数据时,拒绝新数据写入。Redis 默认策略

我这里越久的数据价值越低,不在乎调用次数。所以选择

volatile-ttl

保存

重启redis 生效

Redis持久化

Redis支持RDB和AOF两种持久化但是,这个新的sessionId并没有对应的内容(一般只会在登录的时候,把用户信息等内容set到session)。机制,持久化功能有效地避免因进程退出造成的数据丢失问题,当下次重启时利127.0.0.1:6379> TTL foo用之前持久化的文件即可实现数据恢复。理解掌握持久化机制对于Redis运维非常重要。本章内容Redis是一个非常快速的开源非关系数据库,它存储了五种不同类型值的键映射。用作数据库,缓存和消息。下面本篇文章就来介绍一下Redis,希望对大家有所帮助。如下:

怎么查看redis数据的过期时间

● 自动重新连接支持

通过EXPIRE 命令或者PEXPIRE 命令,客户常用命令:getbit key offset;setbit key offset value端可以以秒或者毫秒精度为数据库中的某个键设置生存时间( Time To Live , TTL) ,在经过指定的秒数或者毫秒数之后,就会自动删除生存时间为0的键:

redis> SET key value

OK

redis> EXP 工RE key 5

(integer) 1

redis> GET key // 5 秒之内

"value"

redis> GET key // 假如用户35min内的作,都不涉及session,那么session就会过期,但是token依然没过期,还是会有问题。5 秒之后

(nil)

redis支持事务吗

allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰

相信学过Mysql等其他数据库的同学对事务这个词都不陌生,事务表示的是一组动作,这组动作要么全部执行,要么全部不执行。为什么会有这样的需求呢?看看下面的场景:

微博是一个弱关系型社交网络,用户之间有关注和被关注两种关系,比如两个用户A和B,如果A关注B,则B的粉丝中就应该有A。关注这个动作需要两个步骤完成:在A的关注者中添加B;在B的粉丝中添加A。 这两个动作要么都执行成功,要么都不执行。否则就可能会出现A关注了B,但是B的粉丝中没有A的不可容忍的情况。

转账汇款,假设现在有两个账户A和B,现在需要将A中的一万块大洋转到B的账户中,这个动作也需要两个步骤完成:从A的账户中划走一万块;在B的账户中增加一万块。这两个动作要么全部执行成功,要么全部不执行,否则自会有人问候你的!!! Redis作为一种高效的分布式数据库,同样支持事务。

Redis中的事务(transaction)是一组命令的。事务同命令一样都是Redis最小的执行单位,一个事务中的命令要么都执行,要么都不执行。Redis事务的实现需要用到 MULTI 和 EXEC 两个命令,事务开始的时候先向Redis发送 MULTI 命令,然后依次发送需要在本次事务中处理的命令,再发送 EXEC 命令表示事务命令结束。

举个例子,使用redis-cli连接redis,然后在命令行工具中输入如下命令:

12345678011121314151617181920

127.0.0.1:6379> MULTIOK127.0.0.1:6379> set set title winwill2012QUEUED127.0.0.1:6379> set desc jaQUEUED127.0.0.1:6379> EXEC1) OK2) OK3) OK127.0.0.1:6379>127.0.0.1:6379> get "h.me"127.0.0.1:6379> get title"winwill2012"127.0.0.1:6379> get desc"ja"127.0.0.1:6379>

从输出中可以看到,当输入MULTI命令后,返回OK表示事务开始成功,然后依次输入需要在本次事务中执行的所有命令,每次输入一个命令并不会马上执行,而是返回”QUEUED”,这表示命令已经被接受并且暂时保存起来,输入EXEC命令后,本次事务中的所有命令才会被依次执行,可以看到一次性返回了三个OK,这里返回的结果与发送的命令是按顺序一一对应的,这说明这次事务中的命令全都执行成功了。

再举个例子,在命令行工具中输入如下命令:

12345678011121314151617

127.0.0.1:6379> MULTIOK127.0.0.1:6379> set a aQUEUED127.0.0.1:6379> sett b b(error) ERR unknown command 'sett'127.0.0.1:6379> set c cQUEUED127.0.0.1:6379> EXEC(error) EXECABORT Transaction discarded because of previous errors.127.0.0.1:6379> get a(nil)127.0.0.1:6379> get b(nil)127.0.0.1:6379> get c(nil)127.0.0.1:6379>

和前面的例子一样,先输入MULTI输入EXEC表示中间的命令属于一个事务,不同的是中间输入的命令有一个错误(set写成了sett),这样因为有一个错误的命令导致事务中的其他命令都不执行了(通过后续的get命令可以验证),可见事务中的所有命令式同呼吸共命运的。

如果客户端在发送EXEC命令之前断线了,则会清空事务队列,事务中的所有命令都不会被执行。而一旦客户端发送了EXEC命令之后,事务中的所有命令都会被执行,即使此后客户端断线也没关系,因为已经保存了事务中的所有命令。

除了保证事务中的所有命令要么全执行要么全不执行外,Redis的事务还能保证一个事务中的命令依次执行而不会被其他命令插入。试想一个客户端A需要执行几条命令,同时客户端B发送了几条命令,如果不使用事务,则客户端B的命令有可能会插入到客户端A的几条命令中,如果想避免这种情况发生,也可以使用事务。

Redis事务错误处理

语法错误 就像上面的例子一样,语法错误表示命令不存在或者参数错误

这种情况需要区分Redis的版本,Redis 2.6.5之前的版本会忽略错误的命令,执行其他正确的命令,2.6.5之后的版本会忽略这个事务中的所有命令,都不执行,就比如上面的例子(使用的Redis版本是2.8的)

运行错误 运行错误表示命令在执行过程中出现错误,比如用GET命令获取一个散列表类型的键值。

这种错误在命令执行之前Redis是无法发现的,所以在事务里这样的命令会被Redis接受并执行。如果食物里有一条命令执行错误,其他命令依旧会执行(包括出错之后的命令)。比如下例:

127.0.0.1:6379> MULTIOK127.0.0.1:6379> set key 1QUEUED127.0.0.1:6379> SADD key 2QUEUED127.0.0.1:6379> set key 3QUEUED127.0.0.1:6379> EXEC1) OK2) (error) WRONGTYPE Operation against a key holding the wrong kind of value3) OK127.0.0.1:6379> get key"3"

Redis中的事务并没有关系型数据库中的事务回滚(rollback)功能,因此使用者必须自己收拾剩下的烂摊子。不过由于Redis不支持事务回滚功能,这也使得Redis的事务简洁快速。

回顾上面两种类型的错误,语法错误完全可以在开发的时候发现并作出处理,另外如果能很好地规划Redis数据的键的使用,也是不会出现命令和键不匹配的问题的。

从上面的例子我们可以看到,事务中的命令要全部执行完之后才能获取每个命令的结果,但是如果一个事务中的命令B依赖于他上一个命令A的结果的话该怎么办呢?就比如说实现类似Ja中的i++的功能,先要获取当前值,才能在当前值的基础上做加一作。这种场合仅仅使用上面介绍的MULTI和EXEC是不能实现的,因为MULTI和EXEC中的命令是一起执行的,并不能将其中一条命令的执行结果作为另一条命令的执行参数,所以这个时候就需要引进Redis事务家族中的另一成员:WATCH命令

换个角度思考上面说到的实现i++的首先指出方法,可以这样实现:

i的值,保证i的值不被修改

获取i的原值

如果过程中i的值没有被修改,则将当前的i值+1,否则不执行

这样就能够避免竞态条件,保证i++能够正确执行。

WATCH命令可以一个或多个键,一旦其中有一个键被修改(或删除),之后的事务就不会执行,一直持续到EXEC命令(事务中的命令是在EXEC之后才执行的,EXEC命令执行完之后被的键会自动被UNWATCH)

举个例子:

123456780111213141Redis功能:5

127.0.0.1:6379> set mykey 1OK127.0.0.1:6379> WATCH mykeyOK127.0.0.1:6379> set mykey 2OK127.0.0.1:6379> MULTIOK127.0.0.1:6379> set mykey 3QUEUED127.0.0.1:6379> EXEC(nil)127.0.0.1:6379> get mykey"2"127.0.0.1:6379>

上面的例子中,首先设置mykey的键值为1,然后使用WATCH命令mykey,随后更改mykey的值为2,然后进入事务,事务中设置mykey的值为3,然后执行EXEC运行事务中的命令,使用get命令查看mykey的值,发现mykey的值还是2,也就是说事务中的命令根本没有执行(因为WATCHmykey的过程中,mykey被修改了,所以随后的事务便会被取消)。

有了WATCH命令,我们就可以自己实现i++功能了,伪代码如下:

12345678011

def incr($key): WATCH $key $value = GET $key if not $value $value = 0 $value = $value + 1 MULTI SET $key $value result = EXEC return result[0]

因为EXEC返回的是多行字符串,使用result[0]表示返回值的个字符串。

redis数据类型和应用场景

Redis作是基于内存的,大小有限。当内存不足或占用过高时,需要自动放弃一些未到期的数据

Redis是当前比较热门的NOSQL系统之一,它是一个开源的使用ANSI c语言编写的key-value存储系统(区别于MySQL的二维表格的形式存储。),Redis数据都是缓存在计算机内存中并且它会周期性的把更新的数据写入磁盘或者把修改作写入追加的记录文件,实现数据的持久化。谈到存储数据,那么必然要涉及到相关的数据类型,redis主要有以下数据类型:

如果一个事务中的某个命令执行出错,Redis会怎样处理呢?要回答这个问题,首先要搞清楚是什么原因导致命令执行出错:

描述:string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。value其实不仅是String,也可以是数字。string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg或者序列化的对象。string 类型是 Redis 最基本的数据类型,string 类型的值能存储 512MB。

常用命令:get、set、incr、decr、mget等。

描述: hash 是一个键值(key => value)对。Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。

常用命令:hget,hset,hgetall 等。

应用场景:存储部分变更数据,如商品信息等。

描述:list 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。

常用命令:lpush(添加左边元素),rpush,lpop(移除左边个元素),rpop,lrange(获取列表片段,LRANGE key start stop)等。

应用场注意:由于WATCH命令的作用只是当被的键被修改后取消之后的事务,并不能保证其他客户端不修改的值,所以当EXEC命令执行失败之后需要手动重新执行整个事务。景:消息队列,关注列表,粉丝列表等都可以用Redis的list结构来实现。

描述: set是string类型的无序。是通过hashtable实现的,概念和数学中个的基本类似,可以交集,并集,集等等,set中的元素是没有顺序的。所以添加,删除,查找的复杂度都是O(1)。

常用命令:sadd,spop,embers,sunion 等。

应用场景:交集,并集,集(微博中,可以将一个用户所有的关注人存在一个中,将其所有粉丝存在一个。Redis还为提供了求交集、并集、集等作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的中)

描述:zset 和 set 一样也是string类型元素的,且不允许重复的成员。不同是可以打分(排序)

常用命令:zadd,zrange,zrem,zcard等

应用场景:排行榜,带权重的消息队列

描述:Bitmaps这个“数据结构”可以实现对位的作。 把数据结构加上引号主要因为:

Bitmaps本身不是一种数据结构, 实际上它就是字符串 , 但是它可以对字符串的位进行作。

Bitmaps单独提供了一套命令, 所以在Redis中使用Bitmaps和使用字符串的方法不太相同。 可以把Bitmaps想象成一个以位为单位的数组, 数组的每个单元只能存储0和1, 数组的下标在Bitmaps中叫做偏移量。其实大多数Bitmaps的应用场景可以用其他数据类型来实现,用Bitmaps主要是存储空间占用特别少

应用场景:统计用户访问,统计电影某天的的播放量

常用命令:pfadd, pfcount,pfmerge

应用场景:统计网站的每日UV

描述:GEO功能在Redis3.2版本提供,支持存储地理位置信息用来实现诸如附近位置、摇一摇这类依赖于地理位置信息的功能.geo的数据类型为zset.

常用命令:geoadd,geo, geodist

应用场景:附近位置、摇一摇

参考列表:

Redis五种数据类型及应用场景

redis实现session共享的一些细节

注意,使用负数调用 EXPIRE / PEXPIRE ,或者使用过去的时间调用 EXPIREAT / PEXPIREAT 将会使键被删除,而不是过期(相应的,弹出的 key nt 将会是 del ,而不是 expired )。

每一个会话在redis中对应3个key

应用场景:规key-value缓存应用。常规计数: 点赞数, 粉丝数。

其中spring:session:sessions:32d0d3b2-0f04-469b-a7-3a55e60f7393存放的是具体内容,sessionAttr开头的field与setAttribute()一一对应

12345678011121314

次创建SESSION时(一般是登录的时候),后端把sessionId set-cookie到前端

之后的请求,前端把cookie中的SESSION传到后端,后端根据cookie识别session

后端的接口一般会有token认证机制(jwt是常见的token实现方案),token会有一定的有效期,如果token过期,后端返回401状态码(unauthorized),前端的公共js方法看到状态码为401 ,提示用户“登陆已过期”并跳转到登录页。

假设token有效期默认为30分钟,用户A登录后生成一个token,30分钟内用户不停的作,这种情况下,假如token依然过期,提示用户“登陆已过期”并跳转到登录页,用户体验就会非常。

因此,token通常会有自动续期的机制,每次用户调用接口时,把redis中该token的ttl重置为30min。

假设token的有效期比session的长,session过期了但是token没过期,那么用户仍处于登录状态,这时如果调用一些需要从session取数据的接口,就会有问题。

因此,session的有效期,至少要跟token一样长,但是token有自动续期机制,所以session也要有自动续期机制。

看起来已经完美了,其实还有问题。

解决方案是:每次token校验成功后,调用一次getSession(false)方法,重置session的ttl。

如果某一次请求时,后端创建了新的session,就会把新的sessionId set-cookie到前端,之后前端发起请求时,cookie会带上新的sessionId,后端也根据这个新的sessionId寻找会话。

因此,仅当登录的时候,允许创建新的session,其余的地方,如果需要获取session,需要用getSession(false),false表示不创建新session,若session为空返回null。

注意:getSession()等价于getSession(true),在没有session时,会创建新session。

如果是通过session的setAttribute()和getAttribute() api实现数据存取,springboot会帮我们实现序列化和反序列化,但是,假如我们需要自己实现数据存取(比如我们是开发人员,想要查看用户session里的信息,就需要自己实现反序列化),该怎么办?

以获取session中的内容为例,session的内容在redis中以hash格式存放,而redis对该hash的value使用的serializer是JdkSerializationRedisSerializer,因此,如果要把session的内容(字节数组)转化为ja对象(即反序列化过程),需要设置serializer为JdkSerializationRedisSerializer。

path属性为glcs,代表请求路径需要包含glcs,才会把该cookie带到后端;

也可以使用EnableMongoHttpSession注解用MongoDB来管理session

Redis中BitMap技术及应用

如果仅仅是写demo,对于sprintboot项目,只要在启动类加上@EnableRedisHttpSession注解就可以实现session共享(参考网上教程),但是,如果企业项目,还有很多细节需要考虑。

BitMap是一串连续的二进制数字(0和1),类似于位数组,每一位所在的位置为偏移量(offset),类似于数组索引,BitMap就是通过最小的单位bit来进行0|1的设置,时间复杂度位O(1),表示某个元● 钥匙的生存时间有限素的值或者状态。由于bit是计算机中最小的单位,使用它进行储存将非常节省空间。特别适合一些数据量大的场景。例如,统计每日活跃用户、统计每月打卡数等统计场景。1天记录1000W用户的活跃统计数据,只需要10000000/8/1024/1024 ≈1.2M。

allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

Redis从2.2.0版本开始新增了setbit,getbit,bitcount,bitop等几个BitMap相关命令,虽然是新命令,但是并没有增加新的数据类型,它还是属于String类型。Redis中的BitMap占用内存大小限制在512M之内,即2^32。

设置某个key的指定偏移量的value值为0或者1,key不存在时自动生成一个新的字符串值,字符串会进行伸展,该偏移量前面的位值默认为0,偏移量offset参数必须大于等于0,小于2^32。

时间复杂度:O(1)

示例:

获取key指定偏移量上的值,当key不存在时,返回0。

时间复杂度:O(1)

返回值:指定偏移量上存储的值

示例:

统计给定key中,被设置为1的比特位的数量,可以通过start和end参数设置范围。

时间复杂度:O(n)

返回值:key中被设置为1的数量

示例:

对一个或多个key进行位作,并将结果保存到destkey上。作方式可以是AND、OR、NOT、XOR这四种,除了NOT作之外,其他作可接收多个key。

时间复杂度:O(n)

返回值:保存到destkey的字符串的长度

示例:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 12345678@qq.com 举报,一经查实,本站将立刻删除。

联系我们

工作日:9:30-18:30,节假日休息