当前位置:首页 > 芯闻号 > 充电吧
[导读]事务redis中的事务(transaction)是一组命令的集合。事务同命令一样都是redis的最小执行单位。事务的原理:先将属于一个事务的命令发送给redis,然后再让redis依次执行这些命令。例

事务

redis中的事务(transaction)是一组命令的集合。

事务同命令一样都是redis的最小执行单位。


事务的原理:先将属于一个事务的命令发送给redis,然后再让redis依次执行这些命令。

例如:

MULTI

SADD ...

...

EXEC



WATCH

可以监控一个或多个键,一旦其中一个键被修改(或删除),之后的事务就不会执行。监控一直持续到EXEC命令(事务中的命令是在EXEC之后才执行的,所以在MULTI命令之后可以修改WATCH监控的键值)


过期时间

EXPIRE命令,设置一个键的过期时间,到时间后redis会自动删除它。EXPIRE key seconds 单位是秒。


TTL命令,一个键还有多久被删除,返回值是键的剩余时间(单位是秒);当键不存在时返回-2;没有为键设置国过期时间(即永久存在,这是建立一个键后的默认情况),返回-1。

redis>SET foo bar

ok

redis>EXPIRE foo 20

(integer)1

redis>TTL foo

(integer)15


redis>TTL foo

(integer)7


redis>TTL foo

(integer)-2


PERSIST命令,取消键的过期时间设置(即将键恢复成永久的)。如果过期时间被成功清楚则返回1,否则返回0(因为键不存在或键本来就是永久的)。使用SET或GETSET命令为键复赋值也会同时清除键的过期时间。


redis>SET foo bar

ok

redis>EXPIRE foo 20

(integer)1

redis>PERSIST foo

(integer)1

redis>TTL foo

(integer)-1


PEXPIRE命令,更精确的控制键的过期时间,单位毫秒。

PEXPIRE key 1000 等价于 EXPIRE key 1

PTTL命令,以毫秒为单位返回键的剩余时间。


如果使用WATCH命令监测了一个拥有过期时间的键,该键时间到期后自动删除,并不会被WATCH命令认为该键被改变。


EXPIREAT命令,使用Unix时间作为第二个参数表示键的过期时刻。


缓存

修改配置文件的maxmemory参数,限制redis最大可用内存大小(单位是字节),当超出这个限制时,redis会依据maxmemory-policy参数指定的策略来删除不需要的键直到redis占用的内存小于指定内存。


redis支持的淘汰键的规则如下:

volatile-lru  使用LRU算法删除一个键 (只对设置了过期时间的键)

allkey-lru    使用LRU算法删除一个键 

volatile-random 随机删除一个键 (只对设置了过期时间的键)

allkeys-random 随机删除一个键

volatile-ttl 删除过期时间一个最近的键

noeviction  不删除键,只返回错误


排序

SORT命令,可以对列表类型、集合类型、有序集合类型键进行排序。对有序集合类型排序时h会忽略元素的分数,只针对元素自身的值进行排序。例如:

reis>ZADD myzset  50 2 40 3 20 1 60 5

(integer)4

redis>SORT myzset 

1)"1"

2)"2"

3)"3"

4)"5"


SORT命令的 ALPHA参数 实现字典顺序排列非数字元素。

SORT命令的 DESC命令降序排列。

limit offset count,跳过前offset个元素并获取之后的count个元素。


BY参数,语法为BY参考键,可以是字符串类型键或者散列类型键的某个字段(表示为 键名->字段名)。如果提供了BY参数,SORT命令将不再依据元素自身的值进行排序,而是对每个元素使用元素的值替换参考键中的第一个"*"并取其值,然后依据该值对元素排序。


参考键还可以是字符串类型,

redis>LPUSH sortbyist 2 1 3

(integer)3

reis>SET itemscore:1 50

ok

reis>SET itemscore:2 100

ok

reis>SET itemscore:3 -10

ok

redis>SORT sortbyist BY itemscore:* DESC

1)"2"

2)"1"

3)"3"


当参考键名不包含"*"时(即常量键名,与元素值无关),SORT命令将不会执行排序操作。如果几个元素额参考键值相同,则会再比较元素本身的值排序。

redis>LPUSH sortbyist 4

(integer)4

reis>SET itemscore:4 50

ok

redis>SORT sortbyist BY itemscore:* DESC

1)"2"

2)"4"

3)"1"

4)"3"

示例中元素"4"的参考键值itemscore:4的值和元素"1"的参考键itemscore:1的值都是50,所以SORT命令会再比较"4"和"1"本身的大小来决定二者的顺序。


当某个元素的参考键不存在时,默认参考键的值为0:


redis>LPUSH sortbyist 5

(integer)4


redis>SORT sortbyist BY itemscore:* DESC

1)"2"

2)"4"

3)"1"

4)"5"

5)"3"


注意:参考键虽然支持散列类型,但是"*"只能在"->"符号前面(即键名部分)才有用,在"->"后(即字段名部分)会被当成字段名本身而不会作为占位符被元素的值替换,即常量键名。



GET参数,使SORT命令的返回结果不再是元素自身的值,而是GET参数中指定的键值。支持字符串和散列类型的键,并使用"*"作为占位符。一个SORT命令中可以有多个GET参数。GET # 会返回元素本身的值。


STORE参数,保存排序结果。


性能优化

SORT命令的时间复杂度是O(n+mlog(m)),其中n表示要排序的列表中的元素个数,m表示要返回的元素个数,redis在排序前会建立一个长度为n^4的容器来存储排序的元素。

1.尽可能减少待排序键中元素的数量(使N尽可能小)

2.使用limit参数只获取需要的数据(使M尽可能小)

3.如果要排序的数据数量较大,尽可能使用STORE参数将结果缓存。


消息通知

BRPOP命令与RPOP命令相似,唯一的区别是当列表中没有元素时BRPOP命令会一直阻塞,直到有新元素加入。BRPOP命令接受两个参数,第一个是键名,第二个是超时时间,单位是秒。当超过了此时间仍然没有获得新元素的话 会返回nil。超时时间为"0",表示不限制等待的时间,即如果没有新元素 加入列表 就会永远阻塞下去。


BRPOP命令可以同时接受多个键,BRPOP key [key ...] timeout


“发布/订阅”模式

发布者和订阅者,订阅者可以订阅一个或若干个频道(channel),而发布者可以向指定频道发送消息,所有订阅此频道的订阅者都会收到此消息。

PUBLISH  channel  message

SUBSCRIBE channel [channel ...] 

UNSUBSCRIBE channel [channel ...] 


按照规则订阅

除了使用SUBSCRIBE命令订阅指定名称的频道外,还可以使用PSUBSCRIBE 命令订阅指定的规则。PUNSUBSCRIBE  退订。



本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

前言说到redis,可能大家的脑海中蹦出的关键词是:NoSQL、KV、高性能、缓存等。但今天的文章从另一个角度——微服务来展开。这篇文章的起因也是源自一次面试经历,在面试一位来自陌陌的候选人(就是那个交友的陌陌)时,他提...

关键字: redis

面试官:你们系统是怎么实现分布式锁的?我:我们使用了redis的分布式锁。具体做法是后端接收到请求后加入一个分布式锁,如果加锁成功,就执行业务,如果加锁失败就等待锁或者拒绝请求。业务执行完成后释放锁。面试官:能说一下具体...

关键字: 分布式 redis

进程请求分布式锁时一般包含三个阶段:1.进程请求获取锁;2.获取到锁的进程持有锁并执行业务逻辑;3.获取到锁的进程释放锁;下文会按照这个三个阶段进行分析。单机Redis获取锁从一开始的请求进程通过SETNX命令获取锁;1...

关键字: redis zookeeper 分布式锁

经过前面两篇文章《JSON Web Token - 在Web应用间安全地传递信息》《八幅漫画理解使用JSON Web Token设计单点登录系统》的科普,相信大家应该已经知道了 JWT 协议是什么了。

关键字: JWT redis session

我是Redis,一个叫Antirez的男人把我带到了这个世界上。 那天,Redis基友群里,许久未见的大白发来了一条消息……于是,大白拉了一个新的群 以后的日子中,咱们哥仨相互配合,日常工作中最多的就是数据同步了……

关键字: redis 嵌入式

作为一名服务端工程师,工作中你肯定和Redis打过交道。Redis为什么快,这点想必你也知道,至少为了面试也做过准备。很多人知道Redis快仅仅因为它是基于内存实现的,对于其它原因倒是模棱两可。那么,今天就和小莱一起看看...

关键字: redis 嵌入式

作为一名后端工程师,工作中你肯定和 Redis 打过交道。Redis 为什么快,这点想必你也知道,至少为了面试也做过准备。很多人知道 Redis 快仅仅因为它是基于内存实现的,对于其它原因倒是模棱两可。

关键字: redis 嵌入式

内存数据库Redis的相关知识,几乎是大厂的必考题,本文总结了设计Redis的11道面试题。

关键字: redis 嵌入式

最近,又重新学习了下Redis,深深被Redis的魅力所折服,Redis不仅能快还能慢,简直利器呀!

关键字: redis 嵌入式

本文介绍了Redis高可用相关的机制。

关键字: redis 架构
关闭
关闭