更多详见文档
https://download.csdn.net/download/yunxixiao/33158919
help
help @string 、 help @list 查看命令指令用法
String
字符串
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内。
strlen 字符串长度
返回key的string类型value的长度。如果key对应的非string类型,就返回错误。
getset
自动将key对应到value并且返回原来key对应的value。如果key存在但是对应的value不是字符串,就返回错误。
设计模式
GETSET可以和INCR一起使用实现支持重置的计数功能。举个例子:每当有事件发生的时候,一段程序都会调用INCR给key mycounter加1,但是有时我们需要获取计数器的值,并且自动将其重置为0。
数值
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 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
bitpos key bit [start] [end]
返回字符串里面第一个被设置为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 被设置为 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 中最长的字符串长度相等。
场景
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
3、OA权限 777 linux rwx rwx rwx 241
000 = 0
111 = 7
001001000100
布隆过滤器? 模块化 布隆过滤器
4、12306 购票
list
Redis命令中心(Redis commands) -- Redis中国用户组(CRUG)
特征
有序 =》 放入的元素
栈 =》 同向命令
队列 =》反向命令
数组
阻塞,单播队列 FIFO
lpush
从队列的左边入队1个或多个元素
rpush
从队列的右边入队1个或多个元素
lpop
从队列的左边出队1个
rpop
从队列的右边出队1个
ltrim
修剪到指定范围内的清单
lrange
从列表中获取指定返回的元素
lindex
获取一个元素,通过其索引列表
lset
设置队列里面一个的元素
lrem
从列表中删除元素
llen
获取队列的长度
linsert
在列表中的另一个元素之前或之后插入一个元素
blpop
删除,病获得该列表中的第一元素,或阻塞,直到有一个可用
场景
分页 微信抢红包 数据共享,迁出 无状态
示例
hash
对field进行数值计算
场景
点赞 收藏 商品详情页展示 聚合场景
set
特征
无序 去重
集合 多
成本, 不推荐使用
场景
推荐系统
共同好友:交集
推荐好友:差集
并集?
随机事件
=》srandmember key count
正数:取出一个去重的结果集(不能超过已有集)
负数:取出一个带重复的结果集,一定满足你要的数量
如果 0 不返回
=》
抽奖
10个奖品
用户: <10 >10
中奖: 是否重复
sorted_set
zset 排序
skiplist 源码 有序集合
特征
物理内存左小右大
不随命令发生变化
zrange
Zrevrange
集合操作 =》 并集 zunionstore交集 =》 权重/聚合指令
排序是怎么实现的 增删改查的速度? =》skip list 跳跃表
场景
排行榜
有序事件
评论+分页
type 返回数据结构类型
type key
返回key所存储的value的数据结构类型,它可以返回string, list, set, zset 和 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
学习笔记,仅供参考!如有侵权,请联系删除!
学习笔记,仅供参考!如有侵权,请联系删除!