字符串类型
命令中有nx 即为原子操作
set
所有命令
set k1 val nx
nx:不存在时才去进行设置 ,只能新建,常用于分布式锁
xx:只有存在的时候才可以操作,只能更新
mset
给多个key赋值
append
追加操作,将字符串追加到指定key的末尾
getrange
取出指定key的从指定开始到结束的值,包含开始和结束位置
正反向索引
正向索引:从0开始 依次是 0、1、2、3。。。
反向索引:从-开始,依次是-1、-2、-3。。。
所以这个值也可以这么取
setrange
从offset开始 将value 添加到 key对应的vlaue中进行覆盖操作
strlen
获取字符串的长度
getset
设置新值,返回老值;如果没有值则直接set返回空
msetnx
设置新的值,如果已经存在则不能赋值,操作失败
原子性操作,只有都成功才会成功,只要有一个失败就都失败
数值类型
incr
固定加1操作
decr
固定减1操作
incrby、decrby
加或者减指定值的操作
incrbyfloat
加指定的小数
object encoding
string 的编码类型可能为:
OBJ_ENCODING_INT int :long 类型整数
OBJ_ENCODING_RAW raw :sds 字符串
OBJ_ENCODING_EMBSTR embstr :嵌入式字符串(编码后长度小于 44 字节的字符串)
二进制安全
当有数据需要进行保存时,只取字节流,来进行操作,reids本质存储的是字节,在使用redis一定要在用户端沟通好编码和解码
位图 bitmap
setbit
其中 offset 是二进制位的偏移量,表示第几个二进制位数,从0开始
比如
127.0.0.1:6379> setbit k1 7 1
表示 第 7个二进制位的值为1
如果可以转成asc码,优先转成asc码
bitpos
其中
- bit 表示 要查找的二进制字节
- start 表示字节开始的位置,这里指的是字节的索引,就是对应上图的圆圈
- end表示字节结束的位置,这里指的是字节的索引,就是对应上图的圆圈
- 返回的是二进制所对应的索引位置
bitcount
其中
- start指的是字节索引开始位置
- end指的是字节索引的结束位置
- count:统计指定范围内的二进制1出现的次数
bitop
其中
- destkey 是指目标key,将当前命令执行的结果放入到这个key中
- key … 多个key
- operation:逻辑操作 与 或 非 异或 按位
按位与操作 全1 为1 其余为0
按位或操作 全0为0 有1为1
实际场景
1.公司用户系统
需求:统计用户的登录天数,且窗口随机
方案:用户位图 bitmap进行存储,给每个用户分配400个二进制位,哪天登录了,就把对应的二进制位的值变为1,二进制索引为天数-1,每个用户占46B ,最终占用大小 46B*用户数
统计天数为bitcount key
2.618活动,登录送礼物大库备货多少礼物假设有2亿用户
活跃用户 比如1号 - 3号 用户连续登录 去重
方案:日期作为key offset映射为用户id,value为是否登录
list链表
所有命令
head:头指针
tial:尾指针
lpush
lpush 从左边往里面放值,头插法,
可以一次放多个值
rpush
rpush从右边往里面放值,尾插法
也是可以一次放多个值
lpop
lpop从左边开始弹出元素
弹出后,元素从列表中移除
lpop弹出 lpush放入的元素,后入先出 类似于栈
lpop 弹出 rpush放入的元素,先入先出,类似于队列
rpop
rpop从左边开始弹出元素
弹出后,元素从列表中移除
rpop弹出 rpush放入的元素,后入先出 类似于栈
rpop 弹出 lpush放入的元素,先入先出,类似于队列
同向操作为栈
反向操作为队列
lrange
lrange:查看元素
start:开始位置
stop:结束位置
查看所有元素 lrange key 0 -1
lindex
给出索引取出相应的元素
在这里插入图片描述
lset
根据索引去更新相应的元素
对于这个根据索引的操作,类似于数组
lrem
移除指定value的count个元素,
count:分为正数、负数、流
如果是正数:从上往下依次删除
如果是负数从下往上依次删除
linsert
在第一个指定的元素前面或者后面插入一个元素
llen
统计list的长度
blpop
b开头的都是阻塞操作 block
阻塞弹出元素
timeout:阻塞时间,0-永久阻塞
ltrim
给定开始和结束位置,对两端的没有包括的数据移除
这里就移除了 从1开始4结束之外的位置
hash
所有命令
hset
往redis放入hash类型的值
field:放入的属性,value放入的值
hget
取值
hmset
一次性放入多个键值对
hmget
一次获取多个值
hgetall
获取所有的键值对
hexistx
判断属性是否存在
hkeys
获取所有的属性
hvals
获取所有的value值
hincrbyfloat
对value进行数值计算,加/减小数
hincrby
对value进行数值计算,加/减整数
应用场景
商品信息的展示数据,一批数据面向一个对象
set
所有命令
sadd
元素是无序、去重的
往set中添加元素
srem
移除指定的元素,可以一次移除多个
smembers
获取key的所有member
sinter
去两个set集合的交集
sinterstroe
将交集的结果存放在 destination 中
sunion
取两个集合的并集
sunionstore
将取到的结果放到 destination 中
sdiff
取差集,取的是前面一个集合中在后面集合中不存在的元素
srandmember
从set 中随机取出count个元素
count为正数时:取出count个不重复的元素,不会超过已有的集合中元素的数量
count为负数时:取出count个可能重复的元素,一定会满足count个
count如果为0:不返回
实际场景
抽奖
10个奖品
用户 <10 或者 >10
中将是否可以重复
方案:set中存用户id,srandmember 随机抽取,正数不重复,负数可以重复
spop
随机从集合样本中弹出一个元素,移除掉
sorted_set
命令使用 z 开头
所有命令
zadd
添加元素到集合中
key 键
score 分值
member 元素
默认使用 物理内存左小右大的顺序,不随着命令发生变化
zrange
查看元素以及分值
zrevrange
zrange 的反向
zrangebyscore
按分值去取元素
min:最小分值
max:最大分值
zscore
通过元素取出分值
zrank
根据元素取出排名
zincrby
给指定的元素增加 incrment 的值
增加后会重新进行排名
zunionstore
取集合的并集,对于集合中都存在的元素,对于分值的处理,可以取最小值/最大值/和
默认是求和
权重weights ,这里k1是1 k2是0.5
取最小的
zinterstore
取交集
weights:权重
aggregate:取大、小或者求和
这里是 k1权重为1 k2权重为2 方式是取最大值
排序是怎么实现的,增删改查的速度
skip list 跳跃表