help @string 、 help @list 查看命令指令用法
APPEND命令 -- Redis中国用户组(CRUG)
set key1 hello
将键key设定为指定的“字符串”值。
如果 key 已经保存了一个值,那么这个操作会直接覆盖原来的值,并且忽略原始类型。
当set命令执行成功之后,之前设置的过期时间都将失效
get key1
返回key的value。如果key不存在,返回特殊值nil。如果key的value不是string,就返回错误,因为GET只处理string类型的values。
append key1 value追加一个值到key上
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 key start end
警告:这个命令是被改成GETRANGE的,在小于2.0的Redis版本中叫SUBSTR。 返回key对应的字符串value的子串,这个子串是由start和end位移决定的(两者都在string内)。可以用负的位移来表示从string尾部开始数的下标。所以-1就是最后一个字符,-2就是倒数第二个,以此类推。
这个函数处理超出范围的请求时,都把结果限制在string内。
返回key的string类型value的长度。如果key对应的非string类型,就返回错误。
自动将key对应到value并且返回原来key对应的value。如果key存在但是对应的value不是字符串,就返回错误。
设计模式
GETSET可以和INCR一起使用实现支持重置的计数功能。举个例子:每当有事件发生的时候,一段程序都会调用INCR给key mycounter加1,但是有时我们需要获取计数器的值,并且自动将其重置为0。
默认不写 直接加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等原子递增/递减的命令,可以根据用户的操作来增加或者减少某些值 比如在线游戏,需要对用户的游戏分数进行实时控制,分数可能增加也可能减少。
默认不写 直接减1
对key对应的数字做减1操作。如果key不存在,那么在操作之前,这个key对应的值会被置为0。如果key有一个错误类型的value或者是一个不能表示成数字的字符串,就返回错误。这个操作最大支持在64位有符号的整型数字。
decr key 原先的值减1
decr key 20 原先的值减20
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
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。
bitcount key bit [start] [end]
统计字符串被设置为1的bit数.
一般情况下,给定的整个字符串都会被进行计数,通过指定额外的 start 或 end 参数,可以让计数只在特定的位上进行。
start 和 end 参数的设置和 GETRANGE 命令类似,都可以使用负数值:比如 -1 表示最后一个位,而 -2 表示倒数第二个位,以此类推。
不存在的 key 被当成是空字符串来处理,因此对一个不存在的 key 进行 BITCOUNT 操作,结果为 0 。
示例:如上图
对一个或多个保存二进制位的字符串 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 中最长的字符串长度相等。
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
大库备货多少礼物?
假设京东有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
000 = 0
111 = 7
001001000100
布隆过滤器? 模块化 布隆过滤器
Redis命令中心(Redis commands) -- Redis中国用户组(CRUG)
有序 =》 放入的元素
栈 =》 同向命令
队列 =》反向命令
数组
阻塞,单播队列 FIFO
从队列的左边入队1个或多个元素
从队列的右边入队1个或多个元素
从队列的左边出队1个
从队列的右边出队1个
修剪到指定范围内的清单
从列表中获取指定返回的元素
获取一个元素,通过其索引列表
设置队列里面一个的元素
从列表中删除元素
获取队列的长度
在列表中的另一个元素之前或之后插入一个元素
删除,病获得该列表中的第一元素,或阻塞,直到有一个可用
分页 微信抢红包 数据共享,迁出 无状态
对field进行数值计算
点赞 收藏 商品详情页展示 聚合场景
无序 去重
集合 多
成本, 不推荐使用
共同好友:交集
推荐好友:差集
并集?
=》srandmember key count
正数:取出一个去重的结果集(不能超过已有集)
负数:取出一个带重复的结果集,一定满足你要的数量
如果 0 不返回
=》
抽奖
10个奖品
用户: <10 >10
中奖: 是否重复
物理内存左小右大
不随命令发生变化
集合操作 =》 并集 zunionstore交集 =》 权重/聚合指令
排序是怎么实现的 增删改查的速度? =》skip list 跳跃表
排行榜
有序事件
评论+分页
type key
返回key所存储的value的数据结构类型,它可以返回string, list, set, zset 和 hash等不同的类型
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 表示任意大小多的有序集合.
学习笔记,仅供参考!如有侵权,请联系删除!
学习笔记,仅供参考!如有侵权,请联系删除!