一、Redis的基础操作
1. keys 查看key
查看当前库所有key
keys *
2. exists 存在key
判断某个key是否存在: exists <key>
-- 查看k1是否存在
exists k1
3. type key类型
-- 查看key是什么类型: type <key>
-- 查看k1的类型
type k1
4. del 删除key
-- 删除指定的key数据,可填写多个key: del <key1> <key2>...
-- 删除k1
del k1
5. expire 设置时间
-- 为给定的key设置过期时间,单位秒: expire <key> <过期时间>
-- 设置k4的过期时间为10秒
expire k4 10
6. ttl 查看剩余时间
-- 查看还有多少秒过期,-1表示永不过期,-2表示已过期,过期即删除: ttl <key>
-- 查看k4还有多少秒过期
ttl k4
7. Dbsize key数量
-- 查看当前数据库的key的数量
Dbsize
8. flush 清空
-- *******慎用*******
-- 清空当前库
flushdb
-- 通杀全部库
flushall
-- *******慎用*******
9. select 切换数据库
-- 切换数据库 默认是0库: select <base>
-- 将数据库切换到1
select 1
-- 将数据库切换到0
select 0
10.set 设置值
设置值
Set k1 v1
11.mset 批量插入
mset k1 v1 k2 v2 k3 v3 k4 v4 k5 v5
12.unlink 查看成功删除的个数
unlink k2 k3
二、String 类型
Redis的key是String类型的,如果Value如果也是String类型,相当于把两个字符串映射起来,即key-value
存储字符串,整数,浮点数。
1. set 添加键值对,key已存在会覆盖value:
-- k1:v100
set k1 v100
2. get 获取k1的值
get k1
3. append 在k1的值后添加字符串abc
append k1 abc
4. strlen 查看k1的长度
strlen k1
5. setnx 不存在时,才可以设置key的值
-- 只有在key不存在时,才可以设置key的值: setnx <key> <value>
-- setnx 一个存在的key
setnx k1 v1
-- setnx 一个不存在的key
setnx k3 v300
6. incr decr value+-1
-- 将k4的值+1
incr k4
-- 将k4的值-1
decr k4
7. mset mget 批量设值,批量获取
同时设置一个或多个key-value键值对: mset <key1> <value1> <key2> <value2>...
-- 一次性set多个key k1:v1,k2:v2,k3:v3
mset k1 v1 k2 v2 k3 v3
批量获值
同时获取k1 k2 k3的值
mget k1 k2 k3
8. getrange 获取下标值
-- 获取下标0~3的值
getrange k10 3
-- 将字符串abc从下标3开始覆盖
setrange k1 3 abc
9.setex 添加age的同时设置过期时间
-- 添加age的同时设置过期时间为20秒
setex age 20 value30
10. ttl 查看剩余时间
ttl age
11.getset 设置值且获取值
-- 将name的值设置为jack并获取name的原值
getset name jack
-- 查看是否设置为新值
get name
三、列表
结构:双向链表 操作两头容易,通过索引操作麻烦,做队列使用,有序,值不唯一
应用场景
1. 由于项目中使用了大量的wcf,导致配置过多,维护和更新异常繁琐,基于这种情况,我们把wcf可以异步处理的所有请求都丢到了redis的List中去,这样下来之后,web站点的config配置清爽的不要不要的。
2. 还有一个业务就是我们做的淘宝订单催付,付款提醒,签收提醒,收货提醒 等等都是采用轮询List的方式,大大降低了代码复杂量。
1. lpush 从左依次插入一个或多个值
-- 从左边/右边插入一个或多个值: lpush/rpush <key> <value1> <value2> <value3>...
-- k1从左依次插入v1 v2 v3
lpush k1 v1 v2 v3
2. rpush 从右依次插入一个或多个值
-- k2从右依次插入v1 v2 v3
rpush k2 v1 v2 v3
3. lrange 根据下标查看
-- 按照索引下标获得元素(从左到右)0左边第一个,-1右边第一个,(0-1表示获取所有): lrange <key> <start> <stop>
lrange k2 0 2
lrange k2 0 -1
4. l/r pop 从左边/右边吐出一个值
-- 从左边/右边吐出一个值。值在键在,值光键亡: lpop/rpop <key>
-- 从k1的左边取出一个
lpop k1
-- 从k2的右边取出一个
rpop k2
-- 将k1和k2的值全部拿出 一直pop就行
rpop k1
rpop k1
rpop k2
rpop k2
-- 查看k1和k2是否存在,0:不存在
exists k1
exists k2
5. lindex 根据下标获取值
-- lindex <key> <index>按照索引下标获得元素(从左到右),下标从0开始
lindex k2 0
6. llen 获取列表长度
-- 获得列表长度: llen <key>
llen k2
7. linsert 指定插入
在指定的值的前面或者后面进行插入
-- 在<value>的前面/后面插入<newvalue>
: linsert <key> before/after <value> <newvalue>
linsert k2 before "v11" "newv11"
-- 查看
lrange k2 0 -1
linsert k2 after "v12" "newv11"
-- 查看
lrange k2 0 -1
8. lrem 删除
-- 删除n个<value>(从左到右): lrem <key> <n> <value>
-- 删除1个k2中的newv11
lrem k2 1 "newv11"
-- 查看
lrange k2 0 -1
9. lset 替换
-- 将列表key中下标为index的值替换成value: lset <key> <index> <value>
-- 将k2中下标1的值换为julong
lset k2 1 julong
-- 查看
lrange k2 0 -1-
四、集合
不能有重复,里面是无序的,值唯一
1. sadd 插入
-- 将一个或多个元素加入到集合key中,已经存在的元素将被忽略: sadd <key> <value1> <value2>
-- 将v1 v2 v3加入到k1集合中
sadd k1 v1 v2 v3
2. smembers 取出该集合的所有值
-- 取出该集合的所有值: smembers <key>
smembers k1
3. sismember 判断是否有值
-- 判断集合<key>是否为含有该<value>值: dismember <key> <value>
-- k1集合中是否存在v1
sismember k1 v1
4. scard 返回元素个数
-- 返回该集合的元素个数: scard <key>
-- 查看k1集合中元素的个数
scard k1
5. srem 删除value
-- 删除k1集合中的v1和v2
srem k1 v1 v2
6. spop 随机取元素
-- 随机取出k2集合中的一个元素
spop k2
7. srandmember 随机取n个值
-- 随机从该集合中取出n个值,不会从集合中删除: srandmember <key> <n>
-- 随机从k2集合中取出两个元素
srandmember k2 2
8. smove 移动到另一个集合
-- 把<source>集合中的一个元素移动到<destination>集合中: smove <source> <destination> <value>
-- 将v1 v2 v3加入到k3集合中,将v3 v4 v5加入到k4 集合中
sadd k3 v1 v2 v3
sadd k4 v3 v4 v5
-- 把k3集合中的v3移动到k4集合中
smove k3 k4 v3
-- 把k3集合中的v2移动到k4集合中
smove k3 k4 v2
-- 查看k3,v2和v3呗移走
smembers k3
-- 查看k4,v3不会重复
smembers k4
9. sadd 获取交集
-- 获取两个集合的交集元素: sinter <key1> <key2>
-- 将v1 v2 v3加入到k5集合中,将v3 v4 v5加入到k6 集合中
sadd k5 v1 v2 v3
sadd k6 v3 v4 v5
-- 获取k5和k6的交集元素
sinter k5 k6
10. sunion 获取并集
-- 获取两个集合的并集元素: sunion <key1> <key2>
-- 获取k5和k6的并集元素
sunion k5 k6
11. sdiff 获取差集
-- 获取两个集合的差集元素(key1中有,但key2没有的): sdiff <key1> <key2>
-- 获取k5和k6的差集元素
sdiff k5 k6
五、哈希
数组+链表 value是一个无序字典,field是域
常常用来插入对象,field 不能相同,value 可以相同
1. hset 添加元素
-- 添加<field> <value>键值对元素到<key>哈希表中: hset <key> <field> <value>
-- 添加id:1,name:zhangsan到user:1001集合中
hset user:1001 id 1
hset user:1001 name zhangsan
2.hget 获取元素
-- 从<key>集合取出<field>域的value值: hget <key> <field>
-- 获取user:1001的id和name
hget user:1001 id
hget user:1001 name
3. hkeys 获取域
-- 获取哈希表中所有的域field
-- 获取user:1001所有的域field
hkeys user:1001
4. hvals 获取域的value
-- 获取哈希表中所有域的value
-- 获取获取user:1001所有域的value
hvals user:1001
5. hgetall 获取域以及value
-- 获取<key>所有的<field>及其<value>: hgetall <key>
-- 获取user:1001的所有域及其value
hgetall user:1001
6. hmset 批量添加Redis4.0后被弃用,可直接使用hset
-- 批量添加<key>的<field><value>: hmset <key> <field1> <value1> <field2> <value2>...
-- 哈希表user:1002 添加 id:2,name:lisi,age:30
hmset user:1002 id 2 name lisi age 30
7. hgetall 查看
-- 查看user:1002
hgetall user:1002
8. hexists 判断存在
-- 查看哈希表key中,给定域field是否存在: hexists <key> <field>
-- 查看user:1002哈希表中,是否存在域id
hexists user:1002 id
-- 查看user:1002哈希表中,是否存在域address
hexists user:1002 address
9. hincrby 域减少
-- 为哈希表key中的域field的值加上增量<increment>(可以是负数) hincrby <key> <field> <increment>
-- 将哈希表user:1002中的age域增加2
hincrby user:1002 age 2
-- 将哈希表user:1002中的age域减少5
hincrby user:1002 age -5
10. hsetnx 域设置值
-- 将哈希表key中的域field的值设置为value,当且仅当域field不存在时还生效: hsetnx <key> <field> <value>
-- 将哈希表user:1002中的age域的值设置为40
hsetnx user:1002 age 40
-- 将哈希表user:1002中的gender域的值设置为10
hsetnx user:1002 gender 10
-- 查看哈希表user:1002
hgetall user:1002
六、有序集合
特点:
使用散列表和跳跃表实现,可以更改分数调整中间顺序,
用来实现排行榜,元素不允许重复。
有序集合的每个元素都会关联一个 double 类型的分数(score)。redis 通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数可重复。
1. zadd 添加元素
-- 将一个或多个元素及其score值加入到有序集合key当中:
zadd <key> <score1> <value1> <score2> <value2>…
例子:
-- 将200:java,300:c++,加入到topn集合中
zadd topn 200 java 300 c++
2. zrange 下标获得元素
-- 获取有序集合key中,下标在<start><stop>之间的元素,注:0 ,-1为全部获取
-- 命令:zrange <key> <start> <stop> [WITHSCORES]
-- 可选:[WITHSCORES]可将分数和值一起返回
例子:
-- 获取topn有序集合中的所有value
zrange topn 0 -1
-- 获取topn有序集合中的所有value及score
zrange topn 0 -1 withscores
3. zrangebyscore 按照范围返回
-- 返回有序集合key中,所有score值介于min和max之间(包括等于min或max)的成员。有序集成员按score值递增(从小到大)次序排列
-- 命令:zrangebyscore key min max [withscores] [limit offset count]
-- 可选:[WITHSCORES]可将分数和值一起返回
-- 可选:[limit offset count] 控制返回数据的位置及数量和mysql中的limit一致:limit 10,20 就是从第10个开始,返回20条数据
例子:
-- 获取topn有序集合中score值介于300和500之间的数据,按score从小到大排列
zrangebyscore topn 300 500
-- 获取topn有序集合中score值介于300和500之间的数据,按score从小到大排列,并显示scorec
zrangebyscore topn 300 500 withscores
-- 获取topn有序集合中score值介于300和500之间的数据,按score从小到大排列,并显示scorec,只显示第2、3条数据
zrangebyscore topn 300 500 withscores limit 1 2
4. zincrby 给对应的key的value增加分数
-- 将有序集合<key>中的给定<value>的score增加<increment>: zincrby <key> <increment> <value>
-- 将有序集合topn中的java分数加上50
zincrby topn 50 java
-- 将有序集合topn中的mysql分数减去20
zincrby topn -20 mysql
5. zrem 删除value
-- 删除有序集合<key>下,指定<value>的元素: zrem <key> <value>
-- 删除有序集合topn中的php
zrem topn php
-- 查看topn中的元素
zrange topn 0 -1 withscores
6. zcount 统计分数的个数
-- 统计有序集合<key>中,分数在[<min>,<max>]区间内的元素个数: zcount <key> <min> <max>
-- 统计有序集合topn中,分数在[200,300]区间内的元素个数
zcount topn 200 300
7. zrange 获得排名
-- 获取<value>在有序集合<key>中的排名,从0开始: zrank <key> <value>
-- 查看有序集合topn
zrange topn 0 -1 withscores
-- 获取java在有序集合topn中的排名
zrank topn java
-- 获取mysql在有序集合topn中的排名
zrank topn mysql