First2Redis

Redis – 基于内存的键值对数据库, 强大之处在于它的值可以是数据结构.

这里先说一说Redis的几种数据类型, 也就是:

  • 字符串( String )
  • 列表( List )
  • 哈希映射( Hashes )
  • 无序集合( Set )
  • 有序集合( Sorted Set )

String

字符串是Redis中最基本的值类型, 他是二进制安全的, 这意味着一个Redis字符串能包含任意类型的数据, 例如: 一张图片或者一个序列化的对象.最多支持存储512M字节的内容.

创建/修改和检索string, 使用SETGET, 如果key已存在, 那么SET将会覆盖原值.在SET后添加参数可以使得赋值操作仅仅在Key存在/不存在的情况下成功.

1
2
3
4
> set mykey somevalue
OK
> get mykey
"somevalue"

mykey已经存在的情况下在SET后添加参数( 有点像MySQLIF EXIST ):

1
2
3
4
5
6
> set mykey newval nx
(nil)
> set mykey newval xx
OK
> get mykey
"newval"

可见, nx表明仅在key不存在的时候进行赋值, xx正相反.

Redis支持一次赋多个值和返回多个值, 使用msetmget.( multi )

1
2
3
4
5
6
> mset a 10 b 20 c 30
OK
> mget a b c
1) "10"
2) "20"
3) "30"

尽管是String类型, 我们仍然可以尝试进行数学运算:

1
2
3
4
5
6
> set counter 100 
OK
> incr counter
(integer) 101
> incrby counter 50
(integer) 151

减法运算是: decrdecrby

如果字符串不能变成数字, Redis会抛出异常:

1
2
3
4
> set str "A"
OK
> incr str
(error) ERR value is not an integer or out of range.

Lists

Redis中的列表是一个双端字符串列表, 按照插入顺序排序.可以添加一个元素到列表的头部或者尾部, 当一个插入元素的操作执行在一个空的Key的时候,就会创建一个新的列表.

同样,删除列表就直接将Key删除就行了.

1
2
3
4
5
6
7
> rpush mylist 0
(integer) 1
> lpush mylist 1
(integer) 1
> lrange mylist 0 -1
1) "1"
2) "0"

rpush是将元素push到列表的最后, 而lpush相反, 是将元素push到列表的开头, 最后的lrange是将表中的元素列出, 后面的两个参数是分别表示开始索引和终止索引, 如果是负数n表示倒数第n个.

所以列出所有的元素的就是从开始到最后一个( lrange list 0 -1 )

每一次的push操作都可以将多个元素一次性的放入表中.

1
2
3
4
5
6
7
> rpush mylist 1 2 3 "foo"
(integer) 4
> lrange mylist 0 -1
1) "1"
2) "2"
3) "3"
4) "foo"

push就有pop, 与push一样, pop同样支持两端的pop.

1
2
3
4
5
6
7
8
9
10
11
12
> lrange mylist 0 -1
1) "1"
2) "2"
3) "3"
4) "foo"
> lpop mylist
"1"
> rpop mylist
"4"
> lrange mylist
1) "2"
2) "3"

Hashes

Redis Hashes是字符串字段和字符串值之间的映射,因此十分适合用来展现对象.

使用起来也十分简单, 同样是SETGET.

1
2
3
4
5
6
7
8
9
10
11
> hmset user:1000 username justin birth 1997 verified 1
OK
> hget user:1000 username
"justin"
> hgetall user:1000
1) "username"
2) "justin"
3) "birth"
4) "1997"
5) "verified"
6) "1"

如果是不存在的数据域, redis会返回nil.

1
2
3
4
> hmget user:1000 username birth no-such-field
1) "justin"
2) "1997"
3) (nil)

同样可以对hashes中的元素进行操作, 比如:

1
2
3
4
> hincrby user:1000 birth 10
(integer) 2007
> hincrby user:1000 birth -10
(integer) 1997

在Redis的Hashes中, 不知道为什么似乎没有hdecrby这样的指令.所以如果要进行减法运算, 就加上负值好了.

Set

Redis Set是一个无序的字符串集合. 你可以以O(1)的时间复杂度 (无论集合中有多少元素时间复杂度都是常量)完成添加,删除,以及测试元素是否存在的操作.

Redis Set 拥有不允许包含相同成员的属性, 多次添加相同的元素,最终在集合里只会有一个元素。

1
2
3
4
5
6
7
8
9
10
> sadd myset "1" "A" "Foo" "4" "-10"
(integer) 5
> sadd myset "A" "1"
(integer) 0
> smembers myset
1) "1"
2) "4"
3) "Foo"
4) "A"
5) "-10"

接下来看一下如何查看元素是否存在:

sismember用于查看集合是否存在,匹配项包括集合名和元素个数.

匹配成功返回1, 匹配失败返回0.

1
2
3
4
> sismember myset 3
(integer) 0
> sismember myset "Foo"
(integer) 1

Sorted Set

Sorted Set 和 Set非常相似,是一个没有重复元素的字符串集合. 不同之处是有序集合的每一个成员都关联了一个评分(score),这个评分被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复的.

使用有序集合可以以非常快的速度(O(log(N)))添加,删除和更新元素。因为元素有序, 所以也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素.

由于Sorted SetSet的首字母冲突了, 所以Redis中对于Sorted Set操作的指令都是以Z开头的

上面是我猜的 :)

zaddsadd类似,但是在元素之前多了一个参数,这个参数便是用于排序的. (为了形成一个有序的集合)

1
2
> zadd members 0 kali 1 ubuntu 2 debian
(integer) 3

查看集合有两种方式, ZRANGE是查看正序的集合,ZREVRANGE是查看反序的集合.

和上文所说的lrange一样: 0表示集合第一个元素,-1表示集合的倒数第一个元素。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
> zrange members 0 -1
1) "kali"
2) "ubuntu"
3) "debian"
> zrevrange members 0 -1
1) "debian"
2) "ubuntu"
3) "kali"
> zrange mmebers 0 -1 withscores
1) "kali"
2) "0"
3) "ubuntu"
4) "1"
5) "debian"
6) "2"

使用WITHSCORES参数会连带返回记录值。

接下来一起来看一下Redis的其他相关命令和系统管理操作.

EXISTS and DEL

见名知意啦~`EXISTS`用来判断一个Key是否存在, 存在就返回1, 不存在就返回0;

DEL用来删除一个键, 或者是一系列的键.返回非零表示删除成功.

非零是因为实际上DEL返回的是删除的条数.

1
2
3
4
5
6
7
8
> set mykey m
OK
> exists mykey
(integer) 1
> del mykey
(integer) 1
> exists mykey
(integer) 0

TYPE and KEYS

终于可以知道值的属性了!使用TYPE KEY来获得属性描述.

1
2
3
4
> set mykey "Foo"
OK
> type mykey
string

所有支持的类型都可能被返回, 包括: ( none, string, list, set, zset, hash ).

KEYS用来在Redis全局进行键的搜索, 使用keys pattern来进行检索.

1
2
3
4
5
6
7
> set student_name 'justin'
OK
> set student_grade 2
OK
> keys student_*
1) "student_name"
2) "student_grade"

RANDOMKEY and CLEAR

很迷的两个指令..我认为的.

CLEAR就相当于ctrl+l.清屏指令

至于RANDOMKEY, 我是没想明白用处在哪里.

RANDOMKEY随机返回一个键名, 如果数据库为空, 则返回空字符串.

比如:

1
2
3
4
5
6
7
8
9
10
11
12
> randomkey
(nil)
> set key1 100
OK
> set key2 200
OK
> set key3 300
OK
> randomkey
"key2"
> randomkey
"key1"

RENAME and RENAMENX

两个指令都是用来进行重命名的,区别在于:

  • RENAME 直接改名, 如果新的Key已经存在, 那么将会直接进行覆盖.

  • RENAMENX 在改名时, 如果新的Key已经存在, 则会报错并放弃更改.

所以更好用的应该是后面的一个.

1
2
3
4
5
6
> set key value
OK
> set newkey val
OK
> renamenx key newkey
(integer) 0

这样更安全对嘛?

: DBSIZE 这个指令返回当前Redis中所有键的数量.

1
2
3
4
> set key value
OK
> dbsize
(integer) 1

Redis中的时间

限定Key的存活时间

对于任何数据都可以实现, 这主要用于临时存储, 并避免大量的DEL操作.

指令是: expire

1
2
3
4
5
6
> set key somevalue
OK
> expire key 10
(integer) 1
> get key
"somevalue"

10s后再次执行:

1
2
> get key 
(nil)

查询key的存活时间

多亲切的指令, 查询key存活时间的指令是: TTL – ( time to live )

1
2
3
4
5
6
> set key 100 ex 30
OK
> ttl key
(integer) 28
> ttl key
(integer) 26

清除所有的Key

两个指令都是用来进行清除操作的:

  • FLUSHDB 清空当前数据库的所有键
  • FLUSHALL 清空所有数据库中的所有键
1
2
3
4
5
> flushdb
OK
-----------
> flushall
OK

系统设置相关

Redis可以通过使用配置文件或者CLI的方式进行配置.

指令的语法倒是同git很像.

1
2
3
4
5
6
7
8
9
10
11
12
> config get requirepass
1) "requirepass"
2) ""
> config set requirepass "mima"
OK
> config get requirepass
(error) NOAUTH Authentication required
> auth mima
OK
> config get requirepass
1) "requirepass"
2) "mima"

上面是对密码CONFIG的一个例子.

当然可以直接通过修改redis的配置文件redis.conf来进行修改, 其他的一些可修改项也可直接从redis.conf中获取.

从上面的例子也可以看出来, redis的config get得到的结果是键值对形式的.

像这样查询:

1
2
3
4
5
6
7
8
9
> config get *max-*-entries*
1) "hash-max-ziplist-entries"
2) "512"
3) "list-max-ziplist-entries"
4) "512"
5) "set-max-intset-entries"
6) "512"
7) "zset-max-ziplist-entries"
8) "128"

如果不是为了配置, 而是想要查询redis的各项信息的话, 使用INFO命令.

INFO [section] 可以查询redis几乎所有的信息.

section 有以下:

  • server: Redis server的常规信息
  • clients: Client的连接选项
  • memory: 存储占用相关信息
  • persistence: RDB and AOF 相关信息
  • stats: 常规统计
  • replication: Master/slave请求信息
  • cpu: CPU 占用信息统计
  • cluster: Redis 集群信息
  • keyspace: 数据库信息统计
  • all: 返回所有信息
  • default: 返回常规设置信息
1
2
3
4
5
> info server
# Server
redis_version:2.8.4
....
....