Nivelle 开拓视野冲破艰险看见世界 身临其境贴近彼此感受生活

redis实战

2018-09-29

String

  • 设置值
set {key} {value} < ex seconds> < px milliseconds> < nx|xx>
key:键的名字
value:值
ex seconds:设置秒级的过期时间
px milliseconds:设置毫秒级的过期时间
nx:当键不存在时,这条命令生效
xx:当键存在时,这条命令生效

> set stringk1 v1
OK

  • 获取值
> get stringk1
"v1"

> get stringk2
(nil)

  • 批量设置值
mset {key} {value} [key value....]

> mset stringk2 v2 stringk3 v3
OK
> get stringk3
"v3"

  • 批量获取值
> mget stringk1 stringk2 stringk3
1) "v1"
2) "v2"
3) "v3"

  • 计数

这条命令是对键做自增操作。有三种情况:

  1. 值不是整数,操作失败
  2. 值是整数,返回自增后的结果(比如以前是2,返回3)
  3. 键不存在,会设置一条数据为0,键名是参数key的数据,并返回结果。

decr {key} 自减
incrby {key} {increment} 自增指定的数字
decrby {key} {decrement} 自减指定的数字
incrbyfloat {key} {increment} 自增指字的浮点数

> incrby stringk5 10
(integer) 18
> get stringk5
"18"

适合场景:
  1. 缓存.保存查询结果
  2. 计数. redis内部对int做了优化,在做加减时开销相对较小。
  3. 共享数据: 用作分布式架构信息在多个节点间的共享
  4. 限速:当短信验证码计时这类需求时,用redis也非常好。前面设置值时有个过期时间,当查询不到键时,不就可以又发送短信了么?

Hash

  • 设置值
hset {key} {field} {value}

key:键名

field:哈希结构中的键名

value:哈希结构中的键名对应的值

> hset hash1 nivelle fu
(integer) 1

// 如果键名和hash结构的键名都相同,会覆盖原来的值,而键名可以重复
 
> hset hash1 nivelle jiang

(integer) 0

> hget hash1 nivelle

"jiang"

  • 获取值
> hget hash1 nivelle

"fu"

  • 批量获取值
> hmget hash1 nivelle jessy

1) "fu"

2) "jiang"

  • 统计field个数
> hlen hash1

2

  • 判断field是否存在

hexists {key} {field} 这里判断的是哈希中存不存在,而不是判断这一整条哈希数据存在。如果要判断这一整条数据是否存在,用exists

> hexists hash1 nivelle

(integer) 1

> exists hash1

(integer) 1

  • 遍历hash结构
> hkeys hash1

1) "nivelle"

2) "jessy"

> hvals hash1

1) "fu"

2) "jiang"

> hgetall hash1

1) "nivelle"

2) "fu"

3) "jessy"

4) "jiang"

适合场景:
  1. 存对象信息

List

  • 添加操作
> rpush list1 1 2 3

(integer) 3

> lpush list1 a b c

(integer) 6

  • 查找

lrange {key} {start} {end} 获取范围内的元素 ,-1 指的是末尾

> lrange list1 2 3

1) "a"

2) "1"

lindex {key} {index} 获取指定下标的元素


> lindex list1 2

"a"

  • 删除

从列表左侧删除一个

lpop {key}

从列表右侧删除一个

rpop {key}

删除指定的元素

lrem {key} {count} {value}

这条命令会删除列表里值为value的数据,同时删除count个

count>0 从左向右删count个

count<0 从右向左删count个

count=0 删除所有等于value的

> lrem list1 1 a

(integer) 1

> lrange list1 0 -1

1) "c"

2) "b"

3) "1"

4) "2"

5) "3"

按照索引范围修剪元素

ltrim {key} {start} {end}

这条命令只会保留这个范围内的元素,包括开头和结尾的数据。

> ltrim list1 1 3
OK

> lrange list1 0 -1
1) "b"
2) "1"
3) "2"

  • 阻塞

blpop key < key…> timeout

brpop key < key…> timeout

这两个命令是弹出明亮的阻塞式版本。这个阻塞的意思就是一直等待 直到获取到数据。 timeout是阻塞的时间,0代表一直阻塞,直到可以弹出

  1. 在阻塞的时间内,如果有数据进来,或是方向上(命令分左右的)有数据可以马上弹出,会马上返回新添加的数据。

  2. 如果有阻塞多个键,那么redis会从左向右遍历键,只要有一个可以键中有数据可以弹出,会马上返回弹出的键的名字和数据。

  3. 如果多个客户端对同一个键执行阻塞式弹出操作,第一命令的到达者会最先获取到数据。这时,客户端的发出+网络延迟会导致谁先到达。

适合场景:
  1. 消息队列
  2. 分页:当需要分页时,因列表是有序的,就可以利用按范围获取元素来取得数据。
  3. 栈,队列,有限集合,消息队列

set

  • 设置值
> sadd setkey1 1 1 2

(integer) 2

> smembers setkey1

1) "1"

2) "2"

  • 获取值
smembers {key}

和前面列表不一样,因为没有顺序,不能直接获取某一个数据,只能随机获取。要不就是获取集合中所有数据 
此命令是比较重的,和lrange(遍历列表) hgetall(遍历哈希表)一样,都不建议在线上环境中使用。

  • 删除值
srem {key} {element} [element....]
此命令会先判断元素是不是在集合中,是的话会删除。结果是返回删除的个数。。如果不在集合中会返回0。。也就是说,返回0此命令没什么产生什么效果。

  • 计算元素个数是否在集合
scard {key} 和前面讲到的一样,此命令不会去遍历,会直接取内部值。时间复杂度是O(1);

sismember {key} {element}  

  • 随机弹出元素
spop {key} {count} //count参数从redis3.2版本起才支持,windows版最新版也支持了

  • 随机从集合中返回指定个数元素
srandmember {key} {count} 

> sadd setkey1 1 2 3 4 5 a b c d e

(integer) 10

> srandmember setkey1 2

1) "1"

2) "e"

  • 集合运算
sinter {key} [key...] ## 交集
suinon {key} [key...] ## 并集
sdiff {key} [key...] ## 差集

适合场景:
  1. 标签
  2. 抽奖

zset

  • 设置值
zadd {key} {score} {member} [score member...]
第一个参数是键名
第二个参数是分数
第三个参数是值

> zadd zsetkey1 1 1 2 2 3 3 4 4 5 a 6 b 7 c 8 d
(integer) 8

> zincrby zsetkey1 10 1
11.0

  • 增加分数

zincrby {key} {increment} {member}

key:键名

increment:要增加的分数

member:成员

> zincrby zsetkey1 10 1
11.0

  • 按分数排序
> zrange zsetkey1 0 4
1) "2"
2) "3"
3) "4"
4) "a"
5) "b"
> zrevrange zsetkey1 0 4
1) "1"
2) "d"
3) "c"
4) "b"
5) "a"
> zrange zsetkey1 0 4 withscores
1) "2"
2) 2.0
3) "3"
4) 3.0
5) "4"
6) 4.0
7) "a"
8) 5.0
9) "b"
10) 6.0

  • 计算成员个数
zcard {key} 

> zcard zsetkey1
8

  • 计算分数范围成员个数
zcount {key} {min} {max}

> zcount zsetkey1 1 5
4
  • 计算某个成员的分数
zscore {key} {member}

> zscore zsetkey1 1
11.0
  • 计算某个成员的排名
zrank {key} {member}//按分数从低到高

> zrank zsetkey1 2
0
> zrank zsetkey1 4
2

zreverank {key} {member}//按分数从高到低

适合场景:
  1. 用户赞
  2. 排名

上一篇 编程英语

下一篇 linux常用指令

评论