redis基础命令
select切换数据库:一共16个库(索引从0开始)
dbsize查看当前数据库的key的数量
flushdb:清空当前库
Flushall;通杀全部库
key 相关的命令
-
keys *:查看当前数据库所有的key
命令:keys *
-
exists key的名字:判断某个key是否存在
命令:exists key的名字
(存在:返回1,不存在:返回0)
-
move key db:移动key到指定的库(相当于剪切,一个库移动到另一个库)
命令:move key db
例如:把0号库的 key为a1 的数据移动到1号库
-
expire key 秒钟 和 ttl key:设置过期时间,和查看过期时间
命令:ttl key
查看还有多少秒过期,-1表示永不过期,-2表示已过期
命令:expire key 数字
为给定的key设置过期时间
例:给a1 设置过期时间为10秒,并查看还有多长时间过
-
type key:查看你的key是什么类型
命令:type key
Redis 数据类型及其相关命令
Redis字符串(String)
redis 的string类型是单值单value
-
set/get/del/append/strlen
命令:set key value
: 往redis存值get key
:取出对应的key的值del key
:删除对应的key和值append key value
: 往key 的值中追加数据(相当与字符串拼接)strlen key
:对应字符串的长度
-
Incr/decr/incrby/decrby (一定要是数字才能进行加减)
命令:Incr key
:每次增加1decr key
: 每次减1incrby key num
:key对应的数按num数量递增decrby key num
:每次按num数量的递减
-
getrange/setrange
getrange key startIndex endIndex
:获取指定区间的值包含开始和结束索引(getrange key 0 -1:表示返回所有)setrange key startIndex 值
:从指定位置设置值(覆盖了原来的值)
-
setex(set with expire)/setnx(set if not exist)
setex key 过期时间 值
:设置值并设置过期时间setnx key 值
:如果不存在才插入值
-
mset/mget/msetnx
mset key1 v1 key2 v2 key3 v3
:一次可以插入多个值mget key1 key2 key3
:一次取多个值msetnx key1 v1 key2 v2 key3 v3
: 如果插入的key不存在才插入,只要有一个存在不插入
-
getset(先get再set)
getset key value:先取出先前的值,然后在原来的值覆盖
String 业务场景
Redis String 类型的业务场景可太多了,比如电商网站中,用来存储热点商品信息,用户信息,等都可以用String类型来存储,如:
key:user:4 值:{"@class":"com.fyj.entity.Student","id":4,"name":"方亚军","age":22}
代表用户id为4 学生信息存在redis
Redis列表(List)
介绍:
redis 的string类型是单key多value (value 可以重复)
底层是一个双向链表,可以往左右插入值
存储类型:
key ----> 双向链表
命令:
- lpush/rpush/lrange (链表头表示左,链表尾表示右)
lpush key v1 v2 v3...
: 往链表的左边(头)插入多个值rpush key v1 v2 v3...
:往链表的右边(尾)插入多个值lrange key startIndex endIndex
:取出链表对应范围的值,从头开始取(注意:如果endIndex=-1的话,表示取到链表的最后,)
- lpop/rpop
lpop lkey:从链表头取出链表元素(取一个少一个)
rpop lkey:从链表尾部取出链表元素(取一个少一个)
- lindex,按照索引下标获得元素
lindex lkey index
:取出对应下标的值
- llen 获取存储元素的个数
llen lkey
:对应链表的值的个数
- lrem lkey 删N个value
lrem lkey num(要删除的数量) value
:删除链表中num数量的value(当有多个相同的value时,我们可以删除多个vlaue)
如:lrem list02 2 3:表示从list02链表中删除2个数量的3
- ltrim key 开始index 结束index,截取指定范围的值后再赋值给key
ltrim lkey startInde endIndex
:从链表中截取指定范围的值,然后把该值有重新赋值给该链表(原来链表的值将会删除)
- rpoplpush 源列表 目的列表
rpoplpush 源列表 目的列表
:从源链表的尾部位置取出一个元素,然后把该元素从目标链表的头部插入,
- lset key index value
lset key index value
:修改链表对应索引的值
- linsert key before/after 值1 值2
linsert lkey before/after v1 v2:在v1值的 前面/后面 插入值v2
List业务场景
list类型的业务场景也有很多,我们要理解redis中 list类型特点,list可以存储多个数据(可以重复),那么如某个商品评论信息我们是不是可以放进list中呢,还如某个用户发表的文章也可以放进list中。还有类似微信公众号订阅消息也可以用list集合:
- 大V作者李永乐老师和CSDN发布了文章分别是 11 和 22
- 我关注了他们两个,只要他们发布了新文章,就会安装进我的List
lpush likearticle:user:id 11 22- 查看我的号订阅的全部文章,类似分页,下面0~10就是一次显示10条
lrange likearticle:user:id 0 9
Redis集合(Set)
介绍:
set类型是单key 多value (value 不许重复)
命令:
-
sadd/smembers/sismember
sadd skey v1 v2 v3
:往set集合里面添加数据,如果有重复值,只能插入一个smembers skey
:取出该集合的所有值sismember skey value
:判断value在该set中是否存在,0:不存在;1:存在
-
scard,获取集合里面的元素个数
scard skey: 获取集合里面的元素个数
-
srem key value 删除集合中元素
srem key value:删除对应集合指定的值
-
srandmember key 某个整数(随机出几个数)
srandmember skey num:从set集合中随机取出num数量的值
-
spop key 随机出栈
spop skey:随机从集合中弹出一个元素
-
smove key1 key2 在key1里某个值 作用是将key1里的某个值赋给key2
smove key1 key2 在key1里某个值 :
-
数学集合类(差集:sdiff, 交集:sinter, 并集:sunion)
sdiff skey01 skey02:求差集(即在skey01除去skey01和skey02的交集)
sinter skey02 skey02:交集,skey02和skey02都有的值
sunion skey01 skey02:并集,skey02和skey02值的合并
set 业务场景
set 和 list 类似,区别就是 list 可以存放重复的数据,而set存放的数据不能重复。根据set这种特性,一个典型的业务场景就是抽奖,还有许多场景如微信朋友圈点赞等。
活动抽奖
- 点击立即参与按钮,使用redis命令 sadd key 将用户添加到该奖品对应的用户集合中
- 显示已经有多少人参与了,上图23208人参加 可以使用命令SCARD key统计出多少人参与
- 抽奖(从set中任意选取N个中奖人)
命令: SRANDMEMBER key 2 随机抽奖2个人,元素不删除(中奖了还可以继续参加)
命令: SPOP key 3 随机抽奖3个人元素会删除(中奖了就不能参加了)
微信朋友圈点赞
- 新增点赞 ,使用命令sadd 往该朋友圈文章对应的点赞集合中添加元素(用户id)
- 取消点赞,使用命令srem 删除该朋友圈文章对应集合中元素(用户id)
- 展现所有点赞过的用户,命令SMEMBERS 取出集合中所有元素
微博好友关注社交关系(sdiff,sinter,sunion应用)
共同关注:我去到局座张召忠的微博,马上获得我和局座共同关注的人
我关注的人也关注他(大家爱好相同):我关注了华为余承东,余承东也关注了局座召忠,我和余总有共同的爱好
Redis哈希(Hash)
介绍:
Redis哈希(Hash):单key 单value,但是value是一个k,v键值对
命令:
-
hset/hget/hmset/hmget/hgetall/hdel(重要)
hset hkey k v
:插入一个键值对(k,v)hget hkey k1
:从hkey中的键值对中取出key 是k1 的值hmset hkey k1 v1 k2 v2...
:一次插入多个键值对hmget hkey k1 k2 k3...
:一次取出多个对应key的值hgetall hkey
:取出hkey 对应的所有的k,v键值对- hdel hkey k1:删除 k1键值对
-
hlen
hlen hkey :求出hkey对应的k,v键值对的个数
-
hexists
hexists hkey k
:在hkey的所有k,v键值对中是否存在键是k的键值对
-
hkeys/hvals
hkeys hkey
:获取hkey中所有键值对的 键
hvals hkey
:获取hkey中所有键值对的 值
-
hincrby/hincrbyfloat
hincrby hkey k num
:给 k 对应的值 自增 num的数 (v = v + num)hincrbyfloat hkey k float
: 给 k 对应的值 自增 float的小数数 (v = v + float)
-
hsetnx
hsetnx hkey k v
:往hkey 里面添加k,v键值对,当hkey 没有重复k就插入成功,否则就插入失败
hash 业务场景
hash有个典型业务场景,也是我以前实践用过,购物车可以使用redis的hash类型实现
新增商品 → hset shopcar:uid1024 334488 1
新增商品 → hset shopcar:uid1024 334477 1
增加商品数量 → hincrby shopcar:uid1024 334477 1
商品总数 → hlen shopcar:uid1024
全部选择 → hgetall shopcar:uid1024
Redis有序集合Zset(sorted set)
介绍:
Zset 在set基础上,加一个score值。
之前set是k1 v1 v2 v3,
现在zset是k1 score1 v1 score2 v2
命令:
-
zadd/zrange
zadd zkey score1 v1 score2 v2 score3 v3
:往set里面放数据,在每个数据的前面都有一个对应的 score(排名值)- zrange zkey startIndex endIndex:取出指定范围set里面的值,不带score
- zrange zkey startIndex endIndex withscore:取出指定范围set里面的值,带score
-
zrangebyscore key [(]开始score [(]结束score
zrangebyscore zkey [(]开始score [(]结束score
:表从对应的zkey集合中取出 指定范围score 的值 (([(]表示可选值 , ( :表示不包含))zrangebyscore zkey 开始score 结束score limit num1 num2
:表从对应的zkey集合中取出 指定范围score 的值,从开始下标步num1 开始,取出num2数量的值 (相当于分页)
-
zrem
zrem zkey v:删除zkey对应的value值,包括score
-
zcard,zcount ,zrank ,zscore
zcard zkey
:获取zkey对应集合的size大小zcount zkey startScore endScore
:统计zkey集合对应scoreq区间的size个数zrank zkey v
:获取v对应的下标zscore zkey v
:获取v对应的score
-
zrevrank
zrevrank zkey v:逆序获得v下标值 (最尾部开始,最尾部的下标为0)
-
zrevrange (倒序遍历)
zrevrange zkey startIndex endIndex:倒序遍历,与zrange相反
-
zrevrangebyscore zkey 结束score 开始score
zrevrangebyscore zkey 结束score 开始score:从集合尾部的score开始往前面score 结束,返回对应的值
zset 业务场景
zset 和 set 的典型区别就是 zset 每个元素都有对应的分数,我们可以根据此分数可以定义许多业务场景,我们可以把分数看成是商品的销量,或者是文章的阅读量,或者xxx的点击量等等,然后就可以根据这些分数来进行排序展示。
场景一:根据商品销量对商品进行排序显示
思路:定义商品销售排行榜(sorted set集合),key为goods:sellsort,分数为商品销售数量。
场景二:抖音热搜
我们可以把搜索量看成是zset看成分数,对应值存热搜文章或者视频看成是值