redis是k-v键值对进行存储,这里的数据类型是value的数据类型,key的类型都是字符串
keys *//当前库的所有keyexists key//判断某个key是否存在type key//查看你的key是什么类型del key //删除指定的key数据unlink key//非阻塞删除,仅仅将keys从keyspace元数据中删除,没真正的删除会在后续异步中操作ttl key // 查看还有多少秒过期 -1表示永不过期 -2 表示已过期expire key 秒// 给key设置过期时间move key dbindex [0-15] // 将当前数据库的key移动到指定的数据库中redis默认是有16个数据库的select dbindex [0-15] // 切换数据库[0-15],默认为0dbsize // 查看当前数据库key的数量flushdb // 清空当前库flushall // 清空16个数据库 慎用
命令不区分大小写,而key的值是区分大小写的
help @+数据类型 会出现命令提示 比如 help @string
3.1 Redis 字符串(String)
- string是redis最基本的类型,一个key对应一个value。
- string类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象 。
- string类型是Redis最基本的数据类型,一个redis中字符串value最多可以是512M
最常用
set key value ex 20 // 设置值 20秒过期get key // 获得对应的值
同时设置/获取多个键值
MSET [key1] [value1] [key2] [value2] [key3] [value3]// 同时设置一个或多个键值对MGET [key1] [key2] [key3]// 同时获取多个key的值MSETNX [key1] [value1] [key2] [value2]// 同时设置一个或多个 key-value 对必须保证key都不存在才能成功
获取指定区间
GETRANGE [key] 0 -1// 获取这个key的值的全部GETRANGE [key] 0 2 // 获取这个key的值索引0到索引2之间的值SETRANGE [key] 1 xxx// 设置指定区间范围内的值
数值增减
INCR [key]// 递增数字 +1INCR [key] [increment] // 增加指定的整数+increment DECR [key] // 递减数字 -1DECR [key] [increment] // 减少指定的整数-increment
获取字符串长度和内容相加
STRLEN [key]// 获取key对应的值的长度APPEND [key] [vale] // 添加字符串内容
分布式锁
setnx/setex [key] [过期时间] [value]// 设置带过期时间的key,动态设置setnx/setex [key] [value] // 只有在 key 不存在时设置 key 的值。// 一般是两个命令连用,写成lua脚本连用,具体在Redis高级分布式锁中使用
getset(先get再set)
getset [key] [value]// 给定 key 的值设为 value ,并返回 key 的旧值
应用
- dy点赞某个视频或商品,点一次加一次
- 使用incr key 获得多少人喜欢
- 对于文章是否喜欢
- 使用incr key 获得多少人喜欢
3.2Redis列表(List)
单key多vlue
结构:
- 一个双端链表的结构,容量是2的32次方减1个元素,大概40多亿,主要功能有push/pop等,一般用在栈、队列、消息队列等场景
- left、right都可以插入添加;
- 如果键不存在,创建新的链表
- 如果键已存在,新增内容
- 如果键全移除,对应的键也就消失了
- 底层就是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差
常用命令
lpush [key] [value] ...// 往 列表头部(左边)放入元素Rpush [key] [value] ...// 往 列表(右边)放入元素lrange [key] 0 -1// 从左边开始遍历列表只能从左边遍历lpop [key] // 最左边的出栈 也就是lrange遍历的第一个rpop [key] // 最右边的出栈 也就是lrange遍历的最后一个lindex [key] [index]// 通过索引值获取值llen [key]// 获得元素个数lrem [key] [num] [value]// 从左往右删除 num个值为 value的值lrem [key] 0 [value]// 从左往右删除所有值为value的值ltrim [key] [开始] [结束] // 截取指定范围的值后再赋给[key],也就是删除这个区间外的值RPOPLPUSH [key1] [key2]//移除列表的最后一个元素,并将该元素添加到另一个列表的第一个并返回lset [key] [index] [value] //将key的第 index 个索引值改为valuelinsert [key] before/after [value1] [value2] // 在list某个已有值的前后再添加具体值
应用场景
- 公众号的订阅的消息
- 关注的人发布文章,就会到我的List lpush likearticle:id 文章id
- 查看自己订阅的文章 lrange likearticle:id 0 9
3.3 Redis哈希(Hash)
k-v 模式不变,但v是一个键值对 => Map<String,Map
常用命令:
hset/hget/hmset/hmget/hgetall/hdel
hlen // 获取在某个key内的全部数量hexists [key] [k1] // 看key中是否有k1这个键hkeys [key]// 获取key里面的所有keyhvals [key]// 获取key里面的所有valuehincrby [key] k1 [num] // key里面k1的值增长num 整数hincrbyfloat [key] k1 [num] // key里面k1的值增长num 小数hsetnx [key] k1 [value] // 不存在赋值,存在了无效\
应用场景
- 早期购物车设计,基本不用了,中小厂可用
3.4 Redis集合(Set)
单值多value,无重复
常用的
SADD key member ... // 添加元素SMEMBERS key// 遍历集合中所有元素SISMEMBER key member// 判断元素是否在集合中SREM key member ... // 删除元素SCARDkey// 获取集合长度SRANDMEMBER key m // 从set集合里面随机取出m个如果超过最大数量就全部取出 如果写的值是负数,比如-3 ,表示需要取出3个,但是可能会有重复值不会删除SPOP key m // 从集合中随即弹出一个元素出一个删一个SMOVE key1 key2 在key1里已存在的某个值// 将key1的已存在的某个值赋给key2
集合运算
SDIFF keyA keyB // A - B属于A但不属于B的元素构成的集合SUNION keyA keyB// A U B属于A或者属于B的元素合并后的SINTER keyA keyB// A ∩ B属于A同时属于BSINTERCARD numkeys keyA keyB [LIMIT limit] // 不返回结果集,只返回结果的基数
应用
- 抽象小程序
- 将所有抽奖用户 sadd key 用户ID
- 显示多少人参加 SCARD key
- 从set中任意选取N个中奖人
- SRANDMEMBER key 2 随机抽奖两个人,元素不删除
- SPOP key 2 随机抽奖两个人,元素会删除
- 朋友圈点赞
- 新增点赞 SADD pub:msgID 点赞用户Id1 点赞用户Id2
- 取消点赞 SREM pub:msgID 点赞用户Id
- 展现所有点赞过的用户 SMEMBERS pub:msgID
- 点赞用户统计 SCARD pub:msgID
- 判断某个朋友是否对楼主点赞过 SISMEMBER pub:msgID 用户Id
- 可能认识的人
- 求两个人的差集 SDIFF user1 user2
3.5Reids有序集合(Zset)
注意:Zset和set的区别,就是在set的基础上加了一个score分数值。
- set k1 v1 v2 v3
- Zset k1 score1 v1 score2 v2
常用的
ZADD key score member [ score member ] // 添加元素ZRANGE key start stop [WITHSCORES] // 返回元素分数从小到大的顺序 返回索引从start到stop之间的所有元素ZREVRANGE key 0 - 1 [WITHSCORES] // 反序ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] // 获取指定分数范围的元素(min,max) 不包含 limit是返回限制,返回多少个 ZSCORE key member // 获取元素的分数ZCARD key // 获取集合中元素的数量ZREM key 某score下对应的value值 // 删除元素ZINCRBY key increment member// 增加某个元素的分数ZCOUNT key min max // 获得指定分数范围内的元素个数ZRANK key values值 // 获得下标值ZREVRANK key values// 逆序获得下标值、
ZMPOP numkeys key [key …] [COUNT count]
弹出元素 会删除
numkeys 表示几个key
小 | 大
[COUNT count] count num 弹出num个
应用:
- 根据商品销售对商品进行排序显示
- 思路:定义商品销售排行榜(sorted set集合),key为goods:sellsort,分数为商品销售数量。
- 商品编号1001的销量是9,商品编号1002的销量是15
- zadd goods:sellsort 9 1001 15 1002
- 有一个客户又买了2件商品1001,商品编号1001销量加2
- zincrby goods:sellsort 2 1001
- 求商品销量前10名
- ZRANGE goods:sellsort 0 9 withscores