redis 常用命令、场景使用整理

更多详见文档

 https://download.csdn.net/download/yunxixiao/33158919

help

help @string  、 help @list 查看命令指令用法

String

APPEND命令 -- Redis中国用户组(CRUG)

字符串

set 

set key1 hello

将键key设定为指定的“字符串”值。

如果 key 已经保存了一个值,那么这个操作会直接覆盖原来的值,并且忽略原始类型。

当set命令执行成功之后,之前设置的过期时间都将失效

get

get key1

返回key的value。如果key不存在,返回特殊值nil。如果key的value不是string,就返回错误,因为GET只处理string类型的values。

append

append key1 value追加一个值到key上

setrange  指定修改某字符串的字串

setrange key offset value

这个命令的作用是覆盖key对应的string的一部分,从指定的offset处开始,覆盖value的长度。如果offset比当前key对应string还要长,那这个string后面就补0以达到offset。不存在的keys被认为是空字符串,所以这个命令可以确保key有一个足够大的字符串,能在offset处设置value。

注意,offset最大可以是229-1(536870911),因为redis字符串限制在512M大小。如果你需要超过这个大小,你可以用多个keys。

getrange 返回对应的子字符串

getrange key start end

警告:这个命令是被改成GETRANGE的,在小于2.0的Redis版本中叫SUBSTR。 返回key对应的字符串value的子串,这个子串是由start和end位移决定的(两者都在string内)。可以用负的位移来表示从string尾部开始数的下标。所以-1就是最后一个字符,-2就是倒数第二个,以此类推。

这个函数处理超出范围的请求时,都把结果限制在string内。

redis 常用命令、场景使用整理_第1张图片

strlen 字符串长度

返回key的string类型value的长度。如果key对应的非string类型,就返回错误。

redis 常用命令、场景使用整理_第2张图片

getset

自动将key对应到value并且返回原来key对应的value。如果key存在但是对应的value不是字符串,就返回错误。

设计模式

GETSET可以和INCR一起使用实现支持重置的计数功能。举个例子:每当有事件发生的时候,一段程序都会调用INCR给key mycounter加1,但是有时我们需要获取计数器的值,并且自动将其重置为0。

redis 常用命令、场景使用整理_第3张图片

数值 

incr 加 =》 时间复杂度:O(1)

默认不写 直接加1  具体说明详见 incr 命令 -- Redis中国用户组(CRUG)

incr key 原先的值加1

incr key 10 原先的值加10

常见的场景: 计数器限速器

Redis的原子递增操作最常用的使用场景是计数器。

使用思路是:每次有相关操作的时候,就向Redis服务器发送一个incr命令。

例如这样一个场景:我们有一个web应用,我们想记录每个用户每天访问这个网站的次数。

web应用只需要通过拼接用户id和代表当前时间的字符串作为key,每次用户访问这个页面的时候对这个key执行一下incr命令。

这个场景可以有很多种扩展方法:

通过结合使用INCR和EXPIRE命令,可以实现一个只记录用户在指定间隔时间内的访问次数的计数器

客户端可以通过GETSET命令获取当前计数器的值并且重置为0

通过类似于DECR或者INCRBY等原子递增/递减的命令,可以根据用户的操作来增加或者减少某些值 比如在线游戏,需要对用户的游戏分数进行实时控制,分数可能增加也可能减少。

decr  减 =》 时间复杂度:O(1)

默认不写 直接减1 

对key对应的数字做减1操作。如果key不存在,那么在操作之前,这个key对应的值会被置为0。如果key有一个错误类型的value或者是一个不能表示成数字的字符串,就返回错误。这个操作最大支持在64位有符号的整型数字。

decr key  原先的值减1

decr key 20 原先的值减20

bitmap  二进制

setbit

setbit 命令 -- Redis中国用户组(CRUG)

setbit key offset value

设置或者清空key的value(字符串)在offset处的bit值。

那个位置的bit要么被设置,要么被清空,这个由value(只能是0或者1)来决定。当key不存在的时候,就创建一个新的字符串value。要确保这个字符串大到在offset处有bit值。参数offset需要大于等于0,并且小于232(限制bitmap大小为512)。当key对应的字符串增大的时候,新增的部分bit值都是设置为0。

警告:当set最后一个bit(offset等于232-1)并且key还没有一个字符串value或者其value是个比较小的字符串时,Redis需要立即分配所有内存,这有可能会导致服务阻塞一会。在一台2010MacBook Pro上,offset为232-1(分配512MB)需要~300ms,offset为230-1(分配128MB)需要~80ms,offset为228-1(分配32MB)需要~30ms,offset为226-1(分配8MB)需要8ms。注意,一旦第一次内存分配完,后面对同一个key调用SETBIT就不会预先得到内存分配。

0 1 0 0 0 0 0 0 => @

0 1 0 0 0 0 0 1 => A

0 1 0 0 0 0 1 0 => B

redis 常用命令、场景使用整理_第4张图片

redis 常用命令、场景使用整理_第5张图片

bitpos

bitpos key bit [start] [end]

bitpos 命令 -- Redis中国用户组(CRUG)

返回字符串里面第一个被设置为1或者0的bit位。

返回一个位置,把字符串当做一个从左到右的字节数组,第一个符合条件的在位置0,其次在位置8,等等。

GETBIT 和 SETBIT 相似的也是操作字节位的命令。

默认情况下整个字符串都会被检索一次,只有在指定start和end参数(指定start和end位是可行的),该范围被解释为一个字节的范围,而不是一系列的位。所以start=0 并且 end=2是指前三个字节范围内查找。

注意,返回的位的位置始终是从0开始的,即使使用了start来指定了一个开始字节也是这样。

和GETRANGE命令一样,start和end也可以包含负值,负值将从字符串的末尾开始计算,-1是字符串的最后一个字节,-2是倒数第二个,等等。

不存在的key将会被当做空字符串来处理。

返回值

命令返回字符串里面第一个被设置为1或者0的bit位。

如果我们在空字符串或者0字节的字符串里面查找bit为1的内容,那么结果将返回-1。

如果我们在字符串里面查找bit为0而且字符串只包含1的值时,将返回字符串最右边的第一个空位。如果有一个字符串是三个字节的值为0xff的字符串,那么命令BITPOS key 0将会返回24,因为0-23位都是1。

基本上,我们可以把字符串看成右边有无数个0。

然而,如果你用指定start和end范围进行查找指定值时,如果该范围内没有对应值,结果将返回-1。

redis 常用命令、场景使用整理_第6张图片

bitcount 被设置为 1 的位的数量。

bitcount key bit [start] [end]

统计字符串被设置为1的bit数.

一般情况下,给定的整个字符串都会被进行计数,通过指定额外的 start 或 end 参数,可以让计数只在特定的位上进行。

start 和 end 参数的设置和 GETRANGE 命令类似,都可以使用负数值:比如 -1 表示最后一个位,而 -2 表示倒数第二个位,以此类推。

不存在的 key 被当成是空字符串来处理,因此对一个不存在的 key 进行 BITCOUNT 操作,结果为 0 。

示例:如上图

bitop  按位操作

对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上。

BITOP 命令支持 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种参数:

BITOP AND destkey srckey1 srckey2 srckey3 ... srckeyN ,对一个或多个 key 求逻辑并,并将结果保存到 destkey 。

BITOP OR destkey srckey1 srckey2 srckey3 ... srckeyN,对一个或多个 key 求逻辑或,并将结果保存到 destkey 。

BITOP XOR destkey srckey1 srckey2 srckey3 ... srckeyN,对一个或多个 key 求逻辑异或,并将结果保存到 destkey 。

BITOP NOT destkey srckey,对给定 key 求逻辑非,并将结果保存到 destkey 。

除了 NOT 操作之外,其他操作都可以接受一个或多个 key 作为输入。

执行结果将始终保持到destkey里面。

处理不同长度的字符串

当 BITOP 处理不同长度的字符串时,较短的那个字符串所缺少的部分会被看作 0 。

空的 key 也被看作是包含 0 的字符串序列

返回值

保存到 destkey 的字符串的长度,和输入 key 中最长的字符串长度相等。

redis 常用命令、场景使用整理_第7张图片

场景

1用户系统、统计用户登录天数 且窗口随机

Eg.

setbit sean 1 1 => (integer) 0  2天登录

setbit sean 7 1 => (integer) 0  8天登录

setbit sean 364 1 => (integer) 0 365天登录

strlen sean  => (integer) 46

bitcount sean -2 -1 => (integer) 1

2京东就是你们的 618做活动,送礼物 

大库备货多少礼物?

假设京东有2E用户

僵尸用户

冷热用户/忠诚用户

活跃用户统计!随机窗口

比如说 1-3 连续登录要 去重

注意:对应的位和用户绑定一起,登录后对应的位标识为1

setbit 20190101 1 1 => (integer) 0

setbit 20190102 1 1 => (integer) 0

setbit 20190102 7 1 => (integer) 0

bitop or destkey 20190101 20190102 => (integer) 1

bitcount destkey 0 -1 => (integer) 2

3OA权限 777 linux rwx rwx rwx 241

000 = 0

111 = 7

001001000100

布隆过滤器? 模块化 布隆过滤器

412306 购票

redis 常用命令、场景使用整理_第8张图片

list

Redis命令中心(Redis commands) -- Redis中国用户组(CRUG)

特征

有序 = 放入的元素

 = 同向命令

队列 =反向命令

数组

阻塞,单播队列 FIFO

lpush 

从队列的左边入队1个或多个元素

rpush

从队列的右边入队1个或多个元素

lpop

从队列的左边出队1个

rpop

从队列的右边出队1个

ltrim

修剪到指定范围内的清单

lrange

从列表中获取指定返回的元素

lindex

获取一个元素,通过其索引列表

lset

设置队列里面一个的元素

lrem

从列表中删除元素

llen

获取队列的长度

linsert

在列表中的另一个元素之前或之后插入一个元素

blpop

删除,病获得该列表中的第一元素,或阻塞,直到有一个可用

场景

 分页 微信抢红包 数据共享,迁出 无状态

示例

redis 常用命令、场景使用整理_第9张图片

redis 常用命令、场景使用整理_第10张图片

redis 常用命令、场景使用整理_第11张图片

 redis 常用命令、场景使用整理_第12张图片

redis 常用命令、场景使用整理_第13张图片

hash

对field进行数值计算

场景

点赞 收藏 商品详情页展示 聚合场景

redis 常用命令、场景使用整理_第14张图片

redis 常用命令、场景使用整理_第15张图片

set

特征

无序 去重

集合 多

成本, 不推荐使用

场景

推荐系统

共同好友:交集

推荐好友:差集

并集?

随机事件 

=》srandmember key count

正数:取出一个去重的结果集(不能超过已有集)

负数:取出一个带重复的结果集,一定满足你要的数量 

如果 0 不返回

 =》

抽奖

10个奖品

用户: <10  >10

中奖: 是否重复

sorted_set   

zset 排序

skiplist 源码 有序集合

特征

物理内存左小右大

不随命令发生变化

zrange

Zrevrange

集合操作 =》 并集 zunionstore交集 =》  权重/聚合指令

排序是怎么实现的 增删改查的速度? =》skip list 跳跃表

场景

排行榜

有序事件

评论+分页

type  返回数据结构类型

type key

返回key所存储的value的数据结构类型,它可以返回stringlistsetzset 和 hash等不同的类型

object

object encoding 内部编码

http://www.redis.cn/commands/object.html

该命令返回指定key对应value所使用的内部表示

###对象可以用多种方式编码:

字符串可以被编码为 raw (常规字符串) 或者int (用字符串表示64位无符号整数这种编码方式是为了节省空间).

列表类型可以被编码为ziplist 或者 linkedlist. ziplist 是为了节省较小的列表空间而设计一种特殊编码方式.

集合被编码为 intset 或者 hashtable. intset 是为了存储数字的较小集合而设计的一种特殊编码方式.

哈希表可以被编码为 zipmap 或者hashtable. zipmap 是专为了较小的哈希表而设计的一种特殊编码方式

有序集合被编码为ziplist 或者 skiplist 格式. ziplist可以表示较小的有序集合, skiplist 表示任意大小多的有序集合.

 更多详见文档

 https://download.csdn.net/download/yunxixiao/33158919

学习笔记,仅供参考!如有侵权,请联系删除! 

学习笔记,仅供参考!如有侵权,请联系删除! 

你可能感兴趣的:(Redis,redis)