redis的基本基本使用
redis-benchmark
redis-benchmark是一个redis自带的压力测试工具,我们可以通过命令行进行调用
参数如下图
输入一行指令进行的测试时:
# 测试一:100个并发连接数 -c 100 100000万个请求 -n 100000
redis-benchmark -h localhost -p 6379 -c 100 -n 100000
====== SET ======
100000 requests completed in 1.64 seconds 指令1.64秒准备完成
100 parallel clients #100个并行客户端
3 bytes payload # 每次输入3个byte的数据
keep alive: 1 # 或者
33.33% <= 1 milliseconds #一秒输入33.33%
99.80% <= 2 milliseconds #第二秒秒输入99.80%
99.88% <= 3 milliseconds #由于笔者的阿里云是1核1G此时写入的数据(下面为宝塔监视面板测试时候的cpu状态)
99.90% <= 10 milliseconds
99.95% <= 11 milliseconds
100.00% <= 11 milliseconds
61087.36 requests per second #一秒61087.36次
redis指令
五大数据类型
1.key-value(String)
可以看成是map<String, String>的样子
通过set&get对数据进行操作
#设置kv
set key value
expire key 10
#获得key的值
get key
#查看过期时间
ttl key
# 查看所有的key
keys *
String类型的理解可以结合java中String类的方法
# 判断有没有key
exits
# 没有值相当于set 有值是追加
append
#长度
strlen
#自增1
incr key
#自增 2
incrby key 2
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NkHehtr4-1589856622254)(images\1589447361585.png)]
# 获取第0到2位置的字符串
getrang key 0 2
#从0位开始写入value 替代
setrang key 0 value
# key设置过期时间为5秒
setex key 5 value
# 如果没有就设置 如果成功返回1 失败返回0(可以作为分布式锁)
setnx key value
# 批量设置 (注意这里的mset是用原子性操作,即失败以后会回滚)
mset k1 v1 k2 v2
# 批量获得
mget k1 k2
# 先获得旧值 再将新数据设置进去
getset key value
2.列表List
可以看成是map<String,List>的样子
list的基本操作
list可以从两边放,从两边取。即可以作为栈接口,也可以作为队列结构。
基本操作
#lpush key value 从左边给key放入value值
#rpush key value 从右边给key放入value值
#lpop key 从左边取出第一个值
#rpop key 从右边取出第一个值
#通过不同的放入和取出可以实现栈和队列的数据结构
lpush key one
lpush key two
rpush key three
这时候list里面的结构是这样的
#通过rpop和lpop记性出栈
#我们可以通过lrange查看
#key为要查的名称 0位其实位置 -1 为最后一位
lrange key 0 -1
#结果是
"two"
"one"
"three"
#如果要看指定长度
#起始为0 最终为1
lrange key 0 1
"two"
"one"
#注意这里没有rrange
-----------------------------------------------------------------------------
# 通过lindex获得某个元素 注意这里是不会移除元素的
127.0.0.1:6379> lindex key 2
"three"
127.0.0.1:6379> lindex key 1
"one"
#获得下标为1 的元素,通过上面的图我们知道是one
lindex key -1 # 获的最右边的元素
#注意这里没有rindex
-----------------------------------------------------------------------------
# 通过llen获得key对应list的长度
llen key
(integer) 3
-----------------------------------------------------------------------------
#我们通过lrem来移除元素
127.0.0.1:6379> lpush k two one three four five
(integer) 5
127.0.0.1:6379> lpush k one one two two
(integer) 9
#我们生成了3个one
127.0.0.1:6379> lrange k 0 -1
1) "two"
2) "two"
3) "one"
4) "one"
5) "five"
6) "four"
7) "three"
8) "one"
9) "two"
127.0.0.1:6379> lrem k 2 one
# 我们移除2个one
(integer) 2
127.0.0.1:6379> lrange k 0 -1
1) "two"
2) "two"
3) "five"
4) "four"
5) "three"
6) "one"
7) "two"
#就剩最靠右的one没有被移除
-----------------------------------------------------------------------------
#ltrim 移除k中的指定的元素
1) "two"
2) "two"
3) "five"
4) "four"
5) "three"
6) "one"
7) "two"
127.0.0.1:6379> rrem 1 two
(error) ERR unknown command 'rrem'
127.0.0.1:6379> ltrim k 0 2 #ltrim 移除k中的0 1 2元素
OK
127.0.0.1:6379> lrange k 0 -1
1) "two"
2) "two"
3) "five"
127.0.0.1:6379>
-----------------------------------------------------------------------------
# 修改指定位置的值 通过lset
127.0.0.1:6379> lset key 1 ubw
OK
127.0.0.1:6379> lrange key 0 -1 #把one 改成了ubw
1) "two"
2) "ubw"
3) "three"
-----------------------------------------------------------------------------
# 插入值 (linsert)
127.0.0.1:6379> linsert key before ubw four # 在ubw的前面插入four
(integer) 4
127.0.0.1:6379> lrange key 0 -1
1) "two"
2) "four"
3) "ubw"
4) "three"
127.0.0.1:6379> linsert key after ubw five # 在ubw的前面插入five
(integer) 5
127.0.0.1:6379> lrange key 0 -1
1) "two"
2) "four"
3) "ubw"
4) "five"
5) "three"
list说白了是一个可以diy的结构,我们可以通过进队列和出队列不同的方式来实现栈和队列不同用法。
其余的操作就和java中的list一样。对比着java的list。
特点:两端操作方便,中间操作比较慢。
3.集合Set
set可以看成是map<String, set>
它与list的最大的区别是能不能重复,即能不能有重复的value
# set 通过add 方法进行添加
127.0.0.1:6379> sadd key one two one two three #这里插入one two three都是重复的
(integer) 3 #结果只有3条结果
#通过smembers查看set集合
127.0.0.1:6379> smembers key
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> sadd key five
(integer) 1
127.0.0.1:6379> smembers key #我们发现,sadd插入是从左边插入集合的
1) "five"
2) "three"
3) "two"
4) "one"
-----------------------------------------------------------------------------
#通过srem进行元素的移除操作
1) "five"
2) "three"
3) "two"
4) "one"
127.0.0.1:6379> srem key five
(integer) 1
127.0.0.1:6379> serm key five
(error) ERR unknown command 'serm'
#没有five元素的 报错
-----------------------------------------------------------------------------
# 获得而不移除元素 srandmember (放回抽奖)
127.0.0.1:6379> srandmember key 2 #随机取两个元素
1) "two"
2) "one"
127.0.0.1:6379> srandmember key 2
1) "two"
2) "three"
127.0.0.1:6379> smembers key # 元素没有减少
1) "three"
2) "two"
3) "one"
-----------------------------------------------------------------------------
# 通过 sismember 进行元素有无的判断
127.0.0.1:6379> sismember key four #如果元素不存在就返回0
(integer) 0
127.0.0.1:6379> sismember key one #如果元素存在就返回1
(integer) 1
-----------------------------------------------------------------------------
# 通过scard查看 key下面set集合有多少元素
127.0.0.1:6379> scard key
(integer) 4
-----------------------------------------------------------------------------
# 数字集合
# - 差集 sdiff
# - 交集 sinter
# - 并集 sunion
127.0.0.1:6379> sadd k1 a b c d
(integer) 4
127.0.0.1:6379> sadd k2 c d e f
(integer) 4
127.0.0.1:6379> sdiff k1 k2 # 以k1 为标准 看看那些元素没有在其他集合出现过(特有元素)
1) "a"
2) "b"
127.0.0.1:6379> sdiff k2 k1 # 以k2 为标准 看看那些元素没有在其他集合出现过
1) "e"
2) "f"
127.0.0.1:6379> sinter k1 k2 # k1 k2 的交集
1) "d"
2) "c"
127.0.0.1:6379> sunion k1 k2 # k1 k2 的并集
1) "a"
2) "e"
3) "f"
4) "d"
5) "c"
6) "b"
-----------------------------------------------------------------------------
# 通过spop随机移除一个key中的元素(不放回抽奖)
127.0.0.1:6379> spop k1
"a"
127.0.0.1:6379> spop k1
"c"
127.0.0.1:6379> spop k1
"b"
127.0.0.1:6379> spop k1
"d"
127.0.0.1:6379> spop k1
(nil)
4.哈希Hash
value可以看成又是一个k-v键值对。
map<String, map<String, String>>如下图:
# 通过hset设置值 hset key 内部的key value
127.0.0.1:6379> hset key a 1
(integer) 1
127.0.0.1:6379> hset key b 2
(integer) 1
127.0.0.1:6379> hset key c 3
(integer) 1
#获得key下 a对应的值
127.0.0.1:6379> hget key a
"1"
127.0.0.1:6379> hget key b
"2"
#hset也可以修改值
127.0.0.1:6379> hset key a 2
(integer) 0 #注意这里是0
-----------------------------------------------------------------------------
# 通过hkeys可以获得所有的key值
127.0.0.1:6379> hkeys key
1) "a"
2) "b"
3) "c"
# 获得所有的键值对
127.0.0.1:6379> hgetall key
1) "a"
2) "2"
3) "b"
4) "2"
5) "c"
6) "3"
-----------------------------------------------------------------------------
#自动增加 hincrby key key2 步长
127.0.0.1:6379> hincrby key a 2
(integer) 4
127.0.0.1:6379> hincrby key a 2
(integer) 6
127.0.0.1:6379> hget key a
"6"
-----------------------------------------------------------------------------
# hsetnx 如果有就不变化 返回0原数不改变 如果没有就创建就返回1
127.0.0.1:6379> hsetnx key a 2
(integer) 0
127.0.0.1:6379> hget key a
"6"
127.0.0.1:6379> hsetnx key d 4
(integer) 1
127.0.0.1:6379> hget key d
"4"
5.有序集合Zset
和set相比,zset是有序的
#对比set ---> 添加用的是add
#set集合用
sadd key value [value1, value2...] #set集合可以实现一个key多个value
#zset
zadd key score member #zset增加了一个score分数
127.0.0.1:6379> zadd key 2 a
(integer) 1
127.0.0.1:6379> zadd key 1 b
(integer) 1
127.0.0.1:6379> zadd key 4 c
(integer) 1
-----------------------------------------------------------------------------
# 通过zrange key 开始位置 结束位置 取出
127.0.0.1:6379> zrange key 0 -1
1) "b"
2) "a"
3) "c"
#目前存储的方式如下
# 排序 用ZRANGEBYSCORE key 最小的score 最大的score 其中-INF为无求小
# 里面可以通过给score加添加进行筛选
127.0.0.1:6379> ZRANGEBYSCORE key -inf +inf
1) "b"
2) "a"
3) "c"
#如果要看score 可以添加withscores
#如果要倒排序用zrevrange。。。
127.0.0.1:6379> ZREVRANge key 0 -1
1) "c"
2) "a"
3) "b"
-----------------------------------------------------------------------------
#通过zcard 查看key中有多少元素
127.0.0.1:6379> zcard key
(integer) 3
#通过zcount 查看对应score在一定范围内的条件
127.0.0.1:6379> zcount key 0 2
(integer) 2
-----------------------------------------------------------------------------
#zpopmin和zpopmax是取出最小和最大值
127.0.0.1:6379> ZPOPMIN key 1
1) "b"
2) "1"
127.0.0.1:6379> ZPOPMAX key 1
1) "c"
2) "4"
127.0.0.1:6379> zrange key 0 -1
1) "a"