下载:https://redis.io/download,或通过下载工具下载,以Centos为例
wget -q http://download.redis.io/releases/redis-4.0.14.tar.gz
安装
[root@localhost ~]# tar -zxvf redis-4.0.14.tar.gz
...
[root@localhost redis-4.0.14]# make
...
如果make过程中出现:/bin/sh: cc: 未找到命令,说明未安装gcc,执行以下命令进行安装
yum install gcc-c++ -y
如果出现:zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录,执行以下命令
make MALLOC=libc
启动
[root@localhost src]# cd src
[root@localhost src]# ./redis-server ../redis.conf
22053:C 07 Sep 10:48:37.996 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
22053:C 07 Sep 10:48:37.996 # Redis version=4.0.14, bits=64, commit=00000000, modified=0, pid=22053, just started
22053:C 07 Sep 10:48:37.996 # Configuration loaded
22053:M 07 Sep 10:48:37.997 * Increased maximum number of open files to 10032 (it was originally set to 1024).
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 4.0.14 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 22053
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
...
数据类型、及常用命令
String:redis中最基本的类型,实际上可以包含任何数据,除string串外,还可以存储图片或序列化后的对象等,最大存储数据量为512M。常用命令如get、set、del、incr/incrby、decr/decrby、append、getrange(相当于substring)、setnx(不存在则创建)等等
127.0.0.1:6379> set num 1 ex 100
OK
127.0.0.1:6379> incrby num 10
(integer) 11
127.0.0.1:6379> append num 20
(integer) 4
127.0.0.1:6379> get num
"1120"
127.0.0.1:6379> getrange num 0 2
"112"
127.0.0.1:6379>
List:相当于Java中的LinkedList,支持将数据添加到列表头部<左边>或尾部<右边>,可存元素个数为2的32次方-1。常用命令令有lpush/rpush、lpop/rpop、lrang、lindex、llen、ltrim(相当于Java中的subList),前缀L代表从左往右,R代表从右往左。此外还支持blpop/brpop方式,在列表为空时,通过阻塞等待的方式,从列表中弹出最左/最右数据。
值得注意的是,当用rpush添加多个值时,会依次按顺序将每个参数放到最右边,所以最终结果顺序就是参数的顺序。而lpush则刚好相反,会依次按顺序将每个参数放到最左边,所以最后的一个参数在最前面,与参数顺序是相反的。如下
127.0.0.1:6379> rpush bklist item01 item02
(integer) 2
127.0.0.1:6379> lrange bklist 0 10
1) "item01"
2) "item02"
127.0.0.1:6379> lpush bklist item03 item04
(integer) 4
127.0.0.1:6379> lrange bklist 0 10
1) "item04"
2) "item03"
3) "item01"
4) "item02"
127.0.0.1:6379> lpop bklist
"item04"
127.0.0.1:6379> rpop bklist
"item02"
127.0.0.1:6379> lindex bklist 0
"item03"
127.0.0.1:6379>
Hash:基于key-value对的集合,相当于Java里面的Map,所以它非常方便用来存储对象。常用命令有hset/hmset、hget/hmget/hgetall、hdel、hlen、hexists、hkeys、hvals、hincrby等等。如下
127.0.0.1:6379> hmset nodeInfo01 cpuCount 8 currentTask 100
OK
127.0.0.1:6379> hmget nodeInfo01 cpuCount currentTask
1) "8"
2) "100"
127.0.0.1:6379> hgetall nodeInfo01
1) "cpuCount"
2) "8"
3) "currentTask"
4) "100"
127.0.0.1:6379> hvals nodeInfo01
1) "8"
2) "100"
127.0.0.1:6379> hincrby nodeInfo01 currentTask 1
(integer) 101
127.0.0.1:6379> hvals nodeInfo01
1) "8"
2) "101"
127.0.0.1:6379> hdel nodeInfo01 cpuCount currentTask
(integer) 2
127.0.0.1:6379>
Set:相当于Java中的HashSet,一个无序且去重的集合,底层为Hash表结构。所以它CRUD的复杂度都是O(1)。常用命令有sadd添加元素,成功返回1,否则返回0;srem移除元素;scard返回数量;sismember检查给定元素是否存在;smembers用来获取集合列表,随着元素的增多,该命令会相应的变慢; spop从集合中随机删除一个元素并返回;smove srckey destey itemxx 将源集合中某个元素移到目标集合中(是移除);
127.0.0.1:6379> sadd setkey set01 set02 set03
(integer) 3
127.0.0.1:6379> sismember setkey set04
(integer) 0
127.0.0.1:6379> sismember setkey set01
(integer) 1
127.0.0.1:6379> smembers setkey
1) "set03"
2) "set01"
3) "set02"
127.0.0.1:6379> srem setkey set01
(integer) 1
127.0.0.1:6379>
Zset:和set一样不允许重复,但有序。实现原理是通过给每个元素指定一个分数score,将元素按分数进行从小到大的排序来达到效果,元素虽然不能重复,但分数是可以重复的。命令主要有zadd、zrange、zcard、zincrby(添加分数)、zscore(获取分值)、zrank(获取排名)、zrangebyscore、zcount(min,max)返回该分值范围内的元素个数、zrem、zrevrank(反转,按从大到小排序返回元素排名)等等。zrangebyscore用来获取在给定分值范围内的元素。
127.0.0.1:6379> zadd top3 100 item01 80 item02 60 item03
(integer) 3
127.0.0.1:6379> zrange top3 0 10
1) "item03"
2) "item02"
3) "item01"
127.0.0.1:6379> zrangebyscore top3 0 80
1) "item03"
2) "item02"
127.0.0.1:6379> zscore top3 item01
"100"
127.0.0.1:6379> zrank top3 item01
(integer) 2
127.0.0.1:6379> zcount top3 0 80
(integer) 2
127.0.0.1:6379> zincrby top3 11 item01
"111"
127.0.0.1:6379> zscore top3 item01
"111"
事务命令
redis事务从开始到执行会经历以下三个阶段:
- 开始事务:客户端执行multi命令
- 命令入队:redis接收到客户端的multi命令后,会将这个客户端后续的所有命令放到一个队列里面,直到接收到提交或取消命令。Watch 命令用于监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断
- 提交/消息事务:客户端发送exec或discard命令
值得注意的是,与关系型数据库不一样,虽然单个Redis命令的执行是原子性的,但Redis没有在事务上保证原子性,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做,所以Redis事务的执行并不是原子性的。而在关系型数据库的事务中会对被访问的数据进行加锁,直到事务被提交或回滚为止,在此期间如果其它客户端试图修改被加锁的数据,会被阻塞。
不过在Redis中,客户端可以通过Watch监视了一个(或多个) key,如果在事务提交前这些key被其客户端进行了修改,那么执行了watch的客户端就会收到通知,该客户端事务的提交也不会成功,说到底其实watch就是一种乐观锁的机制。
如下,在事务中的第二条指令出错,并不会导致第一条回滚,也不会导致第三方不执行。
127.0.0.1:6379> set ka abc
OK
127.0.0.1:6379> watch ka
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set hh hh
QUEUED
127.0.0.1:6379> incr ka
QUEUED
127.0.0.1:6379> set ff ff
QUEUED
127.0.0.1:6379> exec
1) OK
2) (error) ERR value is not an integer or out of range
3) OK
127.0.0.1:6379> unwatch
OK
127.0.0.1:6379> get hh
"hh"
127.0.0.1:6379> get ff
"ff"
127.0.0.1:6379>
其它命令
设置过期时间:expire key-name seconds
查看过期时间: ttl key-name
移除过期时间:persist key-name