缓存之Redis(一)

目录
  1. String类型
  2. Hash(哈希表)
  3. LIST类型
  4. SET(集合)#
  5. ZSET(有序的集合)
  6. 事务

  • 摄于淇澳岛~

这是redis序列文章的第一篇,这个序列估计写两到三篇文章吧,主要是总结一下redis的基础操作,redis一些高级特性,redis集群,以及同其他缓存组件memcache的对比。

第一篇主要写redis一些基本的数据结构以及对应的操作。

String类型

String类型是典型的key-val形式,主要操作命令有GET SET STRLEN MGET MSET INCR INCRBY

1
GET name # 取name里面的值
1
SET name 'cxt' # 设置name的value值为cxt
1
STRLEN name # 返回key里面val的长度
1
MGET name age# 取多个key的val
1
MSET name 'cxt' age '24' # 设置多对key-val
1
MSET name 'cxt' age '24' # 设置多对key-val
1
INCR age # 当val是数字时可用,如果不是数字就会报错
1
INCRBY age 9 # 加上后面的数,可以是正数或者负数

Hash(哈希表)

哈希表结构为# key field1 val1 field2 val2 ... 常见的操作有# HSET HGET HGETALL

1
HSET cxt age  24 # 设置一个哈希表,命名为cxt,一个field为age,对应的val为24
1
HGET cxt age # 取哈希表cxt的field的值
1
HGETALL cxt # 取哈希表cxt的所有field的值

LIST类型

双向链表,主要的操作有LRANGE LPUSH LPOP RPUSH RPOP LREM

1
LRANGE key 0 -1 # 查询0到-1的所有元素,-1代表最后那个
1
LPUSH key val [val ...]#正向压入元素,val可以多个并且可以重复
1
LPOP key # 弹出第一个元素
1
RPUSH key val [val ...]#从尾部压入元素,val可以多个并且可以重复
1
RPOP key # 弹出最后一个元素
1
2
3
4
LREM key count val
#count > 0 从表头搜索,移除与val一样的元素(移除数量等于count);
#count < 0 从表尾开始搜索,移除与val一样的元素(移除数量等于count的绝对值);
#count = 0,移除所有和val一样的元素

SET(集合)#

SET集合,元素不能够重复,主要操作有:SMEMBERS SADD SCARD SREM SPOP

1
SMEMBERS key # 查询集合key里面的所有元素
1
SADD key val [val...] # 增加集合里面的元素,一次可以增加多条
1
SCARD key # 返回集合里面元素的个数
1
SREM key val # 去掉集合里面和val一样的的元素,有该元素返回1,没有该元素返回0
1
SPOP key # 随机移除并返回该元素

ZSET(有序的集合)

ZSET是有序的,数据结构为key member1 score1 member2 score2 ...排序的规则主要和score的值大小有关,小的在前面,大的排在后面,score可以接受负数,浮点数。

主要的操作有ZADD ZRANGE ZREM ZCARD

1
ZADD key score1 member1 score2 member2 ... # 向ZSET添加元素,一次可以添加一个或者多个元素
1
ZRANGE key 0 -1 WITHSCORES # 查询范围内的元素,WITHSCORES表示是否同事列出元素对应的分值
1
ZREM key member1 member2 ... # 移除集合里面的元素
1
ZCARD key # 查询集合里面元素的个数

事务

redis是支持事务操作的,下面结合一个例子说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
127.0.0.1:6379> SET userid 0
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> INCR userid
QUEUED
127.0.0.1:6379> INCR userid
QUEUED
127.0.0.1:6379> INCR userid
QUEUED
127.0.0.1:6379> ping
QUEUED
127.0.0.1:6379> DISCARD
OK
127.0.0.1:6379> GET userid
"0"

该例子主要先设置一个key-val为userid-0,MULTI是开始事务的标志,然后执行三个INCR自增的操作,接着向服务器发现一个PING,这四个操作都在排队,然后执行DISCARD终止了事务的执行,通过GET userid我们可以看到userid没有变化,还是0。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
127.0.0.1:6379> GET userid
"0"
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> INCR userid
QUEUED
127.0.0.1:6379> INCR userid
QUEUED
127.0.0.1:6379> PING
QUEUED
127.0.0.1:6379> EXEC
1) (integer) 1
2) (integer) 2
3) PONG
127.0.0.1:6379> GET userid
"2"

这个case前面几个命令都一样,不过第11行是EXEC也就是执行了事务,我们可以看到GET userid的结果为2。 WATCH命令,用法WATCH key监视某一个key,当执行事务时,有其他操作改动了key,事务会失效。

1
2
3
4
5
6
7
8
9
10
11
12
127.0.0.1:6379> GET userid 
"0"
127.0.0.1:6379> WATCH userid
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> INCR userid
QUEUED
127.0.0.1:6379> INCR userid
QUEUED
127.0.0.1:6379> ping
QUEUED

然后在另一个命令行执行下面的操作:

1
2
127.0.0.1:6379> INCR userid
(integer) 1

回到前面的命令行执行事务,我们可以发现事务执行失败!

1
2
3
4
127.0.0.1:6379> EXEC
(nil)
127.0.0.1:6379> GET userid
"1"

UNWATCH命令,用法直接执行UNWATCH即可,就放弃对监视的key的监视。 上面就简单介绍了redis的基础操作,我们还可以借助客户端Redis Desktop Manager进行学习,图形化的更加直观。 完~